| 14257 | */ |
| 14258 | template<typename BasicJsonType> |
| 14259 | bool contains(const BasicJsonType* ptr) const |
| 14260 | { |
| 14261 | for (const auto& reference_token : reference_tokens) |
| 14262 | { |
| 14263 | switch (ptr->type()) |
| 14264 | { |
| 14265 | case detail::value_t::object: |
| 14266 | { |
| 14267 | if (!ptr->contains(reference_token)) |
| 14268 | { |
| 14269 | // we did not find the key in the object |
| 14270 | return false; |
| 14271 | } |
| 14272 | |
| 14273 | ptr = &ptr->operator[](reference_token); |
| 14274 | break; |
| 14275 | } |
| 14276 | |
| 14277 | case detail::value_t::array: |
| 14278 | { |
| 14279 | if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) |
| 14280 | { |
| 14281 | // "-" always fails the range check |
| 14282 | return false; |
| 14283 | } |
| 14284 | if (JSON_HEDLEY_UNLIKELY(reference_token.size() == 1 && !("0" <= reference_token && reference_token <= "9"))) |
| 14285 | { |
| 14286 | // invalid char |
| 14287 | return false; |
| 14288 | } |
| 14289 | if (JSON_HEDLEY_UNLIKELY(reference_token.size() > 1)) |
| 14290 | { |
| 14291 | if (JSON_HEDLEY_UNLIKELY(!('1' <= reference_token[0] && reference_token[0] <= '9'))) |
| 14292 | { |
| 14293 | // first char should be between '1' and '9' |
| 14294 | return false; |
| 14295 | } |
| 14296 | for (std::size_t i = 1; i < reference_token.size(); i++) |
| 14297 | { |
| 14298 | if (JSON_HEDLEY_UNLIKELY(!('0' <= reference_token[i] && reference_token[i] <= '9'))) |
| 14299 | { |
| 14300 | // other char should be between '0' and '9' |
| 14301 | return false; |
| 14302 | } |
| 14303 | } |
| 14304 | } |
| 14305 | |
| 14306 | const auto idx = array_index<BasicJsonType>(reference_token); |
| 14307 | if (idx >= ptr->size()) |
| 14308 | { |
| 14309 | // index out of range |
| 14310 | return false; |
| 14311 | } |
| 14312 | |
| 14313 | ptr = &ptr->operator[](idx); |
| 14314 | break; |
| 14315 | } |
| 14316 |
nothing calls this directly
no test coverage detected