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_RESULT_H_
00035 #define KEYVALUE_VALUE_RESULT_H_
00036
00037 #include <iosfwd>
00038
00039 #include <boost/variant.hpp>
00040
00041 #include "keyvalue/value/ObjectPtr.h"
00042 #include "keyvalue/value/Value.h"
00043
00044 namespace keyvalue {
00045 namespace value {
00046
00052 class Result {
00053
00054 public:
00055
00056 typedef ::boost::variant<ObjectPtr, Value> DataType_;
00057
00061 Result();
00062
00070 Result(const DataType_& data);
00071
00079 template <typename Rhs>
00080 Result(const Rhs& rhs);
00081
00091 template <typename Rhs>
00092 Result&
00093 operator=(const Rhs& rhs);
00094
00101 ObjectPtr
00102 getObjectPtr() const;
00103
00107 ObjectPtr
00108 getObjectPtr();
00109
00116 const Value*
00117 getValue() const;
00118
00122 Value*
00123 getValue();
00124
00125 private:
00126
00127 DataType_ data_;
00128
00129 };
00130
00134 ::std::ostream&
00135 operator<<(::std::ostream& os, const Result& rhs);
00136
00148 template <typename Rhs>
00149 struct Parent;
00150
00151 template <>
00152 struct Parent<Result::DataType_> {
00153 typedef Result Type_;
00154 };
00155
00156 template <>
00157 struct Parent<ObjectPtr> {
00158 typedef Result::DataType_ Type_;
00159 };
00160
00161 template <>
00162 struct Parent<Value> {
00163 typedef Result::DataType_ Type_;
00164 };
00165
00166
00167
00168
00169
00170 template <typename Rhs>
00171 Result::Result(const Rhs& rhs) :
00172 data_(Result(typename Parent<Rhs>::Type_(rhs)).data_) {
00173
00174
00175
00176
00177
00178 }
00179
00180
00181
00182
00183
00184 template <typename Rhs>
00185 Result&
00186 Result::operator=(const Rhs& rhs) {
00187
00188
00189
00190
00191
00192
00193 return *this = typename Parent<Rhs>::Type_(rhs);
00194 }
00195
00196 }
00197 }
00198
00199 #endif // KEYVALUE_VALUE_RESULT_H_