summaryrefslogtreecommitdiff
path: root/boost/test/utils/runtime/file/config_file.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/test/utils/runtime/file/config_file.hpp')
-rw-r--r--boost/test/utils/runtime/file/config_file.hpp182
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