Chris@16: // (C) Copyright Gennadiy Rozental 2005-2008. Chris@16: // Use, modification, and distribution are subject to the Chris@16: // Boost Software License, Version 1.0. (See accompanying file Chris@16: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // See http://www.boost.org/libs/test for the library home page. Chris@16: // Chris@16: // File : $RCSfile$ Chris@16: // Chris@101: // Version : $Revision$ Chris@16: // Chris@16: // Description : defines model of formal parameter Chris@16: // *************************************************************************** Chris@16: Chris@16: #ifndef BOOST_RT_CLA_PARAMETER_HPP_062604GER Chris@16: #define BOOST_RT_CLA_PARAMETER_HPP_062604GER Chris@16: Chris@16: // Boost.Runtime.Parameter Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: // Boost.Test Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: namespace BOOST_RT_PARAM_NAMESPACE { Chris@16: Chris@16: namespace cla { Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** runtime::cla::parameter ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: class parameter : public BOOST_RT_PARAM_NAMESPACE::parameter { Chris@16: public: Chris@16: parameter( identification_policy& ID, argument_factory& F, bool optional_value = false ) Chris@16: : p_optional( false ) Chris@16: , p_multiplicable( false ) Chris@16: , p_optional_value( optional_value ) Chris@16: , m_id_policy( ID ) Chris@16: , m_arg_factory( F ) Chris@16: {} Chris@16: Chris@16: // Destructor Chris@16: virtual ~parameter() {} Chris@16: Chris@16: unit_test::readwrite_property p_optional; Chris@16: unit_test::readwrite_property p_multiplicable; Chris@16: unit_test::readwrite_property p_optional_value; Chris@16: unit_test::readwrite_property p_description; Chris@16: Chris@16: // parameter properties modification Chris@16: template Chris@16: void accept_modifier( Modifier const& m ) Chris@16: { Chris@16: if( m.has( optional_m ) ) Chris@16: p_optional.value = true; Chris@16: Chris@16: if( m.has( required_m ) ) Chris@16: p_optional.value = false; Chris@16: Chris@16: if( m.has( multiplicable_m ) ) Chris@16: p_multiplicable.value = true; Chris@16: Chris@16: if( m.has( optional_value_m ) ) Chris@16: p_optional_value.value = true; Chris@16: Chris@16: nfp::optionally_assign( p_description.value, m, description ); Chris@16: } Chris@16: Chris@16: // access methods Chris@16: bool has_argument() const { return m_actual_argument!=0; } Chris@16: argument const& actual_argument() const { return *m_actual_argument; } Chris@16: argument_ptr actual_argument() { return m_actual_argument; } Chris@16: Chris@16: Chris@16: // identification interface Chris@16: bool responds_to( cstring name ) const { return m_id_policy.responds_to( name ); } Chris@16: bool conflict_with( parameter const& p ) const Chris@16: { Chris@16: return (id_2_report() == p.id_2_report() && !id_2_report().is_empty()) || Chris@16: m_id_policy.conflict_with( p.m_id_policy ) || Chris@16: ((m_id_policy.p_type_id != p.m_id_policy.p_type_id) && p.m_id_policy.conflict_with( m_id_policy )); Chris@16: } Chris@16: cstring id_2_report() const { return m_id_policy.id_2_report(); } Chris@16: void usage_info( format_stream& fs ) const Chris@16: { Chris@16: m_id_policy.usage_info( fs ); Chris@16: if( p_optional_value ) Chris@16: fs << BOOST_RT_PARAM_LITERAL( '[' ); Chris@16: Chris@16: m_arg_factory.argument_usage_info( fs ); Chris@16: Chris@16: if( p_optional_value ) Chris@16: fs << BOOST_RT_PARAM_LITERAL( ']' ); Chris@16: } Chris@16: Chris@16: // argument match/produce based on input Chris@16: bool matching( argv_traverser& tr, bool primary ) const Chris@16: { Chris@16: return m_id_policy.matching( *this, tr, primary ); Chris@16: } Chris@16: Chris@16: // argument production based on different source Chris@16: void produce_argument( argv_traverser& tr ) Chris@16: { Chris@16: m_id_policy.matching( *this, tr, true ); // !! can we save this position somehow Chris@16: m_actual_argument = m_arg_factory.produce_using( *this, tr ); Chris@16: } Chris@16: void produce_argument( parser const& p ) Chris@16: { Chris@16: m_actual_argument = m_arg_factory.produce_using( *this, p ); Chris@16: } Chris@16: Chris@16: private: Chris@16: //Data members Chris@16: identification_policy& m_id_policy; Chris@16: argument_factory& m_arg_factory; Chris@16: argument_ptr m_actual_argument; Chris@16: }; Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: template Chris@16: inline shared_ptr Chris@16: operator-( shared_ptr p, Modifier const& m ) Chris@16: { Chris@16: p->accept_modifier( m ); Chris@16: Chris@16: return p; Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: } // namespace cla Chris@16: Chris@16: } // namespace BOOST_RT_PARAM_NAMESPACE Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #endif // BOOST_RT_CLA_PARAMETER_HPP_062604GER