| 14381 | */ |
| 14382 | template<typename BasicJsonType> |
| 14383 | bool contains(const BasicJsonType* ptr) const |
| 14384 | { |
| 14385 | for (const auto& reference_token : reference_tokens) |
| 14386 | { |
| 14387 | switch (ptr->type()) |
| 14388 | { |
| 14389 | case detail::value_t::object: |
| 14390 | { |
| 14391 | if (!ptr->contains(reference_token)) |
| 14392 | { |
| 14393 | // we did not find the key in the object |
| 14394 | return false; |
| 14395 | } |
| 14396 | |
| 14397 | ptr = &ptr->operator[](reference_token); |
| 14398 | break; |
| 14399 | } |
| 14400 | |
| 14401 | case detail::value_t::array: |
| 14402 | { |
| 14403 | if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) |
| 14404 | { |
| 14405 | // "-" always fails the range check |
| 14406 | return false; |
| 14407 | } |
| 14408 | if (JSON_HEDLEY_UNLIKELY(reference_token.size() == 1 && !("0" <= reference_token && reference_token <= "9"))) |
| 14409 | { |
| 14410 | // invalid char |
| 14411 | return false; |
| 14412 | } |
| 14413 | if (JSON_HEDLEY_UNLIKELY(reference_token.size() > 1)) |
| 14414 | { |
| 14415 | if (JSON_HEDLEY_UNLIKELY(!('1' <= reference_token[0] && reference_token[0] <= '9'))) |
| 14416 | { |
| 14417 | // first char should be between '1' and '9' |
| 14418 | return false; |
| 14419 | } |
| 14420 | for (std::size_t i = 1; i < reference_token.size(); i++) |
| 14421 | { |
| 14422 | if (JSON_HEDLEY_UNLIKELY(!('0' <= reference_token[i] && reference_token[i] <= '9'))) |
| 14423 | { |
| 14424 | // other char should be between '0' and '9' |
| 14425 | return false; |
| 14426 | } |
| 14427 | } |
| 14428 | } |
| 14429 | |
| 14430 | const auto idx = array_index<BasicJsonType>(reference_token); |
| 14431 | if (idx >= ptr->size()) |
| 14432 | { |
| 14433 | // index out of range |
| 14434 | return false; |
| 14435 | } |
| 14436 | |
| 14437 | ptr = &ptr->operator[](idx); |
| 14438 | break; |
| 14439 | } |
| 14440 |
nothing calls this directly
no test coverage detected