mpl.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 368 行

HPP
368
字号
///////////////////////////////////////////////////////////////////////////////// (C) Copyright Ion Gaztanaga  2006-2007//// Distributed under the Boost Software License, Version 1.0.//    (See accompanying file LICENSE_1_0.txt or copy at//          http://www.boost.org/LICENSE_1_0.txt)//// See http://www.boost.org/libs/intrusive for documentation.///////////////////////////////////////////////////////////////////////////////#ifndef BOOST_INTRUSIVE_DETAIL_MPL_HPP#define BOOST_INTRUSIVE_DETAIL_MPL_HPP#include <cstddef>namespace boost {namespace intrusive {namespace detail {typedef char one;struct two {one _[2];};template< bool C_ >struct bool_{   static const bool value = C_;};typedef bool_<true>        true_;typedef bool_<false>       false_;typedef true_  true_type;typedef false_ false_type;typedef char yes_type;struct no_type{   char padding[8];};template <bool B, class T = void>struct enable_if_c {  typedef T type;};template <class T>struct enable_if_c<false, T> {};template <class Cond, class T = void>struct enable_if : public enable_if_c<Cond::value, T>{};template<class F, class Param>struct apply{   typedef typename F::template apply<Param>::type type;};template <class T, class U>class is_convertible{   typedef char true_t;   class false_t { char dummy[2]; };   static true_t dispatch(U);   static false_t dispatch(...);   static T trigger();   public:   static const bool value = sizeof(dispatch(trigger())) == sizeof(true_t);};template<      bool C    , typename T1    , typename T2    >struct if_c{    typedef T1 type;};template<      typename T1    , typename T2    >struct if_c<false,T1,T2>{    typedef T2 type;};template<      typename C    , typename T1    , typename T2    >struct if_{   typedef typename if_c<0 != C::value, T1, T2>::type type;};template<      bool C    , typename F1    , typename F2    >struct eval_if_c    : if_c<C,F1,F2>::type{};template<      typename C    , typename T1    , typename T2    >struct eval_if    : if_<C,T1,T2>::type{};// identity is an extension: it is not part of the standard.template <class T>struct identity{   typedef T type;};#if defined(BOOST_MSVC) || defined(__BORLANDC_)#define BOOST_INTRUSIVE_TT_DECL __cdecl#else#define BOOST_INTRUSIVE_TT_DECL #endif#if defined(_MSC_EXTENSIONS) && !defined(__BORLAND__)#define BOOST_INTRUSIVE_TT_TEST_MSC_FUNC_SIGS#endiftemplate <typename T>struct is_unary_or_binary_function_impl{  static const bool value = false; };template <typename R>struct is_unary_or_binary_function_impl<R (*)()>{  static const bool value = true;  };template <typename R>struct is_unary_or_binary_function_impl<R (*)(...)>{  static const bool value = true;  };/*#ifdef BOOST_INTRUSIVE_TT_TEST_MSC_FUNC_SIGStemplate <typename R>struct is_unary_or_binary_function_impl<R (__stdcall*)()>{  static const bool value = true;  };template <typename R>struct is_unary_or_binary_function_impl<R (__stdcall*)(...)>{  static const bool value = true;  };template <typename R>struct is_unary_or_binary_function_impl<R (__stdcall*)(...)>{  static const bool value = true;  };template <typename R>struct is_unary_or_binary_function_impl<R (__fastcall*)()>{  static const bool value = true;  };template <typename R>struct is_unary_or_binary_function_impl<R (__fastcall*)(...)>{  static const bool value = true;  };template <typename R>struct is_unary_or_binary_function_impl<R (__cdecl*)()>{  static const bool value = true;  };template <typename R>struct is_unary_or_binary_function_impl<R (__cdecl*)(...)>{  static const bool value = true;  };#endif*/template <typename R, class T0>struct is_unary_or_binary_function_impl<R (*)(T0)>{  static const bool value = true;  };template <typename R, class T0>struct is_unary_or_binary_function_impl<R (*)(T0...)>{  static const bool value = true;  };#ifdef BOOST_INTRUSIVE_TT_TEST_MSC_FUNC_SIGStemplate <typename R, class T0>struct is_unary_or_binary_function_impl<R (__stdcall*)(T0)>{  static const bool value = true;  };/*template <typename R, class T0>struct is_unary_or_binary_function_impl<R (__stdcall*)(T0...)>{  static const bool value = true;  };template <typename R, class T0>struct is_unary_or_binary_function_impl<R (__fastcall*)(T0)>{  static const bool value = true;  };template <typename R, class T0>struct is_unary_or_binary_function_impl<R (__fastcall*)(T0...)>{  static const bool value = true;  };template <typename R, class T0>struct is_unary_or_binary_function_impl<R (__cdecl*)(T0)>{  static const bool value = true;  };template <typename R, class T0>struct is_unary_or_binary_function_impl<R (__cdecl*)(T0...)>{  static const bool value = true;  };*/#endiftemplate <typename R, class T0, class T1>struct is_unary_or_binary_function_impl<R (*)(T0, T1)>{  static const bool value = true;  };template <typename R, class T0, class T1>struct is_unary_or_binary_function_impl<R (*)(T0, T1...)>{  static const bool value = true;  };/*#ifdef BOOST_INTRUSIVE_TT_TEST_MSC_FUNC_SIGStemplate <typename R, class T0, class T1>struct is_unary_or_binary_function_impl<R (__stdcall*)(T0, T1)>{  static const bool value = true;  };template <typename R, class T0, class T1>struct is_unary_or_binary_function_impl<R (__stdcall*)(T0, T1...)>{  static const bool value = true;  };template <typename R, class T0, class T1>struct is_unary_or_binary_function_impl<R (__fastcall*)(T0, T1)>{  static const bool value = true;  };template <typename R, class T0, class T1>struct is_unary_or_binary_function_impl<R (__fastcall*)(T0, T1...)>{  static const bool value = true;  };template <typename R, class T0, class T1>struct is_unary_or_binary_function_impl<R (__cdecl*)(T0, T1)>{  static const bool value = true;  };template <typename R, class T0, class T1>struct is_unary_or_binary_function_impl<R (__cdecl*)(T0, T1...)>{  static const bool value = true;  };#endif*/template <typename T>struct is_unary_or_binary_function_impl<T&>{  static const bool value = false; };template<typename T>struct is_unary_or_binary_function{  static const bool value = is_unary_or_binary_function_impl<T>::value;   };//boost::alignment_of yields to 10K lines of preprocessed code, so we//need an alternativetemplate <typename T> struct alignment_of;template <typename T>struct alignment_of_hack{    char c;    T t;    alignment_of_hack();};template <unsigned A, unsigned S>struct alignment_logic{   static const std::size_t value = A < S ? A : S;};template< typename T >struct alignment_of{   static const std::size_t value = alignment_logic            < sizeof(alignment_of_hack<T>) - sizeof(T)            , sizeof(T)            >::value;};template <typename T, typename U>struct is_same{   typedef char yes_type;   struct no_type   {      char padding[8];   };   template <typename V>   static yes_type is_same_tester(V*, V*);   static no_type is_same_tester(...);   static T *t;   static U *u;   static const bool value = sizeof(yes_type) == sizeof(is_same_tester(t,u));};template<typename T>struct add_const{  typedef const T type;   };template<typename T>struct remove_const{  typedef  T type;   };template<typename T>struct remove_const<const T>{  typedef T type;   };template<class T>struct remove_reference{   typedef T type;};template<class T>struct remove_reference<T&>{   typedef T type;};template<class Class>class is_empty_class{   template <typename T>   struct empty_helper_t1 : public T   {      empty_helper_t1();      int i[256];   };   struct empty_helper_t2   { int i[256]; };   public:   static const bool value = sizeof(empty_helper_t1<Class>) == sizeof(empty_helper_t2);};template<std::size_t S>struct ls_zeros{   static const std::size_t value = (S & std::size_t(1)) ? 0 : (1 + ls_zeros<(S>>1u)>::value);};template<>struct ls_zeros<0>{   static const std::size_t value = 0;};template<>struct ls_zeros<1>{   static const std::size_t value = 0;};} //namespace detail } //namespace intrusive } //namespace boost #endif //BOOST_INTRUSIVE_DETAIL_MPL_HPP

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?