1 ///////////////////////////////////////////////////////////////////////////////
3 /// Contains definition of \c term\<\>, \c list1\<\>, \c list2\<\>, ...
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_ARGS_HPP_EAN_04_01_2005
11 #define BOOST_PROTO_ARGS_HPP_EAN_04_01_2005
13 #include <boost/preprocessor/cat.hpp>
14 #include <boost/preprocessor/arithmetic/dec.hpp>
15 #include <boost/preprocessor/iteration/iterate.hpp>
16 #include <boost/preprocessor/repetition/enum_params.hpp>
17 #include <boost/preprocessor/repetition/repeat.hpp>
18 #include <boost/preprocessor/repetition/repeat_from_to.hpp>
19 #include <boost/mpl/if.hpp>
20 #include <boost/mpl/void.hpp>
21 #include <boost/proto/proto_fwd.hpp>
22 #include <boost/proto/detail/is_noncopyable.hpp>
24 #include <boost/mpl/or.hpp>
25 #include <boost/type_traits/is_function.hpp>
26 #include <boost/type_traits/is_abstract.hpp>
28 namespace boost { namespace proto
33 template<typename Expr>
36 typedef Expr value_type;
37 typedef Expr &reference;
38 typedef Expr const &const_reference;
42 template<typename Expr>
43 struct expr_traits<Expr &>
45 typedef Expr value_type;
46 typedef Expr &reference;
47 typedef Expr &const_reference;
51 template<typename Expr>
52 struct expr_traits<Expr const &>
54 typedef Expr value_type;
55 typedef Expr const &reference;
56 typedef Expr const &const_reference;
65 typedef T const &const_reference;
70 struct term_traits<T &>
72 typedef typename mpl::if_c<is_noncopyable<T>::value, T &, T>::type value_type;
74 typedef T &const_reference;
79 struct term_traits<T const &>
82 typedef T const &reference;
83 typedef T const &const_reference;
87 template<typename T, std::size_t N>
88 struct term_traits<T (&)[N]>
90 typedef T value_type[N];
91 typedef T (&reference)[N];
92 typedef T (&const_reference)[N];
96 template<typename T, std::size_t N>
97 struct term_traits<T const (&)[N]>
99 typedef T value_type[N];
100 typedef T const (&reference)[N];
101 typedef T const (&const_reference)[N];
105 template<typename T, std::size_t N>
106 struct term_traits<T[N]>
108 typedef T value_type[N];
109 typedef T (&reference)[N];
110 typedef T const (&const_reference)[N];
114 template<typename T, std::size_t N>
115 struct term_traits<T const[N]>
117 typedef T value_type[N];
118 typedef T const (&reference)[N];
119 typedef T const (&const_reference)[N];
125 // This is where term and all the different listN templates are defined
126 #include <boost/proto/detail/args.hpp>