Chris@16
|
1 // (C) Copyright Gennadiy Rozental 2005-2008.
|
Chris@16
|
2 // Distributed under the Boost Software License, Version 1.0.
|
Chris@16
|
3 // (See accompanying file LICENSE_1_0.txt or copy at
|
Chris@16
|
4 // http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
5
|
Chris@16
|
6 // See http://www.boost.org/libs/test for the library home page.
|
Chris@16
|
7 //
|
Chris@16
|
8 // File : $RCSfile$
|
Chris@16
|
9 //
|
Chris@101
|
10 // Version : $Revision$
|
Chris@16
|
11 //
|
Chris@16
|
12 // Description : defines model of program environment variable
|
Chris@16
|
13 // ***************************************************************************
|
Chris@16
|
14
|
Chris@16
|
15 #ifndef BOOST_RT_ENV_VARIABLE_HPP_062604GER
|
Chris@16
|
16 #define BOOST_RT_ENV_VARIABLE_HPP_062604GER
|
Chris@16
|
17
|
Chris@16
|
18 #ifdef UNDER_CE
|
Chris@16
|
19 #error Windows CE does not support environment variables.
|
Chris@16
|
20 #endif
|
Chris@16
|
21
|
Chris@16
|
22 // Boost.Runtime.Parameter
|
Chris@16
|
23 #include <boost/test/utils/runtime/config.hpp>
|
Chris@16
|
24 #include <boost/test/utils/runtime/fwd.hpp>
|
Chris@16
|
25 #include <boost/test/utils/runtime/parameter.hpp>
|
Chris@16
|
26 #include <boost/test/utils/runtime/argument.hpp>
|
Chris@16
|
27
|
Chris@16
|
28 #include <boost/test/utils/runtime/env/fwd.hpp>
|
Chris@16
|
29
|
Chris@16
|
30 // Boost
|
Chris@16
|
31 #include <boost/optional.hpp>
|
Chris@16
|
32
|
Chris@16
|
33 namespace boost {
|
Chris@16
|
34
|
Chris@16
|
35 namespace BOOST_RT_PARAM_NAMESPACE {
|
Chris@16
|
36
|
Chris@16
|
37 namespace environment {
|
Chris@16
|
38
|
Chris@16
|
39 // ************************************************************************** //
|
Chris@16
|
40 // ************** runtime::environment::variable_data ************** //
|
Chris@16
|
41 // ************************************************************************** //
|
Chris@16
|
42
|
Chris@16
|
43 namespace rt_env_detail {
|
Chris@16
|
44
|
Chris@16
|
45 struct variable_data : public runtime::parameter {
|
Chris@16
|
46 cstring m_var_name;
|
Chris@16
|
47 dstring m_global_id;
|
Chris@16
|
48 argument_ptr m_value;
|
Chris@16
|
49 };
|
Chris@16
|
50
|
Chris@16
|
51 } // namespace rt_env_detail
|
Chris@16
|
52
|
Chris@16
|
53 // ************************************************************************** //
|
Chris@16
|
54 // ************** runtime::environment::variable_base ************** //
|
Chris@16
|
55 // ************************************************************************** //
|
Chris@16
|
56
|
Chris@16
|
57 class variable_base {
|
Chris@16
|
58 public:
|
Chris@16
|
59 explicit variable_base( rt_env_detail::variable_data& data ) : m_data( &data ) {}
|
Chris@16
|
60
|
Chris@16
|
61 // arguments access
|
Chris@16
|
62 template<typename T>
|
Chris@16
|
63 T const& value() const
|
Chris@16
|
64 {
|
Chris@16
|
65 return arg_value<T>( *m_data->m_value );
|
Chris@16
|
66 }
|
Chris@16
|
67
|
Chris@16
|
68 template<typename T>
|
Chris@16
|
69 void value( boost::optional<T>& res ) const
|
Chris@16
|
70 {
|
Chris@16
|
71 if( has_value() )
|
Chris@16
|
72 res = arg_value<T>( *m_data->m_value );
|
Chris@16
|
73 else
|
Chris@16
|
74 res.reset();
|
Chris@16
|
75 }
|
Chris@16
|
76
|
Chris@16
|
77 bool has_value() const { return m_data->m_value!=0; }
|
Chris@16
|
78 cstring name() const { return m_data->m_var_name; }
|
Chris@16
|
79
|
Chris@16
|
80 protected:
|
Chris@16
|
81 // Data members
|
Chris@16
|
82 rt_env_detail::variable_data* m_data;
|
Chris@16
|
83 } ;
|
Chris@16
|
84
|
Chris@16
|
85 // ************************************************************************** //
|
Chris@16
|
86 // ************** runtime::environment::variable ************** //
|
Chris@16
|
87 // ************************************************************************** //
|
Chris@16
|
88
|
Chris@16
|
89 template<typename T = cstring>
|
Chris@16
|
90 class variable : public variable_base {
|
Chris@16
|
91 public:
|
Chris@16
|
92 // Constructors
|
Chris@16
|
93 explicit variable( cstring var_name );
|
Chris@16
|
94
|
Chris@16
|
95 template<typename Modifiers>
|
Chris@16
|
96 explicit variable( cstring var_name, Modifiers const& m );
|
Chris@16
|
97
|
Chris@16
|
98 explicit variable( rt_env_detail::variable_data& data )
|
Chris@16
|
99 : variable_base( data ) {}
|
Chris@16
|
100
|
Chris@16
|
101 // other variable assignment
|
Chris@16
|
102 void operator=( variable const& v ) { m_data = v.m_data; }
|
Chris@16
|
103
|
Chris@16
|
104 // access methods
|
Chris@16
|
105 T const& value() const { return variable_base::value<T>(); }
|
Chris@16
|
106
|
Chris@16
|
107 #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3206)) || \
|
Chris@16
|
108 BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x0593))
|
Chris@16
|
109 template<typename T>
|
Chris@16
|
110 void value( boost::optional<T>& res ) const { variable_base::value( res ); }
|
Chris@16
|
111 #else
|
Chris@16
|
112 using variable_base::value;
|
Chris@16
|
113 #endif
|
Chris@16
|
114
|
Chris@16
|
115 // Value assignment
|
Chris@16
|
116 template<typename V>
|
Chris@16
|
117 void operator=( V const& v )
|
Chris@16
|
118 {
|
Chris@16
|
119 if( !has_value() )
|
Chris@16
|
120 m_data->m_value.reset( new typed_argument<T>( *m_data ) );
|
Chris@16
|
121
|
Chris@16
|
122 arg_value<T>( *m_data->m_value ) = v;
|
Chris@16
|
123
|
Chris@16
|
124 rt_env_detail::sys_write_var( m_data->m_var_name, format_stream().ref() << value() );
|
Chris@16
|
125 }
|
Chris@16
|
126 }; // class variable
|
Chris@16
|
127
|
Chris@16
|
128 //____________________________________________________________________________//
|
Chris@16
|
129
|
Chris@16
|
130 template<typename CharT, typename Tr,typename T>
|
Chris@16
|
131 inline std::basic_ostream<CharT,Tr>&
|
Chris@16
|
132 operator<<( std::basic_ostream<CharT,Tr>& os, variable<T> const& v )
|
Chris@16
|
133 {
|
Chris@16
|
134 os << v.name() << '=';
|
Chris@16
|
135
|
Chris@16
|
136 if( v.has_value() )
|
Chris@16
|
137 os << v.value();
|
Chris@16
|
138
|
Chris@16
|
139 return os;
|
Chris@16
|
140 }
|
Chris@16
|
141
|
Chris@16
|
142 //____________________________________________________________________________//
|
Chris@16
|
143
|
Chris@16
|
144 template<typename T, typename V>
|
Chris@16
|
145 inline bool
|
Chris@16
|
146 operator==( variable<T> ev, V const& v )
|
Chris@16
|
147 {
|
Chris@16
|
148 return ev.has_value() && ev.value() == v;
|
Chris@16
|
149 }
|
Chris@16
|
150
|
Chris@16
|
151 //____________________________________________________________________________//
|
Chris@16
|
152
|
Chris@16
|
153 template<typename T, typename V>
|
Chris@16
|
154 inline bool
|
Chris@16
|
155 operator==( V const& v, variable<T> ev )
|
Chris@16
|
156 {
|
Chris@16
|
157 return ev.has_value() && ev.value() == v;
|
Chris@16
|
158 }
|
Chris@16
|
159
|
Chris@16
|
160 //____________________________________________________________________________//
|
Chris@16
|
161
|
Chris@16
|
162 template<typename T, typename V>
|
Chris@16
|
163 inline bool
|
Chris@16
|
164 operator!=( variable<T> ev, V const& v )
|
Chris@16
|
165 {
|
Chris@16
|
166 return !ev.has_value() || ev.value() != v;
|
Chris@16
|
167 }
|
Chris@16
|
168
|
Chris@16
|
169 //____________________________________________________________________________//
|
Chris@16
|
170
|
Chris@16
|
171 template<typename T, typename V>
|
Chris@16
|
172 inline bool
|
Chris@16
|
173 operator!=( V const& v, variable<T> ev )
|
Chris@16
|
174 {
|
Chris@16
|
175 return !ev.has_value() || ev.value() != v;
|
Chris@16
|
176 }
|
Chris@16
|
177
|
Chris@16
|
178 //____________________________________________________________________________//
|
Chris@16
|
179
|
Chris@16
|
180 } // namespace environment
|
Chris@16
|
181
|
Chris@16
|
182 } // namespace BOOST_RT_PARAM_NAMESPACE
|
Chris@16
|
183
|
Chris@16
|
184 } // namespace boost
|
Chris@16
|
185
|
Chris@16
|
186 // ************************************************************************** //
|
Chris@16
|
187 // ************************************************************************** //
|
Chris@16
|
188 // Implementation
|
Chris@16
|
189
|
Chris@16
|
190 #include <boost/test/utils/runtime/env/environment.hpp>
|
Chris@16
|
191
|
Chris@16
|
192 // ************************************************************************** //
|
Chris@16
|
193 // ************** runtime::environment::variable ************** //
|
Chris@16
|
194 // ************************************************************************** //
|
Chris@16
|
195
|
Chris@16
|
196 namespace boost {
|
Chris@16
|
197
|
Chris@16
|
198 namespace BOOST_RT_PARAM_NAMESPACE {
|
Chris@16
|
199
|
Chris@16
|
200 namespace environment {
|
Chris@16
|
201
|
Chris@16
|
202 template<typename T>
|
Chris@16
|
203 variable<T>::variable( cstring var_name )
|
Chris@16
|
204 : variable_base( environment::var<T>( var_name ) )
|
Chris@16
|
205 {}
|
Chris@16
|
206
|
Chris@16
|
207 //____________________________________________________________________________//
|
Chris@16
|
208
|
Chris@16
|
209 template<typename T>
|
Chris@16
|
210 template<typename Modifiers>
|
Chris@16
|
211 variable<T>::variable( cstring var_name, Modifiers const& m )
|
Chris@16
|
212 : variable_base( environment::var<T>( var_name, m ) )
|
Chris@16
|
213 {}
|
Chris@16
|
214
|
Chris@16
|
215 //____________________________________________________________________________//
|
Chris@16
|
216
|
Chris@16
|
217 } // namespace environment
|
Chris@16
|
218
|
Chris@16
|
219 } // namespace BOOST_RT_PARAM_NAMESPACE
|
Chris@16
|
220
|
Chris@16
|
221 } // namespace boost
|
Chris@16
|
222
|
Chris@16
|
223 #endif // BOOST_RT_ENV_VARIABLE_HPP_062604GER
|