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