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
00040
00041
00042
00043
00044
00045
00046
00047 #ifndef PB_DS_TRIE_POLICY_HPP
00048 #define PB_DS_TRIE_POLICY_HPP
00049
00050 #include <string>
00051 #include <ext/pb_ds/detail/type_utils.hpp>
00052 #include <ext/pb_ds/detail/trie_policy/trie_policy_base.hpp>
00053
00054 namespace __gnu_pbds
00055 {
00056
00057 template<typename Const_Node_Iterator,
00058 typename Node_Iterator,
00059 typename E_Access_Traits,
00060 typename Allocator>
00061 struct null_trie_node_update
00062 { };
00063
00064 #define PB_DS_CLASS_T_DEC \
00065 template<typename String, typename String::value_type Min_E_Val, typename String::value_type Max_E_Val, bool Reverse, typename Allocator>
00066
00067 #define PB_DS_CLASS_C_DEC \
00068 string_trie_e_access_traits<String, Min_E_Val,Max_E_Val,Reverse,Allocator>
00069
00070
00071 template<typename String = std::string,
00072 typename String::value_type Min_E_Val = detail::__numeric_traits<typename String::value_type>::__min,
00073 typename String::value_type Max_E_Val = detail::__numeric_traits<typename String::value_type>::__max,
00074 bool Reverse = false,
00075 typename Allocator = std::allocator<char> >
00076 struct string_trie_e_access_traits
00077 {
00078 public:
00079 typedef typename Allocator::size_type size_type;
00080 typedef String key_type;
00081 typedef typename Allocator::template rebind<key_type>::other key_rebind;
00082 typedef typename key_rebind::const_reference const_key_reference;
00083
00084 enum
00085 {
00086 reverse = Reverse
00087 };
00088
00089
00090 typedef typename detail::__conditional_type<Reverse, typename String::const_reverse_iterator, typename String::const_iterator>::__type const_iterator;
00091
00092
00093 typedef typename std::iterator_traits<const_iterator>::value_type e_type;
00094
00095 enum
00096 {
00097 min_e_val = Min_E_Val,
00098 max_e_val = Max_E_Val,
00099 max_size = max_e_val - min_e_val + 1
00100 };
00101 PB_DS_STATIC_ASSERT(min_max_size, max_size >= 2);
00102
00103
00104
00105 inline static const_iterator
00106 begin(const_key_reference);
00107
00108
00109
00110 inline static const_iterator
00111 end(const_key_reference);
00112
00113
00114 inline static size_type
00115 e_pos(e_type e);
00116
00117 private:
00118
00119 inline static const_iterator
00120 begin_imp(const_key_reference, detail::false_type);
00121
00122 inline static const_iterator
00123 begin_imp(const_key_reference, detail::true_type);
00124
00125 inline static const_iterator
00126 end_imp(const_key_reference, detail::false_type);
00127
00128 inline static const_iterator
00129 end_imp(const_key_reference, detail::true_type);
00130
00131 static detail::integral_constant<int, Reverse> s_rev_ind;
00132 };
00133
00134 #include <ext/pb_ds/detail/trie_policy/string_trie_e_access_traits_imp.hpp>
00135
00136 #undef PB_DS_CLASS_T_DEC
00137 #undef PB_DS_CLASS_C_DEC
00138
00139 #define PB_DS_CLASS_T_DEC \
00140 template<typename Const_Node_Iterator,typename Node_Iterator,class E_Access_Traits, typename Allocator>
00141
00142 #define PB_DS_CLASS_C_DEC \
00143 trie_prefix_search_node_update<Const_Node_Iterator, Node_Iterator, E_Access_Traits,Allocator>
00144
00145 #define PB_DS_BASE_C_DEC \
00146 detail::trie_policy_base<Const_Node_Iterator,Node_Iterator,E_Access_Traits, Allocator>
00147
00148
00149
00150 template<typename Const_Node_Iterator,
00151 typename Node_Iterator,
00152 typename E_Access_Traits,
00153 typename Allocator>
00154 class trie_prefix_search_node_update : private PB_DS_BASE_C_DEC
00155 {
00156 private:
00157 typedef PB_DS_BASE_C_DEC base_type;
00158
00159 public:
00160 typedef typename base_type::key_type key_type;
00161 typedef typename base_type::const_key_reference const_key_reference;
00162
00163
00164 typedef E_Access_Traits e_access_traits;
00165
00166
00167 typedef typename e_access_traits::const_iterator const_e_iterator;
00168
00169
00170 typedef Allocator allocator;
00171
00172
00173 typedef typename allocator::size_type size_type;
00174 typedef detail::null_node_metadata metadata_type;
00175 typedef Const_Node_Iterator const_node_iterator;
00176 typedef Node_Iterator node_iterator;
00177 typedef typename const_node_iterator::value_type const_iterator;
00178 typedef typename node_iterator::value_type iterator;
00179
00180
00181
00182 std::pair<const_iterator, const_iterator>
00183 prefix_range(const_key_reference) const;
00184
00185
00186
00187 std::pair<iterator, iterator>
00188 prefix_range(const_key_reference);
00189
00190
00191
00192 std::pair<const_iterator, const_iterator>
00193 prefix_range(const_e_iterator, const_e_iterator) const;
00194
00195
00196
00197 std::pair<iterator, iterator>
00198 prefix_range(const_e_iterator, const_e_iterator);
00199
00200 protected:
00201
00202 inline void
00203 operator()(node_iterator node_it, const_node_iterator end_nd_it) const;
00204
00205 private:
00206
00207 virtual const_iterator
00208 end() const = 0;
00209
00210
00211 virtual iterator
00212 end() = 0;
00213
00214
00215 virtual const_node_iterator
00216 node_begin() const = 0;
00217
00218
00219 virtual node_iterator
00220 node_begin() = 0;
00221
00222
00223 virtual const_node_iterator
00224 node_end() const = 0;
00225
00226
00227 virtual node_iterator
00228 node_end() = 0;
00229
00230
00231 virtual const e_access_traits&
00232 get_e_access_traits() const = 0;
00233
00234 node_iterator
00235 next_child(node_iterator, const_e_iterator, const_e_iterator,
00236 node_iterator, const e_access_traits&);
00237 };
00238
00239 #include <ext/pb_ds/detail/trie_policy/prefix_search_node_update_imp.hpp>
00240
00241 #undef PB_DS_CLASS_C_DEC
00242
00243 #define PB_DS_CLASS_C_DEC \
00244 trie_order_statistics_node_update<Const_Node_Iterator, Node_Iterator,E_Access_Traits, Allocator>
00245
00246
00247 template<typename Const_Node_Iterator,
00248 typename Node_Iterator,
00249 typename E_Access_Traits,
00250 typename Allocator>
00251 class trie_order_statistics_node_update : private PB_DS_BASE_C_DEC
00252 {
00253 private:
00254 typedef PB_DS_BASE_C_DEC base_type;
00255
00256 public:
00257 typedef E_Access_Traits e_access_traits;
00258 typedef typename e_access_traits::const_iterator const_e_iterator;
00259 typedef Allocator allocator;
00260 typedef typename allocator::size_type size_type;
00261 typedef typename base_type::key_type key_type;
00262 typedef typename base_type::const_key_reference const_key_reference;
00263
00264 typedef size_type metadata_type;
00265 typedef Const_Node_Iterator const_node_iterator;
00266 typedef Node_Iterator node_iterator;
00267 typedef typename const_node_iterator::value_type const_iterator;
00268 typedef typename node_iterator::value_type iterator;
00269
00270
00271
00272
00273
00274 inline const_iterator
00275 find_by_order(size_type) const;
00276
00277
00278
00279
00280
00281 inline iterator
00282 find_by_order(size_type);
00283
00284
00285
00286
00287
00288
00289 inline size_type
00290 order_of_key(const_key_reference) const;
00291
00292
00293
00294
00295
00296
00297 inline size_type
00298 order_of_prefix(const_e_iterator, const_e_iterator) const;
00299
00300 private:
00301 typedef typename base_type::const_reference const_reference;
00302 typedef typename base_type::const_pointer const_pointer;
00303
00304 typedef typename Allocator::template rebind<metadata_type>::other metadata_rebind;
00305 typedef typename metadata_rebind::const_reference const_metadata_reference;
00306 typedef typename metadata_rebind::reference metadata_reference;
00307
00308
00309 virtual bool
00310 empty() const = 0;
00311
00312
00313 virtual iterator
00314 begin() = 0;
00315
00316
00317
00318 virtual iterator
00319 end() = 0;
00320
00321
00322 virtual const_node_iterator
00323 node_begin() const = 0;
00324
00325
00326 virtual node_iterator
00327 node_begin() = 0;
00328
00329
00330
00331 virtual const_node_iterator
00332 node_end() const = 0;
00333
00334
00335 virtual node_iterator
00336 node_end() = 0;
00337
00338
00339 virtual e_access_traits&
00340 get_e_access_traits() = 0;
00341
00342 protected:
00343
00344
00345 inline void
00346 operator()(node_iterator, const_node_iterator) const;
00347
00348
00349 virtual
00350 ~trie_order_statistics_node_update();
00351 };
00352
00353 #include <ext/pb_ds/detail/trie_policy/order_statistics_imp.hpp>
00354
00355 #undef PB_DS_CLASS_T_DEC
00356 #undef PB_DS_CLASS_C_DEC
00357 #undef PB_DS_BASE_C_DEC
00358
00359 }
00360
00361 #endif