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
00022
00023
00024
00025
00026
00027
00034 #ifndef KEYVALUE_VALUE_VALUE_H_
00035 #define KEYVALUE_VALUE_VALUE_H_
00036
00037 #include <iosfwd>
00038
00039 #include <boost/variant.hpp>
00040
00041 #include "keyvalue/value/Matrix.h"
00042 #include "keyvalue/value/Single.h"
00043 #include "keyvalue/value/Vector.h"
00044
00045 namespace keyvalue {
00046
00050 namespace value {
00051
00057 class Value {
00058
00059 public:
00060
00061 typedef boost::variant<Single, Vector, Matrix> DataType_;
00062
00067 Value();
00068
00076 Value(const DataType_& data);
00077
00085 template <typename Rhs>
00086 Value(const Rhs& rhs);
00087
00097 template <typename Rhs>
00098 Value&
00099 operator=(const Rhs& rhs);
00100
00104 bool
00105 operator==(const Value& rhs) const;
00106
00115 template <typename Type>
00116 const Type*
00117 get() const;
00118
00122 template <typename Type>
00123 Type*
00124 get();
00125
00126 private:
00127
00128 DataType_ data_;
00129
00130 };
00131
00137 std::ostream&
00138 operator<<(std::ostream& os, const Value& rhs);
00139
00152 template <typename Rhs>
00153 struct Parent;
00154
00155 template <>
00156 struct Parent<Value::DataType_> {
00157 typedef Value Type_;
00158 };
00159
00160 template <>
00161 struct Parent<Single> {
00162 typedef Value::DataType_ Type_;
00163 };
00164
00165 template <>
00166 struct Parent<Vector> {
00167 typedef Value::DataType_ Type_;
00168 };
00169
00170 template <>
00171 struct Parent<Matrix> {
00172 typedef Value::DataType_ Type_;
00173 };
00174
00175
00176
00177
00178
00179 template <typename Rhs>
00180 Value::Value(const Rhs& rhs) :
00181 data_(Value(typename Parent<Rhs>::Type_(rhs)).data_) {
00186 }
00187
00188
00189
00190
00191
00192 template <typename Rhs>
00193 Value&
00194 Value::operator=(const Rhs& rhs) {
00199 return *this = typename Parent<Rhs>::Type_(rhs);
00200 }
00201
00202 }
00203 }
00204
00205 #endif // KEYVALUE_VALUE_VALUE_H_