]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/boost/property_tree/json_parser/detail/read.hpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / boost / property_tree / json_parser / detail / read.hpp
CommitLineData
7c673cae
FG
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
25namespace 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