// 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_OUTPUT_HANDLER_HPP #define JSONCONS_JSON_OUTPUT_HANDLER_HPP #include #include "jsoncons/jsoncons.hpp" namespace jsoncons { template void print_integer(int64_t value, buffered_ostream& os) { CharT buf[255]; uint64_t u = (value < 0) ? static_cast(-value) : static_cast(value); CharT* p = buf; do { *p++ = static_cast(48 + u%10); } while (u /= 10); if (value < 0) { os.put('-'); } while (--p >= buf) { os.put(*p); } } template void print_uinteger(uint64_t value, buffered_ostream& os) { CharT buf[255]; CharT* p = buf; do { *p++ = static_cast(48 + value % 10); } while (value /= 10); while (--p >= buf) { os.put(*p); } } template class basic_json_output_handler { public: virtual ~basic_json_output_handler() {} // Overloaded methods void begin_json() { do_begin_json(); } void end_json() { do_end_json(); } void begin_object() { do_begin_object(); } void end_object() { do_end_object(); } void begin_array() { do_begin_array(); } void end_array() { do_end_array(); } void name(const std::basic_string& name) { do_name(name.data(), name.length()); } void name(const CharT* p, size_t length) { do_name(p, length); } void value(const std::basic_string& value) { do_string_value(value.data(), value.length()); } void value(const CharT* p, size_t length) { do_string_value(p, length); } void value(const CharT* p) { do_string_value(p, std::char_traits::length(p)); } void value(int value) { do_integer_value(value); } void value(long value) { do_integer_value(value); } void value(long long value) { do_integer_value(value); } void value(unsigned int value) { do_uinteger_value(value); } void value(unsigned long value) { do_uinteger_value(value); } void value(unsigned long long value) { do_uinteger_value(value); } void value(double value, uint8_t precision = 0) { do_double_value(value, precision); } void value(bool value) { do_bool_value(value); } void value(null_type) { do_null_value(); } private: virtual void do_begin_json() = 0; virtual void do_end_json() = 0; virtual void do_name(const CharT* name, size_t length) = 0; virtual void do_begin_object() = 0; virtual void do_end_object() = 0; virtual void do_begin_array() = 0; virtual void do_end_array() = 0; virtual void do_null_value() = 0; virtual void do_string_value(const CharT* value, size_t length) = 0; virtual void do_double_value(double value, uint8_t precision) = 0; virtual void do_integer_value(int64_t value) = 0; virtual void do_uinteger_value(uint64_t value) = 0; virtual void do_bool_value(bool value) = 0; }; template class null_json_output_handler_impl : public basic_json_output_handler { private: void do_begin_json() override { } void do_end_json() override { } void do_name(const CharT* name, size_t length) override { (void)name; (void)length; } void do_begin_object() override { } void do_end_object() override { } void do_begin_array() override { } void do_end_array() override { } void do_null_value() override { } void do_string_value(const CharT* p, size_t length) override { (void)p; (void)length; } void do_double_value(double, uint8_t) override { } void do_integer_value(int64_t) override { } void do_uinteger_value(uint64_t) override { } void do_bool_value(bool) override { } }; template basic_json_output_handler& null_json_output_handler() { static null_json_output_handler_impl instance; return instance; } typedef basic_json_output_handler json_output_handler; typedef basic_json_output_handler wjson_output_handler; } #endif