Compare commits

..

470 Commits

Author SHA1 Message Date
bf2154d563 This commit was manufactured by cvs2svn to create branch
'array_wrapper'.

[SVN r31998]
2005-12-12 15:22:03 +00:00
f66e844ff1 Merged from Version_1_33_1
[SVN r31949]
2005-12-08 03:23:02 +00:00
62e8cc2b36 Attempted portability fix for Sun compilers
[SVN r31904]
2005-12-04 18:47:02 +00:00
30236f8915 Made the Boost logo link to the home page
[SVN r31112]
2005-09-25 21:54:19 +00:00
155e787ea3 Fix reporting of enable_if tests
[SVN r31060]
2005-09-20 18:35:26 +00:00
1d60d49136 Large patch from Ulrich Eckhardt to fix support for EVC++ 4.
[SVN r30670]
2005-08-25 16:27:28 +00:00
2dffdac9fe Disabiguated the detail namespace.
[SVN r30558]
2005-08-12 19:06:10 +00:00
ddf00eb29d Merged from 1.33.0 release
[SVN r30540]
2005-08-12 13:02:37 +00:00
0a6acd8ce8 Fix broken links
[SVN r30403]
2005-08-03 13:01:57 +00:00
745322e797 Fix broken links
[SVN r30401]
2005-08-03 12:25:30 +00:00
9f10fc03ce More Parameter library reference edits
[SVN r30276]
2005-07-28 04:19:28 +00:00
84fbb3c896 Fix mis-nested namespace scope/#ifdef
[SVN r30159]
2005-07-18 18:50:47 +00:00
865c707756 BOOST_NO_RESULT_OF support
[SVN r30040]
2005-07-13 12:35:37 +00:00
871f3a6779 Don't use the self contained include files for boost.test as this test is linked
with the boost.test library. We end up with multiple defined symbols, otherwise.


[SVN r29559]
2005-06-14 13:46:20 +00:00
aaca5ca871 Updated Borland workaround.
[SVN r29462]
2005-06-07 09:44:19 +00:00
5a4e19989f Workaround for nonconformance to CWG issue 298, checked in on behalf of John Maddock
[SVN r29415]
2005-06-03 19:11:54 +00:00
6ea398c446 Make it clear that POD's are not zero initialised.
[SVN r29254]
2005-05-28 11:51:04 +00:00
1bd83d43e8 Improvements in type_traits have gotten MSVC 7.0 and prior down to 12 failures here
[SVN r29170]
2005-05-24 14:53:49 +00:00
5ca5b4102b Optional's Assignment fixed
[SVN r28412]
2005-04-22 13:28:34 +00:00
aca7699046 Add V2 Jamfile
[SVN r28246]
2005-04-14 13:15:46 +00:00
e702a944ca Fixes to get the tests working with the latest type traits and Boost.Test versions.
[SVN r27864]
2005-03-29 11:21:53 +00:00
a157c345ee Updated is_convertible test cases to check polymorphic-type conversions.
Added more test types to testing header.
Changed utility code to use new test header.


[SVN r27807]
2005-03-24 18:20:18 +00:00
dcb2dd4736 Removed type_traits include, added more tests
[SVN r27712]
2005-03-16 22:02:22 +00:00
ae19cd6236 work-around for Borland addressof(array) bug and associated tests
[SVN r27656]
2005-03-14 23:03:42 +00:00
3ab4d38931 Apply typo fixes from Julio M. Merino Vidal
[SVN r27513]
2005-02-27 17:28:24 +00:00
18c7fb72b5 ADL problem (with VC7.1) fixed
[SVN r27495]
2005-02-24 16:04:49 +00:00
6bb092a9b1 Add comment explaining use of assert.h
[SVN r27473]
2005-02-21 12:32:20 +00:00
f721b8b28c replaced BOOST_TEST
[SVN r27054]
2005-02-03 13:48:49 +00:00
e5ba34472d merge RC_1_32_0 fixes
[SVN r26333]
2004-11-28 04:44:21 +00:00
082ae17eaf merge RC_1_32_0 fixes
[SVN r26328]
2004-11-28 03:35:12 +00:00
dd86e09ab4 merge RC_1_32_0 tab fixes
[SVN r26327]
2004-11-28 03:27:25 +00:00
baff23116e Fixed link to function_output_iterator
[SVN r25949]
2004-10-29 19:19:20 +00:00
e549baf93a move enable_if tests into their own subdirectory
[SVN r25649]
2004-10-10 16:15:58 +00:00
30d46adcb7 bad links fixed
added myself to people


[SVN r25610]
2004-10-07 16:01:24 +00:00
e854726be0 c++boost.gif -> boost.png replacement
[SVN r25573]
2004-10-05 15:45:52 +00:00
d198bd9d96 added explicit return to main
[SVN r25387]
2004-09-24 06:17:26 +00:00
5eb23cecd0 In-place factories moved from /detail to /utility
New value_initalized tests added


[SVN r25377]
2004-09-23 17:03:54 +00:00
eff2c75bba taken care of BOOST_NO_STDC_NAMESPACE
[SVN r25345]
2004-09-22 17:18:06 +00:00
325bd73df7 In-place factories moved from /detail to /utility
New value_initalized tests added


[SVN r25313]
2004-09-21 14:54:32 +00:00
0fcc554abd Initial commit
[SVN r25178]
2004-09-17 16:53:57 +00:00
b685784155 Added new types boost::long_long_type and boost::ulong_long_type in boost/config.hpp and applied these types in place of "long long" throughout. As a result, almost all of boost now compiles cleanly with -ansi -pedantic with gcc. Changes tested with gcc 3.3, 2.95, VC7.1 and Intel 8.
[SVN r24899]
2004-09-04 10:34:49 +00:00
ac90fdc611 merge new MPL version from 'mplbook' branch
[SVN r24874]
2004-09-02 15:41:37 +00:00
51077e49f5 Fixed CW problems and refactored fail cases
[SVN r24870]
2004-09-02 13:19:50 +00:00
0c3199f72d Added my long name
[SVN r24869]
2004-09-02 12:59:42 +00:00
62675a3bcd added copyright/license
[SVN r24814]
2004-08-30 01:31:40 +00:00
c26dbaa620 Updated copyright year list, since the interface changed
[SVN r24801]
2004-08-28 20:51:19 +00:00
8201624959 Moved a template argument default for base_from_member to primary header; removed forwarding header as it's not needed anymore
[SVN r24800]
2004-08-28 20:46:17 +00:00
f2116413d6 Changed constructor templates to be generated with the Preprocessor library; added a control macro for the maximum constructor argument length
[SVN r24799]
2004-08-28 20:24:17 +00:00
b0baebeb0a fix noncopyable, finally
[SVN r24618]
2004-08-20 17:17:06 +00:00
fb943b77d5 License updates
[SVN r24597]
2004-08-19 15:19:17 +00:00
b4b39510fc ADL protection
[SVN r24595]
2004-08-19 13:12:35 +00:00
6f0f05ba12 remove forward declaration for noncopyable
[SVN r24578]
2004-08-19 02:31:29 +00:00
f0b64b6229 ADL protection
[SVN r24564]
2004-08-18 17:01:11 +00:00
4229488989 Added redirection to fix old links.
[SVN r24558]
2004-08-18 13:55:35 +00:00
acd2e6ef2b Added Daryle Walker's copyrights as requested.
[SVN r24481]
2004-08-15 10:13:49 +00:00
c26aaed71f Moved to BSL
[SVN r24446]
2004-08-12 17:13:07 +00:00
326d7ad4d7 Removed boost.org copyright assignments, and reverted to orginal author (as based on cvs history).
[SVN r24402]
2004-08-11 10:59:33 +00:00
c76a2f4aab Add my license info
[SVN r24373]
2004-08-10 13:57:30 +00:00
d8b0ff2d7e Removed Boost.org copyrights and replaced with originating authors copyright instead.
[SVN r24372]
2004-08-10 12:53:34 +00:00
996ce2d307 Updated Beman Dawes' licence statement to use the new prefered form of words.
[SVN r24370]
2004-08-10 10:34:20 +00:00
167fa4154f Eliminated unreviewed, unused, noncompiling code
[SVN r24314]
2004-08-05 18:57:39 +00:00
0c7e7c3c39 half_open_range_test removed
[SVN r24313]
2004-08-05 18:46:55 +00:00
9d8f8f41dc Include for test library fixed
[SVN r24299]
2004-08-05 09:23:05 +00:00
39c4445b39 add missing tests, reorder tests by filename
[SVN r24216]
2004-08-01 05:40:21 +00:00
7819b022ad License update
[SVN r24180]
2004-07-30 04:46:56 +00:00
65d27e7f86 License update
[SVN r24175]
2004-07-30 01:47:08 +00:00
212a70bf77 Remove "and" from copyright
[SVN r24167]
2004-07-29 15:50:36 +00:00
6b5dc18a46 Converted to Boost Software License, Version 1.0
[SVN r24096]
2004-07-27 03:43:34 +00:00
0917f83b9c Converted to Boost Software License, Version 1.0
[SVN r24055]
2004-07-26 00:32:12 +00:00
7322bd3903 License update
[SVN r24048]
2004-07-25 19:13:06 +00:00
e998010184 Add license
[SVN r24021]
2004-07-25 03:57:20 +00:00
918a1c93e4 Doug Gregor -> Douglas Gregor
[SVN r24016]
2004-07-25 02:29:29 +00:00
14c87853c2 Needed to include cstddef to get std::size_t
[SVN r24000]
2004-07-23 18:42:30 +00:00
d5a5b84a40 Switch the test to use std::stringstream, not std::ostrstream, since
the latter is deprecated and gcc warns whenever one tries to use it.


[SVN r23896]
2004-07-21 12:28:18 +00:00
35d3c03d19 Update
[SVN r23085]
2004-06-11 11:18:50 +00:00
8933fbb254 The binary_search_test does not require Boost.Test all all, and does not
provide 'test_main' or 'unit_test_main', so don't link to Boost.Test.


[SVN r23073]
2004-06-10 11:49:39 +00:00
c320330cd5 fixed a typo
[SVN r22754]
2004-05-06 22:38:34 +00:00
822b46a3df Complain when compiler can't support result_of
[SVN r22749]
2004-05-06 17:29:54 +00:00
a821ef6e2c Added enable_if.hpp as an include
[SVN r22735]
2004-05-04 16:07:00 +00:00
491db15997 boost/utility/result_of.hpp, boost/utility/detail/result_of_iterate.hpp:
- result_of implementation

libs/utility/test/result_of_test.cpp:
  - result_of tests

libs/utility/test/Jamfile, libs/utility/test/Jamfile.v2:
  - run result_of tests

libs/utility/utility.htm:
  - document result_of

libs/libraries.htm:
  - list result_of

index.htm:
  - announce result_of


[SVN r22720]
2004-05-02 19:55:02 +00:00
b6c826a139 shared_container_iterator library:
- updated Copyright and License notices
 - Added shared_iterator_test to the iterator test suite.


[SVN r22140]
2004-02-02 22:16:36 +00:00
7b472a05ee Obsoleted old iterator adaptor docs
[SVN r22101]
2004-02-01 04:30:15 +00:00
9a07bc0d9b Added missing include <cstddef>
[SVN r21993]
2004-01-27 11:24:25 +00:00
154d6bb198 When we have a compressed pair of two types that are the same, and both empty, then we must still have two distict objects in the pair.
[SVN r21958]
2004-01-26 11:29:07 +00:00
0dde936e61 DM fixes
[SVN r21933]
2004-01-26 00:19:59 +00:00
918bf25039 Fixed documentation for less_pointees
[SVN r21737]
2004-01-14 20:22:00 +00:00
04fda4fb4e Use proper syntax to refer to Boost.Test.
[SVN r21566]
2004-01-09 13:03:16 +00:00
e14a250d6e pro9 workarounds; some ADL protection for is_xxx
[SVN r21529]
2004-01-07 14:07:21 +00:00
806745f24e Fix tabs in file.
[SVN r21399]
2003-12-26 23:26:49 +00:00
4231f774e4 fix next_prior_test.cpp directory
[SVN r21384]
2003-12-23 19:14:37 +00:00
dfc320124f Extended next/prior using patch from Daniel Walker (Daniel.Walker-at-bowneglobal.com)
[SVN r21382]
2003-12-23 14:59:59 +00:00
be43ba1569 Improved workarounds.
[SVN r21157]
2003-12-06 03:57:54 +00:00
f3f879555a Fixed result_type
[SVN r21155]
2003-12-05 22:03:33 +00:00
3155044abd added dummy versions of enable_if templates for platforms that
have BOOST_NO_SFINAE defined


[SVN r21154]
2003-12-05 21:38:43 +00:00
484d184de5 guarded enable_if definitions with BOOST_NO_SFINAE
[SVN r21149]
2003-12-05 16:31:38 +00:00
3305cf1592 Fixed a bug in the semantics of less_pointees() {again}
[SVN r21133]
2003-12-04 01:53:29 +00:00
ec36cd8c54 Fixed a bug in the semantics of less_pointees()
[SVN r21132]
2003-12-04 01:47:31 +00:00
61fb5a0b8f fix broken link to logo
[SVN r21122]
2003-12-03 14:36:38 +00:00
8024c3e9c7 Updated license terms
[SVN r21120]
2003-12-03 13:34:11 +00:00
2f5945d0cd Removed bool_testable, added note about portability of separate, explicit instantiation, changed license of documentation
[SVN r21110]
2003-12-03 07:01:28 +00:00
929517d6d7 Added enable_if library
[SVN r21090]
2003-12-02 21:41:15 +00:00
abcab174a5 _MSC_VER use clarified.
[SVN r20992]
2003-11-28 15:35:21 +00:00
801be90699 Moved from "utility" to "detail" until a Fast Track Review formalizes it.
[SVN r20983]
2003-11-28 14:36:21 +00:00
265c2348b8 Removed access category tags from iterator library, made corresponding
changes elsewhere.

boost/iterator and libs/iterator/test were updated from
branch "simplify"


[SVN r20905]
2003-11-22 01:18:37 +00:00
fb95bcc64c Moved some of my stuff to the Boost Software License, Version 1.0
[SVN r20681]
2003-11-05 07:04:53 +00:00
aedc410525 New License
[SVN r20607]
2003-11-03 02:59:08 +00:00
7fa440c154 *** empty log message ***
[SVN r20511]
2003-10-28 00:09:18 +00:00
746e0fad2b Changed email address to john@johnmaddock.co.uk
[SVN r20472]
2003-10-24 11:13:42 +00:00
1616f6f5a8 Update credits for R. Samuel Klatchko
[SVN r20325]
2003-10-09 14:16:15 +00:00
ca3e7d8530 Add V2 Jamfile
[SVN r20270]
2003-10-07 07:25:24 +00:00
f0f753ba6c Typed in place construction added
[SVN r20070]
2003-09-15 20:28:10 +00:00
532065b51b Change license message to reference Boost Software License
[SVN r20038]
2003-09-12 17:09:29 +00:00
4bfb534bae Added for new Boost.Optional functionality
[SVN r19995]
2003-09-10 15:40:47 +00:00
95ba7a4381 Use the import rule
[SVN r19968]
2003-09-08 17:38:49 +00:00
e92213431e Removed tie_example.cpp per Daniel's request
[SVN r19910]
2003-09-03 05:24:48 +00:00
7dd7daee1b Removed obsolete references to utility/tie
[SVN r19902]
2003-09-01 21:04:26 +00:00
953cc46220 Removed code-breaking change from boost/detail/iterator.hpp and
corresponding workarounds from tests.

Added permutation_iterator_test to the suite after fixing it up -- it
was riddled with bugs!


[SVN r19841]
2003-08-28 20:18:51 +00:00
b5ae0ad86b Moved to much cleaner system of using BOOST_TT_BROKEN_COMPILER_SPEC
for handling vc6/7 deficiencies with iterator_traits.

Fixed a bug in iterator_facade which was causing incomplete types to
be passed through is_convertible.

Reinstated libs/utility/iterator_traits_test.cpp


[SVN r19840]
2003-08-28 16:52:02 +00:00
c86fcbf456 Fix for Metrowerks CW
[SVN r19626]
2003-08-16 01:05:43 +00:00
6ded8b9ad6 Initial revision.
[SVN r19536]
2003-08-11 19:24:03 +00:00
bb6a6272e1 Updated shared_container_iterator to use the new iterator adaptors library.
Updated the documentation and examples as well to reflect the changes.


[SVN r19535]
2003-08-11 16:29:47 +00:00
242634b3fc Added safe_bool_testable_test
[SVN r19373]
2003-07-30 21:33:37 +00:00
662cf14bf6 Initial version
[SVN r19372]
2003-07-30 21:32:19 +00:00
fe3aaf62cd Undo overeager workarounding and safe_bool.
[SVN r19364]
2003-07-30 12:41:10 +00:00
cb189bd6be operators.hpp, operators_test.cpp - workaround for compilers not
supporting the PP lib, many workarounds for another problem which
   may be our bug.

linear_congruential.hpp - Borland workaround


[SVN r19350]
2003-07-30 01:11:14 +00:00
f57c914b8f Preparation for delivering nicely-formatted error messages in
Boost.Python.  The major change is that, instead of being
boost::function2<PyObject*,PyObject*,PyObject*>, py_function is now a
runtime-polymorphic wrapper for compile-time polymorphic
behavior (just like function) of our own which carries more
information/behaviors.  In particular, you can retrieve an array of
c-strings describing the types in the function signature.
Additionally, the minimum and maximum arity are stored in the
py_function object instead of in the 'function' object which wraps it.

* data_members.hpp -

     Adjustments for the new py_function.  Workarounds for CodeWarrior
     Pro 8.3 bugs in function template argument deduction with
     pointers-to-members.

* has_back_reference.hpp, test/back_reference.cpp,
  test/select_holder.cpp -

     Updated to follow the metafunction protocol

* init.hpp, detail/defaults_gen.hpp -

     Make Keywords a more-specific type in function signatures to
     prevent string literals that show up as char[N] from binding to
     the wrong argument (at least Intel 7.1 for Windows does this).

* make_function.hpp -

     Adjustments for the new py_function.  Arities are now computed
     by caller<>.

* opaque_pointer_converter.hpp, type_id.hpp -

     Use BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS facilities;
     generate specializations that all compilers can handle.

* raw_function.hpp -

     Adjustments for the new py_function.

* caller.hpp -

     Added arity and signature type name reporting.

* detail/config.hpp

     Enable __declspec(dllexport) for Cygwin, thereby fixing the
     recent horrible Cygwin linking problems.


* detail/msvc_typeinfo.hpp -

     Always pass boost::type<T>* explicitly, thereby working around
     incompatible notions of how to specialize function templates with
     default arguments on various compilers.

*   object/function.hpp
  , object/function_handle.hpp
  , object/function_object.hpp
  , object/function_object.cpp

     Adjustments for the new py_function.  Arities are carried by
     py_function.

* object/iterator.hpp, object/iterator.cpp

     Adjustments for the new py_function; we have to compute a
     signature of types to construct it with.

* object/py_function.hpp

     Removed dependency on boost::function; see the comment at the
     top of this entry for more details.

* object/select_holder.hpp

     Clean up to more closely follow MPL idioms.

