123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- /////////////////////////////////////////////////////////////////////////////
- //
- // (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::voider;
- 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> \
- struct boost_intrusive_has_type_ ## TNAME \
- { \
- template <typename X> \
- static char test(int, typename X::TNAME*); \
- \
- template <typename X> \
- static int test(...); \
- \
- static const bool value = (1 == sizeof(test<T>(0, 0))); \
- }; \
- \
- template <typename T, typename DefaultType> \
- struct boost_intrusive_default_type_ ## TNAME \
- { \
- struct DefaultWrap { typedef DefaultType TNAME; }; \
- \
- typedef typename \
- ::boost::intrusive::detail::if_c \
- < boost_intrusive_has_type_ ## TNAME<T>::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_HAS_TYPE(INSTANTIATION_NS_PREFIX, T, TNAME) \
- INSTANTIATION_NS_PREFIX \
- boost_intrusive_has_type_ ## TNAME< T >::value \
- //
- #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
|