00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef TOOL_MAPPING_HXX_
00023 # define TOOL_MAPPING_HXX_
00024
00025 # include <utility>
00026
00027 # include "mapping.hh"
00028
00029 namespace wpl
00030 {
00031
00032 namespace tool
00033 {
00034
00035 template <class K, class V, class F>
00036 mapping<K, V, F>::mapping(const std::string& filename,
00037 const F& factory):
00038 datafile (filename),
00039 F (factory)
00040 {
00041 std::ifstream f (filename.c_str());
00042
00043 if (f)
00044 load(f);
00045 }
00046
00047 template <class K, class V, class F>
00048 const V&
00049 mapping<K, V, F>::operator [] (const K& a)
00050 {
00051 const typename map_type::const_iterator i = map_.find(a);
00052
00053 if (i == map_.end())
00054 {
00055 const std::pair<typename map_type::iterator, bool> r =
00056 map_.insert(std::make_pair(a, this->new_value(a, map_)));
00057 assert(r.second);
00058
00059 const V& v = r.first->second;
00060
00061 *this << v << '\t' << a << '\n';
00062 return v;
00063 }
00064 return i->second;
00065 }
00066
00067 template <class K, class V, class F>
00068 void
00069 mapping<K, V, F>::load(std::istream& in)
00070 {
00071 while (true)
00072 {
00073 K a;
00074 V i;
00075
00076 in >> i;
00077 if (in.eof())
00078 break;
00079 if (not in)
00080 throw std::invalid_argument ("Invalid mapping file");
00081 in >> a;
00082 if (not in or in.eof())
00083 throw std::invalid_argument ("Invalid mapping file");
00084 map_.insert(std::make_pair(a, i));
00085 this->value_loaded(a, i, map_);
00086 }
00087 }
00088
00089 }
00090
00091 }
00092
00093 #endif // ! TOOL_MAPPING_HXX_