Publishing R3
[platform/upstream/dldt.git] / inference-engine / thirdparty / clDNN / common / boost / 1.64.0 / include / boost-1_64 / boost / property_tree / json_parser / detail / read.hpp
1 // ----------------------------------------------------------------------------
2 // Copyright (C) 2015 Sebastian Redl
3 //
4 // Distributed under the Boost Software License, Version 1.0. 
5 // (See accompanying file LICENSE_1_0.txt or copy at 
6 // http://www.boost.org/LICENSE_1_0.txt)
7 //
8 // For more information, see www.boost.org
9 // ----------------------------------------------------------------------------
10 #ifndef BOOST_PROPERTY_TREE_DETAIL_JSON_PARSER_READ_HPP
11 #define BOOST_PROPERTY_TREE_DETAIL_JSON_PARSER_READ_HPP
12
13 #include <boost/property_tree/json_parser/detail/parser.hpp>
14 #include <boost/property_tree/json_parser/detail/narrow_encoding.hpp>
15 #include <boost/property_tree/json_parser/detail/wide_encoding.hpp>
16 #include <boost/property_tree/json_parser/detail/standard_callbacks.hpp>
17
18 #include <boost/static_assert.hpp>
19 #include <boost/type_traits/is_same.hpp>
20
21 #include <istream>
22 #include <iterator>
23 #include <string>
24
25 namespace boost { namespace property_tree {
26     namespace json_parser { namespace detail
27 {
28
29     template <typename Iterator, typename Sentinel>
30     class minirange
31     {
32     public:
33         minirange(Iterator first, Sentinel last) : first(first), last(last) {}
34         Iterator begin() const { return first; }
35         Sentinel end() const { return last; }
36
37     private:
38         Iterator first;
39         Sentinel last;
40     };
41     template <typename Iterator, typename Sentinel>
42     minirange<Iterator, Sentinel> make_minirange(Iterator first, Sentinel last)
43     {
44         return minirange<Iterator, Sentinel>(first, last);
45     }
46
47     template <typename Iterator, typename Sentinel,
48               typename Encoding, typename Callbacks>
49     void read_json_internal(Iterator first, Sentinel last, Encoding& encoding,
50         Callbacks& callbacks, const std::string& filename)
51     {
52         BOOST_STATIC_ASSERT_MSG((boost::is_same<
53             typename std::iterator_traits<Iterator>::value_type,
54             typename Encoding::external_char>::value),
55             "Encoding is not capable of using the iterator's value type.");
56         BOOST_STATIC_ASSERT_MSG((boost::is_same<
57             typename Callbacks::char_type,
58             typename Encoding::internal_char>::value),
59             "Encoding is not capable of producing the needed character type.");
60
61         detail::parser<Callbacks, Encoding, Iterator, Sentinel>
62             parser(callbacks, encoding);
63         parser.set_input(filename, make_minirange(first, last));
64         parser.parse_value();
65         parser.finish();
66     }
67
68     template <typename Ch> struct encoding;
69     template <> struct encoding<char> : utf8_utf8_encoding {};
70     template <> struct encoding<wchar_t> : wide_wide_encoding {};
71
72     template <typename Ptree>
73     void read_json_internal(
74         std::basic_istream<typename Ptree::key_type::value_type> &stream,
75         Ptree &pt, const std::string &filename)
76     {
77         typedef typename Ptree::key_type::value_type char_type;
78         typedef standard_callbacks<Ptree> callbacks_type;
79         typedef detail::encoding<char_type> encoding_type;
80         typedef std::istreambuf_iterator<char_type> iterator;
81         callbacks_type callbacks;
82         encoding_type encoding;
83         read_json_internal(iterator(stream), iterator(),
84             encoding, callbacks, filename);
85         pt.swap(callbacks.output());
86     }
87
88 }}}}
89
90 #endif