Uniformize traits with a macro

[SVN r80190]
This commit is contained in:
Ion Gaztañaga
2012-08-25 08:18:45 +00:00
parent fae0724cb6
commit 92d5a1ac4e
9 changed files with 30 additions and 71 deletions

View File

@@ -89,7 +89,7 @@ class avltree_impl
typedef typename Config::value_traits value_traits; typedef typename Config::value_traits value_traits;
/// @cond /// @cond
static const bool external_value_traits = static const bool external_value_traits =
detail::external_value_traits_is_true<value_traits>::value; detail::external_value_traits_bool_is_true<value_traits>::value;
typedef typename detail::eval_if_c typedef typename detail::eval_if_c
< external_value_traits < external_value_traits
, detail::eval_value_traits<value_traits> , detail::eval_value_traits<value_traits>

View File

@@ -41,64 +41,29 @@ struct internal_member_value_traits
static const bool value = sizeof(test<T>(0)) == sizeof(detail::two); static const bool value = sizeof(test<T>(0)) == sizeof(detail::two);
}; };
template <class T> #define BOOST_INTRUSIVE_INTERNAL_STATIC_BOOL_IS_TRUE(TRAITS_PREFIX, TYPEDEF_TO_FIND) \
struct internal_base_hook_bool template <class T>\
{ struct TRAITS_PREFIX##_bool\
template<bool Add> {\
struct two_or_three {one _[2 + Add];}; template<bool Add>\
template <class U> static one test(...); struct two_or_three {one _[2 + Add];};\
template <class U> static two_or_three<U::boost_intrusive_tags::is_base_hook> test (int); template <class U> static one test(...);\
static const std::size_t value = sizeof(test<T>(0)); 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(one)*2;\
};\
//
template <class T> BOOST_INTRUSIVE_INTERNAL_STATIC_BOOL_IS_TRUE(internal_base_hook, boost_intrusive_tags::is_base_hook)
struct internal_base_hook_bool_is_true BOOST_INTRUSIVE_INTERNAL_STATIC_BOOL_IS_TRUE(internal_any_hook, is_any_hook)
{ BOOST_INTRUSIVE_INTERNAL_STATIC_BOOL_IS_TRUE(external_value_traits, external_value_traits)
static const bool value = internal_base_hook_bool<T>::value > sizeof(one)*2; BOOST_INTRUSIVE_INTERNAL_STATIC_BOOL_IS_TRUE(external_bucket_traits, external_bucket_traits)
}; BOOST_INTRUSIVE_INTERNAL_STATIC_BOOL_IS_TRUE(resizable, resizable)
template <class T>
struct internal_any_hook_bool
{
template<bool Add>
struct two_or_three {one _[2 + Add];};
template <class U> static one test(...);
template <class U> static two_or_three<U::is_any_hook> test (int);
static const std::size_t value = sizeof(test<T>(0));
};
template <class T>
struct internal_any_hook_bool_is_true
{
static const bool value = internal_any_hook_bool<T>::value > sizeof(one)*2;
};
template <class T>
struct external_value_traits_bool
{
template<bool Add>
struct two_or_three {one _[2 + Add];};
template <class U> static one test(...);
template <class U> static two_or_three<U::external_value_traits> test (int);
static const std::size_t value = sizeof(test<T>(0));
};
template <class T>
struct external_bucket_traits_bool
{
template<bool Add>
struct two_or_three {one _[2 + Add];};
template <class U> static one test(...);
template <class U> static two_or_three<U::external_bucket_traits> test (int);
static const std::size_t value = sizeof(test<T>(0));
};
template <class T>
struct external_value_traits_is_true
{
static const bool value = external_value_traits_bool<T>::value > sizeof(one)*2;
};
template<class Node, class Tag, link_mode_type LinkMode, int> template<class Node, class Tag, link_mode_type LinkMode, int>
struct node_holder struct node_holder
@@ -644,7 +609,7 @@ struct store_cont_ptr_on_it
{ {
typedef typename Container::value_traits value_traits; typedef typename Container::value_traits value_traits;
static const bool value = store_cont_ptr_on_it_impl static const bool value = store_cont_ptr_on_it_impl
<value_traits, external_value_traits_is_true<value_traits>::value>::value; <value_traits, external_value_traits_bool_is_true<value_traits>::value>::value;
}; };
template<class Container, bool IsConst> template<class Container, bool IsConst>

View File

@@ -83,7 +83,7 @@ class list_impl
typedef typename Config::value_traits value_traits; typedef typename Config::value_traits value_traits;
/// @cond /// @cond
static const bool external_value_traits = static const bool external_value_traits =
detail::external_value_traits_is_true<value_traits>::value; detail::external_value_traits_bool_is_true<value_traits>::value;
typedef typename detail::eval_if_c typedef typename detail::eval_if_c
< external_value_traits < external_value_traits
, detail::eval_value_traits<value_traits> , detail::eval_value_traits<value_traits>

View File

@@ -57,12 +57,6 @@ struct eval_value_traits
typedef typename ValueTraits::value_traits type; typedef typename ValueTraits::value_traits type;
}; };
template <class T>
struct external_bucket_traits_is_true
{
static const bool value = external_bucket_traits_bool<T>::value == 3;
};
template <class BucketTraits> template <class BucketTraits>
struct eval_bucket_traits struct eval_bucket_traits
{ {

View File

@@ -89,7 +89,7 @@ class rbtree_impl
typedef typename Config::value_traits value_traits; typedef typename Config::value_traits value_traits;
/// @cond /// @cond
static const bool external_value_traits = static const bool external_value_traits =
detail::external_value_traits_is_true<value_traits>::value; detail::external_value_traits_bool_is_true<value_traits>::value;
typedef typename detail::eval_if_c typedef typename detail::eval_if_c
< external_value_traits < external_value_traits
, detail::eval_value_traits<value_traits> , detail::eval_value_traits<value_traits>

View File

@@ -215,7 +215,7 @@ class sgtree_impl
typedef typename Config::value_traits value_traits; typedef typename Config::value_traits value_traits;
/// @cond /// @cond
static const bool external_value_traits = static const bool external_value_traits =
detail::external_value_traits_is_true<value_traits>::value; detail::external_value_traits_bool_is_true<value_traits>::value;
typedef typename detail::eval_if_c typedef typename detail::eval_if_c
< external_value_traits < external_value_traits
, detail::eval_value_traits<value_traits> , detail::eval_value_traits<value_traits>

View File

@@ -112,7 +112,7 @@ class slist_impl
typedef typename Config::value_traits value_traits; typedef typename Config::value_traits value_traits;
/// @cond /// @cond
static const bool external_value_traits = static const bool external_value_traits =
detail::external_value_traits_is_true<value_traits>::value; detail::external_value_traits_bool_is_true<value_traits>::value;
typedef typename detail::eval_if_c typedef typename detail::eval_if_c
< external_value_traits < external_value_traits
, detail::eval_value_traits<value_traits> , detail::eval_value_traits<value_traits>

View File

@@ -88,7 +88,7 @@ class splaytree_impl
typedef typename Config::value_traits value_traits; typedef typename Config::value_traits value_traits;
/// @cond /// @cond
static const bool external_value_traits = static const bool external_value_traits =
detail::external_value_traits_is_true<value_traits>::value; detail::external_value_traits_bool_is_true<value_traits>::value;
typedef typename detail::eval_if_c typedef typename detail::eval_if_c
< external_value_traits < external_value_traits
, detail::eval_value_traits<value_traits> , detail::eval_value_traits<value_traits>

View File

@@ -91,7 +91,7 @@ class treap_impl
typedef typename Config::value_traits value_traits; typedef typename Config::value_traits value_traits;
/// @cond /// @cond
static const bool external_value_traits = static const bool external_value_traits =
detail::external_value_traits_is_true<value_traits>::value; detail::external_value_traits_bool_is_true<value_traits>::value;
typedef typename detail::eval_if_c typedef typename detail::eval_if_c
< external_value_traits < external_value_traits
, detail::eval_value_traits<value_traits> , detail::eval_value_traits<value_traits>