diff options
Diffstat (limited to 'boost/test/utils/runtime/file/config_file.hpp')
-rw-r--r-- | boost/test/utils/runtime/file/config_file.hpp | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/boost/test/utils/runtime/file/config_file.hpp b/boost/test/utils/runtime/file/config_file.hpp new file mode 100644 index 0000000000..9dac6cfaf5 --- /dev/null +++ b/boost/test/utils/runtime/file/config_file.hpp @@ -0,0 +1,182 @@ +// (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 |