]> git.lyx.org Git - lyx.git/blobdiff - boost/boost/detail/is_incrementable.hpp
Fixed some lines that were too long. It compiled afterwards.
[lyx.git] / boost / boost / detail / is_incrementable.hpp
old mode 100755 (executable)
new mode 100644 (file)
index 3054ced..cb7d7a7
@@ -4,10 +4,15 @@
 #ifndef IS_INCREMENTABLE_DWA200415_HPP
 # define IS_INCREMENTABLE_DWA200415_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>
 
+// Must be the last include
+# include <boost/type_traits/detail/bool_trait_def.hpp>
+
 namespace boost { namespace detail { 
 
 // is_incrementable<T> metafunction
@@ -19,14 +24,46 @@ namespace boost { namespace detail {
 // 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];
   
@@ -35,37 +72,53 @@ namespace is_incrementable_
   
 
   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
+
+# include <boost/type_traits/detail/bool_trait_undef.hpp>
 
 #endif // IS_INCREMENTABLE_DWA200415_HPP