]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | //----------------------------------------------------------------------------- |
2 | // boost variant/detail/enable_recursive_fwd.hpp header file | |
3 | // See http://www.boost.org for updates, documentation, and revision history. | |
4 | //----------------------------------------------------------------------------- | |
5 | // | |
6 | // Copyright (c) 2003 | |
7 | // Eric Friedman | |
8 | // | |
9 | // Distributed under the Boost Software License, Version 1.0. (See | |
10 | // accompanying file LICENSE_1_0.txt or copy at | |
11 | // http://www.boost.org/LICENSE_1_0.txt) | |
12 | ||
13 | #ifndef BOOST_VARIANT_DETAIL_ENABLE_RECURSIVE_FWD_HPP | |
14 | #define BOOST_VARIANT_DETAIL_ENABLE_RECURSIVE_FWD_HPP | |
15 | ||
16 | #include <boost/mpl/aux_/config/ctps.hpp> | |
17 | ||
18 | #include <boost/mpl/bool_fwd.hpp> | |
19 | ||
20 | # include <boost/mpl/bool.hpp> | |
21 | ||
22 | namespace boost { | |
23 | namespace detail { namespace variant { | |
24 | ||
25 | /////////////////////////////////////////////////////////////////////////////// | |
26 | // (detail) tag recursive_flag | |
27 | // | |
28 | // Signifies that the variant should perform recursive substituion. | |
29 | // | |
30 | ||
31 | ||
32 | template <typename T> | |
33 | struct recursive_flag | |
34 | { | |
35 | typedef T type; | |
36 | }; | |
37 | ||
38 | ||
39 | /////////////////////////////////////////////////////////////////////////////// | |
40 | // (detail) metafunction is_recursive_flag | |
41 | // | |
42 | // Signifies that the variant should perform recursive substituion. | |
43 | // | |
44 | ||
45 | ||
46 | template <typename T> | |
47 | struct is_recursive_flag | |
48 | : mpl::false_ | |
49 | { | |
50 | }; | |
51 | ||
52 | template <typename T> | |
53 | struct is_recursive_flag< recursive_flag<T> > | |
54 | : mpl::true_ | |
55 | { | |
56 | }; | |
57 | ||
58 | ||
59 | /////////////////////////////////////////////////////////////////////////////// | |
60 | // (detail) metafunction enable_recursive | |
61 | // | |
62 | // Attempts recursive_variant_ tag substitution, wrapping with | |
63 | // boost::recursive_wrapper if substituion occurs w/ non-indirect result | |
64 | // (i.e., not a reference or pointer) *and* NoWrapper is false_. | |
65 | // | |
66 | template < | |
67 | typename T | |
68 | , typename RecursiveVariant | |
69 | , typename NoWrapper = mpl::false_ | |
70 | > | |
71 | struct enable_recursive; | |
72 | ||
73 | /////////////////////////////////////////////////////////////////////////////// | |
74 | // (detail) metafunction class quoted_enable_recursive | |
75 | // | |
76 | // Same behavior as enable_recursive metafunction (see above). | |
77 | // | |
78 | template < | |
79 | typename RecursiveVariant | |
80 | , typename NoWrapper = mpl::false_ | |
81 | > | |
82 | struct quoted_enable_recursive; | |
83 | ||
84 | }} // namespace detail::variant | |
85 | } // namespace boost | |
86 | ||
87 | #endif // BOOST_VARIANT_DETAIL_ENABLE_RECURSIVE_FWD_HPP |