| 6020 | */ |
| 6021 | template<typename BasicJsonType> |
| 6022 | std::size_t hash(const BasicJsonType& j) |
| 6023 | { |
| 6024 | using string_t = typename BasicJsonType::string_t; |
| 6025 | using number_integer_t = typename BasicJsonType::number_integer_t; |
| 6026 | using number_unsigned_t = typename BasicJsonType::number_unsigned_t; |
| 6027 | using number_float_t = typename BasicJsonType::number_float_t; |
| 6028 | |
| 6029 | const auto type = static_cast<std::size_t>(j.type()); |
| 6030 | switch (j.type()) |
| 6031 | { |
| 6032 | case BasicJsonType::value_t::null: |
| 6033 | case BasicJsonType::value_t::discarded: |
| 6034 | { |
| 6035 | return combine(type, 0); |
| 6036 | } |
| 6037 | |
| 6038 | case BasicJsonType::value_t::object: |
| 6039 | { |
| 6040 | auto seed = combine(type, j.size()); |
| 6041 | for (const auto& element : j.items()) |
| 6042 | { |
| 6043 | const auto h = std::hash<string_t> {}(element.key()); |
| 6044 | seed = combine(seed, h); |
| 6045 | seed = combine(seed, hash(element.value())); |
| 6046 | } |
| 6047 | return seed; |
| 6048 | } |
| 6049 | |
| 6050 | case BasicJsonType::value_t::array: |
| 6051 | { |
| 6052 | auto seed = combine(type, j.size()); |
| 6053 | for (const auto& element : j) |
| 6054 | { |
| 6055 | seed = combine(seed, hash(element)); |
| 6056 | } |
| 6057 | return seed; |
| 6058 | } |
| 6059 | |
| 6060 | case BasicJsonType::value_t::string: |
| 6061 | { |
| 6062 | const auto h = std::hash<string_t> {}(j.template get_ref<const string_t&>()); |
| 6063 | return combine(type, h); |
| 6064 | } |
| 6065 | |
| 6066 | case BasicJsonType::value_t::boolean: |
| 6067 | { |
| 6068 | const auto h = std::hash<bool> {}(j.template get<bool>()); |
| 6069 | return combine(type, h); |
| 6070 | } |
| 6071 | |
| 6072 | case BasicJsonType::value_t::number_integer: |
| 6073 | { |
| 6074 | const auto h = std::hash<number_integer_t> {}(j.template get<number_integer_t>()); |
| 6075 | return combine(type, h); |
| 6076 | } |
| 6077 | |
| 6078 | case BasicJsonType::value_t::number_unsigned: |
| 6079 | { |
no test coverage detected