| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 | ////////////////////////////////////////////////////////////////////////////////// \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
 |