~ubuntu-branches/ubuntu/wily/bombono-dvd/wily

« back to all changes in this revision

Viewing changes to libs/boost-lib/boost/test/utils/runtime/interpret_argument_value.hpp

  • Committer: Bazaar Package Importer
  • Author(s): Alessio Treglia
  • Date: 2010-11-04 11:46:25 UTC
  • mto: This revision was merged to the branch mainline in revision 8.
  • Revision ID: james.westby@ubuntu.com-20101104114625-8xfdhvhpsm51i0nu
Tags: upstream-0.8.0
ImportĀ upstreamĀ versionĀ 0.8.0

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
//  (C) Copyright Gennadiy Rozental 2005-2008.
 
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$
 
9
//
 
10
//  Version     : $Revision: 49312 $
 
11
//
 
12
//  Description : default algorithms for string to specific type convertions
 
13
// ***************************************************************************
 
14
 
 
15
#ifndef BOOST_RT_INTERPRET_ARGUMENT_VALUE_HPP_062604GER
 
16
#define BOOST_RT_INTERPRET_ARGUMENT_VALUE_HPP_062604GER
 
17
 
 
18
// Boost.Runtime.Parameter
 
19
#include <boost/test/utils/runtime/config.hpp>
 
20
#include <boost/test/utils/runtime/trace.hpp>
 
21
 
 
22
// Boost.Test
 
23
#include <boost/test/utils/basic_cstring/io.hpp>
 
24
#include <boost/test/utils/basic_cstring/compare.hpp>
 
25
 
 
26
// Boost
 
27
#include <boost/optional.hpp>
 
28
#include <boost/lexical_cast.hpp>
 
29
 
 
30
// STL
 
31
// !! could we eliminate these includes?
 
32
#include <list>
 
33
 
 
34
namespace boost {
 
35
 
 
36
namespace BOOST_RT_PARAM_NAMESPACE {
 
37
 
 
38
// ************************************************************************** //
 
39
// **************       runtime::interpret_argument_value      ************** //
 
40
// ************************************************************************** //
 
41
// returns true if source is used false otherwise
 
42
 
 
43
// generic case
 
44
template<typename T>
 
45
struct interpret_argument_value_impl {
 
46
    static bool _( cstring source, boost::optional<T>& res )
 
47
    {
 
48
        BOOST_RT_PARAM_TRACE( "In interpret_argument_value_impl<" << typeid(T).name() << ">" );
 
49
 
 
50
        res = lexical_cast<T>( source );
 
51
 
 
52
        BOOST_RT_PARAM_TRACE( "String " << source << " is interpreted as " << *res );
 
53
        return true;
 
54
    }
 
55
};
 
56
 
 
57
 
 
58
//____________________________________________________________________________//
 
59
 
 
60
// dstring case
 
61
template<>
 
62
struct interpret_argument_value_impl<dstring> {
 
63
    static bool _( cstring source, boost::optional<dstring>& res )
 
64
    {
 
65
        BOOST_RT_PARAM_TRACE( "In interpret_argument_value_impl<dstring>" );
 
66
 
 
67
        res = dstring();
 
68
        assign_op( *res, source, 0 );
 
69
 
 
70
        return true;
 
71
    }
 
72
};
 
73
 
 
74
//____________________________________________________________________________//
 
75
 
 
76
// cstring case
 
77
template<>
 
78
struct interpret_argument_value_impl<cstring> {
 
79
    static bool _( cstring source, boost::optional<cstring>& res )
 
80
    {
 
81
        BOOST_RT_PARAM_TRACE( "In interpret_argument_value_impl<cstring>" );
 
82
 
 
83
        res = source;
 
84
 
 
85
        return true;
 
86
    }
 
87
};
 
88
 
 
89
//____________________________________________________________________________//
 
90
 
 
91
// specialization for type bool
 
92
template<>
 
93
struct interpret_argument_value_impl<bool> {
 
94
    static bool _( cstring source, boost::optional<bool>& res )
 
95
    {
 
96
        BOOST_RT_PARAM_TRACE( "In interpret_argument_value_impl<bool>" );
 
97
 
 
98
        static literal_cstring YES( BOOST_RT_PARAM_CSTRING_LITERAL( "YES" ) );
 
99
        static literal_cstring Y( BOOST_RT_PARAM_CSTRING_LITERAL( "Y" ) );
 
100
        static literal_cstring NO( BOOST_RT_PARAM_CSTRING_LITERAL( "NO" ) );
 
101
        static literal_cstring N( BOOST_RT_PARAM_CSTRING_LITERAL( "N" ) );
 
102
        static literal_cstring one( BOOST_RT_PARAM_CSTRING_LITERAL( "1" ) );
 
103
        static literal_cstring zero( BOOST_RT_PARAM_CSTRING_LITERAL( "0" ) );
 
104
 
 
105
        source.trim();
 
106
 
 
107
        if( case_ins_eq( source, YES ) || case_ins_eq( source, Y ) || case_ins_eq( source, one ) ) {
 
108
            res = true;
 
109
            return true;
 
110
        }
 
111
        else if( case_ins_eq( source, NO ) || case_ins_eq( source, N ) || case_ins_eq( source, zero ) ) {
 
112
            res = false;
 
113
            return true;
 
114
        }
 
115
        else {
 
116
            res = true;
 
117
            return false;
 
118
        }
 
119
    }
 
120
};
 
121
 
 
122
//____________________________________________________________________________//
 
123
 
 
124
template<typename T>
 
125
inline bool
 
126
interpret_argument_value( cstring source, boost::optional<T>& res, long )
 
127
{
 
128
    return interpret_argument_value_impl<T>::_( source, res );
 
129
}
 
130
 
 
131
//____________________________________________________________________________//
 
132
 
 
133
// specialization for list of values
 
134
template<typename T>
 
135
inline bool
 
136
interpret_argument_value( cstring source, boost::optional<std::list<T> >& res, int )
 
137
{
 
138
    BOOST_RT_PARAM_TRACE( "In interpret_argument_value<std::list<T>>" );
 
139
 
 
140
    res = std::list<T>();
 
141
 
 
142
    while( !source.is_empty() ) {
 
143
        // !! should we use token_iterator
 
144
        cstring::iterator single_value_end = std::find( source.begin(), source.end(), BOOST_RT_PARAM_LITERAL( ',' ) );
 
145
 
 
146
        boost::optional<T> value;
 
147
        interpret_argument_value( cstring( source.begin(), single_value_end ), value, 0 );
 
148
 
 
149
        res->push_back( *value );
 
150
 
 
151
        source.trim_left( single_value_end + 1 );
 
152
    }
 
153
 
 
154
    return true;
 
155
}
 
156
 
 
157
//____________________________________________________________________________//
 
158
 
 
159
} // namespace BOOST_RT_PARAM_NAMESPACE
 
160
 
 
161
} // namespace boost
 
162
 
 
163
#endif // BOOST_RT_INTERPRET_ARGUMENT_VALUE_HPP_062604GER