
Changes made while bringing boost/concept_check.hpp to v3's concept_check.h:

1)  File format changed from DOS to Unix.
2)  Boost config.hpp and other workaround files dropped (unneeded in g++ v3).
3)  Conditionally-compiled code depending on those "breakage" macros was
    removed, or not, depending on the macro, so that the macros themselves
    are gone.  Since the same code would always be compiled, let's make it
    easier on the reader and a few milliseconds faster for cpplib.
4)  Tests for NDEBUG were removed; if NDEBUG is defined, none of the checking
    code will even be included.
5)  BOOST_CLASS_REQUIRES* changed to accept a namespace parameter.
6)  SameTypeConcept added (simple wrapper around existing code).
7)  An unused variable in OutputIteratorConcept was removed.

At checkin, this was the exact diff, modulo the end-of-line character changes:


--- concept_check.hpp.orig	Sun Apr  1 08:59:46 2001
+++ boost_concept_check.h	Mon Apr  2 18:56:41 2001
@@ -5,20 +5,15 @@
 // "as is" without express or implied warranty, and with no claim as
 // to its suitability for any purpose.
 //
+
+// GCC Note:  based on version 1.12.0 of the Boost library.
 #ifndef BOOST_CONCEPT_CHECKS_HPP
 #define BOOST_CONCEPT_CHECKS_HPP
 
