Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: downloads/boost_1_34_1/boost/test/utils/named_params.hpp @ 29

Last change on this file since 29 was 29, checked in by landauf, 16 years ago

updated boost from 1_33_1 to 1_34_1

File size: 11.7 KB
Line 
1//  (C) Copyright Gennadiy Rozental 2005.
2//  Distributed under the Boost Software License, Version 1.0.
3//  (See accompanying file LICENSE_1_0.txt or copy at
4//  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: named_params.hpp,v $
9//
10//  Version     : $Revision: 1.5 $
11//
12//  Description : facilities for named function parameters support
13// ***************************************************************************
14
15#ifndef BOOST_TEST_NAMED_PARAM_022505GER
16#define BOOST_TEST_NAMED_PARAM_022505GER
17
18// Boost
19#include <boost/config.hpp>
20#include <boost/detail/workaround.hpp>
21
22// Boost.Test
23#include <boost/test/utils/rtti.hpp>
24#include <boost/test/utils/assign_op.hpp>
25
26#include <boost/test/detail/suppress_warnings.hpp>
27
28//____________________________________________________________________________//
29
30namespace boost {
31
32namespace nfp { // named function parameters
33
34// ************************************************************************** //
35// **************              forward declarations            ************** //
36// ************************************************************************** //
37
38template<typename T, typename unique_id,typename RefType>   struct named_parameter;
39template<typename unique_id,bool required>                  struct keyword;
40
41namespace nfp_detail {
42
43template<typename NP1,typename NP2>        struct named_parameter_combine;
44
45// ************************************************************************** //
46// **************          access_to_invalid_parameter         ************** //
47// ************************************************************************** //
48
49struct access_to_invalid_parameter {};
50
51//____________________________________________________________________________//
52
53inline void 
54report_access_to_invalid_parameter()
55{
56    throw access_to_invalid_parameter();
57}
58
59//____________________________________________________________________________//
60
61// ************************************************************************** //
62// **************                       nil                    ************** //
63// ************************************************************************** //
64
65struct nil {
66    template<typename T>
67    operator T() const
68    { report_access_to_invalid_parameter(); static T* v = 0; return *v; }
69
70    template<typename Arg1>
71    nil operator()( Arg1 const& )
72    { report_access_to_invalid_parameter(); return nil(); }
73
74    template<typename Arg1,typename Arg2>
75    nil operator()( Arg1 const&, Arg2 const& )
76    { report_access_to_invalid_parameter(); return nil(); }
77
78    template<typename Arg1,typename Arg2,typename Arg3>
79    nil operator()( Arg1 const&, Arg2 const&, Arg3 const& )
80    { report_access_to_invalid_parameter(); return nil(); }
81
82    // Visitation support
83    template<typename Visitor>
84    void            apply_to( Visitor& V ) const {}
85};
86   
87// ************************************************************************** //
88// **************              named_parameter_base            ************** //
89// ************************************************************************** //
90
91template<typename Derived>
92struct named_parameter_base {
93    template<typename NP>
94    named_parameter_combine<NP,Derived>
95    operator,( NP const& np ) const { return named_parameter_combine<NP,Derived>( np, *static_cast<Derived const*>(this) ); }
96};
97
98//____________________________________________________________________________//
99
100#if BOOST_WORKAROUND( __SUNPRO_CC, == 0x530 )
101
102struct unknown_id_helper {
103    template<typename UnknownId>
104    nil     operator[]( keyword<UnknownId,false> kw ) const { return nil(); }
105
106    template<typename UnknownId>
107    bool    has( keyword<UnknownId,false> ) const           { return false; }
108};
109
110#endif
111
112//____________________________________________________________________________//
113
114// ************************************************************************** //
115// **************             named_parameter_combine          ************** //
116// ************************************************************************** //
117
118template<typename NP, typename Rest = nil>
119struct named_parameter_combine : Rest, named_parameter_base<named_parameter_combine<NP,Rest> > {
120    typedef typename NP::ref_type  res_type;
121    typedef named_parameter_combine<NP,Rest> self_type;
122
123    // Constructor
124    named_parameter_combine( NP const& np, Rest const& r )
125    : Rest( r ), m_param( np ) {}
126
127    // Access methods
128    res_type    operator[]( keyword<typename NP::id,true> kw ) const    { return m_param[kw]; }
129    res_type    operator[]( keyword<typename NP::id,false> kw ) const   { return m_param[kw]; }
130    using       Rest::operator[];
131
132    bool        has( keyword<typename NP::id,false> ) const             { return true; }
133    using       Rest::has;
134
135#if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3206))
136    template<typename NP>
137    named_parameter_combine<NP,self_type> operator,( NP const& np ) const
138    { return named_parameter_combine<NP,self_type>( np, *this ); }
139#else
140    using       named_parameter_base<named_parameter_combine<NP,Rest> >::operator,;
141#endif
142
143    // Visitation support
144    template<typename Visitor>
145    void            apply_to( Visitor& V ) const
146    {
147        m_param.apply_to( V );
148
149        Rest::apply_to( V );
150    }
151private:
152    // Data members
153    NP          m_param;
154};
155
156} // namespace nfp_detail
157
158// ************************************************************************** //
159// **************             named_parameter_combine          ************** //
160// ************************************************************************** //
161
162template<typename T, typename unique_id,typename ReferenceType=T&>
163struct named_parameter
164: nfp_detail::named_parameter_base<named_parameter<T, unique_id,ReferenceType> >
165#if BOOST_WORKAROUND( __SUNPRO_CC, == 0x530 )
166, nfp_detail::unknown_id_helper
167#endif
168{
169    typedef T               data_type;
170    typedef ReferenceType   ref_type;
171    typedef unique_id       id;
172
173    // Constructor
174    explicit        named_parameter( ref_type v ) : m_value( v ) {}
175
176    // Access methods
177    ref_type        operator[]( keyword<unique_id,true> ) const     { return m_value; }
178    ref_type        operator[]( keyword<unique_id,false> ) const    { return m_value; }
179#if BOOST_WORKAROUND( __SUNPRO_CC, == 0x530 )
180    using           nfp_detail::unknown_id_helper::operator[];
181#else
182    template<typename UnknownId>
183    nfp_detail::nil  operator[]( keyword<UnknownId,false> ) const   { return nfp_detail::nil(); }
184#endif
185
186    bool            has( keyword<unique_id,false> ) const           { return true; }
187#if BOOST_WORKAROUND( __SUNPRO_CC, == 0x530 )
188    using           nfp_detail::unknown_id_helper::has;
189#else
190    template<typename UnknownId>
191    bool            has( keyword<UnknownId,false> ) const           { return false; }
192#endif
193
194    // Visitation support
195    template<typename Visitor>
196    void            apply_to( Visitor& V ) const
197    {
198        V.set_parameter( rtti::type_id<unique_id>(), m_value );
199    }
200
201private:
202    // Data members
203    ref_type        m_value;
204};
205
206//____________________________________________________________________________//
207
208// ************************************************************************** //
209// **************                    no_params                 ************** //
210// ************************************************************************** //
211
212namespace nfp_detail {
213typedef named_parameter<char, struct no_params_type_t,char> no_params_type;
214}
215
216namespace {
217nfp_detail::no_params_type no_params( '\0' );
218} // local namespace
219
220//____________________________________________________________________________//
221
222// ************************************************************************** //
223// **************                     keyword                  ************** //
224// ************************************************************************** //
225
226template<typename unique_id, bool required = false>
227struct keyword {
228    typedef unique_id id;
229
230    template<typename T>
231    named_parameter<T const,unique_id>
232    operator=( T const& t ) const       { return named_parameter<T const,unique_id>( t ); }
233
234    template<typename T>
235    named_parameter<T,unique_id>
236    operator=( T& t ) const   { return named_parameter<T,unique_id>( t ); }
237
238    named_parameter<char const*,unique_id,char const*>
239    operator=( char const* t ) const   { return named_parameter<char const*,unique_id,char const*>( t ); }
240};
241
242//____________________________________________________________________________//
243
244// ************************************************************************** //
245// **************                  typed_keyword               ************** //
246// ************************************************************************** //
247
248template<typename T, typename unique_id, bool required = false>
249struct typed_keyword : keyword<unique_id,required> {
250    named_parameter<T const,unique_id>
251    operator=( T const& t ) const       { return named_parameter<T const,unique_id>( t ); }
252
253    named_parameter<T,unique_id>
254    operator=( T& t ) const             { return named_parameter<T,unique_id>( t ); }
255};
256
257//____________________________________________________________________________//
258
259template<typename unique_id>
260struct typed_keyword<bool,unique_id,false>
261: keyword<unique_id,false>
262, named_parameter<bool,unique_id,bool> {
263    typedef unique_id id;
264
265    typed_keyword() : named_parameter<bool,unique_id,bool>( true ) {}
266
267    named_parameter<bool,unique_id,bool>
268    operator!() const           { return named_parameter<bool,unique_id,bool>( false ); }
269};
270
271//____________________________________________________________________________//
272
273// ************************************************************************** //
274// **************                optionally_assign             ************** //
275// ************************************************************************** //
276
277template<typename T>
278inline void
279optionally_assign( T&, nfp_detail::nil )
280{
281    nfp_detail::report_access_to_invalid_parameter();
282}
283
284//____________________________________________________________________________//
285
286template<typename T, typename Source>
287inline void
288#if BOOST_WORKAROUND( __MWERKS__, BOOST_TESTED_AT( 0x3003 ) ) \
289    || BOOST_WORKAROUND( __DECCXX_VER, BOOST_TESTED_AT(60590042) )
290optionally_assign( T& target, Source src )
291#else
292optionally_assign( T& target, Source const& src )
293#endif
294{
295    using namespace unit_test;
296
297    assign_op( target, src, 0 );
298}
299
300//____________________________________________________________________________//
301
302template<typename T, typename Params, typename Keyword>
303inline void
304optionally_assign( T& target, Params const& p, Keyword k )
305{
306    if( p.has(k) )
307        optionally_assign( target, p[k] );
308}
309
310//____________________________________________________________________________//
311
312} // namespace nfp
313
314} // namespace boost
315
316#include <boost/test/detail/enable_warnings.hpp>
317
318// ***************************************************************************
319//   Revision History:
320// 
321//  $Log: named_params.hpp,v $
322//  Revision 1.5  2005/12/14 05:01:13  rogeeff
323//  *** empty log message ***
324//
325//  Revision 1.4  2005/06/13 10:35:08  schoepflin
326//  Enable optionally_assign() overload workaround for Tru64/CXX-6.5 as well.
327//
328//  Revision 1.3  2005/06/05 18:10:59  grafik
329//  named_param.hpp; Work around CW not handling operator, using declaration, by using a real operator,().
330//  token_iterator_test.cpp; Work around CW-8 confused with array initialization.
331//
332//  Revision 1.2  2005/05/03 05:02:49  rogeeff
333//  como fixes
334//
335//  Revision 1.1  2005/04/12 06:48:12  rogeeff
336//  Runtime.Param library initial commit
337//
338// ***************************************************************************
339
340#endif // BOOST_TEST_NAMED_PARAM_022505GER
341
Note: See TracBrowser for help on using the repository browser.