207 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			207 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								/////////////////////////////////////////////////////////////////////////////
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// (C) Copyright Ion Gaztanaga        2006-2014
							 | 
						||
| 
								 | 
							
								// (C) Copyright Microsoft Corporation  2014
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								// 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
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef BOOST_CONFIG_HPP
							 | 
						||
| 
								 | 
							
								#  include <boost/config.hpp>
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if defined(BOOST_HAS_PRAGMA_ONCE)
							 | 
						||
| 
								 | 
							
								#  pragma once
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/intrusive/detail/config_begin.hpp>
							 | 
						||
| 
								 | 
							
								#include <boost/move/detail/type_traits.hpp>
							 | 
						||
| 
								 | 
							
								#include <cstddef>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost {
							 | 
						||
| 
								 | 
							
								namespace intrusive {
							 | 
						||
| 
								 | 
							
								namespace detail {
							 | 
						||
| 
								 | 
							
								   
							 | 
						||
| 
								 | 
							
								using boost::move_detail::is_same;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::add_const;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::remove_const;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::remove_cv;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::remove_reference;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::add_reference;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::remove_pointer;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::add_pointer;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::true_type;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::false_type;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::enable_if_c;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::enable_if;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::disable_if_c;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::disable_if;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::is_convertible;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::if_c;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::if_;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::is_const;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::identity;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::alignment_of;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::is_empty;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::addressof;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::integral_constant;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::enable_if_convertible;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::disable_if_convertible;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::bool_;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::true_;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::false_;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::yes_type;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::no_type;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::apply;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::eval_if_c;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::eval_if;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::unvoid_ref;
							 | 
						||
| 
								 | 
							
								using boost::move_detail::add_const_if_c;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Infrastructure for providing a default type for T::TNAME if absent.
							 | 
						||
| 
								 | 
							
								#define BOOST_INTRUSIVE_INSTANTIATE_DEFAULT_TYPE_TMPLT(TNAME)     \
							 | 
						||
| 
								 | 
							
								   template <typename T, typename DefaultType>                    \
							 | 
						||
| 
								 | 
							
								   struct boost_intrusive_default_type_ ## TNAME                  \
							 | 
						||
| 
								 | 
							
								   {                                                              \
							 | 
						||
| 
								 | 
							
								      template <typename X>                                       \
							 | 
						||
| 
								 | 
							
								      static char test(int, typename X::TNAME*);                  \
							 | 
						||
| 
								 | 
							
								                                                                  \
							 | 
						||
| 
								 | 
							
								      template <typename X>                                       \
							 | 
						||
| 
								 | 
							
								      static int test(...);                                       \
							 | 
						||
| 
								 | 
							
								                                                                  \
							 | 
						||
| 
								 | 
							
								      struct DefaultWrap { typedef DefaultType TNAME; };          \
							 | 
						||
| 
								 | 
							
								                                                                  \
							 | 
						||
| 
								 | 
							
								      static const bool value = (1 == sizeof(test<T>(0, 0)));     \
							 | 
						||
| 
								 | 
							
								                                                                  \
							 | 
						||
| 
								 | 
							
								      typedef typename                                            \
							 | 
						||
| 
								 | 
							
								         ::boost::intrusive::detail::if_c                         \
							 | 
						||
| 
								 | 
							
								            <value, T, DefaultWrap>::type::TNAME type;            \
							 | 
						||
| 
								 | 
							
								   };                                                             \
							 | 
						||
| 
								 | 
							
								   //
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_DEFAULT(INSTANTIATION_NS_PREFIX, T, TNAME, TIMPL)   \
							 | 
						||
| 
								 | 
							
								      typename INSTANTIATION_NS_PREFIX                                                       \
							 | 
						||
| 
								 | 
							
								         boost_intrusive_default_type_ ## TNAME< T, TIMPL >::type                            \
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define BOOST_INTRUSIVE_INSTANTIATE_EVAL_DEFAULT_TYPE_TMPLT(TNAME)\
							 | 
						||
| 
								 | 
							
								   template <typename T, typename DefaultType>                    \
							 | 
						||
| 
								 | 
							
								   struct boost_intrusive_eval_default_type_ ## TNAME             \
							 | 
						||
| 
								 | 
							
								   {                                                              \
							 | 
						||
| 
								 | 
							
								      template <typename X>                                       \
							 | 
						||
| 
								 | 
							
								      static char test(int, typename X::TNAME*);                  \
							 | 
						||
| 
								 | 
							
								                                                                  \
							 | 
						||
| 
								 | 
							
								      template <typename X>                                       \
							 | 
						||
| 
								 | 
							
								      static int test(...);                                       \
							 | 
						||
| 
								 | 
							
								                                                                  \
							 | 
						||
| 
								 | 
							
								      struct DefaultWrap                                          \
							 | 
						||
| 
								 | 
							
								      { typedef typename DefaultType::type TNAME; };              \
							 | 
						||
| 
								 | 
							
								                                                                  \
							 | 
						||
| 
								 | 
							
								      static const bool value = (1 == sizeof(test<T>(0, 0)));     \
							 | 
						||
| 
								 | 
							
								                                                                  \
							 | 
						||
| 
								 | 
							
								      typedef typename                                            \
							 | 
						||
| 
								 | 
							
								         ::boost::intrusive::detail::eval_if_c                    \
							 | 
						||
| 
								 | 
							
								            < value                                               \
							 | 
						||
| 
								 | 
							
								            , ::boost::intrusive::detail::identity<T>             \
							 | 
						||
| 
								 | 
							
								            , ::boost::intrusive::detail::identity<DefaultWrap>   \
							 | 
						||
| 
								 | 
							
								            >::type::TNAME type;                                  \
							 | 
						||
| 
								 | 
							
								   };                                                             \
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define BOOST_INTRUSIVE_OBTAIN_TYPE_WITH_EVAL_DEFAULT(INSTANTIATION_NS_PREFIX, T, TNAME, TIMPL) \
							 | 
						||
| 
								 | 
							
								      typename INSTANTIATION_NS_PREFIX                                                          \
							 | 
						||
| 
								 | 
							
								         boost_intrusive_eval_default_type_ ## TNAME< T, TIMPL >::type                          \
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define BOOST_INTRUSIVE_INTERNAL_STATIC_BOOL_IS_TRUE(TRAITS_PREFIX, TYPEDEF_TO_FIND) \
							 | 
						||
| 
								 | 
							
								template <class T>\
							 | 
						||
| 
								 | 
							
								struct TRAITS_PREFIX##_bool\
							 | 
						||
| 
								 | 
							
								{\
							 | 
						||
| 
								 | 
							
								   template<bool Add>\
							 | 
						||
| 
								 | 
							
								   struct two_or_three {yes_type _[2 + Add];};\
							 | 
						||
| 
								 | 
							
								   template <class U> static yes_type test(...);\
							 | 
						||
| 
								 | 
							
								   template <class U> static two_or_three<U::TYPEDEF_TO_FIND> test (int);\
							 | 
						||
| 
								 | 
							
								   static const std::size_t value = sizeof(test<T>(0));\
							 | 
						||
| 
								 | 
							
								};\
							 | 
						||
| 
								 | 
							
								\
							 | 
						||
| 
								 | 
							
								template <class T>\
							 | 
						||
| 
								 | 
							
								struct TRAITS_PREFIX##_bool_is_true\
							 | 
						||
| 
								 | 
							
								{\
							 | 
						||
| 
								 | 
							
								   static const bool value = TRAITS_PREFIX##_bool<T>::value > sizeof(yes_type)*2;\
							 | 
						||
| 
								 | 
							
								};\
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define BOOST_INTRUSIVE_HAS_STATIC_MEMBER_FUNC_SIGNATURE(TRAITS_NAME, FUNC_NAME) \
							 | 
						||
| 
								 | 
							
								  template <typename U, typename Signature> \
							 | 
						||
| 
								 | 
							
								  class TRAITS_NAME \
							 | 
						||
| 
								 | 
							
								  { \
							 | 
						||
| 
								 | 
							
								  private: \
							 | 
						||
| 
								 | 
							
								  template<Signature> struct helper;\
							 | 
						||
| 
								 | 
							
								  template<typename T> \
							 | 
						||
| 
								 | 
							
								  static ::boost::intrusive::detail::yes_type test(helper<&T::FUNC_NAME>*); \
							 | 
						||
| 
								 | 
							
								  template<typename T> static ::boost::intrusive::detail::no_type test(...); \
							 | 
						||
| 
								 | 
							
								  public: \
							 | 
						||
| 
								 | 
							
								  static const bool value = sizeof(test<U>(0)) == sizeof(::boost::intrusive::detail::yes_type); \
							 | 
						||
| 
								 | 
							
								  }; \
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define BOOST_INTRUSIVE_HAS_MEMBER_FUNC_CALLED(TRAITS_NAME, FUNC_NAME) \
							 | 
						||
| 
								 | 
							
								template <typename Type> \
							 | 
						||
| 
								 | 
							
								struct TRAITS_NAME \
							 | 
						||
| 
								 | 
							
								{ \
							 | 
						||
| 
								 | 
							
								   struct BaseMixin \
							 | 
						||
| 
								 | 
							
								   { \
							 | 
						||
| 
								 | 
							
								      void FUNC_NAME(); \
							 | 
						||
| 
								 | 
							
								   }; \
							 | 
						||
| 
								 | 
							
								   struct Base : public Type, public BaseMixin { Base(); }; \
							 | 
						||
| 
								 | 
							
								   template <typename T, T t> class Helper{}; \
							 | 
						||
| 
								 | 
							
								   template <typename U> \
							 | 
						||
| 
								 | 
							
								   static ::boost::intrusive::detail::no_type  test(U*, Helper<void (BaseMixin::*)(), &U::FUNC_NAME>* = 0); \
							 | 
						||
| 
								 | 
							
								   static ::boost::intrusive::detail::yes_type test(...); \
							 | 
						||
| 
								 | 
							
								   static const bool value = sizeof(::boost::intrusive::detail::yes_type) == sizeof(test((Base*)(0))); \
							 | 
						||
| 
								 | 
							
								};\
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#define BOOST_INTRUSIVE_HAS_MEMBER_FUNC_CALLED_IGNORE_SIGNATURE(TRAITS_NAME, FUNC_NAME) \
							 | 
						||
| 
								 | 
							
								BOOST_INTRUSIVE_HAS_MEMBER_FUNC_CALLED(TRAITS_NAME##_ignore_signature, FUNC_NAME) \
							 | 
						||
| 
								 | 
							
								\
							 | 
						||
| 
								 | 
							
								template <typename Type, class> \
							 | 
						||
| 
								 | 
							
								struct TRAITS_NAME \
							 | 
						||
| 
								 | 
							
								   : public TRAITS_NAME##_ignore_signature<Type> \
							 | 
						||
| 
								 | 
							
								{};\
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								} //namespace detail
							 | 
						||
| 
								 | 
							
								} //namespace intrusive
							 | 
						||
| 
								 | 
							
								} //namespace boost
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/intrusive/detail/config_end.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif //BOOST_INTRUSIVE_DETAIL_MPL_HPP
							 |