59 #ifdef PB_DS_DATA_TRUE_INDICATOR 
   60 #define PB_DS_BIN_TREE_NAME bin_search_tree_map 
   63 #ifdef PB_DS_DATA_FALSE_INDICATOR 
   64 #define PB_DS_BIN_TREE_NAME bin_search_tree_set 
   67 #define PB_DS_CLASS_T_DEC \ 
   68     template<typename Key, typename Mapped, typename Cmp_Fn, \ 
   69          typename Node_And_It_Traits, typename _Alloc> 
   71 #define PB_DS_CLASS_C_DEC \ 
   72     PB_DS_BIN_TREE_NAME<Key, Mapped, Cmp_Fn, Node_And_It_Traits, _Alloc> 
   74 #define PB_DS_BIN_TREE_TRAITS_BASE \ 
   75     types_traits<Key, Mapped, _Alloc, false> 
   78 #define PB_DS_DEBUG_MAP_BASE_C_DEC  \ 
   79     debug_map_base<Key, eq_by_less<Key, Cmp_Fn>, \ 
   80           typename _Alloc::template rebind<Key>::other::const_reference> 
   83 #ifdef PB_DS_TREE_TRACE 
   84 #define PB_DS_TREE_TRACE_BASE_C_DEC \ 
   85     tree_trace_base<typename Node_And_It_Traits::node_const_iterator, \ 
   86             typename Node_And_It_Traits::node_iterator,       \ 
   97     template<
typename Key, 
typename Mapped, 
typename Cmp_Fn,
 
   98          typename Node_And_It_Traits, 
typename _Alloc>
 
   99     class PB_DS_BIN_TREE_NAME :
 
  100 #ifdef _GLIBCXX_DEBUG 
  101       public PB_DS_DEBUG_MAP_BASE_C_DEC,
 
  103 #ifdef PB_DS_TREE_TRACE 
  104       public PB_DS_TREE_TRACE_BASE_C_DEC,
 
  107       public PB_DS_BIN_TREE_TRAITS_BASE,
 
  108       public Node_And_It_Traits::node_update
 
  110       typedef Node_And_It_Traits            traits_type;
 
  113       typedef PB_DS_BIN_TREE_TRAITS_BASE            traits_base;
 
  116       typename _Alloc::template rebind<typename traits_type::node>::other
 
  119       typedef typename node_allocator::value_type   node;
 
  120       typedef typename node_allocator::pointer      node_pointer;
 
  122       typedef typename traits_type::null_node_update_pointer
 
  123       null_node_update_pointer;
 
  126       typedef cond_dealtor<node, _Alloc>        cond_dealtor_t;
 
  128 #ifdef _GLIBCXX_DEBUG 
  129       typedef PB_DS_DEBUG_MAP_BASE_C_DEC        debug_base;
 
  133       typedef typename _Alloc::size_type        size_type;
 
  134       typedef typename _Alloc::difference_type  difference_type;
 
  135       typedef typename traits_base::key_type        key_type;
 
  136       typedef typename traits_base::key_pointer     key_pointer;
 
  137       typedef typename traits_base::key_const_pointer   key_const_pointer;
 
  138       typedef typename traits_base::key_reference   key_reference;
 
  139       typedef typename traits_base::key_const_reference key_const_reference;
 
  141 #ifdef PB_DS_DATA_TRUE_INDICATOR 
  142       typedef typename traits_base::mapped_type     mapped_type;
 
  143       typedef typename traits_base::mapped_pointer  mapped_pointer;
 
  144       typedef typename traits_base::mapped_const_pointer mapped_const_pointer;
 
  145       typedef typename traits_base::mapped_reference    mapped_reference;
 
  146       typedef typename traits_base::mapped_const_reference mapped_const_reference;
 
  149       typedef typename traits_base::value_type      value_type;
 
  150       typedef typename traits_base::pointer         pointer;
 
  151       typedef typename traits_base::const_pointer   const_pointer;
 
  152       typedef typename traits_base::reference       reference;
 
  153       typedef typename traits_base::const_reference     const_reference;
 
  154       typedef typename traits_type::point_const_iterator point_const_iterator;
 
  156       typedef point_const_iterator          const_iterator;
 
  157       typedef typename traits_type::point_iterator  point_iterator;
 
  158       typedef point_iterator                iterator;
 
  160       typedef typename traits_type::const_reverse_iterator const_reverse_iterator;
 
  162       typedef typename traits_type::reverse_iterator    reverse_iterator;
 
  163       typedef typename traits_type::node_const_iterator node_const_iterator;
 
  164       typedef typename traits_type::node_iterator   node_iterator;
 
  165       typedef typename traits_type::node_update     node_update;
 
  167       typedef Cmp_Fn                    cmp_fn;
 
  168       typedef _Alloc                    allocator_type;
 
  170       PB_DS_BIN_TREE_NAME();
 
  172       PB_DS_BIN_TREE_NAME(
const Cmp_Fn&);
 
  174       PB_DS_BIN_TREE_NAME(
const Cmp_Fn&, 
const node_update&);
 
  176       PB_DS_BIN_TREE_NAME(
const PB_DS_CLASS_C_DEC&);
 
  179       swap(PB_DS_CLASS_C_DEC&);
 
  181       ~PB_DS_BIN_TREE_NAME();
 
  198       inline point_iterator
 
  199       lower_bound(key_const_reference);
 
  201       inline point_const_iterator
 
  202       lower_bound(key_const_reference) 
