// 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_INPUT_HANDLER_HPP #define JSONCONS_JSON_INPUT_HANDLER_HPP #include #include "jsoncons/jsoncons.hpp" namespace jsoncons { template uint64_t string_to_uinteger(const CharT *s, size_t length) throw(std::overflow_error) { static const uint64_t max_value = std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); static const uint64_t max_value_div_10 = max_value / 10; uint64_t n = 0; for (size_t i = 0; i < length; ++i) { uint64_t x = s[i] - '0'; if (n > max_value_div_10) { throw std::overflow_error("Unsigned overflow"); } n = n * 10; if (n > max_value - x) { throw std::overflow_error("Unsigned overflow"); } n += x; } return n; } template int64_t string_to_integer(bool has_neg, const CharT *s, size_t length) throw(std::overflow_error) { const long long max_value = std::numeric_limits::max JSONCONS_NO_MACRO_EXP(); const long long max_value_div_10 = max_value / 10; long long n = 0; for (size_t i = 0; i < length; ++i) { long long x = s[i] - '0'; if (n > max_value_div_10) { throw std::overflow_error("Integer overflow"); } n = n * 10; if (n > max_value - x) { throw std::overflow_error("Integer overflow"); } n += x; } return has_neg ? -n : n; } template class basic_parsing_context; template class basic_json_input_handler { public: virtual ~basic_json_input_handler() {} void begin_json() { do_begin_json(); } void end_json() { do_end_json(); } void begin_object(const basic_parsing_context& context) { do_begin_object(context); } void end_object(const basic_parsing_context& context) { do_end_object(context); } void begin_array(const basic_parsing_context& context) { do_begin_array(context); } void end_array(const basic_parsing_context& context) { do_end_array(context); } void name(const std::basic_string& name, const basic_parsing_context& context) { do_name(name.data(), name.length(), context); } void name(const CharT* p, size_t length, const basic_parsing_context& context) { do_name(p, length, context); } void value(const std::basic_string& value, const basic_parsing_context& context) { do_string_value(value.data(), value.length(), context); } void value(const CharT* p, size_t length, const basic_parsing_context& context) { do_string_value(p, length, context); } void value(const CharT* p, const basic_parsing_context& context) { do_string_value(p, std::char_traits::length(p), context); } void value(int value, const basic_parsing_context& context) { do_integer_value(value,context); } void value(long value, const basic_parsing_context& context) { do_integer_value(value,context); } void value(long long value, const basic_parsing_context& context) { do_integer_value(value,context); } void value(unsigned int value, const basic_parsing_context& context) { do_uinteger_value(value,context); } void value(unsigned long value, const basic_parsing_context& context) { do_uinteger_value(value,context); } void value(unsigned long long value, const basic_parsing_context& context) { do_uinteger_value(value,context); } void value(float value, uint8_t precision, const basic_parsing_context& context) { do_double_value(value, precision, context); } void value(double value, uint8_t precision, const basic_parsing_context& context) { do_double_value(value, precision, context); } void value(bool value, const basic_parsing_context& context) { do_bool_value(value,context); } void value(null_type, const basic_parsing_context& context) { do_null_value(context); } private: virtual void do_begin_json() = 0; virtual void do_end_json() = 0; virtual void do_begin_object(const basic_parsing_context& context) = 0; virtual void do_end_object(const basic_parsing_context& context) = 0; virtual void do_begin_array(const basic_parsing_context& context) = 0; virtual void do_end_array(const basic_parsing_context& context) = 0; virtual void do_name(const CharT* name, size_t length, const basic_parsing_context& context) = 0; virtual void do_null_value(const basic_parsing_context& context) = 0; virtual void do_string_value(const CharT* value, size_t length, const basic_parsing_context& context) = 0; virtual void do_double_value(double value, uint8_t precision, const basic_parsing_context& context) = 0; virtual void do_integer_value(int64_t value, const basic_parsing_context& context) = 0; virtual void do_uinteger_value(uint64_t value, const basic_parsing_context& context) = 0; virtual void do_bool_value(bool value, const basic_parsing_context& context) = 0; }; template class basic_empty_json_input_handler : public basic_json_input_handler { public: static basic_json_input_handler& instance() { static basic_empty_json_input_handler instance; return instance; } private: void do_begin_json() override { } void do_end_json() override { } void do_begin_object(const basic_parsing_context&) override { } void do_end_object(const basic_parsing_context&) override { } void do_begin_array(const basic_parsing_context&) override { } void do_end_array(const basic_parsing_context&) override { } void do_name(const CharT* p, size_t length, const basic_parsing_context&) override { (void)p; (void)length; } void do_null_value(const basic_parsing_context&) override { } void do_string_value(const CharT* p, size_t length, const basic_parsing_context&) override { (void)p; (void)length; } void do_double_value(double, uint8_t, const basic_parsing_context&) override { } void do_integer_value(int64_t, const basic_parsing_context&) override { } void do_uinteger_value(uint64_t, const basic_parsing_context&) override { } void do_bool_value(bool, const basic_parsing_context&) override { } }; typedef basic_json_input_handler json_input_handler; typedef basic_json_input_handler wjson_input_handler; typedef basic_empty_json_input_handler empty_json_input_handler; typedef basic_empty_json_input_handler wempty_json_input_handler; } #endif