Install gcc-4.4.0-tdm-1-core-2.tar.gz
[msysgit.git] / mingw / lib / gcc / mingw32 / 4.3.3 / include / c++ / ext / pb_ds / detail / tree_policy / order_statistics_imp.hpp
blob85f4d166a56a0c6116a6f13b3b21cd03b72c4701
1 // -*- C++ -*-
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.
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.
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.
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.
31 // Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL.
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.
42 /**
43 * @file order_statistics_imp.hpp
44 * Contains forward declarations for order_statistics_key
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)
52 node_iterator it = node_begin();
54 node_iterator end_it = node_end();
56 while (it != end_it)
58 node_iterator l_it = it.get_l_child();
60 const size_type o = (l_it == end_it)?
61 0 :
62 l_it.get_metadata();
64 if (order == o)
65 return (*it);
66 else if (order < o)
67 it = l_it;
68 else
70 order -= o + 1;
72 it = it.get_r_child();
76 return (PB_DS_BASE_C_DEC::end_iterator());
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
84 return (const_cast<PB_DS_CLASS_C_DEC* >(this)->find_by_order(order));
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
92 const_node_iterator it = node_begin();
94 const_node_iterator end_it = node_end();
96 const cmp_fn& r_cmp_fn =
97 const_cast<PB_DS_CLASS_C_DEC* >(this)->get_cmp_fn();
99 size_type ord = 0;
101 while (it != end_it)
103 const_node_iterator l_it = it.get_l_child();
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))
110 ord += (l_it == end_it)?
112 1 + l_it.get_metadata();
114 it = it.get_r_child();
116 else
118 ord += (l_it == end_it)?
120 l_it.get_metadata();
122 it = end_it;
126 return (ord);
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
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();
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();
140 const_cast<metadata_reference>(node_it.get_metadata())=
141 1 + l_rank + r_rank;
144 PB_DS_CLASS_T_DEC
145 PB_DS_CLASS_C_DEC::
146 ~tree_order_statistics_node_update()