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
00048
00049
00050 #ifndef _cvc3__hash__hash_map_h_
00051 #define _cvc3__hash__hash_map_h_
00052
00053 #include "hash_fun.h"
00054 #include "hash_table.h"
00055 #include <functional>
00056 #include <utility>
00057
00058 namespace Hash {
00059
00060
00061
00062
00063 template <class _Pair>
00064 struct _Select1st : public std::unary_function<_Pair, typename _Pair::first_type> {
00065 const typename _Pair::first_type& operator()(const _Pair& __x) const {
00066 return __x.first;
00067 }
00068 };
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080 template <class _Key, class _Data, class _HashFcn = hash<_Key>,
00081 class _EqualKey = std::equal_to<_Key> >
00082 class hash_map {
00083
00084
00085 protected:
00086
00087
00088
00089
00090
00091 typedef hash_table<_Key, std::pair<const _Key, _Data>,
00092 _HashFcn, _EqualKey, _Select1st<std::pair<const _Key, _Data> > >
00093 _hash_table;
00094
00095 public:
00096
00097 typedef typename _hash_table::size_type size_type;
00098 typedef typename _hash_table::key_type key_type;
00099 typedef _Data data_type;
00100 typedef typename _hash_table::value_type value_type;
00101 typedef typename _hash_table::hasher hasher;
00102 typedef typename _hash_table::key_equal key_equal;
00103
00104 public:
00105
00106 typedef typename _hash_table::iterator iterator;
00107 typedef typename _hash_table::const_iterator const_iterator;
00108
00109
00110
00111 protected:
00112
00113 _hash_table d_table;
00114
00115
00116
00117
00118 public:
00119
00120
00121
00122 hash_map() :
00123 d_table()
00124 { };
00125
00126
00127 hash_map(size_type initial_capacity) :
00128 d_table(initial_capacity)
00129 { };
00130
00131
00132 hash_map(size_type initial_capacity, const _HashFcn& hash) :
00133 d_table(initial_capacity, hash)
00134 { };
00135
00136
00137 hash_map(size_type initial_capacity,
00138 const _HashFcn& hash, const _EqualKey& equal) :
00139 d_table(initial_capacity, hash, equal)
00140 { };
00141
00142
00143 hash_map(const hash_map& other) :
00144 d_table(other.d_table)
00145 { };
00146
00147
00148 hash_map& operator=(const hash_map& other) {
00149 if (this != &other) {
00150 d_table = other.d_table;
00151 }
00152
00153 return *this;
00154 }
00155
00156 void swap(hash_map& other) {
00157 d_table.swap(other.d_table);
00158 }
00159
00160
00161 void clear() {
00162 d_table.clear();
00163 };
00164
00165
00166
00167
00168
00169
00170
00171 iterator find(const key_type& key) {
00172 return d_table.find(key);
00173 }
00174
00175
00176 const_iterator find(const key_type& key) const {
00177 return d_table.find(key);
00178 }
00179
00180
00181
00182
00183 data_type& operator[](const key_type& key) {
00184 return d_table.find_or_insert(std::make_pair(key, data_type())).second;
00185 }
00186
00187
00188
00189
00190 std::pair<iterator, bool> insert(const value_type& entry) {
00191 return d_table.insert(entry);
00192 }
00193
00194
00195
00196
00197 size_type erase(const key_type& key) {
00198 return d_table.erase(key);
00199 }
00200
00201
00202
00203
00204
00205
00206 bool contains(const key_type& key) const {
00207 return d_table.contains(key);
00208 }
00209
00210
00211
00212 size_type count(const _Key& key) const {
00213 return d_table.count(key);
00214 }
00215
00216
00217 bool empty() const {
00218 return d_table.empty();
00219 }
00220
00221
00222 size_type size() const {
00223 return d_table.size();
00224 }
00225
00226
00227 size_type bucket_count() const {
00228 return d_table.bucket_count();
00229 }
00230
00231
00232 float load_factor() const {
00233 return d_table.load_factor();
00234 }
00235
00236
00237
00238
00239
00240
00241 iterator begin() {
00242 return d_table.begin();
00243 }
00244
00245
00246 const_iterator begin() const {
00247 return d_table.begin();
00248 }
00249
00250
00251
00252 iterator end() {
00253 return d_table.end();
00254 }
00255
00256
00257 const_iterator end() const {
00258 return d_table.end();
00259 }
00260 };
00261
00262 }
00263
00264 #endif