diff options
Diffstat (limited to 'boost/test/utils/runtime/env/environment.hpp')
-rw-r--r-- | boost/test/utils/runtime/env/environment.hpp | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/boost/test/utils/runtime/env/environment.hpp b/boost/test/utils/runtime/env/environment.hpp new file mode 100644 index 0000000000..f5e88a26cd --- /dev/null +++ b/boost/test/utils/runtime/env/environment.hpp @@ -0,0 +1,172 @@ +// (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 |