1169691Skan// -*- C++ -*-
2169691Skan
3169691Skan// Copyright (C) 2005, 2006 Free Software Foundation, Inc.
4169691Skan//
5169691Skan// This file is part of the GNU ISO C++ Library.  This library is free
6169691Skan// software; you can redistribute it and/or modify it under the terms
7169691Skan// of the GNU General Public License as published by the Free Software
8169691Skan// Foundation; either version 2, or (at your option) any later
9169691Skan// version.
10169691Skan
11169691Skan// This library is distributed in the hope that it will be useful, but
12169691Skan// WITHOUT ANY WARRANTY; without even the implied warranty of
13169691Skan// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14169691Skan// General Public License for more details.
15169691Skan
16169691Skan// You should have received a copy of the GNU General Public License
17169691Skan// along with this library; see the file COPYING.  If not, write to
18169691Skan// the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
19169691Skan// MA 02111-1307, USA.
20169691Skan
21169691Skan// As a special exception, you may use this file as part of a free
22169691Skan// software library without restriction.  Specifically, if other files
23169691Skan// instantiate templates or use macros or inline functions from this
24169691Skan// file, or you compile this file and link it with other files to
25169691Skan// produce an executable, this file does not by itself cause the
26169691Skan// resulting executable to be covered by the GNU General Public
27169691Skan// License.  This exception does not however invalidate any other
28169691Skan// reasons why the executable file might be covered by the GNU General
29169691Skan// Public License.
30169691Skan
31169691Skan// Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL.
32169691Skan
33169691Skan// Permission to use, copy, modify, sell, and distribute this software
34169691Skan// is hereby granted without fee, provided that the above copyright
35169691Skan// notice appears in all copies, and that both that copyright notice
36169691Skan// and this permission notice appear in supporting documentation. None
37169691Skan// of the above authors, nor IBM Haifa Research Laboratories, make any
38169691Skan// representation about the suitability of this software for any
39169691Skan// purpose. It is provided "as is" without express or implied
40169691Skan// warranty.
41169691Skan
42169691Skan/**
43169691Skan * @file rb_tree_.hpp
44169691Skan * Contains an implementation for rb_tree_.
45169691Skan */
46169691Skan/*
47169691Skan * This implementation uses an idea from the SGI STL (using a "header" node
48169691Skan *    which is needed for efficient iteration).
49169691Skan */
50169691Skan
51169691Skan#ifdef PB_DS_DATA_TRUE_INDICATOR
52169691Skan#ifndef PB_DS_BIN_SEARCH_TREE_HPP__DATA_TRUE_INDICATOR
53169691Skan#define PB_DS_BIN_SEARCH_TREE_HPP__DATA_TRUE_INDICATOR
54169691Skan#include <ext/pb_ds/detail/bin_search_tree_/bin_search_tree_.hpp>
55169691Skan#endif
56169691Skan#endif
57169691Skan
58169691Skan#ifdef PB_DS_DATA_FALSE_INDICATOR
59169691Skan#ifndef PB_DS_BIN_SEARCH_TREE_HPP__DATA_FALSE_INDICATOR
60169691Skan#define PB_DS_BIN_SEARCH_TREE_HPP__DATA_FALSE_INDICATOR
61169691Skan#include <ext/pb_ds/detail/bin_search_tree_/bin_search_tree_.hpp>
62169691Skan#endif
63169691Skan#endif
64169691Skan
65169691Skan#include <ext/pb_ds/detail/standard_policies.hpp>
66169691Skan#include <ext/pb_ds/detail/basic_types.hpp>
67169691Skan#include <utility>
68169691Skan#include <vector>
69169691Skan#include <assert.h>
70169691Skan#include <debug/debug.h>
71169691Skan
72169691Skannamespace pb_ds
73169691Skan{
74169691Skan  namespace detail
75169691Skan  {
76169691Skan#define PB_DS_CLASS_T_DEC \
77169691Skan    template<typename Key, typename Mapped, typename Cmp_Fn, \
78169691Skan	     typename Node_And_It_Traits, typename Allocator>
79169691Skan
80169691Skan#ifdef PB_DS_DATA_TRUE_INDICATOR
81169691Skan#define PB_DS_CLASS_NAME rb_tree_data_
82169691Skan#endif
83169691Skan
84169691Skan#ifdef PB_DS_DATA_TRUE_INDICATOR
85169691Skan#define PB_DS_BASE_CLASS_NAME bin_search_tree_data_
86169691Skan#endif
87169691Skan
88169691Skan#ifdef PB_DS_DATA_FALSE_INDICATOR
89169691Skan#define PB_DS_CLASS_NAME rb_tree_no_data_
90169691Skan#endif
91169691Skan
92169691Skan#ifdef PB_DS_DATA_FALSE_INDICATOR
93169691Skan#define PB_DS_BASE_CLASS_NAME bin_search_tree_no_data_
94169691Skan#endif
95169691Skan
96169691Skan#define PB_DS_CLASS_C_DEC \
97169691Skan    PB_DS_CLASS_NAME<Key, Mapped, Cmp_Fn, Node_And_It_Traits, Allocator>
98169691Skan
99169691Skan#define PB_DS_BASE_C_DEC \
100169691Skan    PB_DS_BASE_CLASS_NAME<Key, Mapped, Cmp_Fn, Node_And_It_Traits, Allocator>
101169691Skan
102169691Skan#ifdef PB_DS_DATA_TRUE_INDICATOR
103169691Skan#define PB_DS_V2F(X) (X).first
104169691Skan#define PB_DS_V2S(X) (X).second
105169691Skan#define PB_DS_EP2VP(X)& ((X)->m_value)
106169691Skan#endif
107169691Skan
108169691Skan#ifdef PB_DS_DATA_FALSE_INDICATOR
109169691Skan#define PB_DS_V2F(X) (X)
110169691Skan#define PB_DS_V2S(X) Mapped_Data()
111169691Skan#define PB_DS_EP2VP(X)& ((X)->m_value.first)
112169691Skan#endif
113169691Skan
114169691Skan    template<typename Key,
115169691Skan	     typename Mapped,
116169691Skan	     typename Cmp_Fn,
117169691Skan	     typename Node_And_It_Traits,
118169691Skan	     typename Allocator>
119169691Skan    class PB_DS_CLASS_NAME : public PB_DS_BASE_C_DEC
120169691Skan    {
121169691Skan    private:
122169691Skan      typedef PB_DS_BASE_C_DEC base_type;
123169691Skan      typedef typename base_type::node_pointer node_pointer;
124169691Skan
125169691Skan    public:
126169691Skan      typedef Cmp_Fn cmp_fn;
127169691Skan      typedef Allocator allocator;
128169691Skan      typedef typename Allocator::size_type size_type;
129169691Skan      typedef typename Allocator::difference_type difference_type;
130169691Skan      typedef typename base_type::key_type key_type;
131169691Skan      typedef typename base_type::key_pointer key_pointer;
132169691Skan      typedef typename base_type::const_key_pointer const_key_pointer;
133169691Skan      typedef typename base_type::key_reference key_reference;
134169691Skan      typedef typename base_type::const_key_reference const_key_reference;
135169691Skan      typedef typename base_type::mapped_type mapped_type;
136169691Skan      typedef typename base_type::mapped_pointer mapped_pointer;
137169691Skan      typedef typename base_type::const_mapped_pointer const_mapped_pointer;
138169691Skan      typedef typename base_type::mapped_reference mapped_reference;
139169691Skan      typedef typename base_type::const_mapped_reference const_mapped_reference;
140169691Skan      typedef typename base_type::value_type value_type;
141169691Skan      typedef typename base_type::pointer pointer;
142169691Skan      typedef typename base_type::const_pointer const_pointer;
143169691Skan      typedef typename base_type::reference reference;
144169691Skan      typedef typename base_type::const_reference const_reference;
145169691Skan      typedef typename base_type::point_iterator point_iterator;
146169691Skan      typedef typename base_type::const_iterator const_point_iterator;
147169691Skan      typedef typename base_type::iterator iterator;
148169691Skan      typedef typename base_type::const_iterator const_iterator;
149169691Skan      typedef typename base_type::reverse_iterator reverse_iterator;
150169691Skan      typedef typename base_type::const_reverse_iterator const_reverse_iterator;
151169691Skan      typedef typename base_type::node_update node_update;
152169691Skan
153169691Skan
154169691Skan      PB_DS_CLASS_NAME();
155169691Skan
156169691Skan      PB_DS_CLASS_NAME(const Cmp_Fn&);
157169691Skan
158169691Skan      PB_DS_CLASS_NAME(const Cmp_Fn&, const node_update&);
159169691Skan
160169691Skan      PB_DS_CLASS_NAME(const PB_DS_CLASS_C_DEC&);
161169691Skan
162169691Skan      void
163169691Skan      swap(PB_DS_CLASS_C_DEC&);
164169691Skan
165169691Skan      template<typename It>
166169691Skan      void
167169691Skan      copy_from_range(It, It);
168169691Skan
169169691Skan      inline std::pair<point_iterator, bool>
170169691Skan      insert(const_reference);
171169691Skan
172169691Skan      inline mapped_reference
173169691Skan      operator[](const_key_reference r_key)
174169691Skan      {
175169691Skan#ifdef PB_DS_DATA_TRUE_INDICATOR
176169691Skan	_GLIBCXX_DEBUG_ONLY(assert_valid();)
177169691Skan	std::pair<point_iterator, bool> ins_pair =
178169691Skan	base_type::insert_leaf(value_type(r_key, mapped_type()));
179169691Skan
180169691Skan	if (ins_pair.second == true)
181169691Skan	  {
182169691Skan	    ins_pair.first.m_p_nd->m_red = true;
183169691Skan	    _GLIBCXX_DEBUG_ONLY(this->structure_only_assert_valid();)
184169691Skan	    insert_fixup(ins_pair.first.m_p_nd);
185169691Skan	  }
186169691Skan	_GLIBCXX_DEBUG_ONLY(assert_valid();)
187169691Skan	return ins_pair.first.m_p_nd->m_value.second;
188169691Skan#else
189169691Skan	insert(r_key);
190169691Skan	return base_type::s_null_mapped;
191169691Skan#endif
192169691Skan      }
193169691Skan
194169691Skan      inline bool
195169691Skan      erase(const_key_reference);
196169691Skan
197169691Skan      inline iterator
198169691Skan      erase(iterator);
199169691Skan
200169691Skan      inline reverse_iterator
201169691Skan      erase(reverse_iterator);
202169691Skan
203169691Skan      template<typename Pred>
204169691Skan      inline size_type
205169691Skan      erase_if(Pred);
206169691Skan
207169691Skan      void
208169691Skan      join(PB_DS_CLASS_C_DEC&);
209169691Skan
210169691Skan      void
211169691Skan      split(const_key_reference, PB_DS_CLASS_C_DEC&);
212169691Skan
213169691Skan    protected:
214169691Skan
215169691Skan    private:
216169691Skan
217169691Skan#ifdef _GLIBCXX_DEBUG
218169691Skan      void
219169691Skan      assert_valid() const;
220169691Skan
221169691Skan      size_type
222169691Skan      assert_node_consistent(const node_pointer) const;
223169691Skan#endif
224169691Skan
225169691Skan      inline static bool
226169691Skan      is_effectively_black(const node_pointer);
227169691Skan
228169691Skan      void
229169691Skan      initialize();
230169691Skan
231169691Skan      void
232169691Skan      insert_fixup(node_pointer);
233169691Skan
234169691Skan      void
235169691Skan      erase_node(node_pointer);
236169691Skan
237169691Skan      void
238169691Skan      remove_node(node_pointer);
239169691Skan
240169691Skan      void
241169691Skan      remove_fixup(node_pointer, node_pointer);
242169691Skan
243169691Skan      void
244169691Skan      split_imp(node_pointer, PB_DS_CLASS_C_DEC&);
245169691Skan
246169691Skan      inline node_pointer
247169691Skan      split_min();
248169691Skan
249169691Skan      std::pair<node_pointer, node_pointer>
250169691Skan      split_min_imp();
251169691Skan
252169691Skan      void
253169691Skan      join_imp(node_pointer, node_pointer);
254169691Skan
255169691Skan      std::pair<node_pointer, node_pointer>
256169691Skan      find_join_pos_right(node_pointer, size_type, size_type);
257169691Skan
258169691Skan      std::pair<node_pointer, node_pointer>
259169691Skan      find_join_pos_left(node_pointer, size_type, size_type);
260169691Skan
261169691Skan      inline size_type
262169691Skan      black_height(node_pointer);
263169691Skan
264169691Skan      void
265169691Skan      split_at_node(node_pointer, PB_DS_CLASS_C_DEC&);
266169691Skan    };
267169691Skan
268169691Skan#include <ext/pb_ds/detail/rb_tree_map_/constructors_destructor_fn_imps.hpp>
269169691Skan#include <ext/pb_ds/detail/rb_tree_map_/insert_fn_imps.hpp>
270169691Skan#include <ext/pb_ds/detail/rb_tree_map_/erase_fn_imps.hpp>
271169691Skan#include <ext/pb_ds/detail/rb_tree_map_/debug_fn_imps.hpp>
272169691Skan#include <ext/pb_ds/detail/rb_tree_map_/split_join_fn_imps.hpp>
273169691Skan#include <ext/pb_ds/detail/rb_tree_map_/info_fn_imps.hpp>
274169691Skan
275169691Skan#undef PB_DS_CLASS_T_DEC
276169691Skan#undef PB_DS_CLASS_C_DEC
277169691Skan#undef PB_DS_CLASS_NAME
278169691Skan#undef PB_DS_BASE_CLASS_NAME
279169691Skan#undef PB_DS_BASE_C_DEC
280169691Skan#undef PB_DS_V2F
281169691Skan#undef PB_DS_EP2VP
282169691Skan#undef PB_DS_V2S
283169691Skan
284169691Skan  } // namespace detail
285169691Skan} // namespace pb_ds
286169691Skan
287