Commit d80b63c3c0c43fd6bd9e275c7979ecde57d30264

Authored by m-holger
Committed by Jay Berkenbilt
1 parent 72bf7197

Refactor JSON type checks

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&lt;void(Pipeline*)&gt; 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
... ...