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 |