1 ///////////////////////////////////////////////////////////////////////////////
3 /// The literal\<\> terminal wrapper, and the proto::lit() function for
4 /// creating literal\<\> wrappers.
6 // Copyright 2008 Eric Niebler. Distributed under the Boost
7 // Software License, Version 1.0. (See accompanying file
8 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
10 #ifndef BOOST_PROTO_LITERAL_HPP_EAN_01_03_2007
11 #define BOOST_PROTO_LITERAL_HPP_EAN_01_03_2007
13 #include <boost/config.hpp>
14 #include <boost/proto/proto_fwd.hpp>
15 #include <boost/proto/expr.hpp>
16 #include <boost/proto/traits.hpp>
17 #include <boost/proto/extends.hpp>
19 namespace boost { namespace proto
23 /// \brief A simple wrapper for a terminal, provided for
26 /// A simple wrapper for a terminal, provided for
27 /// ease of use. In all cases, <tt>literal\<X\> l(x);</tt>
28 /// is equivalent to <tt>terminal\<X\>::type l = {x};</tt>.
30 /// The \c Domain template parameter defaults to
31 /// \c proto::default_domain.
34 , typename Domain // = default_domain
37 : extends<basic_expr<tag::terminal, term<T>, 0>, literal<T, Domain>, Domain>
40 typedef basic_expr<tag::terminal, term<T>, 0> terminal_type;
41 typedef extends<terminal_type, literal<T, Domain>, Domain> base_type;
42 typedef literal<T, Domain> literal_t;
45 typedef typename detail::term_traits<T>::value_type value_type;
46 typedef typename detail::term_traits<T>::reference reference;
47 typedef typename detail::term_traits<T>::const_reference const_reference;
50 : base_type(terminal_type::make(T()))
53 #ifndef BOOST_NO_CXX11_DEFAULTED_FUNCTIONS
54 literal(literal const &) = default;
59 : base_type(terminal_type::make(u))
64 : base_type(terminal_type::make(u))
68 literal(literal<U, Domain> const &u)
69 : base_type(terminal_type::make(u.get()))
72 BOOST_PROTO_EXTENDS_USING_ASSIGN(literal_t)
76 return proto::value(*this);
79 const_reference get() const
81 return proto::value(*this);
86 /// \brief A helper function for creating a \c literal\<\> wrapper.
87 /// \param t The object to wrap.
88 /// \return literal\<T &\>(t)
89 /// \attention The returned value holds the argument by reference.
92 inline literal<T &> const lit(T &t)
94 return literal<T &>(t);
100 inline literal<T const &> const lit(T const &t)
103 #pragma warning(push)
104 #pragma warning(disable: 4180) // warning C4180: qualifier applied to function type has no meaning; ignored
107 return literal<T const &>(t);