diff --git a/include/nlohmann/detail/input/input_adapters.hpp b/include/nlohmann/detail/input/input_adapters.hpp index 923a7aaa..ed9db0f6 100644 --- a/include/nlohmann/detail/input/input_adapters.hpp +++ b/include/nlohmann/detail/input/input_adapters.hpp @@ -339,15 +339,18 @@ struct iterator_input_adapter_factory } }; -// This test breaks astyle formatting when inlined in a template specialization. template<typename T> -inline constexpr bool is_iterator_of_multibyte() +struct is_iterator_of_multibyte { - return sizeof(typename std::iterator_traits<T>::value_type) > 1; -} + using value_type = typename std::iterator_traits<T>::value_type; + enum + { + value = sizeof(value_type) > 1 + }; +}; template<typename IteratorType> -struct iterator_input_adapter_factory<IteratorType, enable_if_t<is_iterator_of_multibyte<IteratorType>()>> +struct iterator_input_adapter_factory<IteratorType, enable_if_t<is_iterator_of_multibyte<IteratorType>::value>> { using iterator_type = IteratorType; using char_type = typename std::iterator_traits<iterator_type>::value_type; diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index dd9b21c4..e45a756f 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -4669,15 +4669,15 @@ struct wide_string_input_helper<BaseInputAdapter, 2> } else if (wc <= 0x7FF) { - utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xC0u | ((wc >> 6u))); - utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | (wc & 0x3Fu)); + utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xC0u | ((static_cast<unsigned int>(wc) >> 6u))); + utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu)); utf8_bytes_filled = 2; } else if (0xD800 > wc or wc >= 0xE000) { - utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xE0u | ((wc >> 12u))); - utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((wc >> 6u) & 0x3Fu)); - utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | (wc & 0x3Fu)); + utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xE0u | ((static_cast<unsigned int>(wc) >> 12u))); + utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((static_cast<unsigned int>(wc) >> 6u) & 0x3Fu)); + utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | (static_cast<unsigned int>(wc) & 0x3Fu)); utf8_bytes_filled = 3; } else @@ -4685,7 +4685,7 @@ struct wide_string_input_helper<BaseInputAdapter, 2> if (JSON_HEDLEY_UNLIKELY(not input.empty())) { const auto wc2 = static_cast<unsigned int>(input.get_character()); - const auto charcode = 0x10000u + (((wc & 0x3FFu) << 10u) | (wc2 & 0x3FFu)); + const auto charcode = 0x10000u + (((static_cast<unsigned int>(wc) & 0x3FFu) << 10u) | (wc2 & 0x3FFu)); utf8_bytes[0] = static_cast<std::char_traits<char>::int_type>(0xF0u | (charcode >> 18u)); utf8_bytes[1] = static_cast<std::char_traits<char>::int_type>(0x80u | ((charcode >> 12u) & 0x3Fu)); utf8_bytes[2] = static_cast<std::char_traits<char>::int_type>(0x80u | ((charcode >> 6u) & 0x3Fu)); @@ -4761,15 +4761,18 @@ struct iterator_input_adapter_factory } }; -// This test breaks astyle formatting when inlined in a template specialization. template<typename T> -inline constexpr bool is_iterator_of_multibyte() +struct is_iterator_of_multibyte { - return sizeof(typename std::iterator_traits<T>::value_type) > 1; -} + using value_type = typename std::iterator_traits<T>::value_type; + enum + { + value = sizeof(value_type) > 1 + }; +}; template<typename IteratorType> -struct iterator_input_adapter_factory<IteratorType, enable_if_t<is_iterator_of_multibyte<IteratorType>()>> +struct iterator_input_adapter_factory<IteratorType, enable_if_t<is_iterator_of_multibyte<IteratorType>::value>> { using iterator_type = IteratorType; using char_type = typename std::iterator_traits<iterator_type>::value_type; @@ -8177,7 +8180,7 @@ class lexer : public lexer_base<BasicJsonType> using token_type = typename lexer_base<BasicJsonType>::token_type; explicit lexer(InputAdapterType&& adapter) - : ia(std::move(adapter)), decimal_point_char(static_cast<char_type>(get_decimal_point())) {} + : ia(std::move(adapter)), decimal_point_char(static_cast<char_int_type>(get_decimal_point())) {} // delete because of pointer members lexer(const lexer&) = delete; @@ -9282,7 +9285,7 @@ scan_number_done: token_type scan_literal(const char_type* literal_text, const std::size_t length, token_type return_type) { - assert(current == literal_text[0]); + assert(std::char_traits<char_type>::to_char_type(current) == literal_text[0]); for (std::size_t i = 1; i < length; ++i) { if (JSON_HEDLEY_UNLIKELY(std::char_traits<char_type>::to_char_type(get()) != literal_text[i])) @@ -9587,7 +9590,7 @@ scan_number_done: number_float_t value_float = 0; /// the decimal point - const char_type decimal_point_char = '.'; + const char_int_type decimal_point_char = '.'; }; } // namespace detail } // namespace nlohmann