Reduce simbol length using alog_types instead of algorithms directly in generic_hook.

This commit is contained in:
Ion Gaztañaga
2016-09-01 00:59:18 +02:00
parent 21a2107d9a
commit b2498a0da4
10 changed files with 79 additions and 34 deletions

View File

@ -48,7 +48,8 @@ struct make_any_base_hook
>::type packed_options;
typedef generic_hook
< any_algorithms<typename packed_options::void_pointer>
< AnyAlgorithm
, any_node_traits<typename packed_options::void_pointer>
, typename packed_options::tag
, packed_options::link_mode
, AnyBaseHookId
@ -153,7 +154,8 @@ struct make_any_member_hook
>::type packed_options;
typedef generic_hook
< any_algorithms<typename packed_options::void_pointer>
< AnyAlgorithm
, any_node_traits<typename packed_options::void_pointer>
, member_tag
, packed_options::link_mode
, NoBaseHookId

View File

@ -47,7 +47,8 @@ struct make_avl_set_base_hook
::type packed_options;
typedef generic_hook
< avltree_algorithms<avltree_node_traits<typename packed_options::void_pointer, packed_options::optimize_size> >
< AvlTreeAlgorithms
, avltree_node_traits<typename packed_options::void_pointer, packed_options::optimize_size>
, typename packed_options::tag
, packed_options::link_mode
, AvlTreeBaseHookId
@ -177,7 +178,8 @@ struct make_avl_set_member_hook
::type packed_options;
typedef generic_hook
< avltree_algorithms<avltree_node_traits<typename packed_options::void_pointer, packed_options::optimize_size> >
< AvlTreeAlgorithms
, avltree_node_traits<typename packed_options::void_pointer, packed_options::optimize_size>
, member_tag
, packed_options::link_mode
, NoBaseHookId

View File

@ -47,7 +47,8 @@ struct make_bs_set_base_hook
::type packed_options;
typedef generic_hook
< bstree_algorithms<tree_node_traits<typename packed_options::void_pointer> >
< BsTreeAlgorithms
, tree_node_traits<typename packed_options::void_pointer>
, typename packed_options::tag
, packed_options::link_mode
, BsTreeBaseHookId
@ -176,7 +177,8 @@ struct make_bs_set_member_hook
::type packed_options;
typedef generic_hook
< bstree_algorithms<tree_node_traits<typename packed_options::void_pointer> >
< BsTreeAlgorithms
, tree_node_traits<typename packed_options::void_pointer>
, member_tag
, packed_options::link_mode
, NoBaseHookId

View File

@ -35,7 +35,10 @@ enum algo_types
AvlTreeAlgorithms,
SgTreeAlgorithms,
SplayTreeAlgorithms,
TreapAlgorithms
TreapAlgorithms,
UnorderedAlgorithms,
UnorderedCircularSlistAlgorithms,
AnyAlgorithm
};
template<algo_types AlgoType, class NodeTraits>

View File

@ -23,8 +23,9 @@
#include <boost/intrusive/detail/workaround.hpp>
#include <boost/intrusive/pointer_rebind.hpp>
#include <cstddef>
#include <boost/intrusive/detail/mpl.hpp>
#include <boost/intrusive/detail/algo_type.hpp>
#include <cstddef>
namespace boost {
namespace intrusive {
@ -279,6 +280,17 @@ class any_algorithms
}
};
///@cond
template<class NodeTraits>
struct get_algo<AnyAlgorithm, NodeTraits>
{
typedef typename pointer_rebind<typename NodeTraits::node_ptr, void>::type void_pointer;
typedef any_algorithms<void_pointer> type;
};
///@endcond
} //namespace intrusive
} //namespace boost

View File

