| /////////////////////////////////////////////////////////////////////////////// |
| /// \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())) |
| {} |
| |
| 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 |