00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00045 #ifdef PB_ASSOC_DATA_TRUE_INDICATOR
00046 #ifndef BIN_SEARCH_TREE_HPP__DATA_TRUE_INDICATOR
00047 #define BIN_SEARCH_TREE_HPP__DATA_TRUE_INDICATOR
00048 #include <ext/pb_assoc/detail/bin_search_tree_/bin_search_tree_.hpp>
00049 #endif // #ifndef BIN_SEARCH_TREE_HPP__DATA_TRUE_INDICATOR
00050 #endif // #ifdef PB_ASSOC_DATA_TRUE_INDICATOR
00051
00052 #ifdef PB_ASSOC_DATA_FALSE_INDICATOR
00053 #ifndef BIN_SEARCH_TREE_HPP__DATA_FALSE_INDICATOR
00054 #define BIN_SEARCH_TREE_HPP__DATA_FALSE_INDICATOR
00055 #include <ext/pb_assoc/detail/bin_search_tree_/bin_search_tree_.hpp>
00056 #endif // #ifndef BIN_SEARCH_TREE_HPP__DATA_FALSE_INDICATOR
00057 #endif // #ifdef PB_ASSOC_DATA_FALSE_INDICATOR
00058
00059 #include <ext/pb_assoc/detail/splay_tree_/node.hpp>
00060 #include <utility>
00061 #include <vector>
00062 #include <assert.h>
00063
00064 namespace pb_assoc
00065 {
00066
00067 namespace detail
00068 {
00069
00070 #ifdef PB_ASSOC_SPLAY_TREE_DEBUG_
00071 #define PB_ASSOC_DBG_ASSERT(X) assert(X)
00072 #define PB_ASSOC_DBG_VERIFY(X) assert(X)
00073 #define PB_ASSOC_DBG_ONLY(X) X
00074 #else // #ifdef PB_ASSOC_SPLAY_TREE_DEBUG_
00075 #define PB_ASSOC_DBG_ASSERT(X)
00076 #define PB_ASSOC_DBG_VERIFY(X) {if((X)==0);}
00077 #define PB_ASSOC_DBG_ONLY(X) ;
00078 #endif // #ifdef PB_ASSOC_SPLAY_TREE_DEBUG_
00079
00080 #define PB_ASSOC_CLASS_T_DEC \
00081 template< \
00082 typename Key, \
00083 typename Data, \
00084 class Cmp_Fn, \
00085 class Allocator, \
00086 class Node_Updator>
00087
00088 #ifdef PB_ASSOC_DATA_TRUE_INDICATOR
00089 #define PB_ASSOC_CLASS_NAME \
00090 splay_tree_data_
00091 #endif // #ifdef PB_ASSOC_DATA_TRUE_INDICATOR
00092
00093 #ifdef PB_ASSOC_DATA_FALSE_INDICATOR
00094 #define PB_ASSOC_CLASS_NAME \
00095 splay_tree_no_data_
00096 #endif // #ifdef PB_ASSOC_DATA_FALSE_INDICATOR
00097
00098 #ifdef PB_ASSOC_DATA_TRUE_INDICATOR
00099 #define PB_ASSOC_BASE_CLASS_NAME \
00100 bin_search_tree_data_
00101 #endif // #ifdef PB_ASSOC_DATA_TRUE_INDICATOR
00102
00103 #ifdef PB_ASSOC_DATA_FALSE_INDICATOR
00104 #define PB_ASSOC_BASE_CLASS_NAME \
00105 bin_search_tree_no_data_
00106 #endif // #ifdef PB_ASSOC_DATA_FALSE_INDICATOR
00107
00108 #define PB_ASSOC_CLASS_C_DEC \
00109 PB_ASSOC_CLASS_NAME< \
00110 Key, \
00111 Data, \
00112 Cmp_Fn, \
00113 Allocator, \
00114 Node_Updator>
00115
00116 #define PB_ASSOC_TYPES_TRAITS_C_DEC \
00117 types_traits< \
00118 Key, \
00119 Data, \
00120 Allocator>
00121
00122 #define PB_ASSOC_NODE_C_DEC \
00123 splay_tree_node_< \
00124 typename PB_ASSOC_TYPES_TRAITS_C_DEC::value_type, \
00125 Allocator>
00126
00127 #define PB_ASSOC_BASE_C_DEC \
00128 PB_ASSOC_BASE_CLASS_NAME< \
00129 Key, \
00130 Data, \
00131 PB_ASSOC_NODE_C_DEC, \
00132 Cmp_Fn, \
00133 Allocator, \
00134 Node_Updator>
00135
00136 template<typename Key,
00137 typename Data,
00138 class Cmp_Fn,
00139 class Allocator,
00140 class Node_Updator>
00141 struct PB_ASSOC_CLASS_NAME : public PB_ASSOC_BASE_C_DEC
00142 {
00143
00144 protected:
00145
00146 typedef typename Allocator::size_type size_type;
00147
00148 typedef
00149 typename PB_ASSOC_TYPES_TRAITS_C_DEC::const_key_reference
00150 const_key_reference;
00151
00152 typedef typename PB_ASSOC_TYPES_TRAITS_C_DEC::data_type data_type;
00153
00154 typedef
00155 typename PB_ASSOC_TYPES_TRAITS_C_DEC::data_reference
00156 data_reference;
00157
00158 typedef
00159 typename PB_ASSOC_TYPES_TRAITS_C_DEC::const_data_reference
00160 const_data_reference;
00161
00162 typedef typename PB_ASSOC_TYPES_TRAITS_C_DEC::value_type value_type;
00163
00164 typedef typename PB_ASSOC_TYPES_TRAITS_C_DEC::pointer pointer;
00165
00166 typedef
00167 typename PB_ASSOC_TYPES_TRAITS_C_DEC::const_pointer
00168 const_pointer;
00169
00170 typedef typename PB_ASSOC_TYPES_TRAITS_C_DEC::reference reference;
00171
00172 typedef
00173 typename PB_ASSOC_TYPES_TRAITS_C_DEC::const_reference
00174 const_reference;
00175
00176 typedef typename PB_ASSOC_BASE_C_DEC::node_pointer node_pointer;
00177
00178 typedef typename PB_ASSOC_BASE_C_DEC::find_iterator find_iterator;
00179
00180 typedef
00181 typename PB_ASSOC_BASE_C_DEC::const_iterator
00182 const_find_iterator;
00183
00184 typedef typename PB_ASSOC_BASE_C_DEC::iterator iterator;
00185
00186 typedef typename PB_ASSOC_BASE_C_DEC::const_iterator const_iterator;
00187
00188 typedef
00189 typename PB_ASSOC_BASE_C_DEC::reverse_iterator
00190 reverse_iterator;
00191
00192 typedef
00193 typename PB_ASSOC_BASE_C_DEC::const_reverse_iterator
00194 const_reverse_iterator;
00195
00196 protected:
00197
00198 PB_ASSOC_CLASS_NAME();
00199
00200 PB_ASSOC_CLASS_NAME(const Cmp_Fn& r_cmp_fn);
00201
00202 PB_ASSOC_CLASS_NAME(const Cmp_Fn& r_cmp_fn, const Node_Updator& r_node_updator);
00203
00204 PB_ASSOC_CLASS_NAME(const PB_ASSOC_CLASS_C_DEC& r_other);
00205
00206 void
00207 swap(PB_ASSOC_CLASS_C_DEC& r_other);
00208
00209 template<class It>
00210 void
00211 copy_from_range(It first_it, It last_it);
00212
00213 void
00214 initialize();
00215
00216 inline std::pair<find_iterator, bool>
00217 insert(const_reference r_value);
00218
00219 #ifdef PB_ASSOC_DATA_TRUE_INDICATOR
00220 inline data_reference
00221 subscript_imp(const_key_reference r_key);
00222 #endif // #ifdef PB_ASSOC_DATA_TRUE
00223
00224 inline find_iterator
00225 lower_bound(const_key_reference r_key);
00226
00227 inline const_find_iterator
00228 lower_bound(const_key_reference r_key) const;
00229
00230 inline find_iterator
00231 upper_bound(const_key_reference r_key);
00232
00233 inline const_find_iterator
00234 upper_bound(const_key_reference r_key) const;
00235
00236 inline find_iterator
00237 find(const_key_reference r_key);
00238
00239 inline const_find_iterator
00240 find(const_key_reference r_key) const;
00241
00242 inline size_type
00243 erase(const_key_reference r_key);
00244
00245 inline const_iterator
00246 erase(const_iterator it);
00247
00248 #ifdef PB_ASSOC_DATA_TRUE_INDICATOR
00249 inline iterator
00250 erase(iterator it);
00251 #endif // #ifdef PB_ASSOC_DATA_TRUE_INDICATOR
00252
00253 inline const_reverse_iterator
00254 erase(const_reverse_iterator it);
00255
00256 #ifdef PB_ASSOC_DATA_TRUE_INDICATOR
00257 inline reverse_iterator
00258 erase(reverse_iterator it);
00259 #endif // #ifdef PB_ASSOC_DATA_TRUE_INDICATOR
00260
00261 template<class Pred>
00262 inline size_type
00263 erase_if(Pred pred);
00264
00265 inline node_pointer
00266 leftmost(node_pointer p_nd);
00267
00268 void
00269 join(PB_ASSOC_CLASS_C_DEC& r_other);
00270
00271 void
00272 split(const_key_reference r_key, PB_ASSOC_CLASS_C_DEC& r_other);
00273
00274 #ifdef PB_ASSOC_SPLAY_TREE_DEBUG_
00275
00276 virtual void
00277 assert_valid() const;
00278
00279 void
00280 assert_special_imp(const node_pointer p_nd) const;
00281
00282 #endif // #ifdef PB_ASSOC_SPLAY_TREE_DEBUG_
00283
00284 private:
00285
00286 void
00287 splay(node_pointer p_nd);
00288
00289 inline void
00290 splay_zig_zag_left(node_pointer p_nd, node_pointer p_parent, node_pointer p_grandparent);
00291
00292 inline void
00293 splay_zig_zag_right(node_pointer p_nd, node_pointer p_parent, node_pointer p_grandparent);
00294
00295 inline void
00296 splay_zig_zig_left(node_pointer p_nd, node_pointer p_parent, node_pointer p_grandparent);
00297
00298 inline void
00299 splay_zig_zig_right(node_pointer p_nd, node_pointer p_parent, node_pointer p_grandparent);
00300
00301 inline void
00302 splay_zz_start(node_pointer p_nd, node_pointer p_parent, node_pointer p_grandparent);
00303
00304 inline void
00305 splay_zz_end(node_pointer p_nd, node_pointer p_parent, node_pointer p_grandparent);
00306
00307 void
00308 erase_node(node_pointer p_nd);
00309
00310 };
00311
00312 #include <ext/pb_assoc/detail/splay_tree_/constructors_destructor_fn_imps.hpp>
00313 #include <ext/pb_assoc/detail/splay_tree_/info_fn_imps.hpp>
00314 #include <ext/pb_assoc/detail/splay_tree_/insert_fn_imps.hpp>
00315 #include <ext/pb_assoc/detail/splay_tree_/splay_fn_imps.hpp>
00316 #include <ext/pb_assoc/detail/splay_tree_/erase_fn_imps.hpp>
00317 #include <ext/pb_assoc/detail/splay_tree_/find_fn_imps.hpp>
00318 #include <ext/pb_assoc/detail/splay_tree_/debug_fn_imps.hpp>
00319 #include <ext/pb_assoc/detail/splay_tree_/split_join_fn_imps.hpp>
00320
00321 #undef PB_ASSOC_CLASS_T_DEC
00322
00323 #undef PB_ASSOC_CLASS_C_DEC
00324
00325 #undef PB_ASSOC_CLASS_NAME
00326
00327 #undef PB_ASSOC_TYPES_TRAITS_C_DEC
00328
00329 #undef PB_ASSOC_BASE_CLASS_NAME
00330
00331 #undef PB_ASSOC_NODE_C_DEC
00332
00333 #undef PB_ASSOC_BASE_C_DEC
00334
00335 #undef PB_ASSOC_DBG_ASSERT
00336 #undef PB_ASSOC_DBG_VERIFY
00337 #undef PB_ASSOC_DBG_ONLY
00338
00339 }
00340
00341 }
00342