RTBKit  0.9
Open-source framework to create real-time ad bidding systems.
soa/types/basic_value_descriptions.h
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
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator