Brian Silverman | 836e90c | 2018-08-04 16:19:46 -0700 | [diff] [blame^] | 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 |