ajson5.h 103 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429
  1. // ArduinoJson - arduinojson.org
  2. // Copyright Benoit Blanchon 2014-2019
  3. // MIT License
  4. #pragma once
  5. #ifdef __cplusplus
  6. #define ARDUINOJSON_VERSION "5.13.5"
  7. #define ARDUINOJSON_VERSION_MAJOR 5
  8. #define ARDUINOJSON_VERSION_MINOR 13
  9. #define ARDUINOJSON_VERSION_REVISION 5
  10. #include <stddef.h> // for size_t
  11. #include <stdint.h> // for uint8_t
  12. #include <string.h>
  13. namespace ArduinoJson {
  14. namespace Internals {
  15. class NonCopyable {
  16. protected:
  17. NonCopyable() {}
  18. private:
  19. NonCopyable(const NonCopyable&);
  20. NonCopyable& operator=(const NonCopyable&);
  21. };
  22. } // namespace Internals
  23. } // namespace ArduinoJson
  24. #ifndef ARDUINOJSON_EMBEDDED_MODE
  25. #if defined(ARDUINO) || defined(__IAR_SYSTEMS_ICC__) || defined(__XC) || \
  26. defined(__ARMCC_VERSION)
  27. #define ARDUINOJSON_EMBEDDED_MODE 1
  28. #else
  29. #define ARDUINOJSON_EMBEDDED_MODE 0
  30. #endif
  31. #endif
  32. #if ARDUINOJSON_EMBEDDED_MODE
  33. #ifndef ARDUINOJSON_USE_DOUBLE
  34. #define ARDUINOJSON_USE_DOUBLE 0
  35. #endif
  36. #ifndef ARDUINOJSON_USE_LONG_LONG
  37. #define ARDUINOJSON_USE_LONG_LONG 0
  38. #endif
  39. #ifndef ARDUINOJSON_USE_INT64
  40. #define ARDUINOJSON_USE_INT64 0
  41. #endif
  42. #ifndef ARDUINOJSON_ENABLE_STD_STRING
  43. #define ARDUINOJSON_ENABLE_STD_STRING 0
  44. #endif
  45. #ifndef ARDUINOJSON_ENABLE_STD_STREAM
  46. #define ARDUINOJSON_ENABLE_STD_STREAM 0
  47. #endif
  48. #ifndef ARDUINOJSON_DEFAULT_NESTING_LIMIT
  49. #define ARDUINOJSON_DEFAULT_NESTING_LIMIT 10
  50. #endif
  51. #else // ARDUINOJSON_EMBEDDED_MODE
  52. #ifndef ARDUINOJSON_USE_DOUBLE
  53. #define ARDUINOJSON_USE_DOUBLE 1
  54. #endif
  55. #ifndef ARDUINOJSON_USE_LONG_LONG
  56. #if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1800)
  57. #define ARDUINOJSON_USE_LONG_LONG 1
  58. #else
  59. #define ARDUINOJSON_USE_LONG_LONG 0
  60. #endif
  61. #endif
  62. #ifndef ARDUINOJSON_USE_INT64
  63. #if defined(_MSC_VER) && _MSC_VER <= 1700
  64. #define ARDUINOJSON_USE_INT64 1
  65. #else
  66. #define ARDUINOJSON_USE_INT64 0
  67. #endif
  68. #endif
  69. #ifndef ARDUINOJSON_ENABLE_STD_STRING
  70. #define ARDUINOJSON_ENABLE_STD_STRING 1
  71. #endif
  72. #ifndef ARDUINOJSON_ENABLE_STD_STREAM
  73. #define ARDUINOJSON_ENABLE_STD_STREAM 1
  74. #endif
  75. #ifndef ARDUINOJSON_DEFAULT_NESTING_LIMIT
  76. #define ARDUINOJSON_DEFAULT_NESTING_LIMIT 50
  77. #endif
  78. #endif // ARDUINOJSON_EMBEDDED_MODE
  79. #ifdef ARDUINO
  80. #ifndef ARDUINOJSON_ENABLE_ARDUINO_STRING
  81. #define ARDUINOJSON_ENABLE_ARDUINO_STRING 1
  82. #endif
  83. #ifndef ARDUINOJSON_ENABLE_ARDUINO_STREAM
  84. #define ARDUINOJSON_ENABLE_ARDUINO_STREAM 1
  85. #endif
  86. #else // ARDUINO
  87. #ifndef ARDUINOJSON_ENABLE_ARDUINO_STRING
  88. #define ARDUINOJSON_ENABLE_ARDUINO_STRING 0
  89. #endif
  90. #ifndef ARDUINOJSON_ENABLE_ARDUINO_STREAM
  91. #define ARDUINOJSON_ENABLE_ARDUINO_STREAM 0
  92. #endif
  93. #endif // ARDUINO
  94. #ifndef ARDUINOJSON_ENABLE_PROGMEM
  95. #ifdef PROGMEM
  96. #define ARDUINOJSON_ENABLE_PROGMEM 1
  97. #else
  98. #define ARDUINOJSON_ENABLE_PROGMEM 0
  99. #endif
  100. #endif
  101. #ifndef ARDUINOJSON_ENABLE_ALIGNMENT
  102. #ifdef ARDUINO_ARCH_AVR
  103. #define ARDUINOJSON_ENABLE_ALIGNMENT 0
  104. #else
  105. #define ARDUINOJSON_ENABLE_ALIGNMENT 1
  106. #endif
  107. #endif
  108. #ifndef ARDUINOJSON_ENABLE_DEPRECATED
  109. #define ARDUINOJSON_ENABLE_DEPRECATED 1
  110. #endif
  111. #ifndef ARDUINOJSON_POSITIVE_EXPONENTIATION_THRESHOLD
  112. #define ARDUINOJSON_POSITIVE_EXPONENTIATION_THRESHOLD 1e7
  113. #endif
  114. #ifndef ARDUINOJSON_NEGATIVE_EXPONENTIATION_THRESHOLD
  115. #define ARDUINOJSON_NEGATIVE_EXPONENTIATION_THRESHOLD 1e-5
  116. #endif
  117. #if ARDUINOJSON_USE_LONG_LONG && ARDUINOJSON_USE_INT64
  118. #error ARDUINOJSON_USE_LONG_LONG and ARDUINOJSON_USE_INT64 cannot be set together
  119. #endif
  120. namespace ArduinoJson {
  121. namespace Internals {
  122. #if ARDUINOJSON_USE_DOUBLE
  123. typedef double JsonFloat;
  124. #else
  125. typedef float JsonFloat;
  126. #endif
  127. } // namespace Internals
  128. } // namespace ArduinoJson
  129. namespace ArduinoJson {
  130. namespace Internals {
  131. #if ARDUINOJSON_USE_LONG_LONG
  132. typedef long long JsonInteger;
  133. typedef unsigned long long JsonUInt;
  134. #elif ARDUINOJSON_USE_INT64
  135. typedef __int64 JsonInteger;
  136. typedef unsigned _int64 JsonUInt;
  137. #else
  138. typedef long JsonInteger;
  139. typedef unsigned long JsonUInt;
  140. #endif
  141. } // namespace Internals
  142. } // namespace ArduinoJson
  143. namespace ArduinoJson {
  144. class JsonArray;
  145. class JsonObject;
  146. namespace Internals {
  147. union JsonVariantContent {
  148. JsonFloat asFloat; // used for double and float
  149. JsonUInt asInteger; // used for bool, char, short, int and longs
  150. const char* asString; // asString can be null
  151. JsonArray* asArray; // asArray cannot be null
  152. JsonObject* asObject; // asObject cannot be null
  153. };
  154. } // namespace Internals
  155. } // namespace ArduinoJson
  156. namespace ArduinoJson {
  157. namespace Internals {
  158. template <typename T>
  159. struct JsonVariantDefault {
  160. static T get() {
  161. return T();
  162. }
  163. };
  164. template <typename T>
  165. struct JsonVariantDefault<const T> : JsonVariantDefault<T> {};
  166. template <typename T>
  167. struct JsonVariantDefault<T&> : JsonVariantDefault<T> {};
  168. } // namespace Internals
  169. } // namespace ArduinoJson
  170. namespace ArduinoJson {
  171. class JsonArray;
  172. class JsonObject;
  173. namespace Internals {
  174. enum JsonVariantType {
  175. JSON_UNDEFINED, // JsonVariant has not been initialized
  176. JSON_UNPARSED, // JsonVariant contains an unparsed string
  177. JSON_STRING, // JsonVariant stores a const char*
  178. JSON_BOOLEAN, // JsonVariant stores a bool
  179. JSON_POSITIVE_INTEGER, // JsonVariant stores an JsonUInt
  180. JSON_NEGATIVE_INTEGER, // JsonVariant stores an JsonUInt that must be negated
  181. JSON_ARRAY, // JsonVariant stores a pointer to a JsonArray
  182. JSON_OBJECT, // JsonVariant stores a pointer to a JsonObject
  183. JSON_FLOAT // JsonVariant stores a JsonFloat
  184. };
  185. } // namespace Internals
  186. } // namespace ArduinoJson
  187. namespace ArduinoJson {
  188. namespace Internals {
  189. template <typename T>
  190. struct JsonVariantAs {
  191. typedef T type;
  192. };
  193. template <>
  194. struct JsonVariantAs<char*> {
  195. typedef const char* type;
  196. };
  197. template <>
  198. struct JsonVariantAs<JsonArray> {
  199. typedef JsonArray& type;
  200. };
  201. template <>
  202. struct JsonVariantAs<const JsonArray> {
  203. typedef const JsonArray& type;
  204. };
  205. template <>
  206. struct JsonVariantAs<JsonObject> {
  207. typedef JsonObject& type;
  208. };
  209. template <>
  210. struct JsonVariantAs<const JsonObject> {
  211. typedef const JsonObject& type;
  212. };
  213. } // namespace Internals
  214. } // namespace ArduinoJson
  215. #ifdef _MSC_VER // Visual Studio
  216. #define FORCE_INLINE // __forceinline causes C4714 when returning std::string
  217. #define NO_INLINE __declspec(noinline)
  218. #define DEPRECATED(msg) __declspec(deprecated(msg))
  219. #elif defined(__GNUC__) // GCC or Clang
  220. #define FORCE_INLINE __attribute__((always_inline))
  221. #define NO_INLINE __attribute__((noinline))
  222. #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
  223. #define DEPRECATED(msg) __attribute__((deprecated(msg)))
  224. #else
  225. #define DEPRECATED(msg) __attribute__((deprecated))
  226. #endif
  227. #else // Other compilers
  228. #define FORCE_INLINE
  229. #define NO_INLINE
  230. #define DEPRECATED(msg)
  231. #endif
  232. namespace ArduinoJson {
  233. namespace Internals {
  234. template <typename TImpl>
  235. class JsonVariantCasts {
  236. public:
  237. #if ARDUINOJSON_ENABLE_DEPRECATED
  238. DEPRECATED("use as<JsonArray>() instead")
  239. FORCE_INLINE JsonArray &asArray() const {
  240. return impl()->template as<JsonArray>();
  241. }
  242. DEPRECATED("use as<JsonObject>() instead")
  243. FORCE_INLINE JsonObject &asObject() const {
  244. return impl()->template as<JsonObject>();
  245. }
  246. DEPRECATED("use as<char*>() instead")
  247. FORCE_INLINE const char *asString() const {
  248. return impl()->template as<const char *>();
  249. }
  250. #endif
  251. FORCE_INLINE operator JsonArray &() const {
  252. return impl()->template as<JsonArray &>();
  253. }
  254. FORCE_INLINE operator JsonObject &() const {
  255. return impl()->template as<JsonObject &>();
  256. }
  257. template <typename T>
  258. FORCE_INLINE operator T() const {
  259. return impl()->template as<T>();
  260. }
  261. private:
  262. const TImpl *impl() const {
  263. return static_cast<const TImpl *>(this);
  264. }
  265. };
  266. } // namespace Internals
  267. } // namespace ArduinoJson
  268. namespace ArduinoJson {
  269. namespace Internals {
  270. template <bool Condition, typename T = void>
  271. struct EnableIf {};
  272. template <typename T>
  273. struct EnableIf<true, T> {
  274. typedef T type;
  275. };
  276. } // namespace Internals
  277. } // namespace ArduinoJson
  278. namespace ArduinoJson {
  279. namespace Internals {
  280. template <typename TBase, typename TDerived>
  281. class IsBaseOf {
  282. protected: // <- to avoid GCC's "all member functions in class are private"
  283. typedef char Yes[1];
  284. typedef char No[2];
  285. static Yes &probe(const TBase *);
  286. static No &probe(...);
  287. public:
  288. enum {
  289. value = sizeof(probe(reinterpret_cast<TDerived *>(0))) == sizeof(Yes)
  290. };
  291. };
  292. } // namespace Internals
  293. } // namespace ArduinoJson
  294. namespace ArduinoJson {
  295. namespace Internals {
  296. template <typename T, typename U>
  297. struct IsSame {
  298. static const bool value = false;
  299. };
  300. template <typename T>
  301. struct IsSame<T, T> {
  302. static const bool value = true;
  303. };
  304. } // namespace Internals
  305. } // namespace ArduinoJson
  306. namespace ArduinoJson {
  307. namespace Internals {
  308. template <typename T>
  309. struct IsChar {
  310. static const bool value = IsSame<T, char>::value ||
  311. IsSame<T, signed char>::value ||
  312. IsSame<T, unsigned char>::value;
  313. };
  314. template <typename T>
  315. struct IsChar<const T> : IsChar<T> {};
  316. } // namespace Internals
  317. } // namespace ArduinoJson
  318. namespace ArduinoJson {
  319. namespace Internals {
  320. template <typename T>
  321. struct IsConst {
  322. static const bool value = false;
  323. };
  324. template <typename T>
  325. struct IsConst<const T> {
  326. static const bool value = true;
  327. };
  328. } // namespace Internals
  329. } // namespace ArduinoJson
  330. namespace ArduinoJson {
  331. namespace Internals {
  332. template <typename T>
  333. struct RemoveReference {
  334. typedef T type;
  335. };
  336. template <typename T>
  337. struct RemoveReference<T&> {
  338. typedef T type;
  339. };
  340. } // namespace Internals
  341. } // namespace ArduinoJson
  342. namespace ArduinoJson {
  343. namespace Internals {
  344. template <typename TString, typename Enable = void>
  345. struct StringTraits {
  346. static const bool has_append = false;
  347. static const bool has_equals = false;
  348. };
  349. template <typename TString>
  350. struct StringTraits<const TString, void> : StringTraits<TString> {};
  351. template <typename TString>
  352. struct StringTraits<TString&, void> : StringTraits<TString> {};
  353. } // namespace Internals
  354. } // namespace ArduinoJson
  355. #if ARDUINOJSON_ENABLE_ARDUINO_STREAM
  356. #include <Stream.h>
  357. namespace ArduinoJson {
  358. namespace Internals {
  359. struct ArduinoStreamTraits {
  360. class Reader {
  361. Stream& _stream;
  362. char _current, _next;
  363. public:
  364. Reader(Stream& stream) : _stream(stream), _current(0), _next(0) {}
  365. void move() {
  366. _current = _next;
  367. _next = 0;
  368. }
  369. char current() {
  370. if (!_current) _current = read();
  371. return _current;
  372. }
  373. char next() {
  374. if (!_next) _next = read();
  375. return _next;
  376. }
  377. private:
  378. char read() {
  379. char c = 0;
  380. _stream.readBytes(&c, 1);
  381. return c;
  382. }
  383. };
  384. static const bool has_append = false;
  385. static const bool has_equals = false;
  386. };
  387. template <typename TStream>
  388. struct StringTraits<
  389. TStream,
  390. typename EnableIf<
  391. IsBaseOf<Stream, typename RemoveReference<TStream>::type>::value>::type>
  392. : ArduinoStreamTraits {};
  393. } // namespace Internals
  394. } // namespace ArduinoJson
  395. #endif
  396. namespace ArduinoJson {
  397. namespace Internals {
  398. template <typename TChar>
  399. struct CharPointerTraits {
  400. class Reader {
  401. const TChar* _ptr;
  402. public:
  403. Reader(const TChar* ptr)
  404. : _ptr(ptr ? ptr : reinterpret_cast<const TChar*>("")) {}
  405. void move() {
  406. ++_ptr;
  407. }
  408. char current() const {
  409. return char(_ptr[0]);
  410. }
  411. char next() const {
  412. return char(_ptr[1]);
  413. }
  414. };
  415. static bool equals(const TChar* str, const char* expected) {
  416. const char* actual = reinterpret_cast<const char*>(str);
  417. if (!actual || !expected) return actual == expected;
  418. return strcmp(actual, expected) == 0;
  419. }
  420. static bool is_null(const TChar* str) {
  421. return !str;
  422. }
  423. typedef const char* duplicate_t;
  424. template <typename Buffer>
  425. static duplicate_t duplicate(const TChar* str, Buffer* buffer) {
  426. if (!str) return NULL;
  427. size_t size = strlen(reinterpret_cast<const char*>(str)) + 1;
  428. void* dup = buffer->alloc(size);
  429. if (dup != NULL) memcpy(dup, str, size);
  430. return static_cast<duplicate_t>(dup);
  431. }
  432. static const bool has_append = false;
  433. static const bool has_equals = true;
  434. static const bool should_duplicate = !IsConst<TChar>::value;
  435. };
  436. template <typename TChar>
  437. struct StringTraits<TChar*, typename EnableIf<IsChar<TChar>::value>::type>
  438. : CharPointerTraits<TChar> {};
  439. } // namespace Internals
  440. } // namespace ArduinoJson
  441. #if ARDUINOJSON_ENABLE_PROGMEM
  442. namespace ArduinoJson {
  443. namespace Internals {
  444. template <>
  445. struct StringTraits<const __FlashStringHelper*, void> {
  446. class Reader {
  447. const char* _ptr;
  448. public:
  449. Reader(const __FlashStringHelper* ptr)
  450. : _ptr(reinterpret_cast<const char*>(ptr)) {}
  451. void move() {
  452. _ptr++;
  453. }
  454. char current() const {
  455. return pgm_read_byte_near(_ptr);
  456. }
  457. char next() const {
  458. return pgm_read_byte_near(_ptr + 1);
  459. }
  460. };
  461. static bool equals(const __FlashStringHelper* str, const char* expected) {
  462. const char* actual = reinterpret_cast<const char*>(str);
  463. if (!actual || !expected) return actual == expected;
  464. return strcmp_P(expected, actual) == 0;
  465. }
  466. static bool is_null(const __FlashStringHelper* str) {
  467. return !str;
  468. }
  469. typedef const char* duplicate_t;
  470. template <typename Buffer>
  471. static duplicate_t duplicate(const __FlashStringHelper* str, Buffer* buffer) {
  472. if (!str) return NULL;
  473. size_t size = strlen_P((const char*)str) + 1;
  474. void* dup = buffer->alloc(size);
  475. if (dup != NULL) memcpy_P(dup, (const char*)str, size);
  476. return static_cast<duplicate_t>(dup);
  477. }
  478. static const bool has_append = false;
  479. static const bool has_equals = true;
  480. static const bool should_duplicate = true;
  481. };
  482. } // namespace Internals
  483. } // namespace ArduinoJson
  484. #endif
  485. #if ARDUINOJSON_ENABLE_STD_STREAM
  486. #include <istream>
  487. namespace ArduinoJson {
  488. namespace Internals {
  489. struct StdStreamTraits {
  490. class Reader {
  491. std::istream& _stream;
  492. char _current, _next;
  493. public:
  494. Reader(std::istream& stream) : _stream(stream), _current(0), _next(0) {}
  495. void move() {
  496. _current = _next;
  497. _next = 0;
  498. }
  499. char current() {
  500. if (!_current) _current = read();
  501. return _current;
  502. }
  503. char next() {
  504. if (!_next) _next = read();
  505. return _next;
  506. }
  507. private:
  508. Reader& operator=(const Reader&); // Visual Studio C4512
  509. char read() {
  510. return _stream.eof() ? '\0' : static_cast<char>(_stream.get());
  511. }
  512. };
  513. static const bool has_append = false;
  514. static const bool has_equals = false;
  515. };
  516. template <typename TStream>
  517. struct StringTraits<
  518. TStream,
  519. typename EnableIf<IsBaseOf<
  520. std::istream, typename RemoveReference<TStream>::type>::value>::type>
  521. : StdStreamTraits {};
  522. } // namespace Internals
  523. } // namespace ArduinoJson
  524. #endif
  525. #if ARDUINOJSON_ENABLE_STD_STRING || ARDUINOJSON_ENABLE_ARDUINO_STRING
  526. #if ARDUINOJSON_ENABLE_ARDUINO_STRING
  527. #include <WString.h>
  528. #endif
  529. #if ARDUINOJSON_ENABLE_STD_STRING
  530. #include <string>
  531. #endif
  532. namespace ArduinoJson {
  533. namespace Internals {
  534. template <typename TString>
  535. struct StdStringTraits {
  536. typedef const char* duplicate_t;
  537. template <typename Buffer>
  538. static duplicate_t duplicate(const TString& str, Buffer* buffer) {
  539. if (!str.c_str()) return NULL; // <- Arduino string can return NULL
  540. size_t size = str.length() + 1;
  541. void* dup = buffer->alloc(size);
  542. if (dup != NULL) memcpy(dup, str.c_str(), size);
  543. return static_cast<duplicate_t>(dup);
  544. }
  545. static bool is_null(const TString& str) {
  546. return !str.c_str();
  547. }
  548. struct Reader : CharPointerTraits<char>::Reader {
  549. Reader(const TString& str) : CharPointerTraits<char>::Reader(str.c_str()) {}
  550. };
  551. static bool equals(const TString& str, const char* expected) {
  552. const char* actual = str.c_str();
  553. if (!actual || !expected) return actual == expected;
  554. return 0 == strcmp(actual, expected);
  555. }
  556. static void append(TString& str, char c) {
  557. str += c;
  558. }
  559. static void append(TString& str, const char* s) {
  560. str += s;
  561. }
  562. static const bool has_append = true;
  563. static const bool has_equals = true;
  564. static const bool should_duplicate = true;
  565. };
  566. #if ARDUINOJSON_ENABLE_ARDUINO_STRING
  567. template <>
  568. struct StringTraits<String, void> : StdStringTraits<String> {};
  569. template <>
  570. struct StringTraits<StringSumHelper, void> : StdStringTraits<StringSumHelper> {
  571. };
  572. #endif
  573. #if ARDUINOJSON_ENABLE_STD_STRING
  574. template <>
  575. struct StringTraits<std::string, void> : StdStringTraits<std::string> {};
  576. #endif
  577. } // namespace Internals
  578. } // namespace ArduinoJson
  579. #endif
  580. namespace ArduinoJson {
  581. namespace Internals {
  582. class JsonVariantTag {};
  583. template <typename T>
  584. struct IsVariant : IsBaseOf<JsonVariantTag, T> {};
  585. } // namespace Internals
  586. } // namespace ArduinoJson
  587. namespace ArduinoJson {
  588. namespace Internals {
  589. template <typename TImpl>
  590. class JsonVariantComparisons {
  591. public:
  592. template <typename TComparand>
  593. friend bool operator==(const JsonVariantComparisons &variant,
  594. TComparand comparand) {
  595. return variant.equals(comparand);
  596. }
  597. template <typename TComparand>
  598. friend typename EnableIf<!IsVariant<TComparand>::value, bool>::type
  599. operator==(TComparand comparand, const JsonVariantComparisons &variant) {
  600. return variant.equals(comparand);
  601. }
  602. template <typename TComparand>
  603. friend bool operator!=(const JsonVariantComparisons &variant,
  604. TComparand comparand) {
  605. return !variant.equals(comparand);
  606. }
  607. template <typename TComparand>
  608. friend typename EnableIf<!IsVariant<TComparand>::value, bool>::type
  609. operator!=(TComparand comparand, const JsonVariantComparisons &variant) {
  610. return !variant.equals(comparand);
  611. }
  612. template <typename TComparand>
  613. friend bool operator<=(const JsonVariantComparisons &left, TComparand right) {
  614. return left.as<TComparand>() <= right;
  615. }
  616. template <typename TComparand>
  617. friend bool operator<=(TComparand comparand,
  618. const JsonVariantComparisons &variant) {
  619. return comparand <= variant.as<TComparand>();
  620. }
  621. template <typename TComparand>
  622. friend bool operator>=(const JsonVariantComparisons &variant,
  623. TComparand comparand) {
  624. return variant.as<TComparand>() >= comparand;
  625. }
  626. template <typename TComparand>
  627. friend bool operator>=(TComparand comparand,
  628. const JsonVariantComparisons &variant) {
  629. return comparand >= variant.as<TComparand>();
  630. }
  631. template <typename TComparand>
  632. friend bool operator<(const JsonVariantComparisons &varian,
  633. TComparand comparand) {
  634. return varian.as<TComparand>() < comparand;
  635. }
  636. template <typename TComparand>
  637. friend bool operator<(TComparand comparand,
  638. const JsonVariantComparisons &variant) {
  639. return comparand < variant.as<TComparand>();
  640. }
  641. template <typename TComparand>
  642. friend bool operator>(const JsonVariantComparisons &variant,
  643. TComparand comparand) {
  644. return variant.as<TComparand>() > comparand;
  645. }
  646. template <typename TComparand>
  647. friend bool operator>(TComparand comparand,
  648. const JsonVariantComparisons &variant) {
  649. return comparand > variant.as<TComparand>();
  650. }
  651. private:
  652. const TImpl *impl() const {
  653. return static_cast<const TImpl *>(this);
  654. }
  655. template <typename T>
  656. const typename JsonVariantAs<T>::type as() const {
  657. return impl()->template as<T>();
  658. }
  659. template <typename T>
  660. bool is() const {
  661. return impl()->template is<T>();
  662. }
  663. template <typename TString>
  664. typename EnableIf<StringTraits<TString>::has_equals, bool>::type equals(
  665. const TString &comparand) const {
  666. const char *value = as<const char *>();
  667. return StringTraits<TString>::equals(comparand, value);
  668. }
  669. template <typename TComparand>
  670. typename EnableIf<!IsVariant<TComparand>::value &&
  671. !StringTraits<TComparand>::has_equals,
  672. bool>::type
  673. equals(const TComparand &comparand) const {
  674. return as<TComparand>() == comparand;
  675. }
  676. template <typename TVariant2>
  677. bool equals(const JsonVariantComparisons<TVariant2> &right) const {
  678. using namespace Internals;
  679. if (is<bool>() && right.template is<bool>())
  680. return as<bool>() == right.template as<bool>();
  681. if (is<JsonInteger>() && right.template is<JsonInteger>())
  682. return as<JsonInteger>() == right.template as<JsonInteger>();
  683. if (is<JsonFloat>() && right.template is<JsonFloat>())
  684. return as<JsonFloat>() == right.template as<JsonFloat>();
  685. if (is<JsonArray>() && right.template is<JsonArray>())
  686. return as<JsonArray>() == right.template as<JsonArray>();
  687. if (is<JsonObject>() && right.template is<JsonObject>())
  688. return as<JsonObject>() == right.template as<JsonObject>();
  689. if (is<char *>() && right.template is<char *>())
  690. return StringTraits<const char *>::equals(as<char *>(),
  691. right.template as<char *>());
  692. return false;
  693. }
  694. };
  695. } // namespace Internals
  696. } // namespace ArduinoJson
  697. namespace ArduinoJson {
  698. namespace Internals {
  699. template <typename T>
  700. struct IsSignedIntegral {
  701. static const bool value =
  702. IsSame<T, signed char>::value || IsSame<T, signed short>::value ||
  703. IsSame<T, signed int>::value || IsSame<T, signed long>::value ||
  704. #if ARDUINOJSON_USE_LONG_LONG
  705. IsSame<T, signed long long>::value ||
  706. #endif
  707. #if ARDUINOJSON_USE_INT64
  708. IsSame<T, signed __int64>::value ||
  709. #endif
  710. false;
  711. };
  712. } // namespace Internals
  713. } // namespace ArduinoJson
  714. namespace ArduinoJson {
  715. namespace Internals {
  716. template <typename T>
  717. struct IsUnsignedIntegral {
  718. static const bool value =
  719. IsSame<T, unsigned char>::value || IsSame<T, unsigned short>::value ||
  720. IsSame<T, unsigned int>::value || IsSame<T, unsigned long>::value ||
  721. #if ARDUINOJSON_USE_LONG_LONG
  722. IsSame<T, unsigned long long>::value ||
  723. #endif
  724. #if ARDUINOJSON_USE_INT64
  725. IsSame<T, unsigned __int64>::value ||
  726. #endif
  727. false;
  728. };
  729. } // namespace Internals
  730. } // namespace ArduinoJson
  731. namespace ArduinoJson {
  732. namespace Internals {
  733. template <typename T>
  734. struct IsIntegral {
  735. static const bool value = IsSignedIntegral<T>::value ||
  736. IsUnsignedIntegral<T>::value ||
  737. IsSame<T, char>::value;
  738. };
  739. template <typename T>
  740. struct IsIntegral<const T> : IsIntegral<T> {};
  741. } // namespace Internals
  742. } // namespace ArduinoJson
  743. namespace ArduinoJson {
  744. namespace Internals {
  745. template <typename TImpl>
  746. class JsonVariantOr {
  747. public:
  748. template <typename T>
  749. typename EnableIf<!IsIntegral<T>::value, T>::type operator|(
  750. const T &defaultValue) const {
  751. if (impl()->template is<T>())
  752. return impl()->template as<T>();
  753. else
  754. return defaultValue;
  755. }
  756. const char *operator|(const char *defaultValue) const {
  757. const char *value = impl()->template as<const char *>();
  758. return value ? value : defaultValue;
  759. }
  760. template <typename Integer>
  761. typename EnableIf<IsIntegral<Integer>::value, Integer>::type operator|(
  762. const Integer &defaultValue) const {
  763. if (impl()->template is<double>())
  764. return impl()->template as<Integer>();
  765. else
  766. return defaultValue;
  767. }
  768. private:
  769. const TImpl *impl() const {
  770. return static_cast<const TImpl *>(this);
  771. }
  772. };
  773. } // namespace Internals
  774. } // namespace ArduinoJson
  775. namespace ArduinoJson {
  776. namespace Internals {
  777. class JsonArraySubscript;
  778. template <typename TKey>
  779. class JsonObjectSubscript;
  780. template <typename TImpl>
  781. class JsonVariantSubscripts {
  782. public:
  783. size_t size() const {
  784. return impl()->template as<JsonArray>().size() +
  785. impl()->template as<JsonObject>().size();
  786. }
  787. FORCE_INLINE const JsonArraySubscript operator[](size_t index) const;
  788. FORCE_INLINE JsonArraySubscript operator[](size_t index);
  789. template <typename TString>
  790. FORCE_INLINE
  791. typename EnableIf<StringTraits<TString>::has_equals,
  792. const JsonObjectSubscript<const TString &> >::type
  793. operator[](const TString &key) const {
  794. return impl()->template as<JsonObject>()[key];
  795. }
  796. template <typename TString>
  797. FORCE_INLINE typename EnableIf<StringTraits<TString>::has_equals,
  798. JsonObjectSubscript<const TString &> >::type
  799. operator[](const TString &key) {
  800. return impl()->template as<JsonObject>()[key];
  801. }
  802. template <typename TString>
  803. FORCE_INLINE typename EnableIf<StringTraits<const TString *>::has_equals,
  804. JsonObjectSubscript<const TString *> >::type
  805. operator[](const TString *key) {
  806. return impl()->template as<JsonObject>()[key];
  807. }
  808. template <typename TString>
  809. FORCE_INLINE
  810. typename EnableIf<StringTraits<TString *>::has_equals,
  811. const JsonObjectSubscript<const TString *> >::type
  812. operator[](const TString *key) const {
  813. return impl()->template as<JsonObject>()[key];
  814. }
  815. private:
  816. const TImpl *impl() const {
  817. return static_cast<const TImpl *>(this);
  818. }
  819. };
  820. } // namespace Internals
  821. } // namespace ArduinoJson
  822. namespace ArduinoJson {
  823. namespace Internals {
  824. class DummyPrint {
  825. public:
  826. size_t print(char) {
  827. return 1;
  828. }
  829. size_t print(const char* s) {
  830. return strlen(s);
  831. }
  832. };
  833. } // namespace Internals
  834. } // namespace ArduinoJson
  835. namespace ArduinoJson {
  836. namespace Internals {
  837. template <typename TString>
  838. class DynamicStringBuilder {
  839. public:
  840. DynamicStringBuilder(TString &str) : _str(str) {}
  841. size_t print(char c) {
  842. StringTraits<TString>::append(_str, c);
  843. return 1;
  844. }
  845. size_t print(const char *s) {
  846. size_t initialLen = _str.length();
  847. StringTraits<TString>::append(_str, s);
  848. return _str.length() - initialLen;
  849. }
  850. private:
  851. DynamicStringBuilder &operator=(const DynamicStringBuilder &);
  852. TString &_str;
  853. };
  854. } // namespace Internals
  855. } // namespace ArduinoJson
  856. namespace ArduinoJson {
  857. namespace Internals {
  858. template <typename Print>
  859. class IndentedPrint {
  860. public:
  861. explicit IndentedPrint(Print &p) : sink(&p) {
  862. level = 0;
  863. tabSize = 2;
  864. isNewLine = true;
  865. }
  866. size_t print(char c) {
  867. size_t n = 0;
  868. if (isNewLine) n += writeTabs();
  869. n += sink->print(c);
  870. isNewLine = c == '\n';
  871. return n;
  872. }
  873. size_t print(const char *s) {
  874. size_t n = 0;
  875. while (*s) n += print(*s++);
  876. return n;
  877. }
  878. void indent() {
  879. if (level < MAX_LEVEL) level++;
  880. }
  881. void unindent() {
  882. if (level > 0) level--;
  883. }
  884. void setTabSize(uint8_t n) {
  885. if (n < MAX_TAB_SIZE) tabSize = n & MAX_TAB_SIZE;
  886. }
  887. private:
  888. Print *sink;
  889. uint8_t level : 4;
  890. uint8_t tabSize : 3;
  891. bool isNewLine : 1;
  892. size_t writeTabs() {
  893. size_t n = 0;
  894. for (int i = 0; i < level * tabSize; i++) n += sink->print(' ');
  895. return n;
  896. }
  897. static const int MAX_LEVEL = 15; // because it's only 4 bits
  898. static const int MAX_TAB_SIZE = 7; // because it's only 3 bits
  899. };
  900. } // namespace Internals
  901. } // namespace ArduinoJson
  902. namespace ArduinoJson {
  903. namespace Internals {
  904. class Encoding {
  905. public:
  906. static char escapeChar(char c) {
  907. const char *p = escapeTable(false);
  908. while (p[0] && p[1] != c) {
  909. p += 2;
  910. }
  911. return p[0];
  912. }
  913. static char unescapeChar(char c) {
  914. const char *p = escapeTable(true);
  915. for (;;) {
  916. if (p[0] == '\0') return c;
  917. if (p[0] == c) return p[1];
  918. p += 2;
  919. }
  920. }
  921. private:
  922. static const char *escapeTable(bool excludeIdenticals) {
  923. return &"\"\"\\\\b\bf\fn\nr\rt\t"[excludeIdenticals ? 4 : 0];
  924. }
  925. };
  926. } // namespace Internals
  927. } // namespace ArduinoJson
  928. namespace ArduinoJson {
  929. namespace Internals {
  930. template <typename T>
  931. bool isNaN(T x) {
  932. return x != x;
  933. }
  934. template <typename T>
  935. bool isInfinity(T x) {
  936. return x != 0.0 && x * 2 == x;
  937. }
  938. } // namespace Internals
  939. } // namespace ArduinoJson
  940. #include <stdlib.h> // for size_t
  941. namespace ArduinoJson {
  942. namespace Internals {
  943. template <typename T, typename F>
  944. struct alias_cast_t {
  945. union {
  946. F raw;
  947. T data;
  948. };
  949. };
  950. template <typename T, typename F>
  951. T alias_cast(F raw_data) {
  952. alias_cast_t<T, F> ac;
  953. ac.raw = raw_data;
  954. return ac.data;
  955. }
  956. } // namespace Internals
  957. } // namespace ArduinoJson
  958. namespace ArduinoJson {
  959. namespace Internals {
  960. template <typename T, size_t = sizeof(T)>
  961. struct FloatTraits {};
  962. template <typename T>
  963. struct FloatTraits<T, 8 /*64bits*/> {
  964. typedef int64_t mantissa_type;
  965. static const short mantissa_bits = 52;
  966. static const mantissa_type mantissa_max =
  967. (static_cast<mantissa_type>(1) << mantissa_bits) - 1;
  968. typedef int16_t exponent_type;
  969. static const exponent_type exponent_max = 308;
  970. template <typename TExponent>
  971. static T make_float(T m, TExponent e) {
  972. if (e > 0) {
  973. for (uint8_t index = 0; e != 0; index++) {
  974. if (e & 1) m *= positiveBinaryPowerOfTen(index);
  975. e >>= 1;
  976. }
  977. } else {
  978. e = TExponent(-e);
  979. for (uint8_t index = 0; e != 0; index++) {
  980. if (e & 1) m *= negativeBinaryPowerOfTen(index);
  981. e >>= 1;
  982. }
  983. }
  984. return m;
  985. }
  986. static T positiveBinaryPowerOfTen(int index) {
  987. static T factors[] = {
  988. 1e1,
  989. 1e2,
  990. 1e4,
  991. 1e8,
  992. 1e16,
  993. forge(0x4693B8B5, 0xB5056E17), // 1e32
  994. forge(0x4D384F03, 0xE93FF9F5), // 1e64
  995. forge(0x5A827748, 0xF9301D32), // 1e128
  996. forge(0x75154FDD, 0x7F73BF3C) // 1e256
  997. };
  998. return factors[index];
  999. }
  1000. static T negativeBinaryPowerOfTen(int index) {
  1001. static T factors[] = {
  1002. forge(0x3FB99999, 0x9999999A), // 1e-1
  1003. forge(0x3F847AE1, 0x47AE147B), // 1e-2
  1004. forge(0x3F1A36E2, 0xEB1C432D), // 1e-4
  1005. forge(0x3E45798E, 0xE2308C3A), // 1e-8
  1006. forge(0x3C9CD2B2, 0x97D889BC), // 1e-16
  1007. forge(0x3949F623, 0xD5A8A733), // 1e-32
  1008. forge(0x32A50FFD, 0x44F4A73D), // 1e-64
  1009. forge(0x255BBA08, 0xCF8C979D), // 1e-128
  1010. forge(0x0AC80628, 0x64AC6F43) // 1e-256
  1011. };
  1012. return factors[index];
  1013. }
  1014. static T negativeBinaryPowerOfTenPlusOne(int index) {
  1015. static T factors[] = {
  1016. 1e0,
  1017. forge(0x3FB99999, 0x9999999A), // 1e-1
  1018. forge(0x3F50624D, 0xD2F1A9FC), // 1e-3
  1019. forge(0x3E7AD7F2, 0x9ABCAF48), // 1e-7
  1020. forge(0x3CD203AF, 0x9EE75616), // 1e-15
  1021. forge(0x398039D6, 0x65896880), // 1e-31
  1022. forge(0x32DA53FC, 0x9631D10D), // 1e-63
  1023. forge(0x25915445, 0x81B7DEC2), // 1e-127
  1024. forge(0x0AFE07B2, 0x7DD78B14) // 1e-255
  1025. };
  1026. return factors[index];
  1027. }
  1028. static T nan() {
  1029. return forge(0x7ff80000, 0x00000000);
  1030. }
  1031. static T inf() {
  1032. return forge(0x7ff00000, 0x00000000);
  1033. }
  1034. static T forge(uint32_t msb, uint32_t lsb) {
  1035. return alias_cast<T>((uint64_t(msb) << 32) | lsb);
  1036. }
  1037. };
  1038. template <typename T>
  1039. struct FloatTraits<T, 4 /*32bits*/> {
  1040. typedef int32_t mantissa_type;
  1041. static const short mantissa_bits = 23;
  1042. static const mantissa_type mantissa_max =
  1043. (static_cast<mantissa_type>(1) << mantissa_bits) - 1;
  1044. typedef int8_t exponent_type;
  1045. static const exponent_type exponent_max = 38;
  1046. template <typename TExponent>
  1047. static T make_float(T m, TExponent e) {
  1048. if (e > 0) {
  1049. for (uint8_t index = 0; e != 0; index++) {
  1050. if (e & 1) m *= positiveBinaryPowerOfTen(index);
  1051. e >>= 1;
  1052. }
  1053. } else {
  1054. e = -e;
  1055. for (uint8_t index = 0; e != 0; index++) {
  1056. if (e & 1) m *= negativeBinaryPowerOfTen(index);
  1057. e >>= 1;
  1058. }
  1059. }
  1060. return m;
  1061. }
  1062. static T positiveBinaryPowerOfTen(int index) {
  1063. static T factors[] = {1e1f, 1e2f, 1e4f, 1e8f, 1e16f, 1e32f};
  1064. return factors[index];
  1065. }
  1066. static T negativeBinaryPowerOfTen(int index) {
  1067. static T factors[] = {1e-1f, 1e-2f, 1e-4f, 1e-8f, 1e-16f, 1e-32f};
  1068. return factors[index];
  1069. }
  1070. static T negativeBinaryPowerOfTenPlusOne(int index) {
  1071. static T factors[] = {1e0f, 1e-1f, 1e-3f, 1e-7f, 1e-15f, 1e-31f};
  1072. return factors[index];
  1073. }
  1074. static T forge(uint32_t bits) {
  1075. return alias_cast<T>(bits);
  1076. }
  1077. static T nan() {
  1078. return forge(0x7fc00000);
  1079. }
  1080. static T inf() {
  1081. return forge(0x7f800000);
  1082. }
  1083. };
  1084. } // namespace Internals
  1085. } // namespace ArduinoJson
  1086. namespace ArduinoJson {
  1087. namespace Internals {
  1088. template <typename TFloat>
  1089. struct FloatParts {
  1090. uint32_t integral;
  1091. uint32_t decimal;
  1092. int16_t exponent;
  1093. int8_t decimalPlaces;
  1094. FloatParts(TFloat value) {
  1095. uint32_t maxDecimalPart = sizeof(TFloat) >= 8 ? 1000000000 : 1000000;
  1096. decimalPlaces = sizeof(TFloat) >= 8 ? 9 : 6;
  1097. exponent = normalize(value);
  1098. integral = uint32_t(value);
  1099. for (uint32_t tmp = integral; tmp >= 10; tmp /= 10) {
  1100. maxDecimalPart /= 10;
  1101. decimalPlaces--;
  1102. }
  1103. TFloat remainder = (value - TFloat(integral)) * TFloat(maxDecimalPart);
  1104. decimal = uint32_t(remainder);
  1105. remainder = remainder - TFloat(decimal);
  1106. decimal += uint32_t(remainder * 2);
  1107. if (decimal >= maxDecimalPart) {
  1108. decimal = 0;
  1109. integral++;
  1110. if (exponent && integral >= 10) {
  1111. exponent++;
  1112. integral = 1;
  1113. }
  1114. }
  1115. while (decimal % 10 == 0 && decimalPlaces > 0) {
  1116. decimal /= 10;
  1117. decimalPlaces--;
  1118. }
  1119. }
  1120. static int16_t normalize(TFloat& value) {
  1121. typedef FloatTraits<TFloat> traits;
  1122. int16_t powersOf10 = 0;
  1123. int8_t index = sizeof(TFloat) == 8 ? 8 : 5;
  1124. int bit = 1 << index;
  1125. if (value >= ARDUINOJSON_POSITIVE_EXPONENTIATION_THRESHOLD) {
  1126. for (; index >= 0; index--) {
  1127. if (value >= traits::positiveBinaryPowerOfTen(index)) {
  1128. value *= traits::negativeBinaryPowerOfTen(index);
  1129. powersOf10 = int16_t(powersOf10 + bit);
  1130. }
  1131. bit >>= 1;
  1132. }
  1133. }
  1134. if (value > 0 && value <= ARDUINOJSON_NEGATIVE_EXPONENTIATION_THRESHOLD) {
  1135. for (; index >= 0; index--) {
  1136. if (value < traits::negativeBinaryPowerOfTenPlusOne(index)) {
  1137. value *= traits::positiveBinaryPowerOfTen(index);
  1138. powersOf10 = int16_t(powersOf10 - bit);
  1139. }
  1140. bit >>= 1;
  1141. }
  1142. }
  1143. return powersOf10;
  1144. }
  1145. };
  1146. } // namespace Internals
  1147. } // namespace ArduinoJson
  1148. namespace ArduinoJson {
  1149. namespace Internals {
  1150. template <typename Print>
  1151. class JsonWriter {
  1152. public:
  1153. explicit JsonWriter(Print &sink) : _sink(sink), _length(0) {}
  1154. size_t bytesWritten() const {
  1155. return _length;
  1156. }
  1157. void beginArray() {
  1158. writeRaw('[');
  1159. }
  1160. void endArray() {
  1161. writeRaw(']');
  1162. }
  1163. void beginObject() {
  1164. writeRaw('{');
  1165. }
  1166. void endObject() {
  1167. writeRaw('}');
  1168. }
  1169. void writeColon() {
  1170. writeRaw(':');
  1171. }
  1172. void writeComma() {
  1173. writeRaw(',');
  1174. }
  1175. void writeBoolean(bool value) {
  1176. writeRaw(value ? "true" : "false");
  1177. }
  1178. void writeString(const char *value) {
  1179. if (!value) {
  1180. writeRaw("null");
  1181. } else {
  1182. writeRaw('\"');
  1183. while (*value) writeChar(*value++);
  1184. writeRaw('\"');
  1185. }
  1186. }
  1187. void writeChar(char c) {
  1188. char specialChar = Encoding::escapeChar(c);
  1189. if (specialChar) {
  1190. writeRaw('\\');
  1191. writeRaw(specialChar);
  1192. } else {
  1193. writeRaw(c);
  1194. }
  1195. }
  1196. template <typename TFloat>
  1197. void writeFloat(TFloat value) {
  1198. if (isNaN(value)) return writeRaw("NaN");
  1199. if (value < 0.0) {
  1200. writeRaw('-');
  1201. value = -value;
  1202. }
  1203. if (isInfinity(value)) return writeRaw("Infinity");
  1204. FloatParts<TFloat> parts(value);
  1205. writeInteger(parts.integral);
  1206. if (parts.decimalPlaces) writeDecimals(parts.decimal, parts.decimalPlaces);
  1207. if (parts.exponent < 0) {
  1208. writeRaw("e-");
  1209. writeInteger(-parts.exponent);
  1210. }
  1211. if (parts.exponent > 0) {
  1212. writeRaw('e');
  1213. writeInteger(parts.exponent);
  1214. }
  1215. }
  1216. template <typename UInt>
  1217. void writeInteger(UInt value) {
  1218. char buffer[22];
  1219. char *end = buffer + sizeof(buffer) - 1;
  1220. char *ptr = end;
  1221. *ptr = 0;
  1222. do {
  1223. *--ptr = char(value % 10 + '0');
  1224. value = UInt(value / 10);
  1225. } while (value);
  1226. writeRaw(ptr);
  1227. }
  1228. void writeDecimals(uint32_t value, int8_t width) {
  1229. char buffer[16];
  1230. char *ptr = buffer + sizeof(buffer) - 1;
  1231. *ptr = 0;
  1232. while (width--) {
  1233. *--ptr = char(value % 10 + '0');
  1234. value /= 10;
  1235. }
  1236. *--ptr = '.';
  1237. writeRaw(ptr);
  1238. }
  1239. void writeRaw(const char *s) {
  1240. _length += _sink.print(s);
  1241. }
  1242. void writeRaw(char c) {
  1243. _length += _sink.print(c);
  1244. }
  1245. protected:
  1246. Print &_sink;
  1247. size_t _length;
  1248. private:
  1249. JsonWriter &operator=(const JsonWriter &); // cannot be assigned
  1250. };
  1251. } // namespace Internals
  1252. } // namespace ArduinoJson
  1253. namespace ArduinoJson {
  1254. class JsonArray;
  1255. class JsonObject;
  1256. class JsonVariant;
  1257. namespace Internals {
  1258. class JsonArraySubscript;
  1259. template <typename TKey>
  1260. class JsonObjectSubscript;
  1261. template <typename Writer>
  1262. class JsonSerializer {
  1263. public:
  1264. static void serialize(const JsonArray &, Writer &);
  1265. static void serialize(const JsonArraySubscript &, Writer &);
  1266. static void serialize(const JsonObject &, Writer &);
  1267. template <typename TKey>
  1268. static void serialize(const JsonObjectSubscript<TKey> &, Writer &);
  1269. static void serialize(const JsonVariant &, Writer &);
  1270. };
  1271. } // namespace Internals
  1272. } // namespace ArduinoJson
  1273. namespace ArduinoJson {
  1274. namespace Internals {
  1275. template <typename Print>
  1276. class Prettyfier {
  1277. public:
  1278. explicit Prettyfier(IndentedPrint<Print>& p) : _sink(p) {
  1279. _previousChar = 0;
  1280. _inString = false;
  1281. }
  1282. size_t print(char c) {
  1283. size_t n = _inString ? handleStringChar(c) : handleMarkupChar(c);
  1284. _previousChar = c;
  1285. return n;
  1286. }
  1287. size_t print(const char* s) {
  1288. size_t n = 0;
  1289. while (*s) n += print(*s++);
  1290. return n;
  1291. }
  1292. private:
  1293. Prettyfier& operator=(const Prettyfier&); // cannot be assigned
  1294. bool inEmptyBlock() {
  1295. return _previousChar == '{' || _previousChar == '[';
  1296. }
  1297. size_t handleStringChar(char c) {
  1298. bool isQuote = c == '"' && _previousChar != '\\';
  1299. if (isQuote) _inString = false;
  1300. return _sink.print(c);
  1301. }
  1302. size_t handleMarkupChar(char c) {
  1303. switch (c) {
  1304. case '{':
  1305. case '[':
  1306. return writeBlockOpen(c);
  1307. case '}':
  1308. case ']':
  1309. return writeBlockClose(c);
  1310. case ':':
  1311. return writeColon();
  1312. case ',':
  1313. return writeComma();
  1314. case '"':
  1315. return writeQuoteOpen();
  1316. default:
  1317. return writeNormalChar(c);
  1318. }
  1319. }
  1320. size_t writeBlockClose(char c) {
  1321. size_t n = 0;
  1322. n += unindentIfNeeded();
  1323. n += _sink.print(c);
  1324. return n;
  1325. }
  1326. size_t writeBlockOpen(char c) {
  1327. size_t n = 0;
  1328. n += indentIfNeeded();
  1329. n += _sink.print(c);
  1330. return n;
  1331. }
  1332. size_t writeColon() {
  1333. size_t n = 0;
  1334. n += _sink.print(": ");
  1335. return n;
  1336. }
  1337. size_t writeComma() {
  1338. size_t n = 0;
  1339. n += _sink.print(",\r\n");
  1340. return n;
  1341. }
  1342. size_t writeQuoteOpen() {
  1343. _inString = true;
  1344. size_t n = 0;
  1345. n += indentIfNeeded();
  1346. n += _sink.print('"');
  1347. return n;
  1348. }
  1349. size_t writeNormalChar(char c) {
  1350. size_t n = 0;
  1351. n += indentIfNeeded();
  1352. n += _sink.print(c);
  1353. return n;
  1354. }
  1355. size_t indentIfNeeded() {
  1356. if (!inEmptyBlock()) return 0;
  1357. _sink.indent();
  1358. return _sink.print("\r\n");
  1359. }
  1360. size_t unindentIfNeeded() {
  1361. if (inEmptyBlock()) return 0;
  1362. _sink.unindent();
  1363. return _sink.print("\r\n");
  1364. }
  1365. char _previousChar;
  1366. IndentedPrint<Print>& _sink;
  1367. bool _inString;
  1368. };
  1369. } // namespace Internals
  1370. } // namespace ArduinoJson
  1371. namespace ArduinoJson {
  1372. namespace Internals {
  1373. class StaticStringBuilder {
  1374. public:
  1375. StaticStringBuilder(char *buf, size_t size) : end(buf + size - 1), p(buf) {
  1376. *p = '\0';
  1377. }
  1378. size_t print(char c) {
  1379. if (p >= end) return 0;
  1380. *p++ = c;
  1381. *p = '\0';
  1382. return 1;
  1383. }
  1384. size_t print(const char *s) {
  1385. char *begin = p;
  1386. while (p < end && *s) *p++ = *s++;
  1387. *p = '\0';
  1388. return size_t(p - begin);
  1389. }
  1390. private:
  1391. char *end;
  1392. char *p;
  1393. };
  1394. } // namespace Internals
  1395. } // namespace ArduinoJson
  1396. #if ARDUINOJSON_ENABLE_STD_STREAM
  1397. #if ARDUINOJSON_ENABLE_STD_STREAM
  1398. #include <ostream>
  1399. namespace ArduinoJson {
  1400. namespace Internals {
  1401. class StreamPrintAdapter {
  1402. public:
  1403. explicit StreamPrintAdapter(std::ostream& os) : _os(os) {}
  1404. size_t print(char c) {
  1405. _os << c;
  1406. return 1;
  1407. }
  1408. size_t print(const char* s) {
  1409. _os << s;
  1410. return strlen(s);
  1411. }
  1412. private:
  1413. StreamPrintAdapter& operator=(const StreamPrintAdapter&);
  1414. std::ostream& _os;
  1415. };
  1416. } // namespace Internals
  1417. } // namespace ArduinoJson
  1418. #endif // ARDUINOJSON_ENABLE_STD_STREAM
  1419. #endif
  1420. namespace ArduinoJson {
  1421. namespace Internals {
  1422. template <typename T>
  1423. class JsonPrintable {
  1424. public:
  1425. template <typename Print>
  1426. typename EnableIf<!StringTraits<Print>::has_append, size_t>::type printTo(
  1427. Print &print) const {
  1428. JsonWriter<Print> writer(print);
  1429. JsonSerializer<JsonWriter<Print> >::serialize(downcast(), writer);
  1430. return writer.bytesWritten();
  1431. }
  1432. #if ARDUINOJSON_ENABLE_STD_STREAM
  1433. std::ostream &printTo(std::ostream &os) const {
  1434. StreamPrintAdapter adapter(os);
  1435. printTo(adapter);
  1436. return os;
  1437. }
  1438. #endif
  1439. size_t printTo(char *buffer, size_t bufferSize) const {
  1440. StaticStringBuilder sb(buffer, bufferSize);
  1441. return printTo(sb);
  1442. }
  1443. template <size_t N>
  1444. size_t printTo(char (&buffer)[N]) const {
  1445. return printTo(buffer, N);
  1446. }
  1447. template <typename TString>
  1448. typename EnableIf<StringTraits<TString>::has_append, size_t>::type printTo(
  1449. TString &str) const {
  1450. DynamicStringBuilder<TString> sb(str);
  1451. return printTo(sb);
  1452. }
  1453. template <typename Print>
  1454. size_t prettyPrintTo(IndentedPrint<Print> &print) const {
  1455. Prettyfier<Print> p(print);
  1456. return printTo(p);
  1457. }
  1458. size_t prettyPrintTo(char *buffer, size_t bufferSize) const {
  1459. StaticStringBuilder sb(buffer, bufferSize);
  1460. return prettyPrintTo(sb);
  1461. }
  1462. template <size_t N>
  1463. size_t prettyPrintTo(char (&buffer)[N]) const {
  1464. return prettyPrintTo(buffer, N);
  1465. }
  1466. template <typename Print>
  1467. typename EnableIf<!StringTraits<Print>::has_append, size_t>::type
  1468. prettyPrintTo(Print &print) const {
  1469. IndentedPrint<Print> indentedPrint(print);
  1470. return prettyPrintTo(indentedPrint);
  1471. }
  1472. template <typename TString>
  1473. typename EnableIf<StringTraits<TString>::has_append, size_t>::type
  1474. prettyPrintTo(TString &str) const {
  1475. DynamicStringBuilder<TString> sb(str);
  1476. return prettyPrintTo(sb);
  1477. }
  1478. size_t measureLength() const {
  1479. DummyPrint dp;
  1480. return printTo(dp);
  1481. }
  1482. size_t measurePrettyLength() const {
  1483. DummyPrint dp;
  1484. return prettyPrintTo(dp);
  1485. }
  1486. private:
  1487. const T &downcast() const {
  1488. return *static_cast<const T *>(this);
  1489. }
  1490. };
  1491. #if ARDUINOJSON_ENABLE_STD_STREAM
  1492. template <typename T>
  1493. inline std::ostream &operator<<(std::ostream &os, const JsonPrintable<T> &v) {
  1494. return v.printTo(os);
  1495. }
  1496. #endif
  1497. } // namespace Internals
  1498. } // namespace ArduinoJson
  1499. namespace ArduinoJson {
  1500. namespace Internals {
  1501. template <typename TImpl>
  1502. class JsonVariantBase : public JsonPrintable<TImpl>,
  1503. public JsonVariantCasts<TImpl>,
  1504. public JsonVariantComparisons<TImpl>,
  1505. public JsonVariantOr<TImpl>,
  1506. public JsonVariantSubscripts<TImpl>,
  1507. public JsonVariantTag {};
  1508. } // namespace Internals
  1509. } // namespace ArduinoJson
  1510. namespace ArduinoJson {
  1511. namespace Internals {
  1512. template <typename T>
  1513. class RawJsonString {
  1514. public:
  1515. explicit RawJsonString(T str) : _str(str) {}
  1516. operator T() const {
  1517. return _str;
  1518. }
  1519. private:
  1520. T _str;
  1521. };
  1522. template <typename String>
  1523. struct StringTraits<RawJsonString<String>, void> {
  1524. static bool is_null(RawJsonString<String> source) {
  1525. return StringTraits<String>::is_null(static_cast<String>(source));
  1526. }
  1527. typedef RawJsonString<const char*> duplicate_t;
  1528. template <typename Buffer>
  1529. static duplicate_t duplicate(RawJsonString<String> source, Buffer* buffer) {
  1530. return duplicate_t(StringTraits<String>::duplicate(source, buffer));
  1531. }
  1532. static const bool has_append = false;
  1533. static const bool has_equals = false;
  1534. static const bool should_duplicate = StringTraits<String>::should_duplicate;
  1535. };
  1536. } // namespace Internals
  1537. template <typename T>
  1538. inline Internals::RawJsonString<T> RawJson(T str) {
  1539. return Internals::RawJsonString<T>(str);
  1540. }
  1541. } // namespace ArduinoJson
  1542. namespace ArduinoJson {
  1543. namespace Internals {
  1544. template <typename T>
  1545. struct IsFloatingPoint {
  1546. static const bool value = IsSame<T, float>::value || IsSame<T, double>::value;
  1547. };
  1548. } // namespace Internals
  1549. } // namespace ArduinoJson
  1550. namespace ArduinoJson {
  1551. namespace Internals {
  1552. template <typename T>
  1553. struct RemoveConst {
  1554. typedef T type;
  1555. };
  1556. template <typename T>
  1557. struct RemoveConst<const T> {
  1558. typedef T type;
  1559. };
  1560. } // namespace Internals
  1561. } // namespace ArduinoJson
  1562. namespace ArduinoJson {
  1563. class JsonArray;
  1564. class JsonObject;
  1565. class JsonVariant : public Internals::JsonVariantBase<JsonVariant> {
  1566. template <typename Print>
  1567. friend class Internals::JsonSerializer;
  1568. public:
  1569. JsonVariant() : _type(Internals::JSON_UNDEFINED) {}
  1570. JsonVariant(bool value) {
  1571. using namespace Internals;
  1572. _type = JSON_BOOLEAN;
  1573. _content.asInteger = static_cast<JsonUInt>(value);
  1574. }
  1575. template <typename T>
  1576. JsonVariant(T value, typename Internals::EnableIf<
  1577. Internals::IsFloatingPoint<T>::value>::type * = 0) {
  1578. using namespace Internals;
  1579. _type = JSON_FLOAT;
  1580. _content.asFloat = static_cast<JsonFloat>(value);
  1581. }
  1582. template <typename T>
  1583. DEPRECATED("Second argument is not supported anymore")
  1584. JsonVariant(T value, uint8_t,
  1585. typename Internals::EnableIf<
  1586. Internals::IsFloatingPoint<T>::value>::type * = 0) {
  1587. using namespace Internals;
  1588. _type = JSON_FLOAT;
  1589. _content.asFloat = static_cast<JsonFloat>(value);
  1590. }
  1591. template <typename T>
  1592. JsonVariant(
  1593. T value,
  1594. typename Internals::EnableIf<Internals::IsSignedIntegral<T>::value ||
  1595. Internals::IsSame<T, char>::value>::type * =
  1596. 0) {
  1597. using namespace Internals;
  1598. if (value >= 0) {
  1599. _type = JSON_POSITIVE_INTEGER;
  1600. _content.asInteger = static_cast<JsonUInt>(value);
  1601. } else {
  1602. _type = JSON_NEGATIVE_INTEGER;
  1603. _content.asInteger = static_cast<JsonUInt>(-value);
  1604. }
  1605. }
  1606. template <typename T>
  1607. JsonVariant(T value,
  1608. typename Internals::EnableIf<
  1609. Internals::IsUnsignedIntegral<T>::value>::type * = 0) {
  1610. using namespace Internals;
  1611. _type = JSON_POSITIVE_INTEGER;
  1612. _content.asInteger = static_cast<JsonUInt>(value);
  1613. }
  1614. template <typename TChar>
  1615. JsonVariant(
  1616. const TChar *value,
  1617. typename Internals::EnableIf<Internals::IsChar<TChar>::value>::type * =
  1618. 0) {
  1619. _type = Internals::JSON_STRING;
  1620. _content.asString = reinterpret_cast<const char *>(value);
  1621. }
  1622. JsonVariant(Internals::RawJsonString<const char *> value) {
  1623. _type = Internals::JSON_UNPARSED;
  1624. _content.asString = value;
  1625. }
  1626. JsonVariant(const JsonArray &array);
  1627. JsonVariant(const JsonObject &object);
  1628. template <typename T>
  1629. const typename Internals::EnableIf<Internals::IsIntegral<T>::value, T>::type
  1630. as() const {
  1631. return variantAsInteger<T>();
  1632. }
  1633. template <typename T>
  1634. const typename Internals::EnableIf<Internals::IsSame<T, bool>::value, T>::type
  1635. as() const {
  1636. return variantAsInteger<int>() != 0;
  1637. }
  1638. template <typename T>
  1639. const typename Internals::EnableIf<Internals::IsFloatingPoint<T>::value,
  1640. T>::type
  1641. as() const {
  1642. return variantAsFloat<T>();
  1643. }
  1644. template <typename T>
  1645. typename Internals::EnableIf<Internals::IsSame<T, const char *>::value ||
  1646. Internals::IsSame<T, char *>::value,
  1647. const char *>::type
  1648. as() const {
  1649. return variantAsString();
  1650. }
  1651. template <typename T>
  1652. typename Internals::EnableIf<Internals::StringTraits<T>::has_append, T>::type
  1653. as() const {
  1654. const char *cstr = variantAsString();
  1655. if (cstr) return T(cstr);
  1656. T s;
  1657. printTo(s);
  1658. return s;
  1659. }
  1660. template <typename T>
  1661. typename Internals::EnableIf<
  1662. Internals::IsSame<typename Internals::RemoveReference<T>::type,
  1663. JsonArray>::value,
  1664. JsonArray &>::type
  1665. as() const {
  1666. return variantAsArray();
  1667. }
  1668. template <typename T>
  1669. typename Internals::EnableIf<
  1670. Internals::IsSame<typename Internals::RemoveReference<T>::type,
  1671. const JsonArray>::value,
  1672. const JsonArray &>::type
  1673. as() const {
  1674. return variantAsArray();
  1675. }
  1676. template <typename T>
  1677. typename Internals::EnableIf<
  1678. Internals::IsSame<typename Internals::RemoveReference<T>::type,
  1679. JsonObject>::value,
  1680. JsonObject &>::type
  1681. as() const {
  1682. return variantAsObject();
  1683. }
  1684. template <typename T>
  1685. typename Internals::EnableIf<
  1686. Internals::IsSame<typename Internals::RemoveReference<T>::type,
  1687. const JsonObject>::value,
  1688. const JsonObject &>::type
  1689. as() const {
  1690. return variantAsObject();
  1691. }
  1692. template <typename T>
  1693. typename Internals::EnableIf<Internals::IsSame<T, JsonVariant>::value,
  1694. T>::type
  1695. as() const {
  1696. return *this;
  1697. }
  1698. template <typename T>
  1699. typename Internals::EnableIf<Internals::IsIntegral<T>::value, bool>::type is()
  1700. const {
  1701. return variantIsInteger();
  1702. }
  1703. template <typename T>
  1704. typename Internals::EnableIf<Internals::IsFloatingPoint<T>::value, bool>::type
  1705. is() const {
  1706. return variantIsFloat();
  1707. }
  1708. template <typename T>
  1709. typename Internals::EnableIf<Internals::IsSame<T, bool>::value, bool>::type
  1710. is() const {
  1711. return variantIsBoolean();
  1712. }
  1713. template <typename T>
  1714. typename Internals::EnableIf<Internals::IsSame<T, const char *>::value ||
  1715. Internals::IsSame<T, char *>::value ||
  1716. Internals::StringTraits<T>::has_append,
  1717. bool>::type
  1718. is() const {
  1719. return variantIsString();
  1720. }
  1721. template <typename T>
  1722. typename Internals::EnableIf<
  1723. Internals::IsSame<typename Internals::RemoveConst<
  1724. typename Internals::RemoveReference<T>::type>::type,
  1725. JsonArray>::value,
  1726. bool>::type
  1727. is() const {
  1728. return variantIsArray();
  1729. }
  1730. template <typename T>
  1731. typename Internals::EnableIf<
  1732. Internals::IsSame<typename Internals::RemoveConst<
  1733. typename Internals::RemoveReference<T>::type>::type,
  1734. JsonObject>::value,
  1735. bool>::type
  1736. is() const {
  1737. return variantIsObject();
  1738. }
  1739. bool success() const {
  1740. return _type != Internals::JSON_UNDEFINED;
  1741. }
  1742. private:
  1743. JsonArray &variantAsArray() const;
  1744. JsonObject &variantAsObject() const;
  1745. const char *variantAsString() const;
  1746. template <typename T>
  1747. T variantAsFloat() const;
  1748. template <typename T>
  1749. T variantAsInteger() const;
  1750. bool variantIsBoolean() const;
  1751. bool variantIsFloat() const;
  1752. bool variantIsInteger() const;
  1753. bool variantIsArray() const {
  1754. return _type == Internals::JSON_ARRAY;
  1755. }
  1756. bool variantIsObject() const {
  1757. return _type == Internals::JSON_OBJECT;
  1758. }
  1759. bool variantIsString() const {
  1760. return _type == Internals::JSON_STRING ||
  1761. (_type == Internals::JSON_UNPARSED && _content.asString &&
  1762. !strcmp("null", _content.asString));
  1763. }
  1764. Internals::JsonVariantType _type;
  1765. Internals::JsonVariantContent _content;
  1766. };
  1767. DEPRECATED("Decimal places are ignored, use the float value instead")
  1768. inline JsonVariant float_with_n_digits(float value, uint8_t) {
  1769. return JsonVariant(value);
  1770. }
  1771. DEPRECATED("Decimal places are ignored, use the double value instead")
  1772. inline JsonVariant double_with_n_digits(double value, uint8_t) {
  1773. return JsonVariant(value);
  1774. }
  1775. } // namespace ArduinoJson
  1776. namespace ArduinoJson {
  1777. namespace Internals {
  1778. template <typename T>
  1779. struct IsArray {
  1780. static const bool value = false;
  1781. };
  1782. template <typename T>
  1783. struct IsArray<T[]> {
  1784. static const bool value = true;
  1785. };
  1786. template <typename T, size_t N>
  1787. struct IsArray<T[N]> {
  1788. static const bool value = true;
  1789. };
  1790. } // namespace Internals
  1791. } // namespace ArduinoJson
  1792. namespace ArduinoJson {
  1793. class JsonArray;
  1794. class JsonObject;
  1795. class JsonBuffer : Internals::NonCopyable {
  1796. public:
  1797. JsonArray &createArray();
  1798. JsonObject &createObject();
  1799. template <typename TString>
  1800. DEPRECATED("char* are duplicated, you don't need strdup() anymore")
  1801. typename Internals::EnableIf<!Internals::IsArray<TString>::value,
  1802. const char *>::type strdup(const TString &src) {
  1803. return Internals::StringTraits<TString>::duplicate(src, this);
  1804. }
  1805. template <typename TString>
  1806. DEPRECATED("char* are duplicated, you don't need strdup() anymore")
  1807. const char *strdup(TString *src) {
  1808. return Internals::StringTraits<TString *>::duplicate(src, this);
  1809. }
  1810. virtual void *alloc(size_t size) = 0;
  1811. protected:
  1812. ~JsonBuffer() {}
  1813. static FORCE_INLINE size_t round_size_up(size_t bytes) {
  1814. #if ARDUINOJSON_ENABLE_ALIGNMENT
  1815. const size_t x = sizeof(void *) - 1;
  1816. return (bytes + x) & ~x;
  1817. #else
  1818. return bytes;
  1819. #endif
  1820. }
  1821. };
  1822. } // namespace ArduinoJson
  1823. namespace ArduinoJson {
  1824. namespace Internals {
  1825. template <typename TChar>
  1826. class StringWriter {
  1827. public:
  1828. class String {
  1829. public:
  1830. String(TChar** ptr) : _writePtr(ptr), _startPtr(*ptr) {}
  1831. void append(char c) {
  1832. *(*_writePtr)++ = TChar(c);
  1833. }
  1834. const char* c_str() const {
  1835. *(*_writePtr)++ = 0;
  1836. return reinterpret_cast<const char*>(_startPtr);
  1837. }
  1838. private:
  1839. TChar** _writePtr;
  1840. TChar* _startPtr;
  1841. };
  1842. StringWriter(TChar* buffer) : _ptr(buffer) {}
  1843. String startString() {
  1844. return String(&_ptr);
  1845. }
  1846. private:
  1847. TChar* _ptr;
  1848. };
  1849. } // namespace Internals
  1850. } // namespace ArduinoJson
  1851. namespace ArduinoJson {
  1852. namespace Internals {
  1853. template <typename TReader, typename TWriter>
  1854. class JsonParser {
  1855. public:
  1856. JsonParser(JsonBuffer *buffer, TReader reader, TWriter writer,
  1857. uint8_t nestingLimit)
  1858. : _buffer(buffer),
  1859. _reader(reader),
  1860. _writer(writer),
  1861. _nestingLimit(nestingLimit) {}
  1862. JsonArray &parseArray();
  1863. JsonObject &parseObject();
  1864. JsonVariant parseVariant() {
  1865. JsonVariant result;
  1866. parseAnythingTo(&result);
  1867. return result;
  1868. }
  1869. private:
  1870. JsonParser &operator=(const JsonParser &); // non-copiable
  1871. static bool eat(TReader &, char charToSkip);
  1872. FORCE_INLINE bool eat(char charToSkip) {
  1873. return eat(_reader, charToSkip);
  1874. }
  1875. const char *parseString();
  1876. bool parseAnythingTo(JsonVariant *destination);
  1877. inline bool parseArrayTo(JsonVariant *destination);
  1878. inline bool parseObjectTo(JsonVariant *destination);
  1879. inline bool parseStringTo(JsonVariant *destination);
  1880. static inline bool isBetween(char c, char min, char max) {
  1881. return min <= c && c <= max;
  1882. }
  1883. static inline bool canBeInNonQuotedString(char c) {
  1884. return isBetween(c, '0', '9') || isBetween(c, '_', 'z') ||
  1885. isBetween(c, 'A', 'Z') || c == '+' || c == '-' || c == '.';
  1886. }
  1887. static inline bool isQuote(char c) {
  1888. return c == '\'' || c == '\"';
  1889. }
  1890. JsonBuffer *_buffer;
  1891. TReader _reader;
  1892. TWriter _writer;
  1893. uint8_t _nestingLimit;
  1894. };
  1895. template <typename TJsonBuffer, typename TString, typename Enable = void>
  1896. struct JsonParserBuilder {
  1897. typedef typename StringTraits<TString>::Reader InputReader;
  1898. typedef JsonParser<InputReader, TJsonBuffer &> TParser;
  1899. static TParser makeParser(TJsonBuffer *buffer, TString &json,
  1900. uint8_t nestingLimit) {
  1901. return TParser(buffer, InputReader(json), *buffer, nestingLimit);
  1902. }
  1903. };
  1904. template <typename TJsonBuffer, typename TChar>
  1905. struct JsonParserBuilder<TJsonBuffer, TChar *,
  1906. typename EnableIf<!IsConst<TChar>::value>::type> {
  1907. typedef typename StringTraits<TChar *>::Reader TReader;
  1908. typedef StringWriter<TChar> TWriter;
  1909. typedef JsonParser<TReader, TWriter> TParser;
  1910. static TParser makeParser(TJsonBuffer *buffer, TChar *json,
  1911. uint8_t nestingLimit) {
  1912. return TParser(buffer, TReader(json), TWriter(json), nestingLimit);
  1913. }
  1914. };
  1915. template <typename TJsonBuffer, typename TString>
  1916. inline typename JsonParserBuilder<TJsonBuffer, TString>::TParser makeParser(
  1917. TJsonBuffer *buffer, TString &json, uint8_t nestingLimit) {
  1918. return JsonParserBuilder<TJsonBuffer, TString>::makeParser(buffer, json,
  1919. nestingLimit);
  1920. }
  1921. } // namespace Internals
  1922. } // namespace ArduinoJson
  1923. namespace ArduinoJson {
  1924. namespace Internals {
  1925. template <typename TDerived>
  1926. class JsonBufferBase : public JsonBuffer {
  1927. public:
  1928. template <typename TString>
  1929. typename Internals::EnableIf<!Internals::IsArray<TString>::value,
  1930. JsonArray &>::type
  1931. parseArray(const TString &json,
  1932. uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) {
  1933. return Internals::makeParser(that(), json, nestingLimit).parseArray();
  1934. }
  1935. template <typename TString>
  1936. JsonArray &parseArray(
  1937. TString *json, uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) {
  1938. return Internals::makeParser(that(), json, nestingLimit).parseArray();
  1939. }
  1940. template <typename TString>
  1941. JsonArray &parseArray(
  1942. TString &json, uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) {
  1943. return Internals::makeParser(that(), json, nestingLimit).parseArray();
  1944. }
  1945. template <typename TString>
  1946. typename Internals::EnableIf<!Internals::IsArray<TString>::value,
  1947. JsonObject &>::type
  1948. parseObject(const TString &json,
  1949. uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) {
  1950. return Internals::makeParser(that(), json, nestingLimit).parseObject();
  1951. }
  1952. template <typename TString>
  1953. JsonObject &parseObject(
  1954. TString *json, uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) {
  1955. return Internals::makeParser(that(), json, nestingLimit).parseObject();
  1956. }
  1957. template <typename TString>
  1958. JsonObject &parseObject(
  1959. TString &json, uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) {
  1960. return Internals::makeParser(that(), json, nestingLimit).parseObject();
  1961. }
  1962. template <typename TString>
  1963. typename Internals::EnableIf<!Internals::IsArray<TString>::value,
  1964. JsonVariant>::type
  1965. parse(const TString &json,
  1966. uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) {
  1967. return Internals::makeParser(that(), json, nestingLimit).parseVariant();
  1968. }
  1969. template <typename TString>
  1970. JsonVariant parse(TString *json,
  1971. uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) {
  1972. return Internals::makeParser(that(), json, nestingLimit).parseVariant();
  1973. }
  1974. template <typename TString>
  1975. JsonVariant parse(TString &json,
  1976. uint8_t nestingLimit = ARDUINOJSON_DEFAULT_NESTING_LIMIT) {
  1977. return Internals::makeParser(that(), json, nestingLimit).parseVariant();
  1978. }
  1979. protected:
  1980. ~JsonBufferBase() {}
  1981. private:
  1982. TDerived *that() {
  1983. return static_cast<TDerived *>(this);
  1984. }
  1985. };
  1986. } // namespace Internals
  1987. } // namespace ArduinoJson
  1988. #if defined(__clang__)
  1989. #pragma clang diagnostic push
  1990. #pragma clang diagnostic ignored "-Wnon-virtual-dtor"
  1991. #elif defined(__GNUC__)
  1992. #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
  1993. #pragma GCC diagnostic push
  1994. #endif
  1995. #pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
  1996. #endif
  1997. namespace ArduinoJson {
  1998. namespace Internals {
  1999. class DefaultAllocator {
  2000. public:
  2001. void* allocate(size_t size) {
  2002. return malloc(size);
  2003. }
  2004. void deallocate(void* pointer) {
  2005. free(pointer);
  2006. }
  2007. };
  2008. template <typename TAllocator>
  2009. class DynamicJsonBufferBase
  2010. : public JsonBufferBase<DynamicJsonBufferBase<TAllocator> > {
  2011. struct Block;
  2012. struct EmptyBlock {
  2013. Block* next;
  2014. size_t capacity;
  2015. size_t size;
  2016. };
  2017. struct Block : EmptyBlock {
  2018. uint8_t data[1];
  2019. };
  2020. public:
  2021. enum { EmptyBlockSize = sizeof(EmptyBlock) };
  2022. DynamicJsonBufferBase(size_t initialSize = 256)
  2023. : _head(NULL), _nextBlockCapacity(initialSize) {}
  2024. ~DynamicJsonBufferBase() {
  2025. clear();
  2026. }
  2027. size_t size() const {
  2028. size_t total = 0;
  2029. for (const Block* b = _head; b; b = b->next) total += b->size;
  2030. return total;
  2031. }
  2032. virtual void* alloc(size_t bytes) {
  2033. alignNextAlloc();
  2034. return canAllocInHead(bytes) ? allocInHead(bytes) : allocInNewBlock(bytes);
  2035. }
  2036. void clear() {
  2037. Block* currentBlock = _head;
  2038. while (currentBlock != NULL) {
  2039. _nextBlockCapacity = currentBlock->capacity;
  2040. Block* nextBlock = currentBlock->next;
  2041. _allocator.deallocate(currentBlock);
  2042. currentBlock = nextBlock;
  2043. }
  2044. _head = 0;
  2045. }
  2046. class String {
  2047. public:
  2048. String(DynamicJsonBufferBase* parent)
  2049. : _parent(parent), _start(NULL), _length(0) {}
  2050. void append(char c) {
  2051. if (_parent->canAllocInHead(1)) {
  2052. char* end = static_cast<char*>(_parent->allocInHead(1));
  2053. *end = c;
  2054. if (_length == 0) _start = end;
  2055. } else {
  2056. char* newStart =
  2057. static_cast<char*>(_parent->allocInNewBlock(_length + 1));
  2058. if (_start && newStart) memcpy(newStart, _start, _length);
  2059. if (newStart) newStart[_length] = c;
  2060. _start = newStart;
  2061. }
  2062. _length++;
  2063. }
  2064. const char* c_str() {
  2065. append(0);
  2066. return _start;
  2067. }
  2068. private:
  2069. DynamicJsonBufferBase* _parent;
  2070. char* _start;
  2071. size_t _length;
  2072. };
  2073. String startString() {
  2074. return String(this);
  2075. }
  2076. private:
  2077. void alignNextAlloc() {
  2078. if (_head) _head->size = this->round_size_up(_head->size);
  2079. }
  2080. bool canAllocInHead(size_t bytes) const {
  2081. return _head != NULL && _head->size + bytes <= _head->capacity;
  2082. }
  2083. void* allocInHead(size_t bytes) {
  2084. void* p = _head->data + _head->size;
  2085. _head->size += bytes;
  2086. return p;
  2087. }
  2088. void* allocInNewBlock(size_t bytes) {
  2089. size_t capacity = _nextBlockCapacity;
  2090. if (bytes > capacity) capacity = bytes;
  2091. if (!addNewBlock(capacity)) return NULL;
  2092. _nextBlockCapacity *= 2;
  2093. return allocInHead(bytes);
  2094. }
  2095. bool addNewBlock(size_t capacity) {
  2096. size_t bytes = EmptyBlockSize + capacity;
  2097. Block* block = static_cast<Block*>(_allocator.allocate(bytes));
  2098. if (block == NULL) return false;
  2099. block->capacity = capacity;
  2100. block->size = 0;
  2101. block->next = _head;
  2102. _head = block;
  2103. return true;
  2104. }
  2105. TAllocator _allocator;
  2106. Block* _head;
  2107. size_t _nextBlockCapacity;
  2108. };
  2109. } // namespace Internals
  2110. #if defined(__clang__)
  2111. #pragma clang diagnostic pop
  2112. #elif defined(__GNUC__)
  2113. #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
  2114. #pragma GCC diagnostic pop
  2115. #endif
  2116. #endif
  2117. typedef Internals::DynamicJsonBufferBase<Internals::DefaultAllocator>
  2118. DynamicJsonBuffer;
  2119. } // namespace ArduinoJson
  2120. namespace ArduinoJson {
  2121. namespace Internals {
  2122. class JsonBufferAllocated {
  2123. public:
  2124. void *operator new(size_t n, JsonBuffer *jsonBuffer) throw() {
  2125. if (!jsonBuffer) return NULL;
  2126. return jsonBuffer->alloc(n);
  2127. }
  2128. void operator delete(void *, JsonBuffer *)throw();
  2129. };
  2130. } // namespace Internals
  2131. } // namespace ArduinoJson
  2132. namespace ArduinoJson {
  2133. namespace Internals {
  2134. template <typename T>
  2135. struct ListNode : public Internals::JsonBufferAllocated {
  2136. ListNode() throw() : next(NULL) {}
  2137. ListNode<T> *next;
  2138. T content;
  2139. };
  2140. } // namespace Internals
  2141. } // namespace ArduinoJson
  2142. namespace ArduinoJson {
  2143. namespace Internals {
  2144. template <typename T>
  2145. class ListConstIterator {
  2146. public:
  2147. explicit ListConstIterator(const ListNode<T> *node = NULL) : _node(node) {}
  2148. const T &operator*() const {
  2149. return _node->content;
  2150. }
  2151. const T *operator->() {
  2152. return &_node->content;
  2153. }
  2154. bool operator==(const ListConstIterator<T> &other) const {
  2155. return _node == other._node;
  2156. }
  2157. bool operator!=(const ListConstIterator<T> &other) const {
  2158. return _node != other._node;
  2159. }
  2160. ListConstIterator<T> &operator++() {
  2161. if (_node) _node = _node->next;
  2162. return *this;
  2163. }
  2164. ListConstIterator<T> &operator+=(size_t distance) {
  2165. while (_node && distance) {
  2166. _node = _node->next;
  2167. --distance;
  2168. }
  2169. return *this;
  2170. }
  2171. private:
  2172. const ListNode<T> *_node;
  2173. };
  2174. } // namespace Internals
  2175. } // namespace ArduinoJson
  2176. namespace ArduinoJson {
  2177. namespace Internals {
  2178. template <typename T>
  2179. class List;
  2180. template <typename T>
  2181. class ListIterator {
  2182. friend class List<T>;
  2183. public:
  2184. explicit ListIterator(ListNode<T> *node = NULL) : _node(node) {}
  2185. T &operator*() const {
  2186. return _node->content;
  2187. }
  2188. T *operator->() {
  2189. return &_node->content;
  2190. }
  2191. bool operator==(const ListIterator<T> &other) const {
  2192. return _node == other._node;
  2193. }
  2194. bool operator!=(const ListIterator<T> &other) const {
  2195. return _node != other._node;
  2196. }
  2197. ListIterator<T> &operator++() {
  2198. if (_node) _node = _node->next;
  2199. return *this;
  2200. }
  2201. ListIterator<T> &operator+=(size_t distance) {
  2202. while (_node && distance) {
  2203. _node = _node->next;
  2204. --distance;
  2205. }
  2206. return *this;
  2207. }
  2208. operator ListConstIterator<T>() const {
  2209. return ListConstIterator<T>(_node);
  2210. }
  2211. private:
  2212. ListNode<T> *_node;
  2213. };
  2214. } // namespace Internals
  2215. } // namespace ArduinoJson
  2216. namespace ArduinoJson {
  2217. namespace Internals {
  2218. template <typename T>
  2219. class List {
  2220. public:
  2221. typedef T value_type;
  2222. typedef ListNode<T> node_type;
  2223. typedef ListIterator<T> iterator;
  2224. typedef ListConstIterator<T> const_iterator;
  2225. explicit List(JsonBuffer *buffer) : _buffer(buffer), _firstNode(NULL) {}
  2226. bool success() const {
  2227. return _buffer != NULL;
  2228. }
  2229. size_t size() const {
  2230. size_t nodeCount = 0;
  2231. for (node_type *node = _firstNode; node; node = node->next) nodeCount++;
  2232. return nodeCount;
  2233. }
  2234. iterator add() {
  2235. node_type *newNode = new (_buffer) node_type();
  2236. if (_firstNode) {
  2237. node_type *lastNode = _firstNode;
  2238. while (lastNode->next) lastNode = lastNode->next;
  2239. lastNode->next = newNode;
  2240. } else {
  2241. _firstNode = newNode;
  2242. }
  2243. return iterator(newNode);
  2244. }
  2245. iterator begin() {
  2246. return iterator(_firstNode);
  2247. }
  2248. iterator end() {
  2249. return iterator(NULL);
  2250. }
  2251. const_iterator begin() const {
  2252. return const_iterator(_firstNode);
  2253. }
  2254. const_iterator end() const {
  2255. return const_iterator(NULL);
  2256. }
  2257. void remove(iterator it) {
  2258. node_type *nodeToRemove = it._node;
  2259. if (!nodeToRemove) return;
  2260. if (nodeToRemove == _firstNode) {
  2261. _firstNode = nodeToRemove->next;
  2262. } else {
  2263. for (node_type *node = _firstNode; node; node = node->next)
  2264. if (node->next == nodeToRemove) node->next = nodeToRemove->next;
  2265. }
  2266. }
  2267. protected:
  2268. JsonBuffer *_buffer;
  2269. private:
  2270. node_type *_firstNode;
  2271. };
  2272. } // namespace Internals
  2273. } // namespace ArduinoJson
  2274. namespace ArduinoJson {
  2275. namespace Internals {
  2276. class ReferenceType {
  2277. public:
  2278. bool operator==(const ReferenceType& other) const {
  2279. return this == &other;
  2280. }
  2281. bool operator!=(const ReferenceType& other) const {
  2282. return this != &other;
  2283. }
  2284. };
  2285. } // namespace Internals
  2286. } // namespace ArduinoJson
  2287. namespace ArduinoJson {
  2288. namespace Internals {
  2289. template <typename Source, typename Enable = void>
  2290. struct ValueSaver {
  2291. template <typename Destination>
  2292. static bool save(JsonBuffer*, Destination& destination, Source source) {
  2293. destination = source;
  2294. return true;
  2295. }
  2296. };
  2297. template <typename Source>
  2298. struct ValueSaver<
  2299. Source, typename EnableIf<StringTraits<Source>::should_duplicate>::type> {
  2300. template <typename Destination>
  2301. static bool save(JsonBuffer* buffer, Destination& dest, Source source) {
  2302. if (!StringTraits<Source>::is_null(source)) {
  2303. typename StringTraits<Source>::duplicate_t dup =
  2304. StringTraits<Source>::duplicate(source, buffer);
  2305. if (!dup) return false;
  2306. dest = dup;
  2307. } else {
  2308. dest = reinterpret_cast<const char*>(0);
  2309. }
  2310. return true;
  2311. }
  2312. };
  2313. template <typename Char>
  2314. struct ValueSaver<
  2315. Char*, typename EnableIf<!StringTraits<Char*>::should_duplicate>::type> {
  2316. template <typename Destination>
  2317. static bool save(JsonBuffer*, Destination& dest, Char* source) {
  2318. dest = reinterpret_cast<const char*>(source);
  2319. return true;
  2320. }
  2321. };
  2322. } // namespace Internals
  2323. } // namespace ArduinoJson
  2324. #define JSON_ARRAY_SIZE(NUMBER_OF_ELEMENTS) \
  2325. (sizeof(JsonArray) + (NUMBER_OF_ELEMENTS) * sizeof(JsonArray::node_type))
  2326. namespace ArduinoJson {
  2327. class JsonObject;
  2328. class JsonBuffer;
  2329. namespace Internals {
  2330. class JsonArraySubscript;
  2331. }
  2332. class JsonArray : public Internals::JsonPrintable<JsonArray>,
  2333. public Internals::ReferenceType,
  2334. public Internals::NonCopyable,
  2335. public Internals::List<JsonVariant>,
  2336. public Internals::JsonBufferAllocated {
  2337. public:
  2338. explicit JsonArray(JsonBuffer *buffer) throw()
  2339. : Internals::List<JsonVariant>(buffer) {}
  2340. const Internals::JsonArraySubscript operator[](size_t index) const;
  2341. Internals::JsonArraySubscript operator[](size_t index);
  2342. template <typename T>
  2343. bool add(const T &value) {
  2344. return add_impl<const T &>(value);
  2345. }
  2346. template <typename T>
  2347. bool add(T *value) {
  2348. return add_impl<T *>(value);
  2349. }
  2350. template <typename T>
  2351. DEPRECATED("Second argument is not supported anymore")
  2352. bool add(T value, uint8_t) {
  2353. return add_impl<const JsonVariant &>(JsonVariant(value));
  2354. }
  2355. template <typename T>
  2356. bool set(size_t index, const T &value) {
  2357. return set_impl<const T &>(index, value);
  2358. }
  2359. template <typename T>
  2360. bool set(size_t index, T *value) {
  2361. return set_impl<T *>(index, value);
  2362. }
  2363. template <typename T>
  2364. typename Internals::EnableIf<Internals::IsFloatingPoint<T>::value, bool>::type
  2365. set(size_t index, T value, uint8_t decimals) {
  2366. return set_impl<const JsonVariant &>(index, JsonVariant(value, decimals));
  2367. }
  2368. template <typename T>
  2369. typename Internals::JsonVariantAs<T>::type get(size_t index) const {
  2370. const_iterator it = begin() += index;
  2371. return it != end() ? it->as<T>() : Internals::JsonVariantDefault<T>::get();
  2372. }
  2373. template <typename T>
  2374. bool is(size_t index) const {
  2375. const_iterator it = begin() += index;
  2376. return it != end() ? it->is<T>() : false;
  2377. }
  2378. JsonArray &createNestedArray();
  2379. JsonObject &createNestedObject();
  2380. void remove(size_t index) {
  2381. remove(begin() += index);
  2382. }
  2383. using Internals::List<JsonVariant>::remove;
  2384. static JsonArray &invalid() {
  2385. static JsonArray instance(NULL);
  2386. return instance;
  2387. }
  2388. template <typename T, size_t N>
  2389. bool copyFrom(T (&array)[N]) {
  2390. return copyFrom(array, N);
  2391. }
  2392. template <typename T>
  2393. bool copyFrom(T *array, size_t len) {
  2394. bool ok = true;
  2395. for (size_t i = 0; i < len; i++) {
  2396. ok &= add(array[i]);
  2397. }
  2398. return ok;
  2399. }
  2400. template <typename T, size_t N1, size_t N2>
  2401. bool copyFrom(T (&array)[N1][N2]) {
  2402. bool ok = true;
  2403. for (size_t i = 0; i < N1; i++) {
  2404. JsonArray &nestedArray = createNestedArray();
  2405. for (size_t j = 0; j < N2; j++) {
  2406. ok &= nestedArray.add(array[i][j]);
  2407. }
  2408. }
  2409. return ok;
  2410. }
  2411. template <typename T, size_t N>
  2412. size_t copyTo(T (&array)[N]) const {
  2413. return copyTo(array, N);
  2414. }
  2415. template <typename T>
  2416. size_t copyTo(T *array, size_t len) const {
  2417. size_t i = 0;
  2418. for (const_iterator it = begin(); it != end() && i < len; ++it)
  2419. array[i++] = *it;
  2420. return i;
  2421. }
  2422. template <typename T, size_t N1, size_t N2>
  2423. void copyTo(T (&array)[N1][N2]) const {
  2424. size_t i = 0;
  2425. for (const_iterator it = begin(); it != end() && i < N1; ++it) {
  2426. it->as<JsonArray>().copyTo(array[i++]);
  2427. }
  2428. }
  2429. #if ARDUINOJSON_ENABLE_DEPRECATED
  2430. DEPRECATED("use remove() instead")
  2431. FORCE_INLINE void removeAt(size_t index) {
  2432. return remove(index);
  2433. }
  2434. #endif
  2435. private:
  2436. template <typename TValueRef>
  2437. bool set_impl(size_t index, TValueRef value) {
  2438. iterator it = begin() += index;
  2439. if (it == end()) return false;
  2440. return Internals::ValueSaver<TValueRef>::save(_buffer, *it, value);
  2441. }
  2442. template <typename TValueRef>
  2443. bool add_impl(TValueRef value) {
  2444. iterator it = Internals::List<JsonVariant>::add();
  2445. if (it == end()) return false;
  2446. return Internals::ValueSaver<TValueRef>::save(_buffer, *it, value);
  2447. }
  2448. };
  2449. namespace Internals {
  2450. template <>
  2451. struct JsonVariantDefault<JsonArray> {
  2452. static JsonArray &get() {
  2453. return JsonArray::invalid();
  2454. }
  2455. };
  2456. } // namespace Internals
  2457. } // namespace ArduinoJson
  2458. namespace ArduinoJson {
  2459. struct JsonPair {
  2460. const char* key;
  2461. JsonVariant value;
  2462. };
  2463. } // namespace ArduinoJson
  2464. #define JSON_OBJECT_SIZE(NUMBER_OF_ELEMENTS) \
  2465. (sizeof(JsonObject) + (NUMBER_OF_ELEMENTS) * sizeof(JsonObject::node_type))
  2466. namespace ArduinoJson {
  2467. class JsonArray;
  2468. class JsonBuffer;
  2469. namespace Internals {
  2470. template <typename>
  2471. class JsonObjectSubscript;
  2472. }
  2473. class JsonObject : public Internals::JsonPrintable<JsonObject>,
  2474. public Internals::ReferenceType,
  2475. public Internals::NonCopyable,
  2476. public Internals::List<JsonPair>,
  2477. public Internals::JsonBufferAllocated {
  2478. public:
  2479. explicit JsonObject(JsonBuffer* buffer) throw()
  2480. : Internals::List<JsonPair>(buffer) {}
  2481. template <typename TString>
  2482. Internals::JsonObjectSubscript<const TString&> operator[](
  2483. const TString& key) {
  2484. return Internals::JsonObjectSubscript<const TString&>(*this, key);
  2485. }
  2486. template <typename TString>
  2487. Internals::JsonObjectSubscript<TString*> operator[](TString* key) {
  2488. return Internals::JsonObjectSubscript<TString*>(*this, key);
  2489. }
  2490. template <typename TString>
  2491. const Internals::JsonObjectSubscript<const TString&> operator[](
  2492. const TString& key) const {
  2493. return Internals::JsonObjectSubscript<const TString&>(
  2494. *const_cast<JsonObject*>(this), key);
  2495. }
  2496. template <typename TString>
  2497. const Internals::JsonObjectSubscript<TString*> operator[](
  2498. TString* key) const {
  2499. return Internals::JsonObjectSubscript<TString*>(
  2500. *const_cast<JsonObject*>(this), key);
  2501. }
  2502. template <typename TValue, typename TString>
  2503. bool set(const TString& key, const TValue& value) {
  2504. return set_impl<const TString&, const TValue&>(key, value);
  2505. }
  2506. template <typename TValue, typename TString>
  2507. bool set(const TString& key, TValue* value) {
  2508. return set_impl<const TString&, TValue*>(key, value);
  2509. }
  2510. template <typename TValue, typename TString>
  2511. bool set(TString* key, const TValue& value) {
  2512. return set_impl<TString*, const TValue&>(key, value);
  2513. }
  2514. template <typename TValue, typename TString>
  2515. bool set(TString* key, TValue* value) {
  2516. return set_impl<TString*, TValue*>(key, value);
  2517. }
  2518. template <typename TValue, typename TString>
  2519. DEPRECATED("Second argument is not supported anymore")
  2520. typename Internals::EnableIf<Internals::IsFloatingPoint<TValue>::value,
  2521. bool>::type
  2522. set(const TString& key, TValue value, uint8_t) {
  2523. return set_impl<const TString&, const JsonVariant&>(key,
  2524. JsonVariant(value));
  2525. }
  2526. template <typename TValue, typename TString>
  2527. DEPRECATED("Second argument is not supported anymore")
  2528. typename Internals::EnableIf<Internals::IsFloatingPoint<TValue>::value,
  2529. bool>::type
  2530. set(TString* key, TValue value, uint8_t) {
  2531. return set_impl<TString*, const JsonVariant&>(key, JsonVariant(value));
  2532. }
  2533. template <typename TValue, typename TString>
  2534. typename Internals::JsonVariantAs<TValue>::type get(
  2535. const TString& key) const {
  2536. return get_impl<const TString&, TValue>(key);
  2537. }
  2538. template <typename TValue, typename TString>
  2539. typename Internals::JsonVariantAs<TValue>::type get(TString* key) const {
  2540. return get_impl<TString*, TValue>(key);
  2541. }
  2542. template <typename TValue, typename TString>
  2543. bool is(const TString& key) const {
  2544. return is_impl<const TString&, TValue>(key);
  2545. }
  2546. template <typename TValue, typename TString>
  2547. bool is(TString* key) const {
  2548. return is_impl<TString*, TValue>(key);
  2549. }
  2550. template <typename TString>
  2551. JsonArray& createNestedArray(const TString& key) {
  2552. return createNestedArray_impl<const TString&>(key);
  2553. }
  2554. template <typename TString>
  2555. JsonArray& createNestedArray(TString* key) {
  2556. return createNestedArray_impl<TString*>(key);
  2557. }
  2558. template <typename TString>
  2559. JsonObject& createNestedObject(const TString& key) {
  2560. return createNestedObject_impl<const TString&>(key);
  2561. }
  2562. template <typename TString>
  2563. JsonObject& createNestedObject(TString* key) {
  2564. return createNestedObject_impl<TString*>(key);
  2565. }
  2566. template <typename TString>
  2567. bool containsKey(const TString& key) const {
  2568. return findKey<const TString&>(key) != end();
  2569. }
  2570. template <typename TString>
  2571. bool containsKey(TString* key) const {
  2572. return findKey<TString*>(key) != end();
  2573. }
  2574. template <typename TString>
  2575. void remove(const TString& key) {
  2576. remove(findKey<const TString&>(key));
  2577. }
  2578. template <typename TString>
  2579. void remove(TString* key) {
  2580. remove(findKey<TString*>(key));
  2581. }
  2582. using Internals::List<JsonPair>::remove;
  2583. static JsonObject& invalid() {
  2584. static JsonObject instance(NULL);
  2585. return instance;
  2586. }
  2587. private:
  2588. template <typename TStringRef>
  2589. iterator findKey(TStringRef key) {
  2590. iterator it;
  2591. for (it = begin(); it != end(); ++it) {
  2592. if (Internals::StringTraits<TStringRef>::equals(key, it->key)) break;
  2593. }
  2594. return it;
  2595. }
  2596. template <typename TStringRef>
  2597. const_iterator findKey(TStringRef key) const {
  2598. return const_cast<JsonObject*>(this)->findKey<TStringRef>(key);
  2599. }
  2600. template <typename TStringRef, typename TValue>
  2601. typename Internals::JsonVariantAs<TValue>::type get_impl(
  2602. TStringRef key) const {
  2603. const_iterator it = findKey<TStringRef>(key);
  2604. return it != end() ? it->value.as<TValue>()
  2605. : Internals::JsonVariantDefault<TValue>::get();
  2606. }
  2607. template <typename TStringRef, typename TValueRef>
  2608. bool set_impl(TStringRef key, TValueRef value) {
  2609. if (Internals::StringTraits<TStringRef>::is_null(key)) return false;
  2610. iterator it = findKey<TStringRef>(key);
  2611. if (it == end()) {
  2612. it = Internals::List<JsonPair>::add();
  2613. if (it == end()) return false;
  2614. bool key_ok =
  2615. Internals::ValueSaver<TStringRef>::save(_buffer, it->key, key);
  2616. if (!key_ok) return false;
  2617. }
  2618. return Internals::ValueSaver<TValueRef>::save(_buffer, it->value, value);
  2619. }
  2620. template <typename TStringRef, typename TValue>
  2621. bool is_impl(TStringRef key) const {
  2622. const_iterator it = findKey<TStringRef>(key);
  2623. return it != end() ? it->value.is<TValue>() : false;
  2624. }
  2625. template <typename TStringRef>
  2626. JsonArray& createNestedArray_impl(TStringRef key);
  2627. template <typename TStringRef>
  2628. JsonObject& createNestedObject_impl(TStringRef key);
  2629. };
  2630. namespace Internals {
  2631. template <>
  2632. struct JsonVariantDefault<JsonObject> {
  2633. static JsonObject& get() {
  2634. return JsonObject::invalid();
  2635. }
  2636. };
  2637. } // namespace Internals
  2638. } // namespace ArduinoJson
  2639. namespace ArduinoJson {
  2640. namespace Internals {
  2641. class StaticJsonBufferBase : public JsonBufferBase<StaticJsonBufferBase> {
  2642. public:
  2643. class String {
  2644. public:
  2645. String(StaticJsonBufferBase* parent) : _parent(parent) {
  2646. _start = parent->_buffer + parent->_size;
  2647. }
  2648. void append(char c) {
  2649. if (_parent->canAlloc(1)) {
  2650. char* last = static_cast<char*>(_parent->doAlloc(1));
  2651. *last = c;
  2652. }
  2653. }
  2654. const char* c_str() const {
  2655. if (_parent->canAlloc(1)) {
  2656. char* last = static_cast<char*>(_parent->doAlloc(1));
  2657. *last = '\0';
  2658. return _start;
  2659. } else {
  2660. return NULL;
  2661. }
  2662. }
  2663. private:
  2664. StaticJsonBufferBase* _parent;
  2665. char* _start;
  2666. };
  2667. StaticJsonBufferBase(char* buffer, size_t capa)
  2668. : _buffer(buffer), _capacity(capa), _size(0) {}
  2669. size_t capacity() const {
  2670. return _capacity;
  2671. }
  2672. size_t size() const {
  2673. return _size;
  2674. }
  2675. virtual void* alloc(size_t bytes) {
  2676. alignNextAlloc();
  2677. if (!canAlloc(bytes)) return NULL;
  2678. return doAlloc(bytes);
  2679. }
  2680. void clear() {
  2681. _size = 0;
  2682. }
  2683. String startString() {
  2684. return String(this);
  2685. }
  2686. protected:
  2687. ~StaticJsonBufferBase() {}
  2688. private:
  2689. void alignNextAlloc() {
  2690. _size = round_size_up(_size);
  2691. }
  2692. bool canAlloc(size_t bytes) const {
  2693. return _size + bytes <= _capacity;
  2694. }
  2695. void* doAlloc(size_t bytes) {
  2696. void* p = &_buffer[_size];
  2697. _size += bytes;
  2698. return p;
  2699. }
  2700. char* _buffer;
  2701. size_t _capacity;
  2702. size_t _size;
  2703. };
  2704. } // namespace Internals
  2705. #if defined(__clang__)
  2706. #pragma clang diagnostic push
  2707. #pragma clang diagnostic ignored "-Wnon-virtual-dtor"
  2708. #elif defined(__GNUC__)
  2709. #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
  2710. #pragma GCC diagnostic push
  2711. #endif
  2712. #pragma GCC diagnostic ignored "-Wnon-virtual-dtor"
  2713. #endif
  2714. template <size_t CAPACITY>
  2715. class StaticJsonBuffer : public Internals::StaticJsonBufferBase {
  2716. public:
  2717. explicit StaticJsonBuffer()
  2718. : Internals::StaticJsonBufferBase(_buffer, CAPACITY) {}
  2719. private:
  2720. char _buffer[CAPACITY];
  2721. };
  2722. } // namespace ArduinoJson
  2723. #if defined(__clang__)
  2724. #pragma clang diagnostic pop
  2725. #elif defined(__GNUC__)
  2726. #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
  2727. #pragma GCC diagnostic pop
  2728. #endif
  2729. #endif
  2730. namespace ArduinoJson {
  2731. namespace Internals {
  2732. template <typename TInput>
  2733. void skipSpacesAndComments(TInput& input) {
  2734. for (;;) {
  2735. switch (input.current()) {
  2736. case ' ':
  2737. case '\t':
  2738. case '\r':
  2739. case '\n':
  2740. input.move();
  2741. continue;
  2742. case '/':
  2743. switch (input.next()) {
  2744. case '*':
  2745. input.move(); // skip '/'
  2746. for (;;) {
  2747. input.move();
  2748. if (input.current() == '\0') return;
  2749. if (input.current() == '*' && input.next() == '/') {
  2750. input.move(); // skip '*'
  2751. input.move(); // skip '/'
  2752. break;
  2753. }
  2754. }
  2755. break;
  2756. case '/':
  2757. for (;;) {
  2758. input.move();
  2759. if (input.current() == '\0') return;
  2760. if (input.current() == '\n') break;
  2761. }
  2762. break;
  2763. default:
  2764. return;
  2765. }
  2766. break;
  2767. default:
  2768. return;
  2769. }
  2770. }
  2771. }
  2772. } // namespace Internals
  2773. } // namespace ArduinoJson
  2774. template <typename TReader, typename TWriter>
  2775. inline bool ArduinoJson::Internals::JsonParser<TReader, TWriter>::eat(
  2776. TReader &reader, char charToSkip) {
  2777. skipSpacesAndComments(reader);
  2778. if (reader.current() != charToSkip) return false;
  2779. reader.move();
  2780. return true;
  2781. }
  2782. template <typename TReader, typename TWriter>
  2783. inline bool
  2784. ArduinoJson::Internals::JsonParser<TReader, TWriter>::parseAnythingTo(
  2785. JsonVariant *destination) {
  2786. skipSpacesAndComments(_reader);
  2787. switch (_reader.current()) {
  2788. case '[':
  2789. return parseArrayTo(destination);
  2790. case '{':
  2791. return parseObjectTo(destination);
  2792. default:
  2793. return parseStringTo(destination);
  2794. }
  2795. }
  2796. template <typename TReader, typename TWriter>
  2797. inline ArduinoJson::JsonArray &
  2798. ArduinoJson::Internals::JsonParser<TReader, TWriter>::parseArray() {
  2799. if (_nestingLimit == 0) return JsonArray::invalid();
  2800. _nestingLimit--;
  2801. JsonArray &array = _buffer->createArray();
  2802. if (!eat('[')) goto ERROR_MISSING_BRACKET;
  2803. if (eat(']')) goto SUCCESS_EMPTY_ARRAY;
  2804. for (;;) {
  2805. JsonVariant value;
  2806. if (!parseAnythingTo(&value)) goto ERROR_INVALID_VALUE;
  2807. if (!array.add(value)) goto ERROR_NO_MEMORY;
  2808. if (eat(']')) goto SUCCES_NON_EMPTY_ARRAY;
  2809. if (!eat(',')) goto ERROR_MISSING_COMMA;
  2810. }
  2811. SUCCESS_EMPTY_ARRAY:
  2812. SUCCES_NON_EMPTY_ARRAY:
  2813. _nestingLimit++;
  2814. return array;
  2815. ERROR_INVALID_VALUE:
  2816. ERROR_MISSING_BRACKET:
  2817. ERROR_MISSING_COMMA:
  2818. ERROR_NO_MEMORY:
  2819. return JsonArray::invalid();
  2820. }
  2821. template <typename TReader, typename TWriter>
  2822. inline bool ArduinoJson::Internals::JsonParser<TReader, TWriter>::parseArrayTo(
  2823. JsonVariant *destination) {
  2824. JsonArray &array = parseArray();
  2825. if (!array.success()) return false;
  2826. *destination = array;
  2827. return true;
  2828. }
  2829. template <typename TReader, typename TWriter>
  2830. inline ArduinoJson::JsonObject &
  2831. ArduinoJson::Internals::JsonParser<TReader, TWriter>::parseObject() {
  2832. if (_nestingLimit == 0) return JsonObject::invalid();
  2833. _nestingLimit--;
  2834. JsonObject &object = _buffer->createObject();
  2835. if (!eat('{')) goto ERROR_MISSING_BRACE;
  2836. if (eat('}')) goto SUCCESS_EMPTY_OBJECT;
  2837. for (;;) {
  2838. const char *key = parseString();
  2839. if (!key) goto ERROR_INVALID_KEY;
  2840. if (!eat(':')) goto ERROR_MISSING_COLON;
  2841. JsonVariant value;
  2842. if (!parseAnythingTo(&value)) goto ERROR_INVALID_VALUE;
  2843. if (!object.set(key, value)) goto ERROR_NO_MEMORY;
  2844. if (eat('}')) goto SUCCESS_NON_EMPTY_OBJECT;
  2845. if (!eat(',')) goto ERROR_MISSING_COMMA;
  2846. }
  2847. SUCCESS_EMPTY_OBJECT:
  2848. SUCCESS_NON_EMPTY_OBJECT:
  2849. _nestingLimit++;
  2850. return object;
  2851. ERROR_INVALID_KEY:
  2852. ERROR_INVALID_VALUE:
  2853. ERROR_MISSING_BRACE:
  2854. ERROR_MISSING_COLON:
  2855. ERROR_MISSING_COMMA:
  2856. ERROR_NO_MEMORY:
  2857. return JsonObject::invalid();
  2858. }
  2859. template <typename TReader, typename TWriter>
  2860. inline bool ArduinoJson::Internals::JsonParser<TReader, TWriter>::parseObjectTo(
  2861. JsonVariant *destination) {
  2862. JsonObject &object = parseObject();
  2863. if (!object.success()) return false;
  2864. *destination = object;
  2865. return true;
  2866. }
  2867. template <typename TReader, typename TWriter>
  2868. inline const char *
  2869. ArduinoJson::Internals::JsonParser<TReader, TWriter>::parseString() {
  2870. typename RemoveReference<TWriter>::type::String str = _writer.startString();
  2871. skipSpacesAndComments(_reader);
  2872. char c = _reader.current();
  2873. if (isQuote(c)) { // quotes
  2874. _reader.move();
  2875. char stopChar = c;
  2876. for (;;) {
  2877. c = _reader.current();
  2878. if (c == '\0') break;
  2879. _reader.move();
  2880. if (c == stopChar) break;
  2881. if (c == '\\') {
  2882. c = Encoding::unescapeChar(_reader.current());
  2883. if (c == '\0') break;
  2884. _reader.move();
  2885. }
  2886. str.append(c);
  2887. }
  2888. } else { // no quotes
  2889. for (;;) {
  2890. if (!canBeInNonQuotedString(c)) break;
  2891. _reader.move();
  2892. str.append(c);
  2893. c = _reader.current();
  2894. }
  2895. }
  2896. return str.c_str();
  2897. }
  2898. template <typename TReader, typename TWriter>
  2899. inline bool ArduinoJson::Internals::JsonParser<TReader, TWriter>::parseStringTo(
  2900. JsonVariant *destination) {
  2901. bool hasQuotes = isQuote(_reader.current());
  2902. const char *value = parseString();
  2903. if (value == NULL) return false;
  2904. if (hasQuotes) {
  2905. *destination = value;
  2906. } else {
  2907. *destination = RawJson(value);
  2908. }
  2909. return true;
  2910. }
  2911. #ifdef _MSC_VER
  2912. #pragma warning(push)
  2913. #pragma warning(disable : 4522)
  2914. #endif
  2915. namespace ArduinoJson {
  2916. namespace Internals {
  2917. class JsonArraySubscript : public JsonVariantBase<JsonArraySubscript> {
  2918. public:
  2919. FORCE_INLINE JsonArraySubscript(JsonArray& array, size_t index)
  2920. : _array(array), _index(index) {}
  2921. FORCE_INLINE JsonArraySubscript& operator=(const JsonArraySubscript& src) {
  2922. _array.set(_index, src);
  2923. return *this;
  2924. }
  2925. template <typename T>
  2926. FORCE_INLINE JsonArraySubscript& operator=(const T& src) {
  2927. _array.set(_index, src);
  2928. return *this;
  2929. }
  2930. template <typename T>
  2931. FORCE_INLINE JsonArraySubscript& operator=(T* src) {
  2932. _array.set(_index, src);
  2933. return *this;
  2934. }
  2935. FORCE_INLINE bool success() const {
  2936. return _index < _array.size();
  2937. }
  2938. template <typename T>
  2939. FORCE_INLINE typename JsonVariantAs<T>::type as() const {
  2940. return _array.get<T>(_index);
  2941. }
  2942. template <typename T>
  2943. FORCE_INLINE bool is() const {
  2944. return _array.is<T>(_index);
  2945. }
  2946. template <typename TValue>
  2947. FORCE_INLINE bool set(const TValue& value) {
  2948. return _array.set(_index, value);
  2949. }
  2950. template <typename TValue>
  2951. FORCE_INLINE bool set(TValue* value) {
  2952. return _array.set(_index, value);
  2953. }
  2954. template <typename TValue>
  2955. DEPRECATED("Second argument is not supported anymore")
  2956. FORCE_INLINE bool set(const TValue& value, uint8_t) {
  2957. return _array.set(_index, value);
  2958. }
  2959. private:
  2960. JsonArray& _array;
  2961. const size_t _index;
  2962. };
  2963. template <typename TImpl>
  2964. inline JsonArraySubscript JsonVariantSubscripts<TImpl>::operator[](
  2965. size_t index) {
  2966. return impl()->template as<JsonArray>()[index];
  2967. }
  2968. template <typename TImpl>
  2969. inline const JsonArraySubscript JsonVariantSubscripts<TImpl>::operator[](
  2970. size_t index) const {
  2971. return impl()->template as<JsonArray>()[index];
  2972. }
  2973. #if ARDUINOJSON_ENABLE_STD_STREAM
  2974. inline std::ostream& operator<<(std::ostream& os,
  2975. const JsonArraySubscript& source) {
  2976. return source.printTo(os);
  2977. }
  2978. #endif
  2979. } // namespace Internals
  2980. inline Internals::JsonArraySubscript JsonArray::operator[](size_t index) {
  2981. return Internals::JsonArraySubscript(*this, index);
  2982. }
  2983. inline const Internals::JsonArraySubscript JsonArray::operator[](
  2984. size_t index) const {
  2985. return Internals::JsonArraySubscript(*const_cast<JsonArray*>(this), index);
  2986. }
  2987. } // namespace ArduinoJson
  2988. #ifdef _MSC_VER
  2989. #pragma warning(pop)
  2990. #endif
  2991. namespace ArduinoJson {
  2992. inline JsonArray &JsonArray::createNestedArray() {
  2993. if (!_buffer) return JsonArray::invalid();
  2994. JsonArray &array = _buffer->createArray();
  2995. add(array);
  2996. return array;
  2997. }
  2998. inline JsonObject &JsonArray::createNestedObject() {
  2999. if (!_buffer) return JsonObject::invalid();
  3000. JsonObject &object = _buffer->createObject();
  3001. add(object);
  3002. return object;
  3003. }
  3004. } // namespace ArduinoJson
  3005. inline ArduinoJson::JsonArray &ArduinoJson::JsonBuffer::createArray() {
  3006. JsonArray *ptr = new (this) JsonArray(this);
  3007. return ptr ? *ptr : JsonArray::invalid();
  3008. }
  3009. inline ArduinoJson::JsonObject &ArduinoJson::JsonBuffer::createObject() {
  3010. JsonObject *ptr = new (this) JsonObject(this);
  3011. return ptr ? *ptr : JsonObject::invalid();
  3012. }
  3013. #ifdef _MSC_VER
  3014. #pragma warning(push)
  3015. #pragma warning(disable : 4522)
  3016. #endif
  3017. namespace ArduinoJson {
  3018. namespace Internals {
  3019. template <typename TStringRef>
  3020. class JsonObjectSubscript
  3021. : public JsonVariantBase<JsonObjectSubscript<TStringRef> > {
  3022. typedef JsonObjectSubscript<TStringRef> this_type;
  3023. public:
  3024. FORCE_INLINE JsonObjectSubscript(JsonObject& object, TStringRef key)
  3025. : _object(object), _key(key) {}
  3026. FORCE_INLINE this_type& operator=(const this_type& src) {
  3027. _object.set(_key, src);
  3028. return *this;
  3029. }
  3030. template <typename TValue>
  3031. FORCE_INLINE typename EnableIf<!IsArray<TValue>::value, this_type&>::type
  3032. operator=(const TValue& src) {
  3033. _object.set(_key, src);
  3034. return *this;
  3035. }
  3036. template <typename TValue>
  3037. FORCE_INLINE this_type& operator=(TValue* src) {
  3038. _object.set(_key, src);
  3039. return *this;
  3040. }
  3041. FORCE_INLINE bool success() const {
  3042. return _object.containsKey(_key);
  3043. }
  3044. template <typename TValue>
  3045. FORCE_INLINE typename JsonVariantAs<TValue>::type as() const {
  3046. return _object.get<TValue>(_key);
  3047. }
  3048. template <typename TValue>
  3049. FORCE_INLINE bool is() const {
  3050. return _object.is<TValue>(_key);
  3051. }
  3052. template <typename TValue>
  3053. FORCE_INLINE typename EnableIf<!IsArray<TValue>::value, bool>::type set(
  3054. const TValue& value) {
  3055. return _object.set(_key, value);
  3056. }
  3057. template <typename TValue>
  3058. FORCE_INLINE bool set(const TValue* value) {
  3059. return _object.set(_key, value);
  3060. }
  3061. template <typename TValue>
  3062. DEPRECATED("Second argument is not supported anymore")
  3063. FORCE_INLINE bool set(const TValue& value, uint8_t) {
  3064. return _object.set(_key, value);
  3065. }
  3066. private:
  3067. JsonObject& _object;
  3068. TStringRef _key;
  3069. };
  3070. #if ARDUINOJSON_ENABLE_STD_STREAM
  3071. template <typename TStringRef>
  3072. inline std::ostream& operator<<(std::ostream& os,
  3073. const JsonObjectSubscript<TStringRef>& source) {
  3074. return source.printTo(os);
  3075. }
  3076. #endif
  3077. } // namespace Internals
  3078. } // namespace ArduinoJson
  3079. #ifdef _MSC_VER
  3080. #pragma warning(pop)
  3081. #endif
  3082. namespace ArduinoJson {
  3083. template <typename TStringRef>
  3084. inline JsonArray &JsonObject::createNestedArray_impl(TStringRef key) {
  3085. if (!_buffer) return JsonArray::invalid();
  3086. JsonArray &array = _buffer->createArray();
  3087. set(key, array);
  3088. return array;
  3089. }
  3090. template <typename TStringRef>
  3091. inline JsonObject &JsonObject::createNestedObject_impl(TStringRef key) {
  3092. if (!_buffer) return JsonObject::invalid();
  3093. JsonObject &object = _buffer->createObject();
  3094. set(key, object);
  3095. return object;
  3096. }
  3097. } // namespace ArduinoJson
  3098. namespace ArduinoJson {
  3099. namespace Internals {
  3100. inline bool isdigit(char c) {
  3101. return '0' <= c && c <= '9';
  3102. }
  3103. inline bool issign(char c) {
  3104. return '-' == c || c == '+';
  3105. }
  3106. } // namespace Internals
  3107. } // namespace ArduinoJson
  3108. namespace ArduinoJson {
  3109. namespace Internals {
  3110. inline bool isFloat(const char* s) {
  3111. if (!s) return false;
  3112. if (!strcmp(s, "NaN")) return true;
  3113. if (issign(*s)) s++;
  3114. if (!strcmp(s, "Infinity")) return true;
  3115. if (*s == '\0') return false;
  3116. while (isdigit(*s)) s++;
  3117. if (*s == '.') {
  3118. s++;
  3119. while (isdigit(*s)) s++;
  3120. }
  3121. if (*s == 'e' || *s == 'E') {
  3122. s++;
  3123. if (issign(*s)) s++;
  3124. if (!isdigit(*s)) return false;
  3125. while (isdigit(*s)) s++;
  3126. }
  3127. return *s == '\0';
  3128. }
  3129. } // namespace Internals
  3130. } // namespace ArduinoJson
  3131. namespace ArduinoJson {
  3132. namespace Internals {
  3133. inline bool isInteger(const char* s) {
  3134. if (!s || !*s) return false;
  3135. if (issign(*s)) s++;
  3136. while (isdigit(*s)) s++;
  3137. return *s == '\0';
  3138. }
  3139. } // namespace Internals
  3140. } // namespace ArduinoJson
  3141. namespace ArduinoJson {
  3142. namespace Internals {
  3143. template <typename T>
  3144. inline T parseFloat(const char* s) {
  3145. typedef FloatTraits<T> traits;
  3146. typedef typename traits::mantissa_type mantissa_t;
  3147. typedef typename traits::exponent_type exponent_t;
  3148. if (!s) return 0; // NULL
  3149. bool negative_result = false;
  3150. switch (*s) {
  3151. case '-':
  3152. negative_result = true;
  3153. s++;
  3154. break;
  3155. case '+':
  3156. s++;
  3157. break;
  3158. }
  3159. if (*s == 't') return 1; // true
  3160. if (*s == 'n' || *s == 'N') return traits::nan();
  3161. if (*s == 'i' || *s == 'I')
  3162. return negative_result ? -traits::inf() : traits::inf();
  3163. mantissa_t mantissa = 0;
  3164. exponent_t exponent_offset = 0;
  3165. while (isdigit(*s)) {
  3166. if (mantissa < traits::mantissa_max / 10)
  3167. mantissa = mantissa * 10 + (*s - '0');
  3168. else
  3169. exponent_offset++;
  3170. s++;
  3171. }
  3172. if (*s == '.') {
  3173. s++;
  3174. while (isdigit(*s)) {
  3175. if (mantissa < traits::mantissa_max / 10) {
  3176. mantissa = mantissa * 10 + (*s - '0');
  3177. exponent_offset--;
  3178. }
  3179. s++;
  3180. }
  3181. }
  3182. int exponent = 0;
  3183. if (*s == 'e' || *s == 'E') {
  3184. s++;
  3185. bool negative_exponent = false;
  3186. if (*s == '-') {
  3187. negative_exponent = true;
  3188. s++;
  3189. } else if (*s == '+') {
  3190. s++;
  3191. }
  3192. while (isdigit(*s)) {
  3193. exponent = exponent * 10 + (*s - '0');
  3194. if (exponent + exponent_offset > traits::exponent_max) {
  3195. if (negative_exponent)
  3196. return negative_result ? -0.0f : 0.0f;
  3197. else
  3198. return negative_result ? -traits::inf() : traits::inf();
  3199. }
  3200. s++;
  3201. }
  3202. if (negative_exponent) exponent = -exponent;
  3203. }
  3204. exponent += exponent_offset;
  3205. T result = traits::make_float(static_cast<T>(mantissa), exponent);
  3206. return negative_result ? -result : result;
  3207. }
  3208. } // namespace Internals
  3209. } // namespace ArduinoJson
  3210. namespace ArduinoJson {
  3211. namespace Internals {
  3212. template <typename T>
  3213. T parseInteger(const char *s) {
  3214. if (!s) return 0; // NULL
  3215. if (*s == 't') return 1; // "true"
  3216. T result = 0;
  3217. bool negative_result = false;
  3218. switch (*s) {
  3219. case '-':
  3220. negative_result = true;
  3221. s++;
  3222. break;
  3223. case '+':
  3224. s++;
  3225. break;
  3226. }
  3227. while (isdigit(*s)) {
  3228. result = T(result * 10 + T(*s - '0'));
  3229. s++;
  3230. }
  3231. return negative_result ? T(~result + 1) : result;
  3232. }
  3233. } // namespace Internals
  3234. } // namespace ArduinoJson
  3235. namespace ArduinoJson {
  3236. inline JsonVariant::JsonVariant(const JsonArray &array) {
  3237. if (array.success()) {
  3238. _type = Internals::JSON_ARRAY;
  3239. _content.asArray = const_cast<JsonArray *>(&array);
  3240. } else {
  3241. _type = Internals::JSON_UNDEFINED;
  3242. _content.asArray = 0; // <- prevent warning 'maybe-uninitialized'
  3243. }
  3244. }
  3245. inline JsonVariant::JsonVariant(const JsonObject &object) {
  3246. if (object.success()) {
  3247. _type = Internals::JSON_OBJECT;
  3248. _content.asObject = const_cast<JsonObject *>(&object);
  3249. } else {
  3250. _type = Internals::JSON_UNDEFINED;
  3251. _content.asObject = 0; // <- prevent warning 'maybe-uninitialized'
  3252. }
  3253. }
  3254. inline JsonArray &JsonVariant::variantAsArray() const {
  3255. if (_type == Internals::JSON_ARRAY) return *_content.asArray;
  3256. return JsonArray::invalid();
  3257. }
  3258. inline JsonObject &JsonVariant::variantAsObject() const {
  3259. if (_type == Internals::JSON_OBJECT) return *_content.asObject;
  3260. return JsonObject::invalid();
  3261. }
  3262. template <typename T>
  3263. inline T JsonVariant::variantAsInteger() const {
  3264. using namespace Internals;
  3265. switch (_type) {
  3266. case JSON_UNDEFINED:
  3267. return 0;
  3268. case JSON_POSITIVE_INTEGER:
  3269. case JSON_BOOLEAN:
  3270. return T(_content.asInteger);
  3271. case JSON_NEGATIVE_INTEGER:
  3272. return T(~_content.asInteger + 1);
  3273. case JSON_STRING:
  3274. case JSON_UNPARSED:
  3275. return parseInteger<T>(_content.asString);
  3276. default:
  3277. return T(_content.asFloat);
  3278. }
  3279. }
  3280. inline const char *JsonVariant::variantAsString() const {
  3281. using namespace Internals;
  3282. if (_type == JSON_UNPARSED && _content.asString &&
  3283. !strcmp("null", _content.asString))
  3284. return NULL;
  3285. if (_type == JSON_STRING || _type == JSON_UNPARSED) return _content.asString;
  3286. return NULL;
  3287. }
  3288. template <typename T>
  3289. inline T JsonVariant::variantAsFloat() const {
  3290. using namespace Internals;
  3291. switch (_type) {
  3292. case JSON_UNDEFINED:
  3293. return 0;
  3294. case JSON_POSITIVE_INTEGER:
  3295. case JSON_BOOLEAN:
  3296. return static_cast<T>(_content.asInteger);
  3297. case JSON_NEGATIVE_INTEGER:
  3298. return -static_cast<T>(_content.asInteger);
  3299. case JSON_STRING:
  3300. case JSON_UNPARSED:
  3301. return parseFloat<T>(_content.asString);
  3302. default:
  3303. return static_cast<T>(_content.asFloat);
  3304. }
  3305. }
  3306. inline bool JsonVariant::variantIsBoolean() const {
  3307. using namespace Internals;
  3308. if (_type == JSON_BOOLEAN) return true;
  3309. if (_type != JSON_UNPARSED || _content.asString == NULL) return false;
  3310. return !strcmp(_content.asString, "true") ||
  3311. !strcmp(_content.asString, "false");
  3312. }
  3313. inline bool JsonVariant::variantIsInteger() const {
  3314. using namespace Internals;
  3315. return _type == JSON_POSITIVE_INTEGER || _type == JSON_NEGATIVE_INTEGER ||
  3316. (_type == JSON_UNPARSED && isInteger(_content.asString));
  3317. }
  3318. inline bool JsonVariant::variantIsFloat() const {
  3319. using namespace Internals;
  3320. return _type == JSON_FLOAT || _type == JSON_POSITIVE_INTEGER ||
  3321. _type == JSON_NEGATIVE_INTEGER ||
  3322. (_type == JSON_UNPARSED && isFloat(_content.asString));
  3323. }
  3324. #if ARDUINOJSON_ENABLE_STD_STREAM
  3325. inline std::ostream &operator<<(std::ostream &os, const JsonVariant &source) {
  3326. return source.printTo(os);
  3327. }
  3328. #endif
  3329. } // namespace ArduinoJson
  3330. template <typename Writer>
  3331. inline void ArduinoJson::Internals::JsonSerializer<Writer>::serialize(
  3332. const JsonArray& array, Writer& writer) {
  3333. writer.beginArray();
  3334. JsonArray::const_iterator it = array.begin();
  3335. while (it != array.end()) {
  3336. serialize(*it, writer);
  3337. ++it;
  3338. if (it == array.end()) break;
  3339. writer.writeComma();
  3340. }
  3341. writer.endArray();
  3342. }
  3343. template <typename Writer>
  3344. inline void ArduinoJson::Internals::JsonSerializer<Writer>::serialize(
  3345. const JsonArraySubscript& arraySubscript, Writer& writer) {
  3346. serialize(arraySubscript.as<JsonVariant>(), writer);
  3347. }
  3348. template <typename Writer>
  3349. inline void ArduinoJson::Internals::JsonSerializer<Writer>::serialize(
  3350. const JsonObject& object, Writer& writer) {
  3351. writer.beginObject();
  3352. JsonObject::const_iterator it = object.begin();
  3353. while (it != object.end()) {
  3354. writer.writeString(it->key);
  3355. writer.writeColon();
  3356. serialize(it->value, writer);
  3357. ++it;
  3358. if (it == object.end()) break;
  3359. writer.writeComma();
  3360. }
  3361. writer.endObject();
  3362. }
  3363. template <typename Writer>
  3364. template <typename TKey>
  3365. inline void ArduinoJson::Internals::JsonSerializer<Writer>::serialize(
  3366. const JsonObjectSubscript<TKey>& objectSubscript, Writer& writer) {
  3367. serialize(objectSubscript.template as<JsonVariant>(), writer);
  3368. }
  3369. template <typename Writer>
  3370. inline void ArduinoJson::Internals::JsonSerializer<Writer>::serialize(
  3371. const JsonVariant& variant, Writer& writer) {
  3372. switch (variant._type) {
  3373. case JSON_FLOAT:
  3374. writer.writeFloat(variant._content.asFloat);
  3375. return;
  3376. case JSON_ARRAY:
  3377. serialize(*variant._content.asArray, writer);
  3378. return;
  3379. case JSON_OBJECT:
  3380. serialize(*variant._content.asObject, writer);
  3381. return;
  3382. case JSON_STRING:
  3383. writer.writeString(variant._content.asString);
  3384. return;
  3385. case JSON_UNPARSED:
  3386. writer.writeRaw(variant._content.asString);
  3387. return;
  3388. case JSON_NEGATIVE_INTEGER:
  3389. writer.writeRaw('-'); // Falls through.
  3390. case JSON_POSITIVE_INTEGER:
  3391. writer.writeInteger(variant._content.asInteger);
  3392. return;
  3393. case JSON_BOOLEAN:
  3394. writer.writeBoolean(variant._content.asInteger != 0);
  3395. return;
  3396. default: // JSON_UNDEFINED
  3397. return;
  3398. }
  3399. }
  3400. #ifdef __GNUC__
  3401. #define ARDUINOJSON_PRAGMA(x) _Pragma(#x)
  3402. #define ARDUINOJSON_COMPILE_ERROR(msg) ARDUINOJSON_PRAGMA(GCC error msg)
  3403. #define ARDUINOJSON_STRINGIFY(S) #S
  3404. #define ARDUINOJSON_DEPRECATION_ERROR(X, Y) \
  3405. ARDUINOJSON_COMPILE_ERROR(ARDUINOJSON_STRINGIFY(X is a Y from ArduinoJson 6 but version 5 is installed. Visit arduinojson.org to get more information.))
  3406. #define StaticJsonDocument ARDUINOJSON_DEPRECATION_ERROR(StaticJsonDocument, class)
  3407. #define DynamicJsonDocument ARDUINOJSON_DEPRECATION_ERROR(DynamicJsonDocument, class)
  3408. #define JsonDocument ARDUINOJSON_DEPRECATION_ERROR(JsonDocument, class)
  3409. #define DeserializationError ARDUINOJSON_DEPRECATION_ERROR(DeserializationError, class)
  3410. #define deserializeJson ARDUINOJSON_DEPRECATION_ERROR(deserializeJson, function)
  3411. #define deserializeMsgPack ARDUINOJSON_DEPRECATION_ERROR(deserializeMsgPack, function)
  3412. #define serializeJson ARDUINOJSON_DEPRECATION_ERROR(serializeJson, function)
  3413. #define serializeMsgPack ARDUINOJSON_DEPRECATION_ERROR(serializeMsgPack, function)
  3414. #define serializeJsonPretty ARDUINOJSON_DEPRECATION_ERROR(serializeJsonPretty, function)
  3415. #define measureMsgPack ARDUINOJSON_DEPRECATION_ERROR(measureMsgPack, function)
  3416. #define measureJson ARDUINOJSON_DEPRECATION_ERROR(measureJson, function)
  3417. #define measureJsonPretty ARDUINOJSON_DEPRECATION_ERROR(measureJsonPretty, function)
  3418. #endif
  3419. using namespace ArduinoJson;
  3420. #else
  3421. #error ArduinoJson requires a C++ compiler, please change file extension to .cc or .cpp
  3422. #endif