-#include <boost/config.hpp>
-#include <boost/iterator.hpp>
-#include <boost/iterator.hpp>
-#include <utility>
-#include <boost/pending/limits.hpp>
-
-#if (__GNUC__) || defined(__KCC) || defined(__ghs) || defined(__MWERKS__)
-#define BOOST_FPTR &
-#else
-#define BOOST_FPTR
-#endif
+#pragma GCC system_header
+#include <bits/stl_iterator_base_types.h>    // for traits and tags
+#include <utility>                           // for pair<>
+
 
 namespace boost {
 
@@ -27,80 +22,64 @@
 template <class Concept>
 void function_requires()
 {
-#if !defined(NDEBUG)
-  void (Concept::*x)() = BOOST_FPTR Concept::constraints;
+  void (Concept::*x)() = &Concept::constraints;
   ignore_unused_variable_warning(x);
-#endif
 }
 
-// The BOOST_CLASS_REQUIRES macros use function pointers as
-// template parameters, which VC++ does not support.
-
-#if defined(BOOST_NO_FUNCTION_PTR_TEMPLATE_PARAMETERS)
-
-#define BOOST_CLASS_REQUIRES(type_var, concept)
-#define BOOST_CLASS_REQUIRES2(type_var1, type_var2, concept)
-#define BOOST_CLASS_REQUIRES3(type_var1, type_var2, type_var3, concept)
-#define BOOST_CLASS_REQUIRES4(type_var1, type_var2, type_var3, type_var4, concept)
 
-#else
-
-#define BOOST_CLASS_REQUIRES(type_var, concept) \
-  typedef void (concept <type_var>::* func##type_var##concept)(); \
+#define BOOST_CLASS_REQUIRES(type_var, ns, concept) \
+  typedef void (ns::concept <type_var>::* func##type_var##concept)(); \
   template <func##type_var##concept _Tp1> \
   struct concept_checking_##type_var##concept { }; \
   typedef concept_checking_##type_var##concept< \
-    BOOST_FPTR concept <type_var>::constraints> \
+    &ns::concept <type_var>::constraints> \
     concept_checking_typedef_##type_var##concept
 
-#define BOOST_CLASS_REQUIRES2(type_var1, type_var2, concept) \
-  typedef void (concept <type_var1,type_var2>::* func##type_var1##type_var2##concept)(); \
+#define BOOST_CLASS_REQUIRES2(type_var1, type_var2, ns, concept) \
+  typedef void (ns::concept <type_var1,type_var2>::* func##type_var1##type_var2##concept)(); \
   template <func##type_var1##type_var2##concept _Tp1> \
   struct concept_checking_##type_var1##type_var2##concept { }; \
   typedef concept_checking_##type_var1##type_var2##concept< \
-    BOOST_FPTR concept <type_var1,type_var2>::constraints> \
+    &ns::concept <type_var1,type_var2>::constraints> \
     concept_checking_typedef_##type_var1##type_var2##concept
 
-#define BOOST_CLASS_REQUIRES3(type_var1, type_var2, type_var3, concept) \
-  typedef void (concept <type_var1,type_var2,type_var3>::* func##type_var1##type_var2##type_var3##concept)(); \
+#define BOOST_CLASS_REQUIRES3(type_var1, type_var2, type_var3, ns, concept) \
+  typedef void (ns::concept <type_var1,type_var2,type_var3>::* func##type_var1##type_var2##type_var3##concept)(); \
   template <func##type_var1##type_var2##type_var3##concept _Tp1> \
   struct concept_checking_##type_var1##type_var2##type_var3##concept { }; \
   typedef concept_checking_##type_var1##type_var2##type_var3##concept< \
-    BOOST_FPTR concept <type_var1,type_var2,type_var3>::constraints>  \
+    &ns::concept <type_var1,type_var2,type_var3>::constraints>  \
   concept_checking_typedef_##type_var1##type_var2##type_var3##concept
 
-#define BOOST_CLASS_REQUIRES4(type_var1, type_var2, type_var3, type_var4, concept) \
-  typedef void (concept <type_var1,type_var2,type_var3,type_var4>::* func##type_var1##type_var2##type_var3##type_var4##concept)(); \
+#define BOOST_CLASS_REQUIRES4(type_var1, type_var2, type_var3, type_var4, ns, concept) \
+  typedef void (ns::concept <type_var1,type_var2,type_var3,type_var4>::* func##type_var1##type_var2##type_var3##type_var4##concept)(); \
   template <func##type_var1##type_var2##type_var3##type_var4##concept _Tp1> \
   struct concept_checking_##type_var1##type_var2##type_var3##type_var4##concept { }; \
   typedef concept_checking_##type_var1##type_var2##type_var3##type_var4##concept< \
-    BOOST_FPTR concept <type_var1,type_var2,type_var3,type_var4>::constraints>  \
+    &ns::concept <type_var1,type_var2,type_var3,type_var4>::constraints>  \
     concept_checking_typedef_##type_var1##type_var2##type_var3##type_var4##concept
 
 
-#endif
-
-#if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
 template <class T, class U>
 struct require_same { };
 
 template <class T>
 struct require_same<T,T> { typedef T type; };
-#else
-// This version does not perform checking, but will not do any harm.
-template <class T, class U>
-struct require_same { typedef T type; };
-#endif
+
+  template <class T, class U>
+  struct SameTypeConcept
+  {
+    void constraints() {
+      typedef typename require_same<T, U>::type req;
+    }
+  };
 
   template <class T>
   struct IntegerConcept {
     void constraints() { 
-#if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
       errortype_must_be_an_integer_type();
-#endif      
     }
   };
-#if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
   template <> struct IntegerConcept<short> { void constraints() {} };
   template <> struct IntegerConcept<unsigned short> { void constraints() {} };
   template <> struct IntegerConcept<int> { void constraints() {} };
@@ -108,32 +87,24 @@
   template <> struct IntegerConcept<long> { void constraints() {} };
   template <> struct IntegerConcept<unsigned long> { void constraints() {} };
   // etc.
-#endif      
 
   template <class T>
   struct SignedIntegerConcept {
     void constraints() { 
-#if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
       errortype_must_be_a_signed_integer_type();
-#endif      
     }
   };
-#if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
   template <> struct SignedIntegerConcept<short> { void constraints() {} };
   template <> struct SignedIntegerConcept<int> { void constraints() {} };
   template <> struct SignedIntegerConcept<long> { void constraints() {} };
   // etc.
-#endif      
 
   template <class T>
   struct UnsignedIntegerConcept {
     void constraints() { 
-#if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
       errortype_must_be_an_unsigned_integer_type();
-#endif      
     }
   };
-#if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
   template <> struct UnsignedIntegerConcept<unsigned short>
     { void constraints() {} };
   template <> struct UnsignedIntegerConcept<unsigned int>
@@ -141,7 +112,6 @@
   template <> struct UnsignedIntegerConcept<unsigned long>
     { void constraints() {} };
   // etc.
-#endif      
 
   //===========================================================================
   // Basic Concepts
@@ -159,15 +129,11 @@
   struct AssignableConcept
   {
     void constraints() {
-#if !defined(_ITERATOR_) // back_insert_iterator broken for VC++ STL
       a = a;              // require assignment operator
-#endif
       const_constraints(a);
     }
     void const_constraints(const TT& b) {
-#if !defined(_ITERATOR_) // back_insert_iterator broken for VC++ STL
       a = b;              // const required for argument to assignment
-#endif
     }
     TT a;
   };
@@ -196,17 +162,13 @@
   {
     void constraints() {
       TT b(a);
-#if !defined(_ITERATOR_) // back_insert_iterator broken for VC++ STL
       a = a;              // require assignment operator
-#endif
       const_constraints(a);
       ignore_unused_variable_warning(b);
     }
     void const_constraints(const TT& b) {
       TT c(b);
-#if !defined(_ITERATOR_) // back_insert_iterator broken for VC++ STL
       a = b;              // const required for argument to assignment
-#endif
       ignore_unused_variable_warning(c);
     }
     TT a;
@@ -304,6 +266,9 @@
   BOOST_DEFINE_BINARY_OPERATOR_CONSTRAINT(-, SubtractOpConcept);
   BOOST_DEFINE_BINARY_OPERATOR_CONSTRAINT(%, ModOpConcept);
 
+#undef BOOST_DEFINE_BINARY_PREDICATE_OP_CONSTRAINT
+#undef BOOST_DEFINE_BINARY_OPERATOR_CONSTRAINT
+
   //===========================================================================
   // Function Object Concepts
 
@@ -318,7 +283,6 @@
   };
 
 
-#if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
   template <class Func>
   struct GeneratorConcept<Func,void>
   {
@@ -327,7 +291,6 @@
     }
     Func f;
   };
-#endif
 
   template <class Func, class Return, class Arg>
   struct UnaryFunctionConcept
@@ -340,7 +303,6 @@
     Return r;
   };
 
-#if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
   template <class Func, class Arg>
   struct UnaryFunctionConcept<Func, void, Arg> {
     void constraints() { 
@@ -348,7 +310,6 @@
     }
     Func f;
   };
-#endif
 
   template <class Func, class Return, class First, class Second>
   struct BinaryFunctionConcept
@@ -362,7 +323,6 @@
     Return r;
   };
 
-#if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
   template <class Func, class First, class Second>
   struct BinaryFunctionConcept<Func, void, First, Second>
   {
@@ -373,7 +333,6 @@
     First first;
     Second second;
   };
-#endif
 
   template <class Func, class Arg>
   struct UnaryPredicateConcept
@@ -422,9 +381,7 @@
       function_requires< AssignableConcept<TT> >();
       function_requires< DefaultConstructibleConcept<TT> >();
       function_requires< EqualityComparableConcept<TT> >();
-#ifndef BOOST_NO_STD_ITERATOR_TRAITS
       typedef typename std::iterator_traits<TT>::value_type V;
-#endif
       (void)*i;           // require dereference operator
     }
     TT i;
@@ -446,7 +403,6 @@
     void constraints() {
       function_requires< TrivialIteratorConcept<TT> >();
       // require iterator_traits typedef's
-#ifndef BOOST_NO_STD_ITERATOR_TRAITS
       typedef typename std::iterator_traits<TT>::difference_type D;
       function_requires< SignedIntegerConcept<D> >();
       typedef typename std::iterator_traits<TT>::reference R;
@@ -455,7 +411,6 @@
       function_requires< ConvertibleConcept<
         typename std::iterator_traits<TT>::iterator_category,
         std::input_iterator_tag> >();
-#endif
       ++i;                // require preincrement operator
       i++;                // require postincrement operator
     }
@@ -471,7 +426,7 @@
       i++;                // require postincrement operator
       *i++ = t;           // require postincrement and assignment
     }
-    TT i, j;
+    TT i;
     ValueT t;
   };
 
@@ -480,14 +435,12 @@
   {
     void constraints() {
       function_requires< InputIteratorConcept<TT> >();
-#ifndef BOOST_NO_STD_ITERATOR_TRAITS
       function_requires< ConvertibleConcept<
         typename std::iterator_traits<TT>::iterator_category,
         std::forward_iterator_tag> >();
       typedef typename std::iterator_traits<TT>::reference reference;
       reference r = *i;
       ignore_unused_variable_warning(r);
-#endif
     }
     TT i;
   };
@@ -507,11 +460,9 @@
   {
     void constraints() {
       function_requires< ForwardIteratorConcept<TT> >();
-#ifndef BOOST_NO_STD_ITERATOR_TRAITS
       function_requires< ConvertibleConcept<
         typename std::iterator_traits<TT>::iterator_category,
         std::bidirectional_iterator_tag> >();
-#endif
       --i;                // require predecrement operator
       i--;                // require postdecrement operator
     }
@@ -536,12 +487,10 @@
     void constraints() {
       function_requires< BidirectionalIteratorConcept<TT> >();
       function_requires< ComparableConcept<TT> >();
-#ifndef BOOST_NO_STD_ITERATOR_TRAITS
       function_requires< ConvertibleConcept<
         typename std::iterator_traits<TT>::iterator_category,
         std::random_access_iterator_tag> >();
       typedef typename std::iterator_traits<TT>::reference R;
-#endif
 
       i += n;             // require assignment addition operator
       i = i + n; i = n + i; // require addition with difference type
@@ -552,11 +501,7 @@
     }
     TT a, b;
     TT i, j;
-#ifndef BOOST_NO_STD_ITERATOR_TRAITS
     typename std::iterator_traits<TT>::difference_type n;
-#else
-    std::ptrdiff_t n;
-#endif
   };
 
   template <class TT>
@@ -568,11 +513,7 @@
       i[n] = *i;                  // require element access and assignment
     }
     TT i;
-#ifndef BOOST_NO_STD_ITERATOR_TRAITS
     typename std::iterator_traits<TT>::difference_type n;
-#else
-    std::ptrdiff_t n;
-#endif
   };
 
   //===========================================================================

