// Copyright David Abrahams 2002.

// Distributed under the Boost Software License, Version 1.0. (See

// accompanying file LICENSE_1_0.txt or copy at

// http://www.boost.org/LICENSE_1_0.txt)

#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

