Commit d80b63c3c0c43fd6bd9e275c7979ecde57d30264
Committed by
Jay Berkenbilt
1 parent
72bf7197
Refactor JSON type checks
Showing
2 changed files
with
52 additions
and
22 deletions
include/qpdf/JSON.hh
| ... | ... | @@ -339,13 +339,33 @@ class JSON |
| 339 | 339 | static void |
| 340 | 340 | writeClose(Pipeline* p, bool first, size_t depth, char const* delimeter); |
| 341 | 341 | |
| 342 | + enum value_type_e { | |
| 343 | + vt_none, | |
| 344 | + vt_dictionary, | |
| 345 | + vt_array, | |
| 346 | + vt_string, | |
| 347 | + vt_number, | |
| 348 | + vt_bool, | |
| 349 | + vt_null, | |
| 350 | + vt_blob, | |
| 351 | + }; | |
| 352 | + | |
| 342 | 353 | struct JSON_value |
| 343 | 354 | { |
| 355 | + JSON_value(value_type_e type_code) : | |
| 356 | + type_code(type_code) | |
| 357 | + { | |
| 358 | + } | |
| 344 | 359 | virtual ~JSON_value() = default; |
| 345 | 360 | virtual void write(Pipeline*, size_t depth) const = 0; |
| 361 | + const value_type_e type_code{vt_none}; | |
| 346 | 362 | }; |
| 347 | 363 | struct JSON_dictionary: public JSON_value |
| 348 | 364 | { |
| 365 | + JSON_dictionary() : | |
| 366 | + JSON_value(vt_dictionary) | |
| 367 | + { | |
| 368 | + } | |
| 349 | 369 | virtual ~JSON_dictionary() = default; |
| 350 | 370 | virtual void write(Pipeline*, size_t depth) const; |
| 351 | 371 | std::map<std::string, std::shared_ptr<JSON_value>> members; |
| ... | ... | @@ -353,6 +373,10 @@ class JSON |
| 353 | 373 | }; |
| 354 | 374 | struct JSON_array: public JSON_value |
| 355 | 375 | { |
| 376 | + JSON_array() : | |
| 377 | + JSON_value(vt_array) | |
| 378 | + { | |
| 379 | + } | |
| 356 | 380 | virtual ~JSON_array() = default; |
| 357 | 381 | virtual void write(Pipeline*, size_t depth) const; |
| 358 | 382 | std::vector<std::shared_ptr<JSON_value>> elements; |
| ... | ... | @@ -383,6 +407,10 @@ class JSON |
| 383 | 407 | }; |
| 384 | 408 | struct JSON_null: public JSON_value |
| 385 | 409 | { |
| 410 | + JSON_null() : | |
| 411 | + JSON_value(vt_null) | |
| 412 | + { | |
| 413 | + } | |
| 386 | 414 | virtual ~JSON_null() = default; |
| 387 | 415 | virtual void write(Pipeline*, size_t depth) const; |
| 388 | 416 | }; | ... | ... |
libqpdf/JSON.cc
| ... | ... | @@ -133,6 +133,7 @@ JSON::JSON_array::write(Pipeline* p, size_t depth) const |
| 133 | 133 | } |
| 134 | 134 | |
| 135 | 135 | JSON::JSON_string::JSON_string(std::string const& utf8) : |
| 136 | + JSON_value(vt_string), | |
| 136 | 137 | utf8(utf8), |
| 137 | 138 | encoded(encode_string(utf8)) |
| 138 | 139 | { |
| ... | ... | @@ -145,16 +146,19 @@ JSON::JSON_string::write(Pipeline* p, size_t) const |
| 145 | 146 | } |
| 146 | 147 | |
| 147 | 148 | JSON::JSON_number::JSON_number(long long value) : |
| 149 | + JSON_value(vt_number), | |
| 148 | 150 | encoded(std::to_string(value)) |
| 149 | 151 | { |
| 150 | 152 | } |
| 151 | 153 | |
| 152 | 154 | JSON::JSON_number::JSON_number(double value) : |
| 155 | + JSON_value(vt_number), | |
| 153 | 156 | encoded(QUtil::double_to_string(value, 6)) |
| 154 | 157 | { |
| 155 | 158 | } |
| 156 | 159 | |
| 157 | 160 | JSON::JSON_number::JSON_number(std::string const& value) : |
| 161 | + JSON_value(vt_number), | |
| 158 | 162 | encoded(value) |
| 159 | 163 | { |
| 160 | 164 | } |
| ... | ... | @@ -166,6 +170,7 @@ JSON::JSON_number::write(Pipeline* p, size_t) const |
| 166 | 170 | } |
| 167 | 171 | |
| 168 | 172 | JSON::JSON_bool::JSON_bool(bool val) : |
| 173 | + JSON_value(vt_bool), | |
| 169 | 174 | value(val) |
| 170 | 175 | { |
| 171 | 176 | } |
| ... | ... | @@ -183,6 +188,7 @@ JSON::JSON_null::write(Pipeline* p, size_t) const |
| 183 | 188 | } |
| 184 | 189 | |
| 185 | 190 | JSON::JSON_blob::JSON_blob(std::function<void(Pipeline*)> fn) : |
| 191 | + JSON_value(vt_blob), | |
| 186 | 192 | fn(fn) |
| 187 | 193 | { |
| 188 | 194 | } |
| ... | ... | @@ -376,56 +382,52 @@ JSON::makeBlob(std::function<void(Pipeline*)> fn) |
| 376 | 382 | bool |
| 377 | 383 | JSON::isArray() const |
| 378 | 384 | { |
| 379 | - return nullptr != dynamic_cast<JSON_array const*>(this->m->value.get()); | |
| 385 | + return m->value->type_code == vt_array; | |
| 380 | 386 | } |
| 381 | 387 | |
| 382 | 388 | bool |
| 383 | 389 | JSON::isDictionary() const |
| 384 | 390 | { |
| 385 | - return nullptr != | |
| 386 | - dynamic_cast<JSON_dictionary const*>(this->m->value.get()); | |
| 391 | + return m->value->type_code == vt_dictionary; | |
| 387 | 392 | } |
| 388 | 393 | |
| 389 | 394 | bool |
| 390 | 395 | JSON::getString(std::string& utf8) const |
| 391 | 396 | { |
| 392 | - auto v = dynamic_cast<JSON_string const*>(this->m->value.get()); | |
| 393 | - if (v == nullptr) { | |
| 394 | - return false; | |
| 397 | + if (m->value->type_code == vt_string) { | |
| 398 | + auto v = dynamic_cast<JSON_string const*>(this->m->value.get()); | |
| 399 | + utf8 = v->utf8; | |
| 400 | + return true; | |
| 395 | 401 | } |
| 396 | - utf8 = v->utf8; | |
| 397 | - return true; | |
| 402 | + return false; | |
| 398 | 403 | } |
| 399 | 404 | |
| 400 | 405 | bool |
| 401 | 406 | JSON::getNumber(std::string& value) const |
| 402 | 407 | { |
| 403 | - auto v = dynamic_cast<JSON_number const*>(this->m->value.get()); | |
| 404 | - if (v == nullptr) { | |
| 405 | - return false; | |
| 408 | + if (m->value->type_code == vt_number) { | |
| 409 | + auto v = dynamic_cast<JSON_number const*>(this->m->value.get()); | |
| 410 | + value = v->encoded; | |
| 411 | + return true; | |
| 406 | 412 | } |
| 407 | - value = v->encoded; | |
| 408 | - return true; | |
| 413 | + return false; | |
| 409 | 414 | } |
| 410 | 415 | |
| 411 | 416 | bool |
| 412 | 417 | JSON::getBool(bool& value) const |
| 413 | 418 | { |
| 414 | - auto v = dynamic_cast<JSON_bool const*>(this->m->value.get()); | |
| 415 | - if (v == nullptr) { | |
| 416 | - return false; | |
| 419 | + if (m->value->type_code == vt_bool) { | |
| 420 | + auto v = dynamic_cast<JSON_bool const*>(this->m->value.get()); | |
| 421 | + value = v->value; | |
| 422 | + return true; | |
| 417 | 423 | } |
| 418 | - value = v->value; | |
| 419 | - return true; | |
| 424 | + return false; | |
| 420 | 425 | } |
| 421 | 426 | |
| 422 | 427 | bool |
| 423 | 428 | JSON::isNull() const |
| 424 | 429 | { |
| 425 | - if (dynamic_cast<JSON_null const*>(this->m->value.get())) { | |
| 426 | - return true; | |
| 427 | - } | |
| 428 | - return false; | |
| 430 | + return m->value->type_code == vt_null; | |
| 429 | 431 | } |
| 430 | 432 | |
| 431 | 433 | bool | ... | ... |