summaryrefslogtreecommitdiff
path: root/boost/test/utils/runtime
diff options
context:
space:
mode:
Diffstat (limited to 'boost/test/utils/runtime')
-rw-r--r--boost/test/utils/runtime/argument.hpp119
-rw-r--r--boost/test/utils/runtime/argument_factory.hpp242
-rw-r--r--boost/test/utils/runtime/cla/argument_factory.hpp216
-rw-r--r--boost/test/utils/runtime/cla/argv_traverser.cpp16
-rw-r--r--boost/test/utils/runtime/cla/argv_traverser.hpp133
-rw-r--r--boost/test/utils/runtime/cla/argv_traverser.ipp212
-rw-r--r--boost/test/utils/runtime/cla/basic_parameter.hpp85
-rw-r--r--boost/test/utils/runtime/cla/char_parameter.cpp16
-rw-r--r--boost/test/utils/runtime/cla/char_parameter.hpp100
-rw-r--r--boost/test/utils/runtime/cla/char_parameter.ipp57
-rw-r--r--boost/test/utils/runtime/cla/detail/argument_value_usage.hpp81
-rw-r--r--boost/test/utils/runtime/cla/dual_name_parameter.cpp16
-rw-r--r--boost/test/utils/runtime/cla/dual_name_parameter.hpp98
-rw-r--r--boost/test/utils/runtime/cla/dual_name_parameter.ipp90
-rw-r--r--boost/test/utils/runtime/cla/fwd.hpp55
-rw-r--r--boost/test/utils/runtime/cla/id_policy.cpp16
-rw-r--r--boost/test/utils/runtime/cla/id_policy.hpp147
-rw-r--r--boost/test/utils/runtime/cla/id_policy.ipp118
-rw-r--r--boost/test/utils/runtime/cla/iface/argument_factory.hpp51
-rw-r--r--boost/test/utils/runtime/cla/iface/id_policy.hpp73
-rw-r--r--boost/test/utils/runtime/cla/modifier.hpp69
-rw-r--r--boost/test/utils/runtime/cla/named_parameter.cpp16
-rw-r--r--boost/test/utils/runtime/cla/named_parameter.hpp95
-rw-r--r--boost/test/utils/runtime/cla/named_parameter.ipp129
-rw-r--r--boost/test/utils/runtime/cla/parameter.hpp151
-rw-r--r--boost/test/utils/runtime/cla/parser.cpp18
-rw-r--r--boost/test/utils/runtime/cla/parser.hpp515
-rw-r--r--boost/test/utils/runtime/cla/parser.ipp267
-rw-r--r--boost/test/utils/runtime/cla/positional_parameter.hpp91
-rw-r--r--boost/test/utils/runtime/cla/typed_parameter.hpp70
-rw-r--r--boost/test/utils/runtime/cla/validation.cpp16
-rw-r--r--boost/test/utils/runtime/cla/validation.hpp57
-rw-r--r--boost/test/utils/runtime/cla/validation.ipp61
-rw-r--r--boost/test/utils/runtime/cla/value_generator.hpp81
-rw-r--r--boost/test/utils/runtime/cla/value_handler.hpp57
-rw-r--r--boost/test/utils/runtime/config.hpp162
-rw-r--r--boost/test/utils/runtime/configuration.hpp61
-rw-r--r--boost/test/utils/runtime/env/environment.cpp23
-rw-r--r--boost/test/utils/runtime/env/environment.hpp171
-rw-r--r--boost/test/utils/runtime/env/environment.ipp125
-rw-r--r--boost/test/utils/runtime/env/fetch.hpp108
-rw-r--r--boost/test/utils/runtime/env/fwd.hpp61
-rw-r--r--boost/test/utils/runtime/env/modifier.hpp47
-rw-r--r--boost/test/utils/runtime/env/variable.hpp223
-rw-r--r--boost/test/utils/runtime/errors.hpp195
-rw-r--r--boost/test/utils/runtime/file/config_file.cpp249
-rw-r--r--boost/test/utils/runtime/file/config_file.hpp182
-rw-r--r--boost/test/utils/runtime/file/config_file_iterator.cpp685
-rw-r--r--boost/test/utils/runtime/file/config_file_iterator.hpp166
-rw-r--r--boost/test/utils/runtime/finalize.hpp56
-rw-r--r--boost/test/utils/runtime/fwd.hpp24
-rw-r--r--boost/test/utils/runtime/interpret_argument_value.hpp163
-rw-r--r--boost/test/utils/runtime/modifier.hpp101
-rw-r--r--boost/test/utils/runtime/parameter.hpp450
-rw-r--r--boost/test/utils/runtime/trace.hpp30
-rw-r--r--boost/test/utils/runtime/validation.hpp85
56 files changed, 1720 insertions, 5281 deletions
diff --git a/boost/test/utils/runtime/argument.hpp b/boost/test/utils/runtime/argument.hpp
index b5133e23c3..879ee96f9f 100644
--- a/boost/test/utils/runtime/argument.hpp
+++ b/boost/test/utils/runtime/argument.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under 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)
@@ -15,45 +15,40 @@
#ifndef BOOST_TEST_UTILS_RUNTIME_ARGUMENT_HPP
#define BOOST_TEST_UTILS_RUNTIME_ARGUMENT_HPP
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
+// Boost.Test Runtime parameters
#include <boost/test/utils/runtime/fwd.hpp>
-#include <boost/test/utils/runtime/validation.hpp>
+#include <boost/test/utils/runtime/errors.hpp>
// Boost.Test
#include <boost/test/utils/class_properties.hpp>
#include <boost/test/utils/rtti.hpp>
+#include <boost/test/utils/basic_cstring/compare.hpp>
+#include <boost/test/detail/throw_exception.hpp>
// STL
#include <cassert>
-namespace boost {
+#include <boost/test/detail/suppress_warnings.hpp>
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
+namespace boost {
+namespace runtime {
// ************************************************************************** //
// ************** runtime::argument ************** //
// ************************************************************************** //
-#ifdef BOOST_MSVC
-# pragma warning(push)
-# pragma warning(disable:4244)
-#endif
-
class argument {
public:
// Constructor
- argument( parameter const& p, rtti::id_t value_type )
- : p_formal_parameter( p )
- , p_value_type( value_type )
+ argument( rtti::id_t value_type )
+ : p_value_type( value_type )
{}
// Destructor
virtual ~argument() {}
// Public properties
- unit_test::readonly_property<parameter const&> p_formal_parameter;
- unit_test::readonly_property<rtti::id_t> p_value_type;
+ rtti::id_t const p_value_type;
};
// ************************************************************************** //
@@ -64,49 +59,73 @@ template<typename T>
class typed_argument : public argument {
public:
// Constructor
- explicit typed_argument( parameter const& p )
- : argument( p, rtti::type_id<T>() )
- {}
- typed_argument( parameter const& p, T const& t )
- : argument( p, rtti::type_id<T>() )
- , p_value( t )
+ explicit typed_argument( T const& v )
+ : argument( rtti::type_id<T>() )
+ , p_value( v )
{}
unit_test::readwrite_property<T> p_value;
};
// ************************************************************************** //
-// ************** runtime::arg_value ************** //
+// ************** runtime::arguments_store ************** //
// ************************************************************************** //
-template<typename T>
-inline T const&
-arg_value( argument const& arg_ )
-{
- assert( arg_.p_value_type == rtti::type_id<T>() ); // detect logic error
-
- return static_cast<typed_argument<T> const&>( arg_ ).p_value.value;
-}
-
-//____________________________________________________________________________//
-
-template<typename T>
-inline T&
-arg_value( argument& arg_ )
-{
- assert( arg_.p_value_type == rtti::type_id<T>() ); // detect logic error
-
- return static_cast<typed_argument<T>&>( arg_ ).p_value.value;
-}
-
-#ifdef BOOST_MSVC
-# pragma warning(pop)
-#endif
-
-//____________________________________________________________________________//
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
+class arguments_store {
+public:
+ typedef std::map<cstring, argument_ptr> storage_type;
+
+ /// Returns number of arguments in the store; mostly used for testing
+ std::size_t size() const { return m_arguments.size(); }
+
+ /// Clears the store for reuse
+ void clear() { m_arguments.clear(); }
+
+ /// Returns true if there is an argument corresponding to the specified parameter name
+ bool has( cstring parameter_name ) const
+ {
+ return m_arguments.find( parameter_name ) != m_arguments.end();
+ }
+
+ /// Provides types access to argument value by parameter name
+ template<typename T>
+ T const& get( cstring parameter_name ) const {
+ return const_cast<arguments_store*>(this)->get<T>( parameter_name );
+ }
+
+ template<typename T>
+ T& get( cstring parameter_name ) {
+ storage_type::const_iterator found = m_arguments.find( parameter_name );
+ BOOST_TEST_I_ASSRT( found != m_arguments.end(),
+ access_to_missing_argument()
+ << "There is no argument provided for parameter "
+ << parameter_name );
+
+ argument_ptr arg = found->second;
+
+ BOOST_TEST_I_ASSRT( arg->p_value_type == rtti::type_id<T>(),
+ arg_type_mismatch()
+ << "Access with invalid type for argument corresponding to parameter "
+ << parameter_name );
+
+ return static_cast<typed_argument<T>&>( *arg ).p_value.value;
+ }
+
+ /// Set's the argument value for specified parameter name
+ template<typename T>
+ void set( cstring parameter_name, T const& value )
+ {
+ m_arguments[parameter_name] = argument_ptr( new typed_argument<T>( value ) );
+ }
+
+private:
+ // Data members
+ storage_type m_arguments;
+};
+} // namespace runtime
} // namespace boost
+#include <boost/test/detail/enable_warnings.hpp>
+
#endif // BOOST_TEST_UTILS_RUNTIME_ARGUMENT_HPP
diff --git a/boost/test/utils/runtime/argument_factory.hpp b/boost/test/utils/runtime/argument_factory.hpp
new file mode 100644
index 0000000000..a163deb9a2
--- /dev/null
+++ b/boost/test/utils/runtime/argument_factory.hpp
@@ -0,0 +1,242 @@
+// (C) Copyright Gennadiy Rozental 2001.
+// Distributed under 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$
+//
+// Description : argument factories for different kinds of parameters
+// ***************************************************************************
+
+#ifndef BOOST_TEST_UTILS_RUNTIME_ARGUMENT_FACTORY_HPP
+#define BOOST_TEST_UTILS_RUNTIME_ARGUMENT_FACTORY_HPP
+
+// Boost.Test Runtime parameters
+#include <boost/test/utils/runtime/errors.hpp>
+#include <boost/test/utils/runtime/argument.hpp>
+
+// Boost.Test
+#include <boost/test/utils/basic_cstring/io.hpp>
+#include <boost/test/utils/basic_cstring/compare.hpp>
+#include <boost/test/utils/string_cast.hpp>
+
+// Boost
+#include <boost/function/function2.hpp>
+
+// STL
+#include <vector>
+
+#include <boost/test/detail/suppress_warnings.hpp>
+
+namespace boost {
+namespace runtime {
+
+// ************************************************************************** //
+// ************** runtime::value_interpreter ************** //
+// ************************************************************************** //
+
+template<typename ValueType, bool is_enum>
+struct value_interpreter;
+
+//____________________________________________________________________________//
+
+template<typename ValueType>
+struct value_interpreter<ValueType, false> {
+ template<typename Modifiers>
+ explicit value_interpreter( Modifiers const& ) {}
+
+ ValueType interpret( cstring param_name, cstring source ) const
+ {
+ ValueType res;
+ if( !unit_test::utils::string_as<ValueType>( source, res ) )
+ BOOST_TEST_I_THROW( format_error( param_name ) << source <<
+ " can't be interpreted as value of parameter " << param_name << "." );
+ return res;
+ }
+};
+
+//____________________________________________________________________________//
+
+template<>
+struct value_interpreter<std::string, false> {
+ template<typename Modifiers>
+ explicit value_interpreter( Modifiers const& ) {}
+
+ std::string interpret( cstring, cstring source ) const
+ {
+ return std::string( source.begin(), source.size() );
+ }
+};
+
+//____________________________________________________________________________//
+
+template<>
+struct value_interpreter<cstring, false> {
+ template<typename Modifiers>
+ explicit value_interpreter( Modifiers const& ) {}
+
+ cstring interpret( cstring, cstring source ) const
+ {
+ return source;
+ }
+};
+
+//____________________________________________________________________________//
+
+template<>
+struct value_interpreter<bool, false> {
+ template<typename Modifiers>
+ explicit value_interpreter( Modifiers const& ) {}
+
+ bool interpret( cstring param_name, cstring source ) const
+ {
+ static cstring const s_YES( "YES" );
+ static cstring const s_Y( "Y" );
+ static cstring const s_NO( "NO" );
+ static cstring const s_N( "N" );
+ static cstring const s_TRUE( "TRUE" );
+ static cstring const s_FALSE( "FALSE" );
+ static cstring const s_one( "1" );
+ static cstring const s_zero( "0" );
+
+ source.trim();
+
+ if( source.is_empty() ||
+ case_ins_eq( source, s_YES ) ||
+ case_ins_eq( source, s_Y ) ||
+ case_ins_eq( source, s_one ) ||
+ case_ins_eq( source, s_TRUE ) )
+ return true;
+
+ if( case_ins_eq( source, s_NO ) ||
+ case_ins_eq( source, s_N ) ||
+ case_ins_eq( source, s_zero ) ||
+ case_ins_eq( source, s_FALSE ) )
+ return false;
+
+ BOOST_TEST_I_THROW( format_error( param_name ) << source << " can't be interpreted as bool value." );
+ }
+};
+
+//____________________________________________________________________________//
+
+template<typename EnumType>
+struct value_interpreter<EnumType, true> {
+ template<typename Modifiers>
+ explicit value_interpreter( Modifiers const& m )
+#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) && !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX)
+ : m_name_to_value( m[enum_values<EnumType>::value] )
+ {
+ }
+#else
+ {
+ std::vector<std::pair<cstring,EnumType> > const& values = m[enum_values<EnumType>::value];
+
+ m_name_to_value.insert( values.begin(), values.end() );
+ }
+#endif
+
+ EnumType interpret( cstring param_name, cstring source ) const
+ {
+ typename std::map<cstring,EnumType>::const_iterator found = m_name_to_value.find( source );
+
+ BOOST_TEST_I_ASSRT( found != m_name_to_value.end(),
+ format_error( param_name ) << source <<
+ " is not a valid enumeration value name for parameter " << param_name << "." );
+
+ return found->second;
+ }
+
+private:
+ // Data members
+ std::map<cstring,EnumType> m_name_to_value;
+};
+
+//____________________________________________________________________________//
+
+// ************************************************************************** //
+// ************** runtime::argument_factory ************** //
+// ************************************************************************** //
+
+template<typename ValueType, bool is_enum, bool repeatable>
+class argument_factory;
+
+//____________________________________________________________________________//
+
+template<typename ValueType, bool is_enum>
+class argument_factory<ValueType, is_enum, false> {
+public:
+ template<typename Modifiers>
+ explicit argument_factory( Modifiers const& m )
+ : m_interpreter( m )
+ , m_optional_value( nfp::opt_get( m, optional_value, ValueType() ) )
+ , m_default_value( nfp::opt_get( m, default_value, ValueType() ) )
+ {
+ }
+
+ void produce_argument( cstring source, cstring param_name, arguments_store& store ) const
+ {
+ store.set( param_name, source.empty() ? m_optional_value : m_interpreter.interpret( param_name, source ) );
+ }
+
+ void produce_default( cstring param_name, arguments_store& store ) const
+ {
+ store.set( param_name, m_default_value );
+ }
+
+private:
+ // Data members
+ typedef value_interpreter<ValueType, is_enum> interp_t;
+ interp_t m_interpreter;
+ ValueType m_optional_value;
+ ValueType m_default_value;
+};
+
+//____________________________________________________________________________//
+
+template<typename ValueType, bool is_enum>
+class argument_factory<ValueType, is_enum, true> {
+public:
+ template<typename Modifiers>
+ explicit argument_factory( Modifiers const& m )
+ : m_interpreter( m )
+ {
+ }
+
+ void produce_argument( cstring source, cstring param_name, arguments_store& store ) const
+ {
+ ValueType value = m_interpreter.interpret( param_name, source );
+
+ if( store.has( param_name ) ) {
+ std::vector<ValueType>& values = store.get<std::vector<ValueType> >( param_name );
+ values.push_back( value );
+ }
+ else {
+ std::vector<ValueType> values( 1, value );
+
+ store.set( param_name, values );
+ }
+
+ }
+ void produce_default( cstring param_name, arguments_store& store ) const
+ {
+ store.set( param_name, std::vector<ValueType>() );
+ }
+
+private:
+ // Data members
+ value_interpreter<ValueType, is_enum> m_interpreter;
+};
+
+//____________________________________________________________________________//
+
+} // namespace runtime
+} // namespace boost
+
+#include <boost/test/detail/enable_warnings.hpp>
+
+#endif // BOOST_TEST_UTILS_RUNTIME_ARGUMENT_FACTORY_HPP
diff --git a/boost/test/utils/runtime/cla/argument_factory.hpp b/boost/test/utils/runtime/cla/argument_factory.hpp
deleted file mode 100644
index 6683540612..0000000000
--- a/boost/test/utils/runtime/cla/argument_factory.hpp
+++ /dev/null
@@ -1,216 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : generic typed_argument_factory implementation
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_ARGUMENT_FACTORY_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_ARGUMENT_FACTORY_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/fwd.hpp>
-#include <boost/test/utils/runtime/validation.hpp>
-#include <boost/test/utils/runtime/argument.hpp>
-#include <boost/test/utils/runtime/trace.hpp>
-#include <boost/test/utils/runtime/interpret_argument_value.hpp>
-
-#include <boost/test/utils/runtime/cla/fwd.hpp>
-#include <boost/test/utils/runtime/cla/value_generator.hpp>
-#include <boost/test/utils/runtime/cla/value_handler.hpp>
-#include <boost/test/utils/runtime/cla/validation.hpp>
-#include <boost/test/utils/runtime/cla/argv_traverser.hpp>
-#include <boost/test/utils/runtime/cla/detail/argument_value_usage.hpp>
-
-#include <boost/test/utils/runtime/cla/iface/argument_factory.hpp>
-
-// Boost
-#include <boost/optional.hpp>
-#include <boost/function/function2.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** default_value_interpreter ************** //
-// ************************************************************************** //
-
-namespace rt_cla_detail {
-
-struct default_value_interpreter {
- template<typename T>
- void operator()( argv_traverser& tr, boost::optional<T>& value )
- {
- if( interpret_argument_value( tr.token(), value, 0 ) )
- tr.next_token();
- }
-};
-
-} // namespace rt_cla_detail
-
-// ************************************************************************** //
-// ************** typed_argument_factory ************** //
-// ************************************************************************** //
-
-template<typename T>
-struct typed_argument_factory : public argument_factory {
- // Constructor
- typed_argument_factory()
- : m_value_interpreter( rt_cla_detail::default_value_interpreter() )
- {}
- BOOST_TEST_UTILS_RUNTIME_PARAM_UNNEEDED_VIRTUAL ~typed_argument_factory() {}
-
- // properties modification
- template<typename Modifier>
- void accept_modifier( Modifier const& m )
- {
- optionally_assign( m_value_handler, m, handler );
- optionally_assign( m_value_interpreter, m, interpreter );
-
- if( m.has( default_value ) ) {
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( !m_value_generator,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "multiple value generators for parameter" ) );
-
- T const& dv_ref = m[default_value];
- m_value_generator = rt_cla_detail::const_generator<T>( dv_ref );
- }
-
- if( m.has( default_refer_to ) ) {
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( !m_value_generator,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "multiple value generators for parameter" ) );
-
- cstring ref_id = m[default_refer_to];
- m_value_generator = rt_cla_detail::ref_generator<T>( ref_id );
- }
-
- if( m.has( assign_to ) ) {
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( !m_value_handler,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "multiple value handlers for parameter" ) );
-
- m_value_handler = rt_cla_detail::assigner<T>( m[assign_to] );
- }
- }
-
- // Argument factory implementation
- virtual argument_ptr produce_using( parameter& p, argv_traverser& tr );
- virtual argument_ptr produce_using( parameter& p, parser const& );
- virtual void argument_usage_info( format_stream& fs );
-
-// !! private?
- // Data members
- boost::function<void (parameter const&,T&)> m_value_handler;
- boost::function<void (parser const&,boost::optional<T>&)> m_value_generator;
- boost::function<void (argv_traverser&,boost::optional<T>&)> m_value_interpreter;
-};
-
-//____________________________________________________________________________//
-
-template<typename T>
-inline argument_ptr
-typed_argument_factory<T>::produce_using( parameter& p, argv_traverser& tr )
-{
- boost::optional<T> value;
-
- BOOST_TEST_IMPL_TRY {
- m_value_interpreter( tr, value );
- }
- BOOST_TEST_IMPL_CATCHALL() { // !! should we do that?
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "Fail to parse argument value" );
-
- if( !p.p_optional_value )
- BOOST_TEST_IMPL_RETHROW;
- }
-
- argument_ptr actual_arg = p.actual_argument();
-
- BOOST_TEST_UTILS_RUNTIME_CLA_VALIDATE_INPUT( !!value || p.p_optional_value, tr,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "Argument value missing for parameter " ) << p.id_2_report() );
-
- BOOST_TEST_UTILS_RUNTIME_CLA_VALIDATE_INPUT( !actual_arg || p.p_multiplicable, tr,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "Unexpected repetition of the parameter " ) << p.id_2_report() );
-
- if( !!value && !!m_value_handler )
- m_value_handler( p, *value );
-
- if( !p.p_multiplicable )
- actual_arg.reset( p.p_optional_value && (rtti::type_id<T>() != rtti::type_id<bool>())
- ? static_cast<argument*>(new typed_argument<boost::optional<T> >( p, value ))
- : static_cast<argument*>(new typed_argument<T>( p, *value )) );
- else {
- typedef std::list<boost::optional<T> > optional_list;
-
- if( !actual_arg )
- actual_arg.reset( p.p_optional_value
- ? static_cast<argument*>(new typed_argument<optional_list>( p ))
- : static_cast<argument*>(new typed_argument<std::list<T> >( p )) );
-
- if( p.p_optional_value ) {
- optional_list& values = arg_value<optional_list>( *actual_arg );
-
- values.push_back( value );
- }
- else {
- std::list<T>& values = arg_value<std::list<T> >( *actual_arg );
-
- values.push_back( *value );
- }
- }
-
- return actual_arg;
-}
-
-//____________________________________________________________________________//
-
-template<typename T>
-inline argument_ptr
-typed_argument_factory<T>::produce_using( parameter& p, parser const& pa )
-{
- argument_ptr actual_arg;
-
- if( !m_value_generator )
- return actual_arg;
-
- boost::optional<T> value;
- m_value_generator( pa, value );
-
- if( !value )
- return actual_arg;
-
- if( !!m_value_handler )
- m_value_handler( p, *value );
-
- actual_arg.reset( new typed_argument<T>( p, *value ) );
-
- return actual_arg;
-}
-
-//____________________________________________________________________________//
-
-template<typename T>
-inline void
-typed_argument_factory<T>::argument_usage_info( format_stream& fs )
-{
- rt_cla_detail::argument_value_usage( fs, 0, reinterpret_cast<T*>(0) );
-}
-
-//____________________________________________________________________________//
-
-} // namespace boost
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace cla
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_ARGUMENT_FACTORY_HPP
diff --git a/boost/test/utils/runtime/cla/argv_traverser.cpp b/boost/test/utils/runtime/cla/argv_traverser.cpp
deleted file mode 100644
index 9716b8fb9c..0000000000
--- a/boost/test/utils/runtime/cla/argv_traverser.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : offline implementation for argc/argv traverser
-// ***************************************************************************
-
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-#include <boost/test/utils/runtime/cla/argv_traverser.ipp>
diff --git a/boost/test/utils/runtime/cla/argv_traverser.hpp b/boost/test/utils/runtime/cla/argv_traverser.hpp
index 6f6e03dfc8..10fb67bde4 100644
--- a/boost/test/utils/runtime/cla/argv_traverser.hpp
+++ b/boost/test/utils/runtime/cla/argv_traverser.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// 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)
@@ -15,86 +15,91 @@
#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_ARGV_TRAVERSER_HPP
#define BOOST_TEST_UTILS_RUNTIME_CLA_ARGV_TRAVERSER_HPP
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
+// Boost.Test Runtime parameters
+#include <boost/test/utils/runtime/fwd.hpp>
-// Boost.Test
-#include <boost/test/utils/class_properties.hpp>
-
-// Boost
-#include <boost/noncopyable.hpp>
-#include <boost/shared_array.hpp>
+#include <boost/test/detail/suppress_warnings.hpp>
namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
+namespace runtime {
namespace cla {
// ************************************************************************** //
// ************** runtime::cla::argv_traverser ************** //
// ************************************************************************** //
-class argv_traverser : noncopyable {
- class parser;
+class argv_traverser {
+ typedef char const** argv_type;
public:
- // Constructor
- argv_traverser();
-
- // public_properties
- unit_test::readwrite_property<bool> p_ignore_mismatch;
- unit_test::readwrite_property<char_type> p_separator;
-
- // argc+argv <-> internal buffer exchange
- void init( int argc, char_type** argv );
- void remainder( int& argc, char_type** argv );
-
- // token based parsing
- cstring token() const;
- void next_token();
-
- // whole input parsing
- cstring input() const;
- void trim( std::size_t size );
- bool match_front( cstring );
- bool match_front( char_type c );
- bool eoi() const;
-
- // transaction logic support
- void commit();
- void rollback();
-
- // current position access; used to save some reference points in input
- std::size_t input_pos() const;
-
- // returns true if mismatch detected during input parsing handled successfully
- bool handle_mismatch();
+ /// Constructs traverser based on argc/argv pair
+ /// argv is taken "by reference" and later can be
+ /// updated in remainder method
+ argv_traverser( int argc, argv_type argv )
+ : m_argc( argc )
+ , m_curr_token( 0 )
+ , m_token_size( 0 )
+ , m_argv( argv )
+ {
+ // save program name
+ save_token();
+ }
+
+ /// Returns new argc
+ int remainder()
+ {
+ return m_argc;
+ }
+
+ /// Returns true, if we reached end on input
+ bool eoi() const
+ {
+ return m_curr_token == m_argc;
+ }
+
+ /// Returns current token in the input
+ cstring current_token()
+ {
+ if( eoi() )
+ return cstring();
+
+ return cstring( m_argv[m_curr_token], m_token_size );
+ }
+
+ /// Saves current token for remainder
+ void save_token()
+ {
+ ++m_curr_token;
+
+ if( !eoi() )
+ m_token_size = ::strlen( m_argv[m_curr_token] );
+ }
+
+ /// Commit current token and iterate to next one
+ void next_token()
+ {
+ if( !eoi() ) {
+ for( std::size_t i = m_curr_token; i < m_argc-1; ++i )
+ m_argv[i] = m_argv[i + 1];
+
+ --m_argc;
+
+ m_token_size = ::strlen( m_argv[m_curr_token] );
+ }
+ }
private:
- // Data members
- dstring m_buffer;
- cstring m_work_buffer;
- cstring m_token;
- cstring::iterator m_commited_end;
-
- shared_array<char_type> m_remainder;
- std::size_t m_remainder_size;
+ // Data members
+ std::size_t m_argc; // total number of arguments
+ std::size_t m_curr_token; // current token index in argv
+ std::size_t m_token_size; // current token size
+ argv_type m_argv; // all arguments
};
} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
+} // namespace runtime
} // namespace boost
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_OFFLINE
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-# define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE inline
-#endif
-# include <boost/test/utils/runtime/cla/argv_traverser.ipp>
-
-#endif
+#include <boost/test/detail/enable_warnings.hpp>
#endif // BOOST_TEST_UTILS_RUNTIME_CLA_ARGV_TRAVERSER_HPP
diff --git a/boost/test/utils/runtime/cla/argv_traverser.ipp b/boost/test/utils/runtime/cla/argv_traverser.ipp
deleted file mode 100644
index d1ae93be82..0000000000
--- a/boost/test/utils/runtime/cla/argv_traverser.ipp
+++ /dev/null
@@ -1,212 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : implements facility to hide input traversing details
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_ARGV_TRAVERSER_IPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_ARGV_TRAVERSER_IPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/trace.hpp>
-
-#include <boost/test/utils/runtime/cla/argv_traverser.hpp>
-
-// STL
-#include <memory>
-#include <cstring>
-
-#ifdef BOOST_NO_STDC_NAMESPACE
-namespace std { using ::memcpy; }
-#endif
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** runtime::cla::argv_traverser ************** //
-// ************************************************************************** //
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-argv_traverser::argv_traverser()
-: p_ignore_mismatch( false ), p_separator( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( ' ' ) )
-{
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-argv_traverser::init( int argc, char_type** argv )
-{
- m_buffer.clear();
-
- for( int index = 1; index < argc; ++index ) {
- m_buffer += argv[index];
- if( index != argc-1 )
- m_buffer += BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( ' ' );
- }
-
- m_remainder.reset( new char_type[m_buffer.size()+1] );
- m_remainder_size = 0;
- m_work_buffer = m_buffer;
- m_commited_end = m_work_buffer.begin();
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "Input buffer: " << m_buffer );
-
- next_token();
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-argv_traverser::remainder( int& argc, char_type** argv )
-{
- argc = 1;
- std::size_t pos = 0;
- while(pos < m_remainder_size ) {
- argv[argc++] = m_remainder.get() + pos;
-
- pos = static_cast<size_t>(std::find( m_remainder.get() + pos, m_remainder.get() + m_remainder_size,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( ' ' ) ) -
- m_remainder.get());
- m_remainder[pos++] = BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '\0' );
- }
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE cstring
-argv_traverser::token() const
-{
- return m_token;
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-argv_traverser::next_token()
-{
- if( m_work_buffer.is_empty() )
- return;
-
- m_work_buffer.trim_left( m_token.size() ); // skip remainder of current token
-
- if( m_work_buffer.size() != m_buffer.size() ) // !! is there a better way to identify first token
- m_work_buffer.trim_left( 1 ); // skip separator if not first token;
-
- m_token.assign( m_work_buffer.begin(),
- std::find( m_work_buffer.begin(), m_work_buffer.end(), p_separator ) );
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE cstring
-argv_traverser::input() const
-{
- return m_work_buffer;
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-argv_traverser::trim( std::size_t size )
-{
- m_work_buffer.trim_left( size );
-
- if( size <= m_token.size() )
- m_token.trim_left( size );
- else {
- m_token.assign( m_work_buffer.begin(),
- std::find( m_work_buffer.begin(), m_work_buffer.end(), p_separator ) );
- }
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE bool
-argv_traverser::match_front( cstring str )
-{
- return m_work_buffer.size() < str.size() ? false : m_work_buffer.substr( 0, str.size() ) == str;
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE bool
-argv_traverser::match_front( char_type c )
-{
- return first_char( m_work_buffer ) == c;
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE bool
-argv_traverser::eoi() const
-{
- return m_work_buffer.is_empty();
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-argv_traverser::commit()
-{
- m_commited_end = m_work_buffer.begin();
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-argv_traverser::rollback()
-{
- m_work_buffer.assign( m_commited_end, m_work_buffer.end() );
- m_token.assign( m_work_buffer.begin(),
- std::find( m_work_buffer.begin(), m_work_buffer.end(), p_separator ) );
-
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE std::size_t
-argv_traverser::input_pos() const
-{
- return static_cast<std::size_t>(m_work_buffer.begin() - m_commited_end);
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE bool
-argv_traverser::handle_mismatch()
-{
- if( !p_ignore_mismatch )
- return false;
-
- std::memcpy( m_remainder.get() + m_remainder_size, token().begin(), token().size() );
- m_remainder_size += token().size();
- m_remainder[m_remainder_size++] = p_separator;
-
- next_token();
- commit();
-
- return true;
-}
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_ARGV_TRAVERSER_IPP
diff --git a/boost/test/utils/runtime/cla/basic_parameter.hpp b/boost/test/utils/runtime/cla/basic_parameter.hpp
deleted file mode 100644
index 817b12a301..0000000000
--- a/boost/test/utils/runtime/cla/basic_parameter.hpp
+++ /dev/null
@@ -1,85 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : generic custom parameter generator
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_BASIC_PARAMETER_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_BASIC_PARAMETER_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/typed_parameter.hpp>
-
-// Boost.Test
-#include <boost/test/utils/rtti.hpp>
-
-// Boost
-#include <boost/utility/base_from_member.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** runtime::cla::basic_parameter ************** //
-// ************************************************************************** //
-
-template<typename T, typename IdPolicy>
-class basic_parameter : private base_from_member<IdPolicy>, public typed_parameter<T> {
-public:
- // Constructors
- explicit basic_parameter( cstring n )
- : base_from_member<IdPolicy>()
- , typed_parameter<T>( base_from_member<IdPolicy>::member )
- {
- this->accept_modifier( name = n );
- }
-
- // parameter properties modification
- template<typename Modifier>
- void accept_modifier( Modifier const& m )
- {
- typed_parameter<T>::accept_modifier( m );
-
- base_from_member<IdPolicy>::member.accept_modifier( m );
- }
-};
-
-//____________________________________________________________________________//
-
-#define BOOST_TEST_UTILS_RUNTIME_CLA_NAMED_PARAM_GENERATORS( param_type ) \
-template<typename T> \
-inline shared_ptr<param_type ## _t<T> > \
-param_type( cstring name = cstring() ) \
-{ \
- return shared_ptr<param_type ## _t<T> >( new param_type ## _t<T>( name ) ); \
-} \
- \
-inline shared_ptr<param_type ## _t<cstring> > \
-param_type( cstring name = cstring() ) \
-{ \
- return shared_ptr<param_type ## _t<cstring> >( new param_type ## _t<cstring>( name ) ); \
-} \
-/**/
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_BASIC_PARAMETER_HPP
diff --git a/boost/test/utils/runtime/cla/char_parameter.cpp b/boost/test/utils/runtime/cla/char_parameter.cpp
deleted file mode 100644
index 6e85fe4136..0000000000
--- a/boost/test/utils/runtime/cla/char_parameter.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : offline implementation of char parameter
-// ***************************************************************************
-
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-#include <boost/test/utils/runtime/cla/char_parameter.ipp>
diff --git a/boost/test/utils/runtime/cla/char_parameter.hpp b/boost/test/utils/runtime/cla/char_parameter.hpp
deleted file mode 100644
index 0e2928b1af..0000000000
--- a/boost/test/utils/runtime/cla/char_parameter.hpp
+++ /dev/null
@@ -1,100 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : defines model of parameter with single char name
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_CHAR_PARAMETER_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_CHAR_PARAMETER_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-#include <boost/test/utils/runtime/validation.hpp>
-
-#include <boost/test/utils/runtime/cla/basic_parameter.hpp>
-#include <boost/test/utils/runtime/cla/id_policy.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** char_name_policy ************** //
-// ************************************************************************** //
-
-class char_name_policy : public basic_naming_policy {
-public:
- // Constructor
- char_name_policy();
- BOOST_TEST_UTILS_RUNTIME_PARAM_UNNEEDED_VIRTUAL ~char_name_policy() {}
-
- // policy interface
- virtual bool conflict_with( identification_policy const& ) const;
-
- // Accept modifier
- template<typename Modifier>
- void accept_modifier( Modifier const& m )
- {
- basic_naming_policy::accept_modifier( m );
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( p_name->size() <= 1, "Invalid parameter name " << p_name );
- }
-};
-
-// ************************************************************************** //
-// ************** runtime::cla::char_parameter ************** //
-// ************************************************************************** //
-
-template<typename T>
-class char_parameter_t : public basic_parameter<T,char_name_policy> {
- typedef basic_parameter<T,char_name_policy> base;
-public:
- // Constructors
- explicit char_parameter_t( char_type name ) : base( cstring( &name, 1 ) ) {}
-};
-
-//____________________________________________________________________________//
-
-template<typename T>
-inline shared_ptr<char_parameter_t<T> >
-char_parameter( char_type name )
-{
- return shared_ptr<char_parameter_t<T> >( new char_parameter_t<T>( name ) );
-}
-
-//____________________________________________________________________________//
-
-inline shared_ptr<char_parameter_t<cstring> >
-char_parameter( char_type name )
-{
- return shared_ptr<char_parameter_t<cstring> >( new char_parameter_t<cstring>( name ) );
-}
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_OFFLINE
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-# define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE inline
-#endif
-# include <boost/test/utils/runtime/cla/char_parameter.ipp>
-
-#endif
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_CHAR_PARAMETER_HPP
diff --git a/boost/test/utils/runtime/cla/char_parameter.ipp b/boost/test/utils/runtime/cla/char_parameter.ipp
deleted file mode 100644
index 398ce79ac4..0000000000
--- a/boost/test/utils/runtime/cla/char_parameter.ipp
+++ /dev/null
@@ -1,57 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : implements model of parameter with single char name
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_CHAR_PARAMETER_IPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_CHAR_PARAMETER_IPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/char_parameter.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** char_name_policy ************** //
-// ************************************************************************** //
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-char_name_policy::char_name_policy()
-: basic_naming_policy( rtti::type_id<char_name_policy>() )
-{
- assign_op( p_prefix.value, BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "-" ), 0 );
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE bool
-char_name_policy::conflict_with( identification_policy const& id ) const
-{
- return id.p_type_id == p_type_id &&
- p_name == static_cast<char_name_policy const&>( id ).p_name;
-}
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_CHAR_PARAMETER_IPP
diff --git a/boost/test/utils/runtime/cla/detail/argument_value_usage.hpp b/boost/test/utils/runtime/cla/detail/argument_value_usage.hpp
deleted file mode 100644
index a70b6d1fb7..0000000000
--- a/boost/test/utils/runtime/cla/detail/argument_value_usage.hpp
+++ /dev/null
@@ -1,81 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Distributed under 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$
-//
-// Description : argument usage printing helpers
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_ARGUMENT_VALUE_USAGE_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_ARGUMENT_VALUE_USAGE_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-#include <boost/test/utils/runtime/cla/argv_traverser.hpp>
-
-// Boost.Test
-#include <boost/test/utils/basic_cstring/io.hpp>
-#include <boost/test/utils/basic_cstring/compare.hpp>
-
-#include <boost/lexical_cast.hpp>
-
-// STL
-// !! can we eliminate these includes?
-#include <list>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-namespace rt_cla_detail {
-
-// ************************************************************************** //
-// ************** argument_value_usage ************** //
-// ************************************************************************** //
-
-// generic case
-template<typename T>
-inline void
-argument_value_usage( format_stream& fs, long, T* = 0 )
-{
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "<value>" );
-}
-
-//____________________________________________________________________________//
-
-// specialization for list of values
-template<typename T>
-inline void
-argument_value_usage( format_stream& fs, int, std::list<T>* = 0 )
-{
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "(<value1>, ..., <valueN>)" );
-}
-
-//____________________________________________________________________________//
-
-// specialization for type bool
-inline void
-argument_value_usage( format_stream& fs, int, bool* = 0 )
-{
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "yes|y|no|n" );
-}
-
-//____________________________________________________________________________//
-
-} // namespace rt_cla_detail
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_ARGUMENT_VALUE_USAGE_HPP
diff --git a/boost/test/utils/runtime/cla/dual_name_parameter.cpp b/boost/test/utils/runtime/cla/dual_name_parameter.cpp
deleted file mode 100644
index ab034ff04c..0000000000
--- a/boost/test/utils/runtime/cla/dual_name_parameter.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : offline implementation of generic parameter with dual naming
-// ***************************************************************************
-
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-#include <boost/test/utils/runtime/cla/dual_name_parameter.ipp>
diff --git a/boost/test/utils/runtime/cla/dual_name_parameter.hpp b/boost/test/utils/runtime/cla/dual_name_parameter.hpp
deleted file mode 100644
index 789b67ad1d..0000000000
--- a/boost/test/utils/runtime/cla/dual_name_parameter.hpp
+++ /dev/null
@@ -1,98 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : defines model of generic parameter with dual naming
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_DUAL_NAME_PARAMETER_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_DUAL_NAME_PARAMETER_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/named_parameter.hpp>
-#include <boost/test/utils/runtime/cla/char_parameter.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** dual_name_policy ************** //
-// ************************************************************************** //
-
-class dual_name_policy : public dual_id_policy<dual_name_policy,string_name_policy,char_name_policy> {
-public:
- dual_name_policy();
-
- // Accept modifier
- template<typename Modifier>
- void accept_modifier( Modifier const& m )
- {
- if( m.has( prefix ) ) {
- set_prefix( m[prefix] );
- m.erase( prefix );
- }
-
- if( m.has( name ) ) {
- set_name( m[name] );
- m.erase( name );
- }
-
- if( m.has( separator ) ) {
- set_separator( m[separator] );
- m.erase( separator );
- }
-
- dual_id_policy<dual_name_policy,string_name_policy,char_name_policy>::accept_modifier( m );
- }
-private:
- void set_prefix( cstring );
- void set_name( cstring );
- void set_separator( cstring );
-};
-
-// ************************************************************************** //
-// ************** runtime::cla::dual_name_parameter ************** //
-// ************************************************************************** //
-
-template<typename T>
-class dual_name_parameter_t : public basic_parameter<T,dual_name_policy> {
- typedef basic_parameter<T,dual_name_policy> base;
-public:
- // Constructors
- explicit dual_name_parameter_t( cstring name ) : base( name ) {}
-};
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_CLA_NAMED_PARAM_GENERATORS( dual_name_parameter )
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_OFFLINE
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-# define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE inline
-#endif
-# include <boost/test/utils/runtime/cla/dual_name_parameter.ipp>
-
-#endif
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_DUAL_NAME_PARAMETER_HPP
diff --git a/boost/test/utils/runtime/cla/dual_name_parameter.ipp b/boost/test/utils/runtime/cla/dual_name_parameter.ipp
deleted file mode 100644
index e39d132d62..0000000000
--- a/boost/test/utils/runtime/cla/dual_name_parameter.ipp
+++ /dev/null
@@ -1,90 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : implements model of generic parameter with dual naming
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_DUAL_NAME_PARAMETER_IPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_DUAL_NAME_PARAMETER_IPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-#include <boost/test/utils/runtime/validation.hpp>
-
-#include <boost/test/utils/runtime/cla/dual_name_parameter.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** dual_name_policy ************** //
-// ************************************************************************** //
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-dual_name_policy::dual_name_policy()
-{
- m_primary.accept_modifier( prefix = BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "--" ) );
- m_secondary.accept_modifier( prefix = BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "-" ) );
-}
-
-//____________________________________________________________________________//
-
-namespace {
-
-template<typename K>
-inline void
-split( string_name_policy& snp, char_name_policy& cnp, cstring src, K const& k )
-{
- cstring::iterator sep = std::find( src.begin(), src.end(), BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '|' ) );
-
- if( sep != src.begin() )
- snp.accept_modifier( k = cstring( src.begin(), sep ) );
-
- if( sep != src.end() )
- cnp.accept_modifier( k = cstring( sep+1, src.end() ) );
-}
-
-} // local namespace
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-dual_name_policy::set_prefix( cstring src )
-{
- split( m_primary, m_secondary, src, prefix );
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-dual_name_policy::set_name( cstring src )
-{
- split( m_primary, m_secondary, src, name );
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-dual_name_policy::set_separator( cstring src )
-{
- split( m_primary, m_secondary, src, separator );
-}
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_DUAL_NAME_PARAMETER_IPP
diff --git a/boost/test/utils/runtime/cla/fwd.hpp b/boost/test/utils/runtime/cla/fwd.hpp
deleted file mode 100644
index df02974345..0000000000
--- a/boost/test/utils/runtime/cla/fwd.hpp
+++ /dev/null
@@ -1,55 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : cla subsystem forward declarations
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_FWD_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_FWD_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-// Boost
-#include <boost/shared_ptr.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-class parser;
-class parameter;
-typedef shared_ptr<parameter> parameter_ptr;
-class naming_policy;
-typedef shared_ptr<naming_policy> naming_policy_ptr;
-class argv_traverser;
-
-namespace rt_cla_detail {
-
-template<typename T> class const_generator;
-template<typename T> class ref_generator;
-
-template<typename T> class assigner;
-
-class named_parameter_base;
-class positional_parameter_base;
-
-} // namespace rt_cla_detail
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_FWD_HPP
diff --git a/boost/test/utils/runtime/cla/id_policy.cpp b/boost/test/utils/runtime/cla/id_policy.cpp
deleted file mode 100644
index b000e26f94..0000000000
--- a/boost/test/utils/runtime/cla/id_policy.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : some generic identification policies offline implementation
-// ***************************************************************************
-
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-#include <boost/test/utils/runtime/cla/id_policy.ipp>
diff --git a/boost/test/utils/runtime/cla/id_policy.hpp b/boost/test/utils/runtime/cla/id_policy.hpp
deleted file mode 100644
index 3308b07c61..0000000000
--- a/boost/test/utils/runtime/cla/id_policy.hpp
+++ /dev/null
@@ -1,147 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : some generic identification policies definition
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_ID_POLICY_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_ID_POLICY_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/fwd.hpp>
-#include <boost/test/utils/runtime/cla/modifier.hpp>
-#include <boost/test/utils/runtime/cla/argv_traverser.hpp>
-
-#include <boost/test/utils/runtime/cla/iface/id_policy.hpp>
-
-// Boost.Test
-#include <boost/test/utils/class_properties.hpp>
-#include <boost/test/utils/rtti.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** naming_policy_base ************** //
-// ************************************************************************** //
-// model: <prefix> <name> <separtor>
-
-class basic_naming_policy : public identification_policy {
-public:
- // Public properties
- unit_test::readwrite_property<dstring> p_prefix;
- unit_test::readwrite_property<dstring> p_name;
- unit_test::readwrite_property<dstring> p_separator;
-
- // Policy interface
- virtual bool responds_to( cstring name ) const { return p_name == name; }
- virtual cstring id_2_report() const { return p_name.get(); }
- virtual void usage_info( format_stream& fs ) const;
- virtual bool matching( parameter const& p, argv_traverser& tr, bool primary ) const;
-
- // Accept modifier
- template<typename Modifier>
- void accept_modifier( Modifier const& m )
- {
- nfp::optionally_assign( p_prefix.value, m, prefix );
- nfp::optionally_assign( p_name.value, m, name );
- nfp::optionally_assign( p_separator.value, m, separator );
- }
-
-protected:
- explicit basic_naming_policy( rtti::id_t dyn_type )
- : identification_policy( dyn_type )
- {}
- BOOST_TEST_UTILS_RUNTIME_PARAM_UNNEEDED_VIRTUAL ~basic_naming_policy() {}
-
- // Naming policy interface
- virtual bool match_prefix( argv_traverser& tr ) const;
- virtual bool match_name( argv_traverser& tr ) const;
- virtual bool match_separator( argv_traverser& tr, bool optional_value ) const;
-};
-
-// ************************************************************************** //
-// ************** dual_id_policy ************** //
-// ************************************************************************** //
-
-template<typename MostDerived,typename PrimaryId,typename SecondId>
-class dual_id_policy : public identification_policy {
-public:
- // Constructor
- dual_id_policy()
- : identification_policy( rtti::type_id<MostDerived>() )
- , m_primary()
- , m_secondary()
- {}
-
- // Policy interface
- virtual bool responds_to( cstring name ) const
- {
- return m_primary.responds_to( name ) || m_secondary.responds_to( name );
- }
- virtual bool conflict_with( identification_policy const& id_p ) const
- {
- return id_p.conflict_with( m_primary ) || id_p.conflict_with( m_secondary );
- }
- virtual cstring id_2_report() const
- {
- return m_primary.id_2_report();
- }
- virtual void usage_info( format_stream& fs ) const
- {
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '{' );
- m_primary.usage_info( fs );
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '|' );
- m_secondary.usage_info( fs );
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '}' );
- }
- virtual bool matching( parameter const& p, argv_traverser& tr, bool primary ) const
- {
- return m_primary.matching( p, tr, primary ) || m_secondary.matching( p, tr, primary );
- }
-
- // Accept modifier
- template<typename Modifier>
- void accept_modifier( Modifier const& m )
- {
- m_primary.accept_modifier( m );
- m_secondary.accept_modifier( m );
- }
-
-protected:
- BOOST_TEST_UTILS_RUNTIME_PARAM_UNNEEDED_VIRTUAL ~dual_id_policy() {}
-
- // Data members
- PrimaryId m_primary;
- SecondId m_secondary;
-};
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_OFFLINE
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-# define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE inline
-#endif
-# include <boost/test/utils/runtime/cla/id_policy.ipp>
-
-#endif
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_ID_POLICY_HPP
diff --git a/boost/test/utils/runtime/cla/id_policy.ipp b/boost/test/utils/runtime/cla/id_policy.ipp
deleted file mode 100644
index 879ccfd1e1..0000000000
--- a/boost/test/utils/runtime/cla/id_policy.ipp
+++ /dev/null
@@ -1,118 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : some generic identification policies implementation
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_ID_POLICY_IPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_ID_POLICY_IPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/id_policy.hpp>
-#include <boost/test/utils/runtime/cla/parameter.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** basic_naming_policy ************** //
-// ************************************************************************** //
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-basic_naming_policy::usage_info( format_stream& fs ) const
-{
- fs << p_prefix << p_name << p_separator;
-
- if( p_separator->empty() )
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( ' ' );
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE bool
-basic_naming_policy::match_prefix( argv_traverser& tr ) const
-{
- if( !tr.match_front( p_prefix.get() ) )
- return false;
-
- tr.trim( p_prefix->size() );
- return true;
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE bool
-basic_naming_policy::match_name( argv_traverser& tr ) const
-{
- if( !tr.match_front( p_name.get() ) )
- return false;
-
- tr.trim( p_name->size() );
- return true;
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE bool
-basic_naming_policy::match_separator( argv_traverser& tr, bool optional_value ) const
-{
- if( p_separator->empty() ) {
- if( !tr.token().is_empty() )
- return false;
-
- tr.trim( 1 );
- }
- else {
- if( !tr.match_front( p_separator.get() ) ) {
- // if parameter has optional value separator is optional as well
- if( optional_value && ( tr.eoi() || tr.match_front( ' ' ) ) ) {
- return true;
- }
- return false;
- }
-
- tr.trim( p_separator->size() );
- }
-
- return true;
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE bool
-basic_naming_policy::matching( parameter const& p, argv_traverser& tr, bool ) const
-{
- if( !match_prefix( tr ) )
- return false;
-
- if( !match_name( tr ) )
- return false;
-
- if( !match_separator( tr, p.p_optional_value ) )
- return false;
-
- return true;
-}
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_ID_POLICY_IPP
diff --git a/boost/test/utils/runtime/cla/iface/argument_factory.hpp b/boost/test/utils/runtime/cla/iface/argument_factory.hpp
deleted file mode 100644
index cbca713bd3..0000000000
--- a/boost/test/utils/runtime/cla/iface/argument_factory.hpp
+++ /dev/null
@@ -1,51 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : defines interface for argument_factory
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_IFACE_ARGUMENT_FACTORY_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_IFACE_ARGUMENT_FACTORY_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-#include <boost/test/utils/runtime/fwd.hpp>
-
-#include <boost/test/utils/runtime/cla/fwd.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** argument_factory ************** //
-// ************************************************************************** //
-// another name can be argument production policy
-
-class argument_factory {
-public:
- // Argument factory interface
- virtual argument_ptr produce_using( parameter& p, argv_traverser& tr ) = 0; /// produce argument based on input
- virtual argument_ptr produce_using( parameter& p, parser const& ) = 0; /// produce argument based on internal generator and/or values of other parameters
- virtual void argument_usage_info( format_stream& fs ) = 0; /// argument value format information
-protected:
- BOOST_TEST_PROTECTED_VIRTUAL ~argument_factory() {}
-};
-
-} // namespace boost
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace cla
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_IFACE_ARGUMENT_FACTORY_HPP
diff --git a/boost/test/utils/runtime/cla/iface/id_policy.hpp b/boost/test/utils/runtime/cla/iface/id_policy.hpp
deleted file mode 100644
index 5fa13e6bc7..0000000000
--- a/boost/test/utils/runtime/cla/iface/id_policy.hpp
+++ /dev/null
@@ -1,73 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : defines interface for identification_policy
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_IFACE_ID_POLICY_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_IFACE_ID_POLICY_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/fwd.hpp>
-
-// Boost.Test
-#include <boost/test/utils/class_properties.hpp>
-#include <boost/test/utils/rtti.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** identification_policy ************** //
-// ************************************************************************** //
-
-#ifdef BOOST_MSVC
-# pragma warning(push)
-# pragma warning(disable:4244)
-#endif
-
-class identification_policy {
-public:
- // Public properties
- unit_test::readwrite_property<rtti::id_t> p_type_id;
-
- // Policy interface
- virtual bool responds_to( cstring name ) const = 0;
- virtual cstring id_2_report() const = 0;
- virtual void usage_info( format_stream& fs ) const = 0;
- virtual bool matching( parameter const& p, argv_traverser& tr, bool primary ) const = 0;
-
- virtual bool conflict_with( identification_policy const& ) const = 0;
-
-protected:
- // Constructor
- explicit identification_policy( rtti::id_t dyn_type )
- : p_type_id( dyn_type )
- {}
- BOOST_TEST_PROTECTED_VIRTUAL ~identification_policy() {}
-};
-
-#ifdef BOOST_MSVC
-# pragma warning(pop)
-#endif
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_IFACE_ID_POLICY_HPP
diff --git a/boost/test/utils/runtime/cla/modifier.hpp b/boost/test/utils/runtime/cla/modifier.hpp
deleted file mode 100644
index 4b55536b73..0000000000
--- a/boost/test/utils/runtime/cla/modifier.hpp
+++ /dev/null
@@ -1,69 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : parameter modifiers
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_MODIFIER_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_MODIFIER_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-// Boost.Test
-#include <boost/test/utils/named_params.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** environment variable modifiers ************** //
-// ************************************************************************** //
-
-namespace {
-
-nfp::typed_keyword<bool,struct optional_t> optional_m;
-nfp::named_parameter<bool,optional_t,bool> optional( true );
-nfp::typed_keyword<bool,struct required_t> required_m;
-nfp::named_parameter<bool,required_t,bool> required( true );
-nfp::typed_keyword<bool,struct multiplicable_t> multiplicable_m;
-nfp::named_parameter<bool,multiplicable_t,bool> multiplicable( true );
-nfp::typed_keyword<bool,struct guess_name_t> guess_name_m;
-nfp::named_parameter<bool,guess_name_t,bool> guess_name( true );
-nfp::typed_keyword<bool,struct ignore_mismatch_t> ignore_mismatch_m;
-nfp::named_parameter<bool,ignore_mismatch_t,bool> ignore_mismatch( true );
-nfp::typed_keyword<bool,struct optional_value_t> optional_value_m;
-nfp::named_parameter<bool,optional_value_t,bool> optional_value( true );
-
-nfp::typed_keyword<char_type,struct input_separator_t> input_separator;
-nfp::typed_keyword<cstring,struct prefix_t> prefix;
-nfp::typed_keyword<cstring,struct name_t> name;
-nfp::typed_keyword<cstring,struct separator_t> separator;
-nfp::typed_keyword<cstring,struct description_t> description;
-nfp::typed_keyword<cstring,struct refer_to_t> default_refer_to;
-
-nfp::keyword<struct default_value_t> default_value;
-nfp::keyword<struct handler_t> handler;
-nfp::keyword<struct interpreter_t> interpreter;
-nfp::keyword<struct assign_to_t> assign_to;
-
-} // local namespace
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_MODIFIER_HPP
diff --git a/boost/test/utils/runtime/cla/named_parameter.cpp b/boost/test/utils/runtime/cla/named_parameter.cpp
deleted file mode 100644
index 7e94722dc9..0000000000
--- a/boost/test/utils/runtime/cla/named_parameter.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : offline implementation of named parameter
-// ***************************************************************************
-
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-#include <boost/test/utils/runtime/cla/named_parameter.ipp>
diff --git a/boost/test/utils/runtime/cla/named_parameter.hpp b/boost/test/utils/runtime/cla/named_parameter.hpp
deleted file mode 100644
index be3f9c570b..0000000000
--- a/boost/test/utils/runtime/cla/named_parameter.hpp
+++ /dev/null
@@ -1,95 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : defines model of named parameter
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_NAMED_PARAMETER_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_NAMED_PARAMETER_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/basic_parameter.hpp>
-#include <boost/test/utils/runtime/cla/id_policy.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** string_name_policy ************** //
-// ************************************************************************** //
-
-class string_name_policy : public basic_naming_policy {
-public:
- // Constructor
- string_name_policy();
- BOOST_TEST_UTILS_RUNTIME_PARAM_UNNEEDED_VIRTUAL ~string_name_policy() {}
-
- // policy interface
- virtual bool responds_to( cstring name ) const;
- virtual bool conflict_with( identification_policy const& ) const;
-
- // Accept modifier
- template<typename Modifier>
- void accept_modifier( Modifier const& m )
- {
- basic_naming_policy::accept_modifier( m );
-
- if( m.has( guess_name_m ) )
- m_guess_name = true;
- }
-
-private:
- // Naming policy interface
- virtual bool match_name( argv_traverser& tr ) const;
-
- // Data members
- bool m_guess_name;
-};
-
-// ************************************************************************** //
-// ************** runtime::cla::named_parameter ************** //
-// ************************************************************************** //
-
-template<typename T>
-class named_parameter_t : public basic_parameter<T,string_name_policy> {
- typedef basic_parameter<T,string_name_policy> base;
-public:
- // Constructors
- explicit named_parameter_t( cstring name ) : base( name ) {}
-};
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_CLA_NAMED_PARAM_GENERATORS( named_parameter )
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_OFFLINE
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-# define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE inline
-#endif
-# include <boost/test/utils/runtime/cla/named_parameter.ipp>
-
-#endif
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_NAMED_PARAMETER_HPP
diff --git a/boost/test/utils/runtime/cla/named_parameter.ipp b/boost/test/utils/runtime/cla/named_parameter.ipp
deleted file mode 100644
index e59ebdf89c..0000000000
--- a/boost/test/utils/runtime/cla/named_parameter.ipp
+++ /dev/null
@@ -1,129 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : implements model of named parameter
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_NAMED_PARAMETER_IPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_NAMED_PARAMETER_IPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/named_parameter.hpp>
-#include <boost/test/utils/runtime/cla/char_parameter.hpp>
-
-// Boost.Test
-#include <boost/test/utils/algorithm.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** string_name_policy ************** //
-// ************************************************************************** //
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-string_name_policy::string_name_policy()
-: basic_naming_policy( rtti::type_id<string_name_policy>() )
-, m_guess_name( false )
-{
- assign_op( p_prefix.value, BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "-" ), 0 );
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE bool
-string_name_policy::responds_to( cstring name ) const
-{
- std::pair<cstring::iterator,dstring::const_iterator> mm_pos;
-
- mm_pos = unit_test::mismatch( name.begin(), name.end(), p_name->begin(), p_name->end() );
-
- return mm_pos.first == name.end() && (m_guess_name || (mm_pos.second == p_name->end()) );
-}
-
-//____________________________________________________________________________//
-
-#ifdef BOOST_MSVC
-# pragma warning(push)
-# pragma warning(disable:4244)
-#endif
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE bool
-string_name_policy::conflict_with( identification_policy const& id ) const
-{
- if( id.p_type_id == p_type_id ) {
- string_name_policy const& snp = static_cast<string_name_policy const&>( id );
-
- if( p_name->empty() || snp.p_name->empty() )
- return false;
-
- if( p_prefix != snp.p_prefix )
- return false;
-
- std::pair<dstring::const_iterator,dstring::const_iterator> mm_pos =
- unit_test::mismatch( p_name->begin(), p_name->end(), snp.p_name->begin(), snp.p_name->end() );
-
- return mm_pos.first != p_name->begin() && // there is common substring
- ((m_guess_name && (mm_pos.second == snp.p_name->end()) ) || // that match other guy and I am guessing
- (snp.m_guess_name && (mm_pos.first == p_name->end()) )); // or me and the other guy is
- }
-
- if( id.p_type_id == rtti::type_id<char_name_policy>() ) {
- char_name_policy const& cnp = static_cast<char_name_policy const&>( id );
-
- return m_guess_name &&
- (p_prefix == cnp.p_prefix) &&
- unit_test::first_char( cstring( p_name ) ) == unit_test::first_char( cstring( cnp.p_name ) );
- }
-
- return false;
-}
-
-#ifdef BOOST_MSVC
-# pragma warning(pop)
-#endif
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE bool
-string_name_policy::match_name( argv_traverser& tr ) const
-{
- if( !m_guess_name )
- return basic_naming_policy::match_name( tr );
-
- cstring in = tr.input();
-
- std::pair<cstring::iterator,dstring::const_iterator> mm_pos;
-
- mm_pos = unit_test::mismatch( in.begin(), in.end(), p_name->begin(), p_name->end() );
-
- if( mm_pos.first == in.begin() )
- return false;
-
- tr.trim( static_cast<std::size_t>(mm_pos.first - in.begin()) );
-
- return true;
-}
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_NAMED_PARAMETER_IPP
diff --git a/boost/test/utils/runtime/cla/parameter.hpp b/boost/test/utils/runtime/cla/parameter.hpp
deleted file mode 100644
index 9e26d25007..0000000000
--- a/boost/test/utils/runtime/cla/parameter.hpp
+++ /dev/null
@@ -1,151 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : defines model of formal parameter
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_PARAMETER_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_PARAMETER_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/fwd.hpp>
-#include <boost/test/utils/runtime/parameter.hpp>
-#include <boost/test/utils/runtime/validation.hpp>
-
-#include <boost/test/utils/runtime/cla/fwd.hpp>
-#include <boost/test/utils/runtime/cla/modifier.hpp>
-#include <boost/test/utils/runtime/cla/iface/argument_factory.hpp>
-#include <boost/test/utils/runtime/cla/iface/id_policy.hpp>
-
-// Boost.Test
-#include <boost/test/utils/rtti.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** runtime::cla::parameter ************** //
-// ************************************************************************** //
-
-class parameter : public BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE::parameter {
-public:
- parameter( identification_policy& ID, argument_factory& F, bool optional_value = false )
- : p_optional( false )
- , p_multiplicable( false )
- , p_optional_value( optional_value )
- , m_id_policy( ID )
- , m_arg_factory( F )
- {}
-
- // Destructor
- virtual ~parameter() {}
-
- unit_test::readwrite_property<bool> p_optional;
- unit_test::readwrite_property<bool> p_multiplicable;
- unit_test::readwrite_property<bool> p_optional_value;
- unit_test::readwrite_property<dstring> p_description;
-
- // parameter properties modification
- template<typename Modifier>
- void accept_modifier( Modifier const& m )
- {
- if( m.has( optional_m ) )
- p_optional.value = true;
-
- if( m.has( required_m ) )
- p_optional.value = false;
-
- if( m.has( multiplicable_m ) )
- p_multiplicable.value = true;
-
- if( m.has( optional_value_m ) )
- p_optional_value.value = true;
-
- nfp::optionally_assign( p_description.value, m, description );
- }
-
- // access methods
- bool has_argument() const { return !!m_actual_argument; }
- argument const& actual_argument() const { return *m_actual_argument; }
- argument_ptr actual_argument() { return m_actual_argument; }
- void reset() { m_actual_argument.reset(); }
-
-
- // identification interface
- bool responds_to( cstring name ) const { return m_id_policy.responds_to( name ); }
- bool conflict_with( parameter const& p ) const
- {
- return (id_2_report() == p.id_2_report() && !id_2_report().is_empty()) ||
- m_id_policy.conflict_with( p.m_id_policy ) ||
- ((m_id_policy.p_type_id != p.m_id_policy.p_type_id) && p.m_id_policy.conflict_with( m_id_policy ));
- }
- cstring id_2_report() const { return m_id_policy.id_2_report(); }
- void usage_info( format_stream& fs ) const
- {
- m_id_policy.usage_info( fs );
- if( p_optional_value )
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '[' );
-
- m_arg_factory.argument_usage_info( fs );
-
- if( p_optional_value )
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( ']' );
- }
-
- // argument match/produce based on input
- bool matching( argv_traverser& tr, bool primary ) const
- {
- return m_id_policy.matching( *this, tr, primary );
- }
-
- // argument production based on different source
- void produce_argument( argv_traverser& tr )
- {
- m_id_policy.matching( *this, tr, true ); // !! can we save this position somehow
- m_actual_argument = m_arg_factory.produce_using( *this, tr );
- }
- void produce_argument( parser const& p )
- {
- m_actual_argument = m_arg_factory.produce_using( *this, p );
- }
-
-private:
- //Data members
- identification_policy& m_id_policy;
- argument_factory& m_arg_factory;
- argument_ptr m_actual_argument;
-};
-
-//____________________________________________________________________________//
-
-template<typename Parameter,typename Modifier>
-inline shared_ptr<Parameter>
-operator-( shared_ptr<Parameter> p, Modifier const& m )
-{
- p->accept_modifier( m );
-
- return p;
-}
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_PARAMETER_HPP
diff --git a/boost/test/utils/runtime/cla/parser.cpp b/boost/test/utils/runtime/cla/parser.cpp
deleted file mode 100644
index 8efc17d3b2..0000000000
--- a/boost/test/utils/runtime/cla/parser.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : offline implementation for parser
-// ***************************************************************************
-
-#include <boost/test/utils/runtime/config.hpp>
-
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-#include <boost/test/utils/runtime/cla/parser.ipp>
diff --git a/boost/test/utils/runtime/cla/parser.hpp b/boost/test/utils/runtime/cla/parser.hpp
index ffe09e4adc..effde33a52 100644
--- a/boost/test/utils/runtime/cla/parser.hpp
+++ b/boost/test/utils/runtime/cla/parser.hpp
@@ -1,158 +1,491 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// 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$
-//
-// Description : defines parser - public interface for CLA parsing and accessing
+//!@file
+//!@brief CLA parser
// ***************************************************************************
#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_PARSER_HPP
#define BOOST_TEST_UTILS_RUNTIME_CLA_PARSER_HPP
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-#include <boost/test/utils/runtime/fwd.hpp>
+// Boost.Test Runtime parameters
#include <boost/test/utils/runtime/argument.hpp>
+#include <boost/test/utils/runtime/modifier.hpp>
+#include <boost/test/utils/runtime/parameter.hpp>
-#include <boost/test/utils/runtime/cla/fwd.hpp>
-#include <boost/test/utils/runtime/cla/modifier.hpp>
#include <boost/test/utils/runtime/cla/argv_traverser.hpp>
-// Boost
-#include <boost/optional.hpp>
+// Boost.Test
+#include <boost/test/utils/foreach.hpp>
+#include <boost/test/utils/algorithm.hpp>
+#include <boost/test/detail/throw_exception.hpp>
-// STL
-#include <list>
+#include <boost/algorithm/cxx11/all_of.hpp> // !! ?? unnecessary after cxx11
-namespace boost {
+// STL
+// !! ?? #include <unordered_set>
+#include <set>
+#include <iostream>
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
+#include <boost/test/detail/suppress_warnings.hpp>
+namespace boost {
+namespace runtime {
namespace cla {
// ************************************************************************** //
-// ************** runtime::cla::parser ************** //
+// ************** runtime::cla::parameter_trie ************** //
// ************************************************************************** //
-namespace cla_detail {
+namespace rt_cla_detail {
-template<typename Modifier>
-class global_mod_parser {
-public:
- global_mod_parser( parser& p, Modifier const& m )
- : m_parser( p )
- , m_modifiers( m )
- {}
-
- template<typename Param>
- global_mod_parser const&
- operator<<( shared_ptr<Param> param ) const
+struct parameter_trie;
+typedef shared_ptr<parameter_trie> parameter_trie_ptr;
+typedef std::map<char,parameter_trie_ptr> trie_per_char;
+typedef std::vector<boost::reference_wrapper<parameter_cla_id const> > param_cla_id_list;
+
+struct parameter_trie {
+ parameter_trie() : m_has_final_candidate( false ) {}
+
+ /// If subtrie corresponding to the char c exists returns it otherwise creates new
+ parameter_trie_ptr make_subtrie( char c )
{
- param->accept_modifier( m_modifiers );
+ trie_per_char::const_iterator it = m_subtrie.find( c );
- m_parser << param;
+ if( it == m_subtrie.end() )
+ it = m_subtrie.insert( std::make_pair( c, parameter_trie_ptr( new parameter_trie ) ) ).first;
- return *this;
+ return it->second;
}
-private:
- // Data members;
- parser& m_parser;
- Modifier const& m_modifiers;
+ /// Creates series of sub-tries per characters in a string
+ parameter_trie_ptr make_subtrie( cstring s )
+ {
+ parameter_trie_ptr res;
+
+ BOOST_TEST_FOREACH( char, c, s )
+ res = (res ? res->make_subtrie( c ) : make_subtrie( c ));
+
+ return res;
+ }
+
+ /// Registers candidate parameter for this subtrie. If final, it needs to be unique
+ void add_candidate_id( parameter_cla_id const& param_id, basic_param_ptr param_candidate, bool final )
+ {
+ BOOST_TEST_I_ASSRT( !m_has_final_candidate && (!final || m_id_candidates.empty()),
+ conflicting_param() << "Parameter cla id " << param_id.m_tag << " conflicts with the "
+ << "parameter cla id " << m_id_candidates.back().get().m_tag );
+
+ m_has_final_candidate = final;
+ m_id_candidates.push_back( ref(param_id) );
+
+ if( m_id_candidates.size() == 1 )
+ m_param_candidate = param_candidate;
+ else
+ m_param_candidate.reset();
+ }
+
+ /// Gets subtrie for specified char if present or nullptr otherwise
+ parameter_trie_ptr get_subtrie( char c ) const
+ {
+ trie_per_char::const_iterator it = m_subtrie.find( c );
+
+ return it != m_subtrie.end() ? it->second : parameter_trie_ptr();
+ }
+
+ // Data members
+ trie_per_char m_subtrie;
+ param_cla_id_list m_id_candidates;
+ basic_param_ptr m_param_candidate;
+ bool m_has_final_candidate;
};
+// ************************************************************************** //
+// ************** runtime::cla::report_foreing_token ************** //
+// ************************************************************************** //
+
+static void
+report_foreing_token( cstring program_name, cstring token )
+{
+ std::cerr << "Boost.Test WARNING: token \"" << token << "\" does not correspond to the Boost.Test argument \n"
+ << " and should be placed after all Boost.Test arguments and the -- separator.\n"
+ << " For example: " << program_name << " --random -- " << token << "\n";
}
+} // namespace rt_cla_detail
+
// ************************************************************************** //
// ************** runtime::cla::parser ************** //
// ************************************************************************** //
class parser {
public:
- typedef std::list<parameter_ptr>::const_iterator param_iterator;
- typedef std::list<parameter_ptr>::size_type param_size_type;
-
- // Constructor
- explicit parser( cstring program_name = cstring() );
+ /// Initializes a parser and builds internal trie representation used for
+ /// parsing based on the supplied parameters
+#ifndef BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+ template<typename Modifiers=nfp::no_params_type>
+ parser( parameters_store const& parameters, Modifiers const& m = nfp::no_params )
+#else
+ template<typename Modifiers>
+ parser( parameters_store const& parameters, Modifiers const& m )
+#endif
+ {
+ nfp::opt_assign( m_end_of_param_indicator, m, end_of_params );
+ nfp::opt_assign( m_negation_prefix, m, negation_prefix );
- // parameter list construction interface
- parser& operator<<( parameter_ptr param );
+ BOOST_TEST_I_ASSRT( algorithm::all_of( m_end_of_param_indicator.begin(),
+ m_end_of_param_indicator.end(),
+ parameter_cla_id::valid_prefix_char ),
+ invalid_cla_id() << "End of parameters indicator can only consist of prefix characters." );
- // parser and global parameters modifiers
- template<typename Modifier>
- cla_detail::global_mod_parser<Modifier>
- operator-( Modifier const& m )
- {
- nfp::optionally_assign( m_traverser.p_separator.value, m, input_separator );
- nfp::optionally_assign( m_traverser.p_ignore_mismatch.value, m, ignore_mismatch_m );
+ BOOST_TEST_I_ASSRT( algorithm::all_of( m_negation_prefix.begin(),
+ m_negation_prefix.end(),
+ parameter_cla_id::valid_name_char ),
+ invalid_cla_id() << "Negation prefix can only consist of prefix characters." );
- return cla_detail::global_mod_parser<Modifier>( *this, m );
+ build_trie( parameters );
}
// input processing method
- void parse( int& argc, char_type** argv );
+ int
+ parse( int argc, char** argv, runtime::arguments_store& res )
+ {
+ // save program name for help message
+ m_program_name = argv[0];
+ cstring path_sep( "\\/" );
+
+ cstring::iterator it = unit_test::utils::find_last_of( m_program_name.begin(), m_program_name.end(),
+ path_sep.begin(), path_sep.end() );
+ if( it != m_program_name.end() )
+ m_program_name.trim_left( it + 1 );
+
+ // Set up the traverser
+ argv_traverser tr( argc, (char const**)argv );
+
+ // Loop till we reach end of input
+ while( !tr.eoi() ) {
+ cstring curr_token = tr.current_token();
+
+ cstring prefix;
+ cstring name;
+ cstring value_separator;
+ bool negative_form = false;
+
+ // Perform format validations and split the argument into prefix, name and separator
+ // False return value indicates end of params indicator is met
+ if( !validate_token_format( curr_token, prefix, name, value_separator, negative_form ) ) {
+ // get rid of "end of params" token
+ tr.next_token();
+ break;
+ }
+
+ // Locate trie corresponding to found prefix and skip it in the input
+ trie_ptr curr_trie = m_param_trie[prefix];
+
+ if( !curr_trie ) {
+ // format_error() << "Unrecognized parameter prefix in the argument " << tr.current_token()
+ rt_cla_detail::report_foreing_token( m_program_name, curr_token );
+ tr.save_token();
+ continue;
+ }
+
+ curr_token.trim_left( prefix.size() );
+
+ // Locate parameter based on a name and skip it in the input
+ locate_result locate_res = locate_parameter( curr_trie, name, curr_token );
+ parameter_cla_id const& found_id = locate_res.first;
+ basic_param_ptr found_param = locate_res.second;
+
+ if( negative_form ) {
+ BOOST_TEST_I_ASSRT( found_id.m_negatable,
+ format_error( found_param->p_name )
+ << "Parameter tag " << found_id.m_tag << " is not negatable." );
+
+ curr_token.trim_left( m_negation_prefix.size() );
+ }
+
+ curr_token.trim_left( name.size() );
+
+ cstring value;
+
+ // Skip validations if parameter has optional value and we are at the end of token
+ if( !value_separator.is_empty() || !found_param->p_has_optional_value ) {
+ // Validate and skip value separator in the input
+ BOOST_TEST_I_ASSRT( found_id.m_value_separator == value_separator,
+ format_error( found_param->p_name )
+ << "Invalid separator for the parameter "
+ << found_param->p_name
+ << " in the argument " << tr.current_token() );
+
+ curr_token.trim_left( value_separator.size() );
+
+ // Deduce value source
+ value = curr_token;
+ if( value.is_empty() ) {
+ tr.next_token();
+ value = tr.current_token();
+ }
+
+ BOOST_TEST_I_ASSRT( !value.is_empty(),
+ format_error( found_param->p_name )
+ << "Missing an argument value for the parameter "
+ << found_param->p_name
+ << " in the argument " << tr.current_token() );
+ }
+
+ // Validate against argument duplication
+ BOOST_TEST_I_ASSRT( !res.has( found_param->p_name ) || found_param->p_repeatable,
+ duplicate_arg( found_param->p_name )
+ << "Duplicate argument value for the parameter "
+ << found_param->p_name
+ << " in the argument " << tr.current_token() );
+
+ // Produce argument value
+ found_param->produce_argument( value, negative_form, res );
+
+ tr.next_token();
+ }
+
+ // generate the remainder and return it's size
+ return tr.remainder();
+ }
- // parameters access
- param_iterator first_param() const;
- param_iterator last_param() const;
- param_size_type num_params() const { return m_parameters.size(); }
- void reset();
+ // help/usage
+ void
+ usage( std::ostream& ostr, cstring param_name = cstring() )
+ {
+ if( !param_name.is_empty() ) {
+ basic_param_ptr param = locate_parameter( m_param_trie[help_prefix], param_name, "" ).second;
+ param->usage( ostr, m_negation_prefix );
+ }
+ else {
+ ostr << "Usage: " << m_program_name << " [Boost.Test argument]... ";
+ if( !m_end_of_param_indicator.empty() )
+ ostr << m_end_of_param_indicator << " [custom test module argument]...";
+ ostr << "\n";
+ }
+
+ ostr << "\nFor detailed help on Boost.Test parameters use:\n"
+ << " " << m_program_name << " --help\n"
+ << "or\n"
+ << " " << m_program_name << " --help=<parameter name>\n";
+ }
- // arguments access
- const_argument_ptr operator[]( cstring string_id ) const;
- cstring get( cstring string_id ) const;
+ void
+ help( std::ostream& ostr, parameters_store const& parameters, cstring param_name )
+ {
+ if( !param_name.is_empty() ) {
+ basic_param_ptr param = locate_parameter( m_param_trie[help_prefix], param_name, "" ).second;
+ param->help( ostr, m_negation_prefix );
+ return;
+ }
+
+ ostr << "Usage: " << m_program_name << " [Boost.Test argument]... ";
+ if( !m_end_of_param_indicator.empty() )
+ ostr << m_end_of_param_indicator << " [custom test module argument]...";
+
+ ostr << "\n\nBoost.Test arguments correspond to parameters listed below. "
+ "All parameters are optional. You can use specify parameter value either "
+ "as a command line argument or as a value of corresponding environment "
+ "variable. In case if argument for the same parameter is specified in both "
+ "places, command line is taking precedence. Command line argument format "
+ "supports parameter name guessing, so you can use any unambiguous "
+ "prefix to identify a parameter.";
+ if( !m_end_of_param_indicator.empty() )
+ ostr << " All the arguments after the " << m_end_of_param_indicator << " are ignored by the Boost.Test.";
+
+ ostr << "\n\nBoost.Test supports following parameters:\n";
+
+ BOOST_TEST_FOREACH( parameters_store::storage_type::value_type const&, v, parameters.all() ) {
+ basic_param_ptr param = v.second;
+
+ param->usage( ostr, m_negation_prefix );
+ }
+
+ ostr << "\nUse --help=<parameter name> to display detailed help for specific parameter.\n";
+ }
- template<typename T>
- T const& get( cstring string_id ) const
+private:
+ typedef rt_cla_detail::parameter_trie_ptr trie_ptr;
+ typedef rt_cla_detail::trie_per_char trie_per_char;
+ typedef std::map<cstring,trie_ptr> str_to_trie;
+
+ void
+ build_trie( parameters_store const& parameters )
{
- return arg_value<T>( valid_argument( string_id ) );
+ // Iterate over all parameters
+ BOOST_TEST_FOREACH( parameters_store::storage_type::value_type const&, v, parameters.all() ) {
+ basic_param_ptr param = v.second;
+
+ // Register all parameter's ids in trie.
+ BOOST_TEST_FOREACH( parameter_cla_id const&, id, param->cla_ids() ) {
+ // This is the trie corresponding to the prefix.
+ trie_ptr next_trie = m_param_trie[id.m_prefix];
+ if( !next_trie )
+ next_trie = m_param_trie[id.m_prefix] = trie_ptr( new rt_cla_detail::parameter_trie );
+
+ // Build the trie, by following name's characters
+ // and register this parameter as candidate on each level
+ for( size_t index = 0; index < id.m_tag.size(); ++index ) {
+ next_trie = next_trie->make_subtrie( id.m_tag[index] );
+
+ next_trie->add_candidate_id( id, param, index == (id.m_tag.size() - 1) );
+ }
+ }
+ }
}
- template<typename T>
- void get( cstring string_id, boost::optional<T>& res ) const
+ bool
+ validate_token_format( cstring token, cstring& prefix, cstring& name, cstring& separator, bool& negative_form )
{
- const_argument_ptr actual_arg = (*this)[string_id];
+ // Match prefix
+ cstring::iterator it = token.begin();
+ while( it != token.end() && parameter_cla_id::valid_prefix_char( *it ) )
+ ++it;
- if( actual_arg )
- res = arg_value<T>( *actual_arg );
- else
- res.reset();
- }
+ prefix.assign( token.begin(), it );
- // help/usage
- void usage( out_stream& ostr );
- void help( out_stream& ostr );
+ if( prefix.empty() )
+ return true;
-private:
- argument const& valid_argument( cstring string_id ) const;
+ // Match name
+ while( it != token.end() && parameter_cla_id::valid_name_char( *it ) )
+ ++it;
- // Data members
- argv_traverser m_traverser;
- std::list<parameter_ptr> m_parameters;
- dstring m_program_name;
-};
+ name.assign( prefix.end(), it );
-//____________________________________________________________________________//
+ if( name.empty() ) {
+ if( prefix == m_end_of_param_indicator )
+ return false;
-} // namespace cla
+ BOOST_TEST_I_THROW( format_error() << "Invalid format for an actual argument " << token );
+ }
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
+ // Match value separator
+ while( it != token.end() && parameter_cla_id::valid_separator_char( *it ) )
+ ++it;
-} // namespace boost
+ separator.assign( name.end(), it );
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_OFFLINE
+ // Match negation prefix
+ negative_form = !m_negation_prefix.empty() && ( name.substr( 0, m_negation_prefix.size() ) == m_negation_prefix );
+ if( negative_form )
+ name.trim_left( m_negation_prefix.size() );
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-# define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE inline
-#endif
-# include <boost/test/utils/runtime/cla/parser.ipp>
+ return true;
+ }
+ // C++03: cannot have references as types
+ typedef std::pair<parameter_cla_id, basic_param_ptr> locate_result;
+
+ locate_result
+ locate_parameter( trie_ptr curr_trie, cstring name, cstring token )
+ {
+ std::vector<trie_ptr> typo_candidates;
+ std::vector<trie_ptr> next_typo_candidates;
+ trie_ptr next_trie;
+
+ BOOST_TEST_FOREACH( char, c, name ) {
+ if( curr_trie ) {
+ // locate next subtrie corresponding to the char
+ next_trie = curr_trie->get_subtrie( c );
+
+ if( next_trie )
+ curr_trie = next_trie;
+ else {
+ // Initiate search for typo candicates. We will account for 'wrong char' typo
+ // 'missing char' typo and 'extra char' typo
+ BOOST_TEST_FOREACH( trie_per_char::value_type const&, typo_cand, curr_trie->m_subtrie ) {
+ // 'wrong char' typo
+ typo_candidates.push_back( typo_cand.second );
+
+ // 'missing char' typo
+ if( (next_trie = typo_cand.second->get_subtrie( c )) )
+ typo_candidates.push_back( next_trie );
+ }
+
+ // 'extra char' typo
+ typo_candidates.push_back( curr_trie );
+
+ curr_trie.reset();
+ }
+ }
+ else {
+ // go over existing typo candidates and see if they are still viable
+ BOOST_TEST_FOREACH( trie_ptr, typo_cand, typo_candidates ) {
+ trie_ptr next_typo_cand = typo_cand->get_subtrie( c );
+
+ if( next_typo_cand )
+ next_typo_candidates.push_back( next_typo_cand );
+ }
+
+ next_typo_candidates.swap( typo_candidates );
+ next_typo_candidates.clear();
+ }
+ }
+
+ if( !curr_trie ) {
+ std::vector<cstring> typo_candidate_names;
+ std::set<parameter_cla_id const*> unique_typo_candidate; // !! ?? unordered_set
+ typo_candidate_names.reserve( typo_candidates.size() );
+// !! ?? unique_typo_candidate.reserve( typo_candidates.size() );
+
+ BOOST_TEST_FOREACH( trie_ptr, trie_cand, typo_candidates ) {
+ // avoid ambiguos candidate trie
+ if( trie_cand->m_id_candidates.size() > 1 )
+ continue;
+
+ BOOST_TEST_FOREACH( parameter_cla_id const&, param_cand, trie_cand->m_id_candidates ) {
+ if( !unique_typo_candidate.insert( &param_cand ).second )
+ continue;
+
+ typo_candidate_names.push_back( param_cand.m_tag );
+ }
+ }
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+ BOOST_TEST_I_THROW( unrecognized_param( std::move(typo_candidate_names) )
+ << "An unrecognized parameter in the argument "
+ << token );
+#else
+ BOOST_TEST_I_THROW( unrecognized_param( typo_candidate_names )
+ << "An unrecognized parameter in the argument "
+ << token );
#endif
+ }
+
+ if( curr_trie->m_id_candidates.size() > 1 ) {
+ std::vector<cstring> amb_names;
+ BOOST_TEST_FOREACH( parameter_cla_id const&, param_id, curr_trie->m_id_candidates )
+ amb_names.push_back( param_id.m_tag );
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+ BOOST_TEST_I_THROW( ambiguous_param( std::move( amb_names ) )
+ << "An ambiguous parameter name in the argument " << token );
+#else
+ BOOST_TEST_I_THROW( ambiguous_param( amb_names )
+ << "An ambiguous parameter name in the argument " << token );
+#endif
+ }
+
+ return locate_result( curr_trie->m_id_candidates.back().get(), curr_trie->m_param_candidate );
+ }
+
+ // Data members
+ cstring m_program_name;
+ std::string m_end_of_param_indicator;
+ std::string m_negation_prefix;
+ str_to_trie m_param_trie;
+};
+
+} // namespace cla
+} // namespace runtime
+} // namespace boost
+
+#include <boost/test/detail/enable_warnings.hpp>
#endif // BOOST_TEST_UTILS_RUNTIME_CLA_PARSER_HPP
diff --git a/boost/test/utils/runtime/cla/parser.ipp b/boost/test/utils/runtime/cla/parser.ipp
deleted file mode 100644
index b8a4ca4636..0000000000
--- a/boost/test/utils/runtime/cla/parser.ipp
+++ /dev/null
@@ -1,267 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : implements parser - public interface for CLA parsing and accessing
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_PARSER_IPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_PARSER_IPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-#include <boost/test/utils/runtime/trace.hpp>
-#include <boost/test/utils/runtime/argument.hpp>
-
-#include <boost/test/utils/runtime/cla/argv_traverser.hpp>
-#include <boost/test/utils/runtime/cla/parameter.hpp>
-#include <boost/test/utils/runtime/cla/modifier.hpp>
-#include <boost/test/utils/runtime/cla/validation.hpp>
-#include <boost/test/utils/runtime/cla/parser.hpp>
-
-// Boost.Test
-#include <boost/test/utils/basic_cstring/io.hpp>
-#include <boost/test/utils/foreach.hpp>
-
-// Boost
-#include <boost/lexical_cast.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** runtime::cla::parser ************** //
-// ************************************************************************** //
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-parser::parser( cstring program_name )
-{
- assign_op( m_program_name, program_name, 0 );
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE parser::param_iterator
-parser::first_param() const
-{
- return m_parameters.begin();
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE parser::param_iterator
-parser::last_param() const
-{
- return m_parameters.end();
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE argument const&
-parser::valid_argument( cstring string_id ) const
-{
- const_argument_ptr arg = (*this)[string_id];
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( !!arg, "Actual argument for parameter " << string_id << " is not present" );
-
- return *arg;
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE parser&
-parser::operator<<( parameter_ptr new_param )
-{
- BOOST_TEST_FOREACH( parameter_ptr, old_param, m_parameters ) {
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( !old_param->conflict_with( *new_param ),
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "Definition of parameter " ) << new_param->id_2_report() <<
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( " conflicts with defintion of parameter " ) << old_param->id_2_report() );
- }
-
- m_parameters.push_back( new_param );
-
- return *this;
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-parser::parse( int& argc, char_type** argv )
-{
- if( m_program_name.empty() ) {
- m_program_name.assign( argv[0] );
- dstring::size_type pos = m_program_name.find_last_of( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "/\\" ) );
-
- if( pos != static_cast<dstring::size_type>(cstring::npos) )
- m_program_name.erase( 0, pos+1 );
- }
-
- m_traverser.init( argc, argv );
-
- BOOST_TEST_IMPL_TRY {
- while( !m_traverser.eoi() ) {
- parameter_ptr found_param;
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "Total " << m_parameters.size() << " parameters registered" );
-
- BOOST_TEST_FOREACH( parameter_ptr const&, curr_param, m_parameters ) {
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "Try parameter " << curr_param->id_2_report() );
-
- if( curr_param->matching( m_traverser, !found_param ) ) {
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "Match found" );
- BOOST_TEST_UTILS_RUNTIME_CLA_VALIDATE_INPUT( !found_param, (m_traverser.rollback(),m_traverser), "Ambiguous input" );
-
- found_param = curr_param;
- }
-
- m_traverser.rollback();
- }
-
- if( !found_param ) {
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "No match found" );
- BOOST_TEST_UTILS_RUNTIME_CLA_VALIDATE_INPUT( m_traverser.handle_mismatch(), m_traverser,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "Unexpected input" ) );
-
- continue;
- }
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "Parse argument value" );
- found_param->produce_argument( m_traverser );
-
- m_traverser.commit();
- }
-
- BOOST_TEST_FOREACH( parameter_ptr const&, curr_param, m_parameters ) {
- if( !curr_param->p_optional && !curr_param->actual_argument() ) {
- curr_param->produce_argument( *this );
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( curr_param->actual_argument(),
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "Required argument for parameter " ) << curr_param->id_2_report()
- << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( " is missing" ) );
- }
- }
- }
- BOOST_TEST_IMPL_CATCH0( bad_lexical_cast ) {
- BOOST_TEST_UTILS_RUNTIME_PARAM_REPORT_LOGIC_ERROR(
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "String to value convertion error during input parsing" ) );
- };
-
- m_traverser.remainder( argc, argv );
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE const_argument_ptr
-parser::operator[]( cstring string_id ) const
-{
- parameter_ptr found_param;
-
- BOOST_TEST_FOREACH( parameter_ptr const&, curr_param, m_parameters ) {
- if( curr_param->responds_to( string_id ) ) {
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( !found_param,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "Ambiguous parameter string id: " ) << string_id );
-
- found_param = curr_param;
- }
- }
-
- return found_param ? found_param->actual_argument() : argument_ptr();
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE cstring
-parser::get( cstring string_id ) const
-{
- return get<cstring>( string_id );
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-parser::usage( out_stream& ostr )
-{
- if( m_program_name.empty() )
- assign_op( m_program_name, BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "<program>" ), 0 );
-
- format_stream fs;
-
- fs << m_program_name;
-
- BOOST_TEST_FOREACH( parameter_ptr const&, curr_param, m_parameters ) {
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( ' ' );
-
- if( curr_param->p_optional )
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '[' );
-
- curr_param->usage_info( fs );
-
- if( curr_param->p_optional )
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( ']' );
-
- if( curr_param->p_multiplicable ) {
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( " ... " );
-
- if( curr_param->p_optional )
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '[' );
-
- curr_param->usage_info( fs );
-
- if( curr_param->p_optional )
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( ']' );
- }
- }
-
- ostr << BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "Usage:\n" ) << fs.str() << std::endl;
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-parser::help( out_stream& ostr )
-{
- usage( ostr );
-
- bool need_where = true;
-
- BOOST_TEST_FOREACH( parameter_ptr const&, curr_param, m_parameters ) {
- if( curr_param->p_description->empty() )
- continue;
-
- if( need_where ) {
- ostr << BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "where:\n" );
- need_where = false;
- }
-
- ostr << curr_param->id_2_report() << BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( " - " ) << curr_param->p_description << std::endl;
- }
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-parser::reset()
-{
- BOOST_TEST_FOREACH( parameter_ptr const&, param, m_parameters )
- param->reset();
-}
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_PARSER_IPP
diff --git a/boost/test/utils/runtime/cla/positional_parameter.hpp b/boost/test/utils/runtime/cla/positional_parameter.hpp
deleted file mode 100644
index f378743dd5..0000000000
--- a/boost/test/utils/runtime/cla/positional_parameter.hpp
+++ /dev/null
@@ -1,91 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : positional parameter model
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_POSITIONAL_PARAMETER_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_POSITIONAL_PARAMETER_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/basic_parameter.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** trivial_id_policy ************** //
-// ************************************************************************** //
-
-class trivial_id_policy : public identification_policy {
-public:
- trivial_id_policy()
- : identification_policy( rtti::type_id<trivial_id_policy>() )
- {}
- BOOST_TEST_UTILS_RUNTIME_PARAM_UNNEEDED_VIRTUAL ~trivial_id_policy() {}
-
- virtual bool responds_to( cstring name ) const { return m_name == name; }
- virtual bool conflict_with( identification_policy const& ) const { return false; }
- virtual cstring id_2_report() const { return m_name; }
- virtual void usage_info( format_stream& fs ) const
- {
- if( !m_name.empty() )
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '<' ) << m_name << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '>' );
- else
- fs << BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "<value>" );
- }
-
- virtual bool matching( parameter const& p, argv_traverser&, bool primary ) const
- {
- return primary && ( !p.has_argument() || p.p_multiplicable );
- }
-
- template<typename Modifier>
- void accept_modifier( Modifier const& m )
- {
- nfp::optionally_assign( m_name, m, name );
- }
-
-private:
- // Data members
- dstring m_name;
-};
-
-// ************************************************************************** //
-// ************** runtime::cla::positional_parameter ************** //
-// ************************************************************************** //
-
-template<typename T>
-class positional_parameter_t : public basic_parameter<T,trivial_id_policy> {
- typedef basic_parameter<T,trivial_id_policy> base;
-public:
- // Constructors
- explicit positional_parameter_t( cstring name )
- : base( name )
- {}
-};
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_CLA_NAMED_PARAM_GENERATORS( positional_parameter )
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_POSITIONAL_PARAMETER_HPP
diff --git a/boost/test/utils/runtime/cla/typed_parameter.hpp b/boost/test/utils/runtime/cla/typed_parameter.hpp
deleted file mode 100644
index 70c5bbc009..0000000000
--- a/boost/test/utils/runtime/cla/typed_parameter.hpp
+++ /dev/null
@@ -1,70 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : generic typed parameter model
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_TYPED_PARAMETER_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_TYPED_PARAMETER_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/fwd.hpp>
-#include <boost/test/utils/runtime/validation.hpp>
-
-#include <boost/test/utils/runtime/cla/parameter.hpp>
-#include <boost/test/utils/runtime/cla/argument_factory.hpp>
-
-// Boost.Test
-#include <boost/test/utils/rtti.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** runtime::cla::typed_parameter ************** //
-// ************************************************************************** //
-
-template<typename T>
-class typed_parameter : public cla::parameter {
-public:
- explicit typed_parameter( identification_policy& ID )
- : cla::parameter( ID, m_arg_factory, rtti::type_id<T>() == rtti::type_id<bool>() )
- {}
-
- // parameter properties modification
- template<typename Modifier>
- void accept_modifier( Modifier const& m )
- {
- cla::parameter::accept_modifier( m );
-
- m_arg_factory.accept_modifier( m );
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( !p_optional || !m_arg_factory.m_value_generator,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "can't define a value generator for optional parameter " ) << id_2_report() );
- }
-
-private:
- // Data members
- typed_argument_factory<T> m_arg_factory;
-};
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_TYPED_PARAMETER_HPP
diff --git a/boost/test/utils/runtime/cla/validation.cpp b/boost/test/utils/runtime/cla/validation.cpp
deleted file mode 100644
index 7f19a5ca45..0000000000
--- a/boost/test/utils/runtime/cla/validation.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : input validation helpers offline implementation
-// ***************************************************************************
-
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-#include <boost/test/utils/runtime/cla/validation.ipp>
diff --git a/boost/test/utils/runtime/cla/validation.hpp b/boost/test/utils/runtime/cla/validation.hpp
deleted file mode 100644
index 8a3da14c5b..0000000000
--- a/boost/test/utils/runtime/cla/validation.hpp
+++ /dev/null
@@ -1,57 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : input validation helpers definition
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_VALIDATION_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_VALIDATION_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/fwd.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** runtime::cla::report_input_error ************** //
-// ************************************************************************** //
-
-void report_input_error( argv_traverser const& tr, format_stream& msg );
-
-//____________________________________________________________________________//
-
-#define BOOST_TEST_UTILS_RUNTIME_CLA_VALIDATE_INPUT( b, tr, msg ) \
- if( b ) ; else ::boost::BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE::cla::report_input_error( tr, format_stream().ref() << msg )
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_OFFLINE
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-# define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE inline
-#endif
-# include <boost/test/utils/runtime/cla/validation.ipp>
-
-#endif
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_VALIDATION_HPP
diff --git a/boost/test/utils/runtime/cla/validation.ipp b/boost/test/utils/runtime/cla/validation.ipp
deleted file mode 100644
index 9d8cd27b4a..0000000000
--- a/boost/test/utils/runtime/cla/validation.ipp
+++ /dev/null
@@ -1,61 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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
-//! @brief Input validation helpers implementation
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_VALIDATION_IPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_VALIDATION_IPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/argv_traverser.hpp>
-#include <boost/test/utils/runtime/cla/validation.hpp>
-#include <boost/test/utils/runtime/validation.hpp> // BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE::logic_error
-
-// Boost.Test
-#include <boost/test/utils/basic_cstring/io.hpp>
-#include <boost/test/detail/throw_exception.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-// ************************************************************************** //
-// ************** runtime::cla::validation ************** //
-// ************************************************************************** //
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-report_input_error( argv_traverser const& tr, format_stream& msg )
-{
- if( tr.eoi() )
- msg << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( " at the end of input" );
- else {
- msg << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( " in the following position: " );
-
- if( tr.input().size() > 5 )
- msg << tr.input().substr( 0, 5 ) << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "..." );
- else
- msg << tr.input();
- }
-
- BOOST_TEST_IMPL_THROW( BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE::logic_error( msg.str() ) );
-}
-
-//____________________________________________________________________________//
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_VALIDATION_IPP
diff --git a/boost/test/utils/runtime/cla/value_generator.hpp b/boost/test/utils/runtime/cla/value_generator.hpp
deleted file mode 100644
index 0efc25def1..0000000000
--- a/boost/test/utils/runtime/cla/value_generator.hpp
+++ /dev/null
@@ -1,81 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : specific value generators
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_VALUE_GENERATOR_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_VALUE_GENERATOR_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/fwd.hpp>
-#include <boost/test/utils/runtime/cla/parser.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-namespace rt_cla_detail {
-
-// ************************************************************************** //
-// ************** runtime::cla::const_generator ************** //
-// ************************************************************************** //
-
-template<typename T>
-class const_generator {
-public:
- // Constructor
- explicit const_generator( T const& t ) : m_const_value( t ) {}
-
- // generator interface
- void operator()( parser const&, boost::optional<T>& t ) const { t = m_const_value; }
-
-private:
- // Data members
- T m_const_value;
-};
-
-// ************************************************************************** //
-// ************** runtime::cla::ref_generator ************** //
-// ************************************************************************** //
-
-template<typename T>
-class ref_generator {
-public:
- // Constructor
- explicit ref_generator( cstring ref_id ) : m_ref_id( ref_id ) {}
-
- // generator interface
- void operator()( parser const& p, boost::optional<T>& t ) const
- {
- p.get( m_ref_id, t );
- }
-
-private:
- // Data members
- cstring m_ref_id;
-};
-
-//____________________________________________________________________________//
-
-} // namespace rt_cla_detail
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_VALUE_GENERATOR_HPP
diff --git a/boost/test/utils/runtime/cla/value_handler.hpp b/boost/test/utils/runtime/cla/value_handler.hpp
deleted file mode 100644
index 38792602ac..0000000000
--- a/boost/test/utils/runtime/cla/value_handler.hpp
+++ /dev/null
@@ -1,57 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : specific value handlers
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CLA_VALUE_HANDLER_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CLA_VALUE_HANDLER_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/cla/fwd.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace cla {
-
-namespace rt_cla_detail {
-
-// ************************************************************************** //
-// ************** runtime::cla::assigner ************** //
-// ************************************************************************** //
-
-template<typename T>
-class assigner {
-public:
- // Constructor
- explicit assigner( T& loc ) : m_target( loc ) {}
-
- // value handler implementation
- void operator()( parameter const&, T& t ) { m_target = t; }
-
-private:
- // Data members
- T& m_target;
-};
-
-} // namespace rt_cla_detail
-
-} // namespace cla
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CLA_VALUE_HANDLER_HPP
diff --git a/boost/test/utils/runtime/config.hpp b/boost/test/utils/runtime/config.hpp
deleted file mode 100644
index dfa9ae30de..0000000000
--- a/boost/test/utils/runtime/config.hpp
+++ /dev/null
@@ -1,162 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Distributed under 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$
-//
-// Description : Runtime.Param library configuration
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CONFIG_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CONFIG_HPP
-
-// Boost
-#include <boost/config.hpp>
-#ifdef BOOST_MSVC
-# pragma warning(disable: 4511) // copy constructor could not be generated
-# pragma warning(disable: 4512) // assignment operator could not be generated
-# pragma warning(disable: 4181) // qualifier applied to reference type; ignored
-# pragma warning(disable: 4675) // resolved overload was found by argument-dependent lookup
-#endif
-
-// Boost.Test
-#include <boost/test/detail/config.hpp>
-#include <boost/test/utils/basic_cstring/basic_cstring.hpp>
-#include <boost/test/utils/wrap_stringstream.hpp>
-#include <boost/test/utils/basic_cstring/io.hpp> // operator<<(boost::runtime::cstring)
-
-// STL
-#include <string>
-#include <cstdlib>
-
-#ifdef __SUNPRO_CC
- #include <stdlib.h>
-#endif
-
-//____________________________________________________________________________//
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_CUSTOM_STRING
-# ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_WIDE_STRING
-# define BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE runtime
-# else
-# define BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE wide_runtime
-# endif
-#endif
-
-
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_CUSTOM_STRING
-# ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_WIDE_STRING
-
-typedef char char_type;
-typedef std::string dstring;
-typedef unit_test::const_string cstring;
-typedef unit_test::literal_string literal_cstring;
-typedef wrap_stringstream format_stream;
-
-#ifdef BOOST_CLASSIC_IOSTREAMS
-typedef std::ostream out_stream;
-#else
-typedef std::basic_ostream<char_type> out_stream;
-#endif
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4996) // putenv
-#endif
-
-#if defined(__MINGW32__)
-extern "C" int putenv( const char * );
-#endif
-
-#ifndef UNDER_CE
-#if defined(__COMO__) && 0
-inline void
-putenv_impl( cstring name, cstring value )
-{
- using namespace std;
- // !! this may actually fail. What should we do?
- setenv( name.begin(), value.begin(), 1 );
-}
-#else
-inline void
-putenv_impl( cstring name, cstring value )
-{
- format_stream fs;
-
- fs << name << '=' << value;
-
- // !! this may actually fail. What should we do?
- // const_cast is used to satisfy putenv interface
- using namespace std;
- putenv( const_cast<char*>( fs.str().c_str() ) );
-}
-#endif
-#endif
-
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( l ) l
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( l ) cstring( l, sizeof( l ) - 1 )
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_GETENV getenv
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_PUTENV ::boost::BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE::putenv_impl
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_EXCEPTION_INHERIT_STD
-
-//____________________________________________________________________________//
-
-# else
-
-typedef wchar_t char_type;
-typedef std::basic_string<char_type> dstring;
-typedef unit_test::basic_cstring<wchar_t const> cstring;
-typedef const unit_test::basic_cstring<wchar_t const> literal_cstring;
-typedef wrap_wstringstream format_stream;
-typedef std::wostream out_stream;
-
-#ifndef UNDER_CE
-inline void
-putenv_impl( cstring name, cstring value )
-{
- format_stream fs;
-
- fs << name << '=' << value;
-
- // !! this may actually fail. What should we do?
- // const_cast is used to satisfy putenv interface
- using namespace std;
- wputenv( const_cast<wchar_t*>( fs.str().c_str() ) );
-}
-#endif
-
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( l ) L ## l
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( l ) cstring( L ## l, sizeof( L ## l )/sizeof(wchar_t) - 1 )
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_GETENV wgetenv
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_PUTENV putenv_impl
-
-# endif
-#endif
-
-#ifdef __GNUC__
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_UNNEEDED_VIRTUAL virtual
-#else
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_UNNEEDED_VIRTUAL
-#endif
-
-//____________________________________________________________________________//
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CONFIG_HPP
diff --git a/boost/test/utils/runtime/configuration.hpp b/boost/test/utils/runtime/configuration.hpp
deleted file mode 100644
index bf731736ee..0000000000
--- a/boost/test/utils/runtime/configuration.hpp
+++ /dev/null
@@ -1,61 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Distributed under 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$
-//
-// Description : abstract interface for the formal parameter
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_CONFIGURATION_HPP
-#define BOOST_TEST_UTILS_RUNTIME_CONFIGURATION_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-#include <boost/test/utils/runtime/parameter.hpp>
-#include <boost/test/utils/runtime/argument.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-// ************************************************************************** //
-// ************** runtime::configuration ************** //
-// ************************************************************************** //
-
-class config_source {
- virtual parameter const& config_param_begin() const = 0;
- virtual parameter const& config_param_end() const = 0;
-
-protected:
- config_source() {}
- ~config_source() {}
-};
-
-// ************************************************************************** //
-// ************** runtime::configuration ************** //
-// ************************************************************************** //
-
-template<typename StoragePolicy,typename IdentificationPlicy,typename ConflictResolutionPolicy>
-class configuration : public StoragePolicy, public IdentificationPlicy, public ConflictResolutionPolicy {
-public:
- // Constructor
- configuration();
-
- void use( config_source const& )
- {
-
- }
-private:
-};
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_CONFIGURATION_HPP
diff --git a/boost/test/utils/runtime/env/environment.cpp b/boost/test/utils/runtime/env/environment.cpp
deleted file mode 100644
index ddf47b342c..0000000000
--- a/boost/test/utils/runtime/env/environment.cpp
+++ /dev/null
@@ -1,23 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2004-2014.
-// 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$
-//
-// Description : implements offline model of program environment
-// ***************************************************************************
-
-#include <boost/test/utils/runtime/config.hpp>
-
-#ifdef BOOST_MSVC
-# pragma warning(disable: 4127) // conditional expression is constant
-# pragma warning(disable: 4701) // local environment 'result' may be used without having been initialized
-#endif
-
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-#include <boost/test/utils/runtime/env/environment.ipp>
diff --git a/boost/test/utils/runtime/env/environment.hpp b/boost/test/utils/runtime/env/environment.hpp
deleted file mode 100644
index 62b2ae6dc1..0000000000
--- a/boost/test/utils/runtime/env/environment.hpp
+++ /dev/null
@@ -1,171 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Distributed under 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$
-//
-// Description : defines and implements inline model of program environment
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_ENV_ENVIRONMENT_HPP
-#define BOOST_TEST_UTILS_RUNTIME_ENV_ENVIRONMENT_HPP
-
-#ifdef UNDER_CE
-#error Windows CE does not support environment variables.
-#endif
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-#include <boost/test/utils/runtime/fwd.hpp>
-#include <boost/test/utils/runtime/argument.hpp>
-#include <boost/test/utils/runtime/interpret_argument_value.hpp>
-
-#include <boost/test/utils/runtime/env/fwd.hpp>
-#include <boost/test/utils/runtime/env/modifier.hpp>
-#include <boost/test/utils/runtime/env/variable.hpp>
-
-// Boost
-#include <boost/optional.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-// ************************************************************************** //
-// ************** runtime::environment implementation ************** //
-// ************************************************************************** //
-
-namespace environment {
-
-namespace rt_env_detail {
-
-template<typename T, typename Modifiers>
-variable_data&
-init_new_var( cstring var_name, Modifiers m = nfp::no_params )
-{
- rt_env_detail::variable_data& new_vd = new_var_record( var_name );
-
- cstring str_value = sys_read_var( new_vd.m_var_name );
-
- if( !str_value.is_empty() ) {
- BOOST_TEST_IMPL_TRY {
- boost::optional<T> value;
-
- if( m.has( interpreter ) )
- m[interpreter]( str_value, value );
- else
- interpret_argument_value( str_value, value, 0 );
-
- if( !!value ) {
- new_vd.m_value.reset( new typed_argument<T>( new_vd ) );
-
- arg_value<T>( *new_vd.m_value ) = *value;
- }
- }
- BOOST_TEST_IMPL_CATCHALL() { // !! could we do that
- // !! should we report an error?
- }
- }
-
- if( !new_vd.m_value && m.has( default_value ) ) {
- new_vd.m_value.reset( new typed_argument<T>( new_vd ) );
-
- nfp::optionally_assign( arg_value<T>( *new_vd.m_value ), m[default_value] );
- }
-
- nfp::optionally_assign( new_vd.m_global_id, m, global_id );
-
- return new_vd;
-}
-
-//____________________________________________________________________________//
-
-} // namespace rt_env_detail
-
-} // namespace environment
-
-// ************************************************************************** //
-// ************** runtime::environment ************** //
-// ************************************************************************** //
-
-namespace environment {
-
- // variable access
- variable_base
- var( cstring var_name );
-
- //________________________________________________________________________//
-
- template<typename T>
- inline variable<T>
- var( cstring var_name )
- {
- rt_env_detail::variable_data* vd = rt_env_detail::find_var_record( var_name );
-
- return environment::variable<T>( !vd ? rt_env_detail::init_new_var<T>( var_name, nfp::no_params ) : *vd );
- }
-
- //________________________________________________________________________//
-
- template<typename T, typename Modifiers>
- inline variable<T>
- var( cstring var_name, Modifiers const& m )
- {
- rt_env_detail::variable_data* vd = rt_env_detail::find_var_record( var_name );
-
- return environment::variable<T>( !vd ? rt_env_detail::init_new_var<T>( var_name, m ) : *vd );
- }
-
- //________________________________________________________________________//
-
- // direct variable value access
- inline cstring
- get( cstring var_name )
- {
- return environment::var<cstring>( var_name ).value();
- }
-
- //________________________________________________________________________//
-
- template<typename T>
- inline T const&
- get( cstring var_name )
- {
- return environment::var<T>( var_name ).value();
- }
-
- //________________________________________________________________________//
-
- template<typename T>
- inline void
- get( cstring var_name, boost::optional<T>& res )
- {
- variable<T> const& v = environment::var<T>( var_name );
- v.value( res );
- }
-
- //________________________________________________________________________//
-
-} // namespace environment
-
-namespace env = environment;
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_OFFLINE
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE
-# define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE inline
-#endif
-# include <boost/test/utils/runtime/env/environment.ipp>
-
-#endif
-
-#endif // BOOST_TEST_UTILS_RUNTIME_ENV_ENVIRONMENT_HPP
diff --git a/boost/test/utils/runtime/env/environment.ipp b/boost/test/utils/runtime/env/environment.ipp
deleted file mode 100644
index 6baf72f430..0000000000
--- a/boost/test/utils/runtime/env/environment.ipp
+++ /dev/null
@@ -1,125 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Distributed under 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$
-//
-// Description : implements model of program environment
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_ENV_ENVIRONMENT_IPP
-#define BOOST_TEST_UTILS_RUNTIME_ENV_ENVIRONMENT_IPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-#include <boost/test/utils/runtime/validation.hpp>
-
-#include <boost/test/utils/runtime/env/variable.hpp>
-
-// Boost.Test
-#include <boost/test/utils/basic_cstring/compare.hpp>
-#include <boost/test/utils/basic_cstring/io.hpp>
-
-// STL
-#include <map>
-#include <list>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace environment {
-
-// ************************************************************************** //
-// ************** runtime::environment ************** //
-// ************************************************************************** //
-
-namespace rt_env_detail {
-
-typedef std::map<cstring,rt_env_detail::variable_data> registry;
-typedef std::list<dstring> keys;
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE registry& s_registry() { static registry instance; return instance; }
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE keys& s_keys() { static keys instance; return instance; }
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE variable_data&
-new_var_record( cstring var_name )
-{
- // save the name in list of keys
- s_keys().push_back( dstring() );
- dstring& key = s_keys().back();
- assign_op( key, var_name, 0 );
-
- // create and return new record
- variable_data& new_var_data = s_registry()[key];
-
- new_var_data.m_var_name = key;
-
- return new_var_data;
-}
-
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE variable_data*
-find_var_record( cstring var_name )
-{
- registry::iterator it = s_registry().find( var_name );
-
- return it == s_registry().end() ? 0 : &(it->second);
-}
-
-//____________________________________________________________________________//
-
-#ifdef BOOST_MSVC
-#pragma warning(push)
-#pragma warning(disable:4996) // getenv
-#endif
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE cstring
-sys_read_var( cstring var_name )
-{
- using namespace std;
- return BOOST_TEST_UTILS_RUNTIME_PARAM_GETENV( var_name.begin() );
-}
-
-#ifdef BOOST_MSVC
-#pragma warning(pop)
-#endif
-//____________________________________________________________________________//
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE void
-sys_write_var( cstring var_name, format_stream& var_value )
-{
- BOOST_TEST_UTILS_RUNTIME_PARAM_PUTENV( var_name, cstring( var_value.str() ) );
-}
-
-//____________________________________________________________________________//
-
-} // namespace rt_env_detail
-
-BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE variable_base
-var( cstring var_name )
-{
- rt_env_detail::variable_data* vd = rt_env_detail::find_var_record( var_name );
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( !!vd,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "First access to the environment variable " )
- << var_name << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( " should be typed" ) );
-
- return variable_base( *vd );
-}
-
-//____________________________________________________________________________//
-
-} // namespace environment
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_ENV_ENVIRONMENT_IPP_062904GER
diff --git a/boost/test/utils/runtime/env/fetch.hpp b/boost/test/utils/runtime/env/fetch.hpp
new file mode 100644
index 0000000000..97d54d4905
--- /dev/null
+++ b/boost/test/utils/runtime/env/fetch.hpp
@@ -0,0 +1,108 @@
+// (C) Copyright Gennadiy Rozental 2001.
+// Distributed under 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$
+//
+// Description : implements fetching absent parameter athuments from environment
+// ***************************************************************************
+
+#ifndef BOOST_TEST_UTILS_RUNTIME_ENV_FETCH_HPP
+#define BOOST_TEST_UTILS_RUNTIME_ENV_FETCH_HPP
+
+// Boost.Test Runtime parameters
+#include <boost/test/utils/runtime/parameter.hpp>
+#include <boost/test/utils/runtime/argument.hpp>
+
+#include <boost/test/detail/suppress_warnings.hpp>
+
+// C Runtime
+#include <stdlib.h>
+
+namespace boost {
+namespace runtime {
+namespace env {
+
+namespace env_detail {
+
+#ifndef UNDER_CE
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4996) // getenv
+#endif
+
+inline std::pair<cstring,bool>
+sys_read_var( cstring var_name )
+{
+ using namespace std;
+ char const* res = getenv( var_name.begin() );
+
+ return std::make_pair( cstring(res), res != NULL );
+}
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#else
+
+inline std::pair<cstring,bool>
+sys_read_var( cstring var_name )
+{
+ return std::make_pair( cstring(), false );
+}
+
+#endif
+
+//____________________________________________________________________________//
+
+template<typename ReadFunc>
+inline void
+fetch_absent( parameters_store const& params, runtime::arguments_store& args, ReadFunc read_func )
+{
+ BOOST_TEST_FOREACH( parameters_store::storage_type::value_type const&, v, params.all() ) {
+ basic_param_ptr param = v.second;
+
+ if( args.has( param->p_name ) || param->p_env_var.empty() )
+ continue;
+
+ std::pair<cstring,bool> value = read_func( param->p_env_var );
+
+ if( !value.second )
+ continue;
+
+ // Validate against unexpected empty value
+ BOOST_TEST_I_ASSRT( !value.first.is_empty() || param->p_has_optional_value,
+ format_error( param->p_name )
+ << "Missing an argument value for the parameter " << param->p_name
+ << " in the environment." );
+
+ // Produce argument value
+ param->produce_argument( value.first, false, args );
+
+ }
+}
+
+//____________________________________________________________________________//
+
+} // namespace env_detail
+
+inline void
+fetch_absent( parameters_store const& params, runtime::arguments_store& args )
+{
+ env_detail::fetch_absent( params, args, &env_detail::sys_read_var );
+}
+
+} // namespace env
+} // namespace runtime
+} // namespace boost
+
+#include <boost/test/detail/enable_warnings.hpp>
+
+#endif // BOOST_TEST_UTILS_RUNTIME_ENV_FETCH_HPP
diff --git a/boost/test/utils/runtime/env/fwd.hpp b/boost/test/utils/runtime/env/fwd.hpp
deleted file mode 100644
index 438795ea8f..0000000000
--- a/boost/test/utils/runtime/env/fwd.hpp
+++ /dev/null
@@ -1,61 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Distributed under 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$
-//
-// Description : environment subsystem forward declarations
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_ENV_FWD_HPP
-#define BOOST_TEST_UTILS_RUNTIME_ENV_FWD_HPP
-
-#ifdef UNDER_CE
-#error Windows CE does not support environment variables.
-#endif
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace environment {
-
-template<typename T>
-class variable;
-
-class variable_base;
-variable_base var( cstring var_name );
-
-template<typename T>
-inline variable<T>
- var( cstring var_name );
-
-namespace rt_env_detail {
-
-struct variable_data;
-
-variable_data& new_var_record( cstring var_name );
-variable_data* find_var_record( cstring var_name );
-
-cstring sys_read_var( cstring var_name );
-void sys_write_var( cstring var_name, format_stream& var_value );
-
-}
-
-template <typename T> class variable;
-
-} // namespace environment
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_ENV_FWD_HPP
diff --git a/boost/test/utils/runtime/env/modifier.hpp b/boost/test/utils/runtime/env/modifier.hpp
deleted file mode 100644
index 536461a549..0000000000
--- a/boost/test/utils/runtime/env/modifier.hpp
+++ /dev/null
@@ -1,47 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : defines variable modifiers
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_ENV_MODIFIER_HPP
-#define BOOST_TEST_UTILS_RUNTIME_ENV_MODIFIER_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-// Boost.Test
-#include <boost/test/utils/named_params.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace environment {
-
-// ************************************************************************** //
-// ************** environment variable modifiers ************** //
-// ************************************************************************** //
-
-namespace {
-
-nfp::typed_keyword<cstring,struct global_id_t> global_id;
-nfp::keyword<struct default_value_t> default_value;
-nfp::keyword<struct interpreter_t> interpreter;
-
-} // local namespace
-} // namespace environment
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_ENV_MODIFIER_HPP
diff --git a/boost/test/utils/runtime/env/variable.hpp b/boost/test/utils/runtime/env/variable.hpp
deleted file mode 100644
index df776a619a..0000000000
--- a/boost/test/utils/runtime/env/variable.hpp
+++ /dev/null
@@ -1,223 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Distributed under 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$
-//
-// Description : defines model of program environment variable
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_ENV_VARIABLE_HPP
-#define BOOST_TEST_UTILS_RUNTIME_ENV_VARIABLE_HPP
-
-#ifdef UNDER_CE
-#error Windows CE does not support environment variables.
-#endif
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-#include <boost/test/utils/runtime/fwd.hpp>
-#include <boost/test/utils/runtime/parameter.hpp>
-#include <boost/test/utils/runtime/argument.hpp>
-
-#include <boost/test/utils/runtime/env/fwd.hpp>
-
-// Boost
-#include <boost/optional.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace environment {
-
-// ************************************************************************** //
-// ************** runtime::environment::variable_data ************** //
-// ************************************************************************** //
-
-namespace rt_env_detail {
-
-struct variable_data : public runtime::parameter {
- cstring m_var_name;
- dstring m_global_id;
- argument_ptr m_value;
-};
-
-} // namespace rt_env_detail
-
-// ************************************************************************** //
-// ************** runtime::environment::variable_base ************** //
-// ************************************************************************** //
-
-class variable_base {
-public:
- explicit variable_base( rt_env_detail::variable_data& data ) : m_data( &data ) {}
-
- // arguments access
- template<typename T>
- T const& value() const
- {
- return arg_value<T>( *m_data->m_value );
- }
-
- template<typename T>
- void value( boost::optional<T>& res ) const
- {
- if( has_value() )
- res = arg_value<T>( *m_data->m_value );
- else
- res.reset();
- }
-
- bool has_value() const { return !!m_data->m_value; }
- cstring name() const { return m_data->m_var_name; }
-
-protected:
- // Data members
- rt_env_detail::variable_data* m_data;
-} ;
-
-// ************************************************************************** //
-// ************** runtime::environment::variable ************** //
-// ************************************************************************** //
-
-template<typename T = cstring>
-class variable : public variable_base {
-public:
- // Constructors
- explicit variable( cstring var_name );
-
- template<typename Modifiers>
- explicit variable( cstring var_name, Modifiers const& m );
-
- explicit variable( rt_env_detail::variable_data& data )
- : variable_base( data ) {}
-
- // other variable assignment
- void operator=( variable const& v ) { m_data = v.m_data; }
-
- // access methods
- T const& value() const { return variable_base::value<T>(); }
-
-#if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3206)) || \
- BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x0593))
- template<typename T>
- void value( boost::optional<T>& res ) const { variable_base::value( res ); }
-#else
- using variable_base::value;
-#endif
-
- // Value assignment
- template<typename V>
- void operator=( V const& v )
- {
- if( !has_value() )
- m_data->m_value.reset( new typed_argument<T>( *m_data ) );
-
- arg_value<T>( *m_data->m_value ) = v;
-
- rt_env_detail::sys_write_var( m_data->m_var_name, format_stream().ref() << value() );
- }
-}; // class variable
-
-//____________________________________________________________________________//
-
-template<typename CharT, typename Tr,typename T>
-inline std::basic_ostream<CharT,Tr>&
-operator<<( std::basic_ostream<CharT,Tr>& os, variable<T> const& v )
-{
- os << v.name() << '=';
-
- if( v.has_value() )
- os << v.value();
-
- return os;
-}
-
-//____________________________________________________________________________//
-
-template<typename T, typename V>
-inline bool
-operator==( variable<T> ev, V const& v )
-{
- return ev.has_value() && ev.value() == v;
-}
-
-//____________________________________________________________________________//
-
-template<typename T, typename V>
-inline bool
-operator==( V const& v, variable<T> ev )
-{
- return ev.has_value() && ev.value() == v;
-}
-
-//____________________________________________________________________________//
-
-template<typename T, typename V>
-inline bool
-operator!=( variable<T> ev, V const& v )
-{
- return !ev.has_value() || ev.value() != v;
-}
-
-//____________________________________________________________________________//
-
-template<typename T, typename V>
-inline bool
-operator!=( V const& v, variable<T> ev )
-{
- return !ev.has_value() || ev.value() != v;
-}
-
-//____________________________________________________________________________//
-
-} // namespace environment
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-// ************************************************************************** //
-// ************************************************************************** //
-// Implementation
-
-#include <boost/test/utils/runtime/env/environment.hpp>
-
-// ************************************************************************** //
-// ************** runtime::environment::variable ************** //
-// ************************************************************************** //
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace environment {
-
-template<typename T>
-variable<T>::variable( cstring var_name )
-: variable_base( environment::var<T>( var_name ) )
-{}
-
-//____________________________________________________________________________//
-
-template<typename T>
-template<typename Modifiers>
-variable<T>::variable( cstring var_name, Modifiers const& m )
-: variable_base( environment::var<T>( var_name, m ) )
-{}
-
-//____________________________________________________________________________//
-
-} // namespace environment
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_ENV_VARIABLE_HPP
diff --git a/boost/test/utils/runtime/errors.hpp b/boost/test/utils/runtime/errors.hpp
new file mode 100644
index 0000000000..c11686132c
--- /dev/null
+++ b/boost/test/utils/runtime/errors.hpp
@@ -0,0 +1,195 @@
+// (C) Copyright Gennadiy Rozental 2001.
+// Distributed under 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$
+//
+// Description : defines runtime parameters setup error
+// ***************************************************************************
+
+#ifndef BOOST_TEST_UTILS_RUNTIME_INIT_ERROR_HPP
+#define BOOST_TEST_UTILS_RUNTIME_INIT_ERROR_HPP
+
+// Boost.Test Runtime parameters
+#include <boost/test/utils/runtime/fwd.hpp>
+
+// Boost.Test
+#include <boost/test/utils/string_cast.hpp>
+
+// Boost.Test
+#include <boost/config.hpp>
+
+// STL
+#include <exception>
+#include <vector>
+
+#include <boost/test/detail/suppress_warnings.hpp>
+
+namespace boost {
+namespace runtime {
+
+// ************************************************************************** //
+// ************** runtime::param_error ************** //
+// ************************************************************************** //
+
+class param_error : public std::exception {
+public:
+ ~param_error() BOOST_NOEXCEPT_OR_NOTHROW {}
+
+ virtual const char * what() const BOOST_NOEXCEPT_OR_NOTHROW
+ {
+ return msg.c_str();
+ }
+
+ cstring param_name;
+ std::string msg;
+
+protected:
+ explicit param_error( cstring param_name_ ) : param_name( param_name_) {}
+};
+
+//____________________________________________________________________________//
+
+class init_error : public param_error {
+protected:
+ explicit init_error( cstring param_name ) : param_error( param_name ) {}
+ ~init_error() BOOST_NOEXCEPT_OR_NOTHROW {}
+};
+
+class input_error : public param_error {
+protected:
+ explicit input_error( cstring param_name ) : param_error( param_name ) {}
+ ~input_error() BOOST_NOEXCEPT_OR_NOTHROW {}
+};
+
+//____________________________________________________________________________//
+
+template<typename Derived, typename Base>
+class specific_param_error : public Base {
+protected:
+ explicit specific_param_error( cstring param_name ) : Base( param_name ) {}
+ ~specific_param_error() BOOST_NOEXCEPT_OR_NOTHROW {}
+};
+
+//____________________________________________________________________________//
+
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+
+template<typename Derived, typename Base>
+inline Derived
+operator<<(specific_param_error<Derived, Base>&& ex, char const* val)
+{
+ ex.msg.append( val );
+
+ return reinterpret_cast<Derived&&>(ex);
+}
+
+//____________________________________________________________________________//
+
+template<typename Derived, typename Base, typename T>
+inline Derived
+operator<<(specific_param_error<Derived, Base>&& ex, T const& val)
+{
+ ex.msg.append( unit_test::utils::string_cast( val ) );
+
+ return reinterpret_cast<Derived&&>(ex);
+}
+
+//____________________________________________________________________________//
+
+#else
+
+template<typename Derived, typename Base>
+inline Derived
+operator<<(specific_param_error<Derived, Base> const& ex, char const* val)
+{
+ const_cast<specific_param_error<Derived, Base>&>(ex).msg.append( val );
+
+ return static_cast<Derived const&>(ex);
+}
+
+//____________________________________________________________________________//
+
+template<typename Derived, typename Base, typename T>
+inline Derived
+operator<<(specific_param_error<Derived, Base> const& ex, T const& val)
+{
+ const_cast<specific_param_error<Derived, Base>&>(ex).msg.append( unit_test::utils::string_cast( val ) );
+
+ return static_cast<Derived const&>(ex);
+}
+
+//____________________________________________________________________________//
+
+#endif
+
+// ************************************************************************** //
+// ************** specific exception types ************** //
+// ************************************************************************** //
+
+#define SPECIFIC_EX_TYPE( type, base ) \
+class type : public specific_param_error<type,base> { \
+public: \
+ explicit type( cstring param_name = cstring() ) \
+ : specific_param_error<type,base>( param_name ) \
+ {} \
+} \
+/**/
+
+SPECIFIC_EX_TYPE( invalid_cla_id, init_error );
+SPECIFIC_EX_TYPE( duplicate_param, init_error );
+SPECIFIC_EX_TYPE( conflicting_param, init_error );
+SPECIFIC_EX_TYPE( unknown_param, init_error );
+SPECIFIC_EX_TYPE( access_to_missing_argument, init_error );
+SPECIFIC_EX_TYPE( arg_type_mismatch, init_error );
+SPECIFIC_EX_TYPE( invalid_param_spec, init_error );
+
+SPECIFIC_EX_TYPE( format_error, input_error );
+SPECIFIC_EX_TYPE( duplicate_arg, input_error );
+SPECIFIC_EX_TYPE( missing_req_arg, input_error );
+
+#undef SPECIFIC_EX_TYPE
+
+class ambiguous_param : public specific_param_error<ambiguous_param, input_error> {
+public:
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+ explicit ambiguous_param( std::vector<cstring>&& amb_candidates )
+ : specific_param_error<ambiguous_param,input_error>( "" )
+ , m_amb_candidates( std::move( amb_candidates ) ) {}
+#else
+ explicit ambiguous_param( std::vector<cstring> const& amb_candidates )
+ : specific_param_error<ambiguous_param,input_error>( "" )
+ , m_amb_candidates( amb_candidates ) {}
+#endif
+ ~ambiguous_param() BOOST_NOEXCEPT_OR_NOTHROW {}
+
+ std::vector<cstring> m_amb_candidates;
+};
+
+class unrecognized_param : public specific_param_error<unrecognized_param, input_error> {
+public:
+#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
+ explicit unrecognized_param( std::vector<cstring>&& type_candidates )
+ : specific_param_error<unrecognized_param,input_error>( "" )
+ , m_typo_candidates( std::move( type_candidates ) ) {}
+#else
+ explicit unrecognized_param( std::vector<cstring> const& type_candidates )
+ : specific_param_error<unrecognized_param,input_error>( "" )
+ , m_typo_candidates( type_candidates ) {}
+#endif
+ ~unrecognized_param() BOOST_NOEXCEPT_OR_NOTHROW {}
+
+ std::vector<cstring> m_typo_candidates;
+};
+
+} // namespace runtime
+} // namespace boost
+
+#include <boost/test/detail/enable_warnings.hpp>
+
+#endif // BOOST_TEST_UTILS_RUNTIME_INIT_ERROR_HPP
diff --git a/boost/test/utils/runtime/file/config_file.cpp b/boost/test/utils/runtime/file/config_file.cpp
deleted file mode 100644
index 1e13d66eee..0000000000
--- a/boost/test/utils/runtime/file/config_file.cpp
+++ /dev/null
@@ -1,249 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : implements models configuration file, it's parameter and parameter namespaces
-// ***************************************************************************
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/file/config_file.hpp>
-#include <boost/test/utils/runtime/validation.hpp>
-
-// Boost.Test
-#include <boost/test/utils/foreach.hpp>
-#include <boost/test/utils/basic_cstring/basic_cstring.hpp>
-#include <boost/test/utils/basic_cstring/io.hpp>
-#include <boost/test/utils/iterator/token_iterator.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace file {
-
-// ************************************************************************** //
-// ************** runtime::file::parameter ************** //
-// ************************************************************************** //
-
-parameter::parameter( cstring name, cstring value, param_namespace const& parent )
-: m_parent( parent )
-{
- assign_op( p_name.value, name, 0 );
- assign_op( p_value.value, value, 0 );
-}
-
-//____________________________________________________________________________//
-
-std::ostream&
-operator<<( std::ostream& os, parameter const& p )
-{
- p.m_parent.print_full_name( os );
-
- return os << p.p_name << " = \"" << p.p_value << "\"";
-}
-
-//____________________________________________________________________________//
-
-// ************************************************************************** //
-// ************** runtime::file::param_namespace ************** //
-// ************************************************************************** //
-
-param_namespace::param_namespace( cstring name, param_namespace const* parent )
-: p_parent( parent )
-{
- assign_op( p_name.value, name, 0 );
-}
-
-//____________________________________________________________________________//
-
-void
-param_namespace::insert_param( cstring param_name, cstring param_value )
-{
- BOOST_TEST_FOREACH( parameter const&, p, m_parameters )
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( p.p_name != param_name,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "Duplicate parameter " ) << param_name );
-
- m_parameters.push_back( parameter( param_name, param_value, *this ) );
-}
-
-//____________________________________________________________________________//
-
-param_namespace&
-param_namespace::subnamespace( cstring namespace_name )
-{
- BOOST_TEST_FOREACH( param_namespace&, subns, m_subnamespaces )
- if( subns.p_name == namespace_name )
- return subns;
-
- m_subnamespaces.push_back( param_namespace( namespace_name, this ) );
-
- return m_subnamespaces.back();
-}
-
-//____________________________________________________________________________//
-
-void
-param_namespace::clear()
-{
- m_parameters.clear();
- m_subnamespaces.clear();
-}
-
-//____________________________________________________________________________//
-
-void
-param_namespace::print_full_name( std::ostream& os ) const
-{
- if( !p_parent )
- return;
-
- p_parent.get()->print_full_name( os );
-
- os << p_name << "::";
-}
-
-//____________________________________________________________________________//
-
-boost::optional<cstring>
-get_param_value( param_namespace const& where_from,
- cstring name_part1,
- cstring name_part2,
- cstring name_part3,
- cstring name_part4,
- cstring name_part5 )
-{
- if( name_part2.is_empty() ) {
- boost::optional<cstring> res;
-
- BOOST_TEST_FOREACH( parameter const&, p, where_from ) {
- if( p.p_name == name_part1 ) {
- res = cstring( p.p_value );
- break;
- }
- }
-
- return res;
- }
-
- param_namespace const* sns = get_param_subns( where_from, name_part1 );
-
- return sns ? get_param_value( *sns, name_part2, name_part3, name_part4, name_part5 )
- : boost::optional<cstring>();
-}
-
-//____________________________________________________________________________//
-
-cstring
-get_requ_param_value( param_namespace const& where_from,
- cstring name_part1,
- cstring name_part2,
- cstring name_part3,
- cstring name_part4,
- cstring name_part5 )
-{
- boost::optional<cstring> v = get_param_value( where_from, name_part1, name_part2, name_part3, name_part4, name_part5 );
-
-#define APPEND_PART( part ) (part.is_empty() ? "" : "::") << (part.is_empty() ? cstring() : part)
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( !!v, BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "Required parameter " )
- << name_part1
- << APPEND_PART( name_part2 )
- << APPEND_PART( name_part3 )
- << APPEND_PART( name_part4 )
- << APPEND_PART( name_part5 )
- << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( " value is missing" ) );
-#undef APPEND_PART
-
- return *v;
-}
-
-//____________________________________________________________________________//
-
-param_namespace const*
-get_param_subns( param_namespace const& where_from, cstring namespace_name )
-{
- param_namespace::sub_ns_const_iterator it = where_from.sub_ns_begin();
- param_namespace::sub_ns_const_iterator end = where_from.sub_ns_end();
-
- while( it != end ) {
- if( it->p_name == namespace_name )
- return &*it;
-
- ++it;
- }
-
- return 0;
-}
-
-//____________________________________________________________________________//
-
-void
-param_namespace::load_impl( config_file_iterator cf_it,
- cstring value_marker, cstring value_delimeter, cstring namespace_delimeter )
-{
- using namespace unit_test;
-
- while( cf_it != config_file_iterator() ) {
- string_token_iterator ti( *cf_it, (max_tokens = 2,kept_delimeters = dt_none, dropped_delimeters = value_delimeter) );
-
- cstring param_name = *ti;
- cstring param_value = *(++ti);
-
- param_value.trim( value_marker );
-
- param_namespace* targ_ns = this;
-
- while( !param_name.is_empty() ) {
- cstring::size_type pos = param_name.find( namespace_delimeter );
- cstring subname( param_name.begin(), pos == cstring::npos ? param_name.size() : pos );
-
- if( subname.size() == param_name.size() ) {
- targ_ns->insert_param( param_name, param_value );
- break;
- }
- else {
- targ_ns = &targ_ns->subnamespace( subname );
-
- param_name.trim_left( subname.size() + namespace_delimeter.size() );
- }
- }
- ++cf_it;
- }
-}
-
-//____________________________________________________________________________//
-
-// ************************************************************************** //
-// ************** runtime::file::config_file ************** //
-// ************************************************************************** //
-
-config_file::config_file()
-: param_namespace( cstring() )
-{
-}
-
-//____________________________________________________________________________//
-
-config_file::config_file( cstring file_name )
-: param_namespace( cstring() )
-{
- load( file_name );
-}
-
-//____________________________________________________________________________//
-
-} // namespace file
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-// EOF
diff --git a/boost/test/utils/runtime/file/config_file.hpp b/boost/test/utils/runtime/file/config_file.hpp
deleted file mode 100644
index e7baf08bf2..0000000000
--- a/boost/test/utils/runtime/file/config_file.hpp
+++ /dev/null
@@ -1,182 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : defines models configuration file, it's parameter and parameter namespaces
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_FILE_CONFIG_FILE_HPP
-#define BOOST_TEST_UTILS_RUNTIME_FILE_CONFIG_FILE_HPP
-
-// 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_TEST_UTILS_RUNTIME_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_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "\"" );
- cstring vd = m.has( value_delimeter ) ? m[value_delimeter] : BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "= \t\n\r" );
- cstring nd = m.has( namespace_delimeter ) ? m[namespace_delimeter] : BOOST_TEST_UTILS_RUNTIME_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_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_FILE_CONFIG_FILE_HPP_010105GER
diff --git a/boost/test/utils/runtime/file/config_file_iterator.cpp b/boost/test/utils/runtime/file/config_file_iterator.cpp
deleted file mode 100644
index 5d6cbdf7dc..0000000000
--- a/boost/test/utils/runtime/file/config_file_iterator.cpp
+++ /dev/null
@@ -1,685 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : flexible configuration file iterator implementation
-// ***************************************************************************
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/file/config_file_iterator.hpp>
-#include <boost/test/utils/runtime/validation.hpp>
-
-#ifndef UNDER_CE
-#include <boost/test/utils/runtime/env/environment.hpp>
-#endif
-
-
-// Boost
-#include <boost/scoped_array.hpp>
-#include <boost/bind.hpp>
-#include <boost/noncopyable.hpp>
-
-// Boost.Test
-#include <boost/test/utils/basic_cstring/compare.hpp>
-#include <boost/test/utils/algorithm.hpp>
-#include <boost/test/utils/iterator/token_iterator.hpp>
-#include <boost/test/utils/assign_op.hpp>
-
-// STL
-#include <memory>
-#include <map>
-#include <list>
-#include <vector>
-#include <fstream>
-#include <cctype>
-#include <iostream>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace file {
-
-// ************************************************************************** //
-// ************** symbol_to_value_map ************** //
-// ************************************************************************** //
-
-template<typename ValueType>
-struct symbol_to_value_map : std::map<cstring, ValueType> {
- template<typename ParamType>
- void add( cstring name, ParamType const& value )
- {
- using namespace unit_test;
-
- m_name_store.push_back( dstring() );
-
- assign_op( m_name_store.back(), name, 0 );
- assign_op( (*this)[m_name_store.back()], value, 0 );
- }
- void remove( cstring name )
- {
- std::list<dstring>::iterator it = std::find( m_name_store.begin(), m_name_store.end(), name );
-
- m_name_store.erase( it );
-
- this->erase( name );
- }
-
-private:
- std::list<dstring> m_name_store;
-};
-
-// ************************************************************************** //
-// ************** symbol_table_t ************** //
-// ************************************************************************** //
-
-typedef symbol_to_value_map<dstring> symbol_table_t;
-
-// ************************************************************************** //
-// ************** command_handler_map ************** //
-// ************************************************************************** //
-
-typedef symbol_to_value_map<config_file_iterator::command_handler> command_handler_map;
-
-// ************************************************************************** //
-// ************** is_valid_identifier ************** //
-// ************************************************************************** //
-
-static bool
-is_valid_identifier( cstring const& source )
-{
- if( source.is_empty() )
- return false;
-
- cstring::const_iterator it = source.begin();
-
- if( !std::isalpha( *it ) )
- return false;
-
- while( ++it < source.end() ) {
- if( !std::isalnum( *it ) && *it != BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '_' ) && *it != BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '-' ) )
- return false;
- }
-
- return true;
-}
-
-// ************************************************************************** //
-// ************** include_level ************** //
-// ************************************************************************** //
-
-struct include_level;
-typedef std::auto_ptr<include_level> include_level_ptr;
-
-struct include_level : noncopyable
-{
- // Constructor
- explicit include_level( cstring file_name, cstring path_separators, include_level* parent = 0 );
-
- // Data members
- std::ifstream m_stream;
- location m_curr_location;
- include_level_ptr m_parent;
-};
-
-//____________________________________________________________________________//
-
-include_level::include_level( cstring file_name, cstring path_separators, include_level* parent_ )
-: m_parent( parent_ )
-{
- if( file_name.is_empty() )
- return;
-
- assign_op( m_curr_location.first, file_name, 0 );
- m_curr_location.second = 0;
-
- m_stream.open( m_curr_location.first.c_str() );
-
- if( !m_stream.is_open() && !!m_parent.get() ) {
- cstring parent_path = m_parent->m_curr_location.first;
- cstring::iterator it = unit_test::find_last_of( parent_path.begin(), parent_path.end(),
- path_separators.begin(),
- path_separators.end() );
-
- if( it != parent_path.end() ) {
- assign_op( m_curr_location.first, cstring( parent_path.begin(), it+1 ), 0 );
- m_curr_location.first.append( file_name.begin(), file_name.end() );
- m_stream.clear();
- m_stream.open( m_curr_location.first.c_str() );
- }
- }
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( m_stream.is_open(), BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "can't open file " ) << file_name );
-}
-
-//____________________________________________________________________________//
-
-// ************************************************************************** //
-// ************** config_file_iterator::Impl ************** //
-// ************************************************************************** //
-
-struct config_file_iterator::Impl : noncopyable {
- // Constructor
- Impl();
-
- bool get_next_line( cstring& next_line );
-
- void process_command_line( cstring line );
- void process_include( cstring line );
- void process_define( cstring line );
- void process_undef( cstring line );
- void process_ifdef( cstring line );
- void process_ifndef( cstring line );
- void process_else( cstring line );
- void process_endif( cstring line );
-
- boost::optional<cstring>
- get_macro_value( cstring macro_name, bool ignore_missing = true );
- void substitute_macros( cstring& where );
-
- bool is_active_line() { return m_inactive_ifdef_level == 0; }
-
- static bool match_front( cstring str, cstring pattern )
- {
- return str.size() >= pattern.size() && str.substr( 0, pattern.size() ) == pattern;
- }
- static bool match_back( cstring str, cstring pattern )
- {
- return str.size() >= pattern.size() && str.substr( str.size() - pattern.size() ) == pattern;
- }
-
- // Configurable parameters
- dstring m_path_separators;
- char_type m_line_delimeter;
- dstring m_sl_comment_delimeter;
- dstring m_command_delimeter;
- dstring m_line_beak;
- dstring m_macro_ref_begin;
- dstring m_macro_ref_end;
-
- dstring m_include_kw;
- dstring m_define_kw;
- dstring m_undef_kw;
- dstring m_ifdef_kw;
- dstring m_ifndef_kw;
- dstring m_else_kw;
- dstring m_endif_kw;
-
- std::size_t m_buffer_size;
-
- bool m_trim_trailing_spaces;
- bool m_trim_leading_spaces;
- bool m_skip_empty_lines;
- bool m_detect_missing_macro;
-
- // Data members
- dstring m_post_subst_line;
- scoped_array<char> m_buffer;
- include_level_ptr m_curr_level;
- symbol_table_t m_symbols_table;
- std::vector<bool> m_conditional_states;
- std::size_t m_inactive_ifdef_level;
- command_handler_map m_command_handler_map;
-};
-
-//____________________________________________________________________________//
-
-config_file_iterator::Impl::Impl()
-: m_path_separators( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "/\\" ) )
-, m_line_delimeter( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '\n' ) )
-, m_sl_comment_delimeter( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "#" ) )
-, m_command_delimeter( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "$" ) )
-, m_line_beak( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "\\" ) )
-, m_macro_ref_begin( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "$" ) )
-, m_macro_ref_end( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "$" ) )
-
-, m_include_kw( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "include" ) )
-, m_define_kw( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "define" ) )
-, m_undef_kw( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "undef" ) )
-, m_ifdef_kw( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "ifdef" ) )
-, m_ifndef_kw( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "ifndef" ) )
-, m_else_kw( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "else" ) )
-, m_endif_kw( BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "endif" ) )
-
-, m_buffer_size( 8192 )
-
-, m_trim_trailing_spaces( true )
-, m_trim_leading_spaces( false )
-, m_skip_empty_lines( true )
-, m_detect_missing_macro( true )
-
-, m_inactive_ifdef_level( 0 )
-{}
-
-//____________________________________________________________________________//
-
-bool
-config_file_iterator::Impl::get_next_line( cstring& line )
-{
- bool broken_line = false;
-
- line.clear();
-
- while( !m_curr_level->m_stream.eof() || !!m_curr_level->m_parent.get() ) {
- // 10. Switch to upper include level if current one is finished
- // 20. Read/append next file line
- // 30. Increment line number
- // 40. Remove comments
- // 50. Remove trailing and leading spaces
- // 60. Skip empty string
- // 70. Concatenate broken lines if needed. Put the result into line
- // 80. If line is not completed, try to finish it by reading the next line
- // 90. Process command line
- // 100. Substitute macros references with their definitions
- // 110. Next line found.
-
- if( m_curr_level->m_stream.eof() ) { // 10 //
- m_curr_level = m_curr_level->m_parent;
- continue;
- }
-
- std::ifstream& input = m_curr_level->m_stream;
- char_type* buffer_insert_pos = broken_line ? m_buffer.get() + line.size() : m_buffer.get();
-
- input.getline( buffer_insert_pos, (std::streamsize)(m_buffer_size - line.size()), // 20 //
- m_line_delimeter );
-
- cstring next_line( buffer_insert_pos,
- input.gcount() > 0
- ? buffer_insert_pos + (input.eof() ? input.gcount() : (input.gcount()-1))
- : buffer_insert_pos );
-
-
- m_curr_level->m_curr_location.second++; // 30 //
-
- cstring::size_type comment_pos = next_line.find( m_sl_comment_delimeter );
- if( comment_pos != cstring::npos )
- next_line.trim_right( next_line.begin()+comment_pos ); // 40 //
-
- if( m_trim_trailing_spaces ) // 50 //
- next_line.trim_right();
- if( m_trim_leading_spaces && !broken_line )
- next_line.trim_left();
-
- if( next_line.is_empty() ) { // 60 //
- if( m_skip_empty_lines )
- continue;
- else
- next_line.assign( buffer_insert_pos, buffer_insert_pos );
- }
-
- line = broken_line ? cstring( line.begin(), next_line.end() ) : next_line; // 70 //
-
- broken_line = match_back( line, m_line_beak );
- if( broken_line ) { // 80 //
- line.trim_right( 1 );
- continue;
- }
-
- if( match_front( line, m_command_delimeter ) ) { // 90 //
- process_command_line( line );
- continue;
- }
-
- if( !is_active_line() )
- continue;
-
- substitute_macros( line ); // 100 //
-
- return true; // 110 //
- }
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( !broken_line, BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "broken line is not completed" ) );
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( m_conditional_states.size() == 0,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "matching endif command is missing" ) );
-
- return false;
-}
-
-//____________________________________________________________________________//
-
-boost::optional<cstring>
-config_file_iterator::Impl::get_macro_value( cstring macro_name, bool ignore_missing )
-{
- symbol_table_t::const_iterator it = m_symbols_table.find( macro_name );
-
- if( it == m_symbols_table.end() ) {
- boost::optional<cstring> macro_value; // !! variable actually may have different type
-
- #ifndef UNDER_CE
- env::get( macro_name, macro_value );
- #endif
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( macro_value || ignore_missing || !m_detect_missing_macro,
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "Unknown macro \"" ) << macro_name << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "\"" ) );
-
- if( !macro_value ) {
- if( !ignore_missing )
- macro_value = cstring();
- }
- else
- m_symbols_table.add( macro_name, *macro_value );
-
- return macro_value;
- }
-
- return boost::optional<cstring>( cstring( it->second ) );
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::Impl::process_command_line( cstring line )
-{
- line.trim_left( m_command_delimeter.size() );
-
- unit_test::string_token_iterator tit( line, unit_test::max_tokens = 2 );
-
- command_handler_map::const_iterator it = m_command_handler_map.find( *tit );
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( it != m_command_handler_map.end(), BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "Invalid command " ) << *tit );
-
- ++tit;
-
- (it->second)( *tit );
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::Impl::process_include( cstring line )
-{
- using namespace unit_test;
-
- if( !is_active_line() )
- return;
-
- string_token_iterator tit( line, kept_delimeters = dt_none );
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( tit != string_token_iterator(),
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "include file name missing" ) );
-
- cstring include_file_name = *tit;
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( ++tit == string_token_iterator(),
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "unexpected tokens at the end of include command" ) );
-
- substitute_macros( include_file_name );
-
- m_curr_level.reset( new include_level( include_file_name, m_path_separators, m_curr_level.release() ) );
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::Impl::process_define( cstring line )
-{
- using namespace unit_test;
-
- if( !is_active_line() )
- return;
-
- string_token_iterator tit( line, (kept_delimeters = dt_none, max_tokens = 2 ));
-
- cstring macro_name = *tit;
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( is_valid_identifier( macro_name ),
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "invalid macro name" ) );
-
- cstring macro_value = *(++tit);
- substitute_macros( macro_value );
-
- m_symbols_table.add( macro_name, macro_value );
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::Impl::process_undef( cstring line )
-{
- if( !is_active_line() )
- return;
-
- cstring macro_name = line;
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( is_valid_identifier( macro_name ),
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "invalid macro name" ) );
-
- m_symbols_table.remove( macro_name );
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::Impl::process_ifdef( cstring line )
-{
- m_conditional_states.push_back( true );
- if( !is_active_line() )
- return;
-
- cstring macro_name = line;
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( is_valid_identifier( macro_name ),
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "invalid macro name" ) );
-
- if( !get_macro_value( macro_name ) )
- m_inactive_ifdef_level = m_conditional_states.size();
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::Impl::process_ifndef( cstring line )
-{
- m_conditional_states.push_back( true );
- if( !is_active_line() )
- return;
-
- cstring macro_name = line;
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( is_valid_identifier( macro_name ),
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "invalid macro name" ) );
-
- if( get_macro_value( macro_name ) )
- m_inactive_ifdef_level = m_conditional_states.size();
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::Impl::process_else( cstring line )
-{
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( m_conditional_states.size() > 0 && m_conditional_states.back(),
- BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "else without matching if" ) );
-
- m_inactive_ifdef_level = m_conditional_states.size() == m_inactive_ifdef_level ? 0 : m_conditional_states.size();
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( line.is_empty(), BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "unexpected tokens at the end of else command" ) );
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::Impl::process_endif( cstring line )
-{
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( m_conditional_states.size() > 0, BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "endif without matching if" ) );
-
- if( m_conditional_states.size() == m_inactive_ifdef_level )
- m_inactive_ifdef_level = 0;
-
- m_conditional_states.pop_back();
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( line.is_empty(), BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "unexpected tokens at the end of endif command" ) );
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::Impl::substitute_macros( cstring& where )
-{
- m_post_subst_line.clear();
- cstring::size_type pos;
-
- while( (pos = where.find( m_macro_ref_begin )) != cstring::npos ) {
- m_post_subst_line.append( where.begin(), pos );
-
- where.trim_left( where.begin() + pos + m_macro_ref_begin.size() );
-
- pos = where.find( m_macro_ref_end );
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( pos != cstring::npos, BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( "incomplete macro reference" ) );
-
- cstring value = *get_macro_value( where.substr( 0, pos ), false );
- m_post_subst_line.append( value.begin(), value.size() );
-
- where.trim_left( where.begin() + pos + m_macro_ref_end.size() );
- }
-
- if( !m_post_subst_line.empty() ) {
- m_post_subst_line.append( where.begin(), where.size() );
- where = m_post_subst_line;
- }
-}
-
-//____________________________________________________________________________//
-
-// ************************************************************************** //
-// ************** runtime::file::config_file_iterator ************** //
-// ************************************************************************** //
-
-void
-config_file_iterator::construct()
-{
- m_pimpl.reset( new Impl );
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::load( cstring file_name )
-{
- m_pimpl->m_curr_level.reset( new include_level( file_name, m_pimpl->m_path_separators ) );
- m_pimpl->m_buffer.reset( new char[m_pimpl->m_buffer_size] );
-
- register_command_handler( m_pimpl->m_include_kw, boost::bind( &Impl::process_include, m_pimpl.get(), _1 ) );
- register_command_handler( m_pimpl->m_define_kw, boost::bind( &Impl::process_define, m_pimpl.get(), _1 ) );
- register_command_handler( m_pimpl->m_undef_kw, boost::bind( &Impl::process_undef, m_pimpl.get(), _1 ) );
- register_command_handler( m_pimpl->m_ifdef_kw, boost::bind( &Impl::process_ifdef, m_pimpl.get(), _1 ) );
- register_command_handler( m_pimpl->m_ifndef_kw, boost::bind( &Impl::process_ifndef, m_pimpl.get(), _1 ) );
- register_command_handler( m_pimpl->m_else_kw, boost::bind( &Impl::process_else, m_pimpl.get(), _1 ) );
- register_command_handler( m_pimpl->m_endif_kw, boost::bind( &Impl::process_endif, m_pimpl.get(), _1 ) );
-
- init();
-}
-
-//____________________________________________________________________________//
-
-location const&
-config_file_iterator::curr_location()
-{
- return m_pimpl->m_curr_level->m_curr_location;
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::register_command_handler( cstring command_kw, command_handler const& ch )
-{
- m_pimpl->m_command_handler_map.add( command_kw, ch );
-}
-
-//____________________________________________________________________________//
-
-bool
-config_file_iterator::get()
-{
- return m_pimpl->get_next_line( m_value );
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::set_parameter( rtti::id_t id, cstring value )
-{
- BOOST_RTTI_SWITCH( id ) {
- BOOST_RTTI_CASE( cfg_detail::path_separators_t )
- assign_op( m_pimpl->m_path_separators , value, 0 );
- BOOST_RTTI_CASE( cfg_detail::sl_comment_delimeter_t )
- assign_op( m_pimpl->m_sl_comment_delimeter , value, 0 );
- BOOST_RTTI_CASE( cfg_detail::command_delimeter_t )
- assign_op( m_pimpl->m_command_delimeter , value, 0 );
- BOOST_RTTI_CASE( cfg_detail::line_beak_t )
- assign_op( m_pimpl->m_line_beak , value, 0 );
- BOOST_RTTI_CASE( cfg_detail::macro_ref_begin_t )
- assign_op( m_pimpl->m_macro_ref_begin , value, 0 );
- BOOST_RTTI_CASE( cfg_detail::macro_ref_end_t )
- assign_op( m_pimpl->m_macro_ref_end , value, 0 );
- BOOST_RTTI_CASE( cfg_detail::include_kw_t )
- assign_op( m_pimpl->m_include_kw , value, 0 );
- BOOST_RTTI_CASE( cfg_detail::define_kw_t )
- assign_op( m_pimpl->m_define_kw , value, 0 );
- BOOST_RTTI_CASE( cfg_detail::undef_kw_t )
- assign_op( m_pimpl->m_undef_kw , value, 0 );
- BOOST_RTTI_CASE( cfg_detail::ifdef_kw_t )
- assign_op( m_pimpl->m_ifdef_kw , value, 0 );
- BOOST_RTTI_CASE( cfg_detail::ifndef_kw_t )
- assign_op( m_pimpl->m_ifndef_kw , value, 0 );
- BOOST_RTTI_CASE( cfg_detail::else_kw_t )
- assign_op( m_pimpl->m_else_kw , value, 0 );
- BOOST_RTTI_CASE( cfg_detail::endif_kw_t )
- assign_op( m_pimpl->m_endif_kw , value, 0 );
- }
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::set_parameter( rtti::id_t id, bool value )
-{
- BOOST_RTTI_SWITCH( id ) {
- BOOST_RTTI_CASE( cfg_detail::trim_leading_spaces_t )
- m_pimpl->m_trim_leading_spaces = value;
- BOOST_RTTI_CASE( cfg_detail::trim_trailing_spaces_t )
- m_pimpl->m_trim_trailing_spaces = value;
- BOOST_RTTI_CASE( cfg_detail::skip_empty_lines_t )
- m_pimpl->m_skip_empty_lines = value;
- BOOST_RTTI_CASE( cfg_detail::detect_missing_macro_t )
- m_pimpl->m_detect_missing_macro = value;
- }
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::set_parameter( rtti::id_t id, char_type value )
-{
- BOOST_RTTI_SWITCH( id ) {
- BOOST_RTTI_CASE( cfg_detail::line_delimeter_t )
- m_pimpl->m_line_delimeter = value;
- }
-}
-
-//____________________________________________________________________________//
-
-void
-config_file_iterator::set_parameter( rtti::id_t id, std::size_t value )
-{
- BOOST_RTTI_SWITCH( id ) {
- BOOST_RTTI_CASE( cfg_detail::buffer_size_t )
- m_pimpl->m_buffer_size = value;
- }
-}
-
-//____________________________________________________________________________//
-
-} // namespace file
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-// EOF
diff --git a/boost/test/utils/runtime/file/config_file_iterator.hpp b/boost/test/utils/runtime/file/config_file_iterator.hpp
deleted file mode 100644
index 6c6273fca1..0000000000
--- a/boost/test/utils/runtime/file/config_file_iterator.hpp
+++ /dev/null
@@ -1,166 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// 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$
-//
-// Description : flexible configuration file iterator definition
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_FILE_CONFIG_FILE_ITERATOR_HPP
-#define BOOST_TEST_UTILS_RUNTIME_FILE_CONFIG_FILE_ITERATOR_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#include <boost/test/utils/runtime/fwd.hpp>
-
-// Boost.Test
-#include <boost/test/utils/iterator/input_iterator_facade.hpp>
-#include <boost/test/utils/named_params.hpp>
-
-// Boost
-#include <boost/shared_ptr.hpp>
-#include <boost/function.hpp>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-namespace file {
-
-// Public typedef
-typedef std::pair<dstring,long> location;
-
-// ************************************************************************** //
-// ************** modifiers ************** //
-// ************************************************************************** //
-
-namespace cfg_detail {
- struct path_separators_t;
- struct line_delimeter_t;
- struct sl_comment_delimeter_t;
- struct command_delimeter_t;
- struct line_beak_t;
- struct macro_ref_begin_t;
- struct macro_ref_end_t;
- struct include_kw_t;
- struct define_kw_t;
- struct undef_kw_t;
- struct ifdef_kw_t;
- struct ifndef_kw_t;
- struct else_kw_t;
- struct endif_kw_t;
-
- struct buffer_size_t;
-
- struct trim_leading_spaces_t;
- struct trim_trailing_spaces_t;
- struct skip_empty_lines_t;
- struct detect_missing_macro_t;
-} // namespace cfg_detail
-
-namespace {
-
-nfp::typed_keyword<cstring,cfg_detail::path_separators_t> path_separators;
-nfp::typed_keyword<char_type ,cfg_detail::line_delimeter_t> line_delimeter;
-nfp::typed_keyword<cstring,cfg_detail::sl_comment_delimeter_t> single_line_comment_delimeter;
-nfp::typed_keyword<cstring,cfg_detail::command_delimeter_t> command_delimeter;
-nfp::typed_keyword<cstring,cfg_detail::line_beak_t> line_beak;
-nfp::typed_keyword<cstring,cfg_detail::macro_ref_begin_t> macro_ref_begin;
-nfp::typed_keyword<cstring,cfg_detail::macro_ref_end_t> macro_ref_end;
-nfp::typed_keyword<cstring,cfg_detail::include_kw_t> include_kw;
-nfp::typed_keyword<cstring,cfg_detail::define_kw_t> define_kw;
-nfp::typed_keyword<cstring,cfg_detail::undef_kw_t> undef_kw;
-nfp::typed_keyword<cstring,cfg_detail::ifdef_kw_t> ifdef_kw;
-nfp::typed_keyword<cstring,cfg_detail::ifndef_kw_t> ifndef_kw;
-nfp::typed_keyword<cstring,cfg_detail::else_kw_t> else_kw;
-nfp::typed_keyword<cstring,cfg_detail::endif_kw_t> endif_kw;
-
-nfp::typed_keyword<std::size_t,cfg_detail::buffer_size_t> buffer_size;
-
-nfp::typed_keyword<bool,cfg_detail::trim_leading_spaces_t> trim_leading_spaces;
-nfp::typed_keyword<bool,cfg_detail::trim_trailing_spaces_t> trim_trailing_spaces;
-nfp::typed_keyword<bool,cfg_detail::skip_empty_lines_t> skip_empty_lines;
-nfp::typed_keyword<bool,cfg_detail::detect_missing_macro_t> detect_missing_macro;
-
-} // local namespace
-
-// ************************************************************************** //
-// ************** runtime::file::config_file_iterator ************** //
-// ************************************************************************** //
-
-class config_file_iterator : public unit_test::input_iterator_facade<config_file_iterator,cstring,cstring> {
- typedef unit_test::input_iterator_facade<config_file_iterator,cstring,cstring> base;
-public:
- // Public typedefs
- typedef boost::function<void (cstring)> command_handler;
-
- // Constructors
- config_file_iterator() {}
- explicit config_file_iterator( cstring file_name )
- {
- construct();
- load( file_name );
- }
- template<typename Modifiers>
- config_file_iterator( cstring file_name, Modifiers const& m )
- {
- construct();
- m.apply_to( *this );
- load( file_name );
- }
- config_file_iterator( config_file_iterator const& rhs )
- : base( rhs )
- , m_pimpl( rhs.m_pimpl )
- {
- rhs.m_valid = false;
- }
-
- void operator=( config_file_iterator const& rhs )
- {
- if( this == &rhs )
- return;
-
- (base&)(*this) = rhs;
- m_pimpl = rhs.m_pimpl;
- rhs.m_valid = false;
- } // Assignment
-
-
- // Access methods
- location const& curr_location();
- void register_command_handler( cstring command_kw, command_handler const& );
-
- // Parameters setters
- void set_parameter( rtti::id_t, cstring );
- void set_parameter( rtti::id_t, bool );
- void set_parameter( rtti::id_t, char_type );
- void set_parameter( rtti::id_t, std::size_t );
-
-private:
- friend class unit_test::input_iterator_core_access;
-
- void construct();
- void load( cstring file_name );
-
- // increment implementation
- bool get();
-
- // Data members
- struct Impl;
- shared_ptr<Impl> m_pimpl;
-};
-
-} // namespace file
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_FILE_CONFIG_FILE_ITERATOR_HPP
diff --git a/boost/test/utils/runtime/finalize.hpp b/boost/test/utils/runtime/finalize.hpp
new file mode 100644
index 0000000000..181428550c
--- /dev/null
+++ b/boost/test/utils/runtime/finalize.hpp
@@ -0,0 +1,56 @@
+// (C) Copyright Gennadiy Rozental 2001.
+// Distributed under 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$
+//
+// Description : runtime parameters initialization final step
+// ***************************************************************************
+
+#ifndef BOOST_TEST_UTILS_RUNTIME_FINALIZE_HPP
+#define BOOST_TEST_UTILS_RUNTIME_FINALIZE_HPP
+
+// Boost.Test Runtime parameters
+#include <boost/test/utils/runtime/parameter.hpp>
+#include <boost/test/utils/runtime/argument.hpp>
+
+// Boost.Test
+#include <boost/test/utils/foreach.hpp>
+
+#include <boost/test/detail/suppress_warnings.hpp>
+
+namespace boost {
+namespace runtime {
+
+inline void
+finalize_arguments( parameters_store const& params, runtime::arguments_store& args )
+{
+ BOOST_TEST_FOREACH( parameters_store::storage_type::value_type const&, v, params.all() ) {
+ basic_param_ptr param = v.second;
+
+ if( !args.has( param->p_name ) ) {
+ if( param->p_has_default_value )
+ param->produce_default( args );
+
+ if( !args.has( param->p_name ) ) {
+ BOOST_TEST_I_ASSRT( param->p_optional,
+ missing_req_arg( param->p_name ) << "Missing argument for required parameter " << param->p_name << "." );
+ }
+ }
+
+ if( args.has( param->p_name ) && !!param->p_callback )
+ param->p_callback( param->p_name );
+ }
+}
+
+} // namespace runtime
+} // namespace boost
+
+#include <boost/test/detail/enable_warnings.hpp>
+
+#endif // BOOST_TEST_UTILS_RUNTIME_FINALIZE_HPP
diff --git a/boost/test/utils/runtime/fwd.hpp b/boost/test/utils/runtime/fwd.hpp
index 2647184c5d..17ae881222 100644
--- a/boost/test/utils/runtime/fwd.hpp
+++ b/boost/test/utils/runtime/fwd.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under 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)
@@ -9,33 +9,37 @@
//
// Version : $Revision$
//
-// Description : global framework level forward declaration
+// Description : runtime parameters forward declaration
// ***************************************************************************
#ifndef BOOST_TEST_UTILS_RUNTIME_FWD_HPP
#define BOOST_TEST_UTILS_RUNTIME_FWD_HPP
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
+// Boost.Test
+#include <boost/test/detail/config.hpp>
+#include <boost/test/utils/basic_cstring/basic_cstring.hpp>
+#include <boost/test/utils/basic_cstring/io.hpp> // operator<<(boost::runtime::cstring)
// Boost
#include <boost/shared_ptr.hpp>
-namespace boost {
+// STL
+#include <map>
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
+namespace boost {
+namespace runtime {
-class parameter;
+typedef unit_test::const_string cstring;
class argument;
typedef shared_ptr<argument> argument_ptr;
-typedef shared_ptr<argument const> const_argument_ptr;
-template<typename T> class value_interpreter;
template<typename T> class typed_argument;
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
+class basic_param;
+typedef shared_ptr<basic_param> basic_param_ptr;
+} // namespace runtime
} // namespace boost
#endif // BOOST_TEST_UTILS_RUNTIME_FWD_HPP
diff --git a/boost/test/utils/runtime/interpret_argument_value.hpp b/boost/test/utils/runtime/interpret_argument_value.hpp
deleted file mode 100644
index 016caa017f..0000000000
--- a/boost/test/utils/runtime/interpret_argument_value.hpp
+++ /dev/null
@@ -1,163 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Distributed under 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$
-//
-// Description : default algorithms for string to specific type convertions
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_INTERPRET_ARGUMENT_VALUE_HPP
-#define BOOST_TEST_UTILS_RUNTIME_INTERPRET_ARGUMENT_VALUE_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-#include <boost/test/utils/runtime/trace.hpp>
-
-// Boost.Test
-#include <boost/test/utils/basic_cstring/io.hpp>
-#include <boost/test/utils/basic_cstring/compare.hpp>
-
-// Boost
-#include <boost/optional.hpp>
-#include <boost/lexical_cast.hpp>
-
-// STL
-// !! could we eliminate these includes?
-#include <list>
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-// ************************************************************************** //
-// ************** runtime::interpret_argument_value ************** //
-// ************************************************************************** //
-// returns true if source is used false otherwise
-
-// generic case
-template<typename T>
-struct interpret_argument_value_impl {
- static bool _( cstring source, boost::optional<T>& res )
- {
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "In interpret_argument_value_impl<" << typeid(T).name() << ">" );
-
- res = lexical_cast<T>( source );
-
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "String " << source << " is interpreted as " << *res );
- return true;
- }
-};
-
-
-//____________________________________________________________________________//
-
-// dstring case
-template<>
-struct interpret_argument_value_impl<dstring> {
- static bool _( cstring source, boost::optional<dstring>& res )
- {
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "In interpret_argument_value_impl<dstring>" );
-
- res = dstring();
- assign_op( *res, source, 0 );
-
- return true;
- }
-};
-
-//____________________________________________________________________________//
-
-// cstring case
-template<>
-struct interpret_argument_value_impl<cstring> {
- static bool _( cstring source, boost::optional<cstring>& res )
- {
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "In interpret_argument_value_impl<cstring>" );
-
- res = source;
-
- return true;
- }
-};
-
-//____________________________________________________________________________//
-
-// specialization for type bool
-template<>
-struct interpret_argument_value_impl<bool> {
- static bool _( cstring source, boost::optional<bool>& res )
- {
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "In interpret_argument_value_impl<bool>" );
-
- static literal_cstring YES( BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "YES" ) );
- static literal_cstring Y( BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "Y" ) );
- static literal_cstring NO( BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "NO" ) );
- static literal_cstring N( BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "N" ) );
- static literal_cstring one( BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "1" ) );
- static literal_cstring zero( BOOST_TEST_UTILS_RUNTIME_PARAM_CSTRING_LITERAL( "0" ) );
-
- source.trim();
-
- if( case_ins_eq( source, YES ) || case_ins_eq( source, Y ) || case_ins_eq( source, one ) ) {
- res = true;
- return true;
- }
- else if( case_ins_eq( source, NO ) || case_ins_eq( source, N ) || case_ins_eq( source, zero ) ) {
- res = false;
- return true;
- }
- else {
- res = true;
- return source.is_empty();
- }
- }
-};
-
-//____________________________________________________________________________//
-
-template<typename T>
-inline bool
-interpret_argument_value( cstring source, boost::optional<T>& res, long )
-{
- return interpret_argument_value_impl<T>::_( source, res );
-}
-
-//____________________________________________________________________________//
-
-// specialization for list of values
-template<typename T>
-inline bool
-interpret_argument_value( cstring source, boost::optional<std::list<T> >& res, int )
-{
- BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( "In interpret_argument_value<std::list<T>>" );
-
- res = std::list<T>();
-
- while( !source.is_empty() ) {
- // !! should we use token_iterator
- cstring::iterator single_value_end = std::find( source.begin(), source.end(), BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( ',' ) );
-
- boost::optional<T> value;
- interpret_argument_value( cstring( source.begin(), single_value_end ), value, 0 );
-
- res->push_back( *value );
-
- source.trim_left( single_value_end + 1 );
- }
-
- return true;
-}
-
-//____________________________________________________________________________//
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_INTERPRET_ARGUMENT_VALUE_HPP
diff --git a/boost/test/utils/runtime/modifier.hpp b/boost/test/utils/runtime/modifier.hpp
new file mode 100644
index 0000000000..ed77ca0afe
--- /dev/null
+++ b/boost/test/utils/runtime/modifier.hpp
@@ -0,0 +1,101 @@
+// (C) Copyright Gennadiy Rozental 2001.
+// 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$
+//
+// Description : parameter modifiers
+// ***************************************************************************
+
+#ifndef BOOST_TEST_UTILS_RUNTIME_MODIFIER_HPP
+#define BOOST_TEST_UTILS_RUNTIME_MODIFIER_HPP
+
+// Boost.Test Runtime parameters
+#include <boost/test/utils/runtime/fwd.hpp>
+
+// Boost.Test
+#include <boost/test/utils/named_params.hpp>
+
+#include <boost/test/detail/suppress_warnings.hpp>
+
+namespace boost {
+namespace runtime {
+
+// ************************************************************************** //
+// ************** environment variable modifiers ************** //
+// ************************************************************************** //
+
+namespace {
+
+#if !defined(BOOST_NO_CXX11_AUTO_DECLARATIONS) && !defined(BOOST_NO_CXX11_TEMPLATE_ALIASES)
+#define BOOST_TEST_CLA_NEW_API
+#endif
+
+#ifdef BOOST_TEST_CLA_NEW_API
+auto const& description = unit_test::static_constant<nfp::typed_keyword<cstring,struct description_t>>::value;
+auto const& help = unit_test::static_constant<nfp::typed_keyword<cstring,struct help_t>>::value;
+auto const& env_var = unit_test::static_constant<nfp::typed_keyword<cstring,struct env_var_t>>::value;
+auto const& end_of_params = unit_test::static_constant<nfp::typed_keyword<cstring,struct end_of_params_t>>::value;
+auto const& negation_prefix = unit_test::static_constant<nfp::typed_keyword<cstring,struct neg_prefix_t>>::value;
+auto const& value_hint = unit_test::static_constant<nfp::typed_keyword<cstring,struct value_hint_t>>::value;
+auto const& optional_value = unit_test::static_constant<nfp::keyword<struct optional_value_t>>::value;
+auto const& default_value = unit_test::static_constant<nfp::keyword<struct default_value_t>>::value;
+auto const& callback = unit_test::static_constant<nfp::keyword<struct callback_t>>::value;
+
+template<typename EnumType>
+using enum_values = unit_test::static_constant<
+ nfp::typed_keyword<std::initializer_list<std::pair<const cstring,EnumType>>, struct enum_values_t>
+>;
+
+#else
+
+nfp::typed_keyword<cstring,struct description_t> description;
+nfp::typed_keyword<cstring,struct help_t> help;
+nfp::typed_keyword<cstring,struct env_var_t> env_var;
+nfp::typed_keyword<cstring,struct end_of_params_t> end_of_params;
+nfp::typed_keyword<cstring,struct neg_prefix_t> negation_prefix;
+nfp::typed_keyword<cstring,struct value_hint_t> value_hint;
+nfp::keyword<struct optional_value_t> optional_value;
+nfp::keyword<struct default_value_t> default_value;
+nfp::keyword<struct callback_t> callback;
+
+template<typename EnumType>
+struct enum_values_list {
+ typedef std::pair<cstring,EnumType> ElemT;
+ typedef std::vector<ElemT> ValuesT;
+
+ enum_values_list const&
+ operator()( cstring k, EnumType v ) const
+ {
+ const_cast<enum_values_list*>(this)->m_values.push_back( ElemT( k, v ) );
+
+ return *this;
+ }
+
+ operator ValuesT const&() const { return m_values; }
+
+private:
+ ValuesT m_values;
+};
+
+template<typename EnumType>
+struct enum_values : unit_test::static_constant<
+ nfp::typed_keyword<enum_values_list<EnumType>, struct enum_values_t> >
+{
+};
+
+#endif
+
+} // local namespace
+
+} // namespace runtime
+} // namespace boost
+
+#include <boost/test/detail/enable_warnings.hpp>
+
+#endif // BOOST_TEST_UTILS_RUNTIME_MODIFIER_HPP
diff --git a/boost/test/utils/runtime/parameter.hpp b/boost/test/utils/runtime/parameter.hpp
index 2dd4ba725c..c198688493 100644
--- a/boost/test/utils/runtime/parameter.hpp
+++ b/boost/test/utils/runtime/parameter.hpp
@@ -1,4 +1,4 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
+// (C) Copyright Gennadiy Rozental 2001.
// Distributed under 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)
@@ -9,30 +9,464 @@
//
// Version : $Revision$
//
-// Description : abstract interface for the formal parameter
+// Description : formal parameter definition
// ***************************************************************************
#ifndef BOOST_TEST_UTILS_RUNTIME_PARAMETER_HPP
#define BOOST_TEST_UTILS_RUNTIME_PARAMETER_HPP
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
+// Boost.Test Runtime parameters
+#include <boost/test/utils/runtime/fwd.hpp>
+#include <boost/test/utils/runtime/modifier.hpp>
+#include <boost/test/utils/runtime/argument.hpp>
+#include <boost/test/utils/runtime/argument_factory.hpp>
+
+// Boost.Test
+#include <boost/test/utils/class_properties.hpp>
+#include <boost/test/utils/foreach.hpp>
+
+// Boost
+#include <boost/function/function2.hpp>
+#include <boost/algorithm/cxx11/all_of.hpp>
+
+// STL
+#include <algorithm>
+
+#include <boost/test/detail/suppress_warnings.hpp>
namespace boost {
+namespace runtime {
+
+// ************************************************************************** //
+// ************** runtime::parameter_cla_id ************** //
+// ************************************************************************** //
+// set of attributes identifying the parameter in the command line
+
+struct parameter_cla_id {
+ parameter_cla_id( cstring prefix, cstring tag, cstring value_separator, bool negatable )
+ : m_prefix( prefix.begin(), prefix.size() )
+ , m_tag( tag.begin(), tag.size() )
+ , m_value_separator( value_separator.begin(), value_separator.size() )
+ , m_negatable( negatable )
+ {
+
+ BOOST_TEST_I_ASSRT( algorithm::all_of( m_prefix.begin(), m_prefix.end(), valid_prefix_char ),
+ invalid_cla_id() << "Parameter " << m_tag
+ << " has invalid characters in prefix." );
+
+ BOOST_TEST_I_ASSRT( algorithm::all_of( m_tag.begin(), m_tag.end(), valid_name_char ),
+ invalid_cla_id() << "Parameter " << m_tag
+ << " has invalid characters in name." );
+
+ BOOST_TEST_I_ASSRT( algorithm::all_of( m_value_separator.begin(), m_value_separator.end(), valid_separator_char ),
+ invalid_cla_id() << "Parameter " << m_tag
+ << " has invalid characters in value separator." );
+ }
+
+ static bool valid_prefix_char( char c )
+ {
+ return c == '-' || c == '/' ;
+ }
+ static bool valid_separator_char( char c )
+ {
+ return c == '=' || c == ':' || c == ' ' || c == '\0';
+ }
+ static bool valid_name_char( char c )
+ {
+ return std::isalnum( c ) || c == '+' || c == '_' || c == '?';
+ }
+
+ std::string m_prefix;
+ std::string m_tag;
+ std::string m_value_separator;
+ bool m_negatable;
+};
+
+typedef std::vector<parameter_cla_id> param_cla_ids;
+
+// ************************************************************************** //
+// ************** runtime::basic_param ************** //
+// ************************************************************************** //
+
+cstring const help_prefix("////");
+
+class basic_param {
+ typedef function<void (cstring)> callback_type;
+ typedef unit_test::readwrite_property<bool> bool_property;
+
+protected:
+ /// Constructor with modifiers
+ template<typename Modifiers>
+ basic_param( cstring name, bool is_optional, bool is_repeatable, Modifiers const& m )
+ : p_name( name.begin(), name.end() )
+ , p_description( nfp::opt_get( m, description, std::string() ) )
+ , p_help( nfp::opt_get( m, runtime::help, std::string() ) )
+ , p_env_var( nfp::opt_get( m, env_var, std::string() ) )
+ , p_value_hint( nfp::opt_get( m, value_hint, std::string() ) )
+ , p_optional( is_optional )
+ , p_repeatable( is_repeatable )
+ , p_has_optional_value( m.has( optional_value ) )
+ , p_has_default_value( m.has( default_value ) || is_repeatable )
+ , p_callback( nfp::opt_get( m, callback, callback_type() ) )
+ {
+ add_cla_id( help_prefix, name, ":" );
+ }
+
+public:
+ virtual ~basic_param() {}
+
+ // Pubic properties
+ std::string const p_name;
+ std::string const p_description;
+ std::string const p_help;
+ std::string const p_env_var;
+ std::string const p_value_hint;
+ bool const p_optional;
+ bool const p_repeatable;
+ bool_property p_has_optional_value;
+ bool_property p_has_default_value;
+ callback_type const p_callback;
+
+ /// interface for cloning typed parameters
+ virtual basic_param_ptr clone() const = 0;
+
+ /// Access methods
+ param_cla_ids const& cla_ids() const { return m_cla_ids; }
+ void add_cla_id( cstring prefix, cstring tag, cstring value_separator )
+ {
+ add_cla_id_impl( prefix, tag, value_separator, false, true );
+ }
+
+ /// interface for producing argument values for this parameter
+ virtual void produce_argument( cstring token, bool negative_form, arguments_store& store ) const = 0;
+ virtual void produce_default( arguments_store& store ) const = 0;
+
+ /// interfaces for help message reporting
+ virtual void usage( std::ostream& ostr, cstring negation_prefix_ )
+ {
+ ostr << "Parameter: " << p_name << '\n';
+ if( !p_description.empty() )
+ ostr << ' ' << p_description << '\n';
+
+ ostr << " Command line formats:\n";
+ BOOST_TEST_FOREACH( parameter_cla_id const&, id, cla_ids() ) {
+ if( id.m_prefix == help_prefix )
+ continue;
+
+ ostr << " " << id.m_prefix;
+ if( id.m_negatable )
+ cla_name_help( ostr, id.m_tag, negation_prefix_ );
+ else
+ cla_name_help( ostr, id.m_tag, "" );
+
+ bool optional_value_ = false;
+
+ if( p_has_optional_value ) {
+ optional_value_ = true;
+ ostr << '[';
+ }
+
+ if( id.m_value_separator.empty() )
+ ostr << ' ';
+ else {
+ ostr << id.m_value_separator;
+ }
+
+ value_help( ostr );
+
+ if( optional_value_ )
+ ostr << ']';
+
+ ostr << '\n';
+ }
+ if( !p_env_var.empty() )
+ ostr << " Environment variable: " << p_env_var << '\n';
+ }
+
+ virtual void help( std::ostream& ostr, cstring negation_prefix_ )
+ {
+ usage( ostr, negation_prefix_ );
+
+ if( !p_help.empty() )
+ ostr << '\n' << p_help << '\n';
+ }
+
+protected:
+ void add_cla_id_impl( cstring prefix,
+ cstring tag,
+ cstring value_separator,
+ bool negatable,
+ bool validate_value_separator )
+ {
+ BOOST_TEST_I_ASSRT( !tag.is_empty(),
+ invalid_cla_id() << "Parameter can't have an empty name." );
+
+ BOOST_TEST_I_ASSRT( !prefix.is_empty(),
+ invalid_cla_id() << "Parameter " << tag
+ << " can't have an empty prefix." );
+
+ BOOST_TEST_I_ASSRT( !value_separator.is_empty(),
+ invalid_cla_id() << "Parameter " << tag
+ << " can't have an empty value separator." );
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
+ // We trim value separator from all the spaces, so token end will indicate separator
+ value_separator.trim();
+ BOOST_TEST_I_ASSRT( !validate_value_separator || !value_separator.is_empty() || !p_has_optional_value,
+ invalid_cla_id() << "Parameter " << tag
+ << " with optional value attribute can't use space as value separator." );
+
+ m_cla_ids.push_back( parameter_cla_id( prefix, tag, value_separator, negatable ) );
+ }
+
+private:
+ /// interface for usage/help customization
+ virtual void cla_name_help( std::ostream& ostr, cstring cla_tag, cstring negation_prefix_ ) const
+ {
+ ostr << cla_tag;
+ }
+ virtual void value_help( std::ostream& ostr ) const
+ {
+ if( p_value_hint.empty() )
+ ostr << "<value>";
+ else
+ ostr << p_value_hint;
+ }
+
+ // Data members
+ param_cla_ids m_cla_ids;
+};
// ************************************************************************** //
// ************** runtime::parameter ************** //
// ************************************************************************** //
-class parameter {
+enum args_amount {
+ OPTIONAL_PARAM, // 0-1
+ REQUIRED_PARAM, // exactly 1
+ REPEATABLE_PARAM // 0-N
+};
+
+//____________________________________________________________________________//
+
+template<typename ValueType, args_amount a = runtime::OPTIONAL_PARAM, bool is_enum = false>
+class parameter : public basic_param {
public:
- virtual ~parameter() {}
+ /// Constructor with modifiers
+#ifndef BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+ template<typename Modifiers=nfp::no_params_type>
+ parameter( cstring name, Modifiers const& m = nfp::no_params )
+#else
+ template<typename Modifiers>
+ parameter( cstring name, Modifiers const& m )
+#endif
+ : basic_param( name, a != runtime::REQUIRED_PARAM, a == runtime::REPEATABLE_PARAM, m )
+ , m_arg_factory( m )
+ {
+ BOOST_TEST_I_ASSRT( !m.has( default_value ) || a == runtime::OPTIONAL_PARAM,
+ invalid_param_spec() << "Parameter " << name
+ << " is not optional and can't have default_value." );
+
+ BOOST_TEST_I_ASSRT( !m.has( optional_value ) || !this->p_repeatable,
+ invalid_param_spec() << "Parameter " << name
+ << " is repeatable and can't have optional_value." );
+ }
+
+private:
+ virtual basic_param_ptr clone() const
+ {
+ return basic_param_ptr( new parameter( *this ) );
+ }
+ virtual void produce_argument( cstring token, bool , arguments_store& store ) const
+ {
+ m_arg_factory.produce_argument( token, this->p_name, store );
+ }
+ virtual void produce_default( arguments_store& store ) const
+ {
+ if( !this->p_has_default_value )
+ return;
+
+ m_arg_factory.produce_default( this->p_name, store );
+ }
+
+ // Data members
+ typedef argument_factory<ValueType, is_enum, a == runtime::REPEATABLE_PARAM> factory_t;
+ factory_t m_arg_factory;
+};
+
+//____________________________________________________________________________//
+
+class option : public basic_param {
+public:
+ /// Constructor with modifiers
+#ifndef BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+ template<typename Modifiers=nfp::no_params_type>
+ option( cstring name, Modifiers const& m = nfp::no_params )
+#else
+ template<typename Modifiers>
+ option( cstring name, Modifiers const& m )
+#endif
+ : basic_param( name, true, false, nfp::opt_append( nfp::opt_append( m, optional_value = true), default_value = false) )
+ , m_arg_factory( nfp::opt_append( nfp::opt_append( m, optional_value = true), default_value = false) )
+ {
+ }
+
+ void add_cla_id( cstring prefix, cstring tag, cstring value_separator, bool negatable = false )
+ {
+ add_cla_id_impl( prefix, tag, value_separator, negatable, false );
+ }
+
+private:
+ virtual basic_param_ptr clone() const
+ {
+ return basic_param_ptr( new option( *this ) );
+ }
+
+ virtual void produce_argument( cstring token, bool negative_form, arguments_store& store ) const
+ {
+ if( token.empty() )
+ store.set( p_name, !negative_form );
+ else {
+ BOOST_TEST_I_ASSRT( !negative_form,
+ format_error( p_name ) << "Can't set value to negative form of the argument." );
+
+ m_arg_factory.produce_argument( token, p_name, store );
+ }
+ }
+
+ virtual void produce_default( arguments_store& store ) const
+ {
+ m_arg_factory.produce_default( p_name, store );
+ }
+ virtual void cla_name_help( std::ostream& ostr, cstring cla_tag, cstring negation_prefix_ ) const
+ {
+ if( negation_prefix_.is_empty() )
+ ostr << cla_tag;
+ else
+ ostr << '[' << negation_prefix_ << ']' << cla_tag;
+ }
+ virtual void value_help( std::ostream& ostr ) const
+ {
+ if( p_value_hint.empty() )
+ ostr << "<boolean value>";
+ else
+ ostr << p_value_hint;
+ }
+
+ // Data members
+ typedef argument_factory<bool, false, false> factory_t;
+ factory_t m_arg_factory;
};
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
+//____________________________________________________________________________//
+template<typename EnumType, args_amount a = runtime::OPTIONAL_PARAM>
+class enum_parameter : public parameter<EnumType, a, true> {
+ typedef parameter<EnumType, a, true> base;
+public:
+ /// Constructor with modifiers
+#ifndef BOOST_NO_CXX11_FUNCTION_TEMPLATE_DEFAULT_ARGS
+ template<typename Modifiers=nfp::no_params_type>
+ enum_parameter( cstring name, Modifiers const& m = nfp::no_params )
+#else
+ template<typename Modifiers>
+ enum_parameter( cstring name, Modifiers const& m )
+#endif
+ : base( name, m )
+ {
+#ifdef BOOST_TEST_CLA_NEW_API
+ auto const& values = m[enum_values<EnumType>::value];
+ auto it = values.begin();
+#else
+ std::vector<std::pair<cstring, EnumType> > const& values = m[enum_values<EnumType>::value];
+ typename std::vector<std::pair<cstring, EnumType> >::const_iterator it = values.begin();
+#endif
+ while( it != values.end() ) {
+ m_valid_names.push_back( it->first );
+ ++it;
+ }
+ }
+
+private:
+ virtual basic_param_ptr clone() const
+ {
+ return basic_param_ptr( new enum_parameter( *this ) );
+ }
+
+ virtual void value_help( std::ostream& ostr ) const
+ {
+ if( this->p_value_hint.empty() ) {
+ ostr << "<";
+ bool first = true;
+ BOOST_TEST_FOREACH( cstring, name, m_valid_names ) {
+ if( first )
+ first = false;
+ else
+ ostr << '|';
+ ostr << name;
+ }
+ ostr << ">";
+ }
+ else
+ ostr << this->p_value_hint;
+ }
+
+ // Data members
+ std::vector<cstring> m_valid_names;
+};
+
+
+// ************************************************************************** //
+// ************** runtime::parameters_store ************** //
+// ************************************************************************** //
+
+class parameters_store {
+ struct lg_compare {
+ bool operator()( cstring lh, cstring rh ) const
+ {
+ return std::lexicographical_compare(lh.begin(), lh.end(),
+ rh.begin(), rh.end());
+ }
+ };
+public:
+
+ typedef std::map<cstring, basic_param_ptr, lg_compare> storage_type;
+
+ /// Adds parameter into the persistent store
+ void add( basic_param const& in )
+ {
+ basic_param_ptr p = in.clone();
+
+ BOOST_TEST_I_ASSRT( m_parameters.insert( std::make_pair( cstring(p->p_name), p ) ).second,
+ duplicate_param() << "Parameter " << p->p_name << " is duplicate." );
+ }
+
+ /// Returns true if there is no parameters registered
+ bool is_empty() const { return m_parameters.empty(); }
+ /// Returns map of all the registered parameter
+ storage_type const& all() const { return m_parameters; }
+ /// Returns true if parameter with psecified name is registered
+ bool has( cstring name ) const
+ {
+ return m_parameters.find( name ) != m_parameters.end();
+ }
+ /// Returns map of all the registered parameter
+ basic_param_ptr get( cstring name ) const
+ {
+ storage_type::const_iterator const& found = m_parameters.find( name );
+ BOOST_TEST_I_ASSRT( found != m_parameters.end(),
+ unknown_param() << "Parameter " << name << " is unknown." );
+
+ return found->second;
+ }
+
+private:
+ // Data members
+ storage_type m_parameters;
+};
+
+} // namespace runtime
} // namespace boost
+#include <boost/test/detail/enable_warnings.hpp>
+
#endif // BOOST_TEST_UTILS_RUNTIME_PARAMETER_HPP
diff --git a/boost/test/utils/runtime/trace.hpp b/boost/test/utils/runtime/trace.hpp
deleted file mode 100644
index 17a169b283..0000000000
--- a/boost/test/utils/runtime/trace.hpp
+++ /dev/null
@@ -1,30 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Distributed under 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$
-//
-// Description : optional internal tracing
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_TRACE_HPP
-#define BOOST_TEST_UTILS_RUNTIME_TRACE_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-#ifdef BOOST_TEST_UTILS_RUNTIME_PARAM_DEBUG
-
-#include <iostream>
-
-# define BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( str ) std::cerr << str << std::endl
-#else
-# define BOOST_TEST_UTILS_RUNTIME_PARAM_TRACE( str )
-#endif
-
-#endif // BOOST_TEST_UTILS_RUNTIME_TRACE_HPP
diff --git a/boost/test/utils/runtime/validation.hpp b/boost/test/utils/runtime/validation.hpp
deleted file mode 100644
index 54163dc6a6..0000000000
--- a/boost/test/utils/runtime/validation.hpp
+++ /dev/null
@@ -1,85 +0,0 @@
-// (C) Copyright Gennadiy Rozental 2005-2014.
-// Distributed under 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$
-//
-// Description : defines exceptions and validation tools
-// ***************************************************************************
-
-#ifndef BOOST_TEST_UTILS_RUNTIME_VALIDATION_HPP
-#define BOOST_TEST_UTILS_RUNTIME_VALIDATION_HPP
-
-// Boost.Runtime.Parameter
-#include <boost/test/utils/runtime/config.hpp>
-
-// Boost.Test
-#include <boost/test/utils/class_properties.hpp>
-#include <boost/test/detail/throw_exception.hpp>
-
-// Boost
-#include <boost/shared_ptr.hpp>
-
-// STL
-#ifdef BOOST_TEST_UTILS_RUNTIME_PARAM_EXCEPTION_INHERIT_STD
-#include <stdexcept>
-#endif
-
-namespace boost {
-
-namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE {
-
-// ************************************************************************** //
-// ************** runtime::logic_error ************** //
-// ************************************************************************** //
-
-class logic_error
-#ifdef BOOST_TEST_UTILS_RUNTIME_PARAM_EXCEPTION_INHERIT_STD
-: public std::exception
-#endif
-{
- typedef shared_ptr<dstring> dstring_ptr;
-public:
- // Constructor // !! could we eliminate shared_ptr
- explicit logic_error( cstring msg ) : m_msg( new dstring( msg.begin(), msg.size() ) ) {}
- ~logic_error() BOOST_NOEXCEPT_OR_NOTHROW
- {}
-
- dstring const& msg() const { return *m_msg; }
- virtual char_type const* what() const BOOST_NOEXCEPT_OR_NOTHROW
- { return m_msg->c_str(); }
-
-private:
- dstring_ptr m_msg;
-};
-
-// ************************************************************************** //
-// ************** runtime::report_logic_error ************** //
-// ************************************************************************** //
-
-inline void
-report_logic_error( format_stream& msg )
-{
- BOOST_TEST_IMPL_THROW( BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE::logic_error( msg.str() ) );
-}
-
-//____________________________________________________________________________//
-
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_REPORT_LOGIC_ERROR( msg ) \
- boost::BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE::report_logic_error( format_stream().ref() << msg )
-
-#define BOOST_TEST_UTILS_RUNTIME_PARAM_VALIDATE_LOGIC( b, msg ) \
- if( b ) {} else BOOST_TEST_UTILS_RUNTIME_PARAM_REPORT_LOGIC_ERROR( msg )
-
-//____________________________________________________________________________//
-
-} // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE
-
-} // namespace boost
-
-#endif // BOOST_TEST_UTILS_RUNTIME_VALIDATION_HPP