Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: /// \file literal.hpp Chris@16: /// The literal\<\> terminal wrapper, and the proto::lit() function for Chris@16: /// creating literal\<\> wrappers. Chris@16: // Chris@16: // Copyright 2008 Eric Niebler. Distributed under the Boost Chris@16: // Software License, Version 1.0. (See accompanying file Chris@16: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: #ifndef BOOST_PROTO_LITERAL_HPP_EAN_01_03_2007 Chris@16: #define BOOST_PROTO_LITERAL_HPP_EAN_01_03_2007 Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace proto Chris@16: { Chris@16: namespace utility Chris@16: { Chris@16: /// \brief A simple wrapper for a terminal, provided for Chris@16: /// ease of use. Chris@16: /// Chris@16: /// A simple wrapper for a terminal, provided for Chris@16: /// ease of use. In all cases, literal\ l(x); Chris@16: /// is equivalent to terminal\::type l = {x};. Chris@16: /// Chris@16: /// The \c Domain template parameter defaults to Chris@16: /// \c proto::default_domain. Chris@16: template< Chris@16: typename T Chris@16: , typename Domain // = default_domain Chris@16: > Chris@16: struct literal Chris@16: : extends, 0>, literal, Domain> Chris@16: { Chris@16: private: Chris@16: typedef basic_expr, 0> terminal_type; Chris@16: typedef extends, Domain> base_type; Chris@16: typedef literal literal_t; Chris@16: Chris@16: public: Chris@16: typedef typename detail::term_traits::value_type value_type; Chris@16: typedef typename detail::term_traits::reference reference; Chris@16: typedef typename detail::term_traits::const_reference const_reference; Chris@16: Chris@16: literal() Chris@16: : base_type(terminal_type::make(T())) Chris@16: {} Chris@16: Chris@16: template Chris@16: literal(U &u) Chris@16: : base_type(terminal_type::make(u)) Chris@16: {} Chris@16: Chris@16: template Chris@16: literal(U const &u) Chris@16: : base_type(terminal_type::make(u)) Chris@16: {} Chris@16: Chris@16: template Chris@16: literal(literal const &u) Chris@16: : base_type(terminal_type::make(u.get())) Chris@16: {} Chris@16: Chris@16: BOOST_PROTO_EXTENDS_USING_ASSIGN(literal_t) Chris@16: Chris@16: reference get() Chris@16: { Chris@16: return proto::value(*this); Chris@16: } Chris@16: Chris@16: const_reference get() const Chris@16: { Chris@16: return proto::value(*this); Chris@16: } Chris@16: }; Chris@16: } Chris@16: Chris@16: /// \brief A helper function for creating a \c literal\<\> wrapper. Chris@16: /// \param t The object to wrap. Chris@16: /// \return literal\(t) Chris@16: /// \attention The returned value holds the argument by reference. Chris@16: /// \throw nothrow Chris@16: template Chris@16: inline literal const lit(T &t) Chris@16: { Chris@16: return literal(t); Chris@16: } Chris@16: Chris@16: /// \overload Chris@16: /// Chris@16: template Chris@16: inline literal const lit(T const &t) Chris@16: { Chris@16: #ifdef BOOST_MSVC Chris@16: #pragma warning(push) Chris@16: #pragma warning(disable: 4180) // warning C4180: qualifier applied to function type has no meaning; ignored Chris@16: #endif Chris@16: Chris@16: return literal(t); Chris@16: Chris@16: #ifdef BOOST_MSVC Chris@16: #pragma warning(pop) Chris@16: #endif Chris@16: } Chris@16: Chris@16: }} Chris@16: Chris@16: #endif