source: NonGTP/Boost/boost/variant/recursive_wrapper_fwd.hpp @ 857

Revision 857, 3.6 KB checked in by igarcia, 18 years ago (diff)
Line 
1//-----------------------------------------------------------------------------
2// boost variant/recursive_wrapper_fwd.hpp header file
3// See http://www.boost.org for updates, documentation, and revision history.
4//-----------------------------------------------------------------------------
5//
6// Copyright (c) 2002
7// Eric Friedman, Itay Maman
8//
9// Portions Copyright (C) 2002 David Abrahams
10//
11// Distributed under the Boost Software License, Version 1.0. (See
12// accompanying file LICENSE_1_0.txt or copy at
13// http://www.boost.org/LICENSE_1_0.txt)
14
15#ifndef BOOST_VARIANT_RECURSIVE_WRAPPER_FWD_HPP
16#define BOOST_VARIANT_RECURSIVE_WRAPPER_FWD_HPP
17
18#include "boost/mpl/aux_/config/ctps.hpp"
19#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
20#   include "boost/mpl/eval_if.hpp"
21#   include "boost/mpl/bool.hpp"
22#   include "boost/mpl/identity.hpp"
23#   include "boost/type.hpp"
24#endif
25
26#include "boost/type_traits/detail/bool_trait_def.hpp"
27#include "boost/mpl/aux_/lambda_support.hpp"
28
29namespace boost {
30
31//////////////////////////////////////////////////////////////////////////
32// class template recursive_wrapper
33//
34// Enables recursive types in templates by breaking cyclic dependencies.
35//
36// For example:
37//
38//   class my;
39//
40//   typedef variant< int, recursive_wrapper<my> > var;
41//
42//   class my {
43//     var var_;
44//     ...
45//   };
46//
47template <typename T> class recursive_wrapper;
48
49///////////////////////////////////////////////////////////////////////////////
50// metafunction is_recursive_wrapper (modeled on code by David Abrahams)
51//
52// True iff specified type matches recursive_wrapper<T>.
53//
54
55namespace detail {
56
57#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
58
59template <typename T>
60struct is_recursive_wrapper_impl
61    : mpl::false_
62{
63};
64
65template <typename T>
66struct is_recursive_wrapper_impl< recursive_wrapper<T> >
67    : mpl::true_
68{
69};
70
71#else // defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
72
73typedef char (&yes_recursive_wrapper_t)[1];
74typedef char (&no_recursive_wrapper_t)[2];
75
76no_recursive_wrapper_t is_recursive_wrapper_test(...);
77
78template<typename T>
79yes_recursive_wrapper_t is_recursive_wrapper_test(
80      type< ::boost::recursive_wrapper<T> >
81    );
82
83template<typename T>
84struct is_recursive_wrapper_impl
85{
86    BOOST_STATIC_CONSTANT(bool, value = (
87          sizeof(is_recursive_wrapper_test(type<T>()))
88          == sizeof(yes_recursive_wrapper_t)
89        ));
90};
91
92#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION workaround
93
94} // namespace detail
95
96BOOST_TT_AUX_BOOL_TRAIT_DEF1(
97      is_recursive_wrapper
98    , T
99    , (::boost::detail::is_recursive_wrapper_impl<T>::value)
100    )
101
102///////////////////////////////////////////////////////////////////////////////
103// metafunction unwrap_recursive
104//
105// If specified type T matches recursive_wrapper<U>, then U; else T.
106//
107
108#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
109
110template <typename T>
111struct unwrap_recursive
112{
113    typedef T type;
114
115    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,unwrap_recursive,(T))
116};
117
118template <typename T>
119struct unwrap_recursive< recursive_wrapper<T> >
120{
121    typedef T type;
122
123    BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(1,unwrap_recursive,(T))
124};
125
126#else // defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
127
128template <typename T>
129struct unwrap_recursive
130    : mpl::eval_if<
131          is_recursive_wrapper<T>
132        , T
133        , mpl::identity< T >
134        >
135{
136    BOOST_MPL_AUX_LAMBDA_SUPPORT(1,unwrap_recursive,(T))
137};
138
139#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION workaround
140
141} // namespace boost
142
143#endif // BOOST_VARIANT_RECURSIVE_WRAPPER_FWD_HPP
Note: See TracBrowser for help on using the repository browser.