163d1a8abSmrg // -*- C++ -*-
263d1a8abSmrg 
3*ec02198aSmrg // Copyright (C) 2005-2020 Free Software Foundation, Inc.
463d1a8abSmrg //
563d1a8abSmrg // This file is part of the GNU ISO C++ Library.  This library is free
663d1a8abSmrg // software; you can redistribute it and/or modify it under the terms
763d1a8abSmrg // of the GNU General Public License as published by the Free Software
863d1a8abSmrg // Foundation; either version 3, or (at your option) any later
963d1a8abSmrg // version.
1063d1a8abSmrg 
1163d1a8abSmrg // This library is distributed in the hope that it will be useful, but
1263d1a8abSmrg // WITHOUT ANY WARRANTY; without even the implied warranty of
1363d1a8abSmrg // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
1463d1a8abSmrg // General Public License for more details.
1563d1a8abSmrg 
1663d1a8abSmrg // Under Section 7 of GPL version 3, you are granted additional
1763d1a8abSmrg // permissions described in the GCC Runtime Library Exception, version
1863d1a8abSmrg // 3.1, as published by the Free Software Foundation.
1963d1a8abSmrg 
2063d1a8abSmrg // You should have received a copy of the GNU General Public License and
2163d1a8abSmrg // a copy of the GCC Runtime Library Exception along with this program;
2263d1a8abSmrg // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
2363d1a8abSmrg // <http://www.gnu.org/licenses/>.
2463d1a8abSmrg 
2563d1a8abSmrg // Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL.
2663d1a8abSmrg 
2763d1a8abSmrg // Permission to use, copy, modify, sell, and distribute this software
2863d1a8abSmrg // is hereby granted without fee, provided that the above copyright
2963d1a8abSmrg // notice appears in all copies, and that both that copyright notice
3063d1a8abSmrg // and this permission notice appear in supporting documentation. None
3163d1a8abSmrg // of the above authors, nor IBM Haifa Research Laboratories, make any
3263d1a8abSmrg // representation about the suitability of this software for any
3363d1a8abSmrg // purpose. It is provided "as is" without express or implied
3463d1a8abSmrg // warranty.
3563d1a8abSmrg 
3663d1a8abSmrg /**
3763d1a8abSmrg  * @file pat_trie_/find_fn_imps.hpp
3863d1a8abSmrg  * Contains an implementation class for pat_trie.
3963d1a8abSmrg  */
4063d1a8abSmrg 
41*ec02198aSmrg #ifdef PB_DS_CLASS_C_DEC
42*ec02198aSmrg 
4363d1a8abSmrg PB_DS_CLASS_T_DEC
4463d1a8abSmrg inline typename PB_DS_CLASS_C_DEC::point_iterator
4563d1a8abSmrg PB_DS_CLASS_C_DEC::
find(key_const_reference r_key)4663d1a8abSmrg find(key_const_reference r_key)
4763d1a8abSmrg {
4863d1a8abSmrg   PB_DS_ASSERT_VALID((*this))
4963d1a8abSmrg   node_pointer p_nd = find_imp(r_key);
5063d1a8abSmrg 
5163d1a8abSmrg   if (p_nd == 0 || p_nd->m_type != leaf_node)
5263d1a8abSmrg     {
5363d1a8abSmrg       PB_DS_CHECK_KEY_DOES_NOT_EXIST(r_key)
5463d1a8abSmrg       return end();
5563d1a8abSmrg     }
5663d1a8abSmrg 
5763d1a8abSmrg   if (synth_access_traits::equal_keys(PB_DS_V2F(static_cast<leaf_pointer>(p_nd)->value()), r_key))
5863d1a8abSmrg     {
5963d1a8abSmrg       PB_DS_CHECK_KEY_EXISTS(r_key)
6063d1a8abSmrg       return iterator(p_nd);
6163d1a8abSmrg     }
6263d1a8abSmrg 
6363d1a8abSmrg   PB_DS_CHECK_KEY_DOES_NOT_EXIST(r_key)
6463d1a8abSmrg   return end();
6563d1a8abSmrg }
6663d1a8abSmrg 
6763d1a8abSmrg PB_DS_CLASS_T_DEC
6863d1a8abSmrg inline typename PB_DS_CLASS_C_DEC::point_const_iterator
6963d1a8abSmrg PB_DS_CLASS_C_DEC::
find(key_const_reference r_key) const7063d1a8abSmrg find(key_const_reference r_key) const
7163d1a8abSmrg {
7263d1a8abSmrg   PB_DS_ASSERT_VALID((*this))
7363d1a8abSmrg 
7463d1a8abSmrg   node_const_pointer p_nd = const_cast<PB_DS_CLASS_C_DEC* >(this)->find_imp(r_key);
7563d1a8abSmrg 
7663d1a8abSmrg   if (p_nd == 0 || p_nd->m_type != leaf_node)
7763d1a8abSmrg     {
7863d1a8abSmrg       PB_DS_CHECK_KEY_DOES_NOT_EXIST(r_key)
7963d1a8abSmrg       return end();
8063d1a8abSmrg     }
8163d1a8abSmrg 
8263d1a8abSmrg   if (synth_access_traits::equal_keys(PB_DS_V2F(static_cast<leaf_const_pointer>(p_nd)->value()), r_key))
8363d1a8abSmrg     {
8463d1a8abSmrg       PB_DS_CHECK_KEY_EXISTS(r_key)
8563d1a8abSmrg       return const_iterator(const_cast<node_pointer>(p_nd));
8663d1a8abSmrg     }
8763d1a8abSmrg 
8863d1a8abSmrg   PB_DS_CHECK_KEY_DOES_NOT_EXIST(r_key)
8963d1a8abSmrg   return end();
9063d1a8abSmrg }
9163d1a8abSmrg 
9263d1a8abSmrg PB_DS_CLASS_T_DEC
9363d1a8abSmrg inline typename PB_DS_CLASS_C_DEC::node_pointer
9463d1a8abSmrg PB_DS_CLASS_C_DEC::
find_imp(key_const_reference r_key)9563d1a8abSmrg find_imp(key_const_reference r_key)
9663d1a8abSmrg {
9763d1a8abSmrg   if (empty())
9863d1a8abSmrg     return 0;
9963d1a8abSmrg 
10063d1a8abSmrg   typename synth_access_traits::const_iterator b_it =
10163d1a8abSmrg     synth_access_traits::begin(r_key);
10263d1a8abSmrg   typename synth_access_traits::const_iterator e_it =
10363d1a8abSmrg     synth_access_traits::end(r_key);
10463d1a8abSmrg 
10563d1a8abSmrg   node_pointer p_nd = m_p_head->m_p_parent;
10663d1a8abSmrg   _GLIBCXX_DEBUG_ASSERT(p_nd != 0);
10763d1a8abSmrg 
10863d1a8abSmrg   while (p_nd->m_type != leaf_node)
10963d1a8abSmrg     {
11063d1a8abSmrg       _GLIBCXX_DEBUG_ASSERT(p_nd->m_type == i_node);
11163d1a8abSmrg       node_pointer p_next_nd = static_cast<inode_pointer>(p_nd)->get_child_node(b_it,  e_it,  this);
11263d1a8abSmrg 
11363d1a8abSmrg       if (p_next_nd == 0)
11463d1a8abSmrg 	return p_nd;
11563d1a8abSmrg       p_nd = p_next_nd;
11663d1a8abSmrg     }
11763d1a8abSmrg   return p_nd;
11863d1a8abSmrg }
11963d1a8abSmrg 
12063d1a8abSmrg PB_DS_CLASS_T_DEC
12163d1a8abSmrg inline typename PB_DS_CLASS_C_DEC::node_pointer
12263d1a8abSmrg PB_DS_CLASS_C_DEC::
lower_bound_imp(key_const_reference r_key)12363d1a8abSmrg lower_bound_imp(key_const_reference r_key)
12463d1a8abSmrg {
12563d1a8abSmrg   if (empty())
12663d1a8abSmrg     return (m_p_head);
12763d1a8abSmrg 
12863d1a8abSmrg   node_pointer p_nd = m_p_head->m_p_parent;
12963d1a8abSmrg   _GLIBCXX_DEBUG_ASSERT(p_nd != 0);
13063d1a8abSmrg 
13163d1a8abSmrg   typename PB_DS_CLASS_C_DEC::a_const_iterator b_it =
13263d1a8abSmrg     synth_access_traits::begin(r_key);
13363d1a8abSmrg 
13463d1a8abSmrg   typename PB_DS_CLASS_C_DEC::a_const_iterator e_it =
13563d1a8abSmrg     synth_access_traits::end(r_key);
13663d1a8abSmrg 
13763d1a8abSmrg   size_type checked_ind = 0;
13863d1a8abSmrg   while (true)
13963d1a8abSmrg     {
14063d1a8abSmrg       if (p_nd->m_type == leaf_node)
14163d1a8abSmrg         {
14263d1a8abSmrg 	  if (!synth_access_traits::cmp_keys(PB_DS_V2F(static_cast<leaf_const_pointer>(p_nd)->value()), r_key))
14363d1a8abSmrg 	    return p_nd;
14463d1a8abSmrg 	  iterator it(p_nd);
14563d1a8abSmrg 	  ++it;
14663d1a8abSmrg 	  return it.m_p_nd;
14763d1a8abSmrg         }
14863d1a8abSmrg 
14963d1a8abSmrg       _GLIBCXX_DEBUG_ASSERT(p_nd->m_type == i_node);
15063d1a8abSmrg       const size_type new_checked_ind =
15163d1a8abSmrg 	static_cast<inode_pointer>(p_nd)->get_e_ind();
15263d1a8abSmrg 
15363d1a8abSmrg       p_nd =
15463d1a8abSmrg 	static_cast<inode_pointer>(p_nd)->get_lower_bound_child_node(                b_it, e_it, checked_ind, this);
15563d1a8abSmrg       checked_ind = new_checked_ind;
15663d1a8abSmrg     }
15763d1a8abSmrg }
15863d1a8abSmrg 
15963d1a8abSmrg PB_DS_CLASS_T_DEC
16063d1a8abSmrg inline typename PB_DS_CLASS_C_DEC::point_iterator
16163d1a8abSmrg PB_DS_CLASS_C_DEC::
lower_bound(key_const_reference r_key)16263d1a8abSmrg lower_bound(key_const_reference r_key)
16363d1a8abSmrg { return point_iterator(lower_bound_imp(r_key)); }
16463d1a8abSmrg 
16563d1a8abSmrg PB_DS_CLASS_T_DEC
16663d1a8abSmrg inline typename PB_DS_CLASS_C_DEC::point_const_iterator
16763d1a8abSmrg PB_DS_CLASS_C_DEC::
lower_bound(key_const_reference r_key) const16863d1a8abSmrg lower_bound(key_const_reference r_key) const
16963d1a8abSmrg {
17063d1a8abSmrg   return point_const_iterator(const_cast<PB_DS_CLASS_C_DEC* >(this)->lower_bound_imp(r_key));
17163d1a8abSmrg }
17263d1a8abSmrg 
17363d1a8abSmrg PB_DS_CLASS_T_DEC
17463d1a8abSmrg inline typename PB_DS_CLASS_C_DEC::point_iterator
17563d1a8abSmrg PB_DS_CLASS_C_DEC::
upper_bound(key_const_reference r_key)17663d1a8abSmrg upper_bound(key_const_reference r_key)
17763d1a8abSmrg {
17863d1a8abSmrg   point_iterator l_bound_it = lower_bound(r_key);
17963d1a8abSmrg 
18063d1a8abSmrg   _GLIBCXX_DEBUG_ASSERT(l_bound_it == end() ||
18163d1a8abSmrg 		   !synth_access_traits::cmp_keys(PB_DS_V2F(*l_bound_it),
18263d1a8abSmrg 						    r_key));
18363d1a8abSmrg 
18463d1a8abSmrg   if (l_bound_it == end() ||
18563d1a8abSmrg       synth_access_traits::cmp_keys(r_key, PB_DS_V2F(*l_bound_it)))
18663d1a8abSmrg     return l_bound_it;
18763d1a8abSmrg 
18863d1a8abSmrg   return ++l_bound_it;
18963d1a8abSmrg }
19063d1a8abSmrg 
19163d1a8abSmrg PB_DS_CLASS_T_DEC
19263d1a8abSmrg inline typename PB_DS_CLASS_C_DEC::point_const_iterator
19363d1a8abSmrg PB_DS_CLASS_C_DEC::
upper_bound(key_const_reference r_key) const19463d1a8abSmrg upper_bound(key_const_reference r_key) const
19563d1a8abSmrg {
19663d1a8abSmrg   point_const_iterator l_bound_it = lower_bound(r_key);
19763d1a8abSmrg 
19863d1a8abSmrg   _GLIBCXX_DEBUG_ASSERT(l_bound_it == end() ||
19963d1a8abSmrg 		   !synth_access_traits::cmp_keys(PB_DS_V2F(*l_bound_it),
20063d1a8abSmrg 						    r_key));
20163d1a8abSmrg 
20263d1a8abSmrg   if (l_bound_it == end() ||
20363d1a8abSmrg       synth_access_traits::cmp_keys(r_key, PB_DS_V2F(*l_bound_it)))
20463d1a8abSmrg     return l_bound_it;
20563d1a8abSmrg   return ++l_bound_it;
20663d1a8abSmrg }
20763d1a8abSmrg 
20863d1a8abSmrg PB_DS_CLASS_T_DEC
20963d1a8abSmrg inline typename PB_DS_CLASS_C_DEC::a_const_iterator
21063d1a8abSmrg PB_DS_CLASS_C_DEC::
pref_begin(node_const_pointer p_nd)21163d1a8abSmrg pref_begin(node_const_pointer p_nd)
21263d1a8abSmrg {
21363d1a8abSmrg   if (p_nd->m_type == leaf_node)
21463d1a8abSmrg     return (synth_access_traits::begin(PB_DS_V2F(static_cast<leaf_const_pointer>(p_nd)->value())));
21563d1a8abSmrg 
21663d1a8abSmrg   _GLIBCXX_DEBUG_ASSERT(p_nd->m_type == i_node);
21763d1a8abSmrg   return static_cast<inode_const_pointer>(p_nd)->pref_b_it();
21863d1a8abSmrg }
21963d1a8abSmrg 
22063d1a8abSmrg PB_DS_CLASS_T_DEC
22163d1a8abSmrg inline typename PB_DS_CLASS_C_DEC::a_const_iterator
22263d1a8abSmrg PB_DS_CLASS_C_DEC::
pref_end(node_const_pointer p_nd)22363d1a8abSmrg pref_end(node_const_pointer p_nd)
22463d1a8abSmrg {
22563d1a8abSmrg   if (p_nd->m_type == leaf_node)
22663d1a8abSmrg     return (synth_access_traits::end(PB_DS_V2F(static_cast<leaf_const_pointer>(p_nd)->value())));
22763d1a8abSmrg 
22863d1a8abSmrg   _GLIBCXX_DEBUG_ASSERT(p_nd->m_type == i_node);
22963d1a8abSmrg   return static_cast<inode_const_pointer>(p_nd)->pref_e_it();
23063d1a8abSmrg }
23163d1a8abSmrg 
23263d1a8abSmrg PB_DS_CLASS_T_DEC
23363d1a8abSmrg inline typename PB_DS_CLASS_C_DEC::leaf_const_pointer
23463d1a8abSmrg PB_DS_CLASS_C_DEC::
leftmost_descendant(node_const_pointer p_nd)23563d1a8abSmrg leftmost_descendant(node_const_pointer p_nd)
23663d1a8abSmrg {
23763d1a8abSmrg   if (p_nd->m_type == leaf_node)
23863d1a8abSmrg     return static_cast<leaf_const_pointer>(p_nd);
23963d1a8abSmrg   return static_cast<inode_const_pointer>(p_nd)->leftmost_descendant();
24063d1a8abSmrg }
24163d1a8abSmrg 
24263d1a8abSmrg PB_DS_CLASS_T_DEC
24363d1a8abSmrg inline typename PB_DS_CLASS_C_DEC::leaf_pointer
24463d1a8abSmrg PB_DS_CLASS_C_DEC::
leftmost_descendant(node_pointer p_nd)24563d1a8abSmrg leftmost_descendant(node_pointer p_nd)
24663d1a8abSmrg {
24763d1a8abSmrg   if (p_nd->m_type == leaf_node)
24863d1a8abSmrg     return static_cast<leaf_pointer>(p_nd);
24963d1a8abSmrg   return static_cast<inode_pointer>(p_nd)->leftmost_descendant();
25063d1a8abSmrg }
25163d1a8abSmrg 
25263d1a8abSmrg PB_DS_CLASS_T_DEC
25363d1a8abSmrg inline typename PB_DS_CLASS_C_DEC::leaf_const_pointer
25463d1a8abSmrg PB_DS_CLASS_C_DEC::
rightmost_descendant(node_const_pointer p_nd)25563d1a8abSmrg rightmost_descendant(node_const_pointer p_nd)
25663d1a8abSmrg {
25763d1a8abSmrg   if (p_nd->m_type == leaf_node)
25863d1a8abSmrg     return static_cast<leaf_const_pointer>(p_nd);
25963d1a8abSmrg   return static_cast<inode_const_pointer>(p_nd)->rightmost_descendant();
26063d1a8abSmrg }
26163d1a8abSmrg 
26263d1a8abSmrg PB_DS_CLASS_T_DEC
26363d1a8abSmrg inline typename PB_DS_CLASS_C_DEC::leaf_pointer
26463d1a8abSmrg PB_DS_CLASS_C_DEC::
rightmost_descendant(node_pointer p_nd)26563d1a8abSmrg rightmost_descendant(node_pointer p_nd)
26663d1a8abSmrg {
26763d1a8abSmrg   if (p_nd->m_type == leaf_node)
26863d1a8abSmrg     return static_cast<leaf_pointer>(p_nd);
26963d1a8abSmrg   return static_cast<inode_pointer>(p_nd)->rightmost_descendant();
27063d1a8abSmrg }
27163d1a8abSmrg 
272*ec02198aSmrg #endif
273