117 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| ///////////////////////////////////////////////////////////////////////////////
 | |
| /// \file literal.hpp
 | |
| /// The literal\<\> terminal wrapper, and the proto::lit() function for
 | |
| /// creating literal\<\> wrappers.
 | |
| //
 | |
| //  Copyright 2008 Eric Niebler. 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 BOOST_PROTO_LITERAL_HPP_EAN_01_03_2007
 | |
| #define BOOST_PROTO_LITERAL_HPP_EAN_01_03_2007
 | |
| 
 | |
| #include <boost/config.hpp>
 | |
| #include <boost/proto/proto_fwd.hpp>
 | |
| #include <boost/proto/expr.hpp>
 | |
| #include <boost/proto/traits.hpp>
 | |
| #include <boost/proto/extends.hpp>
 | |
| 
 | |
| namespace boost { namespace proto
 | |
| {
 | |
|     namespace utility
 | |
|     {
 | |
|         /// \brief A simple wrapper for a terminal, provided for
 | |
|         /// ease of use.
 | |
|         ///
 | |
|         /// A simple wrapper for a terminal, provided for
 | |
|         /// ease of use. In all cases, <tt>literal\<X\> l(x);</tt>
 | |
|         /// is equivalent to <tt>terminal\<X\>::type l = {x};</tt>.
 | |
|         ///
 | |
|         /// The \c Domain template parameter defaults to
 | |
|         /// \c proto::default_domain.
 | |
|         template<
 | |
|             typename T
 | |
|           , typename Domain // = default_domain
 | |
|         >
 | |
|         struct literal
 | |
|           : extends<basic_expr<tag::terminal, term<T>, 0>, literal<T, Domain>, Domain>
 | |
|         {
 | |
|         private:
 | |
|             typedef basic_expr<tag::terminal, term<T>, 0> terminal_type;
 | |
|             typedef extends<terminal_type, literal<T, Domain>, Domain> base_type;
 | |
|             typedef literal<T, Domain> literal_t;
 | |
| 
 | |
|         public:
 | |
|             typedef typename detail::term_traits<T>::value_type       value_type;
 | |
|             typedef typename detail::term_traits<T>::reference        reference;
 | |
|             typedef typename detail::term_traits<T>::const_reference  const_reference;
 | |
| 
 | |
|             literal()
 | |
|               : base_type(terminal_type::make(T()))
 | |
|             {}
 | |
| 
 | |
| #ifndef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
 | |
|             literal(literal const &) = default;
 | |
| #endif
 | |
| 
 | |
|             template<typename U>
 | |
|             literal(U &u)
 | |
|               : base_type(terminal_type::make(u))
 | |
|             {}
 | |
| 
 | |
|             template<typename U>
 | |
|             literal(U const &u)
 | |
|               : base_type(terminal_type::make(u))
 | |
|             {}
 | |
| 
 | |
|             template<typename U>
 | |
|             literal(literal<U, Domain> const &u)
 | |
|               : base_type(terminal_type::make(u.get()))
 | |
|             {}
 | |
| 
 | |
|             BOOST_PROTO_EXTENDS_USING_ASSIGN(literal_t)
 | |
| 
 | |
|             reference get()
 | |
|             {
 | |
|                 return proto::value(*this);
 | |
|             }
 | |
| 
 | |
|             const_reference get() const
 | |
|             {
 | |
|                 return proto::value(*this);
 | |
|             }
 | |
|         };
 | |
|     }
 | |
| 
 | |
|     /// \brief A helper function for creating a \c literal\<\> wrapper.
 | |
|     /// \param t The object to wrap.
 | |
|     /// \return literal\<T &\>(t)
 | |
|     /// \attention The returned value holds the argument by reference.
 | |
|     /// \throw nothrow
 | |
|     template<typename T>
 | |
|     inline literal<T &> const lit(T &t)
 | |
|     {
 | |
|         return literal<T &>(t);
 | |
|     }
 | |
| 
 | |
|     /// \overload
 | |
|     ///
 | |
|     template<typename T>
 | |
|     inline literal<T const &> const lit(T const &t)
 | |
|     {
 | |
|         #ifdef BOOST_MSVC
 | |
|         #pragma warning(push)
 | |
|         #pragma warning(disable: 4180) // warning C4180: qualifier applied to function type has no meaning; ignored
 | |
|         #endif
 | |
| 
 | |
|         return literal<T const &>(t);
 | |
| 
 | |
|         #ifdef BOOST_MSVC
 | |
|         #pragma warning(pop)
 | |
|         #endif
 | |
|     }
 | |
| 
 | |
| }}
 | |
| 
 | |
| #endif
 |