]> git.lyx.org Git - features.git/blobdiff - boost/boost/iterator/is_lvalue_iterator.hpp
boost: add eol property
[features.git] / boost / boost / iterator / is_lvalue_iterator.hpp
index 1db6ee4329b5915205abe12f83828dc331cbcbc9..3beb90df6d6869b38f3e714ade86cc2a570227fe 100644 (file)
-// Copyright David Abrahams 2003. Use, modification and distribution is\r
-// subject to the Boost Software License, Version 1.0. (See accompanying\r
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\r
-#ifndef IS_LVALUE_ITERATOR_DWA2003112_HPP\r
-# define IS_LVALUE_ITERATOR_DWA2003112_HPP\r
-\r
-#include <boost/iterator.hpp>\r
-\r
-#include <boost/detail/workaround.hpp>\r
-#include <boost/detail/iterator.hpp>\r
-\r
-#include <boost/iterator/detail/any_conversion_eater.hpp>\r
-\r
-// should be the last #includes\r
-#include <boost/type_traits/detail/bool_trait_def.hpp>\r
-#include <boost/iterator/detail/config_def.hpp>\r
-\r
-#ifndef BOOST_NO_IS_CONVERTIBLE\r
-\r
-namespace boost {\r
\r
-namespace detail\r
-{\r
-#ifndef BOOST_NO_LVALUE_RETURN_DETECTION\r
-  // Calling lvalue_preserver( <expression>, 0 ) returns a reference\r
-  // to the expression's result if <expression> is an lvalue, or\r
-  // not_an_lvalue() otherwise.\r
-  struct not_an_lvalue {};\r
-  \r
-  template <class T>\r
-  T& lvalue_preserver(T&, int);\r
-  \r
-  template <class U>\r
-  not_an_lvalue lvalue_preserver(U const&, ...);\r
-  \r
-# define BOOST_LVALUE_PRESERVER(expr) detail::lvalue_preserver(expr,0)\r
-  \r
-#else\r
-  \r
-# define BOOST_LVALUE_PRESERVER(expr) expr\r
-  \r
-#endif \r
-\r
-  // Guts of is_lvalue_iterator.  Value is the iterator's value_type\r
-  // and the result is computed in the nested rebind template.\r
-  template <class Value>\r
-  struct is_lvalue_iterator_impl\r
-  {\r
-      // Eat implicit conversions so we don't report true for things\r
-      // convertible to Value const&\r
-      struct conversion_eater\r
-      {\r
-          conversion_eater(Value&);\r
-      };\r
-\r
-      static char tester(conversion_eater, int);\r
-      static char (& tester(any_conversion_eater, ...) )[2];\r
-    \r
-      template <class It>\r
-      struct rebind\r
-      {\r
-          static It& x;\r
-          \r
-          BOOST_STATIC_CONSTANT(\r
-              bool\r
-            , value = (\r
-                sizeof(\r
-                    is_lvalue_iterator_impl<Value>::tester(\r
-                        BOOST_LVALUE_PRESERVER(*x), 0\r
-                    )\r
-                ) == 1\r
-            )\r
-          );\r
-      };\r
-  };\r
-\r
-#undef BOOST_LVALUE_PRESERVER\r
-  \r
-  //\r
-  // void specializations to handle std input and output iterators\r
-  //\r
-  template <>\r
-  struct is_lvalue_iterator_impl<void>\r
-  {\r
-      template <class It>\r
-      struct rebind : boost::mpl::false_\r
-      {};\r
-  };\r
-\r
-#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS\r
-  template <>\r
-  struct is_lvalue_iterator_impl<const void>\r
-  {\r
-      template <class It>\r
-      struct rebind : boost::mpl::false_\r
-      {};\r
-  };\r
-\r
-  template <>\r
-  struct is_lvalue_iterator_impl<volatile void>\r
-  {\r
-      template <class It>\r
-      struct rebind : boost::mpl::false_\r
-      {};\r
-  };\r
-\r
-  template <>\r
-  struct is_lvalue_iterator_impl<const volatile void>\r
-  {\r
-      template <class It>\r
-      struct rebind : boost::mpl::false_\r
-      {};\r
-  };\r
-#endif\r
-\r
-  //\r
-  // This level of dispatching is required for Borland.  We might save\r
-  // an instantiation by removing it for others.\r
-  //\r
-  template <class It>\r
-  struct is_readable_lvalue_iterator_impl\r
-    : is_lvalue_iterator_impl<\r
-          BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits<It>::value_type const\r
-      >::template rebind<It>\r
-  {};\r
-\r
-  template <class It>\r
-  struct is_non_const_lvalue_iterator_impl\r
-    : is_lvalue_iterator_impl<\r
-          BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits<It>::value_type\r
-      >::template rebind<It>\r
-  {};\r
-} // namespace detail\r
-\r
-// Define the trait with full mpl lambda capability and various broken\r
-// compiler workarounds\r
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(\r
-    is_lvalue_iterator,T,::boost::detail::is_readable_lvalue_iterator_impl<T>::value)\r
-    \r
-BOOST_TT_AUX_BOOL_TRAIT_DEF1(\r
-    is_non_const_lvalue_iterator,T,::boost::detail::is_non_const_lvalue_iterator_impl<T>::value)\r
-    \r
-} // namespace boost\r
-\r
-#endif\r
-\r
-#include <boost/iterator/detail/config_undef.hpp>\r
-#include <boost/type_traits/detail/bool_trait_undef.hpp>\r
-\r
-#endif // IS_LVALUE_ITERATOR_DWA2003112_HPP\r
+// Copyright David Abrahams 2003. Use, modification and distribution is
+// subject to 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 IS_LVALUE_ITERATOR_DWA2003112_HPP
+# define IS_LVALUE_ITERATOR_DWA2003112_HPP
+
+#include <boost/iterator.hpp>
+
+#include <boost/detail/workaround.hpp>
+#include <boost/detail/iterator.hpp>
+
+#include <boost/iterator/detail/any_conversion_eater.hpp>
+
+// should be the last #includes
+#include <boost/type_traits/detail/bool_trait_def.hpp>
+#include <boost/iterator/detail/config_def.hpp>
+
+#ifndef BOOST_NO_IS_CONVERTIBLE
+
+namespace boost {
+namespace detail
+{
+#ifndef BOOST_NO_LVALUE_RETURN_DETECTION
+  // Calling lvalue_preserver( <expression>, 0 ) returns a reference
+  // to the expression's result if <expression> is an lvalue, or
+  // not_an_lvalue() otherwise.
+  struct not_an_lvalue {};
+  
+  template <class T>
+  T& lvalue_preserver(T&, int);
+  
+  template <class U>
+  not_an_lvalue lvalue_preserver(U const&, ...);
+  
+# define BOOST_LVALUE_PRESERVER(expr) detail::lvalue_preserver(expr,0)
+  
+#else
+  
+# define BOOST_LVALUE_PRESERVER(expr) expr
+  
+#endif 
+
+  // Guts of is_lvalue_iterator.  Value is the iterator's value_type
+  // and the result is computed in the nested rebind template.
+  template <class Value>
+  struct is_lvalue_iterator_impl
+  {
+      // Eat implicit conversions so we don't report true for things
+      // convertible to Value const&
+      struct conversion_eater
+      {
+          conversion_eater(Value&);
+      };
+
+      static char tester(conversion_eater, int);
+      static char (& tester(any_conversion_eater, ...) )[2];
+    
+      template <class It>
+      struct rebind
+      {
+          static It& x;
+          
+          BOOST_STATIC_CONSTANT(
+              bool
+            , value = (
+                sizeof(
+                    is_lvalue_iterator_impl<Value>::tester(
+                        BOOST_LVALUE_PRESERVER(*x), 0
+                    )
+                ) == 1
+            )
+          );
+      };
+  };
+
+#undef BOOST_LVALUE_PRESERVER
+  
+  //
+  // void specializations to handle std input and output iterators
+  //
+  template <>
+  struct is_lvalue_iterator_impl<void>
+  {
+      template <class It>
+      struct rebind : boost::mpl::false_
+      {};
+  };
+
+#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
+  template <>
+  struct is_lvalue_iterator_impl<const void>
+  {
+      template <class It>
+      struct rebind : boost::mpl::false_
+      {};
+  };
+
+  template <>
+  struct is_lvalue_iterator_impl<volatile void>
+  {
+      template <class It>
+      struct rebind : boost::mpl::false_
+      {};
+  };
+
+  template <>
+  struct is_lvalue_iterator_impl<const volatile void>
+  {
+      template <class It>
+      struct rebind : boost::mpl::false_
+      {};
+  };
+#endif
+
+  //
+  // This level of dispatching is required for Borland.  We might save
+  // an instantiation by removing it for others.
+  //
+  template <class It>
+  struct is_readable_lvalue_iterator_impl
+    : is_lvalue_iterator_impl<
+          BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits<It>::value_type const
+      >::template rebind<It>
+  {};
+
+  template <class It>
+  struct is_non_const_lvalue_iterator_impl
+    : is_lvalue_iterator_impl<
+          BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits<It>::value_type
+      >::template rebind<It>
+  {};
+} // namespace detail
+
+// Define the trait with full mpl lambda capability and various broken
+// compiler workarounds
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(
+    is_lvalue_iterator,T,::boost::detail::is_readable_lvalue_iterator_impl<T>::value)
+    
+BOOST_TT_AUX_BOOL_TRAIT_DEF1(
+    is_non_const_lvalue_iterator,T,::boost::detail::is_non_const_lvalue_iterator_impl<T>::value)
+    
+} // namespace boost
+
+#endif
+
+#include <boost/iterator/detail/config_undef.hpp>
+#include <boost/type_traits/detail/bool_trait_undef.hpp>
+
+#endif // IS_LVALUE_ITERATOR_DWA2003112_HPP