42 inline std::pair<typename PB_DS_CLASS_C_DEC::point_iterator, bool>
44 insert_leaf(const_reference r_value)
49 return std::make_pair(insert_imp_empty(r_value),
52 node_pointer p_nd = m_p_head->m_p_parent;
53 node_pointer p_pot = m_p_head;
56 if (!Cmp_Fn::operator()(
PB_DS_V2F(p_nd->m_value),
61 p_nd = p_nd->m_p_left;
64 p_nd = p_nd->m_p_right;
66 if (p_pot == m_p_head)
67 return std::make_pair(insert_leaf_new(r_value, m_p_head->m_p_right,
false),
70 if (!Cmp_Fn::operator()(
PB_DS_V2F(r_value),
80 p_nd = p_pot->m_p_left;
82 return std::make_pair(insert_leaf_new(r_value, p_pot,
true),
85 while (p_nd->m_p_right != 0)
86 p_nd = p_nd->m_p_right;
88 return std::make_pair(insert_leaf_new(r_value, p_nd, false),
95 insert_leaf_new(const_reference r_value, node_pointer p_nd,
bool left_nd)
97 node_pointer p_new_nd =
98 get_new_node_for_leaf_insert(r_value,
99 traits_base::m_no_throw_copies_indicator);
107 p_nd->m_p_left = p_new_nd;
108 if (m_p_head->m_p_left == p_nd)
109 m_p_head->m_p_left = p_new_nd;
117 p_nd->m_p_right = p_new_nd;
118 if (m_p_head->m_p_right == p_nd)
119 m_p_head->m_p_right = p_new_nd;
122 p_new_nd->m_p_parent = p_nd;
123 p_new_nd->m_p_left = p_new_nd->m_p_right = 0;
126 update_to_top(p_new_nd, (node_update* )this);
128 return iterator(p_new_nd);
134 insert_imp_empty(const_reference r_value)
136 node_pointer p_new_node =
137 get_new_node_for_leaf_insert(r_value, traits_base::m_no_throw_copies_indicator);
139 m_p_head->m_p_left = m_p_head->m_p_right =
140 m_p_head->m_p_parent = p_new_node;
142 p_new_node->m_p_parent = m_p_head;
143 p_new_node->m_p_left = p_new_node->m_p_right = 0;
146 update_to_top(m_p_head->m_p_parent, (node_update*)
this);
147 return iterator(p_new_node);
151 inline typename PB_DS_CLASS_C_DEC::node_pointer
153 get_new_node_for_leaf_insert(const_reference r_val,
false_type)
155 node_pointer p_new_nd = s_node_allocator.allocate(1);
156 cond_dealtor_t cond(p_new_nd);
158 new (
const_cast<void*
>(
static_cast<const void*
>(&p_new_nd->m_value)))
159 typename node::value_type(r_val);
161 cond.set_no_action();
162 p_new_nd->m_p_left = p_new_nd->m_p_right = 0;
168 inline typename PB_DS_CLASS_C_DEC::node_pointer
170 get_new_node_for_leaf_insert(const_reference r_val,
true_type)
172 node_pointer p_new_nd = s_node_allocator.allocate(1);
174 new (
const_cast<void*
>(
static_cast<const void*
>(&p_new_nd->m_value)))
175 typename node::value_type(r_val);
177 p_new_nd->m_p_left = p_new_nd->m_p_right = 0;
#define PB_DS_STRUCT_ONLY_ASSERT_VALID(X)
Definition: bin_search_tree_.hpp:399
#define false
Definition: stdbool.h:35
#define _GLIBCXX_DEBUG_ASSERT(_Condition)
Definition: debug.h:61
#define true
Definition: stdbool.h:34
#define _GLIBCXX_DEBUG_ONLY(_Statement)
Definition: debug.h:63
#define PB_DS_CLASS_C_DEC
Definition: bin_search_tree_.hpp:71
#define PB_DS_CLASS_T_DEC
Definition: bin_search_tree_.hpp:67
return(unsigned int) __res
std::tr1::integral_constant< int, 1 > true_type
Definition: type_utils.hpp:70
#define PB_DS_ASSERT_NODE_CONSISTENT(_Node)
Definition: bin_search_tree_.hpp:402
#define PB_DS_CHECK_KEY_EXISTS(_Key)
Definition: container_base_dispatch.hpp:55
#define PB_DS_V2F(X)
Definition: container_base_dispatch.hpp:80
#define PB_DS_CHECK_KEY_DOES_NOT_EXIST(_Key)
Definition: container_base_dispatch.hpp:58
std::tr1::integral_constant< int, 0 > false_type
Definition: type_utils.hpp:71