//-----------------------------------------------------------------------------

// boost variant/detail/generic_result_type.hpp header file

// See http://www.boost.org for updates, documentation, and revision history.

//-----------------------------------------------------------------------------

//

// Copyright (c) 2003

// Eric Friedman

//

// 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 BOOST_VARIANT_DETAIL_GENERIC_RESULT_TYPE_HPP

#define BOOST_VARIANT_DETAIL_GENERIC_RESULT_TYPE_HPP



#include "boost/config.hpp"



//////////////////////////////////////////////////////////////////////////

// (workaround) macro BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE

//

// On compilers with BOOST_NO_VOID_RETURNS, this macro provides a route

// to a single syntax for dealing with template functions that may (but

// not necessarily) return nothing (i.e. void).

//

// BOOST_VARIANT_AUX_RETURN_VOID provided for compilers w/ (erroneous?)

// warnings about non-void functions not returning a value.

//



#if !defined(BOOST_NO_VOID_RETURNS)



#define BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(T) \

    T   \

    /**/



#define BOOST_VARIANT_AUX_RETURN_VOID  \

    /**/



#define BOOST_VARIANT_AUX_RETURN_VOID_TYPE \

    void    \

    /**/



#else // defined(BOOST_NO_VOID_RETURNS)



namespace boost {

namespace detail { namespace variant {



struct fake_return_void

{

    fake_return_void()

    {

    }



    template <typename T>

    fake_return_void(const T&)

    {

    }

};



template <typename T>

struct no_void_returns_helper

{

    typedef T type;

};



template <>

struct no_void_returns_helper<void>

{

    typedef fake_return_void type;

};



}} // namespace detail::variant

} // namespace boost



#define BOOST_VARIANT_AUX_GENERIC_RESULT_TYPE(T) \

    BOOST_DEDUCED_TYPENAME                                           \

        ::boost::detail::variant::no_void_returns_helper< T >::type  \

    /**/



#define BOOST_VARIANT_AUX_RETURN_VOID  \

    return ::boost::detail::variant::fake_return_void()     \

    /**/



#define BOOST_VARIANT_AUX_RETURN_VOID_TYPE  \

    ::boost::detail::variant::fake_return_void



#endif // BOOST_NO_VOID_RETURNS workaround



#endif // BOOST_VARIANT_DETAIL_GENERIC_RESULT_TYPE_HPP

