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