132 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			132 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								//  (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 : model of actual argument (both typed and abstract interface)
							 | 
						||
| 
								 | 
							
								// ***************************************************************************
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef BOOST_TEST_UTILS_RUNTIME_ARGUMENT_HPP
							 | 
						||
| 
								 | 
							
								#define BOOST_TEST_UTILS_RUNTIME_ARGUMENT_HPP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// Boost.Test Runtime parameters
							 | 
						||
| 
								 | 
							
								#include <boost/test/utils/runtime/fwd.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>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <boost/test/detail/suppress_warnings.hpp>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace boost {
							 | 
						||
| 
								 | 
							
								namespace runtime {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ************************************************************************** //
							 | 
						||
| 
								 | 
							
								// **************              runtime::argument               ************** //
							 | 
						||
| 
								 | 
							
								// ************************************************************************** //
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class argument {
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
								    // Constructor
							 | 
						||
| 
								 | 
							
								    argument( rtti::id_t value_type )
							 | 
						||
| 
								 | 
							
								    : p_value_type( value_type )
							 | 
						||
| 
								 | 
							
								    {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Destructor
							 | 
						||
| 
								 | 
							
								    virtual     ~argument()  {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // Public properties
							 | 
						||
| 
								 | 
							
								    rtti::id_t const    p_value_type;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ************************************************************************** //
							 | 
						||
| 
								 | 
							
								// **************             runtime::typed_argument          ************** //
							 | 
						||
| 
								 | 
							
								// ************************************************************************** //
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								template<typename T>
							 | 
						||
| 
								 | 
							
								class typed_argument : public argument {
							 | 
						||
| 
								 | 
							
								public:
							 | 
						||
| 
								 | 
							
								    // Constructor
							 | 
						||
| 
								 | 
							
								    explicit typed_argument( T const& v )
							 | 
						||
| 
								 | 
							
								    : argument( rtti::type_id<T>() )
							 | 
						||
| 
								 | 
							
								    , p_value( v )
							 | 
						||
| 
								 | 
							
								    {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    unit_test::readwrite_property<T>    p_value;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ************************************************************************** //
							 | 
						||
| 
								 | 
							
								// **************           runtime::arguments_store          ************** //
							 | 
						||
| 
								 | 
							
								// ************************************************************************** //
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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
							 |