| [12] | 1 |  | 
|---|
 | 2 | #if !defined(BOOST_PP_IS_ITERATING) | 
|---|
 | 3 |  | 
|---|
 | 4 | ///// header body | 
|---|
 | 5 |  | 
|---|
 | 6 | #ifndef BOOST_MPL_INHERIT_HPP_INCLUDED | 
|---|
 | 7 | #define BOOST_MPL_INHERIT_HPP_INCLUDED | 
|---|
 | 8 |  | 
|---|
 | 9 | // Copyright Aleksey Gurtovoy 2001-2004 | 
|---|
 | 10 | // | 
|---|
 | 11 | // Distributed under the Boost Software License, Version 1.0.  | 
|---|
 | 12 | // (See accompanying file LICENSE_1_0.txt or copy at  | 
|---|
 | 13 | // http://www.boost.org/LICENSE_1_0.txt) | 
|---|
 | 14 | // | 
|---|
 | 15 | // See http://www.boost.org/libs/mpl for documentation. | 
|---|
 | 16 |  | 
|---|
 | 17 | // $Source: /cvsroot/boost/boost/boost/mpl/inherit.hpp,v $ | 
|---|
 | 18 | // $Date: 2004/09/02 15:40:41 $ | 
|---|
 | 19 | // $Revision: 1.5 $ | 
|---|
 | 20 |  | 
|---|
 | 21 | #if !defined(BOOST_MPL_PREPROCESSING_MODE) | 
|---|
 | 22 | #   include <boost/mpl/empty_base.hpp> | 
|---|
 | 23 | #   include <boost/mpl/aux_/na_spec.hpp> | 
|---|
 | 24 | #   include <boost/mpl/aux_/lambda_support.hpp> | 
|---|
 | 25 | #endif | 
|---|
 | 26 |  | 
|---|
 | 27 | #include <boost/mpl/aux_/config/use_preprocessed.hpp> | 
|---|
 | 28 |  | 
|---|
 | 29 | #if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \ | 
|---|
 | 30 |     && !defined(BOOST_MPL_PREPROCESSING_MODE) | 
|---|
 | 31 |  | 
|---|
 | 32 | #   define BOOST_MPL_PREPROCESSED_HEADER inherit.hpp | 
|---|
 | 33 | #   include <boost/mpl/aux_/include_preprocessed.hpp> | 
|---|
 | 34 |  | 
|---|
 | 35 | #else | 
|---|
 | 36 |  | 
|---|
 | 37 | #   include <boost/mpl/limits/arity.hpp> | 
|---|
 | 38 | #   include <boost/mpl/aux_/preprocessor/params.hpp> | 
|---|
 | 39 | #   include <boost/mpl/aux_/preprocessor/default_params.hpp> | 
|---|
 | 40 | #   include <boost/mpl/aux_/preprocessor/enum.hpp> | 
|---|
 | 41 | #   include <boost/mpl/aux_/config/ctps.hpp> | 
|---|
 | 42 | #   include <boost/mpl/aux_/config/dtp.hpp> | 
|---|
 | 43 |  | 
|---|
 | 44 | #   include <boost/preprocessor/iterate.hpp> | 
|---|
 | 45 | #   include <boost/preprocessor/dec.hpp> | 
|---|
 | 46 | #   include <boost/preprocessor/cat.hpp> | 
|---|
 | 47 |  | 
|---|
 | 48 | namespace boost { namespace mpl { | 
|---|
 | 49 |  | 
|---|
 | 50 | // 'inherit<T1,T2,..,Tn>' metafunction; returns an unspecified class type | 
|---|
 | 51 | // produced by public derivation from all metafunction's parameters  | 
|---|
 | 52 | // (T1,T2,..,Tn), except the parameters of 'empty_base' class type;  | 
|---|
 | 53 | // regardless the position and number of 'empty_base' parameters in the  | 
|---|
 | 54 | // metafunction's argument list, derivation from them is always a no-op; | 
|---|
 | 55 | // for instance: | 
|---|
 | 56 | //      inherit<her>::type == her | 
|---|
 | 57 | //      inherit<her,my>::type == struct unspecified : her, my {}; | 
|---|
 | 58 | //      inherit<empty_base,her>::type == her | 
|---|
 | 59 | //      inherit<empty_base,her,empty_base,empty_base>::type == her | 
|---|
 | 60 | //      inherit<her,empty_base,my>::type == struct unspecified : her, my {}; | 
|---|
 | 61 | //      inherit<empty_base,empty_base>::type == empty_base | 
|---|
 | 62 |  | 
|---|
 | 63 | #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) | 
|---|
 | 64 |  | 
|---|
 | 65 | template<  | 
|---|
 | 66 |       typename BOOST_MPL_AUX_NA_PARAM(T1) | 
|---|
 | 67 |     , typename BOOST_MPL_AUX_NA_PARAM(T2) | 
|---|
 | 68 |     >  | 
|---|
 | 69 | struct inherit2 | 
|---|
 | 70 |     : T1, T2 | 
|---|
 | 71 | { | 
|---|
 | 72 |     typedef inherit2 type; | 
|---|
 | 73 |     BOOST_MPL_AUX_LAMBDA_SUPPORT(2, inherit2, (T1,T2)) | 
|---|
 | 74 | }; | 
|---|
 | 75 |  | 
|---|
 | 76 | template< typename T1 >  | 
|---|
 | 77 | struct inherit2<T1,empty_base> | 
|---|
 | 78 | { | 
|---|
 | 79 |     typedef T1 type; | 
|---|
 | 80 |     BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (T1,empty_base)) | 
|---|
 | 81 | }; | 
|---|
 | 82 |  | 
|---|
 | 83 | template< typename T2 >  | 
|---|
 | 84 | struct inherit2<empty_base,T2> | 
|---|
 | 85 | { | 
|---|
 | 86 |     typedef T2 type; | 
|---|
 | 87 |     BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base,T2)) | 
