LCOV - code coverage report
Current view: top level - opt/homebrew/include/boost/test/utils/runtime - argument.hpp (source / functions) Hit Total Coverage
Test: test_dash_coverage.info Lines: 22 23 95.7 %
Date: 2026-06-25 07:23:51 Functions: 45 74 60.8 %

          Line data    Source code
       1             : //  (C) Copyright Gennadiy Rozental 2001.
       2             : //  Distributed under the Boost Software License, Version 1.0.
       3             : //  (See accompanying file LICENSE_1_0.txt or copy at
       4             : //  http://www.boost.org/LICENSE_1_0.txt)
       5             : 
       6             : //  See http://www.boost.org/libs/test for the library home page.
       7             : //
       8             : //  File        : $RCSfile$
       9             : //
      10             : //  Version     : $Revision$
      11             : //
      12             : //  Description : model of actual argument (both typed and abstract interface)
      13             : // ***************************************************************************
      14             : 
      15             : #ifndef BOOST_TEST_UTILS_RUNTIME_ARGUMENT_HPP
      16             : #define BOOST_TEST_UTILS_RUNTIME_ARGUMENT_HPP
      17             : 
      18             : // Boost.Test Runtime parameters
      19             : #include <boost/test/utils/runtime/fwd.hpp>
      20             : #include <boost/test/utils/runtime/errors.hpp>
      21             : 
      22             : // Boost.Test
      23             : #include <boost/test/utils/class_properties.hpp>
      24             : #include <boost/test/utils/rtti.hpp>
      25             : #include <boost/test/utils/basic_cstring/compare.hpp>
      26             : #include <boost/test/detail/throw_exception.hpp>
      27             : 
      28             : // STL
      29             : #include <cassert>
      30             : 
      31             : #include <boost/test/detail/suppress_warnings.hpp>
      32             : 
      33             : namespace boost {
      34             : namespace runtime {
      35             : 
      36             : // ************************************************************************** //
      37             : // **************              runtime::argument               ************** //
      38             : // ************************************************************************** //
      39             : 
      40             : class argument {
      41             : public:
      42             :     // Constructor
      43        3358 :     argument( rtti::id_t value_type )
      44        3358 :     : p_value_type( value_type )
      45        6716 :     {}
      46             : 
      47             :     // Destructor
      48           0 :     virtual     ~argument()  {}
      49             : 
      50             :     // Public properties
      51             :     rtti::id_t const    p_value_type;
      52             : };
      53             : 
      54             : // ************************************************************************** //
      55             : // **************             runtime::typed_argument          ************** //
      56             : // ************************************************************************** //
      57             : 
      58             : template<typename T>
      59             : class typed_argument : public argument {
      60             : public:
      61             :     // Constructor
      62        6716 :     explicit typed_argument( T const& v )
      63        3358 :     : argument( rtti::type_id<T>() )
      64        3358 :     , p_value( v )
      65        6716 :     {}
      66             : 
      67             :     unit_test::readwrite_property<T>    p_value;
      68             : };
      69             : 
      70             : // ************************************************************************** //
      71             : // **************           runtime::arguments_store          ************** //
      72             : // ************************************************************************** //
      73             : 
      74             : class arguments_store {
      75             : public:
      76             :     typedef std::map<cstring, argument_ptr> storage_type;
      77             : 
      78             :     /// Returns number of arguments in the store; mostly used for testing
      79             :     std::size_t size() const        { return m_arguments.size(); }
      80             : 
      81             :     /// Clears the store for reuse
      82         146 :     void        clear()             { m_arguments.clear(); }
      83             : 
      84             :     /// Returns true if there is an argument corresponding to the specified parameter name
      85       17374 :     bool        has( cstring parameter_name ) const
      86             :     {
      87       17374 :         return m_arguments.find( parameter_name ) != m_arguments.end();
      88             :     }
      89             : 
      90             :     /// Provides types access to argument value by parameter name
      91             :     template<typename T>
      92        8032 :     T const&    get( cstring parameter_name ) const {
      93        8032 :         return const_cast<arguments_store*>(this)->get<T>( parameter_name );
      94             :     }
      95             : 
      96             :     template<typename T>
      97        8032 :     T&          get( cstring parameter_name ) {
      98        8032 :         storage_type::const_iterator found = m_arguments.find( parameter_name );
      99        8032 :         BOOST_TEST_I_ASSRT( found != m_arguments.end(),
     100             :                             access_to_missing_argument() 
     101             :                                 << "There is no argument provided for parameter "
     102             :                                 << parameter_name );
     103             : 
     104        8032 :         argument_ptr arg = found->second;
     105             : 
     106        8032 :         BOOST_TEST_I_ASSRT( arg->p_value_type == rtti::type_id<T>(),
     107             :                             arg_type_mismatch()
     108             :                                 << "Access with invalid type for argument corresponding to parameter "
     109             :                                 << parameter_name );
     110             : 
     111        8032 :         return static_cast<typed_argument<T>&>( *arg ).p_value.value;
     112        8032 :     }
     113             : 
     114             :     /// Set's the argument value for specified parameter name
     115             :     template<typename T>
     116        3358 :     void        set( cstring parameter_name, T const& value )
     117             :     {
     118        3358 :         m_arguments[parameter_name] = argument_ptr( new typed_argument<T>( value ) );
     119        3358 :     }
     120             : 
     121             : private:
     122             :     // Data members
     123             :     storage_type            m_arguments;
     124             : };
     125             : 
     126             : } // namespace runtime
     127             : } // namespace boost
     128             : 
     129             : #include <boost/test/detail/enable_warnings.hpp>
     130             : 
     131             : #endif // BOOST_TEST_UTILS_RUNTIME_ARGUMENT_HPP

Generated by: LCOV version 1.16