// Copyright 2013 Daniel Parker // Distributed under the Boost license, Version 1.0. // (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // See https://github.com/danielaparker/jsoncons for latest version #ifndef JSONCONS_JSON_TYPE_TRAITS_HPP #define JSONCONS_JSON_TYPE_TRAITS_HPP #include #include #include #include #include #include #include #include #include #include "jsoncons/jsoncons.hpp" #if defined(__GNUC__) #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wswitch" #endif namespace jsoncons { template class json_type_traits { public: static bool is(const JsonT&) { return false; } }; template class json_type_traits { public: typedef typename JsonT::string_type string_type; typedef typename string_type::allocator_type string_allocator; static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT { return rhs.is_string(); } static string_type as(const JsonT& rhs) JSONCONS_NOEXCEPT { return rhs.as_string(); } static string_type as(const JsonT& rhs, const string_allocator& allocator) JSONCONS_NOEXCEPT { return rhs.as_string(allocator); } static void assign(JsonT& lhs, const string_type& rhs) { lhs.assign_string(rhs); } }; template class json_type_traits { public: static bool is(const JsonT& lhs) JSONCONS_NOEXCEPT { return lhs.is_any(); } static typename JsonT::any as(const JsonT& rhs) { return rhs.any_value(); } static void assign(JsonT& lhs, typename JsonT::any rhs) { lhs.assign_any(rhs); } }; template class json_type_traits::const_pointer_type> { public: typedef typename JsonT::char_type char_type; static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT { return rhs.is_string(); } static const char_type* as(const JsonT& rhs) { return rhs.as_cstring(); } static void assign(JsonT& lhs, const char_type *rhs) { size_t length = std::char_traits::length(rhs); lhs.assign_string(rhs,length); } }; template class json_type_traits::pointer_type> { public: typedef typename JsonT::char_type char_type; static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT { return rhs.is_string(); } static const char_type* as(const JsonT& rhs) { return rhs.as_cstring(); } static void assign(JsonT& lhs, const char_type *rhs) { size_t length = std::char_traits::length(rhs); lhs.assign_string(rhs,length); } }; template class json_type_traits { public: static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT { if (rhs.is_integer()) { return rhs.as_integer() >= std::numeric_limits::min JSONCONS_NO_MACRO_EXP() && rhs.as_integer() <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); } else { return false; } } static char as(const JsonT& rhs) { return static_cast(rhs.as_integer()); } static void assign(JsonT& lhs, char ch) { lhs.assign_integer(ch); } }; template class json_type_traits { public: static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT { if (rhs.is_integer()) { return rhs.as_integer() >= 0 && static_cast(rhs.as_integer()) <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); } else if (rhs.is_uinteger()) { return rhs.as_uinteger() <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); } else { return false; } } static unsigned char as(const JsonT& rhs) { return static_cast(rhs.as_uinteger()); } static void assign(JsonT& lhs, unsigned char ch) { lhs.assign_uinteger(ch); } }; template class json_type_traits { public: static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT { if (rhs.is_integer()) { return rhs.as_integer() >= std::numeric_limits::min JSONCONS_NO_MACRO_EXP() && rhs.as_integer() <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); } else if (rhs.is_uinteger()) { return rhs.as_uinteger() <= static_cast(std::numeric_limits::max JSONCONS_NO_MACRO_EXP()); } else { return false; } } static signed char as(const JsonT& rhs) { return static_cast(rhs.as_integer()); } static void assign(JsonT& lhs, signed char ch) { lhs.assign_integer(ch); } }; template class json_type_traits { public: static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT { if (rhs.is_integer()) { return rhs.as_integer() >= std::numeric_limits::min JSONCONS_NO_MACRO_EXP() && rhs.as_integer() <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); } else if (rhs.is_uinteger()) { return rhs.as_uinteger() <= static_cast(std::numeric_limits::max JSONCONS_NO_MACRO_EXP()); } else { return false; } } static wchar_t as(const JsonT& rhs) { return static_cast(rhs.as_integer()); } static void assign(JsonT& lhs, wchar_t ch) { lhs.assign_integer(ch); } }; template class json_type_traits { public: static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT { return rhs.is_object(); } static typename JsonT::object as(JsonT rhs) { JSONCONS_ASSERT(rhs.is_object()); return rhs.object_value(); } static void assign(JsonT& lhs, typename JsonT::object rhs) { lhs.assign_object(rhs); } }; template class json_type_traits { public: static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT { return rhs.is_array(); } static typename JsonT::array as(const JsonT& rhs) { JSONCONS_ASSERT(rhs.is_array()); return rhs.array_value(); } static void assign(JsonT& lhs, typename JsonT::array rhs) { lhs.assign_array(rhs); } }; template class json_type_traits { public: static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT { return rhs.is_null(); } static typename jsoncons::null_type as(const JsonT& rhs) { JSONCONS_ASSERT(rhs.is_null()); return jsoncons::null_type(); } static void assign(JsonT& lhs, null_type) { lhs.assign_null(); } }; template class json_type_traits { public: static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT { return rhs.is_bool(); } static bool as(const JsonT& rhs) { return rhs.as_bool(); } static void assign(JsonT& lhs, bool rhs) { lhs.assign_bool(rhs); } }; template class json_type_traits { public: static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT { if (rhs.is_integer()) { return rhs.as_integer() >= std::numeric_limits::min JSONCONS_NO_MACRO_EXP() && rhs.as_integer() <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); } else if (rhs.is_uinteger()) { return rhs.as_uinteger() <= static_cast(std::numeric_limits::max JSONCONS_NO_MACRO_EXP()); } else { return false; } } static short as(const JsonT& rhs) { return static_cast(rhs.as_integer()); } static void assign(JsonT& lhs, short rhs) { lhs.assign_integer(rhs); } }; template class json_type_traits { public: static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT { if (rhs.is_integer()) { return rhs.as_integer() >= 0 && static_cast(rhs.as_integer()) <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); } else if (rhs.is_uinteger()) { return rhs.as_uinteger() <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); } else { return false; } } static unsigned short as(const JsonT& rhs) { return (unsigned short)rhs.as_uinteger(); } static void assign(JsonT& lhs, unsigned short rhs) { lhs.assign_uinteger(rhs); } }; template class json_type_traits { public: static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT { if (rhs.is_integer()) { return rhs.as_integer() >= std::numeric_limits::min JSONCONS_NO_MACRO_EXP() && rhs.as_integer() <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); } else if (rhs.is_uinteger()) { return rhs.as_uinteger() <= static_cast(std::numeric_limits::max JSONCONS_NO_MACRO_EXP()); } else { return false; } } static int as(const JsonT& rhs) { return static_cast(rhs.as_integer()); } static void assign(JsonT& lhs, int rhs) { lhs.assign_integer(rhs); } }; template class json_type_traits { public: static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT { if (rhs.is_integer()) { return rhs.as_integer() >= 0 && static_cast(rhs.as_integer()) <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); } else if (rhs.is_uinteger()) { return rhs.as_uinteger() <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); } else { return false; } } static unsigned int as(const JsonT& rhs) { return static_cast(rhs.as_uinteger()); } static void assign(JsonT& lhs, unsigned int rhs) { lhs.assign_uinteger(rhs); } }; template class json_type_traits { public: static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT { if (rhs.is_integer()) { return rhs.as_integer() >= std::numeric_limits::min JSONCONS_NO_MACRO_EXP() && rhs.as_integer() <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); } else if (rhs.is_uinteger()) { return rhs.as_uinteger() <= static_cast(std::numeric_limits::max JSONCONS_NO_MACRO_EXP()); } else { return false; } } static long as(const JsonT& rhs) { return static_cast(rhs.as_integer()); } static void assign(JsonT& lhs, long rhs) { lhs.assign_integer(rhs); } }; template class json_type_traits { public: static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT { if (rhs.is_integer()) { return rhs.as_integer() >= 0 && static_cast(rhs.as_integer()) <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); } else if (rhs.is_uinteger()) { return rhs.as_uinteger() <= std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); } else { return false; } } static unsigned long as(const JsonT& rhs) { return static_cast(rhs.as_uinteger()); } static void assign(JsonT& lhs, unsigned long rhs) { lhs.assign_uinteger(rhs); } }; template class json_type_traits { public: static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT { return rhs.is_integer(); } static long long as(const JsonT& rhs) { return rhs.as_integer(); } static void assign(JsonT& lhs, long long rhs) { lhs.assign_integer(rhs); } }; template class json_type_traits { public: static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT { return rhs.is_uinteger(); } static unsigned long long as(const JsonT& rhs) { return rhs.as_uinteger(); } static void assign(JsonT& lhs, unsigned long long rhs) { lhs.assign_uinteger(rhs); } }; template class json_type_traits { public: static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT { return rhs.is_double(); } static double as(const JsonT& rhs) { return rhs.as_double(); } static void assign(JsonT& lhs, double rhs) { lhs.assign_double(rhs); } }; template class json_type_traits { public: static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT { return rhs.is_double(); } static double as(const JsonT& rhs) { return static_cast(rhs.as_double()); } static void assign(JsonT& lhs, float rhs) { lhs.assign_double(static_cast(rhs)); } }; template class json_type_traits> { public: static bool is(const JsonT& rhs) JSONCONS_NOEXCEPT { bool result = rhs.is_array(); for (size_t i = 0; result && i < rhs.size(); ++i) { if (!rhs[i].template is()) { result = false; } } return result; } static std::vector as(const JsonT& rhs) { std::vector v(rhs.size()); for (size_t i = 0; i < v.size(); ++i) { v[i] = rhs[i].template as(); } return v; } static void assign(JsonT& lhs, const std::vector& rhs) { lhs = JsonT(rhs.begin(), rhs.end()); } }; } #if defined(__GNUC__) #pragma GCC diagnostic pop #endif #endif