|---|
 | 88 | }; | 
|---|
 | 89 |  | 
|---|
 | 90 | // needed to disambiguate the previous two in case when both  | 
|---|
 | 91 | // T1 and T2 == empty_base | 
|---|
 | 92 | template<>  | 
|---|
 | 93 | struct inherit2<empty_base,empty_base> | 
|---|
 | 94 | { | 
|---|
 | 95 |     typedef empty_base type; | 
|---|
 | 96 |     BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(2, inherit2, (empty_base,empty_base)) | 
|---|
 | 97 | }; | 
|---|
 | 98 |  | 
|---|
 | 99 | #else | 
|---|
 | 100 |  | 
|---|
 | 101 | namespace aux { | 
|---|
 | 102 |  | 
|---|
 | 103 | template< bool C1, bool C2 > | 
|---|
 | 104 | struct inherit2_impl | 
|---|
 | 105 | { | 
|---|
 | 106 |     template< typename Derived, typename T1, typename T2 > struct result_  | 
|---|
 | 107 |         : T1, T2 | 
|---|
 | 108 |     { | 
|---|
 | 109 |         typedef Derived type_; | 
|---|
 | 110 |     }; | 
|---|
 | 111 | }; | 
|---|
 | 112 |  | 
|---|
 | 113 | template<> | 
|---|
 | 114 | struct inherit2_impl<false,true> | 
|---|
 | 115 | { | 
|---|
 | 116 |     template< typename Derived, typename T1, typename T2 > struct result_ | 
|---|
 | 117 |         : T1 | 
|---|
 | 118 |     { | 
|---|
 | 119 |         typedef T1 type_; | 
|---|
 | 120 |     }; | 
|---|
 | 121 | }; | 
|---|
 | 122 |  | 
|---|
 | 123 | template<> | 
|---|
 | 124 | struct inherit2_impl<true,false> | 
|---|
 | 125 | { | 
|---|
 | 126 |     template< typename Derived, typename T1, typename T2 > struct result_ | 
|---|
 | 127 |         : T2  | 
|---|
 | 128 |     { | 
|---|
 | 129 |         typedef T2 type_; | 
|---|
 | 130 |     }; | 
|---|
 | 131 | }; | 
|---|
 | 132 |  | 
|---|
 | 133 | template<> | 
|---|
 | 134 | struct inherit2_impl<true,true> | 
|---|
 | 135 | { | 
|---|
 | 136 |     template< typename Derived, typename T1, typename T2 > struct result_ | 
|---|
 | 137 |     { | 
|---|
 | 138 |         typedef T1 type_; | 
|---|
 | 139 |     }; | 
|---|
 | 140 | }; | 
|---|
 | 141 |  | 
|---|
 | 142 | } // namespace aux | 
|---|
 | 143 |  | 
|---|
 | 144 | template<  | 
|---|
 | 145 |       typename BOOST_MPL_AUX_NA_PARAM(T1) | 
|---|
 | 146 |     , typename BOOST_MPL_AUX_NA_PARAM(T2) | 
|---|
 | 147 |     >  | 
|---|
 | 148 | struct inherit2 | 
|---|
 | 149 |     : aux::inherit2_impl< | 
|---|
 | 150 |           is_empty_base<T1>::value | 
|---|
 | 151 |         , is_empty_base<T2>::value | 
|---|
 | 152 |         >::template result_< inherit2<T1,T2>,T1,T2 > | 
|---|
 | 153 | { | 
|---|
 | 154 |     typedef typename inherit2::type_ type; | 
|---|
 | 155 |     BOOST_MPL_AUX_LAMBDA_SUPPORT(2, inherit2, (T1,T2)) | 
|---|
 | 156 | }; | 
