📄 function_template.hpp
字号:
this->clear(); return *this; }#endif // Assignment from another BOOST_FUNCTION_FUNCTION BOOST_FUNCTION_FUNCTION& operator=(const BOOST_FUNCTION_FUNCTION& f) { if (&f == this) return *this; self_type(f).swap(*this); return *this; } void swap(BOOST_FUNCTION_FUNCTION& other) { if (&other == this) return; std::swap(this->manager, other.manager); std::swap(this->functor, other.functor); std::swap(invoker, other.invoker); } // Clear out a target, if there is one void clear() { if (this->manager) { function_base::functor = this->manager(this->functor, detail::function::destroy_functor_tag); } this->manager = 0; invoker = 0; }#if (defined __SUNPRO_CC) && (__SUNPRO_CC <= 0x530) && !(defined BOOST_NO_COMPILER_CONFIG) // Sun C++ 5.3 can't handle the safe_bool idiom, so don't use it operator bool () const { return !this->empty(); }#else private: struct dummy { void nonnull() {}; }; typedef void (dummy::*safe_bool)(); public: operator safe_bool () const { return (this->empty())? 0 : &dummy::nonnull; } bool operator!() const { return this->empty(); }#endif private: void assign_to_own(const BOOST_FUNCTION_FUNCTION& f) { if (!f.empty()) { invoker = f.invoker; this->manager = f.manager; this->functor = f.manager(f.functor, detail::function::clone_functor_tag); } } template<typename Functor> void assign_to(Functor f) { typedef typename detail::function::get_function_tag<Functor>::type tag; this->assign_to(f, tag()); } template<typename FunctionPtr> void assign_to(FunctionPtr f, detail::function::function_ptr_tag) { clear(); if (f) { typedef typename detail::function::BOOST_FUNCTION_GET_FUNCTION_INVOKER< FunctionPtr, R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_ARGS >::type actual_invoker_type; invoker = &actual_invoker_type::invoke; this->manager = &detail::function::functor_manager<FunctionPtr, Allocator>::manage; this->functor = this->manager(detail::function::make_any_pointer( // should be a reinterpret cast, but some compilers // insist on giving cv-qualifiers to free functions (void (*)())(f) ), detail::function::clone_functor_tag); } }#if BOOST_FUNCTION_NUM_ARGS > 0 template<typename MemberPtr> void assign_to(MemberPtr f, detail::function::member_ptr_tag) { this->assign_to(mem_fn(f)); }#endif // BOOST_FUNCTION_NUM_ARGS > 0 template<typename FunctionObj> void assign_to(FunctionObj f, detail::function::function_obj_tag) { if (!detail::function::has_empty_target(addressof(f))) { typedef typename detail::function::BOOST_FUNCTION_GET_FUNCTION_OBJ_INVOKER< FunctionObj, R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_ARGS >::type actual_invoker_type; invoker = &actual_invoker_type::invoke; this->manager = &detail::function::functor_manager< FunctionObj, Allocator>::manage;#ifndef BOOST_NO_STD_ALLOCATOR typedef typename Allocator::template rebind<FunctionObj>::other rebound_allocator_type; typedef typename rebound_allocator_type::pointer pointer_type; rebound_allocator_type allocator; pointer_type copy = allocator.allocate(1); allocator.construct(copy, f); // Get back to the original pointer type FunctionObj* new_f = static_cast<FunctionObj*>(copy);#else FunctionObj* new_f = new FunctionObj(f);#endif // BOOST_NO_STD_ALLOCATOR this->functor = detail::function::make_any_pointer(static_cast<void*>(new_f)); } } template<typename FunctionObj> void assign_to(const reference_wrapper<FunctionObj>& f, detail::function::function_obj_ref_tag) { if (!detail::function::has_empty_target(f.get_pointer())) { typedef typename detail::function::BOOST_FUNCTION_GET_FUNCTION_OBJ_INVOKER< FunctionObj, R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_ARGS >::type actual_invoker_type; invoker = &actual_invoker_type::invoke; this->manager = &detail::function::trivial_manager<FunctionObj>::get; this->functor = this->manager( detail::function::make_any_pointer( const_cast<FunctionObj*>(f.get_pointer())), detail::function::clone_functor_tag); } } template<typename FunctionObj> void assign_to(FunctionObj, detail::function::stateless_function_obj_tag) { typedef typename detail::function:: BOOST_FUNCTION_GET_STATELESS_FUNCTION_OBJ_INVOKER< FunctionObj, R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_ARGS >::type actual_invoker_type; invoker = &actual_invoker_type::invoke; this->manager = &detail::function::trivial_manager<FunctionObj>::get; this->functor = detail::function::make_any_pointer(this); } typedef internal_result_type (*invoker_type)(detail::function::any_pointer BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_ARGS); invoker_type invoker; }; template<typename R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_PARMS , typename Allocator> inline void swap(BOOST_FUNCTION_FUNCTION< R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_ARGS , Allocator >& f1, BOOST_FUNCTION_FUNCTION< R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_ARGS, Allocator >& f2) { f1.swap(f2); }#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1200) template<typename R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_PARMS, typename Allocator> typename BOOST_FUNCTION_FUNCTION< R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_ARGS, Allocator>::result_type BOOST_FUNCTION_FUNCTION<R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_ARGS, Allocator> ::operator()(BOOST_FUNCTION_PARMS) const { if (this->empty()) boost::throw_exception(bad_function_call()); internal_result_type result = invoker(this->functor BOOST_FUNCTION_COMMA BOOST_FUNCTION_ARGS);# ifndef BOOST_NO_VOID_RETURNS return static_cast<result_type>(result);# else return result;# endif // BOOST_NO_VOID_RETURNS }#endif// Poison comparisons between boost::function objects of the same type.template<typename R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_PARMS , typename Allocator> void operator==(const BOOST_FUNCTION_FUNCTION< R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_ARGS , Allocator>&, const BOOST_FUNCTION_FUNCTION< R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_ARGS , Allocator>&);template<typename R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_PARMS , typename Allocator> void operator!=(const BOOST_FUNCTION_FUNCTION< R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_ARGS , Allocator>&, const BOOST_FUNCTION_FUNCTION< R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_ARGS , Allocator>&);#if !defined(BOOST_FUNCTION_NO_FUNCTION_TYPE_SYNTAX)#if BOOST_FUNCTION_NUM_ARGS == 0#define BOOST_FUNCTION_PARTIAL_SPEC R (void)#else#define BOOST_FUNCTION_PARTIAL_SPEC R (BOOST_PP_ENUM_PARAMS(BOOST_FUNCTION_NUM_ARGS,T))#endiftemplate<typename R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_PARMS, typename Allocator>class function<BOOST_FUNCTION_PARTIAL_SPEC, Allocator> : public BOOST_FUNCTION_FUNCTION<R, BOOST_FUNCTION_TEMPLATE_ARGS BOOST_FUNCTION_COMMA Allocator>{ typedef BOOST_FUNCTION_FUNCTION<R, BOOST_FUNCTION_TEMPLATE_ARGS BOOST_FUNCTION_COMMA Allocator> base_type; typedef function self_type; struct clear_type {};public: typedef typename base_type::allocator_type allocator_type; function() : base_type() {} template<typename Functor> function(Functor f#ifndef BOOST_NO_SFINAE ,typename enable_if_c< (::boost::type_traits::ice_not< (is_integral<Functor>::value)>::value), int>::type = 0#endif ) : base_type(f) { }#ifndef BOOST_NO_SFINAE function(clear_type*) : base_type() {}#endif function(const self_type& f) : base_type(static_cast<const base_type&>(f)){} function(const base_type& f) : base_type(static_cast<const base_type&>(f)){} self_type& operator=(const self_type& f) { self_type(f).swap(*this); return *this; } template<typename Functor>#ifndef BOOST_NO_SFINAE typename enable_if_c< (::boost::type_traits::ice_not< (is_integral<Functor>::value)>::value), self_type&>::type#else self_type&#endif operator=(Functor f) { self_type(f).swap(*this); return *this; }#ifndef BOOST_NO_SFINAE self_type& operator=(clear_type*) { this->clear(); return *this; }#endif self_type& operator=(const base_type& f) { self_type(f).swap(*this); return *this; }};#undef BOOST_FUNCTION_PARTIAL_SPEC#endif // have partial specialization} // end namespace boost// Cleanup after ourselves...#undef BOOST_FUNCTION_DEFAULT_ALLOCATOR#undef BOOST_FUNCTION_COMMA#undef BOOST_FUNCTION_FUNCTION#undef BOOST_FUNCTION_FUNCTION_INVOKER#undef BOOST_FUNCTION_VOID_FUNCTION_INVOKER#undef BOOST_FUNCTION_FUNCTION_OBJ_INVOKER#undef BOOST_FUNCTION_VOID_FUNCTION_OBJ_INVOKER#undef BOOST_FUNCTION_STATELESS_FUNCTION_OBJ_INVOKER#undef BOOST_FUNCTION_STATELESS_VOID_FUNCTION_OBJ_INVOKER#undef BOOST_FUNCTION_GET_FUNCTION_INVOKER#undef BOOST_FUNCTION_GET_FUNCTION_OBJ_INVOKER#undef BOOST_FUNCTION_GET_STATELESS_FUNCTION_OBJ_INVOKER#undef BOOST_FUNCTION_GET_MEM_FUNCTION_INVOKER#undef BOOST_FUNCTION_TEMPLATE_PARMS#undef BOOST_FUNCTION_TEMPLATE_ARGS#undef BOOST_FUNCTION_PARMS#undef BOOST_FUNCTION_PARM#undef BOOST_FUNCTION_ARGS#undef BOOST_FUNCTION_ARG_TYPE#undef BOOST_FUNCTION_ARG_TYPES
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -