static_table.hppGo to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef ADOBE_STATIC_TABLE_HPP
00010 #define ADOBE_STATIC_TABLE_HPP
00011
00012
00013
00014 #include <adobe/config.hpp>
00015
00016 #include <utility>
00017 #include <stdexcept>
00018
00019 #include <adobe/algorithm/lower_bound.hpp>
00020 #include <adobe/algorithm/sort.hpp>
00021
00022
00023
00024 namespace adobe {
00025
00026
00027
00028
00029
00030
00031
00119
00120
00121
00122
00187 template <typename KeyType, typename ValueType>
00188 struct static_table_traits
00189 {
00190 typedef bool result_type;
00191 typedef KeyType key_type;
00192 typedef ValueType value_type;
00193 typedef std::pair<key_type, value_type> entry_type;
00194
00195 result_type operator()(const entry_type& x, const entry_type& y) const
00196 {
00197 return (*this)(x, y.first);
00198 }
00199
00200
00201
00202 result_type operator()(const key_type& x, const entry_type& y) const
00203 {
00204 return x < y.first;
00205 }
00206
00207 result_type operator()(const entry_type& x, const key_type& y) const
00208 {
00209 return x.first < y;
00210 }
00211
00212 result_type equal(const key_type& x, const key_type& y) const
00213 {
00214 return x == y;
00215 }
00216 };
00217
00218
00219
00220 template <typename KeyType, typename ValueType, std::size_t Size, typename Traits = static_table_traits<KeyType, ValueType> >
00221 struct static_table
00222 {
00223 typedef Traits traits_type;
00224 typedef typename traits_type::key_type key_type;
00225 typedef typename traits_type::value_type value_type;
00226 typedef typename traits_type::entry_type entry_type;
00227
00228 const value_type& operator()(const key_type& key) const
00229 {
00230 const entry_type* iter(adobe::lower_bound(table_m, key, traits_type()));
00231
00232 if (iter == boost::end(table_m) || !traits_type().equal(iter->first, key))
00233 throw std::logic_error("static_table key not found");
00234
00235 return iter->second;
00236 }
00237
00238 bool operator()(const key_type& key, value_type& result) const
00239 {
00240 const entry_type* iter(adobe::lower_bound(table_m, key, traits_type()));
00241
00242 if (iter == boost::end(table_m) || !traits_type().equal(iter->first, key))
00243 return false;
00244
00245 result = iter->second;
00246
00247 return true;
00248 }
00249
00250 void sort()
00251 {
00252 adobe::sort(table_m, traits_type());
00253 }
00254
00255 public:
00256 entry_type table_m[Size];
00257 };
00258
00259
00260
00261 }
00262
00263
00264
00265 #endif // ADOBE_STATIC_TABLE_HPP
00266
00267
|