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