| 4678 | */ |
| 4679 | template<typename BasicJsonType> |
| 4680 | std::size_t hash(const BasicJsonType& j) |
| 4681 | { |
| 4682 | using string_t = typename BasicJsonType::string_t; |
| 4683 | using number_integer_t = typename BasicJsonType::number_integer_t; |
| 4684 | using number_unsigned_t = typename BasicJsonType::number_unsigned_t; |
| 4685 | using number_float_t = typename BasicJsonType::number_float_t; |
| 4686 | |
| 4687 | const auto type = static_cast<std::size_t>(j.type()); |
| 4688 | switch (j.type()) |
| 4689 | { |
| 4690 | case BasicJsonType::value_t::null: |
| 4691 | case BasicJsonType::value_t::discarded: |
| 4692 | { |
| 4693 | return combine(type, 0); |
| 4694 | } |
| 4695 | |
| 4696 | case BasicJsonType::value_t::object: |
| 4697 | { |
| 4698 | auto seed = combine(type, j.size()); |
| 4699 | for (const auto& element : j.items()) |
| 4700 | { |
| 4701 | const auto h = std::hash<string_t> {}(element.key()); |
| 4702 | seed = combine(seed, h); |
| 4703 | seed = combine(seed, hash(element.value())); |
| 4704 | } |
| 4705 | return seed; |
| 4706 | } |
| 4707 | |
| 4708 | case BasicJsonType::value_t::array: |
| 4709 | { |
| 4710 | auto seed = combine(type, j.size()); |
| 4711 | for (const auto& element : j) |
| 4712 | { |
| 4713 | seed = combine(seed, hash(element)); |
| 4714 | } |
| 4715 | return seed; |
| 4716 | } |
| 4717 | |
| 4718 | case BasicJsonType::value_t::string: |
| 4719 | { |
| 4720 | const auto h = std::hash<string_t> {}(j.template get_ref<const string_t&>()); |
| 4721 | return combine(type, h); |
| 4722 | } |
| 4723 | |
| 4724 | case BasicJsonType::value_t::boolean: |
| 4725 | { |
| 4726 | const auto h = std::hash<bool> {}(j.template get<bool>()); |
| 4727 | return combine(type, h); |
| 4728 | } |
| 4729 | |
| 4730 | case BasicJsonType::value_t::number_integer: |
| 4731 | { |
| 4732 | const auto h = std::hash<number_integer_t> {}(j.template get<number_integer_t>()); |
| 4733 | return combine(type, h); |
| 4734 | } |
| 4735 | |
| 4736 | case BasicJsonType::value_t::number_unsigned: |
| 4737 | { |
no test coverage detected