Chris@16: // (C) Copyright Gennadiy Rozental 2005-2008. Chris@16: // Distributed under the Boost Software License, Version 1.0. Chris@16: // (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // See http://www.boost.org/libs/test for the library home page. Chris@16: // Chris@16: // File : $RCSfile$ Chris@16: // Chris@101: // Version : $Revision$ Chris@16: // Chris@16: // Description : defines and implements inline model of program environment Chris@16: // *************************************************************************** Chris@16: Chris@16: #ifndef BOOST_RT_ENV_ENVIRONMENT_HPP_062604GER Chris@16: #define BOOST_RT_ENV_ENVIRONMENT_HPP_062604GER Chris@16: Chris@16: #ifdef UNDER_CE Chris@16: #error Windows CE does not support environment variables. Chris@16: #endif Chris@16: Chris@16: // Boost.Runtime.Parameter Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: // Boost.Test Chris@16: #include Chris@16: Chris@16: // Boost Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: namespace BOOST_RT_PARAM_NAMESPACE { Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** runtime::environment implementation ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: namespace environment { Chris@16: Chris@16: namespace rt_env_detail { Chris@16: Chris@16: template Chris@16: variable_data& Chris@16: init_new_var( cstring var_name, Modifiers m = nfp::no_params ) Chris@16: { Chris@16: rt_env_detail::variable_data& new_vd = new_var_record( var_name ); Chris@16: Chris@16: cstring str_value = sys_read_var( new_vd.m_var_name ); Chris@16: Chris@16: if( !str_value.is_empty() ) { Chris@16: try { Chris@16: boost::optional value; Chris@16: Chris@16: if( m.has( interpreter ) ) Chris@16: m[interpreter]( str_value, value ); Chris@16: else Chris@16: interpret_argument_value( str_value, value, 0 ); Chris@16: Chris@16: if( !!value ) { Chris@16: new_vd.m_value.reset( new typed_argument( new_vd ) ); Chris@16: Chris@16: arg_value( *new_vd.m_value ) = *value; Chris@16: } Chris@16: } Chris@16: catch( ... ) { // !! could we do that Chris@16: // !! should we report an error? Chris@16: } Chris@16: } Chris@16: Chris@16: if( !new_vd.m_value && m.has( default_value ) ) { Chris@16: new_vd.m_value.reset( new typed_argument( new_vd ) ); Chris@16: Chris@16: nfp::optionally_assign( arg_value( *new_vd.m_value ), m[default_value] ); Chris@16: } Chris@16: Chris@16: nfp::optionally_assign( new_vd.m_global_id, m, global_id ); Chris@16: Chris@16: return new_vd; Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: } // namespace rt_env_detail Chris@16: Chris@16: } // namespace environment Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** runtime::environment ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: namespace environment { Chris@16: Chris@16: // variable access Chris@16: variable_base Chris@16: var( cstring var_name ); Chris@16: Chris@16: //________________________________________________________________________// Chris@16: Chris@16: template Chris@16: inline variable Chris@16: var( cstring var_name ) Chris@16: { Chris@16: rt_env_detail::variable_data* vd = rt_env_detail::find_var_record( var_name ); Chris@16: Chris@16: return environment::variable( !vd ? rt_env_detail::init_new_var( var_name, nfp::no_params ) : *vd ); Chris@16: } Chris@16: Chris@16: //________________________________________________________________________// Chris@16: Chris@16: template Chris@16: inline variable Chris@16: var( cstring var_name, Modifiers const& m ) Chris@16: { Chris@16: rt_env_detail::variable_data* vd = rt_env_detail::find_var_record( var_name ); Chris@16: Chris@16: return environment::variable( !vd ? rt_env_detail::init_new_var( var_name, m ) : *vd ); Chris@16: } Chris@16: Chris@16: //________________________________________________________________________// Chris@16: Chris@16: // direct variable value access Chris@16: inline cstring Chris@16: get( cstring var_name ) Chris@16: { Chris@16: return environment::var( var_name ).value(); Chris@16: } Chris@16: Chris@16: //________________________________________________________________________// Chris@16: Chris@16: template Chris@16: inline T const& Chris@16: get( cstring var_name ) Chris@16: { Chris@16: return environment::var( var_name ).value(); Chris@16: } Chris@16: Chris@16: //________________________________________________________________________// Chris@16: Chris@16: template Chris@16: inline void Chris@16: get( cstring var_name, boost::optional& res ) Chris@16: { Chris@16: variable const& v = environment::var( var_name ); Chris@16: v.value( res ); Chris@16: } Chris@16: Chris@16: //________________________________________________________________________// Chris@16: Chris@16: } // namespace environment Chris@16: Chris@16: namespace env = environment; Chris@16: Chris@16: } // namespace BOOST_RT_PARAM_NAMESPACE Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #ifndef BOOST_RT_PARAM_OFFLINE Chris@16: Chris@16: #define BOOST_RT_PARAM_INLINE inline Chris@16: #include Chris@16: Chris@16: #endif Chris@16: Chris@16: #endif // BOOST_RT_ENV_ENVIRONMENT_HPP_062604GER