51#ifdef P4C_GTEST_ENABLED
52 FRIEND_TEST(Util, Json);
56 enum Kind { String, Number, True, False, Null };
58 JsonValue(
bool b) : tag(b ? Kind::True : Kind::False) {}
59 JsonValue(big_int v) : tag(Kind::Number), value(v) {}
60 JsonValue(
int v) : tag(Kind::Number), value(v) {}
61 JsonValue(
long v) : tag(Kind::Number), value(v) {}
63 JsonValue(
unsigned v) : tag(Kind::Number), value(v) {}
64 JsonValue(
unsigned long v) : tag(Kind::Number), value(v) {}
66 JsonValue(
double v) : tag(Kind::Number), value(v) {}
67 JsonValue(
float v) : tag(Kind::Number), value(v) {}
69 JsonValue(
const std::string &s) : tag(Kind::String), str(s) {}
70 JsonValue(
const char *s) : tag(Kind::String), str(s) {}
71 void serialize(std::ostream &out)
const override;
73 bool operator==(
const big_int &v)
const;
75 template <typename T, typename std::enable_if<std::is_integral<T>::value,
int>::type = 0>
76 bool operator==(
const T &v)
const {
77 return (tag == Kind::Number) && (v == value);
79 bool operator==(
const double &v)
const;
80 bool operator==(
const float &v)
const;
81 bool operator==(
const cstring &s)
const;
82 bool operator==(
const std::string &s)
const;
83 bool operator==(
const char *s)
const;
84 bool operator==(
const JsonValue &other)
const;
86 bool isNumber()
const {
return tag == Kind::Number; }
87 bool isBool()
const {
return tag == Kind::True || tag == Kind::False; }
88 bool isString()
const {
return tag == Kind::String; }
89 bool isNull()
const {
return tag == Kind::Null; }
93 big_int getValue()
const;
100 if (kind == Kind::String || kind == Kind::Number)
101 throw std::logic_error(
"Incorrect constructor called");
105 const big_int value = 0;