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
							 |