jsonbuilder.cpp (3209B)
1 #include "jsonbuilder.h" 2 3 namespace blbench { 4 5 JSONBuilder::JSONBuilder(BLString* dst) 6 : _dst(dst), 7 _last(kTokenNone), 8 _level(0) {} 9 10 JSONBuilder& JSONBuilder::open_array() { 11 if (_last == kTokenValue) 12 _dst->append(','); 13 14 _dst->append('['); 15 _last = kTokenNone; 16 _level++; 17 18 return *this; 19 } 20 21 JSONBuilder& JSONBuilder::close_array(bool nl) { 22 _level--; 23 if (nl) { 24 _dst->append('\n'); 25 _dst->append(' ', _level * 2); 26 } 27 28 _dst->append(']'); 29 _last = kTokenValue; 30 31 return *this; 32 } 33 34 JSONBuilder& JSONBuilder::open_object() { 35 if (_last == kTokenValue) 36 _dst->append(','); 37 38 _dst->append('{'); 39 _last = kTokenNone; 40 _level++; 41 42 return *this; 43 } 44 45 JSONBuilder& JSONBuilder::close_object(bool nl) { 46 _level--; 47 if (nl) { 48 _dst->append('\n'); 49 _dst->append(' ', _level * 2); 50 } 51 52 _dst->append('}'); 53 _last = kTokenValue; 54 return *this; 55 } 56 57 JSONBuilder& JSONBuilder::comma() { 58 if (_last == kTokenValue) 59 _dst->append(','); 60 _last = kTokenNone; 61 62 return *this; 63 } 64 65 JSONBuilder& JSONBuilder::add_key(const char* str) { 66 add_string(str); 67 68 _dst->append(':'); 69 _last = kTokenNone; 70 71 return *this; 72 } 73 74 JSONBuilder& JSONBuilder::add_bool(bool b) { 75 if (_last == kTokenValue) 76 _dst->append(','); 77 78 _dst->append(b ? "true" : "false"); 79 _last = kTokenValue; 80 81 return *this; 82 } 83 84 JSONBuilder& JSONBuilder::add_int(int64_t n) { 85 if (_last == kTokenValue) 86 _dst->append(','); 87 88 _dst->append_format("%lld", (long long)n); 89 _last = kTokenValue; 90 91 return *this; 92 } 93 94 JSONBuilder& JSONBuilder::add_uint(uint64_t n) { 95 if (_last == kTokenValue) 96 _dst->append(','); 97 98 _dst->append_format("%llu", (unsigned long long)n); 99 _last = kTokenValue; 100 101 return *this; 102 } 103 104 JSONBuilder& JSONBuilder::add_double(double d) { 105 if (_last == kTokenValue) 106 _dst->append(','); 107 108 _dst->append_format("%g", d); 109 _last = kTokenValue; 110 111 return *this; 112 } 113 114 JSONBuilder& JSONBuilder::add_doublef(const char* fmt, double d) { 115 if (_last == kTokenValue) 116 _dst->append(','); 117 118 _dst->append_format(fmt, d); 119 _last = kTokenValue; 120 121 return *this; 122 } 123 124 JSONBuilder& JSONBuilder::add_string(const char* str) { 125 if (_last == kTokenValue) 126 _dst->append(','); 127 128 _dst->append_format("\"%s\"", str); 129 _last = kTokenValue; 130 131 return *this; 132 } 133 134 JSONBuilder& JSONBuilder::add_stringf(const char* fmt, ...) { 135 if (_last == kTokenValue) 136 _dst->append(','); 137 138 va_list ap; 139 va_start(ap, fmt); 140 141 _dst->append('\"'); 142 _dst->appendFormatV(fmt, ap); 143 _dst->append('\"'); 144 _last = kTokenValue; 145 146 va_end(ap); 147 148 return *this; 149 } 150 151 JSONBuilder& JSONBuilder::add_string_no_quotes(const char* str) { 152 if (_last == kTokenValue) 153 _dst->append(','); 154 155 _dst->append(str); 156 _last = kTokenValue; 157 158 return *this; 159 } 160 161 JSONBuilder& JSONBuilder::align_to(size_t n) { 162 size_t i = _dst->size(); 163 const char* p = _dst->data(); 164 165 while (i) 166 if (p[--i] == '\n') 167 break; 168 169 size_t cur = _dst->size() - i; 170 if (cur < n) 171 _dst->append(' ', n - cur); 172 173 return *this; 174 } 175 176 JSONBuilder& JSONBuilder::before_record() { 177 if (_last == kTokenValue) 178 _dst->append(','); 179 180 _dst->append('\n'); 181 _dst->append(' ', _level * 2); 182 _last = kTokenNone; 183 184 return *this; 185 } 186 187 } // {blbench} namespace