blob: a838974a4c7e227d3c7c814c5abc0f9c66623b29 [file] [log] [blame]
// (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