config_file.hpp 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. // (C) Copyright Gennadiy Rozental 2005-2008.
  2. // Use, modification, and distribution are subject to the
  3. // Boost Software License, Version 1.0. (See accompanying file
  4. // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. // See http://www.boost.org/libs/test for the library home page.
  6. //
  7. // File : $RCSfile$
  8. //
  9. // Version : $Revision: 49312 $
  10. //
  11. // Description : defines models configuration file, it's parameter and parameter namespaces
  12. // ***************************************************************************
  13. #ifndef BOOST_RT_FILE_CONFIG_FILE_HPP_010105GER
  14. #define BOOST_RT_FILE_CONFIG_FILE_HPP_010105GER
  15. // Boost.Runtime.Parameter
  16. #include <boost/test/utils/runtime/config.hpp>
  17. #include <boost/test/utils/runtime/file/config_file_iterator.hpp>
  18. // Boost.Test
  19. #include <boost/test/utils/class_properties.hpp>
  20. #include <boost/test/utils/named_params.hpp>
  21. // Boost
  22. #include <boost/optional.hpp>
  23. // STL
  24. #include <list>
  25. namespace boost {
  26. namespace BOOST_RT_PARAM_NAMESPACE {
  27. namespace file {
  28. // ************************************************************************** //
  29. // ************** runtime::file::parameter ************** //
  30. // ************************************************************************** //
  31. class param_namespace;
  32. class parameter {
  33. public:
  34. // Constructor
  35. parameter( cstring name, cstring value, param_namespace const& parent );
  36. BOOST_READONLY_PROPERTY( dstring, (parameter)) p_name;
  37. BOOST_READONLY_PROPERTY( dstring, (parameter)) p_value;
  38. friend std::ostream& operator<<( std::ostream& os, parameter const& );
  39. private:
  40. // Data members
  41. param_namespace const& m_parent;
  42. };
  43. // ************************************************************************** //
  44. // ************** runtime::file::modifiers ************** //
  45. // ************************************************************************** //
  46. namespace {
  47. nfp::typed_keyword<cstring, struct value_marker_t> value_marker;
  48. nfp::typed_keyword<cstring, struct value_delimeter_t> value_delimeter;
  49. nfp::typed_keyword<cstring, struct namespace_delimeter_t> namespace_delimeter;
  50. } // local namespace
  51. // ************************************************************************** //
  52. // ************** runtime::file::param_namespace ************** //
  53. // ************************************************************************** //
  54. class param_namespace {
  55. public:
  56. typedef std::list<parameter>::iterator iterator;
  57. typedef std::list<parameter>::const_iterator const_iterator;
  58. typedef std::list<param_namespace>::iterator sub_ns_iterator;
  59. typedef std::list<param_namespace>::const_iterator sub_ns_const_iterator;
  60. // Public properties
  61. BOOST_READONLY_PROPERTY( dstring, (param_namespace)) p_name;
  62. unit_test::readonly_property<param_namespace const*> p_parent;
  63. void load( config_file_iterator cf_it ) { load( cf_it, nfp::no_params ); }
  64. template<typename Modifier>
  65. void load( config_file_iterator cf_it, Modifier const& m )
  66. {
  67. cstring vm = m.has( value_marker ) ? m[value_marker] : BOOST_RT_PARAM_CSTRING_LITERAL( "\"" );
  68. cstring vd = m.has( value_delimeter ) ? m[value_delimeter] : BOOST_RT_PARAM_CSTRING_LITERAL( "= \t\n\r" );
  69. cstring nd = m.has( namespace_delimeter ) ? m[namespace_delimeter] : BOOST_RT_PARAM_CSTRING_LITERAL( "::" );
  70. load_impl( cf_it, vm, vd, nd );
  71. }
  72. void load( cstring file_name )
  73. {
  74. load( file_name, nfp::no_params );
  75. }
  76. template<typename Modifier>
  77. void load( cstring file_name, Modifier const& m )
  78. {
  79. config_file_iterator cfi( file_name, m );
  80. load( cfi, m );
  81. }
  82. void insert_param( cstring param_name, cstring param_value );
  83. param_namespace& subnamespace( cstring namespace_name ); // find and insert if not present
  84. void clear();
  85. iterator begin() { return m_parameters.begin(); }
  86. const_iterator begin() const { return m_parameters.begin(); }
  87. iterator end() { return m_parameters.end(); }
  88. const_iterator end() const { return m_parameters.end(); }
  89. sub_ns_iterator sub_ns_begin() { return m_subnamespaces.begin(); }
  90. sub_ns_const_iterator sub_ns_begin() const { return m_subnamespaces.begin(); }
  91. sub_ns_iterator sub_ns_end() { return m_subnamespaces.end(); }
  92. sub_ns_const_iterator sub_ns_end() const { return m_subnamespaces.end(); }
  93. void print_full_name( std::ostream& os ) const;
  94. protected:
  95. explicit param_namespace( cstring name, param_namespace const* parent = 0 );
  96. private:
  97. void load_impl( config_file_iterator cf_it,
  98. cstring value_marker_, cstring value_delimeter_, cstring namespace_delimeter_ );
  99. // Data members
  100. std::list<parameter> m_parameters;
  101. std::list<param_namespace> m_subnamespaces;
  102. };
  103. //____________________________________________________________________________//
  104. boost::optional<cstring>
  105. get_param_value( param_namespace const& where_from,
  106. cstring name_part1,
  107. cstring name_part2 = cstring(),
  108. cstring name_part3 = cstring(),
  109. cstring name_part4 = cstring(),
  110. cstring name_part5 = cstring() );
  111. //____________________________________________________________________________//
  112. cstring
  113. get_requ_param_value( param_namespace const& where_from,
  114. cstring name_part1,
  115. cstring name_part2 = cstring(),
  116. cstring name_part3 = cstring(),
  117. cstring name_part4 = cstring(),
  118. cstring name_part5 = cstring() );
  119. //____________________________________________________________________________//
  120. param_namespace const*
  121. get_param_subns( param_namespace const& where_from,
  122. cstring namespace_name );
  123. //____________________________________________________________________________//
  124. // ************************************************************************** //
  125. // ************** runtime::file::config_file ************** //
  126. // ************************************************************************** //
  127. class config_file : public param_namespace {
  128. public:
  129. // Constructor
  130. config_file();
  131. config_file( cstring file_name );
  132. };
  133. } // namespace file
  134. } // namespace BOOST_RT_PARAM_NAMESPACE
  135. } // namespace boost
  136. #endif // BOOST_RT_FILE_CONFIG_FILE_HPP_010105GER