|---|
 | 157 |  | 
|---|
 | 158 | #endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION | 
|---|
 | 159 |  | 
|---|
 | 160 | BOOST_MPL_AUX_NA_SPEC(2, inherit2) | 
|---|
 | 161 |  | 
|---|
 | 162 | #define BOOST_PP_ITERATION_PARAMS_1 \ | 
|---|
 | 163 |     (3,(3, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, <boost/mpl/inherit.hpp>)) | 
|---|
 | 164 | #include BOOST_PP_ITERATE() | 
|---|
 | 165 |  | 
|---|
 | 166 | }} | 
|---|
 | 167 |  | 
|---|
 | 168 | #endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS | 
|---|
 | 169 | #endif // BOOST_MPL_INHERIT_HPP_INCLUDED | 
|---|
 | 170 |  | 
|---|
 | 171 | ///// iteration | 
|---|
 | 172 |  | 
|---|
 | 173 | #else | 
|---|
 | 174 | #define n_ BOOST_PP_FRAME_ITERATION(1) | 
|---|
 | 175 |  | 
|---|
 | 176 | template< | 
|---|
 | 177 |       BOOST_MPL_PP_DEFAULT_PARAMS(n_, typename T, na) | 
|---|
 | 178 |     > | 
|---|
 | 179 | struct BOOST_PP_CAT(inherit,n_) | 
|---|
 | 180 |     : inherit2< | 
|---|
 | 181 |           typename BOOST_PP_CAT(inherit,BOOST_PP_DEC(n_))< | 
|---|
 | 182 |               BOOST_MPL_PP_PARAMS(BOOST_PP_DEC(n_), T) | 
|---|
 | 183 |             >::type | 
|---|
 | 184 |         , BOOST_PP_CAT(T,n_) | 
|---|
 | 185 |         > | 
|---|
 | 186 | { | 
|---|
 | 187 |     BOOST_MPL_AUX_LAMBDA_SUPPORT( | 
|---|
 | 188 |           n_ | 
|---|
 | 189 |         , BOOST_PP_CAT(inherit,n_) | 
|---|
 | 190 |         , (BOOST_MPL_PP_PARAMS(n_, T)) | 
|---|
 | 191 |         ) | 
|---|
 | 192 | }; | 
|---|
 | 193 |  | 
|---|
 | 194 | BOOST_MPL_AUX_NA_SPEC(n_, BOOST_PP_CAT(inherit,n_)) | 
|---|
 | 195 |  | 
|---|
 | 196 | #if n_ == BOOST_MPL_LIMIT_METAFUNCTION_ARITY | 
|---|
 | 197 | /// primary template | 
|---|
 | 198 | template< | 
|---|
 | 199 |       BOOST_MPL_PP_DEFAULT_PARAMS(n_, typename T, empty_base) | 
|---|
 | 200 |     > | 
|---|
 | 201 | struct inherit | 
|---|
 | 202 |     : BOOST_PP_CAT(inherit,n_)<BOOST_MPL_PP_PARAMS(n_, T)> | 
|---|
 | 203 | { | 
|---|
 | 204 | }; | 
|---|
 | 205 |  | 
|---|
 | 206 | // 'na' specialization | 
|---|
 | 207 | template<> | 
|---|
 | 208 | struct inherit< BOOST_MPL_PP_ENUM(5, na) > | 
|---|
 | 209 | { | 
|---|
 | 210 |     template< | 
|---|
 | 211 | #if !defined(BOOST_MPL_CFG_NO_DEFAULT_PARAMETERS_IN_NESTED_TEMPLATES) | 
|---|
 | 212 |           BOOST_MPL_PP_DEFAULT_PARAMS(n_, typename T, empty_base) | 
|---|
 | 213 | #else | 
|---|
 | 214 |           BOOST_MPL_PP_PARAMS(n_, typename T) | 
|---|
 | 215 | #endif | 
|---|
 | 216 |         > | 
|---|
 | 217 |     struct apply | 
|---|
 | 218 |         : inherit< BOOST_MPL_PP_PARAMS(n_, T) > | 
|---|
 | 219 |     { | 
|---|
 | 220 |     }; | 
|---|
 | 221 | }; | 
|---|
 | 222 |  | 
|---|
 | 223 | BOOST_MPL_AUX_NA_SPEC_LAMBDA(n_, inherit) | 
|---|
 | 224 | BOOST_MPL_AUX_NA_SPEC_ARITY(n_, inherit) | 
|---|
 | 225 | BOOST_MPL_AUX_NA_SPEC_TEMPLATE_ARITY(n_, n_, inherit) | 
|---|
 | 226 | #endif | 
|---|
 | 227 |  | 
|---|
 | 228 | #undef n_ | 
|---|
 | 229 | #endif // BOOST_PP_IS_ITERATING | 
|---|