summaryrefslogtreecommitdiff
path: root/boost/property_tree/json_parser/detail/read.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/property_tree/json_parser/detail/read.hpp')
-rw-r--r--boost/property_tree/json_parser/detail/read.hpp90
1 files changed, 90 insertions, 0 deletions
diff --git a/boost/property_tree/json_parser/detail/read.hpp b/boost/property_tree/json_parser/detail/read.hpp
new file mode 100644
index 0000000000..d7f0ba6790
--- /dev/null
+++ b/boost/property_tree/json_parser/detail/read.hpp
@@ -0,0 +1,90 @@
+// ----------------------------------------------------------------------------
+// Copyright (C) 2015 Sebastian Redl
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// For more information, see www.boost.org
+// ----------------------------------------------------------------------------
+#ifndef BOOST_PROPERTY_TREE_DETAIL_JSON_PARSER_READ_HPP
+#define BOOST_PROPERTY_TREE_DETAIL_JSON_PARSER_READ_HPP
+
+#include <boost/property_tree/json_parser/detail/parser.hpp>
+#include <boost/property_tree/json_parser/detail/narrow_encoding.hpp>
+#include <boost/property_tree/json_parser/detail/wide_encoding.hpp>
+#include <boost/property_tree/json_parser/detail/standard_callbacks.hpp>
+
+#include <boost/static_assert.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+#include <istream>
+#include <iterator>
+#include <string>
+
+namespace boost { namespace property_tree {
+ namespace json_parser { namespace detail
+{
+
+ template <typename Iterator, typename Sentinel>
+ class minirange
+ {
+ public:
+ minirange(Iterator first, Sentinel last) : first(first), last(last) {}
+ Iterator begin() const { return first; }
+ Sentinel end() const { return last; }
+
+ private:
+ Iterator first;
+ Sentinel last;
+ };
+ template <typename Iterator, typename Sentinel>
+ minirange<Iterator, Sentinel> make_minirange(Iterator first, Sentinel last)
+ {
+ return minirange<Iterator, Sentinel>(first, last);
+ }
+
+ template <typename Iterator, typename Sentinel,
+ typename Encoding, typename Callbacks>
+ void read_json_internal(Iterator first, Sentinel last, Encoding& encoding,
+ Callbacks& callbacks, const std::string& filename)
+ {
+ BOOST_STATIC_ASSERT_MSG((boost::is_same<
+ typename std::iterator_traits<Iterator>::value_type,
+ typename Encoding::external_char>::value),
+ "Encoding is not capable of using the iterator's value type.");
+ BOOST_STATIC_ASSERT_MSG((boost::is_same<
+ typename Callbacks::char_type,
+ typename Encoding::internal_char>::value),
+ "Encoding is not capable of producing the needed character type.");
+
+ detail::parser<Callbacks, Encoding, Iterator, Sentinel>
+ parser(callbacks, encoding);
+ parser.set_input(filename, make_minirange(first, last));
+ parser.parse_value();
+ parser.finish();
+ }
+
+ template <typename Ch> struct encoding;
+ template <> struct encoding<char> : utf8_utf8_encoding {};
+ template <> struct encoding<wchar_t> : wide_wide_encoding {};
+
+ template <typename Ptree>
+ void read_json_internal(
+ std::basic_istream<typename Ptree::key_type::value_type> &stream,
+ Ptree &pt, const std::string &filename)
+ {
+ typedef typename Ptree::key_type::value_type char_type;
+ typedef standard_callbacks<Ptree> callbacks_type;
+ typedef detail::encoding<char_type> encoding_type;
+ typedef std::istreambuf_iterator<char_type> iterator;
+ callbacks_type callbacks;
+ encoding_type encoding;
+ read_json_internal(iterator(stream), iterator(),
+ encoding, callbacks, filename);
+ pt.swap(callbacks.output());
+ }
+
+}}}}
+
+#endif