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 and implements inline model of program environment
|
Chris@16
|
13 // ***************************************************************************
|
Chris@16
|
14
|
Chris@16
|
15 #ifndef BOOST_RT_ENV_ENVIRONMENT_HPP_062604GER
|
Chris@16
|
16 #define BOOST_RT_ENV_ENVIRONMENT_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/argument.hpp>
|
Chris@16
|
26 #include <boost/test/utils/runtime/interpret_argument_value.hpp>
|
Chris@16
|
27
|
Chris@16
|
28 #include <boost/test/utils/runtime/env/fwd.hpp>
|
Chris@16
|
29 #include <boost/test/utils/runtime/env/modifier.hpp>
|
Chris@16
|
30 #include <boost/test/utils/runtime/env/variable.hpp>
|
Chris@16
|
31
|
Chris@16
|
32 // Boost.Test
|
Chris@16
|
33 #include <boost/test/utils/callback.hpp>
|
Chris@16
|
34
|
Chris@16
|
35 // Boost
|
Chris@16
|
36 #include <boost/optional.hpp>
|
Chris@16
|
37
|
Chris@16
|
38 namespace boost {
|
Chris@16
|
39
|
Chris@16
|
40 namespace BOOST_RT_PARAM_NAMESPACE {
|
Chris@16
|
41
|
Chris@16
|
42 // ************************************************************************** //
|
Chris@16
|
43 // ************** runtime::environment implementation ************** //
|
Chris@16
|
44 // ************************************************************************** //
|
Chris@16
|
45
|
Chris@16
|
46 namespace environment {
|
Chris@16
|
47
|
Chris@16
|
48 namespace rt_env_detail {
|
Chris@16
|
49
|
Chris@16
|
50 template<typename T, typename Modifiers>
|
Chris@16
|
51 variable_data&
|
Chris@16
|
52 init_new_var( cstring var_name, Modifiers m = nfp::no_params )
|
Chris@16
|
53 {
|
Chris@16
|
54 rt_env_detail::variable_data& new_vd = new_var_record( var_name );
|
Chris@16
|
55
|
Chris@16
|
56 cstring str_value = sys_read_var( new_vd.m_var_name );
|
Chris@16
|
57
|
Chris@16
|
58 if( !str_value.is_empty() ) {
|
Chris@16
|
59 try {
|
Chris@16
|
60 boost::optional<T> value;
|
Chris@16
|
61
|
Chris@16
|
62 if( m.has( interpreter ) )
|
Chris@16
|
63 m[interpreter]( str_value, value );
|
Chris@16
|
64 else
|
Chris@16
|
65 interpret_argument_value( str_value, value, 0 );
|
Chris@16
|
66
|
Chris@16
|
67 if( !!value ) {
|
Chris@16
|
68 new_vd.m_value.reset( new typed_argument<T>( new_vd ) );
|
Chris@16
|
69
|
Chris@16
|
70 arg_value<T>( *new_vd.m_value ) = *value;
|
Chris@16
|
71 }
|
Chris@16
|
72 }
|
Chris@16
|
73 catch( ... ) { // !! could we do that
|
Chris@16
|
74 // !! should we report an error?
|
Chris@16
|
75 }
|
Chris@16
|
76 }
|
Chris@16
|
77
|
Chris@16
|
78 if( !new_vd.m_value && m.has( default_value ) ) {
|
Chris@16
|
79 new_vd.m_value.reset( new typed_argument<T>( new_vd ) );
|
Chris@16
|
80
|
Chris@16
|
81 nfp::optionally_assign( arg_value<T>( *new_vd.m_value ), m[default_value] );
|
Chris@16
|
82 }
|
Chris@16
|
83
|
Chris@16
|
84 nfp::optionally_assign( new_vd.m_global_id, m, global_id );
|
Chris@16
|
85
|
Chris@16
|
86 return new_vd;
|
Chris@16
|
87 }
|
Chris@16
|
88
|
Chris@16
|
89 //____________________________________________________________________________//
|
Chris@16
|
90
|
Chris@16
|
91 } // namespace rt_env_detail
|
Chris@16
|
92
|
Chris@16
|
93 } // namespace environment
|
Chris@16
|
94
|
Chris@16
|
95 // ************************************************************************** //
|
Chris@16
|
96 // ************** runtime::environment ************** //
|
Chris@16
|
97 // ************************************************************************** //
|
Chris@16
|
98
|
Chris@16
|
99 namespace environment {
|
Chris@16
|
100
|
Chris@16
|
101 // variable access
|
Chris@16
|
102 variable_base
|
Chris@16
|
103 var( cstring var_name );
|
Chris@16
|
104
|
Chris@16
|
105 //________________________________________________________________________//
|
Chris@16
|
106
|
Chris@16
|
107 template<typename T>
|
Chris@16
|
108 inline variable<T>
|
Chris@16
|
109 var( cstring var_name )
|
Chris@16
|
110 {
|
Chris@16
|
111 rt_env_detail::variable_data* vd = rt_env_detail::find_var_record( var_name );
|
Chris@16
|
112
|
Chris@16
|
113 return environment::variable<T>( !vd ? rt_env_detail::init_new_var<T>( var_name, nfp::no_params ) : *vd );
|
Chris@16
|
114 }
|
Chris@16
|
115
|
Chris@16
|
116 //________________________________________________________________________//
|
Chris@16
|
117
|
Chris@16
|
118 template<typename T, typename Modifiers>
|
Chris@16
|
119 inline variable<T>
|
Chris@16
|
120 var( cstring var_name, Modifiers const& m )
|
Chris@16
|
121 {
|
Chris@16
|
122 rt_env_detail::variable_data* vd = rt_env_detail::find_var_record( var_name );
|
Chris@16
|
123
|
Chris@16
|
124 return environment::variable<T>( !vd ? rt_env_detail::init_new_var<T>( var_name, m ) : *vd );
|
Chris@16
|
125 }
|
Chris@16
|
126
|
Chris@16
|
127 //________________________________________________________________________//
|
Chris@16
|
128
|
Chris@16
|
129 // direct variable value access
|
Chris@16
|
130 inline cstring
|
Chris@16
|
131 get( cstring var_name )
|
Chris@16
|
132 {
|
Chris@16
|
133 return environment::var<cstring>( var_name ).value();
|
Chris@16
|
134 }
|
Chris@16
|
135
|
Chris@16
|
136 //________________________________________________________________________//
|
Chris@16
|
137
|
Chris@16
|
138 template<typename T>
|
Chris@16
|
139 inline T const&
|
Chris@16
|
140 get( cstring var_name )
|
Chris@16
|
141 {
|
Chris@16
|
142 return environment::var<T>( var_name ).value();
|
Chris@16
|
143 }
|
Chris@16
|
144
|
Chris@16
|
145 //________________________________________________________________________//
|
Chris@16
|
146
|
Chris@16
|
147 template<typename T>
|
Chris@16
|
148 inline void
|
Chris@16
|
149 get( cstring var_name, boost::optional<T>& res )
|
Chris@16
|
150 {
|
Chris@16
|
151 variable<T> const& v = environment::var<T>( var_name );
|
Chris@16
|
152 v.value( res );
|
Chris@16
|
153 }
|
Chris@16
|
154
|
Chris@16
|
155 //________________________________________________________________________//
|
Chris@16
|
156
|
Chris@16
|
157 } // namespace environment
|
Chris@16
|
158
|
Chris@16
|
159 namespace env = environment;
|
Chris@16
|
160
|
Chris@16
|
161 } // namespace BOOST_RT_PARAM_NAMESPACE
|
Chris@16
|
162
|
Chris@16
|
163 } // namespace boost
|
Chris@16
|
164
|
Chris@16
|
165 #ifndef BOOST_RT_PARAM_OFFLINE
|
Chris@16
|
166
|
Chris@16
|
167 #define BOOST_RT_PARAM_INLINE inline
|
Chris@16
|
168 #include <boost/test/utils/runtime/env/environment.ipp>
|
Chris@16
|
169
|
Chris@16
|
170 #endif
|
Chris@16
|
171
|
Chris@16
|
172 #endif // BOOST_RT_ENV_ENVIRONMENT_HPP_062604GER
|