]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/libstdc++/include/ext/pb_ds/detail/tree_policy/order_statistics_imp.hpp
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / contrib / libstdc++ / include / ext / pb_ds / detail / tree_policy / order_statistics_imp.hpp
1 // -*- C++ -*-
2
3 // Copyright (C) 2005, 2006 Free Software Foundation, Inc.
4 //
5 // This file is part of the GNU ISO C++ Library.  This library is free
6 // software; you can redistribute it and/or modify it under the terms
7 // of the GNU General Public License as published by the Free Software
8 // Foundation; either version 2, or (at your option) any later
9 // version.
10
11 // This library is distributed in the hope that it will be useful, but
12 // WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 // General Public License for more details.
15
16 // You should have received a copy of the GNU General Public License
17 // along with this library; see the file COPYING.  If not, write to
18 // the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
19 // MA 02111-1307, USA.
20
21 // As a special exception, you may use this file as part of a free
22 // software library without restriction.  Specifically, if other files
23 // instantiate templates or use macros or inline functions from this
24 // file, or you compile this file and link it with other files to
25 // produce an executable, this file does not by itself cause the
26 // resulting executable to be covered by the GNU General Public
27 // License.  This exception does not however invalidate any other
28 // reasons why the executable file might be covered by the GNU General
29 // Public License.
30
31 // Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL.
32
33 // Permission to use, copy, modify, sell, and distribute this software
34 // is hereby granted without fee, provided that the above copyright
35 // notice appears in all copies, and that both that copyright notice
36 // and this permission notice appear in supporting documentation. None
37 // of the above authors, nor IBM Haifa Research Laboratories, make any
38 // representation about the suitability of this software for any
39 // purpose. It is provided "as is" without express or implied
40 // warranty.
41
42 /**
43  * @file order_statistics_imp.hpp
44  * Contains forward declarations for order_statistics_key
45  */
46
47 PB_DS_CLASS_T_DEC
48 inline typename PB_DS_CLASS_C_DEC::iterator
49 PB_DS_CLASS_C_DEC::
50 find_by_order(size_type order)
51 {
52   node_iterator it = node_begin();
53
54   node_iterator end_it = node_end();
55
56   while (it != end_it)
57     {
58       node_iterator l_it = it.get_l_child();
59
60       const size_type o = (l_it == end_it)?
61         0 :
62         l_it.get_metadata();
63
64       if (order == o)
65         return (*it);
66       else if (order < o)
67         it = l_it;
68       else
69         {
70           order -= o + 1;
71
72           it = it.get_r_child();
73         }
74     }
75
76   return (PB_DS_BASE_C_DEC::end_iterator());
77 }
78
79 PB_DS_CLASS_T_DEC
80 inline typename PB_DS_CLASS_C_DEC::const_iterator
81 PB_DS_CLASS_C_DEC::
82 find_by_order(size_type order) const
83 {
84   return (const_cast<PB_DS_CLASS_C_DEC* >(this)->find_by_order(order));
85 }
86
87 PB_DS_CLASS_T_DEC
88 inline typename PB_DS_CLASS_C_DEC::size_type
89 PB_DS_CLASS_C_DEC::
90 order_of_key(const_key_reference r_key) const
91 {
92   const_node_iterator it = node_begin();
93
94   const_node_iterator end_it = node_end();
95
96   const cmp_fn& r_cmp_fn =
97     const_cast<PB_DS_CLASS_C_DEC* >(this)->get_cmp_fn();
98
99   size_type ord = 0;
100
101   while (it != end_it)
102     {
103       const_node_iterator l_it = it.get_l_child();
104
105       if (r_cmp_fn(r_key, extract_key(*(*it))))
106         it = l_it;
107       else if (r_cmp_fn(extract_key(*(*it)), r_key))
108         {
109
110           ord += (l_it == end_it)?
111             1 :
112             1 + l_it.get_metadata();
113
114           it = it.get_r_child();
115         }
116       else
117         {
118           ord += (l_it == end_it)?
119             0 :
120             l_it.get_metadata();
121
122           it = end_it;
123         }
124     }
125
126   return (ord);
127 }
128
129 PB_DS_CLASS_T_DEC
130 inline void
131 PB_DS_CLASS_C_DEC::
132 operator()(node_iterator node_it, const_node_iterator end_nd_it) const
133 {
134   node_iterator l_child_it = node_it.get_l_child();
135   const size_type l_rank =(l_child_it == end_nd_it)? 0 : l_child_it.get_metadata();
136
137   node_iterator r_child_it = node_it.get_r_child();
138   const size_type r_rank =(r_child_it == end_nd_it)? 0 : r_child_it.get_metadata();
139
140   const_cast<metadata_reference>(node_it.get_metadata())=
141     1 + l_rank + r_rank;
142 }
143
144 PB_DS_CLASS_T_DEC
145 PB_DS_CLASS_C_DEC::
146 ~tree_order_statistics_node_update()
147 { }