Chris@16: // (C) Copyright Gennadiy Rozental 2005-2008. Chris@16: // Distributed under the Boost Software License, Version 1.0. Chris@16: // (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // See http://www.boost.org/libs/test for the library home page. Chris@16: // Chris@16: // File : $RCSfile$ Chris@16: // Chris@101: // Version : $Revision$ Chris@16: // Chris@16: // Description : defines model of program environment variable Chris@16: // *************************************************************************** Chris@16: Chris@16: #ifndef BOOST_RT_ENV_VARIABLE_HPP_062604GER Chris@16: #define BOOST_RT_ENV_VARIABLE_HPP_062604GER Chris@16: Chris@16: #ifdef UNDER_CE Chris@16: #error Windows CE does not support environment variables. Chris@16: #endif Chris@16: Chris@16: // Boost.Runtime.Parameter Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: // Boost Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: namespace BOOST_RT_PARAM_NAMESPACE { Chris@16: Chris@16: namespace environment { Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** runtime::environment::variable_data ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: namespace rt_env_detail { Chris@16: Chris@16: struct variable_data : public runtime::parameter { Chris@16: cstring m_var_name; Chris@16: dstring m_global_id; Chris@16: argument_ptr m_value; Chris@16: }; Chris@16: Chris@16: } // namespace rt_env_detail Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** runtime::environment::variable_base ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: class variable_base { Chris@16: public: Chris@16: explicit variable_base( rt_env_detail::variable_data& data ) : m_data( &data ) {} Chris@16: Chris@16: // arguments access Chris@16: template Chris@16: T const& value() const Chris@16: { Chris@16: return arg_value( *m_data->m_value ); Chris@16: } Chris@16: Chris@16: template Chris@16: void value( boost::optional& res ) const Chris@16: { Chris@16: if( has_value() ) Chris@16: res = arg_value( *m_data->m_value ); Chris@16: else Chris@16: res.reset(); Chris@16: } Chris@16: Chris@16: bool has_value() const { return m_data->m_value!=0; } Chris@16: cstring name() const { return m_data->m_var_name; } Chris@16: Chris@16: protected: Chris@16: // Data members Chris@16: rt_env_detail::variable_data* m_data; Chris@16: } ; Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** runtime::environment::variable ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: template Chris@16: class variable : public variable_base { Chris@16: public: Chris@16: // Constructors Chris@16: explicit variable( cstring var_name ); Chris@16: Chris@16: template Chris@16: explicit variable( cstring var_name, Modifiers const& m ); Chris@16: Chris@16: explicit variable( rt_env_detail::variable_data& data ) Chris@16: : variable_base( data ) {} Chris@16: Chris@16: // other variable assignment Chris@16: void operator=( variable const& v ) { m_data = v.m_data; } Chris@16: Chris@16: // access methods Chris@16: T const& value() const { return variable_base::value(); } Chris@16: Chris@16: #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3206)) || \ Chris@16: BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x0593)) Chris@16: template Chris@16: void value( boost::optional& res ) const { variable_base::value( res ); } Chris@16: #else Chris@16: using variable_base::value; Chris@16: #endif Chris@16: Chris@16: // Value assignment Chris@16: template Chris@16: void operator=( V const& v ) Chris@16: { Chris@16: if( !has_value() ) Chris@16: m_data->m_value.reset( new typed_argument( *m_data ) ); Chris@16: Chris@16: arg_value( *m_data->m_value ) = v; Chris@16: Chris@16: rt_env_detail::sys_write_var( m_data->m_var_name, format_stream().ref() << value() ); Chris@16: } Chris@16: }; // class variable Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: template Chris@16: inline std::basic_ostream& Chris@16: operator<<( std::basic_ostream& os, variable const& v ) Chris@16: { Chris@16: os << v.name() << '='; Chris@16: Chris@16: if( v.has_value() ) Chris@16: os << v.value(); Chris@16: Chris@16: return os; Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: template Chris@16: inline bool Chris@16: operator==( variable ev, V const& v ) Chris@16: { Chris@16: return ev.has_value() && ev.value() == v; Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: template Chris@16: inline bool Chris@16: operator==( V const& v, variable ev ) Chris@16: { Chris@16: return ev.has_value() && ev.value() == v; Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: template Chris@16: inline bool Chris@16: operator!=( variable ev, V const& v ) Chris@16: { Chris@16: return !ev.has_value() || ev.value() != v; Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: template Chris@16: inline bool Chris@16: operator!=( V const& v, variable ev ) Chris@16: { Chris@16: return !ev.has_value() || ev.value() != v; Chris@16: } Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: } // namespace environment Chris@16: Chris@16: } // namespace BOOST_RT_PARAM_NAMESPACE Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************************************************************************** // Chris@16: // Implementation Chris@16: Chris@16: #include Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** runtime::environment::variable ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: namespace boost { Chris@16: Chris@16: namespace BOOST_RT_PARAM_NAMESPACE { Chris@16: Chris@16: namespace environment { Chris@16: Chris@16: template Chris@16: variable::variable( cstring var_name ) Chris@16: : variable_base( environment::var( var_name ) ) Chris@16: {} Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: template Chris@16: template Chris@16: variable::variable( cstring var_name, Modifiers const& m ) Chris@16: : variable_base( environment::var( var_name, m ) ) Chris@16: {} Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: } // namespace environment Chris@16: Chris@16: } // namespace BOOST_RT_PARAM_NAMESPACE Chris@16: Chris@16: } // namespace boost Chris@16: Chris@16: #endif // BOOST_RT_ENV_VARIABLE_HPP_062604GER