PageRenderTime 31ms CodeModel.GetById 16ms app.highlight 13ms RepoModel.GetById 1ms app.codeStats 0ms

/Src/Dependencies/Boost/boost/property_tree/info_parser.hpp

http://hadesmem.googlecode.com/
C++ Header | 151 lines | 91 code | 11 blank | 49 comment | 2 complexity | 1269598d03e8ab2d42031970fb0d9c54 MD5 | raw file
  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
 20namespace 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
142namespace 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