⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 functional

📁 Mac OS X 10.4.9 for x86 Source Code gcc 实现源代码
💻
📖 第 1 页 / 共 3 页
字号:
    _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 + -