| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- /*
- * Arduino JSON library
- * Benoit Blanchon 2014 - MIT License
- */
- #pragma once
- #include "EscapedString.h"
- #include "Printable.h"
- #include "StringBuilder.h"
- namespace ArduinoJson
- {
- namespace Generator
- {
- class JsonValue
- {
- public:
- void operator=(bool value)
- {
- _printToImpl = &printBoolTo;
- _content.asBool = value;
- }
- void operator=(long value)
- {
- _printToImpl = &printLongTo;
- _content.asLong = value;
- }
- void operator=(int value)
- {
- _printToImpl = &printLongTo;
- _content.asLong = value;
- }
- void operator=(const Printable& value)
- {
- _printToImpl = &printPrintableTo;
- _content.asPrintable = &value;
- }
- void operator=(const char* value)
- {
- _printToImpl = &printStringTo;
- _content.asString = value;
- }
- void operator=(double value)
- {
- set<2>(value);
- }
- template <int DIGITS>
- void set(double value)
- {
- _printToImpl = &printDoubleTo < DIGITS > ;
- _content.asDouble = value;
- }
- operator bool()
- {
- return _content.asBool;
- }
- operator const char*()
- {
- return _content.asString;
- }
- operator double()
- {
- return _content.asDouble;
- }
- operator float()
- {
- return static_cast<float>(_content.asDouble);
- }
- operator int()
- {
- return _content.asLong;
- }
- operator long()
- {
- return _content.asLong;
- }
- operator const Printable&()
- {
- return *_content.asPrintable;
- }
- size_t printTo(Print& p) const
- {
- // handmade polymorphism
- return _printToImpl(_content, p);
- }
- void reset()
- {
- _content.asDouble = 0;
- _printToImpl = printStringTo;
- }
- private:
- union Content
- {
- bool asBool;
- double asDouble;
- long asLong;
- const Printable* asPrintable;
- const char* asString;
- };
- Content _content;
- size_t(*_printToImpl)(const Content&, Print&);
- static size_t printBoolTo(const Content&, Print&);
- static size_t printLongTo(const Content&, Print&);
- static size_t printPrintableTo(const Content&, Print&);
- static size_t printStringTo(const Content&, Print&);
- template <int DIGITS>
- static size_t printDoubleTo(const Content& c, Print& p)
- {
- return p.print(c.asDouble, DIGITS);
- }
- };
- }
- }
|