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/extern/SharedPtr.h"
00042 #include "keyvalue/value/Value.h"
00043
00044 namespace keyvalue {
00045 namespace value {
00046
00059 typedef shared_ptr<void> ObjectPtr;
00060
00066 class Result {
00067
00068 public:
00069
00070 typedef boost::variant<ObjectPtr, Value> DataType_;
00071
00075 Result();
00076
00084 Result(const DataType_& data);
00085
00093 template<typename Rhs>
00094 Result(const Rhs& rhs);
00095
00105 template<typename Rhs>
00106 Result&
00107 operator=(const Rhs& rhs);
00108
00115 ObjectPtr
00116 getObjectPtr() const;
00117
00121 ObjectPtr
00122 getObjectPtr();
00123
00130 const Value*
00131 getValue() const;
00132
00136 Value*
00137 getValue();
00138
00139 private:
00140
00141 DataType_ data_;
00142
00143 };
00144
00148 std::ostream&
00149 operator<<(std::ostream& os, const Result& rhs);
00150
00164 template<typename Rhs>
00165 struct Parent;
00166
00167 template<>
00168 struct Parent<Result::DataType_> {
00169 typedef Result Type_;
00170 };
00171
00172 template<>
00173 struct Parent<ObjectPtr> {
00174 typedef Result::DataType_ Type_;
00175 };
00176
00177 template<typename T>
00178 struct Parent<shared_ptr<T> > {
00179 typedef ObjectPtr Type_;
00180 };
00181
00182 template<typename T>
00183 struct Parent<T*> {
00184 typedef shared_ptr<T> Type_;
00185 };
00186
00187 template<>
00188 struct Parent<Value> {
00189 typedef Result::DataType_ Type_;
00190 };
00191
00192
00193
00194
00195
00196 template<typename Rhs>
00197 Result::Result(const Rhs& rhs) :
00198 data_(Result(typename Parent<Rhs>::Type_(rhs)).data_) {
00203 }
00204
00205
00206
00207
00208
00209 template<typename Rhs>
00210 Result&
00211 Result::operator=(const Rhs& rhs) {
00216 return *this = typename Parent<Rhs>::Type_(rhs);
00217 }
00218
00219 }
00220 }
00221
00222 #endif // KEYVALUE_VALUE_RESULT_H_