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 : some generic identification policies definition Chris@16: // *************************************************************************** Chris@16: Chris@16: #ifndef BOOST_RT_CLA_ID_POLICY_HPP_062604GER Chris@16: #define BOOST_RT_CLA_ID_POLICY_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: Chris@16: // Boost.Test Chris@16: #include 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: // ************** naming_policy_base ************** // Chris@16: // ************************************************************************** // Chris@16: // model: Chris@16: Chris@16: class basic_naming_policy : public identification_policy { Chris@16: public: Chris@16: // Public properties Chris@16: unit_test::readwrite_property p_prefix; Chris@16: unit_test::readwrite_property p_name; Chris@16: unit_test::readwrite_property p_separator; Chris@16: Chris@16: // Policy interface Chris@16: virtual bool responds_to( cstring name ) const { return p_name == name; } Chris@16: virtual cstring id_2_report() const { return p_name.get(); } Chris@16: virtual void usage_info( format_stream& fs ) const; Chris@16: virtual bool matching( parameter const& p, argv_traverser& tr, bool primary ) const; Chris@16: Chris@16: // Accept modifier Chris@16: template Chris@16: void accept_modifier( Modifier const& m ) Chris@16: { Chris@16: nfp::optionally_assign( p_prefix.value, m, prefix ); Chris@16: nfp::optionally_assign( p_name.value, m, name ); Chris@16: nfp::optionally_assign( p_separator.value, m, separator ); Chris@16: } Chris@16: Chris@16: protected: Chris@16: explicit basic_naming_policy( rtti::id_t dyn_type ) Chris@16: : identification_policy( dyn_type ) Chris@16: {} Chris@16: BOOST_RT_PARAM_UNNEEDED_VIRTUAL ~basic_naming_policy() {} Chris@16: Chris@16: // Naming policy interface Chris@16: virtual bool match_prefix( argv_traverser& tr ) const; Chris@16: virtual bool match_name( argv_traverser& tr ) const; Chris@16: virtual bool match_separator( argv_traverser& tr, bool optional_value ) const; Chris@16: }; Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** dual_id_policy ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: template Chris@16: class dual_id_policy : public identification_policy { Chris@16: public: Chris@16: // Constructor Chris@16: dual_id_policy() Chris@16: : identification_policy( rtti::type_id() ) Chris@16: , m_primary() Chris@16: , m_secondary() Chris@16: {} Chris@16: Chris@16: // Policy interface Chris@16: virtual bool responds_to( cstring name ) const Chris@16: { Chris@16: return m_primary.responds_to( name ) || m_secondary.responds_to( name ); Chris@16: } Chris@16: virtual bool conflict_with( identification_policy const& id_p ) const Chris@16: { Chris@16: return id_p.conflict_with( m_primary ) || id_p.conflict_with( m_secondary ); Chris@16: } Chris@16: virtual cstring id_2_report() const Chris@16: { Chris@16: return m_primary.id_2_report(); Chris@16: } Chris@16: virtual void usage_info( format_stream& fs ) const Chris@16: { Chris@16: fs << BOOST_RT_PARAM_LITERAL( '{' ); Chris@16: m_primary.usage_info( fs ); Chris@16: fs << BOOST_RT_PARAM_LITERAL( '|' ); Chris@16: m_secondary.usage_info( fs ); Chris@16: fs << BOOST_RT_PARAM_LITERAL( '}' ); Chris@16: } Chris@16: virtual bool matching( parameter const& p, argv_traverser& tr, bool primary ) const Chris@16: { Chris@16: return m_primary.matching( p, tr, primary ) || m_secondary.matching( p, tr, primary ); Chris@16: } Chris@16: Chris@16: // Accept modifier Chris@16: template Chris@16: void accept_modifier( Modifier const& m ) Chris@16: { Chris@16: m_primary.accept_modifier( m ); Chris@16: m_secondary.accept_modifier( m ); Chris@16: } Chris@16: Chris@16: protected: Chris@16: BOOST_RT_PARAM_UNNEEDED_VIRTUAL ~dual_id_policy() {} Chris@16: Chris@16: // Data members Chris@16: PrimaryId m_primary; Chris@16: SecondId m_secondary; 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: #ifndef BOOST_RT_PARAM_OFFLINE Chris@16: Chris@16: # define BOOST_RT_PARAM_INLINE inline Chris@16: # include Chris@16: Chris@16: #endif Chris@16: Chris@16: #endif // BOOST_RT_CLA_ID_POLICY_HPP_062604GER