const;
 
  204       inline point_iterator
 
  205       upper_bound(key_const_reference);
 
  207       inline point_const_iterator
 
  208       upper_bound(key_const_reference) 
const;
 
  210       inline point_iterator
 
  211       find(key_const_reference);
 
  213       inline point_const_iterator
 
  214       find(key_const_reference) 
const;
 
  219       inline const_iterator
 
  225       inline const_iterator
 
  228       inline reverse_iterator
 
  231       inline const_reverse_iterator
 
  234       inline reverse_iterator
 
  237       inline const_reverse_iterator
 
  242       inline node_const_iterator
 
  252       inline node_const_iterator
 
  265       value_swap(PB_DS_CLASS_C_DEC&);
 
  268       initialize_min_max();
 
  271       insert_imp_empty(const_reference);
 
  274       insert_leaf_new(const_reference, node_pointer, 
bool);
 
  277       get_new_node_for_leaf_insert(const_reference, false_type);
 
  280       get_new_node_for_leaf_insert(const_reference, true_type);
 
  283       actual_erase_node(node_pointer);
 
  289       update_min_max_for_erased_node(node_pointer);
 
  292       clear_imp(node_pointer);
 
  295       insert_leaf(const_reference);
 
  298       rotate_left(node_pointer);
 
  301       rotate_right(node_pointer);
 
  304       rotate_parent(node_pointer);
 
  307       apply_update(node_pointer, null_node_update_pointer);
 
  309       template<
typename Node_Update_>
 
  311     apply_update(node_pointer, Node_Update_*);
 
  314       update_to_top(node_pointer, null_node_update_pointer);
 
  316       template<
typename Node_Update_>
 
  318     update_to_top(node_pointer, Node_Update_*);
 
  321       join_prep(PB_DS_CLASS_C_DEC&);
 
  324       join_finish(PB_DS_CLASS_C_DEC&);
 
  327       split_prep(key_const_reference, PB_DS_CLASS_C_DEC&);
 
  330       split_finish(PB_DS_CLASS_C_DEC&);
 
  333       recursive_count(node_pointer) 
const;
 
  335 #ifdef _GLIBCXX_DEBUG 
  337       assert_valid(
const char*, 
int) 
const;
 
  340       structure_only_assert_valid(
const char*, 
int) 
const;
 
  343       assert_node_consistent(
const node_pointer, 
const char*, 
int) 
const;
 
  347 #ifdef _GLIBCXX_DEBUG 
  349       assert_iterators(
const char*, 
int) 
const;
 
  352       assert_consistent_with_debug_base(
const char*, 
int) 
const;
 
  355       assert_node_consistent_with_left(
const node_pointer,
 
  356                        const char*, 
int) 
const;
 
  359       assert_node_consistent_with_right(
const node_pointer,
 
  360                     const char*, 
int) 
const;
 
  363       assert_consistent_with_debug_base(
const node_pointer,
 
  364                     const char*, 
int) 
const;
 
  367       assert_min(
const char*, 
int) 
const;
 
  370       assert_min_imp(
const node_pointer, 
const char*, 
int) 
const;
 
  373       assert_max(
const char*, 
int) 
const;
 
  376       assert_max_imp(
const node_pointer, 
const char*, 
int) 
const;
 
  379       assert_size(
const char*, 
int) 
const;
 
  384       assert_node_consistent_(
const node_pointer, 
const char*, 
int) 
const;
 
  391       recursive_copy_node(
const node_pointer);
 
  394       node_pointer      m_p_head;
 
  396       static node_allocator     s_node_allocator;
 
  399 #define PB_DS_STRUCT_ONLY_ASSERT_VALID(X)               \ 
  400   _GLIBCXX_DEBUG_ONLY(X.structure_only_assert_valid(__FILE__, __LINE__);) 
  402 #define PB_DS_ASSERT_NODE_CONSISTENT(_Node)             \ 
  403   _GLIBCXX_DEBUG_ONLY(assert_node_consistent(_Node, __FILE__, __LINE__);) 
  416 #undef PB_DS_ASSERT_NODE_CONSISTENT 
  417 #undef PB_DS_STRUCT_ONLY_ASSERT_VALID 
  418 #undef PB_DS_CLASS_C_DEC 
  419 #undef PB_DS_CLASS_T_DEC 
  420 #undef PB_DS_BIN_TREE_NAME 
  421 #undef PB_DS_BIN_TREE_TRAITS_BASE 
  422 #undef PB_DS_DEBUG_MAP_BASE_C_DEC 
  424 #ifdef PB_DS_TREE_TRACE 
  425 #undef PB_DS_TREE_TRACE_BASE_C_DEC 
auto end(_Container &__cont) -> decltype(__cont.end())
Return an iterator pointing to one past the last element of the container. 
GNU extensions for policy-based data structures for public use. 
auto begin(_Container &__cont) -> decltype(__cont.begin())
Return an iterator pointing to the first element of the container. 
Struct holding two objects of arbitrary type. 
void swap(_Tp &, _Tp &) noexcept(__and_< is_nothrow_move_constructible< _Tp >, is_nothrow_move_assignable< _Tp >>::value)
Swaps two values.