// (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: 57992 $ // // Description : implements model of program environment // *************************************************************************** #ifndef BOOST_RT_ENV_ENVIRONMENT_IPP_062904GER #define BOOST_RT_ENV_ENVIRONMENT_IPP_062904GER // Boost.Runtime.Parameter #include #include #include // Boost.Test #include #include // STL #include #include namespace boost { namespace BOOST_RT_PARAM_NAMESPACE { namespace environment { // ************************************************************************** // // ************** runtime::environment ************** // // ************************************************************************** // namespace rt_env_detail { typedef std::map registry; typedef std::list keys; BOOST_RT_PARAM_INLINE registry& s_registry() { static registry instance; return instance; } BOOST_RT_PARAM_INLINE keys& s_keys() { static keys instance; return instance; } BOOST_RT_PARAM_INLINE variable_data& new_var_record( cstring var_name ) { // save the name in list of keys s_keys().push_back( dstring() ); dstring& key = s_keys().back(); assign_op( key, var_name, 0 ); // create and return new record variable_data& new_var_data = s_registry()[key]; new_var_data.m_var_name = key; return new_var_data; } //____________________________________________________________________________// BOOST_RT_PARAM_INLINE variable_data* find_var_record( cstring var_name ) { registry::iterator it = s_registry().find( var_name ); return it == s_registry().end() ? 0 : &(it->second); } //____________________________________________________________________________// #ifdef BOOST_MSVC #pragma warning(push) #pragma warning(disable:4996) // getenv #endif BOOST_RT_PARAM_INLINE cstring sys_read_var( cstring var_name ) { using namespace std; return BOOST_RT_PARAM_GETENV( var_name.begin() ); } #ifdef BOOST_MSVC #pragma warning(pop) #endif //____________________________________________________________________________// BOOST_RT_PARAM_INLINE void sys_write_var( cstring var_name, format_stream& var_value ) { BOOST_RT_PARAM_PUTENV( var_name, cstring( var_value.str() ) ); } //____________________________________________________________________________// } // namespace rt_env_detail BOOST_RT_PARAM_INLINE variable_base var( cstring var_name ) { rt_env_detail::variable_data* vd = rt_env_detail::find_var_record( var_name ); BOOST_RT_PARAM_VALIDATE_LOGIC( !!vd, BOOST_RT_PARAM_LITERAL( "First access to the environment variable " ) << var_name << BOOST_RT_PARAM_LITERAL( " should be typed" ) ); return variable_base( *vd ); } //____________________________________________________________________________// } // namespace environment } // namespace BOOST_RT_PARAM_NAMESPACE } // namespace boost #endif // BOOST_RT_ENV_ENVIRONMENT_IPP_062904GER