1 | // ---------------------------------------------------------------------------- |
2 | // Copyright (C) 2002-2006 Marcin Kalicinski |
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_INFO_PARSER_HPP_INCLUDED |
11 | #define BOOST_PROPERTY_TREE_INFO_PARSER_HPP_INCLUDED |
12 | |
13 | #include <boost/property_tree/ptree.hpp> |
14 | #include <boost/property_tree/detail/info_parser_error.hpp> |
15 | #include <boost/property_tree/detail/info_parser_writer_settings.hpp> |
16 | #include <boost/property_tree/detail/info_parser_read.hpp> |
17 | #include <boost/property_tree/detail/info_parser_write.hpp> |
18 | #include <istream> |
19 | |
20 | namespace boost { namespace property_tree { namespace info_parser |
21 | { |
22 | |
23 | /** |
24 | * Read INFO from a the given stream and translate it to a property tree. |
25 | * @note Replaces the existing contents. Strong exception guarantee. |
26 | * @throw info_parser_error If the stream cannot be read, doesn't contain |
27 | * valid INFO, or a conversion fails. |
28 | */ |
29 | template<class Ptree, class Ch> |
30 | void read_info(std::basic_istream<Ch> &stream, Ptree &pt) |
31 | { |
32 | Ptree local; |
33 | read_info_internal(stream, local, std::string(), 0); |
34 | pt.swap(local); |
35 | } |
36 | |
37 | /** |
38 | * Read INFO from a the given stream and translate it to a property tree. |
39 | * @note Replaces the existing contents. Strong exception guarantee. |
40 | * @param default_ptree If parsing fails, pt is set to a copy of this tree. |
41 | */ |
42 | template<class Ptree, class Ch> |
43 | void read_info(std::basic_istream<Ch> &stream, Ptree &pt, |
44 | const Ptree &default_ptree) |
45 | { |
46 | try { |
47 | read_info(stream, pt); |
48 | } catch(file_parser_error &) { |
49 | pt = default_ptree; |
50 | } |
51 | } |
52 | |
53 | /** |
54 | * Read INFO from a the given file and translate it to a property tree. The |
55 | * tree's key type must be a string type, i.e. it must have a nested |
56 | * value_type typedef that is a valid parameter for basic_ifstream. |
57 | * @note Replaces the existing contents. Strong exception guarantee. |
58 | * @throw info_parser_error If the file cannot be read, doesn't contain |
59 | * valid INFO, or a conversion fails. |
60 | */ |
61 | template<class Ptree> |
62 | void read_info(const std::string &filename, Ptree &pt, |
63 | const std::locale &loc = std::locale()) |
64 | { |
65 | std::basic_ifstream<typename Ptree::key_type::value_type> |
66 | stream(filename.c_str()); |
67 | if (!stream) { |
68 | BOOST_PROPERTY_TREE_THROW(info_parser_error( |
69 | "cannot open file for reading" , filename, 0)); |
70 | } |
71 | stream.imbue(loc); |
72 | Ptree local; |
73 | read_info_internal(stream, local, filename, 0); |
74 | pt.swap(local); |
75 | } |
76 | |
77 | /** |
78 | * Read INFO from a the given file and translate it to a property tree. The |
79 | * tree's key type must be a string type, i.e. it must have a nested |
80 | * value_type typedef that is a valid parameter for basic_ifstream. |
81 | * @note Replaces the existing contents. Strong exception guarantee. |
82 | * @param default_ptree If parsing fails, pt is set to a copy of this tree. |
83 | */ |
84 | template<class Ptree> |
85 | void read_info(const std::string &filename, |
86 | Ptree &pt, |
87 | const Ptree &default_ptree, |
88 | const std::locale &loc = std::locale()) |
89 | { |
90 | try { |
91 | read_info(filename, pt, loc); |
92 | } catch(file_parser_error &) { |
93 | pt = default_ptree; |
94 | } |
95 | } |
96 | |
97 | /** |
98 | * Writes a tree to the stream in INFO format. |
99 | * @throw info_parser_error If the stream cannot be written to, or a |
100 | * conversion fails. |
101 | * @param settings The settings to use when writing the INFO data. |
102 | */ |
103 | template<class Ptree, class Ch> |
104 | void write_info(std::basic_ostream<Ch> &stream, |
105 | const Ptree &pt, |
106 | const info_writer_settings<Ch> &settings = |
107 | info_writer_settings<Ch>()) |
108 | { |
109 | write_info_internal(stream, pt, std::string(), settings); |
110 | } |
111 | |
112 | /** |
113 | * Writes a tree to the file in INFO format. The tree's key type must be a |
114 | * string type, i.e. it must have a nested value_type typedef that is a |
115 | * valid parameter for basic_ofstream. |
116 | * @throw info_parser_error If the file cannot be written to, or a |
117 | * conversion fails. |
118 | * @param settings The settings to use when writing the INFO data. |
119 | */ |
120 | template<class Ptree> |
121 | void write_info(const std::string &filename, |
122 | const Ptree &pt, |
123 | const std::locale &loc = std::locale(), |
124 | const info_writer_settings< |
125 | typename Ptree::key_type::value_type |
126 | > &settings = |
127 | info_writer_make_settings< |
128 | typename Ptree::key_type::value_type>()) |
129 | { |
130 | std::basic_ofstream<typename Ptree::key_type::value_type> |
131 | stream(filename.c_str()); |
132 | if (!stream) { |
133 | BOOST_PROPERTY_TREE_THROW(info_parser_error( |
134 | "cannot open file for writing" , filename, 0)); |
135 | } |
136 | stream.imbue(loc); |
137 | write_info_internal(stream, pt, filename, settings); |
138 | } |
139 | |
140 | } } } |
141 | |
142 | namespace boost { namespace property_tree |
143 | { |
144 | using info_parser::info_parser_error; |
145 | using info_parser::read_info; |
146 | using info_parser::write_info; |
147 | using info_parser::info_writer_settings; |
148 | using info_parser::info_writer_make_settings; |
149 | } } |
150 | |
151 | #endif |
152 | |