Compare commits

..

122 Commits

Author SHA1 Message Date
Dave Abrahams
cd6e4b95a0 Moved pointer parameter
[SVN r9348]
2001-02-27 02:18:48 +00:00
nobody
21efa95d5a This commit was manufactured by cvs2svn to create branch
'moved_pointer'.

[SVN r9293]
2001-02-20 16:01:01 +00:00
Jeremy Siek
a5adbbfd5f use filter_iter::policies_type instead of filter_gen::policies_type
[SVN r9292]
2001-02-20 16:01:00 +00:00
John Maddock
a19d13f123 More type_traits tweeks.
[SVN r9287]
2001-02-20 12:17:55 +00:00
Dave Abrahams
78886ab383 Added cross-reference; improved policies documentation
[SVN r9286]
2001-02-20 03:49:26 +00:00
Dave Abrahams
168012b465 Describe const/mutable interactions and give rationale for no
reverse_iterator_pair_generator.


[SVN r9285]
2001-02-20 03:04:03 +00:00
Dave Abrahams
d9d58ea66e Take advantage of improved iterator_traits to do more tests on MSVC. Reordered
some #ifdefs for coherency.


[SVN r9281]
2001-02-19 22:36:22 +00:00
Dave Abrahams
56f5f6e8d5 Take adavantage of improved iterator_traits to do more tests on MSVC. Hack
around an MSVC-with-STLport internal compiler error.


[SVN r9280]
2001-02-19 22:34:31 +00:00
Dave Abrahams
3cb6420eda Roll back the reverse_iterator_pair_generator test
[SVN r9278]
2001-02-19 20:37:24 +00:00
Dave Abrahams
60be2c1186 Added tests for reverse_iterator_pair_generator
[SVN r9273]
2001-02-19 16:21:12 +00:00
John Maddock
ed210f6b2c more type traits updates:
Header includes get BOOST_ prefix,
BOOST_DECL_MC dropped in favour of new BOOST_STATIC_CONSTANT (from config.hpp),
operator ! dropped in favour of boost::type_traits::ice_not template.


[SVN r9270]
2001-02-19 12:52:30 +00:00
Dave Abrahams
029bc59d74 Added some missing 'explicit's
[SVN r9265]
2001-02-18 22:23:13 +00:00
Dave Abrahams
961c08a82f Apply Jens' suggested fixes
[SVN r9263]
2001-02-18 21:50:57 +00:00
Jens Maurer
7ee484c614 fix minor typos
[SVN r9259]
2001-02-18 19:26:20 +00:00
Jens Maurer
05c6fbbf99 needs <boost/type_traits/same_traits.hpp>
[SVN r9253]
2001-02-18 15:19:23 +00:00
John Maddock
91078b7f7a type_traits: regression failure fixes from type traits changes...
[SVN r9249]
2001-02-18 11:43:01 +00:00
Jeremy Siek
20d804afc4 changes to order of indirect_iterator template parameter list, and
fixed a typo


