Value.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
00028 #ifndef KEYVALUE_VALUE_VALUE_H_
00029 #define KEYVALUE_VALUE_VALUE_H_
00030
00031 #include <iosfwd>
00032
00033 #include <boost/variant.hpp>
00034
00035 #include "keyvalue/value/Matrix.h"
00036 #include "keyvalue/value/Single.h"
00037 #include "keyvalue/value/Vector.h"
00038
00039 namespace keyvalue {
00040
00044 namespace value {
00045
00051 class Value {
00052
00053 public:
00054
00055 typedef boost::variant<Single, Vector, Matrix> DataType_;
00056
00061 Value();
00062
00070 Value(const DataType_& data);
00071
00079 template <typename Rhs>
00080 Value(const Rhs& rhs);
00081
00091 template <typename Rhs>
00092 Value&
00093 operator=(const Rhs& rhs);
00094
00098 bool
00099 operator==(const Value& rhs) const;
00100
00109 template <typename Type>
00110 const Type*
00111 get() const;
00112
00116 template <typename Type>
00117 Type*
00118 get();
00119
00120 private:
00121
00122 DataType_ data_;
00123
00124 };
00125
00131 std::ostream&
00132 operator<<(std::ostream& os, const Value& rhs);
00133
00146 template <typename Rhs>
00147 struct Parent;
00148
00149 template <>
00150 struct Parent<Value::DataType_> {
00151 typedef Value Type_;
00152 };
00153
00154 template <>
00155 struct Parent<Single> {
00156 typedef Value::DataType_ Type_;
00157 };
00158
00159 template <>
00160 struct Parent<Vector> {
00161 typedef Value::DataType_ Type_;
00162 };
00163
00164 template <>
00165 struct Parent<Matrix> {
00166 typedef Value::DataType_ Type_;
00167 };
00168
00169
00170
00171
00172
00173 template <typename Rhs>
00174 Value::Value(const Rhs& rhs) :
00175 data_(Value(typename Parent<Rhs>::Type_(rhs)).data_) {
00180 }
00181
00182
00183
00184
00185
00186 template <typename Rhs>
00187 Value&
00188 Value::operator=(const Rhs& rhs) {
00193 return *this = typename Parent<Rhs>::Type_(rhs);
00194 }
00195
00196 }
00197 }
00198
00199 #endif // KEYVALUE_VALUE_VALUE_H_