FlagMap.h
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00029 #ifndef KEYVALUE_KEY_MAP_FLAGMAP_H_
00030 #define KEYVALUE_KEY_MAP_FLAGMAP_H_
00031
00032 #include "keyvalue/extern/String.h"
00033 #include "keyvalue/key/Key.h"
00034 #include "keyvalue/sys/exception/Exception.h"
00035 #include "keyvalue/value/Variant.h"
00036
00037 namespace keyvalue {
00038 namespace key {
00039
00063 template <typename OutputType>
00064 class FlagMap {
00065
00066 public:
00067
00068 typedef OutputType OutputType_;
00069
00070 FlagMap();
00071
00083 OutputType
00084 map(const value::Variant& variant) const;
00085
00095 virtual OutputType
00096 get(const string& name) const = 0;
00097
00098 private:
00099
00105 virtual string
00106 getName() const = 0;
00107
00108 };
00109
00110
00111
00112
00113
00114 template<typename OutputType>
00115 FlagMap<OutputType>::FlagMap() {
00116 }
00117
00118
00119
00120
00121
00122 template<typename OutputType>
00123 OutputType
00124 FlagMap<OutputType>::map(const value::Variant& variant) const {
00125
00126 if (variant.is<string>(frontend::LexicalToolKit::input)) {
00127
00128 try {
00129 return get(variant.get<string>(frontend::LexicalToolKit::input));
00130 }
00131
00132 catch (frontend::LexicalToolKit::Failure&) {
00133 }
00134 }
00135
00136 throw RuntimeError() & "Invalid value '" & variant & "' for key '" &
00137 getName() & "'!";
00138 }
00139
00140 }
00141 }
00142
00143 #endif // KEYVALUE_KEY_MAP_FLAGMAP_H_