173 lines
5.1 KiB
C++
173 lines
5.1 KiB
C++
// (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
|