// For function pointers, the manager is trivial static inline any_pointer manager(any_pointer function_ptr, functor_manager_operation_type op, function_ptr_tag) { if (op == clone_functor_tag) return function_ptr; else return make_any_pointer(static_cast<void (*)()>(0)); }
static inline any_pointer get(any_pointer f, functor_manager_operation_type op) { switch (op) { case clone_functor_tag: return f; case destroy_functor_tag: return make_any_pointer(reinterpret_cast<void*>(0)); case check_functor_type_tag: { std::type_info* t = static_cast<std::type_info*>(f.obj_ptr); return BOOST_FUNCTION_COMPARE_TYPE_ID(typeid(F), *t)? f : make_any_pointer(reinterpret_cast<void*>(0)); } } // Clears up a warning with GCC 3.2.3 return make_any_pointer(reinterpret_cast<void*>(0)); }
/* Dispatch to an appropriate manager based on whether we have a function pointer or a function object pointer. */ static any_pointer manage(any_pointer functor_ptr, functor_manager_operation_type op) { if (op == check_functor_type_tag) { std::type_info* type = static_cast<std::type_info*>(functor_ptr.obj_ptr); return (BOOST_FUNCTION_COMPARE_TYPE_ID(typeid(Functor), *type)? functor_ptr : make_any_pointer(reinterpret_cast<void*>(0))); } else { typedef typename get_function_tag<functor_type>::type tag_type; return manager(functor_ptr, op, tag_type()); } }