annotate DEPENDENCIES/generic/include/boost/test/utils/runtime/cla/parameter.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 // (C) Copyright Gennadiy Rozental 2005-2008.
Chris@16 2 // Use, modification, and distribution are subject to the
Chris@16 3 // Boost Software License, Version 1.0. (See accompanying file
Chris@16 4 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@16 5
Chris@16 6 // See http://www.boost.org/libs/test for the library home page.
Chris@16 7 //
Chris@16 8 // File : $RCSfile$
Chris@16 9 //
Chris@101 10 // Version : $Revision$
Chris@16 11 //
Chris@16 12 // Description : defines model of formal parameter
Chris@16 13 // ***************************************************************************
Chris@16 14
Chris@16 15 #ifndef BOOST_RT_CLA_PARAMETER_HPP_062604GER
Chris@16 16 #define BOOST_RT_CLA_PARAMETER_HPP_062604GER
Chris@16 17
Chris@16 18 // Boost.Runtime.Parameter
Chris@16 19 #include <boost/test/utils/runtime/config.hpp>
Chris@16 20
Chris@16 21 #include <boost/test/utils/runtime/fwd.hpp>
Chris@16 22 #include <boost/test/utils/runtime/parameter.hpp>
Chris@16 23 #include <boost/test/utils/runtime/validation.hpp>
Chris@16 24
Chris@16 25 #include <boost/test/utils/runtime/cla/fwd.hpp>
Chris@16 26 #include <boost/test/utils/runtime/cla/modifier.hpp>
Chris@16 27 #include <boost/test/utils/runtime/cla/iface/argument_factory.hpp>
Chris@16 28 #include <boost/test/utils/runtime/cla/iface/id_policy.hpp>
Chris@16 29
Chris@16 30 // Boost.Test
Chris@16 31 #include <boost/test/utils/rtti.hpp>
Chris@16 32
Chris@16 33 namespace boost {
Chris@16 34
Chris@16 35 namespace BOOST_RT_PARAM_NAMESPACE {
Chris@16 36
Chris@16 37 namespace cla {
Chris@16 38
Chris@16 39 // ************************************************************************** //
Chris@16 40 // ************** runtime::cla::parameter ************** //
Chris@16 41 // ************************************************************************** //
Chris@16 42
Chris@16 43 class parameter : public BOOST_RT_PARAM_NAMESPACE::parameter {
Chris@16 44 public:
Chris@16 45 parameter( identification_policy& ID, argument_factory& F, bool optional_value = false )
Chris@16 46 : p_optional( false )
Chris@16 47 , p_multiplicable( false )
Chris@16 48 , p_optional_value( optional_value )
Chris@16 49 , m_id_policy( ID )
Chris@16 50 , m_arg_factory( F )
Chris@16 51 {}
Chris@16 52
Chris@16 53 // Destructor
Chris@16 54 virtual ~parameter() {}
Chris@16 55
Chris@16 56 unit_test::readwrite_property<bool> p_optional;
Chris@16 57 unit_test::readwrite_property<bool> p_multiplicable;
Chris@16 58 unit_test::readwrite_property<bool> p_optional_value;
Chris@16 59 unit_test::readwrite_property<dstring> p_description;
Chris@16 60
Chris@16 61 // parameter properties modification
Chris@16 62 template<typename Modifier>
Chris@16 63 void accept_modifier( Modifier const& m )
Chris@16 64 {
Chris@16 65 if( m.has( optional_m ) )
Chris@16 66 p_optional.value = true;
Chris@16 67
Chris@16 68 if( m.has( required_m ) )
Chris@16 69 p_optional.value = false;
Chris@16 70
Chris@16 71 if( m.has( multiplicable_m ) )
Chris@16 72 p_multiplicable.value = true;
Chris@16 73
Chris@16 74 if( m.has( optional_value_m ) )
Chris@16 75 p_optional_value.value = true;
Chris@16 76
Chris@16 77 nfp::optionally_assign( p_description.value, m, description );
Chris@16 78 }
Chris@16 79
Chris@16 80 // access methods
Chris@16 81 bool has_argument() const { return m_actual_argument!=0; }
Chris@16 82 argument const& actual_argument() const { return *m_actual_argument; }
Chris@16 83 argument_ptr actual_argument() { return m_actual_argument; }
Chris@16 84
Chris@16 85
Chris@16 86 // identification interface
Chris@16 87 bool responds_to( cstring name ) const { return m_id_policy.responds_to( name ); }
Chris@16 88 bool conflict_with( parameter const& p ) const
Chris@16 89 {
Chris@16 90 return (id_2_report() == p.id_2_report() && !id_2_report().is_empty()) ||
Chris@16 91 m_id_policy.conflict_with( p.m_id_policy ) ||
Chris@16 92 ((m_id_policy.p_type_id != p.m_id_policy.p_type_id) && p.m_id_policy.conflict_with( m_id_policy ));
Chris@16 93 }
Chris@16 94 cstring id_2_report() const { return m_id_policy.id_2_report(); }
Chris@16 95 void usage_info( format_stream& fs ) const
Chris@16 96 {
Chris@16 97 m_id_policy.usage_info( fs );
Chris@16 98 if( p_optional_value )
Chris@16 99 fs << BOOST_RT_PARAM_LITERAL( '[' );
Chris@16 100
Chris@16 101 m_arg_factory.argument_usage_info( fs );
Chris@16 102
Chris@16 103 if( p_optional_value )
Chris@16 104 fs << BOOST_RT_PARAM_LITERAL( ']' );
Chris@16 105 }
Chris@16 106
Chris@16 107 // argument match/produce based on input
Chris@16 108 bool matching( argv_traverser& tr, bool primary ) const
Chris@16 109 {
Chris@16 110 return m_id_policy.matching( *this, tr, primary );
Chris@16 111 }
Chris@16 112
Chris@16 113 // argument production based on different source
Chris@16 114 void produce_argument( argv_traverser& tr )
Chris@16 115 {
Chris@16 116 m_id_policy.matching( *this, tr, true ); // !! can we save this position somehow
Chris@16 117 m_actual_argument = m_arg_factory.produce_using( *this, tr );
Chris@16 118 }
Chris@16 119 void produce_argument( parser const& p )
Chris@16 120 {
Chris@16 121 m_actual_argument = m_arg_factory.produce_using( *this, p );
Chris@16 122 }
Chris@16 123
Chris@16 124 private:
Chris@16 125 //Data members
Chris@16 126 identification_policy& m_id_policy;
Chris@16 127 argument_factory& m_arg_factory;
Chris@16 128 argument_ptr m_actual_argument;
Chris@16 129 };
Chris@16 130
Chris@16 131 //____________________________________________________________________________//
Chris@16 132
Chris@16 133 template<typename Parameter,typename Modifier>
Chris@16 134 inline shared_ptr<Parameter>
Chris@16 135 operator-( shared_ptr<Parameter> p, Modifier const& m )
Chris@16 136 {
Chris@16 137 p->accept_modifier( m );
Chris@16 138
Chris@16 139 return p;
Chris@16 140 }
Chris@16 141
Chris@16 142 //____________________________________________________________________________//
Chris@16 143
Chris@16 144 } // namespace cla
Chris@16 145
Chris@16 146 } // namespace BOOST_RT_PARAM_NAMESPACE
Chris@16 147
Chris@16 148 } // namespace boost
Chris@16 149
Chris@16 150 #endif // BOOST_RT_CLA_PARAMETER_HPP_062604GER