codepad
[
create a new paste
]
login
|
about
Language:
C
C++
D
Haskell
Lua
OCaml
PHP
Perl
Plain Text
Python
Ruby
Scheme
Tcl
enum op_code { DO_OPERATION_1 = 6, DO_OPERATION_2 = 12, DO_OPERATION_6 = 12, DO_OPERATION_BLA = 7, DO_OPERATION_UNBOUND = 8, }; namespace enums { // declaration of the enum values in an MPL vector template<> struct get_values< op_code > { typedef boost::mpl::vector_c< op_code, DO_OPERATION_1, DO_OPERATION_2, DO_OPERATION_BLA, DO_OPERATION_UNBOUND > type; }; // declaration of the handlers signatures for our enum template<> struct get_signature< op_code > { typedef signature< void, std::string const&, std::string const& > type; }; } // declaration of the handlers and binding to the dispatcher void do_opcode_1(std::string const& param1, std::string const& param2) { std::cout << "doing opcode 1" << std::endl; } template<> enums::signature_of< op_code > const& enums::get_handler< op_code, DO_OPERATION_1 >::type::value = do_opcode_1; void do_opcode_2(std::string const& param1, std::string const& param2) { std::cout << "doing opcode 2" << std::endl; } template<> enums::signature_of< op_code > const& enums::get_handler< op_code, DO_OPERATION_2 >::type::value = do_opcode_2; void do_opcode_bla(std::string const& param1, std::string const& param2) { std::cout << "doing opcode bla" << std::endl; } template<> enums::signature_of< op_code > const& enums::get_handler< op_code, DO_OPERATION_BLA >::type::value = do_opcode_bla; int main(int argc, char const *argv[]) { typedef enums::indexer< op_code > op_code_indexer; typedef enums::dispatcher< op_code > op_code_dispatcher; { std::cout << "indexer::values array:" << std::endl; size_t i = 0; op_code_indexer::values_type constexpr values = op_code_indexer::values; for(auto const& e : values) { std::cout << " " << i << ": " << e << std::endl; i++; } } { std::cout << "indexer::index array:" << std::endl; size_t i = op_code_indexer::detail::begin; op_code_indexer::index_type constexpr index = op_code_indexer::index; for(auto const& e : index) { std::cout << " " << i << " -> " << e << std::endl; i++; } } std::cout << "handlers addresses:" << std::endl; std::cout << " do_opcode_1: " << reinterpret_cast< void* >(&do_opcode_1) << std::endl; std::cout << " do_opcode_2: " << reinterpret_cast< void* >(&do_opcode_2) << std::endl; std::cout << " do_opcode_bla: " << reinterpret_cast< void* >(&do_opcode_bla) << std::endl; std::cout << " not_implemented: " << reinterpret_cast< void* >(&enums::signature_of< op_code >::not_implemented) << std::endl; { std::cout << "dispatcher::handlers array:" << std::endl; size_t i = 0; for(auto const& e : op_code_dispatcher::handlers) { std::cout << " " << i << ": " << reinterpret_cast< void* >(*e.target< decltype(&enums::signature_of< op_code >::not_implemented) >()) << std::endl; i++; } } op_code_dispatcher dispatcher; dispatcher[DO_OPERATION_1]("foo", "bar"); dispatcher[DO_OPERATION_2]("foo", "bar"); dispatcher[DO_OPERATION_BLA]("foo", "bar"); dispatcher[DO_OPERATION_UNBOUND]("foo", "bar"); dispatcher[op_code(123)]("foo", "bar"); return 0; }
Private
[
?
]
Run code
Submit