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