123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- // (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: 81913 $
- //
- // Description : defines model of program environment variable
- // ***************************************************************************
- #ifndef BOOST_RT_ENV_VARIABLE_HPP_062604GER
- #define BOOST_RT_ENV_VARIABLE_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/parameter.hpp>
- #include <boost/test/utils/runtime/argument.hpp>
- #include <boost/test/utils/runtime/env/fwd.hpp>
- // Boost
- #include <boost/optional.hpp>
- namespace boost {
- namespace BOOST_RT_PARAM_NAMESPACE {
- namespace environment {
- // ************************************************************************** //
- // ************** runtime::environment::variable_data ************** //
- // ************************************************************************** //
- namespace rt_env_detail {
- struct variable_data : public runtime::parameter {
- cstring m_var_name;
- dstring m_global_id;
- argument_ptr m_value;
- };
- } // namespace rt_env_detail
- // ************************************************************************** //
- // ************** runtime::environment::variable_base ************** //
- // ************************************************************************** //
- class variable_base {
- public:
- explicit variable_base( rt_env_detail::variable_data& data ) : m_data( &data ) {}
- // arguments access
- template<typename T>
- T const& value() const
- {
- return arg_value<T>( *m_data->m_value );
- }
- template<typename T>
- void value( boost::optional<T>& res ) const
- {
- if( has_value() )
- res = arg_value<T>( *m_data->m_value );
- else
- res.reset();
- }
- bool has_value() const { return m_data->m_value!=0; }
- cstring name() const { return m_data->m_var_name; }
- protected:
- // Data members
- rt_env_detail::variable_data* m_data;
- } ;
- // ************************************************************************** //
- // ************** runtime::environment::variable ************** //
- // ************************************************************************** //
- template<typename T = cstring>
- class variable : public variable_base {
- public:
- // Constructors
- explicit variable( cstring var_name );
- template<typename Modifiers>
- explicit variable( cstring var_name, Modifiers const& m );
- explicit variable( rt_env_detail::variable_data& data )
- : variable_base( data ) {}
- // other variable assignment
- void operator=( variable const& v ) { m_data = v.m_data; }
- // access methods
- T const& value() const { return variable_base::value<T>(); }
- #if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3206)) || \
- BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x0593))
- template<typename T>
- void value( boost::optional<T>& res ) const { variable_base::value( res ); }
- #else
- using variable_base::value;
- #endif
- // Value assignment
- template<typename V>
- void operator=( V const& v )
- {
- if( !has_value() )
- m_data->m_value.reset( new typed_argument<T>( *m_data ) );
- arg_value<T>( *m_data->m_value ) = v;
- rt_env_detail::sys_write_var( m_data->m_var_name, format_stream().ref() << value() );
- }
- }; // class variable
- //____________________________________________________________________________//
- template<typename CharT, typename Tr,typename T>
- inline std::basic_ostream<CharT,Tr>&
- operator<<( std::basic_ostream<CharT,Tr>& os, variable<T> const& v )
- {
- os << v.name() << '=';
- if( v.has_value() )
- os << v.value();
- return os;
- }
- //____________________________________________________________________________//
- template<typename T, typename V>
- inline bool
- operator==( variable<T> ev, V const& v )
- {
- return ev.has_value() && ev.value() == v;
- }
- //____________________________________________________________________________//
- template<typename T, typename V>
- inline bool
- operator==( V const& v, variable<T> ev )
- {
- return ev.has_value() && ev.value() == v;
- }
- //____________________________________________________________________________//
- template<typename T, typename V>
- inline bool
- operator!=( variable<T> ev, V const& v )
- {
- return !ev.has_value() || ev.value() != v;
- }
- //____________________________________________________________________________//
- template<typename T, typename V>
- inline bool
- operator!=( V const& v, variable<T> ev )
- {
- return !ev.has_value() || ev.value() != v;
- }
- //____________________________________________________________________________//
- } // namespace environment
- } // namespace BOOST_RT_PARAM_NAMESPACE
- } // namespace boost
- // ************************************************************************** //
- // ************************************************************************** //
- // Implementation
- #include <boost/test/utils/runtime/env/environment.hpp>
- // ************************************************************************** //
- // ************** runtime::environment::variable ************** //
- // ************************************************************************** //
- namespace boost {
- namespace BOOST_RT_PARAM_NAMESPACE {
- namespace environment {
- template<typename T>
- variable<T>::variable( cstring var_name )
- : variable_base( environment::var<T>( var_name ) )
- {}
- //____________________________________________________________________________//
- template<typename T>
- template<typename Modifiers>
- variable<T>::variable( cstring var_name, Modifiers const& m )
- : variable_base( environment::var<T>( var_name, m ) )
- {}
- //____________________________________________________________________________//
- } // namespace environment
- } // namespace BOOST_RT_PARAM_NAMESPACE
- } // namespace boost
- #endif // BOOST_RT_ENV_VARIABLE_HPP_062604GER
|