| 5949 | */ |
| 5950 | template<typename BasicJsonType> |
| 5951 | std::size_t hash(const BasicJsonType& j) |
| 5952 | { |
| 5953 | using string_t = typename BasicJsonType::string_t; |
| 5954 | using number_integer_t = typename BasicJsonType::number_integer_t; |
| 5955 | using number_unsigned_t = typename BasicJsonType::number_unsigned_t; |
| 5956 | using number_float_t = typename BasicJsonType::number_float_t; |
| 5957 | |
| 5958 | const auto type = static_cast<std::size_t>(j.type()); |
| 5959 | switch (j.type()) |
| 5960 | { |
| 5961 | case BasicJsonType::value_t::null: |
| 5962 | case BasicJsonType::value_t::discarded: |
| 5963 | { |
| 5964 | return combine(type, 0); |
| 5965 | } |
| 5966 | |
| 5967 | case BasicJsonType::value_t::object: |
| 5968 | { |
| 5969 | auto seed = combine(type, j.size()); |
| 5970 | for (const auto& element : j.items()) |
| 5971 | { |
| 5972 | const auto h = std::hash<string_t> {}(element.key()); |
| 5973 | seed = combine(seed, h); |
| 5974 | seed = combine(seed, hash(element.value())); |
| 5975 | } |
| 5976 | return seed; |
| 5977 | } |
| 5978 | |
| 5979 | case BasicJsonType::value_t::array: |
| 5980 | { |
| 5981 | auto seed = combine(type, j.size()); |
| 5982 | for (const auto& element : j) |
| 5983 | { |
| 5984 | seed = combine(seed, hash(element)); |
| 5985 | } |
| 5986 | return seed; |
| 5987 | } |
| 5988 | |
| 5989 | case BasicJsonType::value_t::string: |
| 5990 | { |
| 5991 | const auto h = std::hash<string_t> {}(j.template get_ref<const string_t&>()); |
| 5992 | return combine(type, h); |
| 5993 | } |
| 5994 | |
| 5995 | case BasicJsonType::value_t::boolean: |
| 5996 | { |
| 5997 | const auto h = std::hash<bool> {}(j.template get<bool>()); |
| 5998 | return combine(type, h); |
| 5999 | } |
| 6000 | |
| 6001 | case BasicJsonType::value_t::number_integer: |
| 6002 | { |
| 6003 | const auto h = std::hash<number_integer_t> {}(j.template get<number_integer_t>()); |
| 6004 | return combine(type, h); |
| 6005 | } |
| 6006 | |
| 6007 | case BasicJsonType::value_t::number_unsigned: |
| 6008 | { |
no test coverage detected