#ifndef IS_INCREMENTABLE_DWA200415_HPP
# define IS_INCREMENTABLE_DWA200415_HPP
+# include <boost/type_traits/detail/bool_trait_def.hpp>
+# include <boost/type_traits/detail/template_arity_spec.hpp>
# include <boost/type_traits/remove_cv.hpp>
+# include <boost/mpl/aux_/lambda_support.hpp>
# include <boost/mpl/bool.hpp>
# include <boost/detail/workaround.hpp>
// This namespace ensures that ADL doesn't mess things up.
namespace is_incrementable_
{
+ // a type returned from operator++ when no increment is found in the
+ // type's own namespace
struct tag {};
-
+
// any soaks up implicit conversions and makes the following
- // operator++ less-preferred than any other such operator which
+ // operator++ less-preferred than any other such operator that
// might be found via ADL.
struct any { template <class T> any(T const&); };
+
+ // This is a last-resort operator++ for when none other is found
+# if BOOST_WORKAROUND(__GNUC__, == 4) && __GNUC_MINOR__ == 0 && __GNUC_PATCHLEVEL__ == 2
+
+}
+
+namespace is_incrementable_2
+{
+ is_incrementable_::tag operator++(is_incrementable_::any const&);
+ is_incrementable_::tag operator++(is_incrementable_::any const&,int);
+}
+using namespace is_incrementable_2;
+
+namespace is_incrementable_
+{
+
+# else
+
tag operator++(any const&);
+ tag operator++(any const&,int);
+
+# endif
+# if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3202)) \
+ || BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+# define BOOST_comma(a,b) (a)
+# else
+ // In case an operator++ is found that returns void, we'll use ++x,0
+ tag operator,(tag,int);
+# define BOOST_comma(a,b) (a,b)
+# endif
+
// two check overloads help us identify which operator++ was picked
char (& check(tag) )[2];
template <class T>
- struct
-# if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
- impl
-# else
- is_incrementable
-# endif
+ struct impl
{
- static typename remove_cv<T>::type& x;
+ static typename boost::remove_cv<T>::type& x;
BOOST_STATIC_CONSTANT(
bool
- , value = sizeof(is_incrementable_::check(++x)) == 1
+ , value = sizeof(is_incrementable_::check(BOOST_comma(++x,0))) == 1
);
+ };
- typedef mpl::bool_<(
-# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
- ::boost::detail::is_incrementable_::is_incrementable<T>::
-# endif
- value)> type;
+ template <class T>
+ struct postfix_impl
+ {
+ static typename boost::remove_cv<T>::type& x;
+
+ BOOST_STATIC_CONSTANT(
+ bool
+ , value = sizeof(is_incrementable_::check(BOOST_comma(x++,0))) == 1
+ );
};
}
-# if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
-template <class T>
-struct is_incrementable : is_incrementable_::impl<T>
-{
+# undef BOOST_comma
+
+template<typename T>
+struct is_incrementable
+BOOST_TT_AUX_BOOL_C_BASE(::boost::detail::is_incrementable_::impl<T>::value)
+{
+ BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(::boost::detail::is_incrementable_::impl<T>::value)
+ BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_incrementable,(T))
};
-# else
-using is_incrementable_::is_incrementable;
-# endif
-}} // namespace boost::detail
+template<typename T>
+struct is_postfix_incrementable
+BOOST_TT_AUX_BOOL_C_BASE(::boost::detail::is_incrementable_::impl<T>::value)
+{
+ BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(::boost::detail::is_incrementable_::postfix_impl<T>::value)
+ BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_postfix_incrementable,(T))
+};
+
+} // namespace detail
+
+BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(1, ::boost::detail::is_incrementable)
+BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(1, ::boost::detail::is_postfix_incrementable)
+
+} // namespace boost
+
#endif // IS_INCREMENTABLE_DWA200415_HPP