blob: 2b041abab0f99936b63ae368ad3d10c7d58a2b80 [file] [log] [blame]
// (C) Copyright David Abrahams 2002.
// (C) Copyright Jeremy Siek 2002.
// (C) Copyright Thomas Witt 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 NDNBOOST_ENABLE_IF_23022003THW_HPP
#define NDNBOOST_ENABLE_IF_23022003THW_HPP
#include <ndnboost/detail/workaround.hpp>
#include <ndnboost/mpl/identity.hpp>
#include <ndnboost/iterator/detail/config_def.hpp>
//
// Boost iterators uses its own enable_if cause we need
// special semantics for deficient compilers.
// 23/02/03 thw
//
namespace ndnboost
{
namespace iterators
{
//
// Base machinery for all kinds of enable if
//
template<bool>
struct enabled
{
template<typename T>
struct base
{
typedef T type;
};
};
//
// For compilers that don't support "Substitution Failure Is Not An Error"
// enable_if falls back to always enabled. See comments
// on operator implementation for consequences.
//
template<>
struct enabled<false>
{
template<typename T>
struct base
{
#ifdef NDNBOOST_NO_SFINAE
typedef T type;
// This way to do it would give a nice error message containing
// invalid overload, but has the big disadvantage that
// there is no reference to user code in the error message.
//
// struct invalid_overload;
// typedef invalid_overload type;
//
#endif
};
};
template <class Cond,
class Return>
struct enable_if
# if !defined(NDNBOOST_NO_SFINAE) && !defined(NDNBOOST_NO_IS_CONVERTIBLE)
: enabled<(Cond::value)>::template base<Return>
# else
: mpl::identity<Return>
# endif
{
# if NDNBOOST_WORKAROUND(NDNBOOST_MSVC, < 1300)
typedef Return type;
# endif
};
} // namespace iterators
} // namespace ndnboost
#include <ndnboost/iterator/detail/config_undef.hpp>
#endif // NDNBOOST_ENABLE_IF_23022003THW_HPP