literal.hpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. ///////////////////////////////////////////////////////////////////////////////
  2. /// \file literal.hpp
  3. /// The literal\<\> terminal wrapper, and the proto::lit() function for
  4. /// creating literal\<\> wrappers.
  5. //
  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)
  9. #ifndef BOOST_PROTO_LITERAL_HPP_EAN_01_03_2007
  10. #define BOOST_PROTO_LITERAL_HPP_EAN_01_03_2007
  11. #include <boost/config.hpp>
  12. #include <boost/proto/proto_fwd.hpp>
  13. #include <boost/proto/expr.hpp>
  14. #include <boost/proto/traits.hpp>
  15. #include <boost/proto/extends.hpp>
  16. namespace boost { namespace proto
  17. {
  18. namespace utility
  19. {
  20. /// \brief A simple wrapper for a terminal, provided for
  21. /// ease of use.
  22. ///
  23. /// A simple wrapper for a terminal, provided for
  24. /// ease of use. In all cases, <tt>literal\<X\> l(x);</tt>
  25. /// is equivalent to <tt>terminal\<X\>::type l = {x};</tt>.
  26. ///
  27. /// The \c Domain template parameter defaults to
  28. /// \c proto::default_domain.
  29. template<
  30. typename T
  31. , typename Domain // = default_domain
  32. >
  33. struct literal
  34. : extends<basic_expr<tag::terminal, term<T>, 0>, literal<T, Domain>, Domain>
  35. {
  36. private:
  37. typedef basic_expr<tag::terminal, term<T>, 0> terminal_type;
  38. typedef extends<terminal_type, literal<T, Domain>, Domain> base_type;
  39. public:
  40. typedef typename detail::term_traits<T>::value_type value_type;
  41. typedef typename detail::term_traits<T>::reference reference;
  42. typedef typename detail::term_traits<T>::const_reference const_reference;
  43. literal()
  44. : base_type(terminal_type::make(T()))
  45. {}
  46. template<typename U>
  47. literal(U &u)
  48. : base_type(terminal_type::make(u))
  49. {}
  50. template<typename U>
  51. literal(U const &u)
  52. : base_type(terminal_type::make(u))
  53. {}
  54. template<typename U>
  55. literal(literal<U, Domain> const &u)
  56. : base_type(terminal_type::make(u.get()))
  57. {}
  58. BOOST_PROTO_EXTENDS_USING_ASSIGN(literal)
  59. reference get()
  60. {
  61. return proto::value(*this);
  62. }
  63. const_reference get() const
  64. {
  65. return proto::value(*this);
  66. }
  67. };
  68. }
  69. /// \brief A helper function for creating a \c literal\<\> wrapper.
  70. /// \param t The object to wrap.
  71. /// \return literal\<T &\>(t)
  72. /// \attention The returned value holds the argument by reference.
  73. /// \throw nothrow
  74. template<typename T>
  75. inline literal<T &> const lit(T &t)
  76. {
  77. return literal<T &>(t);
  78. }
  79. /// \overload
  80. ///
  81. template<typename T>
  82. inline literal<T const &> const lit(T const &t)
  83. {
  84. #ifdef BOOST_MSVC
  85. #pragma warning(push)
  86. #pragma warning(disable: 4180) // warning C4180: qualifier applied to function type has no meaning; ignored
  87. #endif
  88. return literal<T const &>(t);
  89. #ifdef BOOST_MSVC
  90. #pragma warning(pop)
  91. #endif
  92. }
  93. }}
  94. #endif