@ -26,6 +26,7 @@
#include <boost/intrusive/detail/mpl.hpp>
#include <boost/intrusive/detail/assert.hpp>
#include <boost/intrusive/detail/node_holder.hpp>
#include <boost/intrusive/detail/algo_type.hpp>
#include <boost/static_assert.hpp>
namespace boost {
@ -120,7 +121,8 @@ struct hooktags_impl
/// @endcond
template
< class NodeAlgorithms
< boost::intrusive::algo_types Algo
, class NodeTraits
, class Tag
, link_mode_type LinkMode
, base_hook_type BaseHookType
@ -135,20 +137,20 @@ class generic_hook
//from the hook.
: public detail::if_c
< detail::is_same<Tag, member_tag>::value
, typename NodeAlgorithms::node
, node_holder<typename NodeAlgorithms::node, Tag, BaseHookType>
, typename NodeTraits::node
, node_holder<typename NodeTraits::node, Tag, BaseHookType>
>::type
//If this is the a default-tagged base hook derive from a class that
//will define an special internal typedef. Containers will be able to detect this
//special typedef and obtain generic_hook's internal types in order to deduce
//value_traits for this hook.
, public hook_tags_definer
< generic_hook<NodeAlgorithms, Tag, LinkMode, BaseHookType>
< generic_hook<Algo, NodeTraits, Tag, LinkMode, BaseHookType>
, detail::is_same<Tag, dft_tag>::value*BaseHookType>
/// @endcond
{
/// @cond
typedef NodeAlgorithms node_algorithms;
typedef typename get_algo<Algo, NodeTraits>::type node_algorithms;
typedef typename node_algorithms::node node;
typedef typename node_algorithms::node_ptr node_ptr;
typedef typename node_algorithms::const_node_ptr const_node_ptr;
@ -156,7 +158,7 @@ class generic_hook
public:
typedef hooktags_impl
< typename NodeAlgorithms::node_traits
< NodeTraits
, Tag, LinkMode, BaseHookType> hooktags;
node_ptr this_ptr()

View File

@ -50,7 +50,8 @@ struct make_list_base_hook
>::type packed_options;
typedef generic_hook
< circular_list_algorithms<list_node_traits<typename packed_options::void_pointer> >
< CircularListAlgorithms
, list_node_traits<typename packed_options::void_pointer>
, typename packed_options::tag
, packed_options::link_mode
, ListBaseHookId
@ -177,7 +178,8 @@ struct make_list_member_hook
>::type packed_options;
typedef generic_hook
< circular_list_algorithms<list_node_traits<typename packed_options::void_pointer> >
< CircularListAlgorithms
, list_node_traits<typename packed_options::void_pointer>
, member_tag
, packed_options::link_mode
, NoBaseHookId

View File

@ -49,7 +49,8 @@ struct make_set_base_hook
>::type packed_options;
typedef generic_hook
< rbtree_algorithms<rbtree_node_traits<typename packed_options::void_pointer, packed_options::optimize_size> >
< RbTreeAlgorithms
, rbtree_node_traits<typename packed_options::void_pointer, packed_options::optimize_size>
, typename packed_options::tag
, packed_options::link_mode
, RbTreeBaseHookId
@ -180,7 +181,8 @@ struct make_set_member_hook
>::type packed_options;
typedef generic_hook
< rbtree_algorithms<rbtree_node_traits<typename packed_options::void_pointer, packed_options::optimize_size> >
< RbTreeAlgorithms
, rbtree_node_traits<typename packed_options::void_pointer, packed_options::optimize_size>
, member_tag
, packed_options::link_mode
, NoBaseHookId

View File

@ -50,7 +50,8 @@ struct make_slist_base_hook
>::type packed_options;
typedef generic_hook
< circular_slist_algorithms<slist_node_traits<typename packed_options::void_pointer> >
< CircularSListAlgorithms
, slist_node_traits<typename packed_options::void_pointer>
, typename packed_options::tag
, packed_options::link_mode
, SlistBaseHookId
@ -178,7 +179,8 @@ struct make_slist_member_hook
>::type packed_options;
typedef generic_hook
< circular_slist_algorithms<slist_node_traits<typename packed_options::void_pointer> >
< CircularSListAlgorithms
, slist_node_traits<typename packed_options::void_pointer>
, member_tag
, packed_options::link_mode
, NoBaseHookId

View File

@ -152,19 +152,33 @@ struct uset_algo_wrapper : public Algo
{};
template<class VoidPointer, bool StoreHash, bool OptimizeMultiKey>
struct get_uset_node_algo
struct get_uset_node_traits
{
typedef typename detail::if_c
< (StoreHash || OptimizeMultiKey)
, unordered_node_traits<VoidPointer, StoreHash, OptimizeMultiKey>
, slist_node_traits<VoidPointer>
>::type node_traits_type;
typedef typename detail::if_c
< OptimizeMultiKey
, unordered_algorithms<node_traits_type>
, uset_algo_wrapper< circular_slist_algorithms<node_traits_type> >
>::type type;
};
template<bool OptimizeMultiKey>
struct get_uset_algo_type
{
static const algo_types value = OptimizeMultiKey ? UnorderedAlgorithms : UnorderedCircularSlistAlgorithms;
};
template<class NodeTraits>
struct get_algo<UnorderedAlgorithms, NodeTraits>
{
typedef unordered_algorithms<NodeTraits> type;
};
template<class NodeTraits>
struct get_algo<UnorderedCircularSlistAlgorithms, NodeTraits>
{
typedef uset_algo_wrapper< circular_slist_algorithms<NodeTraits> > type;
};
/// @endcond
//! Helper metafunction to define a \c unordered_set_base_hook that yields to the same
@ -187,10 +201,11 @@ struct make_unordered_set_base_hook
>::type packed_options;
typedef generic_hook
< typename get_uset_node_algo < typename packed_options::void_pointer
, packed_options::store_hash
, packed_options::optimize_multikey
>::type
< get_uset_algo_type <packed_options::optimize_multikey>::value
, typename get_uset_node_traits < typename packed_options::void_pointer
, packed_options::store_hash
, packed_options::optimize_multikey
>::type
, typename packed_options::tag
, packed_options::link_mode
, HashBaseHookId
@ -326,10 +341,11 @@ struct make_unordered_set_member_hook
>::type packed_options;
typedef generic_hook
< typename get_uset_node_algo< typename packed_options::void_pointer
, packed_options::store_hash
, packed_options::optimize_multikey
>::type
< get_uset_algo_type <packed_options::optimize_multikey>::value
, typename get_uset_node_traits < typename packed_options::void_pointer
, packed_options::store_hash
, packed_options::optimize_multikey
>::type
, member_tag
, packed_options::link_mode
, NoBaseHookId