blob: f2929dee043685e6391bb80b60d605abba25f8e7 [file] [log] [blame]
Jeff Thompsonef2d5a42013-08-22 19:09:24 -07001// (C) Copyright Gennadiy Rozental 2005-2008.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at
4// http://www.boost.org/LICENSE_1_0.txt)
5
6// See http://www.boost.org/libs/test for the library home page.
7//
8// File : $RCSfile$
9//
10// Version : $Revision: 57992 $
11//
12// Description : implements model of program environment
13// ***************************************************************************
14
15#ifndef BOOST_RT_ENV_ENVIRONMENT_IPP_062904GER
16#define BOOST_RT_ENV_ENVIRONMENT_IPP_062904GER
17
18// Boost.Runtime.Parameter
19#include <ndnboost/test/utils/runtime/config.hpp>
20#include <ndnboost/test/utils/runtime/validation.hpp>
21
22#include <ndnboost/test/utils/runtime/env/variable.hpp>
23
24// Boost.Test
25#include <ndnboost/test/utils/basic_cstring/compare.hpp>
26#include <ndnboost/test/utils/basic_cstring/io.hpp>
27
28// STL
29#include <map>
30#include <list>
31
32namespace ndnboost {
33
34namespace BOOST_RT_PARAM_NAMESPACE {
35
36namespace environment {
37
38// ************************************************************************** //
39// ************** runtime::environment ************** //
40// ************************************************************************** //
41
42namespace rt_env_detail {
43
44typedef std::map<cstring,rt_env_detail::variable_data> registry;
45typedef std::list<dstring> keys;
46
47BOOST_RT_PARAM_INLINE registry& s_registry() { static registry instance; return instance; }
48BOOST_RT_PARAM_INLINE keys& s_keys() { static keys instance; return instance; }
49
50BOOST_RT_PARAM_INLINE variable_data&
51new_var_record( cstring var_name )
52{
53 // save the name in list of keys
54 s_keys().push_back( dstring() );
55 dstring& key = s_keys().back();
56 assign_op( key, var_name, 0 );
57
58 // create and return new record
59 variable_data& new_var_data = s_registry()[key];
60
61 new_var_data.m_var_name = key;
62
63 return new_var_data;
64}
65
66//____________________________________________________________________________//
67
68BOOST_RT_PARAM_INLINE variable_data*
69find_var_record( cstring var_name )
70{
71 registry::iterator it = s_registry().find( var_name );
72
73 return it == s_registry().end() ? 0 : &(it->second);
74}
75
76//____________________________________________________________________________//
77
78#ifdef BOOST_MSVC
79#pragma warning(push)
80#pragma warning(disable:4996) // getenv
81#endif
82
83BOOST_RT_PARAM_INLINE cstring
84sys_read_var( cstring var_name )
85{
86 using namespace std;
87 return BOOST_RT_PARAM_GETENV( var_name.begin() );
88}
89
90#ifdef BOOST_MSVC
91#pragma warning(pop)
92#endif
93//____________________________________________________________________________//
94
95BOOST_RT_PARAM_INLINE void
96sys_write_var( cstring var_name, format_stream& var_value )
97{
98 BOOST_RT_PARAM_PUTENV( var_name, cstring( var_value.str() ) );
99}
100
101//____________________________________________________________________________//
102
103} // namespace rt_env_detail
104
105BOOST_RT_PARAM_INLINE variable_base
106var( cstring var_name )
107{
108 rt_env_detail::variable_data* vd = rt_env_detail::find_var_record( var_name );
109
110 BOOST_RT_PARAM_VALIDATE_LOGIC( !!vd,
111 BOOST_RT_PARAM_LITERAL( "First access to the environment variable " )
112 << var_name << BOOST_RT_PARAM_LITERAL( " should be typed" ) );
113
114 return variable_base( *vd );
115}
116
117//____________________________________________________________________________//
118
119} // namespace environment
120
121} // namespace BOOST_RT_PARAM_NAMESPACE
122
123} // namespace ndnboost
124
125#endif // BOOST_RT_ENV_ENVIRONMENT_IPP_062904GER