// Copyright David Abrahams 2002. Permission to copy, use,
// modify, sell and distribute this software is granted provided this
// copyright notice appears in all copies. This software is provided
// "as is" without express or implied warranty, and with no claim as
// to its suitability for any purpose.
#ifndef IF_ELSE_DWA2002322_HPP
# define IF_ELSE_DWA2002322_HPP
# include <boost/config.hpp>

namespace boost { namespace python { namespace detail { 

template <class T> struct elif_selected;

template <class T>
struct if_selected
{
    template <bool b>
    struct elif : elif_selected<T>
    {
    };

    template <class U>
    struct else_
    {
        typedef T type;
    };
};

# if defined(BOOST_MSVC) && (BOOST_MSVC == 1300)
namespace msvc70_aux {

template< bool > struct inherit_from
{
    template< typename T > struct result
    {
        typedef T type;
    };
};

template<> struct inherit_from<true>
{
    template< typename T > struct result
    {
        struct type {};
    };
};

template< typename T >
struct never_true
{
    BOOST_STATIC_CONSTANT(bool, value = false);
};

} // namespace msvc70_aux

#endif // # if defined(BOOST_MSVC) && (BOOST_MSVC == 1300)

template <class T>
struct elif_selected
{
# if !(defined(BOOST_MSVC) && BOOST_MSVC <= 1300 || defined(__MWERKS__) && __MWERKS__ <= 0x2407)
    template <class U> class then;
# elif defined(BOOST_MSVC) && (BOOST_MSVC == 1300)
    template <class U>
    struct then : msvc70_aux::inherit_from< msvc70_aux::never_true<U>::value >
        ::template result< if_selected<T> >::type
    {
    };
# else
    template <class U>
    struct then : if_selected<T>
    {
    };
# endif 
};

# if !(defined(BOOST_MSVC) && BOOST_MSVC <= 1300 || defined(__MWERKS__) && __MWERKS__ <= 0x2407)
template <class T>
template <class U>
class elif_selected<T>::then : public if_selected<T>
{
};
# endif 

template <bool b> struct if_
{
    template <class T>
    struct then : if_selected<T>
    {
    };
};

struct if_unselected
{
    template <bool b> struct elif : if_<b>
    {
    };

    template <class U>
    struct else_
    {
        typedef U type;
    };
};

template <>
struct if_<false>
{
    template <class T>
    struct then : if_unselected
    {
    };
};

}}} // namespace boost::python::detail

#endif // IF_ELSE_DWA2002322_HPP
