diff --git a/include/boost/pending/concept_checks.hpp b/include/boost/pending/concept_checks.hpp index 1333ff7..4b9f051 100644 --- a/include/boost/pending/concept_checks.hpp +++ b/include/boost/pending/concept_checks.hpp @@ -62,6 +62,9 @@ do { \ __x = __x; } while (0) +#if 0 + +// static member not required by standard to be instantiated #define CLASS_REQUIRES(__tv, __concept) \ typedef void (__concept##_concept <__tv>::* __func##__tv##__concept)(); \ template <__func##__tv##__concept _Tp1> \ @@ -94,6 +97,42 @@ do { \ BOOST_FPTR __concept##_concept <__tv1,__tv2,__tv3,__tv4>::constraints> \ __dummy_ptr_##__tv1##__tv2##__tv3##__tv4##__concept +#else + +#define CLASS_REQUIRES(__tv, __concept) \ + typedef void (__concept##_concept <__tv>::* __func##__tv##__concept)(); \ + template <__func##__tv##__concept _Tp1> \ + struct __dummy_struct_##__tv##__concept { }; \ + typedef __dummy_struct_##__tv##__concept< \ + BOOST_FPTR __concept##_concept <__tv>::constraints> \ + __dummy_typedef_##__tv##__concept + +#define CLASS_REQUIRES2(__tv1, __tv2, __concept) \ + typedef void (__concept##_concept <__tv1,__tv2>::* __func##__tv1##__tv2##__concept)(); \ + template <__func##__tv1##__tv2##__concept _Tp1> \ + struct __dummy_struct_##__tv1##__tv2##__concept { }; \ + typedef __dummy_struct_##__tv1##__tv2##__concept< \ + BOOST_FPTR __concept##_concept <__tv1,__tv2>::constraints> \ + __dummy_typedef_##__tv1##__tv2##__concept + +#define CLASS_REQUIRES3(__tv1, __tv2, __tv3, __concept) \ + typedef void (__concept##_concept <__tv1,__tv2,__tv3>::* __func##__tv1##__tv2##__tv3##__concept)(); \ + template <__func##__tv1##__tv2##__tv3##__concept _Tp1> \ + struct __dummy_struct_##__tv1##__tv2##__tv3##__concept { }; \ + typedef __dummy_struct_##__tv1##__tv2##__tv3##__concept< \ + BOOST_FPTR __concept##_concept <__tv1,__tv2,__tv3>::constraints> \ + __dummy_typedef_##__tv1##__tv2##__tv3##__concept + +#define CLASS_REQUIRES4(__tv1, __tv2, __tv3, __tv4, __concept) \ + typedef void (__concept##_concept <__tv1,__tv2,__tv3,__tv4>::* __func##__tv1##__tv2##__tv3##__tv4##__concept)(); \ + template <__func##__tv1##__tv2##__tv3##__tv4##__concept _Tp1> \ + struct __dummy_struct_##__tv1##__tv2##__tv3##__tv4##__concept { }; \ + typedef __dummy_struct_##__tv1##__tv2##__tv3##__tv4##__concept< \ + BOOST_FPTR __concept##_concept <__tv1,__tv2,__tv3,__tv4>::constraints> \ + __dummy_typedef_##__tv1##__tv2##__tv3##__tv4##__concept + +#endif + #if !defined BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION template diff --git a/stl_concept_checks.cpp b/stl_concept_checks.cpp new file mode 100644 index 0000000..ac74417 --- /dev/null +++ b/stl_concept_checks.cpp @@ -0,0 +1,101 @@ +//======================================================================= +// Copyright 1997, 1998, 1999, 2000 University of Notre Dame. +// Authors: Andrew Lumsdaine, Lie-Quan Lee, Jeremy G. Siek +// +// This file is part of the Boost Graph Library +// +// You should have received a copy of the License Agreement for the +// Boost Graph Library along with the software; see the file LICENSE. +// If not, contact Office of Research, University of Notre Dame, Notre +// Dame, IN 46556. +// +// Permission to modify the code and to distribute modified code is +// granted, provided the text of this NOTICE is retained, a notice that +// the code was modified is included with the above COPYRIGHT NOTICE and +// with the COPYRIGHT NOTICE in the LICENSE file, and that the LICENSE +// file is distributed with the modified code. +// +// LICENSOR MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. +// By way of example, but not limitation, Licensor MAKES NO +// REPRESENTATIONS OR WARRANTIES OF MERCHANTABILITY OR FITNESS FOR ANY +// PARTICULAR PURPOSE OR THAT THE USE OF THE LICENSED SOFTWARE COMPONENTS +// OR DOCUMENTATION WILL NOT INFRINGE ANY PATENTS, COPYRIGHTS, TRADEMARKS +// OR OTHER RIGHTS. +//======================================================================= +#include +#include + +#include +#include +#include +#include +#include +#include +#ifndef BOOST_NO_SLIST +#include +#endif + +int +main() +{ + typedef boost::trivial_iterator_skeleton TrivIterSkeleton; + typedef boost::mutable_trivial_iterator_skeleton MutTrivIterSkeleton; + REQUIRE(TrivIterSkeleton, TrivialIterator); + REQUIRE(MutTrivIterSkeleton, Mutable_TrivialIterator); + +#if defined(_ITERATOR_) + // VC++ STL implementation is not standard conformant and + // fails to pass these concept checks +#else + typedef std::vector Vector; + typedef std::deque Deque; + typedef std::list List; + + // VC++ missing pointer and const_pointer typedefs + REQUIRE(Vector, Mutable_RandomAccessContainer); + REQUIRE(Vector, BackInsertionSequence); + +#if !defined(__GNUC__) +#if !defined __sgi + // old deque iterator missing n + iter operation + REQUIRE(Deque, Mutable_RandomAccessContainer); +#endif + // warnings about signed and unsigned in old deque version + REQUIRE(Deque, FrontInsertionSequence); + REQUIRE(Deque, BackInsertionSequence); +#endif + + // VC++ missing pointer and const_pointer typedefs + REQUIRE(List, Mutable_ReversibleContainer); + REQUIRE(List, FrontInsertionSequence); + REQUIRE(List, BackInsertionSequence); + +#ifndef BOOST_NO_SLIST + typedef std::slist SList; + REQUIRE(SList, FrontInsertionSequence); +#endif + + typedef std::set Set; + typedef std::multiset MultiSet; + typedef std::map Map; + typedef std::multimap MultiMap; + + REQUIRE(Set, SortedAssociativeContainer); + REQUIRE(Set, SimpleAssociativeContainer); + REQUIRE(Set, UniqueAssociativeContainer); + + REQUIRE(MultiSet, SortedAssociativeContainer); + REQUIRE(MultiSet, SimpleAssociativeContainer); + REQUIRE(MultiSet, MultipleAssociativeContainer); + + REQUIRE(Map, SortedAssociativeContainer); + REQUIRE(Map, UniqueAssociativeContainer); + REQUIRE(Map, PairAssociativeContainer); + + REQUIRE(MultiMap, SortedAssociativeContainer); + REQUIRE(MultiMap, MultipleAssociativeContainer); + REQUIRE(MultiMap, PairAssociativeContainer); +#endif + + return 0; +} diff --git a/stl_concept_checks.expected b/stl_concept_checks.expected new file mode 100644 index 0000000..e69de29