* test/Jamfile -

     Adjust the embedding test for the new Cygwin use of declspec.
     Update bases and pointee tests with missing properties.

* test/input_iterator.cpp -

     Updates for the new iterator adaptors.

* test/opaque.py -

     Add Python encoding comment to suppress PendinDeprecationWarning
     with recent Python builds.

* test/str.cpp

     Pass a Python long instead of a float to string.expandtabs,
     suppressing a PendinDeprecationWarning with recent Python builds.

* libs/utility/counting_iterator_example.cpp

     Borland workaround

* libs/utility/indirect_iterator_example.cpp

     const-correctness fix.

*


[SVN r19247]
2003-07-22 00:06:41 +00:00
7cec198e14 Added missing algorithm include.
[SVN r19230]
2003-07-20 19:17:18 +00:00
52d3120528 Borland workaround
[SVN r19157]
2003-07-16 19:10:34 +00:00
f1aff5670c strict 2-phase ADL fixes.
[SVN r19152]
2003-07-16 15:16:21 +00:00
632f682292 Satisfy assignable requirement for output iterators.
[SVN r19150]
2003-07-16 14:30:47 +00:00
d1d0d6b788 Fixed Intel 7 issue (reported by Daniel Frey)
[SVN r19145]
2003-07-16 10:53:06 +00:00
3bd833c8ff avoid default parameters for function templates, they confuse SunCC
[SVN r19100]
2003-07-13 18:59:08 +00:00
1ef77b0853 fix cut-and-paste problem with subproject path
[SVN r19084]
2003-07-12 09:37:36 +00:00
074007ab8c Get examples working, mostly. Some interface expansion for a few of
the adaptors, allowing default construction of UnaryFunction and
Predicate arguments when they are class types.


