/src/contrib/boost/spirit/home/phoenix/core/reference.hpp
http://pythonocc.googlecode.com/ · C++ Header · 80 lines · 58 code · 14 blank · 8 comment · 1 complexity · 9e2acaea4710fe52b9e85d1ff5e386fb MD5 · raw file
- /*=============================================================================
- Copyright (c) 2001-2007 Joel de Guzman
- 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)
- ==============================================================================*/
- #ifndef PHOENIX_CORE_REFERENCE_HPP
- #define PHOENIX_CORE_REFERENCE_HPP
- #include <boost/spirit/home/phoenix/core/actor.hpp>
- #include <boost/static_assert.hpp>
- #include <boost/type_traits/is_reference.hpp>
- #include <boost/mpl/bool.hpp>
- namespace boost { namespace phoenix
- {
- template <typename T>
- struct reference
- {
- // $$$ TODO: a better (user friendly) static assert
- BOOST_STATIC_ASSERT(
- mpl::not_<is_reference<T> >::value != 0);
- typedef mpl::false_ no_nullary;
- template <typename Env>
- struct result
- {
- typedef T& type;
- };
- reference(T& arg)
- : ref(arg) {}
- template <typename Env>
- T& eval(Env const&) const
- {
- return ref;
- }
- T& ref;
- private:
- // silence MSVC warning C4512: assignment operator could not be generated
- reference& operator= (reference const&);
- };
- template <typename T>
- inline actor<reference<T> > const
- ref(T& v)
- {
- return reference<T>(v);
- }
- template <typename T>
- inline actor<reference<T const> > const
- cref(T const& v)
- {
- return reference<T const>(v);
- }
- namespace detail
- {
- struct error_attempting_to_convert_an_actor_to_a_reference {};
- }
- template <typename Base>
- void
- ref(actor<Base> const& v
- , detail::error_attempting_to_convert_an_actor_to_a_reference
- = detail::error_attempting_to_convert_an_actor_to_a_reference());
- template <typename Base>
- void
- cref(actor<Base> const& v
- , detail::error_attempting_to_convert_an_actor_to_a_reference
- = detail::error_attempting_to_convert_an_actor_to_a_reference());
- }}
- #endif