1 // (C) Copyright Jeremy Siek 2000. 2 // Distributed under the Boost Software License, Version 1.0. (See 3 // accompanying file LICENSE_1_0.txt or copy at 4 // http://www.boost.org/LICENSE_1_0.txt) 5 6 // 7 // This file checks to see if various standard container 8 // implementations live up to requirements specified in the C++ 9 // standard. As many implementations do not live to the requirements, 10 // it is not uncommon for this file to fail to compile. The 11 // BOOST_HIDE_EXPECTED_ERRORS macro is provided here if you want to 12 // see as much of this file compile as possible. 13 // 14 15 #include <boost/concept_check.hpp> 16 17 #include <iterator> 18 #include <set> 19 #include <map> 20 #include <vector> 21 #include <list> 22 #include <deque> 23 #if 0 24 #include <slist> 25 #endif 26 27 // Define this macro if you want to hide the expected error, that is, 28 // error in the various C++ standard library implementations. 29 // 30 //#define BOOST_HIDE_EXPECTED_ERRORS 31 32 int main()33main() 34 { 35 using namespace boost; 36 37 #if defined(_ITERATOR_) && defined(BOOST_HIDE_EXPECTED_ERRORS) 38 // VC++ STL implementation is not standard conformant and 39 // fails to pass these concept checks 40 #else 41 typedef std::vector<int> Vector; 42 typedef std::deque<int> Deque; 43 typedef std::list<int> List; 44 45 // VC++ missing pointer and const_pointer typedefs 46 function_requires< Mutable_RandomAccessContainer<Vector> >(); 47 function_requires< BackInsertionSequence<Vector> >(); 48 49 #if !(defined(__GNUC__) && defined(BOOST_HIDE_EXPECTED_ERRORS)) 50 #if !((defined(__sgi) || (defined(__DECCXX) && defined(_RWSTD_VER) && _RWSTD_VER <= 0x0203)) \ 51 && defined(BOOST_HIDE_EXPECTED_ERRORS)) 52 // old deque iterator missing n + iter operation 53 function_requires< Mutable_RandomAccessContainer<Deque> >(); 54 #endif 55 // warnings about signed and unsigned in old deque version 56 function_requires< FrontInsertionSequence<Deque> >(); 57 function_requires< BackInsertionSequence<Deque> >(); 58 #endif 59 60 // VC++ missing pointer and const_pointer typedefs 61 function_requires< Mutable_ReversibleContainer<List> >(); 62 function_requires< FrontInsertionSequence<List> >(); 63 function_requires< BackInsertionSequence<List> >(); 64 65 #if 0 66 typedef BOOST_STD_EXTENSION_NAMESPACE::slist<int> SList; 67 function_requires< FrontInsertionSequence<SList> >(); 68 #endif 69 70 typedef std::set<int> Set; 71 typedef std::multiset<int> MultiSet; 72 typedef std::map<int,int> Map; 73 typedef std::multimap<int,int> MultiMap; 74 75 function_requires< SortedAssociativeContainer<Set> >(); 76 function_requires< SimpleAssociativeContainer<Set> >(); 77 function_requires< UniqueAssociativeContainer<Set> >(); 78 79 function_requires< SortedAssociativeContainer<MultiSet> >(); 80 function_requires< SimpleAssociativeContainer<MultiSet> >(); 81 function_requires< MultipleAssociativeContainer<MultiSet> >(); 82 83 function_requires< SortedAssociativeContainer<Map> >(); 84 function_requires< UniqueAssociativeContainer<Map> >(); 85 function_requires< PairAssociativeContainer<Map> >(); 86 87 function_requires< SortedAssociativeContainer<MultiMap> >(); 88 function_requires< MultipleAssociativeContainer<MultiMap> >(); 89 function_requires< PairAssociativeContainer<MultiMap> >(); 90 #endif 91 92 return 0; 93 } 94