41 #ifndef PB_DS_BIN_SEARCH_TREE_FIND_ITERATORS_HPP 
   42 #define PB_DS_BIN_SEARCH_TREE_FIND_ITERATORS_HPP 
   52 #define PB_DS_TREE_CONST_IT_C_DEC                   \ 
   53     bin_search_tree_const_it_<                      \ 
   60                         Is_Forward_Iterator,    \ 
   63 #define PB_DS_TREE_CONST_ODIR_IT_C_DEC                  \ 
   64     bin_search_tree_const_it_<                      \ 
   71                         !Is_Forward_Iterator,   \ 
   74 #define PB_DS_TREE_IT_C_DEC                     \ 
   75     bin_search_tree_it_<                        \ 
   82                         Is_Forward_Iterator,    \ 
   85 #define PB_DS_TREE_ODIR_IT_C_DEC                    \ 
   86     bin_search_tree_it_<                        \ 
   93                             !Is_Forward_Iterator, \ 
   97     template<
typename Node_Pointer,
 
  100          typename Const_Pointer,
 
  102          typename Const_Reference,
 
  103          bool Is_Forward_Iterator,
 
  109       typedef typename _Alloc::difference_type  difference_type;
 
  110       typedef Value_Type                value_type;
 
  111       typedef Pointer                   pointer;
 
  112       typedef Const_Pointer                 const_pointer;
 
  113       typedef Reference                 reference;
 
  114       typedef Const_Reference               const_reference;
 
  118       : m_p_nd(const_cast<Node_Pointer>(p_nd))
 
  123       : m_p_nd(other.m_p_nd)
 
  127       PB_DS_TREE_CONST_IT_C_DEC& 
 
  128       operator=(
const PB_DS_TREE_CONST_IT_C_DEC& other)
 
  130     m_p_nd = other.m_p_nd;
 
  135       PB_DS_TREE_CONST_IT_C_DEC& 
 
  136       operator=(
const PB_DS_TREE_CONST_ODIR_IT_C_DEC& other)
 
  138     m_p_nd = other.m_p_nd;
 
  145     _GLIBCXX_DEBUG_ASSERT(m_p_nd != 0);
 
  146     return &m_p_nd->m_value;
 
  149       inline const_reference
 
  152     _GLIBCXX_DEBUG_ASSERT(m_p_nd != 0);
 
  153     return m_p_nd->m_value;
 
  157       operator==(
const PB_DS_TREE_CONST_IT_C_DEC & other)
 const 
  158       { 
return m_p_nd == other.m_p_nd; }
 
  161       operator==(
const PB_DS_TREE_CONST_ODIR_IT_C_DEC & other)
 const 
  162       { 
return m_p_nd == other.m_p_nd; }
 
  165       operator!=(
const PB_DS_TREE_CONST_IT_C_DEC& other)
 const 
  166       { 
return m_p_nd != other.m_p_nd; }
 
  169       operator!=(
const PB_DS_TREE_CONST_ODIR_IT_C_DEC& other)
 const 
  170       { 
return m_p_nd != other.m_p_nd; }
 
  172       inline PB_DS_TREE_CONST_IT_C_DEC& 
 
  175     _GLIBCXX_DEBUG_ASSERT(m_p_nd != 0);
 
  176     inc(integral_constant<int,Is_Forward_Iterator>());
 
  180       inline PB_DS_TREE_CONST_IT_C_DEC
 
  183     PB_DS_TREE_CONST_IT_C_DEC ret_it(m_p_nd);
 
  188       inline PB_DS_TREE_CONST_IT_C_DEC& 
 
  191     dec(integral_constant<int,Is_Forward_Iterator>());
 
  195       inline PB_DS_TREE_CONST_IT_C_DEC
 
  198     PB_DS_TREE_CONST_IT_C_DEC ret_it(m_p_nd);
 
  206       { dec(true_type()); }
 
  211     if (m_p_nd->special()&& 
 
  212         m_p_nd->m_p_parent->m_p_parent == m_p_nd)
 
  214         m_p_nd = m_p_nd->m_p_left;
 
  218     if (m_p_nd->m_p_right != 0)
 
  220         m_p_nd = m_p_nd->m_p_right;
 
  221         while (m_p_nd->m_p_left != 0)
 
  222           m_p_nd = m_p_nd->m_p_left;
 
  226     Node_Pointer p_y = m_p_nd->m_p_parent;
 
  227     while (m_p_nd == p_y->m_p_right)
 
  230         p_y = p_y->m_p_parent;
 
  233     if (m_p_nd->m_p_right != p_y)
 
  239       { inc(true_type()); }
 
  244     if (m_p_nd->special() && m_p_nd->m_p_parent->m_p_parent == m_p_nd)
 
  246         m_p_nd = m_p_nd->m_p_right;
 
  250     if (m_p_nd->m_p_left != 0)
 
  252         Node_Pointer p_y = m_p_nd->m_p_left;
 
  253         while (p_y->m_p_right != 0)
 
  254           p_y = p_y->m_p_right;
 
  259     Node_Pointer p_y = m_p_nd->m_p_parent;
 
  260     while (m_p_nd == p_y->m_p_left)
 
  263         p_y = p_y->m_p_parent;
 
  265     if (m_p_nd->m_p_left != p_y)
 
  274     template<
typename Node_Pointer,
 
  277          typename Const_Pointer,
 
  279          typename Const_Reference,
 
  280          bool Is_Forward_Iterator,
 
  287       : PB_DS_TREE_CONST_IT_C_DEC((Node_Pointer)p_nd)
 
  292       : PB_DS_TREE_CONST_IT_C_DEC(other.m_p_nd)
 
  297       operator=(
const PB_DS_TREE_IT_C_DEC& other)
 
  299     base_it_type::m_p_nd = other.m_p_nd;
 
  305       operator=(
const PB_DS_TREE_ODIR_IT_C_DEC& other)
 
  307     base_it_type::m_p_nd = other.m_p_nd;
 
  311       inline typename PB_DS_TREE_CONST_IT_C_DEC::pointer
 
  314     _GLIBCXX_DEBUG_ASSERT(base_it_type::m_p_nd != 0);
 
  315     return &base_it_type::m_p_nd->m_value;
 
  318       inline typename PB_DS_TREE_CONST_IT_C_DEC::reference
 
  321     _GLIBCXX_DEBUG_ASSERT(base_it_type::m_p_nd != 0);
 
  322     return base_it_type::m_p_nd->m_value;
 
  325       inline PB_DS_TREE_IT_C_DEC& 
 
  328     PB_DS_TREE_CONST_IT_C_DEC:: operator++();
 
  332       inline PB_DS_TREE_IT_C_DEC
 
  335     PB_DS_TREE_IT_C_DEC ret_it(base_it_type::m_p_nd);
 
  340       inline PB_DS_TREE_IT_C_DEC& 
 
  343     PB_DS_TREE_CONST_IT_C_DEC:: operator--();
 
  347       inline PB_DS_TREE_IT_C_DEC
 
  350     PB_DS_TREE_IT_C_DEC ret_it(base_it_type::m_p_nd);
 
  359 #undef PB_DS_TREE_CONST_IT_C_DEC 
  360 #undef PB_DS_TREE_CONST_ODIR_IT_C_DEC 
  361 #undef PB_DS_TREE_IT_C_DEC 
  362 #undef PB_DS_TREE_ODIR_IT_C_DEC 
GNU extensions for policy-based data structures for public use. 
Bidirectional iterators support a superset of forward iterator operations.