| // (C) Copyright Gennadiy Rozental 2005-2008. |
| // Use, modification, and distribution are subject to 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) |
| |
| // See http://www.boost.org/libs/test for the library home page. |
| // |
| // File : $RCSfile$ |
| // |
| // Version : $Revision: 49312 $ |
| // |
| // Description : defines models configuration file, it's parameter and parameter namespaces |
| // *************************************************************************** |
| |
| #ifndef BOOST_RT_FILE_CONFIG_FILE_HPP_010105GER |
| #define BOOST_RT_FILE_CONFIG_FILE_HPP_010105GER |
| |
| // Boost.Runtime.Parameter |
| #include <boost/test/utils/runtime/config.hpp> |
| |
| #include <boost/test/utils/runtime/file/config_file_iterator.hpp> |
| |
| // Boost.Test |
| #include <boost/test/utils/class_properties.hpp> |
| #include <boost/test/utils/named_params.hpp> |
| |
| // Boost |
| #include <boost/optional.hpp> |
| |
| // STL |
| #include <list> |
| |
| namespace boost { |
| |
| namespace BOOST_RT_PARAM_NAMESPACE { |
| |
| namespace file { |
| |
| // ************************************************************************** // |
| // ************** runtime::file::parameter ************** // |
| // ************************************************************************** // |
| |
| class param_namespace; |
| |
| class parameter { |
| public: |
| // Constructor |
| parameter( cstring name, cstring value, param_namespace const& parent ); |
| |
| BOOST_READONLY_PROPERTY( dstring, (parameter)) p_name; |
| BOOST_READONLY_PROPERTY( dstring, (parameter)) p_value; |
| |
| friend std::ostream& operator<<( std::ostream& os, parameter const& ); |
| |
| private: |
| // Data members |
| param_namespace const& m_parent; |
| }; |
| |
| // ************************************************************************** // |
| // ************** runtime::file::modifiers ************** // |
| // ************************************************************************** // |
| |
| namespace { |
| nfp::typed_keyword<cstring, struct value_marker_t> value_marker; |
| nfp::typed_keyword<cstring, struct value_delimeter_t> value_delimeter; |
| nfp::typed_keyword<cstring, struct namespace_delimeter_t> namespace_delimeter; |
| } // local namespace |
| |
| // ************************************************************************** // |
| // ************** runtime::file::param_namespace ************** // |
| // ************************************************************************** // |
| |
| class param_namespace { |
| public: |
| typedef std::list<parameter>::iterator iterator; |
| typedef std::list<parameter>::const_iterator const_iterator; |
| typedef std::list<param_namespace>::iterator sub_ns_iterator; |
| typedef std::list<param_namespace>::const_iterator sub_ns_const_iterator; |
| |
| // Public properties |
| BOOST_READONLY_PROPERTY( dstring, (param_namespace)) p_name; |
| unit_test::readonly_property<param_namespace const*> p_parent; |
| |
| void load( config_file_iterator cf_it ) { load( cf_it, nfp::no_params ); } |
| template<typename Modifier> |
| void load( config_file_iterator cf_it, Modifier const& m ) |
| { |
| cstring vm = m.has( value_marker ) ? m[value_marker] : BOOST_RT_PARAM_CSTRING_LITERAL( "\"" ); |
| cstring vd = m.has( value_delimeter ) ? m[value_delimeter] : BOOST_RT_PARAM_CSTRING_LITERAL( "= \t\n\r" ); |
| cstring nd = m.has( namespace_delimeter ) ? m[namespace_delimeter] : BOOST_RT_PARAM_CSTRING_LITERAL( "::" ); |
| |
| load_impl( cf_it, vm, vd, nd ); |
| } |
| void load( cstring file_name ) |
| { |
| load( file_name, nfp::no_params ); |
| } |
| template<typename Modifier> |
| void load( cstring file_name, Modifier const& m ) |
| { |
| config_file_iterator cfi( file_name, m ); |
| |
| load( cfi, m ); |
| } |
| |
| void insert_param( cstring param_name, cstring param_value ); |
| param_namespace& subnamespace( cstring namespace_name ); // find and insert if not present |
| void clear(); |
| |
| iterator begin() { return m_parameters.begin(); } |
| const_iterator begin() const { return m_parameters.begin(); } |
| |
| iterator end() { return m_parameters.end(); } |
| const_iterator end() const { return m_parameters.end(); } |
| |
| sub_ns_iterator sub_ns_begin() { return m_subnamespaces.begin(); } |
| sub_ns_const_iterator sub_ns_begin() const { return m_subnamespaces.begin(); } |
| |
| sub_ns_iterator sub_ns_end() { return m_subnamespaces.end(); } |
| sub_ns_const_iterator sub_ns_end() const { return m_subnamespaces.end(); } |
| |
| void print_full_name( std::ostream& os ) const; |
| |
| protected: |
| explicit param_namespace( cstring name, param_namespace const* parent = 0 ); |
| |
| private: |
| void load_impl( config_file_iterator cf_it, |
| cstring value_marker_, cstring value_delimeter_, cstring namespace_delimeter_ ); |
| |
| // Data members |
| std::list<parameter> m_parameters; |
| std::list<param_namespace> m_subnamespaces; |
| }; |
| |
| //____________________________________________________________________________// |
| |
| boost::optional<cstring> |
| get_param_value( param_namespace const& where_from, |
| cstring name_part1, |
| cstring name_part2 = cstring(), |
| cstring name_part3 = cstring(), |
| cstring name_part4 = cstring(), |
| cstring name_part5 = cstring() ); |
| |
| //____________________________________________________________________________// |
| |
| cstring |
| get_requ_param_value( param_namespace const& where_from, |
| cstring name_part1, |
| cstring name_part2 = cstring(), |
| cstring name_part3 = cstring(), |
| cstring name_part4 = cstring(), |
| cstring name_part5 = cstring() ); |
| |
| //____________________________________________________________________________// |
| |
| param_namespace const* |
| get_param_subns( param_namespace const& where_from, |
| cstring namespace_name ); |
| |
| //____________________________________________________________________________// |
| |
| // ************************************************************************** // |
| // ************** runtime::file::config_file ************** // |
| // ************************************************************************** // |
| |
| class config_file : public param_namespace { |
| public: |
| // Constructor |
| config_file(); |
| config_file( cstring file_name ); |
| }; |
| |
| } // namespace file |
| |
| } // namespace BOOST_RT_PARAM_NAMESPACE |
| |
| } // namespace boost |
| |
| #endif // BOOST_RT_FILE_CONFIG_FILE_HPP_010105GER |