1 // (C) Copyright Gennadiy Rozental 2005-2014. 2 // Use, modification, and distribution are subject to the 3 // Boost Software License, Version 1.0. (See accompanying file 4 // LICENSE_1_0.txt or copy at 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 : some generic identification policies definition 13 // *************************************************************************** 14 15 #ifndef BOOST_TEST_UTILS_RUNTIME_CLA_ID_POLICY_HPP 16 #define BOOST_TEST_UTILS_RUNTIME_CLA_ID_POLICY_HPP 17 18 // Boost.Runtime.Parameter 19 #include <boost/test/utils/runtime/config.hpp> 20 21 #include <boost/test/utils/runtime/cla/fwd.hpp> 22 #include <boost/test/utils/runtime/cla/modifier.hpp> 23 #include <boost/test/utils/runtime/cla/argv_traverser.hpp> 24 25 #include <boost/test/utils/runtime/cla/iface/id_policy.hpp> 26 27 // Boost.Test 28 #include <boost/test/utils/class_properties.hpp> 29 #include <boost/test/utils/rtti.hpp> 30 31 namespace boost { 32 33 namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE { 34 35 namespace cla { 36 37 // ************************************************************************** // 38 // ************** naming_policy_base ************** // 39 // ************************************************************************** // 40 // model: <prefix> <name> <separtor> 41 42 class basic_naming_policy : public identification_policy { 43 public: 44 // Public properties 45 unit_test::readwrite_property<dstring> p_prefix; 46 unit_test::readwrite_property<dstring> p_name; 47 unit_test::readwrite_property<dstring> p_separator; 48 49 // Policy interface responds_to(cstring name) const50 virtual bool responds_to( cstring name ) const { return p_name == name; } id_2_report() const51 virtual cstring id_2_report() const { return p_name.get(); } 52 virtual void usage_info( format_stream& fs ) const; 53 virtual bool matching( parameter const& p, argv_traverser& tr, bool primary ) const; 54 55 // Accept modifier 56 template<typename Modifier> accept_modifier(Modifier const & m)57 void accept_modifier( Modifier const& m ) 58 { 59 nfp::optionally_assign( p_prefix.value, m, prefix ); 60 nfp::optionally_assign( p_name.value, m, name ); 61 nfp::optionally_assign( p_separator.value, m, separator ); 62 } 63 64 protected: basic_naming_policy(rtti::id_t dyn_type)65 explicit basic_naming_policy( rtti::id_t dyn_type ) 66 : identification_policy( dyn_type ) 67 {} ~basic_naming_policy()68 BOOST_TEST_UTILS_RUNTIME_PARAM_UNNEEDED_VIRTUAL ~basic_naming_policy() {} 69 70 // Naming policy interface 71 virtual bool match_prefix( argv_traverser& tr ) const; 72 virtual bool match_name( argv_traverser& tr ) const; 73 virtual bool match_separator( argv_traverser& tr, bool optional_value ) const; 74 }; 75 76 // ************************************************************************** // 77 // ************** dual_id_policy ************** // 78 // ************************************************************************** // 79 80 template<typename MostDerived,typename PrimaryId,typename SecondId> 81 class dual_id_policy : public identification_policy { 82 public: 83 // Constructor dual_id_policy()84 dual_id_policy() 85 : identification_policy( rtti::type_id<MostDerived>() ) 86 , m_primary() 87 , m_secondary() 88 {} 89 90 // Policy interface responds_to(cstring name) const91 virtual bool responds_to( cstring name ) const 92 { 93 return m_primary.responds_to( name ) || m_secondary.responds_to( name ); 94 } conflict_with(identification_policy const & id_p) const95 virtual bool conflict_with( identification_policy const& id_p ) const 96 { 97 return id_p.conflict_with( m_primary ) || id_p.conflict_with( m_secondary ); 98 } id_2_report() const99 virtual cstring id_2_report() const 100 { 101 return m_primary.id_2_report(); 102 } usage_info(format_stream & fs) const103 virtual void usage_info( format_stream& fs ) const 104 { 105 fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '{' ); 106 m_primary.usage_info( fs ); 107 fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '|' ); 108 m_secondary.usage_info( fs ); 109 fs << BOOST_TEST_UTILS_RUNTIME_PARAM_LITERAL( '}' ); 110 } matching(parameter const & p,argv_traverser & tr,bool primary) const111 virtual bool matching( parameter const& p, argv_traverser& tr, bool primary ) const 112 { 113 return m_primary.matching( p, tr, primary ) || m_secondary.matching( p, tr, primary ); 114 } 115 116 // Accept modifier 117 template<typename Modifier> accept_modifier(Modifier const & m)118 void accept_modifier( Modifier const& m ) 119 { 120 m_primary.accept_modifier( m ); 121 m_secondary.accept_modifier( m ); 122 } 123 124 protected: ~dual_id_policy()125 BOOST_TEST_UTILS_RUNTIME_PARAM_UNNEEDED_VIRTUAL ~dual_id_policy() {} 126 127 // Data members 128 PrimaryId m_primary; 129 SecondId m_secondary; 130 }; 131 132 } // namespace cla 133 134 } // namespace BOOST_TEST_UTILS_RUNTIME_PARAM_NAMESPACE 135 136 } // namespace boost 137 138 #ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_OFFLINE 139 140 #ifndef BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE 141 # define BOOST_TEST_UTILS_RUNTIME_PARAM_INLINE inline 142 #endif 143 # include <boost/test/utils/runtime/cla/id_policy.ipp> 144 145 #endif 146 147 #endif // BOOST_TEST_UTILS_RUNTIME_CLA_ID_POLICY_HPP 148