RTBKit
0.9
Open-source framework to create real-time ad bidding systems.
|
00001 /* basic_value_descriptions.h -*- C++ -*- 00002 Jeremy Barnes, 20 March 2013 00003 Copyright (c) 2013 Datacratic Inc. All rights reserved. 00004 00005 */ 00006 00007 #pragma once 00008 00009 #include "value_description.h" 00010 #include "soa/types/url.h" 00011 #include "soa/types/date.h" 00012 00013 00014 namespace Datacratic { 00015 00016 /*****************************************************************************/ 00017 /* DEFAULT DESCRIPTIONS FOR BASIC TYPES */ 00018 /*****************************************************************************/ 00019 00020 template<> 00021 struct DefaultDescription<Datacratic::Id> 00022 : public ValueDescriptionI<Datacratic::Id, ValueKind::ATOM> { 00023 00024 virtual void parseJsonTyped(Datacratic::Id * val, 00025 JsonParsingContext & context) const 00026 { 00027 Datacratic::parseJson(val, context); 00028 } 00029 00030 virtual void printJsonTyped(const Datacratic::Id * val, 00031 JsonPrintingContext & context) const 00032 { 00033 context.writeString(val->toString()); 00034 } 00035 00036 virtual bool isDefaultTyped(const Datacratic::Id * val) const 00037 { 00038 return !val->notNull(); 00039 } 00040 }; 00041 00042 template<> 00043 struct DefaultDescription<std::string> 00044 : public ValueDescriptionI<std::string, ValueKind::STRING> { 00045 00046 virtual void parseJsonTyped(std::string * val, 00047 JsonParsingContext & context) const 00048 { 00049 *val = context.expectStringAscii(); 00050 } 00051 00052 virtual void printJsonTyped(const std::string * val, 00053 JsonPrintingContext & context) const 00054 { 00055 context.writeString(*val); 00056 } 00057 00058 virtual bool isDefaultTyped(const std::string * val) const 00059 { 00060 return val->empty(); 00061 } 00062 }; 00063 00064 template<> 00065 struct DefaultDescription<Utf8String> 00066 : public ValueDescriptionI<Utf8String, ValueKind::STRING> { 00067 00068 virtual void parseJsonTyped(Utf8String * val, 00069 JsonParsingContext & context) const 00070 { 00071 *val = context.expectStringUtf8(); 00072 } 00073 00074 virtual void printJsonTyped(const Utf8String * val, 00075 JsonPrintingContext & context) const 00076 { 00077 context.writeStringUtf8(*val); 00078 } 00079 00080 virtual bool isDefaultTyped(const Utf8String * val) const 00081 { 00082 return val->empty(); 00083 } 00084 }; 00085 00086 template<> 00087 struct DefaultDescription<Url> 00088 : public ValueDescriptionI<Url, ValueKind::ATOM> { 00089 00090 virtual void parseJsonTyped(Url * val, 00091 JsonParsingContext & context) const 00092 { 00093 *val = Url(context.expectStringUtf8()); 00094 } 00095 00096 virtual void printJsonTyped(const Url * val, 00097 JsonPrintingContext & context) const 00098 { 00099 context.writeStringUtf8(val->toUtf8String()); 00100 } 00101 00102 virtual bool isDefaultTyped(const Url * val) const 00103 { 00104 return val->empty(); 00105 } 00106 }; 00107 00108 template<> 00109 struct DefaultDescription<int> 00110 : public ValueDescriptionI<int, ValueKind::INTEGER> { 00111 00112 virtual void parseJsonTyped(int * val, 00113 JsonParsingContext & context) const 00114 { 00115 *val = context.expectInt(); 00116 } 00117 00118 virtual void printJsonTyped(const int * val, 00119 JsonPrintingContext & context) const 00120 { 00121 context.writeInt(*val); 00122 } 00123 }; 00124 00125 template<> 00126 struct DefaultDescription<float> 00127 : public ValueDescriptionI<float, ValueKind::FLOAT> { 00128 00129 virtual void parseJsonTyped(float * val, 00130 JsonParsingContext & context) const 00131 { 00132 *val = context.expectFloat(); 00133 } 00134 00135 virtual void printJsonTyped(const float * val, 00136 JsonPrintingContext & context) const 00137 { 00138 context.writeFloat(*val); 00139 } 00140 }; 00141 00142 template<> 00143 struct DefaultDescription<double> 00144 : public ValueDescriptionI<double, ValueKind::FLOAT> { 00145 00146 virtual void parseJsonTyped(double * val, 00147 JsonParsingContext & context) const 00148 { 00149 *val = context.expectDouble(); 00150 } 00151 00152 virtual void printJsonTyped(const double * val, 00153 JsonPrintingContext & context) const 00154 { 00155 context.writeDouble(*val); 00156 } 00157 }; 00158 00159 #if 0 00160 template<typename T> 00161 struct DefaultDescription<std::vector<T> > 00162 : public ValueDescriptionI<std::vector<T>, ValueKind::ARRAY> { 00163 }; 00164 #endif 00165 00166 template<typename T> 00167 struct DefaultDescription<std::unique_ptr<T> > 00168 : public ValueDescriptionI<std::unique_ptr<T>, ValueKind::OPTIONAL> { 00169 00170 DefaultDescription(ValueDescriptionT<T> * inner 00171 = getDefaultDescription((T *)0)) 00172 : inner(inner) 00173 { 00174 } 00175 00176 std::unique_ptr<ValueDescriptionT<T> > inner; 00177 00178 virtual void parseJsonTyped(std::unique_ptr<T> * val, 00179 JsonParsingContext & context) const 00180 { 00181 val->reset(new T()); 00182 inner->parseJsonTyped(val->get(), context); 00183 } 00184 00185 virtual void printJsonTyped(const std::unique_ptr<T> * val, 00186 JsonPrintingContext & context) const 00187 { 00188 if (!val->get()) 00189 context.skip(); 00190 else inner->printJsonTyped(val->get(), context); 00191 } 00192 00193 virtual bool isDefaultTyped(const std::unique_ptr<T> * val) const 00194 { 00195 return !val->get(); 00196 } 00197 }; 00198 00199 template<> 00200 struct DefaultDescription<Json::Value> 00201 : public ValueDescriptionI<Json::Value, ValueKind::ANY> { 00202 00203 virtual void parseJsonTyped(Json::Value * val, 00204 JsonParsingContext & context) const 00205 { 00206 Datacratic::parseJson(val, context); 00207 } 00208 00209 virtual void printJsonTyped(const Json::Value * val, 00210 JsonPrintingContext & context) const 00211 { 00212 context.writeJson(*val); 00213 } 00214 00215 virtual bool isDefaultTyped(const Json::Value * val) const 00216 { 00217 return val->isNull(); 00218 } 00219 }; 00220 00221 template<> 00222 struct DefaultDescription<bool> 00223 : public ValueDescriptionI<bool, ValueKind::BOOLEAN> { 00224 00225 virtual void parseJsonTyped(bool * val, 00226 JsonParsingContext & context) const 00227 { 00228 *val = context.expectBool(); 00229 } 00230 00231 virtual void printJsonTyped(const bool * val, 00232 JsonPrintingContext & context) const 00233 { 00234 context.writeBool(*val); 00235 } 00236 00237 virtual bool isDefaultTyped(const bool * val) const 00238 { 00239 return false; 00240 } 00241 }; 00242 00243 template<> 00244 struct DefaultDescription<Date> 00245 : public ValueDescriptionI<Date, ValueKind::ATOM> { 00246 00247 virtual void parseJsonTyped(Date * val, 00248 JsonParsingContext & context) const 00249 { 00250 if (context.isNumber()) 00251 *val = Date::fromSecondsSinceEpoch(context.expectDouble()); 00252 else if (context.isString()) 00253 *val = Date::parseDefaultUtc(context.expectStringAscii()); 00254 else context.exception("expected date"); 00255 } 00256 00257 virtual void printJsonTyped(const Date * val, 00258 JsonPrintingContext & context) const 00259 { 00260 context.writeJson(val->secondsSinceEpoch()); 00261 } 00262 00263 virtual bool isDefaultTyped(const Date * val) const 00264 { 00265 return *val == Date(); 00266 } 00267 }; 00268 00269 } // namespace Datacratic