diff options
Diffstat (limited to '3rdParty/Boost/src/boost/proto/literal.hpp')
-rw-r--r-- | 3rdParty/Boost/src/boost/proto/literal.hpp | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/3rdParty/Boost/src/boost/proto/literal.hpp b/3rdParty/Boost/src/boost/proto/literal.hpp new file mode 100644 index 0000000..accab5f --- /dev/null +++ b/3rdParty/Boost/src/boost/proto/literal.hpp @@ -0,0 +1,112 @@ +/////////////////////////////////////////////////////////////////////////////// +/// \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 |