You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
151 lines
5.6 KiB
151 lines
5.6 KiB
// ---------------------------------------------------------------------------- |
|
// Copyright (C) 2002-2006 Marcin Kalicinski |
|
// |
|
// 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_INFO_PARSER_HPP_INCLUDED |
|
#define BOOST_PROPERTY_TREE_INFO_PARSER_HPP_INCLUDED |
|
|
|
#include <boost/property_tree/ptree.hpp> |
|
#include <boost/property_tree/detail/info_parser_error.hpp> |
|
#include <boost/property_tree/detail/info_parser_writer_settings.hpp> |
|
#include <boost/property_tree/detail/info_parser_read.hpp> |
|
#include <boost/property_tree/detail/info_parser_write.hpp> |
|
#include <istream> |
|
|
|
namespace boost { namespace property_tree { namespace info_parser |
|
{ |
|
|
|
/** |
|
* Read INFO from a the given stream and translate it to a property tree. |
|
* @note Replaces the existing contents. Strong exception guarantee. |
|
* @throw info_parser_error If the stream cannot be read, doesn't contain |
|
* valid INFO, or a conversion fails. |
|
*/ |
|
template<class Ptree, class Ch> |
|
void read_info(std::basic_istream<Ch> &stream, Ptree &pt) |
|
{ |
|
Ptree local; |
|
read_info_internal(stream, local, std::string(), 0); |
|
pt.swap(local); |
|
} |
|
|
|
/** |
|
* Read INFO from a the given stream and translate it to a property tree. |
|
* @note Replaces the existing contents. Strong exception guarantee. |
|
* @param default_ptree If parsing fails, pt is set to a copy of this tree. |
|
*/ |
|
template<class Ptree, class Ch> |
|
void read_info(std::basic_istream<Ch> &stream, Ptree &pt, |
|
const Ptree &default_ptree) |
|
{ |
|
try { |
|
read_info(stream, pt); |
|
} catch(file_parser_error &) { |
|
pt = default_ptree; |
|
} |
|
} |
|
|
|
/** |
|
* Read INFO from a the given file and translate it to a property tree. The |
|
* tree's key type must be a string type, i.e. it must have a nested |
|
* value_type typedef that is a valid parameter for basic_ifstream. |
|
* @note Replaces the existing contents. Strong exception guarantee. |
|
* @throw info_parser_error If the file cannot be read, doesn't contain |
|
* valid INFO, or a conversion fails. |
|
*/ |
|
template<class Ptree> |
|
void read_info(const std::string &filename, Ptree &pt, |
|
const std::locale &loc = std::locale()) |
|
{ |
|
std::basic_ifstream<typename Ptree::key_type::value_type> |
|
stream(filename.c_str()); |
|
if (!stream) { |
|
BOOST_PROPERTY_TREE_THROW(info_parser_error( |
|
"cannot open file for reading", filename, 0)); |
|
} |
|
stream.imbue(loc); |
|
Ptree local; |
|
read_info_internal(stream, local, filename, 0); |
|
pt.swap(local); |
|
} |
|
|
|
/** |
|
* Read INFO from a the given file and translate it to a property tree. The |
|
* tree's key type must be a string type, i.e. it must have a nested |
|
* value_type typedef that is a valid parameter for basic_ifstream. |
|
* @note Replaces the existing contents. Strong exception guarantee. |
|
* @param default_ptree If parsing fails, pt is set to a copy of this tree. |
|
*/ |
|
template<class Ptree> |
|
void read_info(const std::string &filename, |
|
Ptree &pt, |
|
const Ptree &default_ptree, |
|
const std::locale &loc = std::locale()) |
|
{ |
|
try { |
|
read_info(filename, pt, loc); |
|
} catch(file_parser_error &) { |
|
pt = default_ptree; |
|
} |
|
} |
|
|
|
/** |
|
* Writes a tree to the stream in INFO format. |
|
* @throw info_parser_error If the stream cannot be written to, or a |
|
* conversion fails. |
|
* @param settings The settings to use when writing the INFO data. |
|
*/ |
|
template<class Ptree, class Ch> |
|
void write_info(std::basic_ostream<Ch> &stream, |
|
const Ptree &pt, |
|
const info_writer_settings<Ch> &settings = |
|
info_writer_settings<Ch>()) |
|
{ |
|
write_info_internal(stream, pt, std::string(), settings); |
|
} |
|
|
|
/** |
|
* Writes a tree to the file in INFO format. The tree's key type must be a |
|
* string type, i.e. it must have a nested value_type typedef that is a |
|
* valid parameter for basic_ofstream. |
|
* @throw info_parser_error If the file cannot be written to, or a |
|
* conversion fails. |
|
* @param settings The settings to use when writing the INFO data. |
|
*/ |
|
template<class Ptree> |
|
void write_info(const std::string &filename, |
|
const Ptree &pt, |
|
const std::locale &loc = std::locale(), |
|
const info_writer_settings< |
|
typename Ptree::key_type::value_type |
|
> &settings = |
|
info_writer_make_settings< |
|
typename Ptree::key_type::value_type>()) |
|
{ |
|
std::basic_ofstream<typename Ptree::key_type::value_type> |
|
stream(filename.c_str()); |
|
if (!stream) { |
|
BOOST_PROPERTY_TREE_THROW(info_parser_error( |
|
"cannot open file for writing", filename, 0)); |
|
} |
|
stream.imbue(loc); |
|
write_info_internal(stream, pt, filename, settings); |
|
} |
|
|
|
} } } |
|
|
|
namespace boost { namespace property_tree |
|
{ |
|
using info_parser::info_parser_error; |
|
using info_parser::read_info; |
|
using info_parser::write_info; |
|
using info_parser::info_writer_settings; |
|
using info_parser::info_writer_make_settings; |
|
} } |
|
|
|
#endif
|
|
|