91 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| // ----------------------------------------------------------------------------
 | |
| // 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
 | 
