📄 functional
字号:
_Nocopy_types _M_unused; char _M_pod_data[sizeof(_Nocopy_types)]; }; enum _Manager_operation { __get_type_info, __get_functor_ptr, __clone_functor, __destroy_functor }; /* Simple type wrapper that helps avoid annoying const problems when casting between void pointers and pointers-to-pointers. */ template<typename _Tp> struct _Simple_type_wrapper { _Simple_type_wrapper(_Tp __value) : __value(__value) { } _Tp __value; }; template<typename _Tp> struct __is_location_invariant<_Simple_type_wrapper<_Tp> > : __is_location_invariant<_Tp> { }; // Converts a reference to a function object into a callable // function object. template<typename _Functor> inline _Functor& __callable_functor(_Functor& __f) { return __f; } template<typename _Member, typename _Class> inline _Mem_fn<_Member _Class::*> __callable_functor(_Member _Class::* &__p) { return mem_fn(__p); } template<typename _Member, typename _Class> inline _Mem_fn<_Member _Class::*> __callable_functor(_Member _Class::* const &__p) { return mem_fn(__p); } template<typename _Signature, typename _Functor> class _Function_handler; template<typename _Signature> class function; /** * @if maint * Base class of all polymorphic function object wrappers. * @endif */ class _Function_base { public: static const std::size_t _M_max_size = sizeof(_Nocopy_types); static const std::size_t _M_max_align = __alignof__(_Nocopy_types); template<typename _Functor> class _Base_manager { protected: static const bool __stored_locally = (__is_location_invariant<_Functor>::value && sizeof(_Functor) <= _M_max_size && __alignof__(_Functor) <= _M_max_align && (_M_max_align % __alignof__(_Functor) == 0)); typedef integral_constant<bool, __stored_locally> _Local_storage; // Retrieve a pointer to the function object static _Functor* _M_get_pointer(const _Any_data& __source) { const _Functor* __ptr = __stored_locally? &__source._M_access<_Functor>() /* have stored a pointer */ : __source._M_access<_Functor*>(); return const_cast<_Functor*>(__ptr); } // Clone a location-invariant function object that fits within // an _Any_data structure. static void _M_clone(_Any_data& __dest, const _Any_data& __source, true_type) { new (__dest._M_access()) _Functor(__source._M_access<_Functor>()); } // Clone a function object that is not location-invariant or // that cannot fit into an _Any_data structure. static void _M_clone(_Any_data& __dest, const _Any_data& __source, false_type) { __dest._M_access<_Functor*>() = new _Functor(*__source._M_access<_Functor*>()); } // Destroying a location-invariant object may still require // destruction. static void _M_destroy(_Any_data& __victim, true_type) { __victim._M_access<_Functor>().~_Functor(); } // Destroying an object located on the heap. static void _M_destroy(_Any_data& __victim, false_type) { delete __victim._M_access<_Functor*>(); } public: static bool _M_manager(_Any_data& __dest, const _Any_data& __source, _Manager_operation __op) { switch (__op) { case __get_type_info: __dest._M_access<const type_info*>() = &typeid(_Functor); break; case __get_functor_ptr: __dest._M_access<_Functor*>() = _M_get_pointer(__source); break; case __clone_functor: _M_clone(__dest, __source, _Local_storage()); break; case __destroy_functor: _M_destroy(__dest, _Local_storage()); break; } return false; } static void _M_init_functor(_Any_data& __functor, const _Functor& __f) { _M_init_functor(__functor, __f, _Local_storage()); } template<typename _Signature> static bool _M_not_empty_function(const function<_Signature>& __f) { return __f; } template<typename _Tp> static bool _M_not_empty_function(const _Tp*& __fp) { return __fp; } template<typename _Class, typename _Tp> static bool _M_not_empty_function(_Tp _Class::* const& __mp) { return __mp; } template<typename _Tp> static bool _M_not_empty_function(const _Tp&) { return true; } private: static void _M_init_functor(_Any_data& __functor, const _Functor& __f, true_type) { new (__functor._M_access()) _Functor(__f); } static void _M_init_functor(_Any_data& __functor, const _Functor& __f, false_type) { __functor._M_access<_Functor*>() = new _Functor(__f); } }; template<typename _Functor> class _Ref_manager : public _Base_manager<_Functor*> { typedef _Function_base::_Base_manager<_Functor*> _Base; public: static bool _M_manager(_Any_data& __dest, const _Any_data& __source, _Manager_operation __op) { switch (__op) { case __get_type_info: __dest._M_access<const type_info*>() = &typeid(_Functor); break; case __get_functor_ptr: __dest._M_access<_Functor*>() = *_Base::_M_get_pointer(__source); return is_const<_Functor>::value; break; default: _Base::_M_manager(__dest, __source, __op); } return false; } static void _M_init_functor(_Any_data& __functor, reference_wrapper<_Functor> __f) { // TBD: Use address_of function instead _Base::_M_init_functor(__functor, &__f.get()); } }; _Function_base() : _M_manager(0) { } ~_Function_base() { if (_M_manager) { _M_manager(_M_functor, _M_functor, __destroy_functor); } } bool _M_empty() const { return !_M_manager; } typedef bool (*_Manager_type)(_Any_data&, const _Any_data&, _Manager_operation); _Any_data _M_functor; _Manager_type _M_manager; }; // [3.7.2.7] null pointer comparisons /** * @brief Compares a polymorphic function object wrapper against 0 * (the NULL pointer). * @returns @c true if the wrapper has no target, @c false otherwise * * This function will not throw an exception. */ template<typename _Signature> inline bool operator==(const function<_Signature>& __f, _M_clear_type*) { return !__f; } /** * @overload */ template<typename _Signature> inline bool operator==(_M_clear_type*, const function<_Signature>& __f) { return !__f; } /** * @brief Compares a polymorphic function object wrapper against 0 * (the NULL pointer). * @returns @c false if the wrapper has no target, @c true otherwise * * This function will not throw an exception. */ template<typename _Signature> inline bool operator!=(const function<_Signature>& __f, _M_clear_type*) { return __f; } /** * @overload */ template<typename _Signature> inline bool operator!=(_M_clear_type*, const function<_Signature>& __f) { return __f; } // [3.7.2.8] specialized algorithms /** * @brief Swap the targets of two polymorphic function object wrappers. * * This function will not throw an exception. */ template<typename _Signature> inline void swap(function<_Signature>& __x, function<_Signature>& __y) { __x.swap(__y); }#define _GLIBCXX_JOIN(X,Y) _GLIBCXX_JOIN2( X , Y )#define _GLIBCXX_JOIN2(X,Y) _GLIBCXX_JOIN3(X,Y)#define _GLIBCXX_JOIN3(X,Y) X##Y#define _GLIBCXX_REPEAT_HEADER <tr1/functional_iterate.h>#include <tr1/repeat.h>#undef _GLIBCXX_REPEAT_HEADER#undef _GLIBCXX_JOIN3#undef _GLIBCXX_JOIN2#undef _GLIBCXX_JOIN// Definition of default hash function std::tr1::hash<>. The types for// which std::tr1::hash<T> is defined is in clause 6.3.3. of the PDTR. template <typename T> struct hash; #define tr1_hashtable_define_trivial_hash(T) \ template <> struct hash<T> { \ std::size_t operator()(T val) const { return static_cast<std::size_t>(val); } \ } \ tr1_hashtable_define_trivial_hash(bool); tr1_hashtable_define_trivial_hash(char); tr1_hashtable_define_trivial_hash(signed char); tr1_hashtable_define_trivial_hash(unsigned char); tr1_hashtable_define_trivial_hash(wchar_t); tr1_hashtable_define_trivial_hash(short); tr1_hashtable_define_trivial_hash(int); tr1_hashtable_define_trivial_hash(long); tr1_hashtable_define_trivial_hash(unsigned short); tr1_hashtable_define_trivial_hash(unsigned int); tr1_hashtable_define_trivial_hash(unsigned long); tr1_hashtable_define_trivial_hash(float); tr1_hashtable_define_trivial_hash(double); tr1_hashtable_define_trivial_hash(long double); #undef tr1_hashtable_define_trivial_hash template <typename T> struct hash<T*> { std::size_t operator()(T* p) const { return reinterpret_cast<std::size_t>(p); } }; // ??? We can probably find a better hash function than this (i.e. one // that vectorizes better and that produces a more uniform distribution). // XXX String hash probably shouldn't be an inline member function, // since it's nontrivial. Once we have the framework for TR1 .cc // files, this should go in one. template <> struct hash<std::string> { std::size_t operator()(const std::string& s) const { std::size_t result = 0; for (std::string::const_iterator i = s.begin(); i != s.end(); ++i) result = (result * 131) + *i; return result; } };#ifdef _GLIBCXX_USE_WCHAR_T template <> struct hash<std::wstring> { std::size_t operator()(const std::wstring& s) const { std::size_t result = 0; for (std::wstring::const_iterator i = s.begin(); i != s.end(); ++i) result = (result * 131) + *i; return result; } };#endif}}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -