16 #include <string_view>
24 std::vector<char> ret;
25 char const *ptr = in.data();
26 char const *end = ptr + in.size();
27 ret.reserve(end - ptr + 10);
29 int c = (
unsigned char)*ptr;
30 char const *next = ptr + 1;
32 case '\"': ret.push_back(
'\\'); ret.push_back(
'\"');
break;
33 case '\\': ret.push_back(
'\\'); ret.push_back(
'\\');
break;
34 case '\b': ret.push_back(
'\\'); ret.push_back(
'b');
break;
35 case '\f': ret.push_back(
'\\'); ret.push_back(
'f');
break;
36 case '\n': ret.push_back(
'\\'); ret.push_back(
'n');
break;
37 case '\r': ret.push_back(
'\\'); ret.push_back(
'r');
break;
38 case '\t': ret.push_back(
'\\'); ret.push_back(
't');
break;
40 if (c >= 0x20 && c < 0x7f) {
45 if ((c & 0xe0) == 0xc0 && next < end) {
46 if ((next[0] & 0xc0) == 0x80) {
47 int d = (
unsigned char)next[0];
48 unicode = ((c & 0x1f) << 6) | (d & 0x3f);
51 }
else if ((c & 0xf0) == 0xe0 && next + 1 < end) {
52 if ((next[0] & 0xc0) == 0x80 && (next[1] & 0xc0) == 0x80) {
53 int d = (
unsigned char)next[0];
54 int e = (
unsigned char)next[1];
55 unicode = ((c & 0x0f) << 12) | ((d & 0x3f) << 6) | (e & 0x3f);
58 }
else if ((c & 0xf8) == 0xf0 && next + 2 < end) {
59 if ((next[0] & 0xc0) == 0x80 && (next[1] & 0xc0) == 0x80 && (next[2] & 0xc0) == 0x80) {
60 int d = (
unsigned char)next[0];
61 int e = (
unsigned char)next[1];
62 int f = (
unsigned char)next[2];
63 unicode = ((c & 0x0f) << 18) | ((d & 0x3f) << 12) | ((e & 0x3f) << 6) | (f & 0x3f);
70 ret.insert(ret.end(), ptr, next);
73 if (unicode >= 0x10000 && unicode < 0x110000) {
74 uint16_t h = (unicode - 0x10000) / 0x400 + 0xd800;
75 uint16_t l = (unicode - 0x10000) % 0x400 + 0xdc00;
76 sprintf(tmp,
"\\u%04X\\u%04X", h, l);
77 ret.insert(ret.end(), tmp, tmp + 12);
79 sprintf(tmp,
"\\u%04X", unicode);
80 ret.insert(ret.end(), tmp, tmp + 6);
106 static const double tbl[] = {
107 1e+00, 1e+01, 1e+02, 1e+03, 1e+04, 1e+05, 1e+06,
108 1e+07, 1e+08, 1e+09, 1e+10, 1e+11, 1e+12, 1e+13,
111 if (exp >= 0 && exp <
static_cast<int>(
sizeof tbl /
sizeof *tbl))
113 if (exp <= 0 && exp > -
static_cast<int>(
sizeof tbl /
sizeof *tbl))
114 return 1.0 / tbl[-exp];
116 return std::pow(10.0, exp);
134 static double my_strtod(
const char *nptr,
char **endptr)
136 const char *s = nptr;
138 bool saw_digit =
false;
141 bool exp_sign =
false;
145 while (std::isspace((
unsigned char)*s)) ++s;
148 if (*s ==
'+' || *s ==
'-') {
149 if (*s ==
'-') sign =
true;
154 while (std::isdigit((
unsigned char)*s)) {
156 value = value * 10.0 + (*s -
'0');
163 while (std::isdigit((
unsigned char)*s)) {
165 value = value * 10.0 + (*s -
'0');
173 if (endptr) *endptr =
const_cast<char *
>(nptr);
178 if (*s ==
'e' || *s ==
'E') {
180 const char *exp_start = s;
181 if (*s ==
'+' || *s ==
'-') {
182 if (*s ==
'-') exp_sign =
true;
185 if (std::isdigit((
unsigned char)*s)) {
186 while (std::isdigit((
unsigned char)*s)) {
187 exp_val = exp_val * 10 + (*s -
'0');
200 int total_exp = exp_val - frac_digits;
201 if (total_exp != 0) {
211 if (!std::isfinite(value)) {
213 value = sign ? -HUGE_VAL : HUGE_VAL;
214 }
else if (value == 0.0 && saw_digit && total_exp != 0) {
219 if (endptr) *endptr =
const_cast<char *
>(s);
227 bool trim_zeros =
true;
230 if (std::isnan(val)) {
236 if (std::isinf(val)) {
238 bool sign = std::signbit(val);
257 double intval = floor(val);
262 ptr = end = (
char *)alloca(precision + 10) + 5;
269 ptr = end = (
char *)alloca(intlen + precision + 10) + intlen + 5;
277 while (v > 0 && v < 1) {
286 for (
int i = 0; i < precision - e; i++) {
295 int r = std::min(e, precision);
303 while (i < precision) {
308 *end++ = (char)m +
'0';
316 intval += floor(val + 0.5);
330 for (
int i = 0; i < intlen; i++) {
333 *--ptr = (char)((t - u) * 10 + 0.49) +
'0';
344 if (trim_zeros && dot) {
358 return std::string(ptr, end - ptr);
363 if (std::isnan(val)) {
369 if (std::isinf(val)) {
371 return std::signbit(val) ?
"-Infinity" :
"Infinity";
378 auto [ptr, ec] = std::to_chars(buf, buf +
sizeof(buf), val);
379 if (ec != std::errc{}) {
382 return std::string(buf, ptr);
410 static std::string
to_stdstr(std::vector<char>
const &vec)
413 char const *begin = &vec[0];
414 char const *end = begin + vec.size();
415 return std::string(begin, end);
417 return std::string();
422 char const *ptr = begin;
424 if (std::isspace((
unsigned char)*ptr)) {
431 while (ptr < end && *ptr !=
'\r' && *ptr !=
'\n') {
438 while (ptr + 1 < end) {
439 if (*ptr ==
'*' && ptr[1] ==
'/') {
450 return int(ptr - begin);
455 char const *ptr = begin;
457 std::vector<char> vec;
459 if (!isalnum((
unsigned char)*ptr) && *ptr !=
'_')
break;
463 if (ptr > begin && !vec.empty()) {
465 return int(ptr - begin);
474 char const *ptr = begin;
477 std::vector<char> vec;
482 if (p + 1 < end && *p ==
'-') {
486 if (p + 1 < end && *p ==
'0' && (p[1] ==
'x' || p[1] ==
'X')) {
488 while (p < end && isxdigit((
unsigned char)*p)) {
493 long long v = strtoll(vec.data(),
nullptr, 16);
494 *out = double(sign ? -v : v);
495 return int(p - begin);
502 if (p < end && *p ==
'-') {
506 while (p < end && isalpha((
unsigned char)*p)) {
511 if (strcmp(vec.data(),
"Infinity") == 0) {
513 *out = sign ? -INFINITY : INFINITY;
514 }
else if (strcmp(vec.data(),
"NaN") == 0) {
519 return int(ptr - begin);
525 if (isdigit((
unsigned char)c) || c ==
'.' || c ==
'+' || c ==
'-' || c ==
'e' || c ==
'E') {
540 return int(ptr - begin);
545 char const *ptr = begin;
549 std::vector<char> vec;
554 return int(ptr - begin);
555 }
else if (*ptr ==
'\\') {
558 auto push = [&](
char c){ vec.push_back(c); ptr++;};
560 case 'b': push(
'\b');
break;
561 case 'n': push(
'\n');
break;
562 case 'r': push(
'\r');
break;
563 case 'f': push(
'\f');
break;
564 case 't': push(
'\t');
break;
565 case 'v': push(
'\v');
break;
580 uint32_t unicode = (uint32_t)strtol(tmp,
nullptr, 16);
581 if (unicode >= 0xd800 && unicode < 0xdc00) {
582 if (ptr + 5 < end && ptr[0] ==
'\\' && ptr[1] ==
'u') {
587 uint32_t surrogate = (uint32_t)strtol(tmp,
nullptr, 16);
588 if (surrogate >= 0xdc00 && surrogate < 0xe000) {
590 unicode = ((unicode - 0xd800) << 10) + (surrogate - 0xdc00) + 0x10000;
594 if (unicode < (1 << 7)) {
595 vec.push_back(unicode & 0x7f);
596 }
else if (unicode < (1 << 11)) {
597 vec.push_back(((unicode >> 6) & 0x1f) | 0xc0);
598 vec.push_back((unicode & 0x3f) | 0x80);
599 }
else if (unicode < (1 << 16)) {
600 vec.push_back(((unicode >> 12) & 0x0f) | 0xe0);
601 vec.push_back(((unicode >> 6) & 0x3f) | 0x80);
602 vec.push_back((unicode & 0x3f) | 0x80);
603 }
else if (unicode < (1 << 21)) {
604 vec.push_back(((unicode >> 18) & 0x07) | 0xf0);
605 vec.push_back(((unicode >> 12) & 0x3f) | 0x80);
606 vec.push_back(((unicode >> 6) & 0x3f) | 0x80);
607 vec.push_back((unicode & 0x3f) | 0x80);
628 char const *
ptr =
nullptr;
638 char const *
end =
nullptr;
639 char const *
ptr =
nullptr;
718 void parse(
char const *begin,
char const *end)
727 void parse(std::string_view
const &sv)
729 parse(sv.data(), sv.data() + sv.size());
732 void parse(
char const *ptr,
int len = -1)
735 len = (int)strlen(ptr);
737 parse(ptr, ptr + len);
758 if (
key[n - 1] ==
'{') {
759 key =
key.substr(0, n - 1);
782 if (
key[n - 1] ==
'[') {
783 key =
key.substr(0, n - 1);
816 char const *p =
d.
ptr++;
826 char const *p =
d.
ptr++;
835 if (*
d.
ptr ==
'\"') {
884 if (isalpha((
unsigned char)*
d.
ptr)) {
908 if (
d.
ptr[n] ==
':') {
932 Reader(
char const *begin,
char const *end)
988 void nest(std::function<
void ()> callback_fn = {})
1151 return (
int)
d.
depth.size();
1157 for (std::string
const &s :
d.
depth) {
1175 bool match(std::string_view
path,
bool match_end_structure =
false)
const
1179 auto Path = [&](
size_t i){
return i <
path.size() ?
path[i] : 0; };
1181 const auto stat =
state();
1184 for (i = 0; i <
d.
depth.size(); i++) {
1185 std::string
const &element =
d.
depth[i];
1186 if (element.empty())
return false;
1187 if (Path(0) ==
'*') {
1188 if (Path(1) ==
'*') {
1189 if (Path(2) == 0)
return true;
1192 char c = element.c_str()[element.size() - 1];
1193 if (c ==
'{' || c ==
'[') {
1199 if (i + 1 ==
d.
depth.size()) {
1201 if (c ==
'[' && stat ==
StartArray)
return true;
1207 if (
path.size() < element.size())
return false;
1208 if (strncmp(
path.data(), element.c_str(), element.size()) != 0)
return false;
1209 path =
path.substr(element.size());
1211 if (Path(0) ==
'*') {
1212 if (Path(1) ==
'*' && Path(2) == 0)
return true;
1213 if (Path(1) == 0 && i ==
d.
depth.size()) {
1215 if (match_end_structure) {
1246 return (uintptr_t)
d.
ptr;
1248 std::string_view
extract(uintptr_t begin, uintptr_t end)
1250 if (begin >= (uintptr_t)
d.
begin && end <= (uintptr_t)
d.
end && begin <= end) {
1251 return std::string_view((
char *)begin, end - begin);
1275 print(p, (
int)strlen(p));
1280 print(s.c_str(), (
int)s.size());
1302 size_t n =
stack.size() - 1;
1303 for (
size_t i = 0; i < n; i++) {
1326 print(buf.data(), (
int)buf.size());
1334 print(s.c_str(), (
int)s.size());
1338 bool print_value(std::string
const &name, std::function<
bool ()>
const &fn)
1344 if (!
stack.empty()) {
1347 if (
stack.size() == 1) {
1353 void print_object(std::string
const &name = {}, std::function<void ()>
const &fn = {})
1364 void print_array(std::string
const &name = {}, std::function<void ()>
const &fn = {})
1378 if (!
stack.empty()) {
1399 Writer(std::function<
void (
char const *p,
int n)> fn = {})
1427 if (!
stack.empty()) {
1428 if (
stack.back() > 0) {
1432 if (
stack.size() > 1) {
1436 if (!name.empty()) {
1455 if (
stack.size() == 1) {
1460 void object(std::string
const &name, std::function<
void ()>
const &fn)
1475 if (
stack.size() == 1) {
1480 void array(std::string
const &name, std::function<
void ()>
const &fn)
1485 bool number(std::string
const &name,
double v)
1497 void string(std::string
const &name, std::string_view
const &s)
1537 void null(std::string
const &name)
1542 operator std::string ()
const
1547 void raw(std::string
const &name, std::string
const &s)
1557 static constexpr std::nullptr_t
null =
nullptr;
1562 typedef std::variant<null_t, bool, double, std::string, _Object, Array>
Variant;
1564 std::vector<Variant>
a;
1581 template <
typename T> T &
get(
size_t i)
1583 assert(i <
a.size());
1584 return std::get<T>(
a[i]);
1586 template <
typename T> T
const &
get(
size_t i)
const
1588 assert(i <
a.size());
1589 return std::get<T>(
a[i]);
1636 if (!std::holds_alternative<_Object>(v)) {
1639 p = &std::get<_Object>(v);
1643 return p ?
p->size() : 0;
1652 for (
auto &kv : *
p) {
1653 if (kv.key == key) {
1662 return const_cast<Object *
>(
this)->
find(key);
1674 template <
typename T> T
const &
get(std::string
const &key)
const
1678 return std::get<T>(*v);
1683 return p->back().value;
1689 return std::holds_alternative<null_t>(v);
1693 return std::holds_alternative<bool>(v);
1697 return std::holds_alternative<double>(v);
1701 return std::holds_alternative<std::string>(v);
1705 return std::holds_alternative<_Object>(v);
1709 return std::holds_alternative<Array>(v);
1713 return std::holds_alternative<double>(v) && std::isnan(std::get<double>(v));
1717 return std::holds_alternative<double>(v) && std::isinf(std::get<double>(v));
1725 if (!std::holds_alternative<Array>(v)) {
1728 return std::get<Array>(v);
1732 if (!std::holds_alternative<_Object>(v)) {
1735 return Object(std::get<_Object>(v));
1742 }
else if (reader.
isfalse()) {
1744 }
else if (reader.
istrue()) {
Definition: jstream.h:403
bool is_end_object() const
Definition: jstream.h:1037
int depth() const
Definition: jstream.h:1149
bool isarray() const
Definition: jstream.h:1144
Reader(char const *begin, char const *end)
Definition: jstream.h:932
void allow_ambiguous_comma(bool allow)
Definition: jstream.h:960
static void _init(ParserData *d)
Definition: jstream.h:921
void allow_hexadicimal(bool allow)
Definition: jstream.h:968
bool isnull() const
Definition: jstream.h:1114
bool is_end_array() const
Definition: jstream.h:1047
ParserData d
Definition: jstream.h:657
bool has_error() const
Definition: jstream.h:1022
bool pop_state()
Definition: jstream.h:690
static std::string to_stdstr(std::vector< char > const &vec)
Definition: jstream.h:410
bool match_start_object(char const *path) const
Definition: jstream.h:1224
bool match_end_array(char const *path) const
Definition: jstream.h:1239
double number() const
Definition: jstream.h:1139
void parse(char const *ptr, int len=-1)
Definition: jstream.h:732
bool isfalse() const
Definition: jstream.h:1119
Reader(Reader &&r)
Definition: jstream.h:940
void allow_comment(bool allow)
Definition: jstream.h:956
void nest(std::function< void()> callback_fn={})
Definition: jstream.h:988
void hold()
Definition: jstream.h:984
bool istrue() const
Definition: jstream.h:1124
uintptr_t tell() const
Definition: jstream.h:1244
std::string path() const
Definition: jstream.h:1154
Reader & operator=(Reader const &r)=delete
bool match_start_array(char const *path) const
Definition: jstream.h:1234
void push_error(std::string const &what)
Definition: jstream.h:659
std::vector< Error > const & errors() const
Definition: jstream.h:1027
bool is_constant() const
Definition: jstream.h:1052
std::string key() const
Definition: jstream.h:1091
bool is_start_object() const
Definition: jstream.h:1032
int scan_space(char const *begin, char const *end)
Definition: jstream.h:420
void reset()
Definition: jstream.h:980
int parse_number(char const *begin, char const *end, double *out)
Definition: jstream.h:471
void allow_key_in_array(bool allow)
Definition: jstream.h:976
Reader(Reader const &r)=delete
Reader & operator=(Reader &&r)
Definition: jstream.h:945
Reader(char const *ptr, int len=-1)
Definition: jstream.h:936
void parse(std::string_view const &sv)
Definition: jstream.h:727
void allow_unquoted_key(bool allow)
Definition: jstream.h:964
bool is_structure() const
Definition: jstream.h:1065
void push_state(StateItem s)
Definition: jstream.h:668
std::string string() const
Definition: jstream.h:1096
bool match_end_object(char const *path) const
Definition: jstream.h:1229
bool is_value() const
Definition: jstream.h:1086
Reader(std::string_view const &sv)
Definition: jstream.h:928
bool _internal_next()
Definition: jstream.h:740
bool is_start_array() const
Definition: jstream.h:1042
StateType state() const
Definition: jstream.h:1017
int parse_symbol(char const *begin, char const *end, std::string *out)
Definition: jstream.h:453
bool isstring() const
Definition: jstream.h:1134
bool isnumber() const
Definition: jstream.h:1129
std::string_view extract()
Definition: jstream.h:1166
StateType symbol() const
Definition: jstream.h:1101
std::string_view extract(uintptr_t begin, uintptr_t end)
Definition: jstream.h:1248
bool next()
Definition: jstream.h:1000
void parse(char const *begin, char const *end)
Definition: jstream.h:718
bool match(std::string_view path, bool match_end_structure=false) const
Definition: jstream.h:1175
int parse_string(char const *begin, char const *end, std::string *out)
Definition: jstream.h:543
void allow_special_constant(bool allow)
Definition: jstream.h:972
Definition: jstream.h:1257
void end_block()
Definition: jstream.h:1375
bool allow_nan_
Definition: jstream.h:1289
void array(std::string const &name, std::function< void()> const &fn)
Definition: jstream.h:1480
void boolean(std::string const &name, bool b)
Definition: jstream.h:1527
void symbol(std::string const &name, StateType v)
Definition: jstream.h:1510
void object(std::string const &name, std::function< void()> const &fn)
Definition: jstream.h:1460
std::vector< int > stack
Definition: jstream.h:1283
void print_indent()
Definition: jstream.h:1298
void string(std::string const &s)
Definition: jstream.h:1505
void start_object(std::string const &name={})
Definition: jstream.h:1445
void allow_nan(bool allow)
Definition: jstream.h:1420
Writer(std::function< void(char const *p, int n)> fn={})
Definition: jstream.h:1399
bool number(std::string const &name, double v)
Definition: jstream.h:1485
void print(char c)
Definition: jstream.h:1268
bool print_value(std::string const &name, std::function< bool()> const &fn)
Definition: jstream.h:1338
void string(std::string const &name, std::string_view const &s)
Definition: jstream.h:1497
void end_array()
Definition: jstream.h:1470
void number(double v)
Definition: jstream.h:1492
bool print_number(double v)
Definition: jstream.h:1309
void print(std::string const &s)
Definition: jstream.h:1278
void print_name(std::string const &name)
Definition: jstream.h:1425
void enable_newline(bool enabled)
Definition: jstream.h:1415
void print_array(std::string const &name={}, std::function< void()> const &fn={})
Definition: jstream.h:1364
std::string string_out
Definition: jstream.h:1285
void print(char const *p)
Definition: jstream.h:1273
bool enable_indent_
Definition: jstream.h:1287
~Writer()
Definition: jstream.h:1405
void start_array(std::string const &name={})
Definition: jstream.h:1465
bool enable_newline_
Definition: jstream.h:1288
void end_object()
Definition: jstream.h:1450
void print_raw(std::string const &s)
Definition: jstream.h:1331
void print(char const *p, int n)
Definition: jstream.h:1259
void flush()
Definition: jstream.h:1391
std::function< void(char const *p, int n)> output_fn
Definition: jstream.h:1284
void print_string(std::string_view const &s)
Definition: jstream.h:1320
void reset()
Definition: jstream.h:1385
void print_newline()
Definition: jstream.h:1291
void raw(std::string const &name, std::string const &s)
Definition: jstream.h:1547
void print_object(std::string const &name={}, std::function< void()> const &fn={})
Definition: jstream.h:1353
void enable_indent(bool enabled)
Definition: jstream.h:1410
static std::string format_double(double val, bool allow_nan)
Definition: jstream.h:361
static double pow10_int(int exp)
Return 10 raised to an integer power.
Definition: jstream.h:103
static double my_strtod(const char *nptr, char **endptr)
Locale‑independent strtod clone.
Definition: jstream.h:134
static bool is_infinite(Variant const &v)
Definition: jstream.h:1715
static Variant var(jstream::Reader const &reader)
Definition: jstream.h:1738
static bool is_nan(Variant const &v)
Definition: jstream.h:1711
static bool is_null(Variant const &v)
Definition: jstream.h:1687
std::vector< KeyValue > _Object
Definition: jstream.h:1560
static bool is_boolean(Variant const &v)
Definition: jstream.h:1691
static Object obj(Variant &v)
Definition: jstream.h:1730
std::variant< null_t, bool, double, std::string, _Object, Array > Variant
Definition: jstream.h:1562
static bool is_object(Variant const &v)
Definition: jstream.h:1703
StateType
Definition: jstream.h:386
@ Null
Definition: jstream.h:389
@ String
Definition: jstream.h:399
@ EndObject
Definition: jstream.h:396
@ Comma
Definition: jstream.h:394
@ StartObject
Definition: jstream.h:395
@ EndArray
Definition: jstream.h:398
@ True
Definition: jstream.h:391
@ Number
Definition: jstream.h:400
@ StartArray
Definition: jstream.h:397
@ Key
Definition: jstream.h:393
@ False
Definition: jstream.h:390
@ None
Definition: jstream.h:388
static Array & arr(Array &a)
Definition: jstream.h:1719
static bool is_array(Variant const &v)
Definition: jstream.h:1707
static std::vector< char > encode_json_string(std::string_view const &in)
Definition: jstream.h:22
static bool is_number(Variant const &v)
Definition: jstream.h:1695
std::nullptr_t null_t
Definition: jstream.h:1556
static bool is_string(Variant const &v)
Definition: jstream.h:1699
Definition: GitTypes.h:74
Definition: jstream.h:1563
Variant const & operator[](size_t i) const
Definition: jstream.h:1577
Array & operator+=(Variant const &v)
Definition: jstream.h:1595
bool empty() const
Definition: jstream.h:1569
T & get(size_t i)
Definition: jstream.h:1581
Variant & operator[](size_t i)
Definition: jstream.h:1573
void push_back(Variant const &v)
Definition: jstream.h:1591
size_t size() const
Definition: jstream.h:1565
T const & get(size_t i) const
Definition: jstream.h:1586
std::vector< Variant > a
Definition: jstream.h:1564
Definition: jstream.h:1601
KeyValue(std::string const &k, Variant const &v)
Definition: jstream.h:1605
Variant value
Definition: jstream.h:1603
std::string key
Definition: jstream.h:1602
Definition: jstream.h:1625
size_t size() const
Definition: jstream.h:1641
Object(Variant &v)
Definition: jstream.h:1634
Variant & value(std::string const &key)
Definition: jstream.h:1664
Variant const * find(std::string const &key) const
Definition: jstream.h:1660
Variant const & value(std::string const &key) const
Definition: jstream.h:1670
_Object * p
Definition: jstream.h:1626
Object(_Object &o)
Definition: jstream.h:1630
Object()
Definition: jstream.h:1627
T const & get(std::string const &key) const
Definition: jstream.h:1674
VariantRef operator[](std::string const &key)
Definition: jstream.h:1680
bool empty() const
Definition: jstream.h:1645
Variant * find(std::string const &key)
Definition: jstream.h:1649
Definition: jstream.h:405
std::string what_
Definition: jstream.h:406
std::string what() const
Definition: jstream.h:407
Definition: jstream.h:636
bool allow_comment
Definition: jstream.h:646
std::vector< Error > errors
Definition: jstream.h:655
std::vector< std::string > depth
Definition: jstream.h:652
bool allow_ambiguous_comma
Definition: jstream.h:647
char const * ptr
Definition: jstream.h:639
bool allow_unquoted_key
Definition: jstream.h:648
bool is_array
Definition: jstream.h:645
bool allow_special_constant
Definition: jstream.h:650
StateItem last_state
Definition: jstream.h:654
std::string string
Definition: jstream.h:643
std::vector< StateItem > states
Definition: jstream.h:640
bool hold
Definition: jstream.h:641
std::vector< int > depth_stack
Definition: jstream.h:653
bool allow_hexadicimal
Definition: jstream.h:649
double number
Definition: jstream.h:644
char const * begin
Definition: jstream.h:637
char const * end
Definition: jstream.h:638
bool allow_key_in_array
Definition: jstream.h:651
std::string key
Definition: jstream.h:642
Definition: jstream.h:626
StateType type
Definition: jstream.h:627
char const * ptr
Definition: jstream.h:628
StateItem(StateType type, char const *ptr=nullptr)
Definition: jstream.h:630
Definition: jstream.h:1610
Variant * var
Definition: jstream.h:1611
void operator=(Variant const &v)
Definition: jstream.h:1616
VariantRef(Variant &v)
Definition: jstream.h:1612