1
2#ifndef BOOST_MPL_EVAL_IF_HPP_INCLUDED
3#define BOOST_MPL_EVAL_IF_HPP_INCLUDED
4
5// Copyright Aleksey Gurtovoy 2000-2004
6//
7// Distributed under the Boost Software License, Version 1.0.
8// (See accompanying file LICENSE_1_0.txt or copy at
9// http://www.boost.org/LICENSE_1_0.txt)
10//
11// See http://www.boost.org/libs/mpl for documentation.
12
13// $Id$
14// $Date$
15// $Revision$
16
17#include <boost/mpl/if.hpp>
18#include <boost/mpl/aux_/na_spec.hpp>
19#include <boost/mpl/aux_/lambda_support.hpp>
20#include <boost/mpl/aux_/config/msvc.hpp>
21#include <boost/mpl/aux_/config/gcc.hpp>
22#include <boost/mpl/aux_/config/workaround.hpp>
23
24namespace boost { namespace mpl {
25
26template<
27 typename BOOST_MPL_AUX_NA_PARAM(C)
28 , typename BOOST_MPL_AUX_NA_PARAM(F1)
29 , typename BOOST_MPL_AUX_NA_PARAM(F2)
30 >
31struct eval_if
32#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \
33 || ( BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, >= 0x0300) \
34 && BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, BOOST_TESTED_AT(0x0304)) \
35 )
36{
37 typedef typename if_<C,F1,F2>::type f_;
38 typedef typename f_::type type;
39#else
40 : if_<C,F1,F2>::type
41{
42#endif
43 BOOST_MPL_AUX_LAMBDA_SUPPORT(3,eval_if,(C,F1,F2))
44};
45
46// (almost) copy & paste in order to save one more
47// recursively nested template instantiation to user
48template<
49 bool C
50 , typename F1
51 , typename F2
52 >
53struct eval_if_c
54#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) \
55 || ( BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, >= 0x0300) \
56 && BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, BOOST_TESTED_AT(0x0304)) \
57 )
58{
59 typedef typename if_c<C,F1,F2>::type f_;
60 typedef typename f_::type type;
61#else
62 : if_c<C,F1,F2>::type
63{
64#endif
65};
66
67BOOST_MPL_AUX_NA_SPEC(3, eval_if)
68
69}}
70
71#endif // BOOST_MPL_EVAL_IF_HPP_INCLUDED
72