[SVN r9247]
2001-02-17 22:03:30 +00:00
Jeremy Siek
c21f6d1cbf added Category parameter and made a few more edits with regards to type requirements
[SVN r9239]
2001-02-17 19:59:19 +00:00
John Maddock
393e79c1fd Added new type traits files.
[SVN r9238]
2001-02-17 12:25:45 +00:00
Jeremy Siek
8b92c8a085 adjusted requirements for value type of the base iterator
[SVN r9236]
2001-02-17 01:51:45 +00:00
Jeremy Siek
ff73dd94c9 made iterator_adaptor constructor explicit
[SVN r9235]
2001-02-17 01:50:40 +00:00
Jeremy Siek
af43904f38 added "explicit" to iterator_adaptor constructor
[SVN r9234]
2001-02-17 01:44:41 +00:00
Dave Abrahams
485074f265 Added a missing const. Made the tests run (somewhat) with plain MSVC again.
[SVN r9232]
2001-02-16 23:04:49 +00:00
Jens Maurer
2e0ee55b5e add missing my_int3::operator!=
[SVN r9231]
2001-02-16 21:28:59 +00:00
Jeremy Siek
e9105d32cb background color and a whitespace edit
[SVN r9228]
2001-02-16 16:38:45 +00:00
Dave Abrahams
964d23f68c Edits for clarity
[SVN r9224]
2001-02-16 05:51:37 +00:00
Dave Abrahams
be5aaaae7b More edits for clarity. Added const/non-const example.
[SVN r9223]
2001-02-16 05:33:21 +00:00
Dave Abrahams
bf13bd7b3f Massive edits
[SVN r9222]
2001-02-16 05:30:49 +00:00
Dave Abrahams
352e392fcb Checked and cleaned using HTML TIDY.
[SVN r9220]
2001-02-16 02:36:36 +00:00
Dave Abrahams
083b1b02df Bigtime edits
[SVN r9219]
2001-02-16 00:38:28 +00:00
Jeremy Siek
648c6240a2 added another link to the generic_programming.html#policies
[SVN r9218]
2001-02-15 16:57:12 +00:00
Jeremy Siek
60cab840cb removed strange ssh garbage
[SVN r9217]
2001-02-15 16:52:39 +00:00
Jeremy Siek
83a4380dab added mention of traits requirement under Type Requirements section
[SVN r9216]
2001-02-15 16:49:16 +00:00
Jeremy Siek
de84fe8d98 oops, meant to remove use of policies_type from filter_iterator_generator
in the last commit, but accidentally added it :(


[SVN r9215]
2001-02-15 16:43:54 +00:00
Jeremy Siek
ed3cbfdb8e removed policies_type from filter_iterator_generator
[SVN r9214]
2001-02-15 16:41:48 +00:00
Dave Abrahams
fda44ca17d General edits for clarity; some reorganization.
[SVN r9213]
2001-02-15 16:39:55 +00:00
Jeremy Siek
272025bb07 fixed my_int::operator--
[SVN r9208]
2001-02-15 06:47:06 +00:00
Jeremy Siek
8e92bcf1b2 removed policies_type from filter_iterator_generator
[SVN r9207]
2001-02-15 06:44:26 +00:00
Jeremy Siek
84f1ffdefe added section on Members to cover constructors, etc. and added
a section on Operators


[SVN r9206]
2001-02-15 06:41:46 +00:00
Jeremy Siek
7e25450054 added discusion of counting_iterator_traits, and added type requirements
for the Incrementable type.

added uses of user-defined types to the test


[SVN r9204]
2001-02-15 05:53:10 +00:00
Dave Abrahams
4a563fa266 added missing boost::
[SVN r9199]
2001-02-14 20:35:39 +00:00
Dave Abrahams
aa4c0ec000 Test new VC6 workarounds
[SVN r9198]
2001-02-13 23:32:19 +00:00
Jeremy Siek
e1ecfbdc43 added output for the transform iterator example
[SVN r9187]
2001-02-13 04:38:59 +00:00
Jeremy Siek
a4e122a82e changed template class to class template
[SVN r9186]
2001-02-13 04:34:44 +00:00
Jeremy Siek
93216e8fb7 copyright
[SVN r9184]
2001-02-13 04:25:24 +00:00
Jeremy Siek
16272c210d fixed typo
[SVN r9183]
2001-02-13 04:24:24 +00:00
Jeremy Siek
e104b00da1 merged in Dave's additions and added a tutorial using the implementation
of transform iterator as the example


[SVN r9182]
2001-02-13 04:15:17 +00:00
Jeremy Siek
ce5c6bcc08 removed use of istream_iterator for operator-> test, replaced with
use of concept archetypes


[SVN r9180]
2001-02-13 02:03:13 +00:00
Jeremy Siek
8694ce31fe changed int* to std::vector<int>::iterator
[SVN r9178]
2001-02-12 21:59:25 +00:00
Jeremy Siek
d960e5eadd added another example
[SVN r9177]
2001-02-12 21:57:19 +00:00
Jeremy Siek
2dc71e87a3 new files
[SVN r9176]
2001-02-12 21:35:20 +00:00
Jeremy Siek
6bf17edde2 updated url to the iterator_adaptor class
[SVN r9156]
2001-02-12 05:24:45 +00:00
Jeremy Siek
88573d515d fixed Reference and Pointer template paremeter descriptions
[SVN r9155]
2001-02-12 05:20:09 +00:00
Jeremy Siek
89b9f77823 obsolete and not needed
[SVN r9152]
2001-02-12 04:55:19 +00:00
Jeremy Siek
765d9be17d small edit
[SVN r9151]
2001-02-12 04:53:39 +00:00
Jeremy Siek
7135373008 various edits
[SVN r9150]
2001-02-12 04:52:24 +00:00
Jeremy Siek
ee269884fc finished 1st draft of reverse iterator docs
[SVN r9149]
2001-02-12 04:51:56 +00:00
Jeremy Siek
387540d5f1 using make_const_projection_iterator() for last example,
and a couple other minor edits


[SVN r9145]
2001-02-12 02:55:19 +00:00
Jeremy Siek
2eba7b42a8 new files
[SVN r9144]
2001-02-12 02:52:26 +00:00
Jeremy Siek
07115d26c7 finished 1st draft
[SVN r9143]
2001-02-12 01:50:50 +00:00
Jeremy Siek
c43ed815a0 new files
[SVN r9137]
2001-02-11 20:05:00 +00:00
Dave Abrahams
ff01e36d12 Compile with Borland, re-enable failing tests
[SVN r9136]
2001-02-11 19:53:56 +00:00
Dave Abrahams
ac4798b16c Final fixes for Borland
[SVN r9135]
2001-02-11 19:50:14 +00:00
Dave Abrahams
d4e14fed0e Fixed bugs in the iterator helpers which prevented explicitly supplied arguments from actually being used
[SVN r9128]
2001-02-11 19:31:21 +00:00
Jeremy Siek
5f91259344 few edits
[SVN r9125]
2001-02-11 19:26:26 +00:00
Jeremy Siek
20a9d9645d Added test of operator-> for forward and input iterators.
[SVN r9124]
2001-02-11 19:25:49 +00:00
Jeremy Siek
c86f6b4abd Dave's suggested edits
[SVN r9122]
2001-02-11 18:27:40 +00:00
Jeremy Siek
d66489b5b2 changed per Dave's comments
[SVN r9121]
2001-02-11 18:14:04 +00:00
Dave Abrahams
b743ee9f0c #if 0'd out use of counting_iterator on non-numeric types in MSVC without STLport, so that the other tests may proceed
[SVN r9120]
2001-02-11 16:19:17 +00:00
Dave Abrahams
95ba69c00a Borland fixes
[SVN r9119]
2001-02-11 16:16:53 +00:00
Dave Abrahams
2ac273739c Update for compatibility with new iterator_adaptor interface
[SVN r9118]
2001-02-11 16:14:14 +00:00
Dave Abrahams
5b4d28708c Fixes for Borland
[SVN r9117]
2001-02-11 16:13:38 +00:00
Dave Abrahams
4cc4383488 Some fixes for Borland get it closer on that compiler
[SVN r9112]
2001-02-11 16:05:01 +00:00
Jeremy Siek
8935232248 new files
[SVN r9109]
2001-02-11 05:25:19 +00:00
Jeremy Siek
5c6dd2f172 various edits
[SVN r9108]
2001-02-11 04:34:32 +00:00
Dave Abrahams
eeeb7ef5b9 Replaced some static_casts with explicit construction
[SVN r9107]
2001-02-11 03:12:04 +00:00
Dave Abrahams
2efc9c1178 Use new adaptors interface
[SVN r9105]
2001-02-11 03:07:55 +00:00
Jeremy Siek
a84c46f6e3 added another example
[SVN r9103]
2001-02-11 03:01:47 +00:00
Jeremy Siek
a5c3dcdd02 redid docs for the template parameters
[SVN r9102]
2001-02-11 02:55:38 +00:00
Jeremy Siek
46f7a75eb7 fixed bug in policy object constructor
[SVN r9101]
2001-02-11 02:40:02 +00:00
Jeremy Siek
94b6710c5b fixed bug in policy object construction
[SVN r9100]
2001-02-11 02:39:35 +00:00
Jeremy Siek
d8dd3da9ab small edit
[SVN r9099]
2001-02-11 02:38:08 +00:00
Jeremy Siek
803ced004a finished 1st draft
[SVN r9098]
2001-02-11 02:35:09 +00:00
Dave Abrahams
0ea7d36ad0 A fix for EDG
[SVN r9096]
2001-02-10 23:16:05 +00:00
Jeremy Siek
87aafab759 new file
[SVN r9094]
2001-02-10 22:33:43 +00:00
Dave Abrahams
994d310abd Use new filter_ interface.
[SVN r9090]
2001-02-10 20:11:42 +00:00
Beman Dawes
228cdcf05e All final 1.20.2 changes, including fixing broken hyperlinks
[SVN r9071]
2001-02-10 14:42:14 +00:00
Dave Abrahams
42598e352c Use new reverse_ and indirect_ interfaces. Replace BOOST_NO_STD_ITERATOR_TRAITS
with BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION to prove we've normalized to core
compiler capabilities


[SVN r9067]
2001-02-10 00:38:08 +00:00
Jeremy Siek
36a9e4d1da fixed usage of indirect_iterator_pair_generator
[SVN r9053]
2001-02-09 05:45:10 +00:00
Jeremy Siek
456dfd0dea adjusted to changes in iterator_adaptors.hpp, added more
tests of make_xxx


[SVN r9051]
2001-02-09 05:26:48 +00:00
Jeremy Siek
155457e2b5 more work on default args and explicit templat args
[SVN r9049]
2001-02-09 04:40:42 +00:00
Dave Abrahams
b5c91485bf Use Jeremy's new make_reverse_iterator form; add more comprehensive
testing. Force-decay array function arguments to pointers.


[SVN r9047]
2001-02-09 03:32:59 +00:00
Dave Abrahams
c959cf7870 bug fixes
[SVN r9031]
2001-02-08 04:46:41 +00:00
Jeremy Siek
5878c88636 added indirect_iterator_pair_generator back in
[SVN r9026]
2001-02-08 03:35:03 +00:00
Jeremy Siek
ddcef2fb19 Added tests for the make_xxx_iterator() helper functions
[SVN r9025]
2001-02-08 03:08:09 +00:00
Dave Abrahams
493d124c07 rename counting_iterator() -> make_counting_iterator()
[SVN r9015]
2001-02-07 22:27:02 +00:00
Jens Maurer
f42060c616 add missing "typename"
[SVN r9005]
2001-02-07 17:51:55 +00:00
Dave Abrahams
834facc932 trivial flotsam cleanup
[SVN r9004]
2001-02-07 17:23:52 +00:00
Dave Abrahams
f82d0b76ee More comprehensive testing; factored out static tests for better reuse
[SVN r9001]
2001-02-07 16:38:41 +00:00
Jeremy Siek
c25d225275 Replaced use of xxx_pair_generator with xxx_generator where
possible (which was all but the projection iterator).


[SVN r8996]
2001-02-07 06:36:12 +00:00
Dave Abrahams
c503a274b5 Removed now-defaulted template arguments where possible
Updated names to correspond to new generator naming convention.
Added a trivial test for make_transform_iterator().
Gave traits for const iterators a mutable value_type, per std.
Resurrected my original tests for indirect iterators.


[SVN r8995]
2001-02-07 05:37:08 +00:00
Jeremy Siek
087069d215 added concept check for the default iterator policy
[SVN r8990]
2001-02-07 02:44:18 +00:00
Jeremy Siek
826a6dd114 changed test for transform iterator to use input_iterator instead of
random access iterator


[SVN r8937]
2001-02-04 23:46:31 +00:00
Dave Abrahams
f31483838d Fix for compilers without standard iterator_traits
[SVN r8929]
2001-02-04 20:11:30 +00:00
Dave Abrahams
d8a9b633d9 Fix for newly-corrected bidirectional_iterator_test requirements.
[SVN r8926]
2001-02-04 19:09:46 +00:00
Dave Abrahams
c060e4466a Added use of iterator_tests.hpp
[SVN r8923]
2001-02-04 18:26:43 +00:00
Jeremy Siek
a9951376f4 removed UDT -> int is_convertible test because the noncopyable -> int
test already brings out the g++ warning


[SVN r8834]
2001-01-31 19:08:27 +00:00
Jeremy Siek
bda0c8f5e3 added some more tests and fixed signature of main() so this will link
with MSVC


[SVN r8833]
2001-01-31 18:54:29 +00:00
Jeremy Siek
71902f23a2 Added test case for is_convertible with UDT that brings out the
warning message bug with g++.


[SVN r8821]
2001-01-31 02:12:08 +00:00
Dave Abrahams
dfd6c85569 Inital checkin
[SVN r8813]
2001-01-30 16:00:37 +00:00
Dave Abrahams
0e41b2cc1a Removed not_an_iterator detritus
[SVN r8808]
2001-01-29 02:14:44 +00:00
Jeremy Siek
e5c81d0702 fixed very strange VC++ bug that was showing up in graph/test/graph.cpp
Something about the code gen for compressed_pair_1::operator=
was going wrong. Writing it explicitly, and playing with some ordering
fixed the problem, don't ask my why.


[SVN r8765]
2001-01-25 04:45:52 +00:00
Dave Abrahams
6caf7d4d5a Initial checkin
[SVN r8757]
2001-01-24 18:36:52 +00:00
Dave Abrahams
98e87c8afb Added test for wchar_t
[SVN r8748]
2001-01-24 01:48:01 +00:00
Dave Abrahams
d9e0f80d50 Now statically selecting a test for signed numbers to avoid warnings with fancy
compilers. Added commentary and additional dumping of traits data for tested
types.


[SVN r8746]
2001-01-24 01:40:22 +00:00
Jeremy Siek
6396fdb5ff added filter iterator test
[SVN r8736]
2001-01-23 19:10:03 +00:00
Jens Maurer
2470b53373 minor fix: move "static" storage specifier to the front of a declaration
[SVN r8714]
2001-01-22 21:11:35 +00:00
Jeremy Siek
16334e92ca added KAI C++ type for std::list::difference_type
[SVN r8709]
2001-01-22 16:52:36 +00:00
Dave Abrahams
c22d98a8ec Quick fix to my_iterator, which wasn't returning a reference type from operator*
[SVN r8705]
2001-01-22 05:03:48 +00:00
Dave Abrahams
28617afbb9 Initial checkin
[SVN r8702]
2001-01-22 04:08:29 +00:00
Jeremy Siek
0c3bc42bec new files
[SVN r8685]
2001-01-21 20:12:32 +00:00
Dave Abrahams
e3d9745df1 Initial Checkin
[SVN r8676]
2001-01-21 06:02:08 +00:00
2 changed files with 463 additions and 659 deletions

463
iterator_adaptor_test.cpp Normal file
View File

@@ -0,0 +1,463 @@
// Demonstrate and test boost/operators.hpp on std::iterators -------------//
// (C) Copyright Jeremy Siek 1999. Permission to copy, use, modify,
// sell and distribute this software is granted provided this
// copyright notice appears in all copies. This software is provided
// "as is" without express or implied warranty, and with no claim as
// to its suitability for any purpose.
// See http://www.boost.org for most recent version including documentation.
// Revision History
// 19 Feb 01 Take adavantage of improved iterator_traits to do more tests
// on MSVC. Hack around an MSVC-with-STLport internal compiler
// error. (David Abrahams)
// 11 Feb 01 Added test of operator-> for forward and input iterators.
// (Jeremy Siek)
// 11 Feb 01 Borland fixes (David Abrahams)
// 10 Feb 01 Use new adaptors interface. (David Abrahams)
// 10 Feb 01 Use new filter_ interface. (David Abrahams)
// 09 Feb 01 Use new reverse_ and indirect_ interfaces. Replace
// BOOST_NO_STD_ITERATOR_TRAITS with
// BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION to prove we've
// normalized to core compiler capabilities (David Abrahams)
// 08 Feb 01 Use Jeremy's new make_reverse_iterator form; add more
// comprehensive testing. Force-decay array function arguments to
// pointers.
// 07 Feb 01 Added tests for the make_xxx_iterator() helper functions.
// (Jeremy Siek)
// 07 Feb 01 Replaced use of xxx_pair_generator with xxx_generator where
// possible (which was all but the projection iterator).
// (Jeremy Siek)
// 06 Feb 01 Removed now-defaulted template arguments where possible
// Updated names to correspond to new generator naming convention.
// Added a trivial test for make_transform_iterator().
// Gave traits for const iterators a mutable value_type, per std.
// Resurrected my original tests for indirect iterators.
// (David Abrahams)
// 04 Feb 01 Fix for compilers without standard iterator_traits
// (David Abrahams)
// 13 Jun 00 Added const version of the iterator tests (Jeremy Siek)
// 12 Dec 99 Initial version with iterator operators (Jeremy Siek)
#include <boost/config.hpp>
#include <iostream>
#include <algorithm>
#include <functional>
#include <boost/iterator_adaptors.hpp>
#include <boost/pending/iterator_tests.hpp>
#include <boost/pending/integer_range.hpp>
#include <boost/concept_archetype.hpp>
#include <stdlib.h>
#include <vector>
#include <deque>
#include <set>
struct my_iterator_tag : public std::random_access_iterator_tag { };
using boost::dummyT;
struct my_iter_traits {
typedef dummyT value_type;
typedef dummyT* pointer;
typedef dummyT& reference;
typedef my_iterator_tag iterator_category;
typedef std::ptrdiff_t difference_type;
};
struct my_const_iter_traits {
typedef dummyT value_type;
typedef const dummyT* pointer;
typedef const dummyT& reference;
typedef my_iterator_tag iterator_category;
typedef std::ptrdiff_t difference_type;
};
typedef boost::iterator_adaptor<dummyT*,
boost::default_iterator_policies, dummyT> my_iterator;
typedef boost::iterator_adaptor<const dummyT*,
boost::default_iterator_policies, const dummyT> const_my_iterator;
struct mult_functor {
typedef int result_type;
typedef int argument_type;
// Functors used with transform_iterator must be
// DefaultConstructible, as the transform_iterator must be
// DefaultConstructible to satisfy the requirements for
// TrivialIterator.
mult_functor() { }
mult_functor(int aa) : a(aa) { }
int operator()(int b) const { return a * b; }
int a;
};
template <class Pair>
struct select1st_
: public std::unary_function<Pair, typename Pair::first_type>
{
const typename Pair::first_type& operator()(const Pair& x) const {
return x.first;
}
typename Pair::first_type& operator()(Pair& x) const {
return x.first;
}
};
struct one_or_four {
bool operator()(dummyT x) const {
return x.foo() == 1 || x.foo() == 4;
}
};
typedef std::deque<int> storage;
typedef std::deque<int*> pointer_deque;
typedef std::set<storage::iterator> iterator_set;
void more_indirect_iterator_tests()
{
// For some reason all heck breaks loose in the compiler under these conditions.
#if !defined(BOOST_MSVC) || !defined(__STL_DEBUG)
storage store(1000);
std::generate(store.begin(), store.end(), rand);
pointer_deque ptr_deque;
iterator_set iter_set;
for (storage::iterator p = store.begin(); p != store.end(); ++p)
{
ptr_deque.push_back(&*p);
iter_set.insert(p);
}
typedef boost::indirect_iterator_pair_generator<
pointer_deque::iterator
#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
, int
#endif
> IndirectDeque;
IndirectDeque::iterator db(ptr_deque.begin());
IndirectDeque::iterator de(ptr_deque.end());
assert(static_cast<std::size_t>(de - db) == store.size());
assert(db + store.size() == de);
IndirectDeque::const_iterator dci(db);
assert(db == dci);
assert(dci == db);
assert(dci != de);
assert(dci < de);
assert(dci <= de);
assert(de >= dci);
assert(de > dci);
dci = de;
assert(dci == de);
boost::random_access_iterator_test(db + 1, store.size() - 1, boost::next(store.begin()));
*db = 999;
assert(store.front() == 999);
typedef boost::indirect_iterator_generator<
iterator_set::iterator
#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
, int
#endif
>::type indirect_set_iterator;
typedef boost::indirect_iterator_generator<
iterator_set::iterator,
const int
>::type const_indirect_set_iterator;
indirect_set_iterator sb(iter_set.begin());
indirect_set_iterator se(iter_set.end());
const_indirect_set_iterator sci(iter_set.begin());
assert(sci == sb);
assert(sci != se);
sci = se;
assert(sci == se);
*boost::prior(se) = 888;
assert(store.back() == 888);
assert(std::equal(sb, se, store.begin()));
boost::bidirectional_iterator_test(boost::next(sb), store[1], store[2]);
assert(std::equal(db, de, store.begin()));
#endif
}
int
main()
{
dummyT array[] = { dummyT(0), dummyT(1), dummyT(2),
dummyT(3), dummyT(4), dummyT(5) };
const int N = sizeof(array)/sizeof(dummyT);
// sanity check, if this doesn't pass the test is buggy
boost::random_access_iterator_test(array,N,array);
// Check that the policy concept checks and the default policy
// implementation match up.
boost::function_requires<
boost::RandomAccessIteratorPoliciesConcept<
boost::default_iterator_policies, int*,
boost::iterator<std::random_access_iterator_tag, int, std::ptrdiff_t,
int*, int&>
> >();
// Test the iterator_adaptor
{
my_iterator i(array);
boost::random_access_iterator_test(i, N, array);
const_my_iterator j(array);
boost::random_access_iterator_test(j, N, array);
boost::const_nonconst_iterator_test(i, ++j);
}
// Test transform_iterator
{
int x[N], y[N];
for (int k = 0; k < N; ++k)
x[k] = k;
std::copy(x, x + N, y);
for (int k2 = 0; k2 < N; ++k2)
x[k2] = x[k2] * 2;
boost::transform_iterator_generator<mult_functor, int*>::type
i(y, mult_functor(2));
boost::input_iterator_test(i, x[0], x[1]);
boost::input_iterator_test(boost::make_transform_iterator(&y[0], mult_functor(2)), x[0], x[1]);
}
// Test indirect_iterator_generator
{
dummyT* ptr[N];
for (int k = 0; k < N; ++k)
ptr[k] = array + k;
typedef boost::indirect_iterator_generator<dummyT**
#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
, dummyT
#endif
>::type indirect_iterator;
typedef boost::indirect_iterator_generator<dummyT**, const dummyT>::type const_indirect_iterator;
indirect_iterator i(ptr);
boost::random_access_iterator_test(i, N, array);
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
boost::random_access_iterator_test(boost::make_indirect_iterator(ptr), N, array);
#endif
// check operator->
assert((*i).m_x == i->foo());
const_indirect_iterator j(ptr);
boost::random_access_iterator_test(j, N, array);
dummyT*const* const_ptr = ptr;
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
boost::random_access_iterator_test(boost::make_indirect_iterator(const_ptr), N, array);
#endif
boost::const_nonconst_iterator_test(i, ++j);
more_indirect_iterator_tests();
}
// Test projection_iterator_pair_generator
{
typedef std::pair<dummyT,dummyT> Pair;
Pair pair_array[N];
for (int k = 0; k < N; ++k)
pair_array[k].first = array[k];
typedef boost::projection_iterator_pair_generator<select1st_<Pair>,
Pair*, const Pair*
> Projection;
Projection::iterator i(pair_array);
boost::random_access_iterator_test(i, N, array);
boost::random_access_iterator_test(boost::make_projection_iterator(pair_array, select1st_<Pair>()), N, array);
boost::random_access_iterator_test(boost::make_projection_iterator< select1st_<Pair> >(pair_array), N, array);
Projection::const_iterator j(pair_array);
boost::random_access_iterator_test(j, N, array);
boost::random_access_iterator_test(boost::make_const_projection_iterator(pair_array, select1st_<Pair>()), N, array);
boost::random_access_iterator_test(boost::make_const_projection_iterator<select1st_<Pair> >(pair_array), N, array);
boost::const_nonconst_iterator_test(i, ++j);
}
// Test reverse_iterator_generator
{
dummyT reversed[N];
std::copy(array, array + N, reversed);
std::reverse(reversed, reversed + N);
typedef boost::reverse_iterator_generator<dummyT*
#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
, dummyT
#endif
>::type reverse_iterator;
reverse_iterator i(reversed + N);
boost::random_access_iterator_test(i, N, array);
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
boost::random_access_iterator_test(boost::make_reverse_iterator(reversed + N), N, array);
#endif
typedef boost::reverse_iterator_generator<const dummyT*
#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
, const dummyT
#endif
>::type const_reverse_iterator;
const_reverse_iterator j(reversed + N);
boost::random_access_iterator_test(j, N, array);
const dummyT* const_reversed = reversed;
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
boost::random_access_iterator_test(boost::make_reverse_iterator(const_reversed + N), N, array);
#endif
boost::const_nonconst_iterator_test(i, ++j);
}
// Test reverse_iterator_generator again, with traits fully deducible on all platforms
{
std::deque<dummyT> reversed_container;
std::reverse_copy(array, array + N, std::back_inserter(reversed_container));
const std::deque<dummyT>::iterator reversed = reversed_container.begin();
typedef boost::reverse_iterator_generator<
std::deque<dummyT>::iterator>::type reverse_iterator;
typedef boost::reverse_iterator_generator<
std::deque<dummyT>::const_iterator, const dummyT>::type const_reverse_iterator;
// MSVC/STLport gives an INTERNAL COMPILER ERROR when any computation
// (e.g. "reversed + N") is used in the constructor below.
const std::deque<dummyT>::iterator finish = reversed_container.end();
reverse_iterator i(finish);
boost::random_access_iterator_test(i, N, array);
boost::random_access_iterator_test(boost::make_reverse_iterator(reversed + N), N, array);
const_reverse_iterator j = reverse_iterator(finish);
boost::random_access_iterator_test(j, N, array);
const std::deque<dummyT>::const_iterator const_reversed = reversed;
boost::random_access_iterator_test(boost::make_reverse_iterator(const_reversed + N), N, array);
// Many compilers' builtin deque iterators don't interoperate well, though
// STLport fixes that problem.
#if defined(__SGI_STL_PORT) || !defined(__GNUC__) && !defined(__BORLANDC__) && !defined(BOOST_MSVC)
boost::const_nonconst_iterator_test(i, ++j);
#endif
}
// Test integer_range's iterators
{
int int_array[] = { 0, 1, 2, 3, 4, 5 };
boost::integer_range<int> r(0, 5);
boost::random_access_iterator_test(r.begin(), r.size(), int_array);
}
// Test filter iterator
{
// Using typedefs for filter_gen::type and filter_gen::policies_type
// confused Borland terribly.
typedef boost::detail::non_bidirectional_category<dummyT*>::type category;
typedef ::boost::filter_iterator_generator<one_or_four, dummyT*
#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
, dummyT
#endif
> filter_iter_gen;
#ifndef __BORLANDC__
typedef filter_iter_gen::type filter_iter;
#else
# define filter_iter filter_iter_gen::type // Borland has a problem with the above
#endif
filter_iter i(array, filter_iter::policies_type(one_or_four(), array + N));
boost::forward_iterator_test(i, dummyT(1), dummyT(4));
enum { is_forward = boost::is_same<
filter_iter::iterator_category,
std::forward_iterator_tag>::value };
BOOST_STATIC_ASSERT(is_forward);
// On compilers not supporting partial specialization, we can do more type
// deduction with deque iterators than with pointers... unless the library
// is broken ;-(
#if !defined(BOOST_MSVC) || defined(__SGI_STL_PORT)
std::deque<dummyT> array2;
std::copy(array+0, array+N, std::back_inserter(array2));
boost::forward_iterator_test(
boost::make_filter_iterator(array2.begin(), array2.end(), one_or_four()),
dummyT(1), dummyT(4));
boost::forward_iterator_test(
boost::make_filter_iterator<one_or_four>(array2.begin(), array2.end()),
dummyT(1), dummyT(4));
#endif
#if !defined(BOOST_MSVC) // This just freaks MSVC out completely
boost::forward_iterator_test(
boost::make_filter_iterator<one_or_four>(
boost::make_reverse_iterator(array2.end()),
boost::make_reverse_iterator(array2.begin())
),
dummyT(4), dummyT(1));
#endif
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
boost::forward_iterator_test(
boost::make_filter_iterator(array+0, array+N, one_or_four()),
dummyT(1), dummyT(4));
boost::forward_iterator_test(
boost::make_filter_iterator<one_or_four>(array, array + N),
dummyT(1), dummyT(4));
#endif
}
// check operator-> with a forward iterator
{
boost::forward_iterator_archetype<dummyT> forward_iter;
typedef boost::iterator_adaptor<boost::forward_iterator_archetype<dummyT>,
boost::default_iterator_policies,
dummyT, const dummyT&,
std::forward_iterator_tag, std::ptrdiff_t, const dummyT*> adaptor_type;
adaptor_type i(forward_iter);
if (0) // don't do this, just make sure it compiles
assert((*i).m_x == i->foo());
}
// check operator-> with an input iterator
{
boost::input_iterator_archetype<dummyT> input_iter;
typedef boost::iterator_adaptor<boost::input_iterator_archetype<dummyT>,
boost::default_iterator_policies,
dummyT, const dummyT&,
std::input_iterator_tag, std::ptrdiff_t, const dummyT*> adaptor_type;
adaptor_type i(input_iter);
if (0) // don't do this, just make sure it compiles
assert((*i).m_x == i->foo());
}
std::cout << "test successful " << std::endl;
return 0;
}

View File

@@ -1,659 +0,0 @@
// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
// Permission to copy, use, modify, sell and
// distribute this software is granted provided this copyright notice appears
// in all copies. This software is provided "as is" without express or implied
// warranty, and with no claim as to its suitability for any purpose.
// standalone test program for <boost/type_traits.hpp>
/* Release notes:
20 Jan 2001:
Suppress an expected warning for MSVC
Added a test to prove that we can use void with is_same<>
Removed "press any key to exit" as it interferes with testing in large
batches.
(David Abahams)
31st July 2000:
Added extra tests for is_empty, is_convertible, alignment_of.
23rd July 2000:
Removed all call_traits tests to call_traits_test.cpp
Removed all compressed_pair tests to compressed_pair_tests.cpp
Improved tests macros
Tidied up specialistions of type_types classes for test cases.
*/
#include <iostream>
#include <typeinfo>
#include <boost/type_traits.hpp>
#include <boost/utility.hpp>
#include "type_traits_test.hpp"
using namespace boost;
// Since there is no compiler support, we should specialize:
// is_enum for all enumerations (is_enum implies is_POD)
// is_union for all unions
// is_empty for all empty composites
// is_POD for all PODs (except enums) (is_POD implies has_*)
// has_* for any UDT that has that trait and is not POD
enum enum_UDT{ one, two, three };
struct UDT
{
UDT();
~UDT();
UDT(const UDT&);
UDT& operator=(const UDT&);
int i;
void f1();
int f2();
int f3(int);
int f4(int, float);
};
struct POD_UDT { int x; };
struct empty_UDT{ ~empty_UDT(){}; };
struct empty_POD_UDT{};
union union_UDT
{
int x;
double y;
~union_UDT();
};
union POD_union_UDT
{
int x;
double y;
};
union empty_union_UDT
{
~empty_union_UDT();
};
union empty_POD_union_UDT{};
#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
namespace boost {
template <> struct is_enum<enum_UDT>
{ static const bool value = true; };
template <> struct is_POD<POD_UDT>
{ static const bool value = true; };
// this type is not POD, so we have to specialize the has_* individually
template <> struct has_trivial_constructor<empty_UDT>
{ static const bool value = true; };
template <> struct has_trivial_copy<empty_UDT>
{ static const bool value = true; };
template <> struct has_trivial_assign<empty_UDT>
{ static const bool value = true; };
template <> struct is_POD<empty_POD_UDT>
{ static const bool value = true; };
template <> struct is_union<union_UDT>
{ static const bool value = true; };
template <> struct is_union<POD_union_UDT>
{ static const bool value = true; };
template <> struct is_POD<POD_union_UDT>
{ static const bool value = true; };
template <> struct is_union<empty_union_UDT>
{ static const bool value = true; };
// this type is not POD, so we have to specialize the has_* individually
template <> struct has_trivial_constructor<empty_union_UDT>
{ static const bool value = true; };
template <> struct has_trivial_copy<empty_union_UDT>
{ static const bool value = true; };
template <> struct has_trivial_assign<empty_union_UDT>
{ static const bool value = true; };
template <> struct is_union<empty_POD_union_UDT>
{ static const bool value = true; };
template <> struct is_POD<empty_POD_union_UDT>
{ static const bool value = true; };
}
#else
namespace boost {
template <> struct is_enum<enum_UDT>
{ enum{ value = true }; };
template <> struct is_POD<POD_UDT>
{ enum{ value = true }; };
// this type is not POD, so we have to specialize the has_* individually
template <> struct has_trivial_constructor<empty_UDT>
{ enum{ value = true }; };
template <> struct has_trivial_copy<empty_UDT>
{ enum{ value = true }; };
template <> struct has_trivial_assign<empty_UDT>
{ enum{ value = true }; };
template <> struct is_POD<empty_POD_UDT>
{ enum{ value = true }; };
template <> struct is_union<union_UDT>
{ enum{ value = true }; };
template <> struct is_union<POD_union_UDT>
{ enum{ value = true }; };
template <> struct is_POD<POD_union_UDT>
{ enum{ value = true }; };
template <> struct is_union<empty_union_UDT>
{ enum{ value = true }; };
// this type is not POD, so we have to specialize the has_* individually
template <> struct has_trivial_constructor<empty_union_UDT>
{ enum{ value = true }; };
template <> struct has_trivial_copy<empty_union_UDT>
{ enum{ value = true }; };
template <> struct has_trivial_assign<empty_union_UDT>
{ enum{ value = true }; };
template <> struct is_union<empty_POD_union_UDT>
{ enum{ value = true }; };
template <> struct is_POD<empty_POD_union_UDT>
{ enum{ value = true }; };
}
#endif
class Base { };
class Deriverd : public Base { };
class NonDerived { };
enum enum1
{
one_,two_
};
enum enum2
{
three_,four_
};
struct VB
{
virtual ~VB(){};
};
struct VD : VB
{
~VD(){};
};
//
// struct non_pointer:
// used to verify that is_pointer does not return
// true for class types that implement operator void*()
//
struct non_pointer
{
operator void*(){return this;}
};
//
// struct non_empty:
// used to verify that is_empty does not emit
// spurious warnings or errors.
//
struct non_empty : boost::noncopyable
{
int i;
};
// Steve: All comments that I (Steve Cleary) have added below are prefixed with
// "Steve:" The failures that BCB4 has on the tests are due to Borland's
// not considering cv-qual's as a part of the type -- they are considered
// compiler hints only. These failures should be fixed before long.
int main()
{
std::cout << "Checking type operations..." << std::endl << std::endl;
// cv-qualifiers applied to reference types should have no effect
// declare these here for later use with is_reference and remove_reference:
typedef int& r_type;
#ifdef BOOST_MSVC
# pragma warning(push)
# pragma warning(disable:4181) // qualifier applied to reference type ignored
#endif
typedef const r_type cr_type;
#ifdef BOOST_MSVC
# pragma warning(pop)
#endif
type_test(int, remove_reference<int>::type)
type_test(const int, remove_reference<const int>::type)
type_test(int, remove_reference<int&>::type)
type_test(const int, remove_reference<const int&>::type)
type_test(volatile int, remove_reference<volatile int&>::type)
type_test(int, remove_reference<cr_type>::type)
type_test(int, remove_const<const int>::type)
// Steve: fails on BCB4
type_test(volatile int, remove_const<volatile int>::type)
// Steve: fails on BCB4
type_test(volatile int, remove_const<const volatile int>::type)
type_test(int, remove_const<int>::type)
type_test(int*, remove_const<int* const>::type)
type_test(int, remove_volatile<volatile int>::type)
// Steve: fails on BCB4
type_test(const int, remove_volatile<const int>::type)
// Steve: fails on BCB4
type_test(const int, remove_volatile<const volatile int>::type)
type_test(int, remove_volatile<int>::type)
type_test(int*, remove_volatile<int* volatile>::type)
type_test(int, remove_cv<volatile int>::type)
type_test(int, remove_cv<const int>::type)
type_test(int, remove_cv<const volatile int>::type)
type_test(int, remove_cv<int>::type)
type_test(int*, remove_cv<int* volatile>::type)
type_test(int*, remove_cv<int* const>::type)
type_test(int*, remove_cv<int* const volatile>::type)
type_test(const int *, remove_cv<const int * const>::type)
type_test(int, remove_bounds<int>::type)
type_test(int*, remove_bounds<int*>::type)
type_test(int, remove_bounds<int[3]>::type)
type_test(int[3], remove_bounds<int[2][3]>::type)
std::cout << std::endl << "Checking type properties..." << std::endl << std::endl;
value_test(true, (is_same<void, void>::value))
value_test(false, (is_same<int, void>::value))
value_test(false, (is_same<void, int>::value))
value_test(true, (is_same<int, int>::value))
value_test(false, (is_same<int, const int>::value))
value_test(false, (is_same<int, int&>::value))
value_test(false, (is_same<int*, const int*>::value))
value_test(false, (is_same<int*, int*const>::value))
value_test(false, (is_same<int, int[2]>::value))
value_test(false, (is_same<int*, int[2]>::value))
value_test(false, (is_same<int[4], int[2]>::value))
value_test(false, is_const<int>::value)
value_test(true, is_const<const int>::value)
value_test(false, is_const<volatile int>::value)
value_test(true, is_const<const volatile int>::value)
value_test(false, is_volatile<int>::value)
value_test(false, is_volatile<const int>::value)
value_test(true, is_volatile<volatile int>::value)
value_test(true, is_volatile<const volatile int>::value)
value_test(true, is_void<void>::value)
// Steve: fails on BCB4
// JM: but looks as though it should according to [3.9.3p1]?
//value_test(false, is_void<const void>::value)
value_test(false, is_void<int>::value)
value_test(false, is_standard_unsigned_integral<UDT>::value)
value_test(false, is_standard_unsigned_integral<void>::value)
value_test(false, is_standard_unsigned_integral<bool>::value)
value_test(false, is_standard_unsigned_integral<char>::value)
value_test(false, is_standard_unsigned_integral<signed char>::value)
value_test(true, is_standard_unsigned_integral<unsigned char>::value)
value_test(false, is_standard_unsigned_integral<wchar_t>::value)
value_test(false, is_standard_unsigned_integral<short>::value)
value_test(true, is_standard_unsigned_integral<unsigned short>::value)
value_test(false, is_standard_unsigned_integral<int>::value)
value_test(true, is_standard_unsigned_integral<unsigned int>::value)
value_test(false, is_standard_unsigned_integral<long>::value)
value_test(true, is_standard_unsigned_integral<unsigned long>::value)
value_test(false, is_standard_unsigned_integral<float>::value)
value_test(false, is_standard_unsigned_integral<double>::value)
value_test(false, is_standard_unsigned_integral<long double>::value)
#ifdef ULLONG_MAX
value_test(false, is_standard_unsigned_integral<long long>::value)
value_test(false, is_standard_unsigned_integral<unsigned long long>::value)
#endif
#if defined(__BORLANDC__) || defined(_MSC_VER)
value_test(false, is_standard_unsigned_integral<__int64>::value)
value_test(false, is_standard_unsigned_integral<unsigned __int64>::value)
#endif
value_test(false, is_standard_signed_integral<UDT>::value)
value_test(false, is_standard_signed_integral<void>::value)
value_test(false, is_standard_signed_integral<bool>::value)
value_test(false, is_standard_signed_integral<char>::value)
value_test(true, is_standard_signed_integral<signed char>::value)
value_test(false, is_standard_signed_integral<unsigned char>::value)
value_test(false, is_standard_signed_integral<wchar_t>::value)
value_test(true, is_standard_signed_integral<short>::value)
value_test(false, is_standard_signed_integral<unsigned short>::value)
value_test(true, is_standard_signed_integral<int>::value)
value_test(false, is_standard_signed_integral<unsigned int>::value)
value_test(true, is_standard_signed_integral<long>::value)
value_test(false, is_standard_signed_integral<unsigned long>::value)
value_test(false, is_standard_signed_integral<float>::value)
value_test(false, is_standard_signed_integral<double>::value)
value_test(false, is_standard_signed_integral<long double>::value)
#ifdef ULLONG_MAX
value_test(false, is_standard_signed_integral<long long>::value)
value_test(false, is_standard_signed_integral<unsigned long long>::value)
#endif
#if defined(__BORLANDC__) || defined(_MSC_VER)
value_test(false, is_standard_signed_integral<__int64>::value)
value_test(false, is_standard_signed_integral<unsigned __int64>::value)
#endif
value_test(false, is_standard_arithmetic<UDT>::value)
value_test(false, is_standard_arithmetic<void>::value)
value_test(true, is_standard_arithmetic<bool>::value)
value_test(true, is_standard_arithmetic<char>::value)
value_test(true, is_standard_arithmetic<signed char>::value)
value_test(true, is_standard_arithmetic<unsigned char>::value)
value_test(true, is_standard_arithmetic<wchar_t>::value)
value_test(true, is_standard_arithmetic<short>::value)
value_test(true, is_standard_arithmetic<unsigned short>::value)
value_test(true, is_standard_arithmetic<int>::value)
value_test(true, is_standard_arithmetic<unsigned int>::value)
value_test(true, is_standard_arithmetic<long>::value)
value_test(true, is_standard_arithmetic<unsigned long>::value)
value_test(true, is_standard_arithmetic<float>::value)
value_test(true, is_standard_arithmetic<double>::value)
value_test(true, is_standard_arithmetic<long double>::value)
#ifdef ULLONG_MAX
value_test(false, is_standard_arithmetic<long long>::value)
value_test(false, is_standard_arithmetic<unsigned long long>::value)
#endif
#if defined(__BORLANDC__) || defined(_MSC_VER)
value_test(false, is_standard_arithmetic<__int64>::value)
value_test(false, is_standard_arithmetic<unsigned __int64>::value)
#endif
value_test(false, is_standard_fundamental<UDT>::value)
value_test(true, is_standard_fundamental<void>::value)
value_test(true, is_standard_fundamental<bool>::value)
value_test(true, is_standard_fundamental<char>::value)
value_test(true, is_standard_fundamental<signed char>::value)
value_test(true, is_standard_fundamental<unsigned char>::value)
value_test(true, is_standard_fundamental<wchar_t>::value)
value_test(true, is_standard_fundamental<short>::value)
value_test(true, is_standard_fundamental<unsigned short>::value)
value_test(true, is_standard_fundamental<int>::value)
value_test(true, is_standard_fundamental<unsigned int>::value)
value_test(true, is_standard_fundamental<long>::value)
value_test(true, is_standard_fundamental<unsigned long>::value)
value_test(true, is_standard_fundamental<float>::value)
value_test(true, is_standard_fundamental<double>::value)
value_test(true, is_standard_fundamental<long double>::value)
#ifdef ULLONG_MAX
value_test(false, is_standard_fundamental<long long>::value)
value_test(false, is_standard_fundamental<unsigned long long>::value)
#endif
#if defined(__BORLANDC__) || defined(_MSC_VER)
value_test(false, is_standard_fundamental<__int64>::value)
value_test(false, is_standard_fundamental<unsigned __int64>::value)
#endif
value_test(false, is_arithmetic<UDT>::value)
value_test(true, is_arithmetic<char>::value)
value_test(true, is_arithmetic<signed char>::value)
value_test(true, is_arithmetic<unsigned char>::value)
value_test(true, is_arithmetic<wchar_t>::value)
value_test(true, is_arithmetic<short>::value)
value_test(true, is_arithmetic<unsigned short>::value)
value_test(true, is_arithmetic<int>::value)
value_test(true, is_arithmetic<unsigned int>::value)
value_test(true, is_arithmetic<long>::value)
value_test(true, is_arithmetic<unsigned long>::value)
value_test(true, is_arithmetic<float>::value)
value_test(true, is_arithmetic<double>::value)
value_test(true, is_arithmetic<long double>::value)
value_test(true, is_arithmetic<bool>::value)
#ifdef ULLONG_MAX
value_test(true, is_arithmetic<long long>::value)
value_test(true, is_arithmetic<unsigned long long>::value)
#endif
#if defined(__BORLANDC__) || defined(_MSC_VER)
value_test(true, is_arithmetic<__int64>::value)
value_test(true, is_arithmetic<unsigned __int64>::value)
#endif
value_test(false, is_array<int>::value)
value_test(false, is_array<int*>::value)
value_test(false, is_array<const int*>::value)
value_test(false, is_array<const volatile int*>::value)
value_test(true, is_array<int[2]>::value)
value_test(true, is_array<const int[2]>::value)
value_test(true, is_array<const volatile int[2]>::value)
value_test(true, is_array<int[2][3]>::value)
value_test(true, is_array<UDT[2]>::value)
value_test(false, is_array<int(&)[2]>::value)
typedef void(*f1)();
typedef int(*f2)(int);
typedef int(*f3)(int, bool);
typedef void (UDT::*mf1)();
typedef int (UDT::*mf2)();
typedef int (UDT::*mf3)(int);
typedef int (UDT::*mf4)(int, float);
value_test(false, is_const<f1>::value)
value_test(false, is_reference<f1>::value)
value_test(false, is_array<f1>::value)
value_test(false, is_pointer<int>::value)
value_test(false, is_pointer<int&>::value)
value_test(true, is_pointer<int*>::value)
value_test(true, is_pointer<const int*>::value)
value_test(true, is_pointer<volatile int*>::value)
value_test(true, is_pointer<non_pointer*>::value)
// Steve: was 'true', should be 'false', via 3.9.2p3, 3.9.3p1
value_test(false, is_pointer<int*const>::value)
// Steve: was 'true', should be 'false', via 3.9.2p3, 3.9.3p1
value_test(false, is_pointer<int*volatile>::value)
// Steve: was 'true', should be 'false', via 3.9.2p3, 3.9.3p1
value_test(false, is_pointer<int*const volatile>::value)
// JM 02 Oct 2000:
value_test(false, is_pointer<non_pointer>::value)
value_test(false, is_pointer<int*&>::value)
value_test(false, is_pointer<int(&)[2]>::value)
value_test(false, is_pointer<int[2]>::value)
value_test(false, is_pointer<char[sizeof(void*)]>::value)
value_test(true, is_pointer<f1>::value)
value_test(true, is_pointer<f2>::value)
value_test(true, is_pointer<f3>::value)
// Steve: was 'true', should be 'false', via 3.9.2p3
value_test(false, is_pointer<mf1>::value)
// Steve: was 'true', should be 'false', via 3.9.2p3
value_test(false, is_pointer<mf2>::value)
// Steve: was 'true', should be 'false', via 3.9.2p3
value_test(false, is_pointer<mf3>::value)
// Steve: was 'true', should be 'false', via 3.9.2p3
value_test(false, is_pointer<mf4>::value)
value_test(false, is_reference<bool>::value)
value_test(true, is_reference<int&>::value)
value_test(true, is_reference<const int&>::value)
value_test(true, is_reference<volatile int &>::value)
value_test(true, is_reference<r_type>::value)
value_test(true, is_reference<cr_type>::value)
value_test(true, is_reference<const UDT&>::value)
value_test(false, is_class<int>::value)
value_test(false, is_class<const int>::value)
value_test(false, is_class<volatile int>::value)
value_test(false, is_class<int*>::value)
value_test(false, is_class<int* const>::value)
value_test(false, is_class<int[2]>::value)
value_test(false, is_class<int&>::value)
value_test(false, is_class<mf4>::value)
value_test(false, is_class<f1>::value)
value_test(false, is_class<enum_UDT>::value)
value_test(true, is_class<UDT>::value)
value_test(true, is_class<UDT const>::value)
value_test(true, is_class<UDT volatile>::value)
value_test(true, is_class<empty_UDT>::value)
value_test(true, is_class<std::iostream>::value)
value_test(false, is_class<UDT*>::value)
value_test(false, is_class<UDT[2]>::value)
value_test(false, is_class<UDT&>::value)
value_test(true, is_object<int>::value)
value_test(true, is_object<UDT>::value)
value_test(false, is_object<int&>::value)
value_test(false, is_object<void>::value)
value_test(true, is_standard_scalar<int>::value)
value_test(true, is_extension_scalar<void*>::value)
value_test(false, is_enum<int>::value)
value_test(true, is_enum<enum_UDT>::value)
value_test(false, is_member_pointer<f1>::value)
value_test(false, is_member_pointer<f2>::value)
value_test(false, is_member_pointer<f3>::value)
value_test(true, is_member_pointer<mf1>::value)
value_test(true, is_member_pointer<mf2>::value)
value_test(true, is_member_pointer<mf3>::value)
value_test(true, is_member_pointer<mf4>::value)
value_test(false, is_empty<int>::value)
value_test(false, is_empty<int*>::value)
value_test(false, is_empty<int&>::value)
#if defined(__MWERKS__) || defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
// apparent compiler bug causes this to fail to compile:
value_fail(false, is_empty<int[2]>::value)
#else
value_test(false, is_empty<int[2]>::value)
#endif
#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
value_fail(false, is_empty<f1>::value)
#else
value_test(false, is_empty<f1>::value)
#endif
value_test(false, is_empty<mf1>::value)
value_test(false, is_empty<UDT>::value)
value_test(true, is_empty<empty_UDT>::value)
value_test(true, is_empty<empty_POD_UDT>::value)
#if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
value_fail(true, is_empty<empty_union_UDT>::value)
#else
value_test(true, is_empty<empty_union_UDT>::value)
#endif
value_test(false, is_empty<enum_UDT>::value)
value_test(true, is_empty<boost::noncopyable>::value)
value_test(false, is_empty<non_empty>::value)
value_test(true, has_trivial_constructor<int>::value)
value_test(true, has_trivial_constructor<int*>::value)
value_test(true, has_trivial_constructor<int*const>::value)
value_test(true, has_trivial_constructor<const int>::value)
value_test(true, has_trivial_constructor<volatile int>::value)
value_test(true, has_trivial_constructor<int[2]>::value)
value_test(true, has_trivial_constructor<int[3][2]>::value)
value_test(true, has_trivial_constructor<int[2][4][5][6][3]>::value)
value_test(true, has_trivial_constructor<f1>::value)
value_test(true, has_trivial_constructor<mf2>::value)
value_test(false, has_trivial_constructor<UDT>::value)
value_test(true, has_trivial_constructor<empty_UDT>::value)
value_test(true, has_trivial_constructor<enum_UDT>::value)
value_test(true, has_trivial_copy<int>::value)
value_test(true, has_trivial_copy<int*>::value)
value_test(true, has_trivial_copy<int*const>::value)
value_test(true, has_trivial_copy<const int>::value)
// Steve: was 'false' -- should be 'true' via 3.9p3, 3.9p10
value_test(true, has_trivial_copy<volatile int>::value)
value_test(true, has_trivial_copy<int[2]>::value)
value_test(true, has_trivial_copy<int[3][2]>::value)
value_test(true, has_trivial_copy<int[2][4][5][6][3]>::value)
value_test(true, has_trivial_copy<f1>::value)
value_test(true, has_trivial_copy<mf2>::value)
value_test(false, has_trivial_copy<UDT>::value)
value_test(true, has_trivial_copy<empty_UDT>::value)
value_test(true, has_trivial_copy<enum_UDT>::value)
value_test(true, has_trivial_assign<int>::value)
value_test(true, has_trivial_assign<int*>::value)
value_test(true, has_trivial_assign<int*const>::value)
value_test(true, has_trivial_assign<const int>::value)
// Steve: was 'false' -- should be 'true' via 3.9p3, 3.9p10
value_test(true, has_trivial_assign<volatile int>::value)
value_test(true, has_trivial_assign<int[2]>::value)
value_test(true, has_trivial_assign<int[3][2]>::value)
value_test(true, has_trivial_assign<int[2][4][5][6][3]>::value)
value_test(true, has_trivial_assign<f1>::value)
value_test(true, has_trivial_assign<mf2>::value)
value_test(false, has_trivial_assign<UDT>::value)
value_test(true, has_trivial_assign<empty_UDT>::value)
value_test(true, has_trivial_assign<enum_UDT>::value)
value_test(true, has_trivial_destructor<int>::value)
value_test(true, has_trivial_destructor<int*>::value)
value_test(true, has_trivial_destructor<int*const>::value)
value_test(true, has_trivial_destructor<const int>::value)
value_test(true, has_trivial_destructor<volatile int>::value)
value_test(true, has_trivial_destructor<int[2]>::value)
value_test(true, has_trivial_destructor<int[3][2]>::value)
value_test(true, has_trivial_destructor<int[2][4][5][6][3]>::value)
value_test(true, has_trivial_destructor<f1>::value)
value_test(true, has_trivial_destructor<mf2>::value)
value_test(false, has_trivial_destructor<UDT>::value)
value_test(false, has_trivial_destructor<empty_UDT>::value)
value_test(true, has_trivial_destructor<enum_UDT>::value)
value_test(true, is_POD<int>::value)
value_test(true, is_POD<int*>::value)
// Steve: was 'true', should be 'false', via 3.9p10
value_test(false, is_POD<int&>::value)
value_test(true, is_POD<int*const>::value)
value_test(true, is_POD<const int>::value)
// Steve: was 'false', should be 'true', via 3.9p10
value_test(true, is_POD<volatile int>::value)
// Steve: was 'true', should be 'false', via 3.9p10
value_test(false, is_POD<const int&>::value)
value_test(true, is_POD<int[2]>::value)
value_test(true, is_POD<int[3][2]>::value)
value_test(true, is_POD<int[2][4][5][6][3]>::value)
value_test(true, is_POD<f1>::value)
value_test(true, is_POD<mf2>::value)
value_test(false, is_POD<UDT>::value)
value_test(false, is_POD<empty_UDT>::value)
value_test(true, is_POD<enum_UDT>::value)
value_test(true, (boost::is_convertible<Deriverd,Base>::value));
value_test(true, (boost::is_convertible<Deriverd,Deriverd>::value));
value_test(true, (boost::is_convertible<Base,Base>::value));
value_test(false, (boost::is_convertible<Base,Deriverd>::value));
value_test(true, (boost::is_convertible<Deriverd,Deriverd>::value));
value_test(false, (boost::is_convertible<NonDerived,Base>::value));
value_test(false, (boost::is_convertible<boost::noncopyable, int>::value));
value_test(true, (boost::is_convertible<float,int>::value));
#if defined(BOOST_MSVC6_MEMBER_TEMPLATES) || !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
value_test(false, (boost::is_convertible<float,void>::value));
value_test(false, (boost::is_convertible<void,float>::value));
value_test(true, (boost::is_convertible<void,void>::value));
#endif
value_test(true, (boost::is_convertible<enum1, int>::value));
value_test(true, (boost::is_convertible<Deriverd*, Base*>::value));
value_test(false, (boost::is_convertible<Base*, Deriverd*>::value));
value_test(true, (boost::is_convertible<Deriverd&, Base&>::value));
value_test(false, (boost::is_convertible<Base&, Deriverd&>::value));
value_test(true, (boost::is_convertible<const Deriverd*, const Base*>::value));
value_test(false, (boost::is_convertible<const Base*, const Deriverd*>::value));
value_test(true, (boost::is_convertible<const Deriverd&, const Base&>::value));
value_test(false, (boost::is_convertible<const Base&, const Deriverd&>::value));
value_test(false, (boost::is_convertible<const int *, int*>::value));
value_test(false, (boost::is_convertible<const int&, int&>::value));
value_test(true, (boost::is_convertible<int*, int[2]>::value));
value_test(false, (boost::is_convertible<const int*, int[3]>::value));
value_test(true, (boost::is_convertible<const int&, int>::value));
value_test(true, (boost::is_convertible<int(&)[4], const int*>::value));
value_test(true, (boost::is_convertible<int(&)(int), int(*)(int)>::value));
value_test(true, (boost::is_convertible<int *, const int*>::value));
value_test(true, (boost::is_convertible<int&, const int&>::value));
value_test(true, (boost::is_convertible<int[2], int*>::value));
value_test(true, (boost::is_convertible<int[2], const int*>::value));
value_test(false, (boost::is_convertible<const int[2], int*>::value));
align_test(int);
align_test(char);
align_test(double);
align_test(int[4]);
align_test(int(*)(int));
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
align_test(char&);
align_test(char (&)(int));
align_test(char(&)[4]);
#endif
align_test(int*);
//align_test(const int);
align_test(VB);
align_test(VD);
std::cout << std::endl << test_count << " tests completed (" << failures << " failures)";
return failures;
}