[SVN r19081]
2003-07-12 04:15:13 +00:00
c4b7aaf281 Move to new iterator adaptors
[SVN r19074]
2003-07-11 22:18:58 +00:00
22b8494e9a Factored out separate utility/test Jamfile
[SVN r19068]
2003-07-11 17:24:18 +00:00
c1c8329403 Expanded base-from-member constructors to 10 arguments; did minor tweaks
[SVN r18791]
2003-06-15 01:16:49 +00:00
20a89040e1 -Wundef fixes.
[SVN r18788]
2003-06-12 17:09:24 +00:00
1c7a2a1476 IBM C++ support added.
[SVN r18587]
2003-05-28 13:45:58 +00:00
7c40cc0b63 Fixed bool_testable for compilers with BOOST_NO_OPERATORS_IN_NAMESPACE
[SVN r18521]
2003-05-23 23:09:21 +00:00
73a9e0d351 Intel support.
[SVN r18520]
2003-05-23 22:30:23 +00:00
dc9856744a Fixed tests for bool_testable
[SVN r18502]
2003-05-23 00:18:57 +00:00
88f4e47550 Added bool_testable by Sam Partington
[SVN r18413]
2003-05-15 22:40:33 +00:00
1be04eeec5 Fix a bug in preprocessor usage
[SVN r18231]
2003-04-11 06:56:52 +00:00
56acf9c325 Fixed shift-operators to respect BOOST_FORCE_SYMMETRIC_OPERATORS
[SVN r17664]
2003-02-26 21:26:57 +00:00
c6e3957efc MPL names/directory structure refactoring
[SVN r17651]
2003-02-25 23:11:41 +00:00
25e8284950 Qualified checked_delete calls to prevent ADL (reported by Daniel Frey)
[SVN r17636]
2003-02-25 13:00:22 +00:00
37a6537a5b fix metafunctions for MPL
[SVN r17621]
2003-02-25 00:57:33 +00:00
80df1d8f12 split utility.hpp header
[SVN r17472]
2003-02-17 06:20:57 +00:00
75afed7f17 Made operator()s const.
[SVN r17411]
2003-02-14 16:20:01 +00:00
1d7066aee1 __func__ is a predefined identifier, not a macro.
[SVN r17308]
2003-02-10 16:25:41 +00:00
12272a38d4 Initial Commit (was left out when the Optional Library was commited)
[SVN r17204]
2003-02-04 15:29:12 +00:00
04f901e52e fixed some typos
[SVN r17052]
2003-01-27 19:14:18 +00:00
fabfb31bf6 add value_init
[SVN r16826]
2003-01-09 13:26:13 +00:00
683701cd07 fix invalid bookmarks
[SVN r16823]
2003-01-09 13:03:37 +00:00
119c64be0b Workaround VC7 bug which strips const from nested classes
[SVN r16797]
2003-01-08 17:21:10 +00:00
d429c9a7d8 minor cleanup
[SVN r16709]
2002-12-27 16:58:27 +00:00
1e8216431b add or update See www.boost.org comments
[SVN r16708]
2002-12-27 16:51:53 +00:00
e45b2e2136 Doc link updated.
[SVN r16699]
2002-12-24 12:34:42 +00:00
9e6951009b Add /libs/lib-name to comment
[SVN r16685]
2002-12-23 02:43:12 +00:00
a009a209f1 Use BOOST_WORKAROUND
[SVN r16668]
2002-12-20 00:03:04 +00:00
97605056ed Added a note that throw_exception must not return (Beman Dawes)
[SVN r16471]
2002-12-02 12:12:42 +00:00
8fcfa33d33 Fix: Comeau with bcc32 as backend defines __BORLANDC__ as 1.
[SVN r16455]
2002-11-28 13:32:44 +00:00
aa65e3da3b sort_by_value(std::list<std::string>& l) is not declared inline anymore to make it compile with vacpp
[SVN r16407]
2002-11-25 15:54:37 +00:00
b4cfadb4d5 Metrowerks support (Bertolt Mildner)
[SVN r16263]
2002-11-15 19:44:18 +00:00
45a6249668 New BOOST_ASSERT, including documentation.
[SVN r16240]
2002-11-14 16:09:29 +00:00
1d601aef4d boost::throw_exception documentation added.
[SVN r16239]
2002-11-14 15:13:59 +00:00
32fb45eba9 checked_delete.hpp documentation added.
[SVN r16238]
2002-11-14 14:53:32 +00:00
2b7d10aceb BOOST_CURRENT_FUNCTION documentation added.
[SVN r16236]
2002-11-14 14:41:25 +00:00
5dc62711e1 Fix from Yitzhak Sapir <yitzhaks@actimize.com>
[SVN r16198]
2002-11-11 19:50:05 +00:00
252c02aca0 Works with MSVC and Intel5 now. Thanks, Aleksey!!
[SVN r16165]
2002-11-08 17:08:17 +00:00
9655beb7ba Cleanups on boost::iterator_traits<>
Broke MSVC though :(


[SVN r16157]
2002-11-08 06:57:31 +00:00
f0ea53e77e rip out illegal semicolons
[SVN r16134]
2002-11-06 18:20:38 +00:00
4755b42909 Daniel Frey's NRVO patches
[SVN r16084]
2002-11-04 01:59:32 +00:00
ef9af03c6c Changed typename to class; some libraries helpfully #define typename
[SVN r15970]
2002-10-23 13:55:18 +00:00
7439073cbf Merged from branch to trunk
[SVN r15572]
2002-09-30 16:54:26 +00:00
aff985a563 explicit "private" inheritance to avoid compiler warnings (MIPSpro)
[SVN r15422]
2002-09-17 21:06:32 +00:00
db425222d5 mpl_v2 branch checkin
[SVN r15258]
2002-09-11 05:35:41 +00:00
e20af510f7 Initial Revision
[SVN r15254]
2002-09-10 16:13:08 +00:00
d8230c6a73 Added Shared Container Iterator adaptor to iterator adaptor library.
[SVN r15169]
2002-09-05 14:05:29 +00:00
f5690787bf Distinguish between VC++ versions
[SVN r15127]
2002-09-01 14:57:40 +00:00
a4fd7b32dd Misc Kylix fixes
[SVN r15086]
2002-08-25 11:57:37 +00:00
f4336ec693 fixed typo.
[SVN r14798]
2002-08-12 20:47:54 +00:00
03d906976b Reduced probes from 10,000 to 1,000 to speed regression tests
[SVN r14789]
2002-08-12 15:05:23 +00:00
4ba6a96822 fix test_main signature
[SVN r14783]
2002-08-12 13:22:40 +00:00
1ea4140d56 Added tests for BOOST_NO_STD_ITERATOR_TRAITS
[SVN r14654]
2002-07-31 11:25:25 +00:00
351d4ecb15 Document policies() member of iterator_adaptor
[SVN r14613]
2002-07-26 00:03:24 +00:00
7fbf84dcc6 BaseType -> Base in one more place
[SVN r14605]
2002-07-25 19:10:05 +00:00
3ff49b272d fixup
[SVN r14598]
2002-07-25 14:16:54 +00:00
5b52e3d418 Fix doc based on Beman's feedback
[SVN r14596]
2002-07-25 13:52:48 +00:00
8c0eb498d3 Fix unversioned VC++ checks
[SVN r14436]
2002-07-13 12:26:19 +00:00
48a81ef7ea VC++ fixes
[SVN r14435]
2002-07-13 12:22:51 +00:00
f7610c9b26 fix link
[SVN r14318]
2002-07-05 23:51:20 +00:00
1755eaf019 Merged from RC_1_28_0
[SVN r13944]
2002-05-16 00:56:42 +00:00
6b8b218efb Removed tabs, fixed end of files.
[SVN r13803]
2002-05-10 11:35:38 +00:00
333d79b345 Add index.html so automatic tools work correctly
[SVN r13725]
2002-05-07 19:23:05 +00:00
f0fa436fe4 Added new config macro BOOST_HAS_MS_INT64 to detect presence of __int64 data type.
Modified boost source to use BOOST_HAS_LONG_LONG and BOOST_HAS_MS_INT64
   where appropriate to do so.


[SVN r13714]
2002-05-07 11:24:29 +00:00
13e6d78fa8 Fixes for Borland C++ Builder 6
[SVN r13662]
2002-05-04 11:03:42 +00:00
7126ea2685 Borland C++ Builder 6 fixes
[SVN r13659]
2002-05-04 10:55:15 +00:00
a37518cb4a Fixed broken links.
[SVN r13574]
2002-04-27 11:05:49 +00:00
64b3e8c3bd add missing #include <iterator>
[SVN r13554]
2002-04-23 19:52:11 +00:00
339937380e MSVC fixes.
[SVN r13476]
2002-04-13 13:19:57 +00:00
6156f0d302 Roll addressof() patch back in!
[SVN r13433]
2002-04-10 17:01:35 +00:00
00560e8e17 addressof.hpp:
- Peter Dimov suggested a fix to deal with those evil cv-qualifiers


[SVN r13431]
2002-04-10 14:47:32 +00:00
029ff9828f Roll back addressof() patch temporarily
[SVN r13428]
2002-04-10 09:48:30 +00:00
ec188c7c3e Make local classes nonlocal to silence annoying warnings from Borland C++
[SVN r13418]
2002-04-10 04:00:22 +00:00
0a0296a5d0 ref.hpp:
- Use addressof() instead of & operator


[SVN r13416]
2002-04-10 03:36:17 +00:00
6e26a5bbe7 boost/utility.hpp:
- Include boost/utility/addressof.hpp

boost/utility/addressof.hpp:
  - addressof() implementation

libs/utility/utility.htm:
  - Document addressof

libs/utility/addressof_test.cpp:
  - Test addressof()


[SVN r13414]
2002-04-10 03:31:18 +00:00
dc1b6246a0 boost/ref.hpp:
- Added get_pointer method to return a pointer (instead of a reference)

libs/bind/ref.html:
  - Document get_pointer


[SVN r13322]
2002-03-31 00:24:00 +00:00
15f69eaf14 Fixed new problem with Borland compile -
code clashes with some new type traits workarounds for some reason.


[SVN r13226]
2002-03-19 11:33:00 +00:00
4774a0d325 Added Copyright
[SVN r13145]
2002-03-09 20:34:06 +00:00
be78ab72c9 update expected failures for Sun CC
[SVN r13101]
2002-03-05 20:41:37 +00:00
0bc4a1b20d Warning suppressioni from Craig Rodrigues
[SVN r13098]
2002-03-05 18:55:49 +00:00
c8b674d105 Add missing paren.
[SVN r12997]
2002-03-01 17:43:00 +00:00
b421d4725a Fixed expected failures for gcc 3.1
[SVN r12994]
2002-03-01 12:27:01 +00:00
1662bb5713 use of "small" changed to "small_" to suppress confusion on some compilers
[SVN r12916]
2002-02-24 02:35:19 +00:00
ad79a21abd added portability note about using std::vector's as Base with VC++
[SVN r12875]
2002-02-21 12:09:46 +00:00
19645a52e6 Added a default constructor to shared_count and shared_ptr for incomplete types (void).
[SVN r12815]
2002-02-15 13:31:58 +00:00
74c3077c9a Added test cases for incomplete and abstract base class types.
[SVN r12803]
2002-02-14 12:57:32 +00:00
1f29191329 Modified call_traits to work with incomplete types.
[SVN r12800]
2002-02-14 12:54:57 +00:00
4b636a7680 Always say "private noncopyable" to avoid warnings.
[SVN r12762]
2002-02-08 20:08:15 +00:00
e6fc2555f3 removed tabs
[SVN r12707]
2002-02-04 20:29:35 +00:00
e27d0fcf2a New smart pointer documentation. Related clean-up of the smart pointer
library. Changing includes to include the new individual smart pointer
headers. Replacing old smart pointer library with an include of the new
smart pointer headers. Simplify ifdefs that involve the member templates
macros now that BOOST_MSVC6_MEMBER_TEMPLATES is also guaranteed to bet
set for platforms that have full member templates.


[SVN r12647]
2002-02-02 18:36:12 +00:00
2643c33b20 Doc fixes from Thomas Witt
[SVN r12621]
2002-02-01 13:03:21 +00:00
71af1e77c8 compile-time ref.hpp header test, initial checkin
[SVN r12525]
2002-01-27 13:39:06 +00:00
99e7406bd9 ref_ct_test.cpp
[SVN r12524]
2002-01-27 13:32:37 +00:00
413265f497 compile-time ref.hpp header test, initial checkin
[SVN r12522]
2002-01-27 13:07:20 +00:00
fe44cdf09b made 'reference_wrapper' Assignable
[SVN r12520]
2002-01-27 13:02:27 +00:00
e413428d71 Added tests for the new smart pointers.
[SVN r12500]
2002-01-25 13:54:30 +00:00
88b9822db7 Mark inline to avoid warning with "require prototypes" on.
[SVN r12490]
2002-01-24 19:15:30 +00:00
24045c0cd7 #included <boost/checked_delete.hpp>, removed unnecessary #includes.
[SVN r12488]
2002-01-24 17:47:08 +00:00
d2aa9f4a84 added missing #include of boost/config.hpp
[SVN r12483]
2002-01-24 16:55:41 +00:00
d2a5fd169f initial checkin
[SVN r12481]
2002-01-24 16:52:06 +00:00
4e350d9934 Modified is_reference_wrapper<> to work for reference types.
[SVN r12475]
2002-01-24 13:28:08 +00:00
f3f697bbc8 added is_reference_wrapper<>, unwrap_reference<>
[SVN r12470]
2002-01-23 21:19:14 +00:00
c7c09696db Tweak comments. Include <assert.h> and <boost/current_function.hpp> only
when needed.


[SVN r12446]
2002-01-22 18:28:33 +00:00
dbcc58d984 Smart pointer enhancements, initial commit
[SVN r12439]
2002-01-22 13:38:52 +00:00
8231310c4d initial checkin
[SVN r12390]
2002-01-21 01:29:06 +00:00
2988140430 tabs
[SVN r12360]
2002-01-19 16:07:28 +00:00
7387966005 Stripped tabs from source
[SVN r12351]
2002-01-19 12:38:14 +00:00
e0a5a61375 removed eroneous "detail::" prefix
[SVN r12326]
2002-01-15 19:14:53 +00:00
66ecd70689 removed std:: prefix from slist
[SVN r12310]
2002-01-14 14:57:20 +00:00
67f4f45653 Fixed violation of 'explicit' constructor
[SVN r12256]
2002-01-09 13:15:54 +00:00
1bf28b3de2 Fixes for Borland
[SVN r12254]
2002-01-09 12:11:37 +00:00
eb3c3435d7 Updated expected results
[SVN r12250]
2002-01-08 13:01:15 +00:00
8a81d8b16c Workarounds for MSVC
[SVN r12246]
2002-01-07 19:24:45 +00:00
bc9d8b13d0 converted some of the old terminology (OrderIterator) to the current
terminology (IndexIterator)


[SVN r12164]
2001-12-28 15:49:45 +00:00
4768b167ab Removed obsolete mentions of "less"; Added formalized Policies Concept description
[SVN r12056]
2001-12-14 12:54:21 +00:00
591ff70ed1 many fixes
[SVN r12054]
2001-12-13 19:43:35 +00:00
7bf2ad0b22 VC6 patch
[SVN r12045]
2001-12-13 18:24:29 +00:00
409c79b2e4 fix example (thanks to Michael Stevens)
[SVN r11979]
2001-12-08 08:39:27 +00:00
d0410691a1 removed calls to non-standard std::iota (SGI extension)
[SVN r11904]
2001-12-04 08:02:36 +00:00
64e5115138 Fixed spelling error ing gcc-3.0 bug workaround
[SVN r11888]
2001-12-03 21:48:54 +00:00
7ae912d83c Rolled in Helmut's fixes for random_access_iterable; rolled back
workarounds for that problem.


[SVN r11887]
2001-12-03 21:47:58 +00:00
2937f5876c changed std::iota call (SGI extension) to a manual loop
in permutation_iterator test


[SVN r11869]
2001-12-03 08:35:08 +00:00
8619c9b5c3 fix gcc looping (from Dave Abrahams)
[SVN r11839]
2001-11-30 17:55:39 +00:00
e4d5684f6b added test for permutation_iterator
[SVN r11825]
2001-11-30 11:10:07 +00:00
3d69cf95da added documentation for the permutation_iterator_adaptor
and linked to it from the iterator_adaptors documentation.


[SVN r11824]
2001-11-30 10:40:03 +00:00
18944572b7 committing Daryle and Helmut's changes
[SVN r11813]
2001-11-29 21:22:52 +00:00
3e9d0f80c2 add generator iterator adaptor
[SVN r11736]
2001-11-19 22:11:51 +00:00
a2c4d1990a add boost::generator_iterator_policies and convenience classes
[SVN r11725]
2001-11-18 17:56:43 +00:00
404261c6ee add definition for integral constants initialized in-class
[SVN r11723]
2001-11-18 17:32:19 +00:00
87abc59612 #undef BOOST_REF_CONST added
[SVN r11674]
2001-11-14 14:40:29 +00:00
cb98ddf7db Fixed a bug w/ adaptable function objects + nested binds, made ref<> return const
[SVN r11670]
2001-11-13 13:56:05 +00:00
7d2e6c9025 __stdcall support added.
[SVN r11649]
2001-11-10 19:18:58 +00:00
75eaa14a18 Removed defunct boost::tied (thanks, Daryle Walker)
[SVN r11622]
2001-11-07 10:35:12 +00:00
082d6e3b32 *** empty log message ***
[SVN r11614]
2001-11-06 16:09:14 +00:00
35b3770b6f *** empty log message ***
[SVN r11613]
2001-11-06 16:05:25 +00:00
5b9d20c7e2 *** empty log message ***
[SVN r11611]
2001-11-06 15:52:56 +00:00
5bbed2372e *** empty log message ***
[SVN r11602]
2001-11-05 21:03:59 +00:00
a9d407d239 update SunCC to 6.u2 (C++ 5.3)
[SVN r11601]
2001-11-05 21:00:53 +00:00
3ca4a33a65 updated for named parameters
[SVN r11566]
2001-11-04 16:21:51 +00:00
95197f427c remoeved #if 0
[SVN r11565]
2001-11-04 16:18:10 +00:00
84cdfb032c commit these changes
[SVN r11563]
2001-11-04 04:37:14 +00:00
ec2ceb9c96 no message
[SVN r11508]
2001-11-01 17:22:39 +00:00
6286c893fd Minor regression fixes for Borland and Sunpro tests.
[SVN r11470]
2001-10-30 11:41:35 +00:00
354aef0e8c changed named parameters doc to match new stuff
[SVN r11417]
2001-10-22 17:04:23 +00:00
139e33c36d Updated preprocessor logic to use BOOST_HAS_LONG_LONG
[SVN r11399]
2001-10-18 11:33:52 +00:00
e01de59cdd Made these actually compile
[SVN r11378]
2001-10-12 22:22:42 +00:00
686f822dea Fix spelling error: "occurances" -> "occurrences".
[SVN r11376]
2001-10-11 17:26:04 +00:00
9961d5c9af Last fix had broken preprocessor logic, now fixed.
[SVN r11373]
2001-10-11 12:04:00 +00:00
628be0d125 Fixes for Sunpro C++ 5.3 (code now works!)
[SVN r11368]
2001-10-09 11:24:56 +00:00
633e45f61a Fixed test to work with sunpro 5.3 (omits array specialisation tests)
[SVN r11359]
2001-10-08 11:35:05 +00:00
2f357c3805 Partial fixes for sunpro 5.3 - doesn't actually work yet though
[SVN r11355]
2001-10-08 11:31:29 +00:00
cda0894d0d Fix for sunpro 5.3 (array specialisations don't work)
[SVN r11354]
2001-10-08 11:30:53 +00:00
117720a8bc 1.25.0 Final runup
[SVN r11315]
2001-10-01 15:54:23 +00:00
a6f6c3613a Change comments to make it clear why forward declaration header is required.
[SVN r11314]
2001-10-01 14:15:44 +00:00
7914f5b931 Fixed unused variables that show up as warnings when doing regression
tests.


[SVN r11241]
2001-09-24 23:21:16 +00:00
a1add0a6f6 Intel C++ fixes: Added class copy constructor.
[SVN r11200]
2001-09-22 11:52:56 +00:00
c032b337c4 Fix broken links and other HTML changes related to new config system
[SVN r11142]
2001-09-18 21:24:51 +00:00
ec363261ae remove "explicit" on two- and three-argument constructors to avoid
error on HP aCC


[SVN r11097]
2001-09-11 18:42:25 +00:00
97cde2183d Initial base_from_member commit
[SVN r11086]
2001-09-10 14:04:28 +00:00
7f43c682db Fixed the pair_generator documentation. Order of parameters was wrong; reordered
the table to match the corrected order.


[SVN r11035]
2001-09-05 16:29:29 +00:00
0c9eee3c6b changed note about the move to the tuples library
[SVN r10972]
2001-08-30 19:45:19 +00:00
3b1afa3ba6 changed "empty-member" to "empty base-class"
[SVN r10966]
2001-08-30 10:58:19 +00:00
93e6a75125 changed #include for tie() to tuple.hpp
[SVN r10951]
2001-08-28 19:09:33 +00:00
52f8a7c0ca changed #include for tie()
[SVN r10950]
2001-08-28 19:07:51 +00:00
55bfeb646f removed tie() and class tied
[SVN r10938]
2001-08-26 19:55:49 +00:00
75c9dd3be1 added not about constness of operator* and operator[]
[SVN r10931]
2001-08-24 15:28:20 +00:00
6392e2788f Removed incorrect statics, added const
[SVN r10930]
2001-08-24 12:09:34 +00:00
6a97f3f9ba Tabs converted to spaces.
[SVN r10916]
2001-08-23 19:05:21 +00:00
6e5f52e279 initial commit
[SVN r10914]
2001-08-23 18:42:16 +00:00
7f92bed902 Fix some broken links. Fix order of constructor initializers.
[SVN r10913]
2001-08-23 17:42:07 +00:00
d68a11cc42 Misc; mostly fix links to hard disk locations
[SVN r10902]
2001-08-20 13:04:43 +00:00
328a81e194 Fix broken hyperlink
[SVN r10896]
2001-08-19 15:08:33 +00:00
31d0908b74 Add workaround for BOOST_NO_STDC_NAMESPACE
[SVN r10681]
2001-07-20 21:29:36 +00:00
32c77599f4 Fixes for ICL
[SVN r10613]
2001-07-14 12:51:59 +00:00
812ebf3562 Back out commit made in error
[SVN r10596]
2001-07-12 16:15:30 +00:00
37f476013d Change absolute URL's to relative
[SVN r10594]
2001-07-12 15:31:15 +00:00
9f3104166f output_iterator_helper changes: removed default template parameters, added
support for self-proxying, additional documentation and tests (Aleksey Gurtovoy)


[SVN r10576]
2001-07-09 23:51:49 +00:00
64cc0daf34 Integrate Aleksey's changes
[SVN r10575]
2001-07-09 23:50:55 +00:00
d5d64df124 Fix broken link
[SVN r10553]
2001-07-06 19:19:45 +00:00
0edcfcd5c1 Tuples library causes tie to be deprecated
[SVN r10552]
2001-07-06 19:16:39 +00:00
50ba2d419a Tweeked gcc workaround (gcc 3 still has same problem as gcc 2.9x), added tentative Metrowerks and Intel compiler workarounds.
[SVN r10422]
2001-06-25 11:31:14 +00:00
ff3a77ca5a Fixed problem with VC6 compilers - probably a temporary fix.
[SVN r10361]
2001-06-20 11:43:57 +00:00
4eaed6c23d remove superfluous, illegal "typename" (twice)
[SVN r10314]
2001-06-12 18:50:37 +00:00
4d0dd46471 meant to add as a branch
[SVN r10280]
2001-06-06 19:16:34 +00:00
9c2549bd00 files for the tmpw2001 paper about iterator adaptors
[SVN r10278]
2001-06-06 19:08:51 +00:00
b7c8e0c17f changes from Daryle Walker
[SVN r10264]
2001-06-04 11:57:37 +00:00
dd3cfe1837 removed old arg ordering, use defaults instead
[SVN r10258]
2001-06-03 20:00:24 +00:00
43f525298e Remove compiler workarounds no longer needed due to BOOST_STATIC_ASSERT fix. For stylistic reasons, change sizeof() test to sizeof() != 0
[SVN r10236]
2001-05-28 14:22:30 +00:00
1bb1898ab9 Dave says qualifiers weren't really needed
[SVN r10222]
2001-05-24 19:11:51 +00:00
9578f24be9 Workaround compiler problems while waiting to find out if BOOST_STATIC_ASSERT is broken
[SVN r10218]
2001-05-24 16:02:42 +00:00
46fae3aed2 added check_delete workaround for Sun CC
[SVN r10213]
2001-05-24 09:26:48 +00:00
e35f91a70a Smart pointer and utility changes related to adding checked_delere and checked_array_delete
[SVN r10189]
2001-05-22 18:58:21 +00:00
851052fcca Updated docs - added VC6 bug warning
[SVN r10062]
2001-05-08 11:17:44 +00:00
5ef81b2952 Updated/stricter test program
[SVN r10061]
2001-05-08 11:17:05 +00:00
ef2851c053 Fixes for Sun C++ 5.1
[SVN r10060]
2001-05-08 11:16:35 +00:00
0b4387cff5 reorganised tests to show up VC6 bugs
[SVN r10002]
2001-05-02 10:59:32 +00:00
a40cf11fbf Rewritten compressed_pair regression script to test everything in a more methodical way
[SVN r10000]
2001-05-01 11:17:02 +00:00
5c495cd223 Change all eGroups references to YahooGroups
[SVN r9979]
2001-04-25 00:24:50 +00:00
cf1296dff8 added stuff about Default Constructible needed for the function object
[SVN r9683]
2001-03-29 16:26:42 +00:00
d6d88db6e8 std::bind1st -> boost::bind1st
[SVN r9682]
2001-03-29 16:19:34 +00:00
85c2a35257 std::binder1st -> boost::binder1st
[SVN r9681]
2001-03-29 16:18:41 +00:00
836d8b1c64 added spaces in name
[SVN r9673]
2001-03-29 04:08:38 +00:00
98d8c8ab71 fixed broken link
[SVN r9645]
2001-03-27 10:54:12 +00:00
db45013339 fixed sgi stl link
[SVN r9631]
2001-03-22 16:06:15 +00:00
a55c37e7f6 fixed sgi stl links
[SVN r9630]
2001-03-22 16:05:48 +00:00
46a270fcca fixed link to sgi stl
[SVN r9629]
2001-03-22 16:02:11 +00:00
967856518e updated link to sgi stl
[SVN r9628]
2001-03-22 16:01:18 +00:00
7f93e739fe added documentation for initialize() policy function
[SVN r9592]
2001-03-19 21:46:14 +00:00
2cd1422514 added comment about abstract base classes as value_type
[SVN r9584]
2001-03-19 17:31:27 +00:00
feb370b201 1.21.0 run up including fixing broken links
[SVN r9523]
2001-03-09 14:36:41 +00:00
d1b34e64d8 Fixes for validator.w3.org
[SVN r9518]
2001-03-09 03:28:13 +00:00
b9a1eead40 Mostly clarification. Fix: changed "category" to "iterator_category" in one place.
[SVN r9517]
2001-03-09 03:10:32 +00:00
1e4bfac98c added named template parameter to table of contents
[SVN r9510]
2001-03-08 21:36:09 +00:00
3bb504fbf3 added revision history line
[SVN r9506]
2001-03-08 20:50:14 +00:00
5029791c90 split off indirect and transform tests into separate files
[SVN r9505]
2001-03-08 20:49:05 +00:00
a1a68f0970 1.21.0 run up
[SVN r9502]
2001-03-08 20:35:52 +00:00
f8543d79eb added more static asserts
[SVN r9500]
2001-03-08 20:02:00 +00:00
f353415136 added docs for iterator_traits_generator
[SVN r9498]
2001-03-08 19:19:46 +00:00
26240403b0 added a test to make sure that the type set by the generator is really the
type used


[SVN r9497]
2001-03-08 19:04:29 +00:00
3a39729b58 new file
[SVN r9488]
2001-03-08 16:33:40 +00:00
096c961d9a Patches for Intel C++
[SVN r9425]
2001-03-04 16:08:20 +00:00
01fe04a6a2 Workaround for Borland
[SVN r9424]
2001-03-04 16:07:11 +00:00
7ea4014993 Misc fixes that missed the last commit..
[SVN r9402]
2001-03-04 11:08:29 +00:00
d50b374f88 Boost Test Library initial commit
[SVN r9364]
2001-02-28 21:39:56 +00:00
27dfb25570 added function output iterator adaptor
[SVN r9351]
2001-02-27 05:50:51 +00:00
b5ed77985e added missing typename's to docs
[SVN r9324]
2001-02-25 12:04:48 +00:00
61243bd15f type_traits: more tentative EDG compiler fixes...
[SVN r9321]
2001-02-24 13:04:56 +00:00
368b94d804 Corrected numeric_limits<>::is_integral -> numeric_limits<>::is_integer
[SVN r9299]
2001-02-20 23:15:29 +00:00
a5adbbfd5f use filter_iter::policies_type instead of filter_gen::policies_type
[SVN r9292]
2001-02-20 16:01:00 +00:00
a19d13f123 More type_traits tweeks.
[SVN r9287]
2001-02-20 12:17:55 +00:00
78886ab383 Added cross-reference; improved policies documentation
[SVN r9286]
2001-02-20 03:49:26 +00:00
168012b465 Describe const/mutable interactions and give rationale for no
reverse_iterator_pair_generator.


[SVN r9285]
2001-02-20 03:04:03 +00:00
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
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
3cb6420eda Roll back the reverse_iterator_pair_generator test
[SVN r9278]
2001-02-19 20:37:24 +00:00
60be2c1186 Added tests for reverse_iterator_pair_generator
[SVN r9273]
2001-02-19 16:21:12 +00:00
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
029bc59d74 Added some missing 'explicit's
[SVN r9265]
2001-02-18 22:23:13 +00:00
961c08a82f Apply Jens' suggested fixes
[SVN r9263]
2001-02-18 21:50:57 +00:00
7ee484c614 fix minor typos
[SVN r9259]
2001-02-18 19:26:20 +00:00
05c6fbbf99 needs <boost/type_traits/same_traits.hpp>
[SVN r9253]
2001-02-18 15:19:23 +00:00
91078b7f7a type_traits: regression failure fixes from type traits changes...
[SVN r9249]
2001-02-18 11:43:01 +00:00
20d804afc4 changes to order of indirect_iterator template parameter list, and
fixed a typo


[SVN r9247]
2001-02-17 22:03:30 +00:00
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
393e79c1fd Added new type traits files.
[SVN r9238]
2001-02-17 12:25:45 +00:00
8b92c8a085 adjusted requirements for value type of the base iterator
[SVN r9236]
2001-02-17 01:51:45 +00:00
ff73dd94c9 made iterator_adaptor constructor explicit
[SVN r9235]
2001-02-17 01:50:40 +00:00
af43904f38 added "explicit" to iterator_adaptor constructor
[SVN r9234]
2001-02-17 01:44:41 +00:00
485074f265 Added a missing const. Made the tests run (somewhat) with plain MSVC again.
[SVN r9232]
2001-02-16 23:04:49 +00:00
2e0ee55b5e add missing my_int3::operator!=
[SVN r9231]
2001-02-16 21:28:59 +00:00
e9105d32cb background color and a whitespace edit
[SVN r9228]
2001-02-16 16:38:45 +00:00
964d23f68c Edits for clarity
[SVN r9224]
2001-02-16 05:51:37 +00:00
be5aaaae7b More edits for clarity. Added const/non-const example.
[SVN r9223]
2001-02-16 05:33:21 +00:00
bf13bd7b3f Massive edits
[SVN r9222]
2001-02-16 05:30:49 +00:00
352e392fcb Checked and cleaned using HTML TIDY.
[SVN r9220]
2001-02-16 02:36:36 +00:00
083b1b02df Bigtime edits
[SVN r9219]
2001-02-16 00:38:28 +00:00
648c6240a2 added another link to the generic_programming.html#policies
[SVN r9218]
2001-02-15 16:57:12 +00:00
60cab840cb removed strange ssh garbage
[SVN r9217]
2001-02-15 16:52:39 +00:00
83a4380dab added mention of traits requirement under Type Requirements section
[SVN r9216]
2001-02-15 16:49:16 +00:00
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
ed3cbfdb8e removed policies_type from filter_iterator_generator
[SVN r9214]
2001-02-15 16:41:48 +00:00
fda44ca17d General edits for clarity; some reorganization.
[SVN r9213]
2001-02-15 16:39:55 +00:00
272025bb07 fixed my_int::operator--
[SVN r9208]
2001-02-15 06:47:06 +00:00
8e92bcf1b2 removed policies_type from filter_iterator_generator
[SVN r9207]
2001-02-15 06:44:26 +00:00
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
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
4a563fa266 added missing boost::
[SVN r9199]
2001-02-14 20:35:39 +00:00
aa4c0ec000 Test new VC6 workarounds
[SVN r9198]
2001-02-13 23:32:19 +00:00
e1ecfbdc43 added output for the transform iterator example
[SVN r9187]
2001-02-13 04:38:59 +00:00
a4e122a82e changed template class to class template
[SVN r9186]
2001-02-13 04:34:44 +00:00
93216e8fb7 copyright
[SVN r9184]
2001-02-13 04:25:24 +00:00
16272c210d fixed typo
[SVN r9183]
2001-02-13 04:24:24 +00:00
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
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
8694ce31fe changed int* to std::vector<int>::iterator
[SVN r9178]
2001-02-12 21:59:25 +00:00
d960e5eadd added another example
[SVN r9177]
2001-02-12 21:57:19 +00:00
2dc71e87a3 new files
[SVN r9176]
2001-02-12 21:35:20 +00:00
6bf17edde2 updated url to the iterator_adaptor class
[SVN r9156]
2001-02-12 05:24:45 +00:00
88573d515d fixed Reference and Pointer template paremeter descriptions
[SVN r9155]
2001-02-12 05:20:09 +00:00
89b9f77823 obsolete and not needed
[SVN r9152]
2001-02-12 04:55:19 +00:00
765d9be17d small edit
[SVN r9151]
2001-02-12 04:53:39 +00:00
7135373008 various edits
[SVN r9150]
2001-02-12 04:52:24 +00:00
ee269884fc finished 1st draft of reverse iterator docs
[SVN r9149]
2001-02-12 04:51:56 +00:00
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
2eba7b42a8 new files
[SVN r9144]
2001-02-12 02:52:26 +00:00
07115d26c7 finished 1st draft
[SVN r9143]
2001-02-12 01:50:50 +00:00
c43ed815a0 new files
[SVN r9137]
2001-02-11 20:05:00 +00:00
ff01e36d12 Compile with Borland, re-enable failing tests
[SVN r9136]
2001-02-11 19:53:56 +00:00
ac4798b16c Final fixes for Borland
[SVN r9135]
2001-02-11 19:50:14 +00:00
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
5f91259344 few edits
[SVN r9125]
2001-02-11 19:26:26 +00:00
20a9d9645d Added test of operator-> for forward and input iterators.
[SVN r9124]
2001-02-11 19:25:49 +00:00
c86f6b4abd Dave's suggested edits
[SVN r9122]
2001-02-11 18:27:40 +00:00
d66489b5b2 changed per Dave's comments
[SVN r9121]
2001-02-11 18:14:04 +00:00
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
95ba69c00a Borland fixes
[SVN r9119]
2001-02-11 16:16:53 +00:00
2ac273739c Update for compatibility with new iterator_adaptor interface
[SVN r9118]
2001-02-11 16:14:14 +00:00
5b4d28708c Fixes for Borland
[SVN r9117]
2001-02-11 16:13:38 +00:00
4cc4383488 Some fixes for Borland get it closer on that compiler
[SVN r9112]
2001-02-11 16:05:01 +00:00
8935232248 new files
[SVN r9109]
2001-02-11 05:25:19 +00:00
5c6dd2f172 various edits
[SVN r9108]
2001-02-11 04:34:32 +00:00
eeeb7ef5b9 Replaced some static_casts with explicit construction
[SVN r9107]
2001-02-11 03:12:04 +00:00
2efc9c1178 Use new adaptors interface
[SVN r9105]
2001-02-11 03:07:55 +00:00
a84c46f6e3 added another example
[SVN r9103]
2001-02-11 03:01:47 +00:00
a5c3dcdd02 redid docs for the template parameters
[SVN r9102]
2001-02-11 02:55:38 +00:00
46f7a75eb7 fixed bug in policy object constructor
[SVN r9101]
2001-02-11 02:40:02 +00:00
94b6710c5b fixed bug in policy object construction
[SVN r9100]
2001-02-11 02:39:35 +00:00
d8dd3da9ab small edit
[SVN r9099]
2001-02-11 02:38:08 +00:00
803ced004a finished 1st draft
[SVN r9098]
2001-02-11 02:35:09 +00:00
0ea7d36ad0 A fix for EDG
[SVN r9096]
2001-02-10 23:16:05 +00:00
87aafab759 new file
[SVN r9094]
2001-02-10 22:33:43 +00:00
994d310abd Use new filter_ interface.
[SVN r9090]
2001-02-10 20:11:42 +00:00
228cdcf05e All final 1.20.2 changes, including fixing broken hyperlinks
[SVN r9071]
2001-02-10 14:42:14 +00:00
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
36a9e4d1da fixed usage of indirect_iterator_pair_generator
[SVN r9053]
2001-02-09 05:45:10 +00:00
456dfd0dea adjusted to changes in iterator_adaptors.hpp, added more
tests of make_xxx


[SVN r9051]
2001-02-09 05:26:48 +00:00
155457e2b5 more work on default args and explicit templat args
[SVN r9049]
2001-02-09 04:40:42 +00:00
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
c959cf7870 bug fixes
[SVN r9031]
2001-02-08 04:46:41 +00:00
5878c88636 added indirect_iterator_pair_generator back in
[SVN r9026]
2001-02-08 03:35:03 +00:00
ddcef2fb19 Added tests for the make_xxx_iterator() helper functions
[SVN r9025]
2001-02-08 03:08:09 +00:00
493d124c07 rename counting_iterator() -> make_counting_iterator()
[SVN r9015]
2001-02-07 22:27:02 +00:00
f42060c616 add missing "typename"
[SVN r9005]
2001-02-07 17:51:55 +00:00
834facc932 trivial flotsam cleanup
[SVN r9004]
2001-02-07 17:23:52 +00:00
f82d0b76ee More comprehensive testing; factored out static tests for better reuse
[SVN r9001]
2001-02-07 16:38:41 +00:00
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
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
087069d215 added concept check for the default iterator policy
[SVN r8990]
2001-02-07 02:44:18 +00:00
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
f31483838d Fix for compilers without standard iterator_traits
[SVN r8929]
2001-02-04 20:11:30 +00:00
d8a9b633d9 Fix for newly-corrected bidirectional_iterator_test requirements.
[SVN r8926]
2001-02-04 19:09:46 +00:00
c060e4466a Added use of iterator_tests.hpp
[SVN r8923]
2001-02-04 18:26:43 +00:00
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
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
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
dfd6c85569 Inital checkin
[SVN r8813]
2001-01-30 16:00:37 +00:00
0e41b2cc1a Removed not_an_iterator detritus
[SVN r8808]
2001-01-29 02:14:44 +00:00
9 changed files with 1265 additions and 1858 deletions

View File

@ -1,762 +0,0 @@
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=iso-8859-1">
<meta name="Template"
content="C:\PROGRAM FILES\MICROSOFT OFFICE\OFFICE\html.dot">
<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
<title>Call Traits</title>
</head>
<body bgcolor="#FFFFFF" text="#000000" link="#0000FF"
vlink="#800080">
<h1><img src="../../c++boost.gif" width="276" height="86">Header
&lt;<a href="../../boost/detail/call_traits.hpp">boost/call_traits.hpp</a>&gt;</h1>
<p>All of the contents of &lt;boost/call_traits.hpp&gt; are
defined inside namespace boost.</p>
<p>The template class call_traits&lt;T&gt; encapsulates the
&quot;best&quot; method to pass a parameter of some type T to or
from a function, and consists of a collection of typedefs defined
as in the table below. The purpose of call_traits is to ensure
that problems like &quot;<a href="#refs">references to references</a>&quot;
never occur, and that parameters are passed in the most efficient
manner possible (see <a href="#examples">examples</a>). In each
case if your existing practice is to use the type defined on the
left, then replace it with the call_traits defined type on the
right. </p>
<p>Note that for compilers that do not support either partial
specialization or member templates, no benefit will occur from
using call_traits: the call_traits defined types will always be
the same as the existing practice in this case. In addition if
only member templates and not partial template specialisation is
support by the compiler (for example Visual C++ 6) then
call_traits can not be used with array types (although it can be
used to solve the reference to reference problem).</p>
<table border="0" cellpadding="7" cellspacing="1" width="797">
<tr>
<td valign="top" width="17%" bgcolor="#008080"><p
align="center">Existing practice</p>
</td>
<td valign="top" width="35%" bgcolor="#008080"><p
align="center">call_traits equivalent</p>
</td>
<td valign="top" width="32%" bgcolor="#008080"><p
align="center">Description</p>
</td>
<td valign="top" width="16%" bgcolor="#008080"><p
align="center">Notes</p>
</td>
</tr>
<tr>
<td valign="top" width="17%"><p align="center">T<br>
(return by value)</p>
</td>
<td valign="top" width="35%"><p align="center"><code>call_traits&lt;T&gt;::value_type</code></p>
</td>
<td valign="top" width="32%">Defines a type that
represents the &quot;value&quot; of type T. Use this for
functions that return by value, or possibly for stored
values of type T.</td>
<td valign="top" width="16%"><p align="center">2</p>
</td>
</tr>
<tr>
<td valign="top" width="17%"><p align="center">T&amp;<br>
(return value)</p>
</td>
<td valign="top" width="35%"><p align="center"><code>call_traits&lt;T&gt;::reference</code></p>
</td>
<td valign="top" width="32%">Defines a type that
represents a reference to type T. Use for functions that
would normally return a T&amp;.</td>
<td valign="top" width="16%"><p align="center">1</p>
</td>
</tr>
<tr>
<td valign="top" width="17%"><p align="center">const
T&amp;<br>
(return value)</p>
</td>
<td valign="top" width="35%"><p align="center"><code>call_traits&lt;T&gt;::const_reference</code></p>
</td>
<td valign="top" width="32%">Defines a type that
represents a constant reference to type T. Use for
functions that would normally return a const T&amp;.</td>
<td valign="top" width="16%"><p align="center">1</p>
</td>
</tr>
<tr>
<td valign="top" width="17%"><p align="center">const
T&amp;<br>
(function parameter)</p>
</td>
<td valign="top" width="35%"><p align="center"><code>call_traits&lt;T&gt;::param_type</code></p>
</td>
<td valign="top" width="32%">Defines a type that
represents the &quot;best&quot; way to pass a parameter
of type T to a function.</td>
<td valign="top" width="16%"><p align="center">1,3</p>
</td>
</tr>
</table>
<p>Notes:</p>
<ol>
<li>If T is already reference type, then call_traits is
defined such that <a href="#refs">references to
references</a> do not occur (requires partial
specialization).</li>
<li>If T is an array type, then call_traits defines <code>value_type</code>
as a &quot;constant pointer to type&quot; rather than an
&quot;array of type&quot; (requires partial
specialization). Note that if you are using value_type as
a stored value then this will result in storing a &quot;constant
pointer to an array&quot; rather than the array itself.
This may or may not be a good thing depending upon what
you actually need (in other words take care!).</li>
<li>If T is a small built in type or a pointer, then <code>param_type</code>
is defined as <code>T const</code>, instead of <code>T
const&amp;</code>. This can improve the ability of the
compiler to optimize loops in the body of the function if
they depend upon the passed parameter, the semantics of
the passed parameter is otherwise unchanged (requires
partial specialization).</li>
</ol>
<p>&nbsp;</p>
<h3>Copy constructibility</h3>
<p>The following table defines which call_traits types can always
be copy-constructed from which other types, those entries marked
with a '?' are true only if and only if T is copy constructible:</p>
<table border="0" cellpadding="7" cellspacing="1" width="766">
<tr>
<td valign="top" width="17%">&nbsp;</td>
<td valign="top" colspan="5" width="85%"
bgcolor="#008080"><p align="center">To:</p>
</td>
</tr>
<tr>
<td valign="top" width="17%" bgcolor="#008080">From:</td>
<td valign="top" width="17%" bgcolor="#C0C0C0"><p
align="center">T</p>
</td>
<td valign="top" width="17%" bgcolor="#C0C0C0"><p
align="center">value_type</p>
</td>
<td valign="top" width="17%" bgcolor="#C0C0C0"><p
align="center">reference</p>
</td>
<td valign="top" width="17%" bgcolor="#C0C0C0"><p
align="center">const_reference</p>
</td>
<td valign="top" width="17%" bgcolor="#C0C0C0"><p
align="center">param_type</p>
</td>
</tr>
<tr>
<td valign="top" width="17%" bgcolor="#C0C0C0">T</td>
<td valign="top" width="17%"><p align="center">?</p>
</td>
<td valign="top" width="17%"><p align="center">?</p>
</td>
<td valign="top" width="17%"><p align="center">Y</p>
</td>
<td valign="top" width="17%"><p align="center">Y</p>
</td>
<td valign="top" width="17%"><p align="center">Y</p>
</td>
</tr>
<tr>
<td valign="top" width="17%" bgcolor="#C0C0C0">value_type</td>
<td valign="top" width="17%"><p align="center">?</p>
</td>
<td valign="top" width="17%"><p align="center">?</p>
</td>
<td valign="top" width="17%"><p align="center">N</p>
</td>
<td valign="top" width="17%"><p align="center">N</p>
</td>
<td valign="top" width="17%"><p align="center">Y</p>
</td>
</tr>
<tr>
<td valign="top" width="17%" bgcolor="#C0C0C0">reference</td>
<td valign="top" width="17%"><p align="center">?</p>
</td>
<td valign="top" width="17%"><p align="center">?</p>
</td>
<td valign="top" width="17%"><p align="center">Y</p>
</td>
<td valign="top" width="17%"><p align="center">Y</p>
</td>
<td valign="top" width="17%"><p align="center">Y</p>
</td>
</tr>
<tr>
<td valign="top" width="17%" bgcolor="#C0C0C0">const_reference</td>
<td valign="top" width="17%"><p align="center">?</p>
</td>
<td valign="top" width="17%"><p align="center">N</p>
</td>
<td valign="top" width="17%"><p align="center">N</p>
</td>
<td valign="top" width="17%"><p align="center">Y</p>
</td>
<td valign="top" width="17%"><p align="center">Y</p>
</td>
</tr>
<tr>
<td valign="top" width="17%" bgcolor="#C0C0C0">param_type</td>
<td valign="top" width="17%"><p align="center">?</p>
</td>
<td valign="top" width="17%"><p align="center">?</p>
</td>
<td valign="top" width="17%"><p align="center">N</p>
</td>
<td valign="top" width="17%"><p align="center">N</p>
</td>
<td valign="top" width="17%"><p align="center">Y</p>
</td>
</tr>
</table>
<p>&nbsp;</p>
<p>If T is an assignable type the following assignments are
possible:</p>
<table border="0" cellpadding="7" cellspacing="1" width="766">
<tr>
<td valign="top" width="17%">&nbsp;</td>
<td valign="top" colspan="5" width="85%"
bgcolor="#008080"><p align="center">To:</p>
</td>
</tr>
<tr>
<td valign="top" width="17%" bgcolor="#008080">From:</td>
<td valign="top" width="17%" bgcolor="#C0C0C0"><p
align="center">T</p>
</td>
<td valign="top" width="17%" bgcolor="#C0C0C0"><p
align="center">value_type</p>
</td>
<td valign="top" width="17%" bgcolor="#C0C0C0"><p
align="center">reference</p>
</td>
<td valign="top" width="17%" bgcolor="#C0C0C0"><p
align="center">const_reference</p>
</td>
<td valign="top" width="17%" bgcolor="#C0C0C0"><p
align="center">param_type</p>
</td>
</tr>
<tr>
<td valign="top" width="17%" bgcolor="#C0C0C0">T</td>
<td valign="top" width="17%"><p align="center">Y</p>
</td>
<td valign="top" width="17%"><p align="center">Y</p>
</td>
<td valign="top" width="17%"><p align="center">-</p>
</td>
<td valign="top" width="17%"><p align="center">-</p>
</td>
<td valign="top" width="17%"><p align="center">-</p>
</td>
</tr>
<tr>
<td valign="top" width="17%" bgcolor="#C0C0C0">value_type</td>
<td valign="top" width="17%"><p align="center">Y</p>
</td>
<td valign="top" width="17%"><p align="center">Y</p>
</td>
<td valign="top" width="17%"><p align="center">-</p>
</td>
<td valign="top" width="17%"><p align="center">-</p>
</td>
<td valign="top" width="17%"><p align="center">-</p>
</td>
</tr>
<tr>
<td valign="top" width="17%" bgcolor="#C0C0C0">reference</td>
<td valign="top" width="17%"><p align="center">Y</p>
</td>
<td valign="top" width="17%"><p align="center">Y</p>
</td>
<td valign="top" width="17%"><p align="center">-</p>
</td>
<td valign="top" width="17%"><p align="center">-</p>
</td>
<td valign="top" width="17%"><p align="center">-</p>
</td>
</tr>
<tr>
<td valign="top" width="17%" bgcolor="#C0C0C0">const_reference</td>
<td valign="top" width="17%"><p align="center">Y</p>
</td>
<td valign="top" width="17%"><p align="center">Y</p>
</td>
<td valign="top" width="17%"><p align="center">-</p>
</td>
<td valign="top" width="17%"><p align="center">-</p>
</td>
<td valign="top" width="17%"><p align="center">-</p>
</td>
</tr>
<tr>
<td valign="top" width="17%" bgcolor="#C0C0C0">param_type</td>
<td valign="top" width="17%"><p align="center">Y</p>
</td>
<td valign="top" width="17%"><p align="center">Y</p>
</td>
<td valign="top" width="17%"><p align="center">-</p>
</td>
<td valign="top" width="17%"><p align="center">-</p>
</td>
<td valign="top" width="17%"><p align="center">-</p>
</td>
</tr>
</table>
<p>&nbsp;</p>
<h3><a name="examples"></a>Examples</h3>
<p>The following table shows the effect that call_traits has on
various types, the table assumes that the compiler supports
partial specialization: if it doesn't then all types behave in
the same way as the entry for &quot;myclass&quot;, and
call_traits can not be used with reference or array types.</p>
<table border="0" cellpadding="7" cellspacing="1" width="766">
<tr>
<td valign="top" width="17%">&nbsp;</td>
<td valign="top" colspan="5" width="85%"
bgcolor="#008080"><p align="center">Call_traits type:</p>
</td>
</tr>
<tr>
<td valign="top" width="17%" bgcolor="#008080"><p
align="center">Original type T</p>
</td>
<td valign="top" width="17%" bgcolor="#C0C0C0"><p
align="center">value_type</p>
</td>
<td valign="top" width="17%" bgcolor="#C0C0C0"><p
align="center">reference</p>
</td>
<td valign="top" width="17%" bgcolor="#C0C0C0"><p
align="center">const_reference</p>
</td>
<td valign="top" width="17%" bgcolor="#C0C0C0"><p
align="center">param_type</p>
</td>
<td valign="top" width="17%" bgcolor="#C0C0C0"><p
align="center">Applies to:</p>
</td>
</tr>
<tr>
<td valign="top" width="17%" bgcolor="#C0C0C0"><p
align="center">myclass</p>
</td>
<td valign="top" width="17%"><p align="center">myclass</p>
</td>
<td valign="top" width="17%"><p align="center">myclass&amp;</p>
</td>
<td valign="top" width="17%"><p align="center">const
myclass&amp;</p>
</td>
<td valign="top" width="17%"><p align="center">myclass
const&amp;</p>
</td>
<td valign="top" width="17%"><p align="center">All user
defined types.</p>
</td>
</tr>
<tr>
<td valign="top" width="17%" bgcolor="#C0C0C0"><p
align="center">int</p>
</td>
<td valign="top" width="17%"><p align="center">int</p>
</td>
<td valign="top" width="17%"><p align="center">int&amp;</p>
</td>
<td valign="top" width="17%"><p align="center">const
int&amp;</p>
</td>
<td valign="top" width="17%"><p align="center">int const</p>
</td>
<td valign="top" width="17%"><p align="center">All small
built-in types.</p>
</td>
</tr>
<tr>
<td valign="top" width="17%" bgcolor="#C0C0C0"><p
align="center">int*</p>
</td>
<td valign="top" width="17%"><p align="center">int*</p>
</td>
<td valign="top" width="17%"><p align="center">int*&amp;</p>
</td>
<td valign="top" width="17%"><p align="center">int*const&amp;</p>
</td>
<td valign="top" width="17%"><p align="center">int* const</p>
</td>
<td valign="top" width="17%"><p align="center">All
pointer types.</p>
</td>
</tr>
<tr>
<td valign="top" width="17%" bgcolor="#C0C0C0"><p
align="center">int&amp;</p>
</td>
<td valign="top" width="17%"><p align="center">int&amp;</p>
</td>
<td valign="top" width="17%"><p align="center">int&amp;</p>
</td>
<td valign="top" width="17%"><p align="center">const
int&amp;</p>
</td>
<td valign="top" width="17%"><p align="center">int&amp;</p>
</td>
<td valign="top" width="17%"><p align="center">All
reference types.</p>
</td>
</tr>
<tr>
<td valign="top" width="17%" bgcolor="#C0C0C0"><p
align="center">const int&amp;</p>
</td>
<td valign="top" width="17%"><p align="center">const
int&amp;</p>
</td>
<td valign="top" width="17%"><p align="center">const
int&amp;</p>
</td>
<td valign="top" width="17%"><p align="center">const
int&amp;</p>
</td>
<td valign="top" width="17%"><p align="center">const
int&amp;</p>
</td>
<td valign="top" width="17%"><p align="center">All
constant-references.</p>
</td>
</tr>
<tr>
<td valign="top" width="17%" bgcolor="#C0C0C0"><p
align="center">int[3]</p>
</td>
<td valign="top" width="17%"><p align="center">const int*</p>
</td>
<td valign="top" width="17%"><p align="center">int(&amp;)[3]</p>
</td>
<td valign="top" width="17%"><p align="center">const int(&amp;)[3]</p>
</td>
<td valign="top" width="17%"><p align="center">const int*
const</p>
</td>
<td valign="top" width="17%"><p align="center">All array
types.</p>
</td>
</tr>
<tr>
<td valign="top" width="17%" bgcolor="#C0C0C0"><p
align="center">const int[3]</p>
</td>
<td valign="top" width="17%"><p align="center">const int*</p>
</td>
<td valign="top" width="17%"><p align="center">const int(&amp;)[3]</p>
</td>
<td valign="top" width="17%"><p align="center">const int(&amp;)[3]</p>
</td>
<td valign="top" width="17%"><p align="center">const int*
const</p>
</td>
<td valign="top" width="17%"><p align="center">All
constant-array types.</p>
</td>
</tr>
</table>
<p>&nbsp;</p>
<h4>Example 1:</h4>
<p>The following class is a trivial class that stores some type T
by value (see the <a href="call_traits_test.cpp">call_traits_test.cpp</a>
file), the aim is to illustrate how each of the available
call_traits typedefs may be used:</p>
<pre>template &lt;class T&gt;
struct contained
{
// define our typedefs first, arrays are stored by value
// so value_type is not the same as result_type:
typedef typename boost::call_traits&lt;T&gt;::param_type param_type;
typedef typename boost::call_traits&lt;T&gt;::reference reference;
typedef typename boost::call_traits&lt;T&gt;::const_reference const_reference;
typedef T value_type;
typedef typename boost::call_traits&lt;T&gt;::value_type result_type;
// stored value:
value_type v_;
// constructors:
contained() {}
contained(param_type p) : v_(p){}
// return byval:
result_type value() { return v_; }
// return by_ref:
reference get() { return v_; }
const_reference const_get()const { return v_; }
// pass value:
void call(param_type p){}
};</pre>
<h4><a name="refs"></a>Example 2 (the reference to reference
problem):</h4>
<p>Consider the definition of std::binder1st:</p>
<pre>template &lt;class Operation&gt;
class binder1st :
public unary_function&lt;typename Operation::second_argument_type, typename Operation::result_type&gt;
{
protected:
Operation op;
typename Operation::first_argument_type value;
public:
binder1st(const Operation&amp; x, const typename Operation::first_argument_type&amp; y);
typename Operation::result_type operator()(const typename Operation::second_argument_type&amp; x) const;
}; </pre>
<p>Now consider what happens in the relatively common case that
the functor takes its second argument as a reference, that
implies that <code>Operation::second_argument_type</code> is a
reference type, <code>operator()</code> will now end up taking a
reference to a reference as an argument, and that is not
currently legal. The solution here is to modify <code>operator()</code>
to use call_traits:</p>
<pre>typename Operation::result_type operator()(typename call_traits&lt;typename Operation::second_argument_type&gt;::param_type x) const;</pre>
<p>Now in the case that <code>Operation::second_argument_type</code>
is a reference type, the argument is passed as a reference, and
the no &quot;reference to reference&quot; occurs.</p>
<h4><a name="ex3"></a>Example 3 (the make_pair problem):</h4>
<p>If we pass the name of an array as one (or both) arguments to <code>std::make_pair</code>,
then template argument deduction deduces the passed parameter as
&quot;const reference to array of T&quot;, this also applies to
string literals (which are really array literals). Consequently
instead of returning a pair of pointers, it tries to return a
pair of arrays, and since an array type is not copy-constructible
the code fails to compile. One solution is to explicitly cast the
arguments to make_pair to pointers, but call_traits provides a
better (i.e. automatic) solution (and one that works safely even
in generic code where the cast might do the wrong thing):</p>
<pre>template &lt;class T1, class T2&gt;
std::pair&lt;
typename boost::call_traits&lt;T1&gt;::value_type,
typename boost::call_traits&lt;T2&gt;::value_type&gt;
make_pair(const T1&amp; t1, const T2&amp; t2)
{
return std::pair&lt;
typename boost::call_traits&lt;T1&gt;::value_type,
typename boost::call_traits&lt;T2&gt;::value_type&gt;(t1, t2);
}</pre>
<p>Here, the deduced argument types will be automatically
degraded to pointers if the deduced types are arrays, similar
situations occur in the standard binders and adapters: in
principle in any function that &quot;wraps&quot; a temporary
whose type is deduced. Note that the function arguments to
make_pair are not expressed in terms of call_traits: doing so
would prevent template argument deduction from functioning.</p>
<h4><a name="ex4"></a>Example 4 (optimising fill):</h4>
<p>The call_traits template will &quot;optimize&quot; the passing
of a small built-in type as a function parameter, this mainly has
an effect when the parameter is used within a loop body. In the
following example (see <a href="algo_opt_examples.cpp">algo_opt_examples.cpp</a>),
a version of std::fill is optimized in two ways: if the type
passed is a single byte built-in type then std::memset is used to
effect the fill, otherwise a conventional C++ implemention is
used, but with the passed parameter &quot;optimized&quot; using
call_traits:</p>
<pre>namespace detail{
template &lt;bool opt&gt;
struct filler
{
template &lt;typename I, typename T&gt;
static void do_fill(I first, I last, typename boost::call_traits&lt;T&gt;::param_type val);
{
while(first != last)
{
*first = val;
++first;
}
}
};
template &lt;&gt;
struct filler&lt;true&gt;
{
template &lt;typename I, typename T&gt;
static void do_fill(I first, I last, T val)
{
memset(first, val, last-first);
}
};
}
template &lt;class I, class T&gt;
inline void fill(I first, I last, const T&amp; val)
{
enum{ can_opt = boost::is_pointer&lt;I&gt;::value
&amp;&amp; boost::is_arithmetic&lt;T&gt;::value
&amp;&amp; (sizeof(T) == 1) };
typedef detail::filler&lt;can_opt&gt; filler_t;
filler_t::template do_fill&lt;I,T&gt;(first, last, val);
}</pre>
<p>Footnote: the reason that this is &quot;optimal&quot; for
small built-in types is that with the value passed as &quot;T
const&quot; instead of &quot;const T&amp;&quot; the compiler is
able to tell both that the value is constant and that it is free
of aliases. With this information the compiler is able to cache
the passed value in a register, unroll the loop, or use
explicitly parallel instructions: if any of these are supported.
Exactly how much mileage you will get from this depends upon your
compiler - we could really use some accurate benchmarking
software as part of boost for cases like this.</p>
<p>Note that the function arguments to fill are not expressed in
terms of call_traits: doing so would prevent template argument
deduction from functioning. Instead fill acts as a &quot;thin
wrapper&quot; that is there to perform template argument
deduction, the compiler will optimise away the call to fill all
together, replacing it with the call to filler&lt;&gt;::do_fill,
which does use call_traits.</p>
<h3>Rationale</h3>
<p>The following notes are intended to briefly describe the
rational behind choices made in call_traits.</p>
<p>All user-defined types follow &quot;existing practice&quot;
and need no comment.</p>
<p>Small built-in types (what the standard calls fundamental
types [3.9.1]) differ from existing practice only in the <i>param_type</i>
typedef. In this case passing &quot;T const&quot; is compatible
with existing practice, but may improve performance in some cases
(see <a href="#ex4">Example 4</a>), in any case this should never
be any worse than existing practice.</p>
<p>Pointers follow the same rational as small built-in types.</p>
<p>For reference types the rational follows <a href="#refs">Example
2</a> - references to references are not allowed, so the
call_traits members must be defined such that these problems do
not occur. There is a proposal to modify the language such that
&quot;a reference to a reference is a reference&quot; (issue #106,
submitted by Bjarne Stroustrup), call_traits&lt;T&gt;::value_type
and call_traits&lt;T&gt;::param_type both provide the same effect
as that proposal, without the need for a language change (in
other words it's a workaround).</p>
<p>For array types, a function that takes an array as an argument
will degrade the array type to a pointer type: this means that
the type of the actual parameter is different from its declared
type, something that can cause endless problems in template code
that relies on the declared type of a parameter. For example:</p>
<pre>template &lt;class T&gt;
struct A
{
void foo(T t);
};</pre>
<p><font face="Times New Roman">In this case if we instantiate
A&lt;int[2]&gt; then the declared type of the parameter passed to
member function foo is int[2], but it's actual type is const int*,
if we try to use the type T within the function body, then there
is a strong likelyhood that our code will not compile:</font></p>
<pre>template &lt;class T&gt;
void A&lt;T&gt;::foo(T t)
{
T dup(t); // doesn't compile for case that T is an array.
}</pre>
<p>By using call_traits the degradation from array to pointer is
explicit, and the type of the parameter is the same as it's
declared type:</p>
<pre>template &lt;class T&gt;
struct A
{
void foo(typename call_traits&lt;T&gt;::value_type t);
};
template &lt;class T&gt;
void A&lt;T&gt;::foo(typename call_traits&lt;T&gt;::value_type t)
{
typename call_traits&lt;T&gt;::value_type dup(t); // OK even if T is an array type.
}</pre>
<p>For value_type (return by value), again only a pointer may be
returned, not a copy of the whole array, and again call_traits
makes the degradation explicit. The value_type member is useful
whenever an array must be explicitly degraded to a pointer - <a
href="#ex3">Example 3</a> provides the test case (Footnote: the
array specialisation for call_traits is the least well understood
of all the call_traits specialisations, if the given semantics
cause specific problems for you, or don't solve a particular
array-related problem, then I would be interested to hear about
it. Most people though will probably never need to use this
specialisation).</p>
<hr>
<p>Revised 01 September 2000</p>
<p><EFBFBD> Copyright boost.org 2000. Permission to copy, use, modify,
sell and distribute this document is granted provided this
copyright notice appears in all copies. This document is provided
&quot;as is&quot; without express or implied warranty, and with
no claim as to its suitability for any purpose.</p>
<p>Based on contributions by Steve Cleary, Beman Dawes, Howard
Hinnant and John Maddock.</p>
<p>Maintained by <a href="mailto:John_Maddock@compuserve.com">John
Maddock</a>, the latest version of this file can be found at <a
href="http://www.boost.org/">www.boost.org</a>, and the boost
discussion list at <a href="http://www.egroups.com/list/boost">www.egroups.com/list/boost</a>.</p>
<p>.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
</body>
</html>

View File

@ -1,366 +0,0 @@
// (C) Copyright David Abrahams 2001. 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
// 11 Feb 2001 Compile with Borland, re-enable failing tests (David Abrahams)
// 29 Jan 2001 Initial revision (David Abrahams)
#include <boost/half_open_range.hpp>
#include <boost/utility.hpp>
#include <iterator>
#include <stdlib.h>
#include <vector>
#include <list>
#include <cassert>
#include <stdexcept>
#ifndef BOOST_NO_LIMITS
# include <limits>
#endif
#ifndef BOOST_NO_SLIST
# include <slist>
#endif
inline unsigned unsigned_random(unsigned max)
{
return (max > 0) ? (unsigned)rand() % max : 0;
}
// Special tests for ranges supporting random access
template <class T>
void category_test_1(
const boost::half_open_range<T>& r, std::random_access_iterator_tag)
{
typedef boost::half_open_range<T> range;
typedef typename range::size_type size_type;
size_type size = r.size();
// pick a random offset
size_type offset = unsigned_random(size);
typename range::value_type x = *(r.begin() + offset);
// test contains(value_type)
assert(r.contains(r.start()) == !r.empty());
assert(!r.contains(r.finish()));
assert(r.contains(x) == (offset != size));
range::const_iterator p = r.find(x);
assert((p == r.end()) == (x == r.finish()));
assert(r.find(r.finish()) == r.end());
if (offset != size)
{
assert(x == r[offset]);
assert(x == r.at(offset));
}
bool caught_out_of_range = false;
try {
bool never_initialized = x == r.at(size);
(void)never_initialized;
}
catch(std::out_of_range&)
{
caught_out_of_range = true;
}
catch(...)
{
}
assert(caught_out_of_range);
}
// Those tests must be skipped for other ranges
template <class T>
void category_test_1(
const boost::half_open_range<T>&, std::forward_iterator_tag)
{
}
unsigned indices[][2] = { {0,0},{0,1},{0,2},{0,3},
{1,1},{1,2},{1,3},
{2,2},{2,3},
{3,3}};
template <class Range>
void category_test_2(
const std::vector<Range>& ranges, unsigned i, unsigned j, std::random_access_iterator_tag)
{
typedef Range range;
const range& ri = ranges[i];
const range& rj = ranges[j];
if (indices[i][0] <= indices[j][0] && indices[i][1] >= indices[j][1])
assert(ri.contains(rj));
if (ri.contains(rj))
assert((ri & rj) == rj);
assert(boost::intersects(ri, rj) == !(ri & rj).empty());
range t1(ri);
t1 &= rj;
assert(t1 == range(indices[i][0] > indices[j][0] ? ri.start() : rj.start(),
indices[i][1] < indices[j][1] ? ri.finish() : rj.finish()));
assert(t1 == (ri & rj));
range t2(ri);
t2 |= rj;
if (ri.empty())
assert(t2 == rj);
else if (rj.empty())
assert(t2 == ri);
else
assert(t2 == range(indices[i][0] < indices[j][0] ? ri.start() : rj.start(),
indices[i][1] > indices[j][1] ? ri.finish() : rj.finish()));
assert(t2 == (ri | rj));
if (i == j)
assert(ri == rj);
if (ri.empty() || rj.empty())
assert((ri == rj) == (ri.empty() && rj.empty()));
else
assert((ri == rj) == (ri.start() == rj.start() && ri.finish() == rj.finish()));
assert((ri == rj) == !(ri != rj));
bool same = ri == rj;
bool one_empty = ri.empty() != rj.empty();
std::less<range> less;
std::less_equal<range> less_equal;
std::greater<range> greater;
std::greater_equal<range> greater_equal;
if (same)
{
assert(greater_equal(ri,rj));
assert(less_equal(ri,rj));
assert(!greater(ri,rj));
assert(!less(ri,rj));
}
else if (one_empty)
{
const range& empty = ri.empty() ? ri : rj;
const range& non_empty = rj.empty() ? ri : rj;
assert(less(empty,non_empty));
assert(less_equal(empty,non_empty));
assert(!greater(empty,non_empty));
assert(!greater_equal(empty,non_empty));
assert(!less(non_empty,empty));
assert(!less_equal(non_empty,empty));
assert(greater(non_empty,empty));
assert(greater_equal(non_empty,empty));
}
else {
if (indices[i][0] < indices[j][0] ||
indices[i][0] == indices[j][0] && indices[i][1] < indices[j][1])
{
assert(!greater_equal(ri,rj));
assert(less(ri,rj));
}
if (indices[i][0] < indices[j][0] ||
indices[i][0] == indices[j][0] && indices[i][1] <= indices[j][1])
{
assert(!greater(ri,rj));
assert(less_equal(ri,rj));
}
if (indices[i][0] > indices[j][0] ||
indices[i][0] == indices[j][0] && indices[i][1] > indices[j][1])
{
assert(!less_equal(ri,rj));
assert(greater(ri,rj));
}
if (indices[i][0] > indices[j][0] ||
indices[i][0] == indices[j][0] && indices[i][1] >= indices[j][1])
{
assert(!less(ri,rj));
assert(greater_equal(ri,rj));
}
}
}
template <class Range>
void category_test_2(
const std::vector<Range>&, unsigned, unsigned, std::forward_iterator_tag)
{
}
template <class T>
void category_test_2(
const std::vector<boost::half_open_range<T> >&, unsigned, unsigned, std::bidirectional_iterator_tag)
{
}
template <class Range>
void test_back(Range& x, std::bidirectional_iterator_tag)
{
assert(x.back() == boost::prior(x.finish()));
}
template <class Range>
void test_back(Range& x, std::forward_iterator_tag)
{
}
template <class T>
boost::half_open_range<T> range_identity(const boost::half_open_range<T>& x)
{
return x;
}
template <class T>
void test(T x0, T x1, T x2, T x3)
{
std::vector<boost::half_open_range<T> > ranges;
typedef boost::half_open_range<T> range;
T bounds[4] = { x0, x1, x2, x3 };
const std::size_t num_ranges = sizeof(indices)/sizeof(*indices);
// test construction
for (std::size_t n = 0; n < num_ranges;++n)
{
T start = bounds[indices[n][0]];
T finish = bounds[indices[n][1]];
boost::half_open_range<T> r(start, finish);
ranges.push_back(r);
}
// test implicit conversion from std::pair<T,T>
range converted = std::pair<T,T>(x0,x0);
(void)converted;
// test assignment, equality and inequality
range r00 = range(x0, x0);
assert(r00 == range(x0,x0));
assert(r00 == range(x1,x1)); // empty ranges are all equal
if (x3 != x0)
assert(r00 != range(x0, x3));
r00 = range(x0, x3);
assert(r00 == range(x0, x3));
if (x3 != x0)
assert(r00 != range(x0, x0));
typedef typename range::iterator iterator;
typedef typename iterator::iterator_category category;
for (unsigned i = 0; i < num_ranges; ++i)
{
const range& r = ranges[i];
// test begin(), end(), basic iteration.
unsigned count = 0;
for (range::const_iterator p = r.begin(), finish = r.end();
p != finish;
++p, ++count)
{
assert(count < 2100);
}
// test size(), empty(), front(), back()
assert((unsigned)r.size() == count);
if (indices[i][0] == indices[i][1])
assert(r.empty());
if (r.empty())
assert(r.size() == 0);
if (!r.empty())
{
assert(r.front() == r.start());
test_back(r, category());
}
// test swap
range r1(r);
range r2(x0,x3);
const bool same = r1 == r2;
r1.swap(r2);
assert(r1 == range(x0,x3));
assert(r2 == r);
if (!same) {
assert(r1 != r);
assert(r2 != range(x0,x3));
}
// do individual tests for random-access iterators
category_test_1(r, category());
}
for (unsigned j = 0; j < num_ranges; ++j) {
for (unsigned k = 0; k < num_ranges; ++k) {
category_test_2(ranges, j, k, category());
}
}
}
template <class Integer>
void test_integer(Integer* = 0) // default arg works around MSVC bug
{
Integer a = 0;
Integer b = a + unsigned_random(128 - a);
Integer c = b + unsigned_random(128 - b);
Integer d = c + unsigned_random(128 - c);
test(a, b, c, d);
}
template <class Container>
void test_container(Container* = 0) // default arg works around MSVC bug
{
Container c(unsigned_random(1673));
const typename Container::size_type offset1 = unsigned_random(c.size());
const typename Container::size_type offset2 = unsigned_random(c.size() - offset1);
typename Container::iterator internal1 = c.begin();
std::advance(internal1, offset1);
typename Container::iterator internal2 = internal1;
std::advance(internal2, offset2);
test(c.begin(), internal1, internal2, c.end());
typedef typename Container::const_iterator const_iterator;
test(const_iterator(c.begin()),
const_iterator(internal1),
const_iterator(internal2),
const_iterator(c.end()));
}
int main()
{
// Test the built-in integer types.
test_integer<char>();
test_integer<unsigned char>();
test_integer<signed char>();
test_integer<wchar_t>();
test_integer<short>();
test_integer<unsigned short>();
test_integer<int>();
test_integer<unsigned int>();
test_integer<long>();
test_integer<unsigned long>();
#if defined(ULLONG_MAX) || defined(ULONG_LONG_MAX)
test_integer<long long>();
test_integer<unsigned long long>();
#endif
// Some tests on container iterators, to prove we handle a few different categories
test_container<std::vector<int> >();
test_container<std::list<int> >();
#ifndef BOOST_NO_SLIST
test_container<BOOST_STD_EXTENSION_NAMESPACE::slist<int> >();
#endif
// Also prove that we can handle raw pointers.
int array[2000];
const std::size_t a = 0;
const std::size_t b = a + unsigned_random(2000 - a);
const std::size_t c = b + unsigned_random(2000 - b);
test(array, array+b, array+c, array+2000);
return 0;
}

View File

@ -0,0 +1,155 @@
// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
// Use, modification and distribution are 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).
//
// See http://www.boost.org/libs/utility for most recent version including documentation.
// call_traits: defines typedefs for function usage
// (see libs/utility/call_traits.htm)
/* Release notes:
23rd July 2000:
Fixed array specialization. (JM)
Added Borland specific fixes for reference types
(issue raised by Steve Cleary).
*/
#ifndef BOOST_DETAIL_CALL_TRAITS_HPP
#define BOOST_DETAIL_CALL_TRAITS_HPP
#ifndef BOOST_CONFIG_HPP
#include <boost/config.hpp>
#endif
#include <cstddef>
#include <boost/type_traits/is_arithmetic.hpp>
#include <boost/type_traits/is_pointer.hpp>
#include <boost/detail/workaround.hpp>
namespace boost{
namespace detail{
template <typename T, bool small_>
struct ct_imp2
{
typedef const T& param_type;
};
template <typename T>
struct ct_imp2<T, true>
{
typedef const T param_type;
};
template <typename T, bool isp, bool b1>
struct ct_imp
{
typedef const T& param_type;
};
template <typename T, bool isp>
struct ct_imp<T, isp, true>
{
typedef typename ct_imp2<T, sizeof(T) <= sizeof(void*)>::param_type param_type;
};
template <typename T, bool b1>
struct ct_imp<T, true, b1>
{
typedef T const param_type;
};
}
template <typename T>
struct call_traits
{
public:
typedef T value_type;
typedef T& reference;
typedef const T& const_reference;
//
// C++ Builder workaround: we should be able to define a compile time
// constant and pass that as a single template parameter to ct_imp<T,bool>,
// however compiler bugs prevent this - instead pass three bool's to
// ct_imp<T,bool,bool,bool> and add an extra partial specialisation
// of ct_imp to handle the logic. (JM)
typedef typename boost::detail::ct_imp<
T,
::boost::is_pointer<T>::value,
::boost::is_arithmetic<T>::value
>::param_type param_type;
};
template <typename T>
struct call_traits<T&>
{
typedef T& value_type;
typedef T& reference;
typedef const T& const_reference;
typedef T& param_type; // hh removed const
};
#if BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT( 0x570 ) )
// these are illegal specialisations; cv-qualifies applied to
// references have no effect according to [8.3.2p1],
// C++ Builder requires them though as it treats cv-qualified
// references as distinct types...
template <typename T>
struct call_traits<T&const>
{
typedef T& value_type;
typedef T& reference;
typedef const T& const_reference;
typedef T& param_type; // hh removed const
};
template <typename T>
struct call_traits<T&volatile>
{
typedef T& value_type;
typedef T& reference;
typedef const T& const_reference;
typedef T& param_type; // hh removed const
};
template <typename T>
struct call_traits<T&const volatile>
{
typedef T& value_type;
typedef T& reference;
typedef const T& const_reference;
typedef T& param_type; // hh removed const
};
#endif
#if !defined(BOOST_NO_ARRAY_TYPE_SPECIALIZATIONS)
template <typename T, std::size_t N>
struct call_traits<T [N]>
{
private:
typedef T array_type[N];
public:
// degrades array to pointer:
typedef const T* value_type;
typedef array_type& reference;
typedef const array_type& const_reference;
typedef const T* const param_type;
};
template <typename T, std::size_t N>
struct call_traits<const T [N]>
{
private:
typedef const T array_type[N];
public:
// degrades array to pointer:
typedef const T* value_type;
typedef array_type& reference;
typedef const array_type& const_reference;
typedef const T* const param_type;
};
#endif
}
#endif // BOOST_DETAIL_CALL_TRAITS_HPP

View File

@ -0,0 +1,432 @@
// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
// Use, modification and distribution are 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).
//
// See http://www.boost.org/libs/utility for most recent version including documentation.
// compressed_pair: pair that "compresses" empty members
// (see libs/utility/compressed_pair.htm)
//
// JM changes 25 Jan 2004:
// For the case where T1 == T2 and both are empty, then first() and second()
// should return different objects.
// JM changes 25 Jan 2000:
// Removed default arguments from compressed_pair_switch to get
// C++ Builder 4 to accept them
// rewriten swap to get gcc and C++ builder to compile.
// added partial specialisations for case T1 == T2 to avoid duplicate constructor defs.
#ifndef BOOST_DETAIL_COMPRESSED_PAIR_HPP
#define BOOST_DETAIL_COMPRESSED_PAIR_HPP
#include <algorithm>
#include <boost/type_traits/remove_cv.hpp>
#include <boost/type_traits/is_empty.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/call_traits.hpp>
namespace boost
{
template <class T1, class T2>
class compressed_pair;
// compressed_pair
namespace details
{
// JM altered 26 Jan 2000:
template <class T1, class T2, bool IsSame, bool FirstEmpty, bool SecondEmpty>
struct compressed_pair_switch;
template <class T1, class T2>
struct compressed_pair_switch<T1, T2, false, false, false>
{static const int value = 0;};
template <class T1, class T2>
struct compressed_pair_switch<T1, T2, false, true, true>
{static const int value = 3;};
template <class T1, class T2>
struct compressed_pair_switch<T1, T2, false, true, false>
{static const int value = 1;};
template <class T1, class T2>
struct compressed_pair_switch<T1, T2, false, false, true>
{static const int value = 2;};
template <class T1, class T2>
struct compressed_pair_switch<T1, T2, true, true, true>
{static const int value = 4;};
template <class T1, class T2>
struct compressed_pair_switch<T1, T2, true, false, false>
{static const int value = 5;};
template <class T1, class T2, int Version> class compressed_pair_imp;
#ifdef __GNUC__
// workaround for GCC (JM):
using std::swap;
#endif
//
// can't call unqualified swap from within classname::swap
// as Koenig lookup rules will find only the classname::swap
// member function not the global declaration, so use cp_swap
// as a forwarding function (JM):
template <typename T>
inline void cp_swap(T& t1, T& t2)
{
#ifndef __GNUC__
using std::swap;
#endif
swap(t1, t2);
}
// 0 derive from neither
template <class T1, class T2>
class compressed_pair_imp<T1, T2, 0>
{
public:
typedef T1 first_type;
typedef T2 second_type;
typedef typename call_traits<first_type>::param_type first_param_type;
typedef typename call_traits<second_type>::param_type second_param_type;
typedef typename call_traits<first_type>::reference first_reference;
typedef typename call_traits<second_type>::reference second_reference;
typedef typename call_traits<first_type>::const_reference first_const_reference;
typedef typename call_traits<second_type>::const_reference second_const_reference;
compressed_pair_imp() {}
compressed_pair_imp(first_param_type x, second_param_type y)
: first_(x), second_(y) {}
compressed_pair_imp(first_param_type x)
: first_(x) {}
compressed_pair_imp(second_param_type y)
: second_(y) {}
first_reference first() {return first_;}
first_const_reference first() const {return first_;}
second_reference second() {return second_;}
second_const_reference second() const {return second_;}
void swap(::boost::compressed_pair<T1, T2>& y)
{
cp_swap(first_, y.first());
cp_swap(second_, y.second());
}
private:
first_type first_;
second_type second_;
};
// 1 derive from T1
template <class T1, class T2>
class compressed_pair_imp<T1, T2, 1>
: private ::boost::remove_cv<T1>::type
{
public:
typedef T1 first_type;
typedef T2 second_type;
typedef typename call_traits<first_type>::param_type first_param_type;
typedef typename call_traits<second_type>::param_type second_param_type;
typedef typename call_traits<first_type>::reference first_reference;
typedef typename call_traits<second_type>::reference second_reference;
typedef typename call_traits<first_type>::const_reference first_const_reference;
typedef typename call_traits<second_type>::const_reference second_const_reference;
compressed_pair_imp() {}
compressed_pair_imp(first_param_type x, second_param_type y)
: first_type(x), second_(y) {}
compressed_pair_imp(first_param_type x)
: first_type(x) {}
compressed_pair_imp(second_param_type y)
: second_(y) {}
first_reference first() {return *this;}
first_const_reference first() const {return *this;}
second_reference second() {return second_;}
second_const_reference second() const {return second_;}
void swap(::boost::compressed_pair<T1,T2>& y)
{
// no need to swap empty base class:
cp_swap(second_, y.second());
}
private:
second_type second_;
};
// 2 derive from T2
template <class T1, class T2>
class compressed_pair_imp<T1, T2, 2>
: private ::boost::remove_cv<T2>::type
{
public:
typedef T1 first_type;
typedef T2 second_type;
typedef typename call_traits<first_type>::param_type first_param_type;
typedef typename call_traits<second_type>::param_type second_param_type;
typedef typename call_traits<first_type>::reference first_reference;
typedef typename call_traits<second_type>::reference second_reference;
typedef typename call_traits<first_type>::const_reference first_const_reference;
typedef typename call_traits<second_type>::const_reference second_const_reference;
compressed_pair_imp() {}
compressed_pair_imp(first_param_type x, second_param_type y)
: second_type(y), first_(x) {}
compressed_pair_imp(first_param_type x)
: first_(x) {}
compressed_pair_imp(second_param_type y)
: second_type(y) {}
first_reference first() {return first_;}
first_const_reference first() const {return first_;}
second_reference second() {return *this;}
second_const_reference second() const {return *this;}
void swap(::boost::compressed_pair<T1,T2>& y)
{
// no need to swap empty base class:
cp_swap(first_, y.first());
}
private:
first_type first_;
};
// 3 derive from T1 and T2
template <class T1, class T2>
class compressed_pair_imp<T1, T2, 3>
: private ::boost::remove_cv<T1>::type,
private ::boost::remove_cv<T2>::type
{
public:
typedef T1 first_type;
typedef T2 second_type;
typedef typename call_traits<first_type>::param_type first_param_type;
typedef typename call_traits<second_type>::param_type second_param_type;
typedef typename call_traits<first_type>::reference first_reference;
typedef typename call_traits<second_type>::reference second_reference;
typedef typename call_traits<first_type>::const_reference first_const_reference;
typedef typename call_traits<second_type>::const_reference second_const_reference;
compressed_pair_imp() {}
compressed_pair_imp(first_param_type x, second_param_type y)
: first_type(x), second_type(y) {}
compressed_pair_imp(first_param_type x)
: first_type(x) {}
compressed_pair_imp(second_param_type y)
: second_type(y) {}
first_reference first() {return *this;}
first_const_reference first() const {return *this;}
second_reference second() {return *this;}
second_const_reference second() const {return *this;}
//
// no need to swap empty bases:
void swap(::boost::compressed_pair<T1,T2>&) {}
};
// JM
// 4 T1 == T2, T1 and T2 both empty
// Note does not actually store an instance of T2 at all -
// but reuses T1 base class for both first() and second().
template <class T1, class T2>
class compressed_pair_imp<T1, T2, 4>
: private ::boost::remove_cv<T1>::type
{
public:
typedef T1 first_type;
typedef T2 second_type;
typedef typename call_traits<first_type>::param_type first_param_type;
typedef typename call_traits<second_type>::param_type second_param_type;
typedef typename call_traits<first_type>::reference first_reference;
typedef typename call_traits<second_type>::reference second_reference;
typedef typename call_traits<first_type>::const_reference first_const_reference;
typedef typename call_traits<second_type>::const_reference second_const_reference;
compressed_pair_imp() {}
compressed_pair_imp(first_param_type x, second_param_type y)
: first_type(x), m_second(y) {}
compressed_pair_imp(first_param_type x)
: first_type(x), m_second(x) {}
first_reference first() {return *this;}
first_const_reference first() const {return *this;}
second_reference second() {return m_second;}
second_const_reference second() const {return m_second;}
void swap(::boost::compressed_pair<T1,T2>&) {}
private:
T2 m_second;
};
// 5 T1 == T2 and are not empty: //JM
template <class T1, class T2>
class compressed_pair_imp<T1, T2, 5>
{
public:
typedef T1 first_type;
typedef T2 second_type;
typedef typename call_traits<first_type>::param_type first_param_type;
typedef typename call_traits<second_type>::param_type second_param_type;
typedef typename call_traits<first_type>::reference first_reference;
typedef typename call_traits<second_type>::reference second_reference;
typedef typename call_traits<first_type>::const_reference first_const_reference;
typedef typename call_traits<second_type>::const_reference second_const_reference;
compressed_pair_imp() {}
compressed_pair_imp(first_param_type x, second_param_type y)
: first_(x), second_(y) {}
compressed_pair_imp(first_param_type x)
: first_(x), second_(x) {}
first_reference first() {return first_;}
first_const_reference first() const {return first_;}
second_reference second() {return second_;}
second_const_reference second() const {return second_;}
void swap(::boost::compressed_pair<T1, T2>& y)
{
cp_swap(first_, y.first());
cp_swap(second_, y.second());
}
private:
first_type first_;
second_type second_;
};
} // details
template <class T1, class T2>
class compressed_pair
: private ::boost::details::compressed_pair_imp<T1, T2,
::boost::details::compressed_pair_switch<
T1,
T2,
::boost::is_same<typename remove_cv<T1>::type, typename remove_cv<T2>::type>::value,
::boost::is_empty<T1>::value,
::boost::is_empty<T2>::value>::value>
{
private:
typedef details::compressed_pair_imp<T1, T2,
::boost::details::compressed_pair_switch<
T1,
T2,
::boost::is_same<typename remove_cv<T1>::type, typename remove_cv<T2>::type>::value,
::boost::is_empty<T1>::value,
::boost::is_empty<T2>::value>::value> base;
public:
typedef T1 first_type;
typedef T2 second_type;
typedef typename call_traits<first_type>::param_type first_param_type;
typedef typename call_traits<second_type>::param_type second_param_type;
typedef typename call_traits<first_type>::reference first_reference;
typedef typename call_traits<second_type>::reference second_reference;
typedef typename call_traits<first_type>::const_reference first_const_reference;
typedef typename call_traits<second_type>::const_reference second_const_reference;
compressed_pair() : base() {}
compressed_pair(first_param_type x, second_param_type y) : base(x, y) {}
explicit compressed_pair(first_param_type x) : base(x) {}
explicit compressed_pair(second_param_type y) : base(y) {}
first_reference first() {return base::first();}
first_const_reference first() const {return base::first();}
second_reference second() {return base::second();}
second_const_reference second() const {return base::second();}
void swap(compressed_pair& y) { base::swap(y); }
};
// JM
// Partial specialisation for case where T1 == T2:
//
template <class T>
class compressed_pair<T, T>
: private details::compressed_pair_imp<T, T,
::boost::details::compressed_pair_switch<
T,
T,
::boost::is_same<typename remove_cv<T>::type, typename remove_cv<T>::type>::value,
::boost::is_empty<T>::value,
::boost::is_empty<T>::value>::value>
{
private:
typedef details::compressed_pair_imp<T, T,
::boost::details::compressed_pair_switch<
T,
T,
::boost::is_same<typename remove_cv<T>::type, typename remove_cv<T>::type>::value,
::boost::is_empty<T>::value,
::boost::is_empty<T>::value>::value> base;
public:
typedef T first_type;
typedef T second_type;
typedef typename call_traits<first_type>::param_type first_param_type;
typedef typename call_traits<second_type>::param_type second_param_type;
typedef typename call_traits<first_type>::reference first_reference;
typedef typename call_traits<second_type>::reference second_reference;
typedef typename call_traits<first_type>::const_reference first_const_reference;
typedef typename call_traits<second_type>::const_reference second_const_reference;
compressed_pair() : base() {}
compressed_pair(first_param_type x, second_param_type y) : base(x, y) {}
#if !(defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x530))
explicit
#endif
compressed_pair(first_param_type x) : base(x) {}
first_reference first() {return base::first();}
first_const_reference first() const {return base::first();}
second_reference second() {return base::second();}
second_const_reference second() const {return base::second();}
void swap(::boost::compressed_pair<T,T>& y) { base::swap(y); }
};
template <class T1, class T2>
inline
void
swap(compressed_pair<T1, T2>& x, compressed_pair<T1, T2>& y)
{
x.swap(y);
}
} // boost
#endif // BOOST_DETAIL_COMPRESSED_PAIR_HPP

View File

@ -0,0 +1,168 @@
// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
// Use, modification and distribution are 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).
//
// See http://www.boost.org/libs/utility for most recent version including documentation.
//
// Crippled version for crippled compilers:
// see libs/utility/call_traits.htm
//
/* Release notes:
01st October 2000:
Fixed call_traits on VC6, using "poor man's partial specialisation",
using ideas taken from "Generative programming" by Krzysztof Czarnecki
& Ulrich Eisenecker.
*/
#ifndef BOOST_OB_CALL_TRAITS_HPP
#define BOOST_OB_CALL_TRAITS_HPP
#ifndef BOOST_CONFIG_HPP
#include <boost/config.hpp>
#endif
#ifndef BOOST_ARITHMETIC_TYPE_TRAITS_HPP
#include <boost/type_traits/arithmetic_traits.hpp>
#endif
#ifndef BOOST_COMPOSITE_TYPE_TRAITS_HPP
#include <boost/type_traits/composite_traits.hpp>
#endif
namespace boost{
#ifdef BOOST_MSVC6_MEMBER_TEMPLATES
//
// use member templates to emulate
// partial specialisation:
//
namespace detail{
template <class T>
struct standard_call_traits
{
typedef T value_type;
typedef T& reference;
typedef const T& const_reference;
typedef const T& param_type;
};
template <class T>
struct simple_call_traits
{
typedef T value_type;
typedef T& reference;
typedef const T& const_reference;
typedef const T param_type;
};
template <class T>
struct reference_call_traits
{
typedef T value_type;
typedef T reference;
typedef T const_reference;
typedef T param_type;
};
template <bool pointer, bool arithmetic, bool reference>
struct call_traits_chooser
{
template <class T>
struct rebind
{
typedef standard_call_traits<T> type;
};
};
template <>
struct call_traits_chooser<true, false, false>
{
template <class T>
struct rebind
{
typedef simple_call_traits<T> type;
};
};
template <>
struct call_traits_chooser<false, false, true>
{
template <class T>
struct rebind
{
typedef reference_call_traits<T> type;
};
};
template <bool size_is_small>
struct call_traits_sizeof_chooser2
{
template <class T>
struct small_rebind
{
typedef simple_call_traits<T> small_type;
};
};
template<>
struct call_traits_sizeof_chooser2<false>
{
template <class T>
struct small_rebind
{
typedef standard_call_traits<T> small_type;
};
};
template <>
struct call_traits_chooser<false, true, false>
{
template <class T>
struct rebind
{
enum { sizeof_choice = (sizeof(T) <= sizeof(void*)) };
typedef call_traits_sizeof_chooser2<(sizeof(T) <= sizeof(void*))> chooser;
typedef typename chooser::template small_rebind<T> bound_type;
typedef typename bound_type::small_type type;
};
};
} // namespace detail
template <typename T>
struct call_traits
{
private:
typedef detail::call_traits_chooser<
::boost::is_pointer<T>::value,
::boost::is_arithmetic<T>::value,
::boost::is_reference<T>::value
> chooser;
typedef typename chooser::template rebind<T> bound_type;
typedef typename bound_type::type call_traits_type;
public:
typedef typename call_traits_type::value_type value_type;
typedef typename call_traits_type::reference reference;
typedef typename call_traits_type::const_reference const_reference;
typedef typename call_traits_type::param_type param_type;
};
#else
//
// sorry call_traits is completely non-functional
// blame your broken compiler:
//
template <typename T>
struct call_traits
{
typedef T value_type;
typedef T& reference;
typedef const T& const_reference;
typedef const T& param_type;
};
#endif // member templates
}
#endif // BOOST_OB_CALL_TRAITS_HPP

View File

@ -0,0 +1,510 @@
// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
// Use, modification and distribution are 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).
//
// See http://www.boost.org/libs/utility for most recent version including documentation.
// see libs/utility/compressed_pair.hpp
//
/* Release notes:
20 Jan 2001:
Fixed obvious bugs (David Abrahams)
07 Oct 2000:
Added better single argument constructor support.
03 Oct 2000:
Added VC6 support (JM).
23rd July 2000:
Additional comments added. (JM)
Jan 2000:
Original version: this version crippled for use with crippled compilers
- John Maddock Jan 2000.
*/
#ifndef BOOST_OB_COMPRESSED_PAIR_HPP
#define BOOST_OB_COMPRESSED_PAIR_HPP
#include <algorithm>
#ifndef BOOST_OBJECT_TYPE_TRAITS_HPP
#include <boost/type_traits/object_traits.hpp>
#endif
#ifndef BOOST_SAME_TRAITS_HPP
#include <boost/type_traits/same_traits.hpp>
#endif
#ifndef BOOST_CALL_TRAITS_HPP
#include <boost/call_traits.hpp>
#endif
namespace boost
{
#ifdef BOOST_MSVC6_MEMBER_TEMPLATES
//
// use member templates to emulate
// partial specialisation. Note that due to
// problems with overload resolution with VC6
// each of the compressed_pair versions that follow
// have one template single-argument constructor
// in place of two specific constructors:
//
template <class T1, class T2>
class compressed_pair;
namespace detail{
template <class A, class T1, class T2>
struct best_conversion_traits
{
typedef char one;
typedef char (&two)[2];
static A a;
static one test(T1);
static two test(T2);
enum { value = sizeof(test(a)) };
};
template <int>
struct init_one;
template <>
struct init_one<1>
{
template <class A, class T1, class T2>
static void init(const A& a, T1* p1, T2*)
{
*p1 = a;
}
};
template <>
struct init_one<2>
{
template <class A, class T1, class T2>
static void init(const A& a, T1*, T2* p2)
{
*p2 = a;
}
};
// T1 != T2, both non-empty
template <class T1, class T2>
class compressed_pair_0
{
private:
T1 _first;
T2 _second;
public:
typedef T1 first_type;
typedef T2 second_type;
typedef typename call_traits<first_type>::param_type first_param_type;
typedef typename call_traits<second_type>::param_type second_param_type;
typedef typename call_traits<first_type>::reference first_reference;
typedef typename call_traits<second_type>::reference second_reference;
typedef typename call_traits<first_type>::const_reference first_const_reference;
typedef typename call_traits<second_type>::const_reference second_const_reference;
compressed_pair_0() : _first(), _second() {}
compressed_pair_0(first_param_type x, second_param_type y) : _first(x), _second(y) {}
template <class A>
explicit compressed_pair_0(const A& val)
{
init_one<best_conversion_traits<A, T1, T2>::value>::init(val, &_first, &_second);
}
compressed_pair_0(const ::boost::compressed_pair<T1,T2>& x)
: _first(x.first()), _second(x.second()) {}
#if 0
compressed_pair_0& operator=(const compressed_pair_0& x) {
cout << "assigning compressed pair 0" << endl;
_first = x._first;
_second = x._second;
cout << "finished assigning compressed pair 0" << endl;
return *this;
}
#endif
first_reference first() { return _first; }
first_const_reference first() const { return _first; }
second_reference second() { return _second; }
second_const_reference second() const { return _second; }
void swap(compressed_pair_0& y)
{
using std::swap;
swap(_first, y._first);
swap(_second, y._second);
}
};
// T1 != T2, T2 empty
template <class T1, class T2>
class compressed_pair_1 : T2
{
private:
T1 _first;
public:
typedef T1 first_type;
typedef T2 second_type;
typedef typename call_traits<first_type>::param_type first_param_type;
typedef typename call_traits<second_type>::param_type second_param_type;
typedef typename call_traits<first_type>::reference first_reference;
typedef typename call_traits<second_type>::reference second_reference;
typedef typename call_traits<first_type>::const_reference first_const_reference;
typedef typename call_traits<second_type>::const_reference second_const_reference;
compressed_pair_1() : T2(), _first() {}
compressed_pair_1(first_param_type x, second_param_type y) : T2(y), _first(x) {}
template <class A>
explicit compressed_pair_1(const A& val)
{
init_one<best_conversion_traits<A, T1, T2>::value>::init(val, &_first, static_cast<T2*>(this));
}
compressed_pair_1(const ::boost::compressed_pair<T1,T2>& x)
: T2(x.second()), _first(x.first()) {}
#if defined(BOOST_MSVC) && BOOST_MSVC <= 1300
// Total weirdness. If the assignment to _first is moved after
// the call to the inherited operator=, then this breaks graph/test/graph.cpp
// by way of iterator_adaptor.
compressed_pair_1& operator=(const compressed_pair_1& x) {
_first = x._first;
T2::operator=(x);
return *this;
}
#endif
first_reference first() { return _first; }
first_const_reference first() const { return _first; }
second_reference second() { return *this; }
second_const_reference second() const { return *this; }
void swap(compressed_pair_1& y)
{
// no need to swap empty base class:
using std::swap;
swap(_first, y._first);
}
};
// T1 != T2, T1 empty
template <class T1, class T2>
class compressed_pair_2 : T1
{
private:
T2 _second;
public:
typedef T1 first_type;
typedef T2 second_type;
typedef typename call_traits<first_type>::param_type first_param_type;
typedef typename call_traits<second_type>::param_type second_param_type;
typedef typename call_traits<first_type>::reference first_reference;
typedef typename call_traits<second_type>::reference second_reference;
typedef typename call_traits<first_type>::const_reference first_const_reference;
typedef typename call_traits<second_type>::const_reference second_const_reference;
compressed_pair_2() : T1(), _second() {}
compressed_pair_2(first_param_type x, second_param_type y) : T1(x), _second(y) {}
template <class A>
explicit compressed_pair_2(const A& val)
{
init_one<best_conversion_traits<A, T1, T2>::value>::init(val, static_cast<T1*>(this), &_second);
}
compressed_pair_2(const ::boost::compressed_pair<T1,T2>& x)
: T1(x.first()), _second(x.second()) {}
#if 0
compressed_pair_2& operator=(const compressed_pair_2& x) {
cout << "assigning compressed pair 2" << endl;
T1::operator=(x);
_second = x._second;
cout << "finished assigning compressed pair 2" << endl;
return *this;
}
#endif
first_reference first() { return *this; }
first_const_reference first() const { return *this; }
second_reference second() { return _second; }
second_const_reference second() const { return _second; }
void swap(compressed_pair_2& y)
{
// no need to swap empty base class:
using std::swap;
swap(_second, y._second);
}
};
// T1 != T2, both empty
template <class T1, class T2>
class compressed_pair_3 : T1, T2
{
public:
typedef T1 first_type;
typedef T2 second_type;
typedef typename call_traits<first_type>::param_type first_param_type;
typedef typename call_traits<second_type>::param_type second_param_type;
typedef typename call_traits<first_type>::reference first_reference;
typedef typename call_traits<second_type>::reference second_reference;
typedef typename call_traits<first_type>::const_reference first_const_reference;
typedef typename call_traits<second_type>::const_reference second_const_reference;
compressed_pair_3() : T1(), T2() {}
compressed_pair_3(first_param_type x, second_param_type y) : T1(x), T2(y) {}
template <class A>
explicit compressed_pair_3(const A& val)
{
init_one<best_conversion_traits<A, T1, T2>::value>::init(val, static_cast<T1*>(this), static_cast<T2*>(this));
}
compressed_pair_3(const ::boost::compressed_pair<T1,T2>& x)
: T1(x.first()), T2(x.second()) {}
first_reference first() { return *this; }
first_const_reference first() const { return *this; }
second_reference second() { return *this; }
second_const_reference second() const { return *this; }
void swap(compressed_pair_3& y)
{
// no need to swap empty base classes:
}
};
// T1 == T2, and empty
template <class T1, class T2>
class compressed_pair_4 : T1
{
public:
typedef T1 first_type;
typedef T2 second_type;
typedef typename call_traits<first_type>::param_type first_param_type;
typedef typename call_traits<second_type>::param_type second_param_type;
typedef typename call_traits<first_type>::reference first_reference;
typedef typename call_traits<second_type>::reference second_reference;
typedef typename call_traits<first_type>::const_reference first_const_reference;
typedef typename call_traits<second_type>::const_reference second_const_reference;
compressed_pair_4() : T1() {}
compressed_pair_4(first_param_type x, second_param_type y) : T1(x), m_second(y) {}
// only one single argument constructor since T1 == T2
explicit compressed_pair_4(first_param_type x) : T1(x), m_second(x) {}
compressed_pair_4(const ::boost::compressed_pair<T1,T2>& x)
: T1(x.first()), m_second(x.second()) {}
first_reference first() { return *this; }
first_const_reference first() const { return *this; }
second_reference second() { return m_second; }
second_const_reference second() const { return m_second; }
void swap(compressed_pair_4& y)
{
// no need to swap empty base classes:
}
private:
T2 m_second;
};
// T1 == T2, not empty
template <class T1, class T2>
class compressed_pair_5
{
private:
T1 _first;
T2 _second;
public:
typedef T1 first_type;
typedef T2 second_type;
typedef typename call_traits<first_type>::param_type first_param_type;
typedef typename call_traits<second_type>::param_type second_param_type;
typedef typename call_traits<first_type>::reference first_reference;
typedef typename call_traits<second_type>::reference second_reference;
typedef typename call_traits<first_type>::const_reference first_const_reference;
typedef typename call_traits<second_type>::const_reference second_const_reference;
compressed_pair_5() : _first(), _second() {}
compressed_pair_5(first_param_type x, second_param_type y) : _first(x), _second(y) {}
// only one single argument constructor since T1 == T2
explicit compressed_pair_5(first_param_type x) : _first(x), _second(x) {}
compressed_pair_5(const ::boost::compressed_pair<T1,T2>& c)
: _first(c.first()), _second(c.second()) {}
first_reference first() { return _first; }
first_const_reference first() const { return _first; }
second_reference second() { return _second; }
second_const_reference second() const { return _second; }
void swap(compressed_pair_5& y)
{
using std::swap;
swap(_first, y._first);
swap(_second, y._second);
}
};
template <bool e1, bool e2, bool same>
struct compressed_pair_chooser
{
template <class T1, class T2>
struct rebind
{
typedef compressed_pair_0<T1, T2> type;
};
};
template <>
struct compressed_pair_chooser<false, true, false>
{
template <class T1, class T2>
struct rebind
{
typedef compressed_pair_1<T1, T2> type;
};
};
template <>
struct compressed_pair_chooser<true, false, false>
{
template <class T1, class T2>
struct rebind
{
typedef compressed_pair_2<T1, T2> type;
};
};
template <>
struct compressed_pair_chooser<true, true, false>
{
template <class T1, class T2>
struct rebind
{
typedef compressed_pair_3<T1, T2> type;
};
};
template <>
struct compressed_pair_chooser<true, true, true>
{
template <class T1, class T2>
struct rebind
{
typedef compressed_pair_4<T1, T2> type;
};
};
template <>
struct compressed_pair_chooser<false, false, true>
{
template <class T1, class T2>
struct rebind
{
typedef compressed_pair_5<T1, T2> type;
};
};
template <class T1, class T2>
struct compressed_pair_traits
{
private:
typedef compressed_pair_chooser<is_empty<T1>::value, is_empty<T2>::value, is_same<T1,T2>::value> chooser;
typedef typename chooser::template rebind<T1, T2> bound_type;
public:
typedef typename bound_type::type type;
};
} // namespace detail
template <class T1, class T2>
class compressed_pair : public detail::compressed_pair_traits<T1, T2>::type
{
private:
typedef typename detail::compressed_pair_traits<T1, T2>::type base_type;
public:
typedef T1 first_type;
typedef T2 second_type;
typedef typename call_traits<first_type>::param_type first_param_type;
typedef typename call_traits<second_type>::param_type second_param_type;
typedef typename call_traits<first_type>::reference first_reference;
typedef typename call_traits<second_type>::reference second_reference;
typedef typename call_traits<first_type>::const_reference first_const_reference;
typedef typename call_traits<second_type>::const_reference second_const_reference;
compressed_pair() : base_type() {}
compressed_pair(first_param_type x, second_param_type y) : base_type(x, y) {}
template <class A>
explicit compressed_pair(const A& x) : base_type(x){}
first_reference first() { return base_type::first(); }
first_const_reference first() const { return base_type::first(); }
second_reference second() { return base_type::second(); }
second_const_reference second() const { return base_type::second(); }
};
template <class T1, class T2>
inline void swap(compressed_pair<T1, T2>& x, compressed_pair<T1, T2>& y)
{
x.swap(y);
}
#else
// no partial specialisation, no member templates:
template <class T1, class T2>
class compressed_pair
{
private:
T1 _first;
T2 _second;
public:
typedef T1 first_type;
typedef T2 second_type;
typedef typename call_traits<first_type>::param_type first_param_type;
typedef typename call_traits<second_type>::param_type second_param_type;
typedef typename call_traits<first_type>::reference first_reference;
typedef typename call_traits<second_type>::reference second_reference;
typedef typename call_traits<first_type>::const_reference first_const_reference;
typedef typename call_traits<second_type>::const_reference second_const_reference;
compressed_pair() : _first(), _second() {}
compressed_pair(first_param_type x, second_param_type y) : _first(x), _second(y) {}
explicit compressed_pair(first_param_type x) : _first(x), _second() {}
// can't define this in case T1 == T2:
// explicit compressed_pair(second_param_type y) : _first(), _second(y) {}
first_reference first() { return _first; }
first_const_reference first() const { return _first; }
second_reference second() { return _second; }
second_const_reference second() const { return _second; }
void swap(compressed_pair& y)
{
using std::swap;
swap(_first, y._first);
swap(_second, y._second);
}
};
template <class T1, class T2>
inline void swap(compressed_pair<T1, T2>& x, compressed_pair<T1, T2>& y)
{
x.swap(y);
}
#endif
} // boost
#endif // BOOST_OB_COMPRESSED_PAIR_HPP

View File

@ -1,565 +0,0 @@
// Boost operators.hpp header file ----------------------------------------//
// (C) Copyright David Abrahams 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.
// (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
// 11 Feb 01 Fixed bugs in the iterator helpers which prevented explicitly
// supplied arguments from actually being used (Dave Abrahams)
// 04 Jul 00 Fixed NO_OPERATORS_IN_NAMESPACE bugs, major cleanup and
// refactoring of compiler workarounds, additional documentation
// (Alexy Gurtovoy and Mark Rodgers with some help and prompting from
// Dave Abrahams)
// 28 Jun 00 General cleanup and integration of bugfixes from Mark Rodgers and
// Jeremy Siek (Dave Abrahams)
// 20 Jun 00 Changes to accommodate Borland C++Builder 4 and Borland C++ 5.5
// (Mark Rodgers)
// 20 Jun 00 Minor fixes to the prior revision (Aleksey Gurtovoy)
// 10 Jun 00 Support for the base class chaining technique was added
// (Aleksey Gurtovoy). See documentation and the comments below
// for the details.
// 12 Dec 99 Initial version with iterator operators (Jeremy Siek)
// 18 Nov 99 Change name "divideable" to "dividable", remove unnecessary
// specializations of dividable, subtractable, modable (Ed Brey)
// 17 Nov 99 Add comments (Beman Dawes)
// Remove unnecessary specialization of operators<> (Ed Brey)
// 15 Nov 99 Fix less_than_comparable<T,U> second operand type for first two
// operators.(Beman Dawes)
// 12 Nov 99 Add operators templates (Ed Brey)
// 11 Nov 99 Add single template parameter version for compilers without
// partial specialization (Beman Dawes)
// 10 Nov 99 Initial version
// 10 Jun 00:
// An additional optional template parameter was added to most of
// operator templates to support the base class chaining technique (see
// documentation for the details). Unfortunately, a straightforward
// implementation of this change would have broken compatibility with the
// previous version of the library by making it impossible to use the same
// template name (e.g. 'addable') for both the 1- and 2-argument versions of
// an operator template. This implementation solves the backward-compatibility
// issue at the cost of some simplicity.
//
// One of the complications is an existence of special auxiliary class template
// 'is_chained_base<>' (see 'detail' namespace below), which is used
// to determine whether its template parameter is a library's operator template
// or not. You have to specialize 'is_chained_base<>' for each new
// operator template you add to the library.
//
// However, most of the non-trivial implementation details are hidden behind
// several local macros defined below, and as soon as you understand them,
// you understand the whole library implementation.
#ifndef BOOST_OPERATORS_HPP
#define BOOST_OPERATORS_HPP
#include <boost/config.hpp>
#include <boost/iterator.hpp>
#if defined(__sgi) && !defined(__GNUC__)
#pragma set woff 1234
#endif
#if defined(BOOST_MSVC)
# pragma warning( disable : 4284 ) // complaint about return type of
#endif // operator-> not begin a UDT
namespace boost {
namespace detail {
class empty_base {};
} // namespace detail
} // namespace boost
// In this section we supply the xxxx1 and xxxx2 forms of the operator
// templates, which are explicitly targeted at the 1-type-argument and
// 2-type-argument operator forms, respectively. Some compilers get confused
// when inline friend functions are overloaded in namespaces other than the
// global namespace. When BOOST_NO_OPERATORS_IN_NAMESPACE is defined, all of
// these templates must go in the global namespace.
#ifndef BOOST_NO_OPERATORS_IN_NAMESPACE
namespace boost
{
#endif
// Basic operator classes (contributed by Dave Abrahams) ------------------//
// Note that friend functions defined in a class are implicitly inline.
// See the C++ std, 11.4 [class.friend] paragraph 5
template <class T, class U, class B = ::boost::detail::empty_base>
struct less_than_comparable2 : B
{
friend bool operator<=(const T& x, const U& y) { return !(x > y); }
friend bool operator>=(const T& x, const U& y) { return !(x < y); }
friend bool operator>(const U& x, const T& y) { return y < x; }
friend bool operator<(const U& x, const T& y) { return y > x; }
friend bool operator<=(const U& x, const T& y) { return !(y < x); }
friend bool operator>=(const U& x, const T& y) { return !(y > x); }
};
template <class T, class B = ::boost::detail::empty_base>
struct less_than_comparable1 : B
{
friend bool operator>(const T& x, const T& y) { return y < x; }
friend bool operator<=(const T& x, const T& y) { return !(y < x); }
friend bool operator>=(const T& x, const T& y) { return !(x < y); }
};
template <class T, class U, class B = ::boost::detail::empty_base>
struct equality_comparable2 : B
{
friend bool operator==(const U& y, const T& x) { return x == y; }
friend bool operator!=(const U& y, const T& x) { return !(x == y); }
friend bool operator!=(const T& y, const U& x) { return !(y == x); }
};
template <class T, class B = ::boost::detail::empty_base>
struct equality_comparable1 : B
{
friend bool operator!=(const T& x, const T& y) { return !(x == y); }
};
template <class T, class U, class B = ::boost::detail::empty_base>
struct multipliable2 : B
{
friend T operator*(T x, const U& y) { return x *= y; }
friend T operator*(const U& y, T x) { return x *= y; }
};
template <class T, class B = ::boost::detail::empty_base>
struct multipliable1 : B
{
friend T operator*(T x, const T& y) { return x *= y; }
};
template <class T, class U, class B = ::boost::detail::empty_base>
struct addable2 : B
{
friend T operator+(T x, const U& y) { return x += y; }
friend T operator+(const U& y, T x) { return x += y; }
};
template <class T, class B = ::boost::detail::empty_base>
struct addable1 : B
{
friend T operator+(T x, const T& y) { return x += y; }
};
template <class T, class U, class B = ::boost::detail::empty_base>
struct subtractable2 : B
{
friend T operator-(T x, const U& y) { return x -= y; }
};
template <class T, class B = ::boost::detail::empty_base>
struct subtractable1 : B
{
friend T operator-(T x, const T& y) { return x -= y; }
};
template <class T, class U, class B = ::boost::detail::empty_base>
struct dividable2 : B
{
friend T operator/(T x, const U& y) { return x /= y; }
};
template <class T, class B = ::boost::detail::empty_base>
struct dividable1 : B
{
friend T operator/(T x, const T& y) { return x /= y; }
};
template <class T, class U, class B = ::boost::detail::empty_base>
struct modable2 : B
{
friend T operator%(T x, const U& y) { return x %= y; }
};
template <class T, class B = ::boost::detail::empty_base>
struct modable1 : B
{
friend T operator%(T x, const T& y) { return x %= y; }
};
template <class T, class U, class B = ::boost::detail::empty_base>
struct xorable2 : B
{
friend T operator^(T x, const U& y) { return x ^= y; }
friend T operator^(const U& y, T x) { return x ^= y; }
};
template <class T, class B = ::boost::detail::empty_base>
struct xorable1 : B
{
friend T operator^(T x, const T& y) { return x ^= y; }
};
template <class T, class U, class B = ::boost::detail::empty_base>
struct andable2 : B
{
friend T operator&(T x, const U& y) { return x &= y; }
friend T operator&(const U& y, T x) { return x &= y; }
};
template <class T, class B = ::boost::detail::empty_base>
struct andable1 : B
{
friend T operator&(T x, const T& y) { return x &= y; }
};
template <class T, class U, class B = ::boost::detail::empty_base>
struct orable2 : B
{
friend T operator|(T x, const U& y) { return x |= y; }
friend T operator|(const U& y, T x) { return x |= y; }
};
template <class T, class B = ::boost::detail::empty_base>
struct orable1 : B
{
friend T operator|(T x, const T& y) { return x |= y; }
};
// incrementable and decrementable contributed by Jeremy Siek
template <class T, class B = ::boost::detail::empty_base>
struct incrementable : B
{
friend T operator++(T& x, int)
{
incrementable_type tmp(x);
++x;
return tmp;
}
private: // The use of this typedef works around a Borland bug
typedef T incrementable_type;
};
template <class T, class B = ::boost::detail::empty_base>
struct decrementable : B
{
friend T operator--(T& x, int)
{
decrementable_type tmp(x);
--x;
return tmp;
}
private: // The use of this typedef works around a Borland bug
typedef T decrementable_type;
};
// Iterator operator classes (contributed by Jeremy Siek) ------------------//
template <class T, class P, class B = ::boost::detail::empty_base>
struct dereferenceable : B
{
P operator->() const
{
return &*static_cast<const T&>(*this);
}
};
template <class T, class I, class R, class B = ::boost::detail::empty_base>
struct indexable : B
{
R operator[](I n) const
{
return *(static_cast<const T&>(*this) + n);
}
};
#ifndef BOOST_NO_OPERATORS_IN_NAMESPACE
} // namespace boost
#endif // BOOST_NO_OPERATORS_IN_NAMESPACE
// BOOST_IMPORT_TEMPLATE1/BOOST_IMPORT_TEMPLATE2 -
//
// When BOOST_NO_OPERATORS_IN_NAMESPACE is defined we need a way to import an
// operator template into the boost namespace. BOOST_IMPORT_TEMPLATE1 is used
// for one-argument forms of operator templates; BOOST_IMPORT_TEMPLATE2 for
// two-argument forms. Note that these macros expect to be invoked from within
// boost.
#if defined(BOOST_NO_OPERATORS_IN_NAMESPACE)
# if defined(BOOST_NO_USING_TEMPLATE)
// Because a Borland C++ 5.5 bug prevents a using declaration from working,
// we are forced to use inheritance for that compiler.
# define BOOST_IMPORT_TEMPLATE2(template_name) \
template <class T, class U, class B = ::boost::detail::empty_base> \
struct template_name : ::template_name<T, U, B> {};
# define BOOST_IMPORT_TEMPLATE1(template_name) \
template <class T, class B = ::boost::detail::empty_base> \
struct template_name : ::template_name<T, B> {};
# else
// Otherwise, bring the names in with a using-declaration to avoid
// stressing the compiler
# define BOOST_IMPORT_TEMPLATE2(template_name) using ::template_name;
# define BOOST_IMPORT_TEMPLATE1(template_name) using ::template_name;
# endif // BOOST_NO_USING_TEMPLATE
#else // !BOOST_NO_OPERATORS_IN_NAMESPACE
// The template is already in boost so we have nothing to do.
# define BOOST_IMPORT_TEMPLATE2(template_name)
# define BOOST_IMPORT_TEMPLATE1(template_name)
#endif // BOOST_NO_OPERATORS_IN_NAMESPACE
//
// Here's where we put it all together, defining the xxxx forms of the templates
// in namespace boost. We also define specializations of is_chained_base<> for
// the xxxx, xxxx1, and xxxx2 templates, importing them into boost:: as
// neccessary.
//
#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
// is_chained_base<> - a traits class used to distinguish whether an operator
// template argument is being used for base class chaining, or is specifying a
// 2nd argument type.
namespace boost {
// A type parameter is used instead of a plain bool because Borland's compiler
// didn't cope well with the more obvious non-type template parameter.
namespace detail {
struct true_t {};
struct false_t {};
} // namespace detail
// Unspecialized version assumes that most types are not being used for base
// class chaining. We specialize for the operator templates defined in this
// library.
template<class T> struct is_chained_base {
typedef ::boost::detail::false_t value;
};
} // namespace boost
// Import a 2-type-argument operator template into boost (if neccessary) and
// provide a specialization of 'is_chained_base<>' for it.
# define BOOST_OPERATOR_TEMPLATE2(template_name2) \
BOOST_IMPORT_TEMPLATE2(template_name2) \
template<class T, class U, class B> \
struct is_chained_base< ::boost::template_name2<T, U, B> > { \
typedef ::boost::detail::true_t value; \
};
// Import a 1-type-argument operator template into boost (if neccessary) and
// provide a specialization of 'is_chained_base<>' for it.
# define BOOST_OPERATOR_TEMPLATE1(template_name1) \
BOOST_IMPORT_TEMPLATE1(template_name1) \
template<class T, class B> \
struct is_chained_base< ::boost::template_name1<T, B> > { \
typedef ::boost::detail::true_t value; \
};
// BOOST_OPERATOR_TEMPLATE(template_name) defines template_name<> such that it
// can be used for specifying both 1-argument and 2-argument forms. Requires the
// existence of two previously defined class templates named '<template_name>1'
// and '<template_name>2' which must implement the corresponding 1- and 2-
// argument forms.
//
// The template type parameter O == is_chained_base<U>::value is used to
// distinguish whether the 2nd argument to <template_name> is being used for
// base class chaining from another boost operator template or is describing a
// 2nd operand type. O == true_t only when U is actually an another operator
// template from the library. Partial specialization is used to select an
// implementation in terms of either '<template_name>1' or '<template_name>2'.
//
# define BOOST_OPERATOR_TEMPLATE(template_name) \
template <class T \
,class U = T \
,class B = ::boost::detail::empty_base \
,class O = typename is_chained_base<U>::value \
> \
struct template_name : template_name##2<T, U, B> {}; \
\
template<class T, class U, class B> \
struct template_name<T, U, B, ::boost::detail::true_t> \
: template_name##1<T, U> {}; \
\
template <class T, class B> \
struct template_name<T, T, B, ::boost::detail::false_t> \
: template_name##1<T, B> {}; \
\
template<class T, class U, class B, class O> \
struct is_chained_base< ::boost::template_name<T, U, B, O> > { \
typedef ::boost::detail::true_t value; \
}; \
\
BOOST_OPERATOR_TEMPLATE2(template_name##2) \
BOOST_OPERATOR_TEMPLATE1(template_name##1)
#else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
# define BOOST_OPERATOR_TEMPLATE2(template_name2) \
BOOST_IMPORT_TEMPLATE2(template_name2)
# define BOOST_OPERATOR_TEMPLATE1(template_name1) \
BOOST_IMPORT_TEMPLATE1(template_name1)
// In this case we can only assume that template_name<> is equivalent to the
// more commonly needed template_name1<> form.
# define BOOST_OPERATOR_TEMPLATE(template_name) \
template <class T, class B = ::boost::detail::empty_base> \
struct template_name : template_name##1<T, B> {};
#endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
namespace boost {
BOOST_OPERATOR_TEMPLATE(less_than_comparable)
BOOST_OPERATOR_TEMPLATE(equality_comparable)
BOOST_OPERATOR_TEMPLATE(multipliable)
BOOST_OPERATOR_TEMPLATE(addable)
BOOST_OPERATOR_TEMPLATE(subtractable)
BOOST_OPERATOR_TEMPLATE(dividable)
BOOST_OPERATOR_TEMPLATE(modable)
BOOST_OPERATOR_TEMPLATE(xorable)
BOOST_OPERATOR_TEMPLATE(andable)
BOOST_OPERATOR_TEMPLATE(orable)
BOOST_OPERATOR_TEMPLATE1(incrementable)
BOOST_OPERATOR_TEMPLATE1(decrementable)
BOOST_OPERATOR_TEMPLATE2(dereferenceable)
// indexable doesn't follow the patterns above (it has 4 template arguments), so
// we just write out the compiler hacks explicitly.
#ifdef BOOST_NO_OPERATORS_IN_NAMESPACE
# ifdef BOOST_NO_USING_TEMPLATE
template <class T, class I, class R, class B = ::boost::detail::empty_base>
struct indexable : ::indexable<T,I,R,B> {};
# else
using ::indexable;
# endif
#endif
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
template <class T, class I, class R, class B>
struct is_chained_base< ::boost::indexable<T, I, R, B> > {
typedef ::boost::detail::true_t operator_template_type;
};
#endif
#undef BOOST_OPERATOR_TEMPLATE
#undef BOOST_OPERATOR_TEMPLATE2
#undef BOOST_OPERATOR_TEMPLATE1
#undef BOOST_IMPORT_TEMPLATE1
#undef BOOST_IMPORT_TEMPLATE2
// The following 'operators' classes can only be used portably if the derived class
// declares ALL of the required member operators.
template <class T, class U>
struct operators2
: less_than_comparable2<T,U
, equality_comparable2<T,U
, addable2<T,U
, subtractable2<T,U
, multipliable2<T,U
, dividable2<T,U
, modable2<T,U
, orable2<T,U
, andable2<T,U
, xorable2<T,U
> > > > > > > > > > {};
#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
template <class T, class U = T>
struct operators : operators2<T, U> {};
template <class T> struct operators<T, T>
#else
template <class T> struct operators
#endif
: less_than_comparable<T
, equality_comparable<T
, addable<T
, subtractable<T
, multipliable<T
, dividable<T
, modable<T
, orable<T
, andable<T
, xorable<T
, incrementable<T
, decrementable<T
> > > > > > > > > > > > {};
// Iterator helper classes (contributed by Jeremy Siek) -------------------//
template <class T,
class V,
class D = std::ptrdiff_t,
class P = V*,
class R = V&>
struct forward_iterator_helper
: equality_comparable<T
, incrementable<T
, dereferenceable<T,P
, boost::iterator<std::forward_iterator_tag,V,D,P,R
> > > > {};
template <class T,
class V,
class D = std::ptrdiff_t,
class P = V*,
class R = V&>
struct bidirectional_iterator_helper
: equality_comparable<T
, incrementable<T
, decrementable<T
, dereferenceable<T,P
, boost::iterator<std::bidirectional_iterator_tag,V,D,P,R
> > > > > {};
template <class T,
class V,
class D = std::ptrdiff_t,
class P = V*,
class R = V&>
struct random_access_iterator_helper
: equality_comparable<T
, less_than_comparable<T
, incrementable<T
, decrementable<T
, dereferenceable<T,P
, addable2<T,D
, subtractable2<T,D
, indexable<T,D,R
, boost::iterator<std::random_access_iterator_tag,V,D,P,R
> > > > > > > > >
{
#ifndef __BORLANDC__
friend D requires_difference_operator(const T& x, const T& y) {
return x - y;
}
#endif
}; // random_access_iterator_helper
} // namespace boost
#if defined(__sgi) && !defined(__GNUC__)
#pragma reset woff 1234
#endif
#endif // BOOST_OPERATORS_HPP

View File

@ -1,61 +0,0 @@
// (C) Copyright Jeremy Siek 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.
#include <boost/config.hpp>
#include <vector>
#include <iostream>
#include <iterator>
#include <functional>
#include <boost/iterator_adaptors.hpp>
int main(int, char*[])
{
char characters[] = "abcdefg";
const int N = sizeof(characters)/sizeof(char) - 1; // -1 since characters has a null char
char* pointers_to_chars[N]; // at the end.
for (int i = 0; i < N; ++i)
pointers_to_chars[i] = &characters[i];
// Example of using indirect_iterator_generator
boost::indirect_iterator_generator<char**, char>::type
indirect_first(pointers_to_chars), indirect_last(pointers_to_chars + N);
std::copy(indirect_first, indirect_last, std::ostream_iterator<char>(std::cout, ","));
std::cout << std::endl;
// Example of using indirect_iterator_pair_generator
typedef boost::indirect_iterator_pair_generator<char**,
char, char*, char&, const char*, const char&> PairGen;
char mutable_characters[N];
char* pointers_to_mutable_chars[N];
for (int i = 0; i < N; ++i)
pointers_to_mutable_chars[i] = &mutable_characters[i];
PairGen::iterator mutable_indirect_first(pointers_to_mutable_chars),
mutable_indirect_last(pointers_to_mutable_chars + N);
PairGen::const_iterator const_indirect_first(pointers_to_chars),
const_indirect_last(pointers_to_chars + N);
std::transform(const_indirect_first, const_indirect_last,
mutable_indirect_first, std::bind1st(std::plus<char>(), 1));
std::copy(mutable_indirect_first, mutable_indirect_last,
std::ostream_iterator<char>(std::cout, ","));
std::cout << std::endl;
// Example of using make_indirect_iterator()
std::copy(boost::make_indirect_iterator(pointers_to_chars),
boost::make_indirect_iterator(pointers_to_chars + N),
std::ostream_iterator<char>(std::cout, ","));
std::cout << std::endl;
return 0;
}

View File

@ -1,104 +0,0 @@
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Header boost/utility.hpp Documentation</title>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<h1><img src="../../c++boost.gif" alt="c++boost.gif (8819 bytes)" align="center" WIDTH="277" HEIGHT="86">Header
<a href="../../boost/utility.hpp">boost/utility.hpp</a></h1>
<p>The entire contents of the header <code><a href="../../boost/utility.hpp">&lt;boost/utility.hpp&gt;</a></code>
are in <code>namespace boost</code>.</p>
<h2>Contents</h2>
<ul>
<li>Function templates <a href="#functions next">next() and prior()</a></li>
<li>Class <a href="#Class noncopyable">noncopyable</a></li>
<li>Function template <a href="tie.html">tie()</a> and supporting class tied.</li>
</ul>
<h2> <a name="functions next">Function</a> templates next() and prior()</h2>
<p>Certain data types, such as the C++ Standard Library's forward and
bidirectional iterators, do not provide addition and subtraction via operator+()
or operator-().&nbsp; This means that non-modifying computation of the next or
prior value requires a temporary, even though operator++() or operator--() is
provided.&nbsp; It also means that writing code like <code>itr+1</code> inside a
template restricts the iterator category to random access iterators.</p>
<p>The next() and prior() functions provide a simple way around these problems:</p>
<blockquote>
<pre>template &lt;class T&gt;
T next(T x) { return ++x; }
template &lt;class X&gt;
T prior(T x) { return --x; }</pre>
</blockquote>
<p>Usage is simple:</p>
<blockquote>
<pre>const std::list&lt;T&gt;::iterator p = get_some_iterator();
const std::list&lt;T&gt;::iterator prev = boost::prior(p);</pre>
</blockquote>
<p>Contributed by <a href="../../people/dave_abrahams.htm">Dave Abrahams</a>.</p>
<h2><a name="Class noncopyable">Class noncopyable</a></h2>
<p>Class <strong>noncopyable</strong> is a base class.&nbsp; Derive your own class from <strong>noncopyable</strong>
when you want to prohibit copy construction and copy assignment.</p>
<p>Some objects, particularly those which hold complex resources like files or
network connections, have no sensible copy semantics.&nbsp; Sometimes there are
possible copy semantics, but these would be of very limited usefulness and be
very difficult to implement correctly.&nbsp; Sometimes you're implementing a class that doesn't need to be copied
just yet and you don't want to take the time to write the appropriate functions.&nbsp;
Deriving from <b> noncopyable</b> will prevent the otherwise implicitly-generated
functions (which don't have the proper semantics) from becoming a trap for other programmers.</p>
<p>The traditional way to deal with these is to declare a private copy constructor and copy assignment, and then
document why this is done.&nbsp; But deriving from <b>noncopyable</b> is simpler
and clearer, and doesn't require additional documentation.</p>
<p>The program <a href="noncopyable_test.cpp">noncopyable_test.cpp</a> can be
used to verify class <b>noncopyable</b> works as expected. It has have been run successfully under
GCC 2.95, Metrowerks
CodeWarrior 5.0, and Microsoft Visual C++ 6.0 sp 3.</p>
<p>Contributed by <a href="../../people/dave_abrahams.htm">Dave Abrahams</a>.</p>
<h3>Example</h3>
<blockquote>
<pre>// inside one of your own headers ...
#include &lt;boost/utility.hpp&gt;
class ResourceLadenFileSystem : boost::noncopyable {
...</pre>
</blockquote>
<h3>Rationale</h3>
<p>Class noncopyable has protected constructor and destructor members to
emphasize that it is to be used only as a base class.&nbsp; Dave Abrahams notes
concern about the effect on compiler optimization of adding (even trivial inline)
destructor declarations. He says &quot;Probably this concern is misplaced, because
noncopyable will be used mostly for classes which own resources and thus have non-trivial destruction semantics.&quot;</p>
<hr>
<p>Revised&nbsp; <!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan
-->16 February, 2001<!--webbot bot="Timestamp" endspan i-checksum="40407"
-->
</p>
<p><EFBFBD> Copyright boost.org 1999. Permission to copy, use, modify, sell and
distribute this document is granted provided this copyright notice appears in
all copies. This document is provided &quot;as is&quot; without express or
implied warranty, and with no claim as to its suitability for any purpose.</p>
</body>
</html>