Compare commits

...

224 Commits

Author SHA1 Message Date
8e457e716b Merge pull request #60 from CaseyCarter/patch-1
MSVC also has C++20 ostream_iterator
2020-10-14 12:15:55 +03:00
32f4f4d086 MSVC also has C++20 output_iterator
Tell iterator_traits_test not to fail on MSVC when `std::output_iterator` has `difference_type` of `std::ptrdiff_t`.
2020-10-13 19:23:49 -07:00
72f0ebe8d0 Adjusted the check for C++20 on gcc 10.
The compiler defines __cplusplus to a non-standard value less than 202002
in C++20 mode.
2020-05-24 00:29:51 +03:00
d7ad43a925 Updated to support C++20 ostream_iterator::difference_type on gcc 10. 2020-05-23 19:57:54 +03:00
733c0fb9cb Added gcc 10 build jobs to Travis CI. 2020-05-22 18:41:15 +03:00
5b18ae976e Updated code to use distance and iterator_traits from std. 2020-05-10 23:08:14 +03:00
da8604615e Removed the use of deprecated header boost/detail/iterator.hpp 2020-05-10 23:02:42 +03:00
8fc94469da Added clang-10 jobs to Travis CI. 2020-05-05 23:20:14 +03:00
b86c817481 Updated function_output_iterator example to use up-to-date header location. 2020-05-02 02:03:16 +03:00
9649d42392 Merge pull request #51 from Kojoley/add-deprecation-warning-for-boost-function_output_iterator
Add deprecation warning in `boost/function_output_iterator.hpp`
2020-05-02 02:01:07 +03:00
0c5f0b822a Merge pull request #55 from eldiener/develop
Changes for Embarcadero C++ clang-based compilers, targeting Boost 1.74. Change __BORLANDC__ to BOOST_BORLANDC, which is defined in Boost conf…
2020-05-02 01:58:01 +03:00
dc7bf5cc05 Change __BORLANDC__ to BOOST_BORLANDC, which is defined in Boost config for the Embarcadero non-clang-based compilers. 2020-03-31 11:21:59 -04:00
80ec58bb3b Trim trailing spaces. 2020-03-04 01:06:45 +03:00
c2929ea6c6 Updated to use boost/bind/bind.hpp to avoid warnings and compliance with C++20.
boost/bind.hpp emits warnings about deprecating global placeholder argument
keywords. C++20 removes std::bind1st/bind2nd, so replaced their usage with
boost::bind.
2020-03-04 01:02:52 +03:00
4fe679bb0d Updated lightweight_test.hpp includes to the new location. 2020-03-04 00:52:58 +03:00
fdcd8439c0 BOOST_ prefix include guard macro 2019-12-18 08:40:35 -05:00
3a8728a595 Whitespace cleanup and formatting fixes in docs. 2019-12-12 12:40:53 +03:00
897ff65fdc Fixed example links in docs.
Fixes https://github.com/boostorg/iterator/issues/52.
2019-12-12 12:16:01 +03:00
bfe2a004d2 Add deprecation warning in boost/function_output_iterator.hpp 2019-11-23 16:47:06 +03:00
d528fc0b11 Disabled C++0x mode for gcc-4.4 because it fails zip_iterator tests with std::tuple. 2019-10-23 12:09:29 +03:00
540f999d0b Disabled all but one OS X jobs because they are slow on Travis CI. 2019-10-22 15:07:04 +03:00
54dee0db96 Updated CI configs, added compilers. 2019-10-22 01:00:51 +03:00
814965402e Merge pull request #49 from glenfe/develop
Use use_default from Boost.Core
2019-02-22 20:44:56 -05:00
2af5a16539 Use use_default from Boost.Core
boost::use_default is now defined in Core for multiple Boost libraries.
2019-02-22 17:17:52 -05:00
171c716d03 Enabled multiple git fetch jobs while executing depinst in CI. Increased the number of jobs to 8. 2019-01-15 13:54:52 +03:00
398fe907d0 Use the actual number of logical CPUs for the number of CI build/test jobs. 2019-01-03 23:19:41 +03:00
e31ae13df5 Re-added manual checkout of libs/config in CI as Boost.Build depends on it. 2018-12-20 20:46:10 +03:00
02e74bf26a Use multiple jobs to checkout submodules in parallel in CI. 2018-12-18 22:34:58 +03:00
20b5a9c11a Added tools/boost_install and libs/headers manual checkout to CI jobs. 2018-12-18 22:05:56 +03:00
73918b8616 Added an experimental partial CMakeLists.txt for dependency tracking in CMake projects. 2018-12-18 19:49:23 +03:00
bb1efd3370 Updated addressof.hpp include path. 2018-11-14 12:42:24 +03:00
3cc4107d01 Added a test for compatibility of boost::distance between Range and Iterator.
This functionality is used in core Boost components, so it is preferable
to test it in Boost.Iterator, even if it's already tested in Boost.Range,
to discover problems as early as possible.

The test verifies that boost::distance implemented in Boost.Range can invoke
boost::distance in Boost.Iterator (i.e. the function lookup succeeds).
2018-09-23 12:37:21 +03:00
6ab148be01 Revert "Revert "Replace using-declarations with using-directives to avoid ADL issues.""
This reverts commit 06875a754d.

The suggested fix for build failures need to be applied to Boost.Range:

https://github.com/boostorg/range/pull/75
2018-09-23 12:28:03 +03:00
06875a754d Revert "Replace using-declarations with using-directives to avoid ADL issues."
This reverts commit 44cee00831.

The commit reportedly broke building Boost and quickbook.

b844c8df53 (commitcomment-30603668)
2018-09-22 18:46:36 +03:00
b844c8df53 Merge pull request #44 from morinmorin/fix/unwanted_adl
Fix #43 (unwanted ADL issues)
2018-09-22 16:05:22 +03:00
194087e8ca Merge branch 'develop' into fix/unwanted_adl 2018-09-22 20:47:10 +09:00
b5edc8b64f Add test for ADL issues. 2018-09-22 20:44:29 +09:00
44cee00831 Replace using-declarations with using-directives to avoid ADL issues. 2018-09-22 20:20:59 +09:00
b2adecb951 Merge pull request #40 from DanielaE/fix/no-iterator-inheritance
Inheriting std::iterator is deprecated in c++17.
2017-12-28 18:43:47 -05:00
e16f2de233 Inheriting std::iterator is deprecated in c++17.
Boost's iterator.hpp is deprecated, too. Therefore get rid of all of that and replace inheritance by lifting std::iterator's members into the derived class.

Signed-off-by: Daniela Engert <dani@ngrt.de>
2017-12-27 09:32:51 +01:00
218dc4baf1 Merge branch 'feature/move-shared-iterator' into develop 2017-12-24 14:23:54 +02:00
0013c5c4f0 Skip zip_iterator_test_std_pair on g++ in C++03 mode 2017-12-24 04:56:47 +02:00
386dbf1054 Skip zip_iterator_test_std_pair on msvc-9.0 and below 2017-12-24 04:38:07 +02:00
486721bbfe Update .travis.yml, appveyor.yml 2017-12-24 01:47:23 +02:00
5ad48c4d14 Fix links to examples 2017-12-23 23:54:33 +02:00
adecfd94f3 Use lightweight_test in shared_iterator_test.cpp 2017-12-23 23:45:59 +02:00
affe7e6d84 Add shared_iterator_test to test/Jamfile 2017-12-23 23:45:33 +02:00
91b392a478 Move test files to test/ 2017-12-23 22:05:35 +02:00
84227ea6ba Move shared_iterator_example* to example/ 2017-12-23 22:04:25 +02:00
67ac957273 shared_container_iterator library: - updated Copyright and License notices - Added shared_iterator_test to the iterator test suite.
[SVN r22140]
2017-12-23 22:02:20 +02:00
f86cd29f52 Fix tabs in file.
[SVN r21399]
2017-12-23 22:02:20 +02:00
fff85e7db9 Updated shared_container_iterator to use the new iterator adaptors library. Updated the documentation and examples as well to reflect the changes.
[SVN r19535]
2017-12-23 22:02:20 +02:00
d6c6f0ce16 Added Shared Container Iterator adaptor to iterator adaptor library.
[SVN r15169]
2017-12-23 22:02:20 +02:00
81faa161cf Add #include <boost/next_prior.hpp>; no longer in utility.hpp 2017-12-02 04:04:32 +02:00
7e5a32b3ea Merge pull request #38 from pavelkryukov/patch-1
Remove std::unary_function from zip_iterator_eg.rst
2017-11-25 13:58:41 -05:00
1b388c2496 Remove std::unary_function from zip_iterator_eg.rst 2017-11-25 12:15:52 +03:00
30b93d7428 Removed the use of std::unary_function. 2017-11-20 16:28:28 +03:00
28b8cc8c9c Removed --depth 1 2017-10-29 21:43:30 -04:00
992a314211 Better appveyor file setup. 2017-10-09 12:07:41 -04:00
422ad12716 Merge branch 'develop' of https://github.com/boostorg/iterator into develop 2017-10-09 08:17:24 -04:00
b2585dda6a Added Appveyor file. 2017-10-09 08:16:23 -04:00
8b5e92a0c4 Converted asserts in tests to tests using lightweight_test.hpp. 2017-10-02 01:26:39 +03:00
a36ed0f35d Replaced type_traits.hpp with more fine-grained includes. Replaced assert with BOOST_ASSERT. 2017-10-02 01:18:17 +03:00
0a08203107 Replaced type_traits.hpp with more fine grained includes.
This should work around compilation failures on gcc 4.6, which apparently
cannot handle all headers in Boost.TypeTraits.
2017-09-30 15:56:53 +03:00
38ef552209 Add the new path to the header to the comment. 2017-09-18 01:50:55 +03:00
a85dfaa7f2 Added a forwarding header for function_output_iterator.hpp 2017-09-18 01:43:24 +03:00
2af60e066d Move function_output_iterator.hpp into the iterator directory. 2017-09-18 01:39:00 +03:00
7442334ce1 Merge pull request #35 from morinmorin/fix_result_of_in_transform_iterator
Fix usage of decltype-based result_of in transform_iterator.
2017-09-18 01:23:43 +03:00
8577675c85 Renamed scripts to have a meaningful extension. 2017-09-18 01:09:42 +03:00
685b3fe855 Re-added executable permissions for scripts.
The executable bit was removed previously because the files have no extension
and were not considered as scripts by the search command.
2017-09-18 00:30:45 +03:00
a653a39cf4 Removed executable tags. 2017-09-16 07:19:04 -04:00
c338572735 Fix usage of decltype-based result_of in transform_iterator.
Regardless of value categories of a transform_iterator object, its
dereference operator calls m_f as an lvalue. Thus, correct usage of
decltype-based result_of is result_of<const UnaryFunc&(...)>.
2017-09-16 18:01:03 +09:00
07afd26ca2 Merge pull request #34 from morinmorin/fix_result_of_usage
Fix result_of usage
2017-09-11 23:44:36 +03:00
d058933767 Correct the result_of usage. 2017-09-12 02:54:50 +09:00
e2f81e9b48 Silenced signed/unsigned mismatch warning. 2017-09-08 18:12:58 +03:00
379200dfd1 Force result_of use decltype whenever possible to maximize testing of function input iterator with lambdas. 2017-09-08 18:12:02 +03:00
a26314dfb9 Added a check for BOOST_RESULT_OF_USE_DECLTYPE in case if tests are run with forced use of decltype in result_of. 2017-09-07 18:51:36 +03:00
e61592c553 Merge pull request #32 from morinmorin/clean_up_function_input_iterator
Clean up function_input_iterator
2017-09-07 18:46:07 +03:00
a3751006db Merge pull request #33 from morinmorin/fix_lambda_test
Fix lambda test
2017-09-07 18:36:10 +03:00
40da532a4d Suppress signed-unsigned comparison warning. 2017-09-07 20:17:35 +09:00
7ce9f87954 Add more feature checks; lambda test needs decltype-based result_of. 2017-09-07 20:14:39 +09:00
553b9713ac Remove dead class template (i.e. function_reference_input_iterator).
Both make_function_input_iterator(function) and make...(&function)
do not depend on function_reference_input_iterator. Actually, passing a
function reference as a template argument to function_input_iterator is
not supported. Doing so results in compiler errors.
2017-09-06 23:12:18 +09:00
ba32745e80 Replace ugly BOOST_DEDUCED_TYPENAME with typename. 2017-09-06 19:50:15 +09:00
282b28e51f Use boost::addressof instead of &. 2017-09-06 19:47:55 +09:00
479898d9d5 Remove unnecessary headers in test. 2017-09-06 19:41:24 +09:00
c1a375284d Merge pull request #31 from morinmorin/clean_up_test
Clean up function_input_iterator_test.cpp
2017-09-04 12:02:15 -04:00
24d2f58f98 Use lightweight_test.hpp instead of <cassert> 2017-09-05 00:32:15 +09:00
25a91d5981 Silenced gcc warnings about unused parameters. 2017-09-01 20:51:07 +03:00
9b78dc1006 Replaced vector::data() with &v[0] for compatibility with older compilers that don't provide this function. 2017-08-30 17:09:19 +03:00
89ca2fd1ae Shortened internal ids of qbk sections regarding iterator concepts. 2017-08-28 21:48:24 +03:00
79277b78d2 Added references to generator_iterator docs to rst and qbk docs. 2017-08-28 21:45:03 +03:00
eb90ad7a99 Merge pull request #30 from morinmorin/port_rst_to_quickbook
Port rst docs changeset to quickbook
2017-08-28 15:56:05 +03:00
de07014e9a Port rst docs changeset to quickbook (230d47e).
Move difference_type from the Forward Traversal Iterator concept to
the Single Pass Traversal concept.
2017-08-28 20:47:09 +09:00
25dc5c6c9c Port rst docs changeset to quickbook (6368d38).
Fix base class for const_node_iterator.
2017-08-28 20:42:43 +09:00
048c3dfa72 Port rst docs changeset to quickbook (daac0f2).
The argument order is flipped in the documentation.
2017-08-28 20:40:47 +09:00
f7dfc36a9c Port rst docs changeset to quickbook (ad90dac).
UnaryFunction is treated as a const object, but the documentation was missing
the const qualification.
2017-08-28 20:39:10 +09:00
c529399fb1 Reworked the test to avoid bogus warnings from gcc. 2017-08-27 17:48:47 +03:00
6faa3a942b Merge branch 'develop' of github.com:boostorg/iterator into develop 2017-08-27 17:31:54 +03:00
0c6b09ef6a Workaround MSVC 14.1 problem with template specialization partial ordering that caused compilation failure when next/prior is used with pointers. Added a test. 2017-08-27 17:31:34 +03:00
83220e7aea Merge branch 'develop' 2017-08-27 14:02:11 +03:00
991ea534ee Silenced warnings about signed/unsigned mismatch in comparisons. 2017-08-27 13:59:52 +03:00
210633c08c Silenced warnings about signed/unsigned mismatch in comparisons. 2017-08-27 13:59:09 +03:00
3275ee3c82 Updated examples to use unique_ptr when available rather than auto_ptr, which is being deprecated. 2017-08-26 15:04:47 -04:00
a72deda3ac Merge branch 'develop' 2017-08-26 20:39:41 +03:00
2b6b6bf8ad Silence warnings in tests about unused variables and local typedefs. 2017-08-26 20:39:26 +03:00
0107df44ab Remove unused deprecated includes
A comment in boost/iterator.hpp and boost/detail/iterator.hpp mentions that
the files are obsolete and will be deprecated. All they do is pull some types
from namespace std into namespace boost.
2017-08-26 20:23:14 +03:00
011288c2c8 Merge branch 'develop' 2017-08-26 20:07:54 +03:00
eaf1a48583 Added documentation for advance and distance. Various cleanup and fixes.
- Fixed multiple broken links to the documentation. Converted some of the
  links to internal references to the QuickBook documentation. Not all
  links converted because some of the QuickBook pages are not completely
  converted.
- Renamed utilities.qbk to type_traits.qbk and removed the part duplicated
  by concept_checking.qbk.
- Renamed traits.qbk to iterator_traits.qbk to better disambiguate with
  other type traits documented in type_traits.qbk.
- Converted some of the headings in iterator concepts to sections to be
  able to give those sections ids. This allows to reference those sections
  from other places in the documentation.
- In order to preserve the more compact pagination of the new sections
  (i.e. to have multiple sections on one page, like it was with headings)
  set chunk.section.depth=2 in the docs Jamfile.
2017-08-26 19:56:23 +03:00
52fbe950ec Minor next/prior docs corrections to better fit the rest of the docs. 2017-08-26 17:48:38 +03:00
6a672cecbd Replaced non-functional list syntax with direct wording. 2017-08-26 17:36:28 +03:00
577203bee8 Merge branch 'develop' 2017-08-26 17:25:35 +03:00
5f6ac9c020 Added next/prior documentation. 2017-08-26 16:27:55 +03:00
a48de6a8b8 Added tests for next/prior to the Jamfile. Ported tests to lightweight_test.hpp. 2017-08-26 15:31:38 +03:00
5f6fd2dec6 Use std::iterator_traits to detect iterators, when possible.
This allows next/prior to detect user's iterators that do not
define iterator_category nested type but specialize
std::iterator_traits instead.
2017-08-26 15:23:36 +03:00
e3577e7687 Use Boost.Iterator to advance iterators.
By using Boost.Iterator we rely on the separate traversal category instead of
the standard iterator category to advance iterators efficiently. For instance,
this allows to advance transform iterators over a random access sequence
in constant time, despite that they are formally input iterators.

Also, std::reverse_iterator formally requires at least bidirectional iterator
as the underlying iterator type. Transform iterators from the example above
don't qualify, so potentially std::reverse_iterator could fail to compile.
2017-08-26 15:23:36 +03:00
5ba36b063e Changed iterator_category nested type detection to work with MSVC and different versions of gcc. 2017-08-26 15:23:36 +03:00
bab02bb82e Add test cases for std::reverse_iterator 2017-08-26 15:23:36 +03:00
d251a6f515 Reworked iterator handling in next/prior helpers.
The new implementation tries to detect if the incremented/decremented type
is an iterator first and if not falls back to operator probing. This way
iterators that are not SFINAE-friendly (i.e. unconditionally define
arithmetic operators regardless of the iterator category) are still treated
as iterators through std::advance and do not fail the compilation.

The iterator detection is based on probing for the nested iterator_category
type that is expected to be present in class-type iterators. This heuristic
is not flawless since iterators are not required to defined this type.
User-defined iterators may not have it and instead specialize
std::iterator_traits. This use case is not covered by the current implementation
and will likely fail to compile. With C++17 SFINAE-friendly std::iterator_traits
this can be fixed, but currently Boost.Config lacks the macro to detect
availability of this feature. Support for it can be added by a later commit.

Also simplified boost::prior for iterators, removing the possibility of
integer overflow caused by negation of the distance value.
2017-08-26 15:23:36 +03:00
9d054b25ce Reworked next() and prior() taking the distance arguments.
The new version should provide the expected behavior in the case (prior(v.end(), v.size()) == v.begin()). It should also work with integers now, as was originally intended by David Abrahams. Added tests to verify these new use cases.
2017-08-26 15:23:36 +03:00
d1b22ac8e8 Remove executable bit from the file. 2017-08-26 15:23:36 +03:00
abe77db3e0 Added Daryle Walker's copyrights as requested.
[SVN r24481]
2017-08-26 15:23:36 +03:00
398819237e Removed Boost.org copyrights and replaced with originating authors copyright instead.
[SVN r24372]
2017-08-26 15:23:36 +03:00
a4bacb5077 Extended next/prior using patch from Daniel Walker (Daniel.Walker-at-bowneglobal.com)
[SVN r21382]
2017-08-26 15:23:36 +03:00
5ba5f2c2d4 split utility.hpp header
[SVN r17472]
2017-08-26 15:23:36 +03:00
6c1b356be1 Merge pull request #29 from morinmorin/add_doc_for_advance_and_distance
Add doc for advance and distance
2017-07-23 12:38:00 -04:00
bfcf52ace6 Add links to advance and distance 2017-07-23 23:49:30 +09:00
e2c927628c Add documentation for advance and distance 2017-07-23 23:46:26 +09:00
ed027c2cce Merge branch 'develop'
# Conflicts:
#	include/boost/iterator/reverse_iterator.hpp
2017-07-17 12:03:38 -04:00
4791425000 Merge pull request #27 from Lastique/advance_generic_distance
Use a separate template parameter for distance in advance().
2017-07-12 12:20:34 -04:00
b7e7e83a11 Merge pull request #28 from Lastique/patch-2
Avoid integer overflow on negating distance in reverse_iterator
2017-07-12 12:17:22 -04:00
c148962bd9 Avoid integer overflow on negating distance 2017-07-10 14:57:40 +03:00
5bfbfb7716 Use a separate template parameter for distance in advance().
This follows std::advance interface and also allows to use distance types
other than iterator's difference_type (if the iterator supports that).
2017-07-10 14:51:07 +03:00
af5f6e49e0 Merge pull request #26 from Lastique/patch-2
Remove dependency on boost::prior.
2017-07-09 11:59:18 -04:00
26ee5ba754 Remove dependency on boost::prior. 2017-07-09 18:31:06 +03:00
67a2336cf4 Merge pull request #25 from morinmorin/add_readable_iterator_tests
Add more ReabableIterator tests for advance/distance
2017-07-09 11:14:04 -04:00
029277f3ed Add more tests for ReabableIterator 2017-07-08 13:30:28 +09:00
847b2a1be3 Added Travis testing 2017-06-30 20:29:49 -04:00
18268069d9 Merge pull request #24 from morinmorin/add_advance_and_distance
Add boost::advance and boost::distance
2017-06-29 15:02:38 -04:00
bb54ee7900 Update Jamfile.v2 for new tests 2017-06-29 22:49:05 +09:00
d5b67c7fab Add tests for boost::advance/distance 2017-06-29 22:09:26 +09:00
663a30f659 Implement BoostIteratorTraversalConcepts-aware boost::advance/distance 2017-06-29 22:06:12 +09:00
177f719d15 Merge branch 'develop' 2017-04-24 12:24:21 -04:00
cccbd8c6aa Test needs both std::typle support and variadic template support. 2017-04-08 16:53:02 -04:00
d6cfed4b20 Merge pull request #23 from morinmorin/testcase_for_trac_12895
Testcase for PR #22 (trac ticket 12895)
2017-03-15 12:19:13 -04:00
514ac53326 Merge pull request #22 from Dani-Hub/develop
Bug fix for ticket #12895: Apply remove_reference before remove_cv
2017-03-15 12:12:12 -04:00
ca3b7505ce Add a testcase for trac ticket 12895 2017-03-15 20:41:24 +09:00
d7c8cccd64 Bug fix for ticket #12895: Apply remove_reference before remove_cv 2017-03-14 20:45:48 +01:00
7b627fa679 Merge branch 'develop' 2017-01-04 10:58:14 -05:00
760da84f9c Merge branch 'develop' of https://github.com/eldiener/iterator into nekko1119-support-lambda-expression 2016-12-17 19:34:48 -05:00
89d3ec7662 Add inclusion of config.hpp 2016-12-17 19:32:52 -05:00
c86db2ec8a Merge branch 'support-lambda-expression' of https://github.com/nekko1119/iterator into nekko1119-support-lambda-expression 2016-12-16 04:22:44 -05:00
0a18cfb255 Merge pull request #21 from Wilson-N/feature-bug-fix-8010
Remove incorrect documentation stating iterator_facade and iterator_a…
2016-12-01 08:53:05 -05:00
11e3715f37 Updated to use unique_ptr instead of auto_ptr when appropriate. Removed unnecessary structs. 2016-11-07 14:01:19 -05:00
f2d07f76b5 Add, and update, documentation build targets. 2016-10-10 11:39:50 -05:00
53e8ac401f Add, and update, documentation build targets. 2016-10-07 23:07:34 -05:00
434818cce7 Remove incorrect documentation stating iterator_facade and iterator_adapter had
been accepted into the TR1.

Fixes #8010
2016-01-27 22:22:55 -06:00
c09c8ca2b2 Support lambda expressions in function_input_iterator 2015-12-28 02:45:49 +09:00
22dd100dfd Revert "Remove unused deprecated includes"
This reverts commit b2b9ab1568.
2015-10-15 23:55:35 -04:00
2f72016049 Revert "Fix test compilation"
This reverts commit 443dfb9901.
2015-10-15 23:53:37 -04:00
5b26a8b3fc Merge branch 'develop' 2015-10-14 23:59:55 -04:00
711a0232f8 Merge pull request #19 from MarcelRaad/patch-1
Fix test compilation
2015-09-22 18:03:05 -07:00
443dfb9901 Fix test compilation
boost/iterator.hpp was implicitly dragged in via boost/operators.hpp, from which it was removed in cb6500161b. It's not needed anyway, all it does is map boost::iterator to std::iterator.
2015-09-22 00:33:50 +02:00
c734f3bfa3 Merge pull request #18 from MarcelRaad/remove-deprecated-includes
Remove deprecated includes
2015-09-14 12:06:20 -04:00
b2b9ab1568 Remove unused deprecated includes
A comment in boost/iterator.hpp and boost/detail/iterator.hpp mentions that
the files are obsolete and will be deprecated. All they do is pull some types
from namespace std into namespace boost.
2015-09-14 14:28:38 +02:00
8b23342969 Merge pull request #17 from boostorg/revert-16-remove-deprecated-includes
Revert "Remove unused deprecated includes"
2015-09-14 08:17:35 -04:00
922296f8c8 Revert "Remove unused deprecated includes" 2015-09-14 08:16:43 -04:00
c9a91a1fba Merge pull request #16 from MarcelRaad/remove-deprecated-includes
Remove unused deprecated includes
2015-09-14 08:08:53 -04:00
80e6f4a3bf Remove unused deprecated includes
A comment in boost/iterator.hpp and boost/detail/iterator.hpp mentions that
the files are obsolete and will be deprecated. All they do is pull some types
from namespace std into namespace boost.
2015-09-14 10:57:16 +02:00
398bbe63bb Updated quickbook docs just fix problems exposed by upgrading to quickbook 1.6 2015-08-24 12:49:59 -04:00
87d82527b1 Updated zip iterator abstract adds information about the iterator 'tuple'. 2015-08-24 07:18:03 -04:00
b9448b5fae Updated with an explanation of the new 'tuple' type for a zip_iterator based on Boost fusion sequences. 2015-08-24 00:24:09 -04:00
76519ea4a7 Merge branch 'Flast-pr/zip_iterator/fusionize' into develop 2015-08-23 23:56:13 -04:00
878812c42f More tests with fusion sequence as tuple 2015-08-23 23:46:44 -04:00
2283f084d9 Merge pull request #2 from Flast/pr/zip_iterator/fusionize
Fusion based zip_iterator, close #7526
2015-08-23 23:37:38 -04:00
a0533d97f5 Merge branch 'pr/zip_iterator/fusionize' of https://github.com/Flast/iterator into Flast-pr/zip_iterator/fusionize 2015-08-21 22:09:37 -04:00
ece225bbda Merge branch 'develop' 2015-07-18 22:08:52 -04:00
b62dc6ba9d Remove unneeded header file for undefines. 2015-05-22 00:54:44 -04:00
20dc7b1abe Merge pull request #14 from eldiener/develop
Changed needed for type_traits version2 to remove icexxx.hpp dependencies.
2015-05-21 23:28:00 -04:00
0dbbb61bec Put back MPL auxiliary lambda support. 2015-05-21 23:15:31 -04:00
2de2111db2 Remove dependency on deprecated type_traits headers. 2015-05-21 23:14:42 -04:00
db04fafe21 Merge pull request #12 from Lastique/patch-1
Remove unused pure_traversal_tag import into boost::iterators::detail
2015-05-21 16:52:07 -04:00
4e0fc90b60 Merge pull request #11 from jzmaddock/patch-1
Update is_lvalue_iterator.hpp
2015-05-21 16:35:38 -04:00
53cbba6c09 Remove unused name import
As Boost.Range has been updated, there is no need to import pure_traversal_tag into boost::iterators::detail.
2015-01-26 00:02:36 +03:00
8be623d733 Update is_lvalue_iterator.hpp 2015-01-22 08:48:25 +00:00
d12d60fa12 Update is_lvalue_iterator.hpp
In the current type_traits rewrite, type_traits headers no long implicitly include mpl ones, so mpl/bool.hpp has to be explicitly included now.
2015-01-21 16:54:54 +00:00
ec7d398578 Merge pull request #10 from Flast/pr/ref-to-ref/dr106
Avoid 'reference to reference' error with strict C++03 compiler.

While I can't reproduce the error you describe, the patch looks good and it tested okay with Clang 6.0 on Mac and gcc-4.9.1 on Linux.  Thanks for the patch.
2014-11-02 15:59:02 -07:00
3d3560c12d Avoid 'reference to reference' error in C++03.
Some (strict) C++03 compilers (e.g. `gcc -std=c++03`) reject
  'reference-to-reference' in the template and typedef which described
  in CWG DR106 [1].

  In such situations, iterator_facade rejects reference type as a value
  type and some special iterators will become ill-formed:
  the test libs/range/test/join.hpp might be descriptive.

  [1] http://www.open-std.org/Jtc1/sc22/wg21/docs/cwg_defects.html#106

Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-09-29 14:58:40 +09:00
46f9e1753f Merge pull request #9 from boostorg/develop
Merge develop into master

Tested with gcc-4.2.1 on Darwin.
2014-09-06 11:18:28 -06:00
2511f21d62 Merge upstream branch 'develop' into pr/zip_iterator/fusionize 2014-08-25 00:36:36 +09:00
adee905c51 Merge pull request #8 from Lastique/add_docs
Add docs for iterator category and traversal manipulation tools.

Thanks Andrey.
2014-08-23 16:14:52 -06:00
82779f78ec Added docs for iterator category and traversal manipulation tools. 2014-08-24 01:55:25 +04:00
a569c97969 Merge pull request #6 from Lastique/publish-details
Publish some of the implementation details

Tested with clang-5.1 on darwin.
2014-08-23 14:08:11 -06:00
aad821d28d Merge pull request #7 from danieljames/metadata
Create metadata file.
2014-08-23 13:53:06 -06:00
23934d7c0d Add metadata file. 2014-08-18 15:00:20 +01:00
1073b7f7bc Adjustments for compatibility with commit 48dfb68045. 2014-07-30 23:00:35 +04:00
f158dba6ad Moved minimum_category to the public namespace. Added tests. 2014-07-19 21:39:49 +04:00
8fe632d6b1 Copied minimum_category.hpp to public headers. 2014-07-19 21:03:11 +04:00
810b58cfb0 Moved pure_traversal_tag to public namespace.
Also added an import into the boost::detail namespace for backward compatibility with Boost.Range. Added a pure_iterator_traversal metafunction that automatically converts iterator category as well.
2014-07-19 20:57:42 +04:00
156c13a494 Merge upstream branch 'develop' into pr/zip_iterator/fusionize
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-07-12 15:57:03 +09:00
785680d929 Merge pull request #5 from Lastique/adl-protect
Moved most components of the library to iterators:: namespace.

Thanks Andrey.
2014-07-10 11:33:50 -06:00
269de2691a Added a workaround for boost/token_iteratpr.hpp which uses an implementation detail of this library. 2014-07-07 22:22:28 +04:00
11f7d1bc18 Merge upstream branch 'develop' into pr/zip_iterator/fusionize
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-07-03 21:52:26 +09:00
4a403cd3eb Trim spaces. 2014-07-03 00:36:44 +04:00
dc96d371fa Moved most components of the library to iterators:: namespace.
This change excludes boost:: and boost::detail:: namespaces from ADL for unqualified function calls (e.g. algorithms). This reduces the possibility of name clashes with other libraries and user's code. One of the effects should be fixing test failures on gcc 4.2 and 4.4 due to clashed with Boost.TypeTraits.

Also some of the functions marked with inline keyword.
2014-07-03 00:22:45 +04:00
e000b676cc Merge pull request #4 from Lastique/sfinae-based-operators
Make iterator operators conditionally defined depending on its category.

Looks okay and fixes several known problems, thanks Andrey.
2014-06-30 16:49:53 -06:00
045a05f81f Run generator_iterator_test.cpp
I accidentally removed it in 8e5b8025d8.
2014-06-30 10:59:03 +01:00
25139e1311 Remove operator_brackets_dispatch.hpp
I should have removed it in 8e5b8025d8.
2014-06-30 10:53:35 +01:00
aad767ed3f Merge upstream branch 'develop' into pr/zip_iterator/fusionize 2014-06-30 11:13:38 +09:00
7fa65a4278 Made iterator operators conditionally defined depending on its category.
This makes iterators defined using iterator_facade more friendly to type inspection and fixes its use with next()/prior() since commit 651a869d4f.
The arithmetic, indexing and relational operators are only defined if the iterator category or traversal permits that. Note that the implementation requires partial template specialization support now.
2014-06-30 00:05:38 +04:00
fd94cc7d78 Removed executable flags from docs, tests and examples. 2014-06-29 15:49:05 +04:00
36988fcf98 Removed executable flags from headers. 2014-06-29 15:42:47 +04:00
91f782ec52 Merge branch 'feature/remove-old-compiler-support' into develop 2014-06-26 11:46:39 +01:00
9841d87212 Add tests for fusion based zip_iterator
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-06-14 15:59:31 +09:00
782313db8c Remove unnecessary specialization
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-06-14 15:59:31 +09:00
c040d4c38b make_zip_iterator should be inlined
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-06-14 15:59:31 +09:00
1ddaca8297 zip_iterator specialization for std::pair
Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-06-14 15:59:31 +09:00
acf9b4d4cf Reimplement zip_iterator based on Boost.Fusion
By default, backward compatibility for Boost.Tuple is presented.

Signed-off-by: Kohei Takahashi <flast@flast.jp>
2014-06-12 01:05:36 +09:00
e88b3f475c Remove the the broken compiler notes.
Now that the workarounds have been removed, they no longer apply.
2014-06-06 23:03:04 +01:00
01cffbed98 Rebuild iterator_traits.html using latest docutils. 2014-06-06 23:03:04 +01:00
187bc896f6 BOOST_ITERATOR_CATEGORY shouldn't be removed.
Since it was documented, it should be kept for backwards compatiblity.
2014-06-06 23:03:03 +01:00
6883d083d2 Iterator: Remove obsolete MSVC version checks.
[SVN r86082]

Conflicts:
	include/boost/iterator/iterator_facade.hpp
2014-06-06 23:03:03 +01:00
0345db959b Remove use of BOOST_ITERATOR_CATEGORY
[SVN r86056]
2014-06-06 23:03:03 +01:00
d814423414 Iterator: Remove obsolete GCC version check.
[SVN r86055]
2014-06-06 23:03:03 +01:00
eb288b2908 Iterator: Remove use of eti baseclass workaround.
[SVN r85940]
2014-06-06 23:03:03 +01:00
179 changed files with 5401 additions and 3337 deletions

415
.travis.yml Normal file
View File

@ -0,0 +1,415 @@
# Copyright 2016, 2017 Peter Dimov
# Copyright 2019 Andrey Semashev
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
language: cpp
sudo: false
python: "2.7"
branches:
only:
- master
- develop
- /feature\/.*/
env:
matrix:
- BOGUS_JOB=true
matrix:
exclude:
- env: BOGUS_JOB=true
include:
# gcc, Linux
# Note: gcc-4.4 in C++0x mode fails zip_iterator tests with std::tuple
- os: linux
dist: trusty
compiler: gcc-4.4
env: TOOLSET=gcc COMPILER=g++-4.4 CXXSTD=98
addons:
apt:
packages:
- g++-4.4
sources:
- ubuntu-toolchain-r-test
- os: linux
dist: trusty
compiler: gcc-4.6
env: TOOLSET=gcc COMPILER=g++-4.6 CXXSTD=03,0x
addons:
apt:
packages:
- g++-4.6
sources:
- ubuntu-toolchain-r-test
- os: linux
dist: trusty
compiler: gcc-4.7
env: TOOLSET=gcc COMPILER=g++-4.7 CXXSTD=03,11
addons:
apt:
packages:
- g++-4.7
sources:
- ubuntu-toolchain-r-test
- os: linux
dist: xenial
compiler: gcc-4.8
env: TOOLSET=gcc COMPILER=g++-4.8 CXXSTD=03,11
addons:
apt:
packages:
- g++-4.8
sources:
- ubuntu-toolchain-r-test
- os: linux
dist: xenial
compiler: gcc-4.9
env: TOOLSET=gcc COMPILER=g++-4.9 CXXSTD=03,11
addons:
apt:
packages:
- g++-4.9
sources:
- ubuntu-toolchain-r-test
- os: linux
dist: xenial
compiler: gcc-5
env: TOOLSET=gcc COMPILER=g++-5 CXXSTD=03,11,14,1z
addons:
apt:
packages:
- g++-5
sources:
- ubuntu-toolchain-r-test
- os: linux
dist: xenial
compiler: gcc-6
env: TOOLSET=gcc COMPILER=g++-6 CXXSTD=03,11,14,1z
addons:
apt:
packages:
- g++-6
sources:
- ubuntu-toolchain-r-test
- os: linux
dist: xenial
compiler: gcc-7
env: TOOLSET=gcc COMPILER=g++-7 CXXSTD=03,11,14,17
addons:
apt:
packages:
- g++-7
sources:
- ubuntu-toolchain-r-test
- os: linux
dist: xenial
compiler: gcc-8
env: TOOLSET=gcc COMPILER=g++-8 CXXSTD=03,11,14,17,2a
addons:
apt:
packages:
- g++-8
sources:
- ubuntu-toolchain-r-test
- os: linux
dist: bionic
compiler: gcc-9
env: TOOLSET=gcc COMPILER=g++-9 CXXSTD=03,11,14,17,2a
addons:
apt:
packages:
- g++-9
sources:
- sourceline: "ppa:ubuntu-toolchain-r/test"
- os: linux
dist: bionic
compiler: gcc-10
env: TOOLSET=gcc COMPILER=g++-10 CXXSTD=03,11,14,17,20
addons:
apt:
packages:
- g++-10
sources:
- sourceline: "ppa:ubuntu-toolchain-r/test"
- os: linux
dist: bionic
compiler: gcc-UBSAN
env: UBSAN=1 TOOLSET=gcc COMPILER=g++-10 CXXSTD=03,11,14,17,20 UBSAN_OPTIONS=print_stacktrace=1 LINKFLAGS=-fuse-ld=gold
addons:
apt:
packages:
- g++-10
sources:
- sourceline: "ppa:ubuntu-toolchain-r/test"
# clang, Linux
- os: linux
dist: trusty
compiler: clang-3.5
env: TOOLSET=clang COMPILER=clang++-3.5 CXXSTD=03,11
addons:
apt:
packages:
- clang-3.5
- libstdc++-4.9-dev
sources:
- ubuntu-toolchain-r-test
- sourceline: "deb http://apt.llvm.org/trusty/ llvm-toolchain-trusty-3.5 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
- os: linux
dist: trusty
compiler: clang-3.6
env: TOOLSET=clang COMPILER=clang++-3.6 CXXSTD=03,11
addons:
apt:
packages:
- clang-3.6
- libstdc++-5-dev
sources:
- ubuntu-toolchain-r-test
- sourceline: "deb http://apt.llvm.org/trusty/ llvm-toolchain-trusty-3.6 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
- os: linux
dist: trusty
compiler: clang-3.7
env: TOOLSET=clang COMPILER=clang++-3.7 CXXSTD=03,11
addons:
apt:
packages:
- clang-3.7
- libstdc++-5-dev
sources:
- ubuntu-toolchain-r-test
- sourceline: "deb http://apt.llvm.org/trusty/ llvm-toolchain-trusty-3.7 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
- os: linux
dist: xenial
compiler: clang-3.8
env: TOOLSET=clang COMPILER=clang++-3.8 CXXSTD=03,11,14,1z
addons:
apt:
packages:
- clang-3.8
- libstdc++-6-dev
sources:
- ubuntu-toolchain-r-test
- sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-3.8 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
- os: linux
dist: xenial
compiler: clang-3.9
env: TOOLSET=clang COMPILER=clang++-3.9 CXXSTD=03,11,14,1z
addons:
apt:
packages:
- clang-3.9
- libstdc++-6-dev
sources:
- ubuntu-toolchain-r-test
- sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-3.9 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
- os: linux
dist: xenial
compiler: clang-4
env: TOOLSET=clang COMPILER=clang++-4.0 CXXSTD=03,11,14,1z
addons:
apt:
packages:
- clang-4.0
- libstdc++-6-dev
sources:
- ubuntu-toolchain-r-test
- sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-4.0 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
- os: linux
dist: xenial
compiler: clang-5
env: TOOLSET=clang COMPILER=clang++-5.0 CXXSTD=03,11,14,1z
addons:
apt:
packages:
- clang-5.0
- libstdc++-7-dev
sources:
- ubuntu-toolchain-r-test
- sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-5.0 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
- os: linux
dist: xenial
compiler: clang-6
env: TOOLSET=clang COMPILER=clang++-6.0 CXXSTD=03,11,14,17,2a
addons:
apt:
packages:
- clang-6.0
- libstdc++-8-dev
sources:
- ubuntu-toolchain-r-test
- sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-6.0 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
- os: linux
dist: xenial
compiler: clang-7
env: TOOLSET=clang COMPILER=clang++-7 CXXSTD=03,11,14,17,2a
addons:
apt:
packages:
- clang-7
- libstdc++-8-dev
sources:
- ubuntu-toolchain-r-test
- sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-7 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
- os: linux
dist: xenial
compiler: clang-8
env: TOOLSET=clang COMPILER=clang++-8 CXXSTD=03,11,14,17,2a
addons:
apt:
packages:
- clang-8
- libstdc++-8-dev
sources:
- ubuntu-toolchain-r-test
- sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-8 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
- os: linux
dist: xenial
compiler: clang-9
env: TOOLSET=clang COMPILER=clang++-9 CXXSTD=03,11,14,17,2a
addons:
apt:
packages:
- clang-9
- libstdc++-9-dev
sources:
- sourceline: "ppa:ubuntu-toolchain-r/test"
- sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-9 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
- os: linux
dist: xenial
compiler: clang-10
env: TOOLSET=clang COMPILER=clang++-10 CXXSTD=03,11,14,17,20
addons:
apt:
packages:
- clang-10
- libstdc++-9-dev
sources:
- sourceline: "ppa:ubuntu-toolchain-r/test"
- sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-10 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
- os: linux
dist: xenial
compiler: clang-UBSAN
env: UBSAN=1 TOOLSET=clang COMPILER=clang++-10 CXXSTD=03,11,14,17,20 UBSAN_OPTIONS=print_stacktrace=1
addons:
apt:
packages:
- clang-10
- libstdc++-9-dev
sources:
- sourceline: "ppa:ubuntu-toolchain-r/test"
- sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-10 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
- os: linux
dist: xenial
compiler: clang-libc++
env: TOOLSET=clang COMPILER=clang++-10 CXXSTD=03,11,14,17,20 CXXFLAGS="-stdlib=libc++" LINKFLAGS="-stdlib=libc++"
addons:
apt:
packages:
- clang-10
- libc++-10-dev
- libc++abi-10-dev
sources:
- sourceline: "ppa:ubuntu-toolchain-r/test"
- sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-10 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
- os: linux
dist: xenial
compiler: clang-libc++-UBSAN
env: UBSAN=1 TOOLSET=clang COMPILER=clang++-10 CXXSTD=03,11,14,17,20 UBSAN_OPTIONS=print_stacktrace=1 CXXFLAGS="-stdlib=libc++" LINKFLAGS="-stdlib=libc++"
addons:
apt:
packages:
- clang-10
- libc++-10-dev
- libc++abi-10-dev
sources:
- sourceline: "ppa:ubuntu-toolchain-r/test"
- sourceline: "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-10 main"
key_url: "https://apt.llvm.org/llvm-snapshot.gpg.key"
# clang, OS X
# OS X builds are slow on Travis CI
# - os: osx
# env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11,14,1z
# osx_image: xcode9.4
#
# - os: osx
# env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11,14,1z
# osx_image: xcode10.3
- os: osx
env: TOOLSET=clang COMPILER=clang++ CXXSTD=03,11,14,17
osx_image: xcode11.2
install:
- GIT_FETCH_JOBS=8
- BOOST_BRANCH=develop
- if [ "$TRAVIS_BRANCH" = "master" ]; then BOOST_BRANCH=master; fi
- cd ..
- git clone -b $BOOST_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
- cd boost-root
- git submodule init tools/build
- git submodule init tools/boostdep
- git submodule init tools/boost_install
- git submodule init libs/headers
- git submodule init libs/config
- git submodule update --jobs $GIT_FETCH_JOBS
- cp -r $TRAVIS_BUILD_DIR/* libs/iterator
- python tools/boostdep/depinst/depinst.py --git_args "--jobs $GIT_FETCH_JOBS" iterator
- ./bootstrap.sh
- ./b2 headers
script:
- |-
echo "using $TOOLSET : : $COMPILER ;" > ~/user-config.jam
- BUILD_JOBS=`(nproc || sysctl -n hw.ncpu) 2> /dev/null`
- ./b2 -j $BUILD_JOBS libs/iterator/test toolset=$TOOLSET cxxstd=$CXXSTD ${UBSAN:+cxxflags=-fsanitize=undefined cxxflags=-fno-sanitize-recover=undefined linkflags=-fsanitize=undefined define=UBSAN=1 debug-symbols=on visibility=global} ${CXXFLAGS:+cxxflags="$CXXFLAGS"} ${LINKFLAGS:+linkflags="$LINKFLAGS"}
notifications:
email:
on_success: always

34
CMakeLists.txt Normal file
View File

@ -0,0 +1,34 @@
# Copyright 2018 Peter Dimov
# Copyright 2018 Andrey Semashev
# Distributed under the Boost Software License, Version 1.0.
# See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt
# Partial (add_subdirectory only) and experimental CMake support
# Subject to change; please do not rely on the contents of this file yet.
cmake_minimum_required(VERSION 3.5)
project(BoostIterator LANGUAGES CXX)
add_library(boost_iterator INTERFACE)
add_library(Boost::iterator ALIAS boost_iterator)
target_include_directories(boost_iterator INTERFACE include)
target_link_libraries(boost_iterator
INTERFACE
Boost::assert
Boost::concept_check
Boost::config
Boost::conversion
Boost::core
Boost::detail
Boost::function_types
Boost::fusion
Boost::mpl
Boost::optional
Boost::smart_ptr
Boost::static_assert
Boost::type_traits
Boost::utility
)

80
appveyor.yml Normal file
View File

@ -0,0 +1,80 @@
# Copyright 2017 Edward Diener
# Copyright 2019 Andrey Semashev
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
version: 1.0.{build}-{branch}
shallow_clone: true
branches:
only:
- master
- develop
- /feature\/.*/
environment:
matrix:
- TOOLSET: msvc-9.0,msvc-10.0,msvc-11.0,msvc-12.0
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- TOOLSET: msvc-14.0
ADDRMD: 32,64
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- TOOLSET: msvc-14.1
CXXSTD: 14,17
ADDRMD: 32,64
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
- TOOLSET: msvc-14.2
ADDRMD: 32,64
CXXSTD: 14,17
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
- TOOLSET: clang-win
ADDRMD: 32,64
CXXSTD: 14,17
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
- TOOLSET: gcc
CXXSTD: 03,11,14,1z
ADDPATH: C:\cygwin\bin;
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- TOOLSET: gcc
CXXSTD: 03,11,14,1z
ADDPATH: C:\cygwin64\bin;
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- TOOLSET: gcc
CXXSTD: 03,11,14,1z
ADDPATH: C:\mingw\bin;
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- TOOLSET: gcc
CXXSTD: 03,11,14,1z
ADDPATH: C:\mingw-w64\x86_64-6.3.0-posix-seh-rt_v5-rev1\mingw64\bin;
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- TOOLSET: gcc
CXXSTD: 03,11,14,1z
ADDPATH: C:\mingw-w64\x86_64-7.3.0-posix-seh-rt_v5-rev0\mingw64\bin;
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
install:
- set GIT_FETCH_JOBS=8
- set BOOST_BRANCH=develop
- if "%APPVEYOR_REPO_BRANCH%" == "master" set BOOST_BRANCH=master
- cd ..
- git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
- cd boost-root
- git submodule init tools/build
- git submodule init tools/boostdep
- git submodule init tools/boost_install
- git submodule init libs/headers
- git submodule init libs/config
- git submodule update --jobs %GIT_FETCH_JOBS%
- xcopy /s /e /q %APPVEYOR_BUILD_FOLDER% libs\iterator
- python tools/boostdep/depinst/depinst.py --git_args "--jobs %GIT_FETCH_JOBS%" iterator
- cmd /c bootstrap
- b2 -d0 headers
build: off
test_script:
- PATH=%ADDPATH%%PATH%
- if not "%CXXSTD%" == "" set CXXSTD=cxxstd=%CXXSTD%
- if not "%ADDRMD%" == "" set ADDRMD=address-model=%ADDRMD%
- b2 -j %NUMBER_OF_PROCESSORS% libs/iterator/test toolset=%TOOLSET% %CXXSTD% %ADDRMD%

0
doc/BidirectionalTraversal.rst Executable file → Normal file
View File

0
doc/ForwardTraversal.rst Executable file → Normal file
View File

0
doc/GNUmakefile Executable file → Normal file
View File

0
doc/IncrementableIterator.rst Executable file → Normal file
View File

View File

@ -16,8 +16,12 @@ boostbook standalone
<xsl:param>boost.root=../../../..
<xsl:param>toc.max.depth=3
<xsl:param>toc.section.depth=3
<xsl:param>chunk.section.depth=4
<xsl:param>chunk.section.depth=2
<format>pdf:<xsl:param>boost.url.prefix=http://www.boost.org/doc/libs/release/libs/iterator/doc
;
###############################################################################
alias boostdoc ;
explicit boostdoc ;
alias boostrelease : standalone ;
explicit boostrelease ;

0
doc/LvalueIterator.rst Executable file → Normal file
View File

0
doc/ReadableIterator.rst Executable file → Normal file
View File

0
doc/SinglePassIterator.rst Executable file → Normal file
View File

0
doc/SwappableIterator.rst Executable file → Normal file
View File

0
doc/WritableIterator.rst Executable file → Normal file
View File

75
doc/advance.rst Normal file
View File

@ -0,0 +1,75 @@
.. Copyright (C) 2017 Michel Morin.
Distributed under 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)
=======
advance
=======
``boost::iterators::advance`` is an adapted version of ``std::advance`` for
the Boost iterator traversal concepts.
Header
------
``<boost/iterator/advance.hpp>``
Synopsis
--------
::
template <typename Iterator, typename Distance>
constexpr void advance(Iterator& it, Distance n);
Description
-----------
Moves ``it`` forward by ``n`` increments
(or backward by ``|n|`` decrements if ``n`` is negative).
Requirements
------------
``Iterator`` should model Incrementable Iterator.
Preconditions
-------------
Let ``it``\ :sub:`i` be the iterator obtained by incrementing
(or decrementing if ``n`` is negative) ``it`` by *i*. All the iterators
``it``\ :sub:`i` for *i* = 0, 1, 2, ..., ``|n|`` should be valid.
If ``Iterator`` does not model Bidirectional Traversal Iterator,
``n`` should be non-negative.
Complexity
----------
If ``Iterator`` models Random Access Traversal Iterator, it takes constant time;
otherwise it takes linear time.
Notes
-----
- This function is not a customization point and is protected against
being found by argument-dependent lookup (ADL).
- This function is ``constexpr`` only in C++14 or later.
--------------------------------------------------------------------------------
| Author: Michel Morin
| Copyright |C| 2017 Michel Morin
| Distributed under the `Boost Software License, Version 1.0
<http://www.boost.org/LICENSE_1_0.txt>`_.
.. |C| unicode:: U+00A9 .. COPYRIGHT SIGN

0
doc/counting_iterator.pdf Executable file → Normal file
View File

72
doc/distance.rst Normal file
View File

@ -0,0 +1,72 @@
.. Copyright (C) 2017 Michel Morin.
Distributed under 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)
========
distance
========
``boost::iterators::distance`` is an adapted version of ``std::distance`` for
the Boost iterator traversal concepts.
Header
------
``<boost/iterator/distance.hpp>``
Synopsis
--------
::
template <typename Iterator>
constexpr typename iterator_difference<Iterator>::type
distance(Iterator first, Iterator last);
Description
-----------
Computes the (signed) distance from ``first`` to ``last``.
Requirements
------------
``Iterator`` should model Single Pass Iterator.
Preconditions
-------------
If ``Iterator`` models Random Access Traversal Iterator,
``[first, last)`` or ``[last, first)`` should be valid;
otherwise ``[first, last)`` should be valid.
Complexity
----------
If ``Iterator`` models Random Access Traversal Iterator, it takes constant time;
otherwise it takes linear time.
Notes
-----
- This function is not a customization point and is protected against
being found by argument-dependent lookup (ADL).
- This function is ``constexpr`` only in C++14 or later.
--------------------------------------------------------------------------------
| Author: Michel Morin
| Copyright |C| 2017 Michel Morin
| Distributed under the `Boost Software License, Version 1.0
<http://www.boost.org/LICENSE_1_0.txt>`_.
.. |C| unicode:: U+00A9 .. COPYRIGHT SIGN

0
doc/docutils.sty Executable file → Normal file
View File

0
doc/facade-and-adaptor.pdf Executable file → Normal file
View File

0
doc/facade_iterator_category.rst Executable file → Normal file
View File

0
doc/filter_iterator.pdf Executable file → Normal file
View File

0
doc/function_output_iterator.pdf Executable file → Normal file
View File

View File

@ -131,6 +131,9 @@ is called to get the value to return.</li>
<li><a class="reference external" href="function_output_iterator.html"><tt class="docutils literal"><span class="pre">function_output_iterator</span></tt></a> (<a class="reference external" href="function_output_iterator.pdf">PDF</a>): an output iterator wrapping a unary function
object; each time an element is written into the dereferenced
iterator, it is passed as a parameter to the function object.</li>
<li><a class="reference external" href="generator_iterator.htm"><tt class="docutils literal"><span class="pre">generator_iterator</span></tt></a>: an input iterator wrapping a reference to a generator (nullary function object);
each time the iterator is dereferenced, the function object
is called to get the value to return. This is a more outdated analogue of <tt class="docutils literal"><span class="pre">function_input_iterator</span></tt>.</li>
<li><a class="reference external" href="indirect_iterator.html"><tt class="docutils literal"><span class="pre">indirect_iterator</span></tt></a> (<a class="reference external" href="indirect_iterator.pdf">PDF</a>): an iterator over the objects <em>pointed-to</em> by the
elements of some sequence.</li>
<li><a class="reference external" href="permutation_iterator.html"><tt class="docutils literal"><span class="pre">permutation_iterator</span></tt></a> (<a class="reference external" href="permutation_iterator.pdf">PDF</a>): an iterator over the elements of some random-access

View File

@ -115,8 +115,8 @@ __ iterator_facade.pdf
__ iterator_adaptor.pdf
Both |facade| and |adaptor| as well as many of the `specialized
adaptors`_ mentioned below have been proposed for standardization,
and accepted into the first C++ technical report; see our
adaptors`_ mentioned below have been proposed for standardization;
see our
`Standard Proposal For Iterator Facade and Adaptor`__ (PDF__)
@ -146,6 +146,10 @@ iterator templates based on the Boost `iterator facade and adaptor`_.
object; each time an element is written into the dereferenced
iterator, it is passed as a parameter to the function object.
* |generator|_: an input iterator wrapping a generator (nullary
function object); each time the iterator is dereferenced, the function object
is called to get the value to return. This is an outdated analogue of |function_input|_.
* |indirect|_ (PDF__): an iterator over the objects *pointed-to* by the
elements of some sequence.
@ -183,6 +187,9 @@ __ function_input_iterator.pdf
.. _function_output: function_output_iterator.html
__ function_output_iterator.pdf
.. |generator| replace:: ``generator_iterator``
.. _generator: generator_iterator.htm
.. |indirect| replace:: ``indirect_iterator``
.. _indirect: indirect_iterator.html
__ indirect_iterator.pdf
@ -213,6 +220,23 @@ __ zip_iterator.pdf
Iterator Utilities
====================
Operations
----------
The standard library does not handle new-style iterators properly,
because it knows nothing about the iterator traversal concepts.
The Boost.Iterator library provides implementations that fully understand
the new concepts for the two basic operations:
- |advance|_
- |distance|_
.. |advance| replace:: ``advance``
.. _advance: advance.html
.. |distance| replace:: ``distance``
.. _distance: distance.html
Traits
------

0
doc/indirect_iterator.pdf Executable file → Normal file
View File

0
doc/indirect_reference_ref.rst Executable file → Normal file
View File

0
doc/interoperability-revisited.rst Executable file → Normal file
View File

0
doc/iterator_adaptor.pdf Executable file → Normal file
View File

0
doc/iterator_adaptor_tutorial.rst Executable file → Normal file
View File

0
doc/iterator_archetypes.html Executable file → Normal file
View File

0
doc/iterator_archetypes.pdf Executable file → Normal file
View File

0
doc/iterator_archetypes.rst Executable file → Normal file
View File

0
doc/iterator_concepts.pdf Executable file → Normal file
View File

0
doc/iterator_concepts.rst Executable file → Normal file
View File

0
doc/iterator_facade.pdf Executable file → Normal file
View File

0
doc/iterator_facade_tutorial.rst Executable file → Normal file
View File

31
doc/iterator_traits.html Executable file → Normal file
View File

@ -3,11 +3,11 @@
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
<meta name="generator" content="Docutils 0.11: http://docutils.sourceforge.net/" />
<title>Iterator Traits</title>
<meta name="author" content="David Abrahams" />
<meta name="organization" content="Boost Consulting" />
<meta name="date" content="2006-09-11" />
<meta name="date" content="$Date$" />
<meta name="copyright" content="Copyright David Abrahams 2004." />
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
</head>
@ -25,7 +25,7 @@
<tr><th class="docinfo-name">Organization:</th>
<td><a class="first last reference external" href="http://www.boost-consulting.com">Boost Consulting</a></td></tr>
<tr><th class="docinfo-name">Date:</th>
<td>2006-09-11</td></tr>
<td>$Date$</td></tr>
<tr><th class="docinfo-name">Copyright:</th>
<td>Copyright David Abrahams 2004.</td></tr>
</tbody>
@ -37,7 +37,7 @@
<col class="field-name" />
<col class="field-body" />
<tbody valign="top">
<tr class="field"><th class="field-name">abstract:</th><td class="field-body">Header <tt class="docutils literal"><span class="pre">&lt;boost/iterator/iterator_traits.hpp&gt;</span></tt> provides
<tr class="field"><th class="field-name">abstract:</th><td class="field-body">Header <tt class="docutils literal">&lt;boost/iterator/iterator_traits.hpp&gt;</tt> provides
the ability to access an iterator's associated types using
MPL-compatible <a class="reference external" href="../../mpl/doc/index.html#metafunctions">metafunctions</a>.</td>
</tr>
@ -46,15 +46,15 @@ MPL-compatible <a class="reference external" href="../../mpl/doc/index.html#meta
<div class="section" id="overview">
<h1>Overview</h1>
<p><tt class="docutils literal"><span class="pre">std::iterator_traits</span></tt> provides access to five associated types
of any iterator: its <tt class="docutils literal"><span class="pre">value_type</span></tt>, <tt class="docutils literal"><span class="pre">reference</span></tt>, <tt class="docutils literal"><span class="pre">pointer</span></tt>,
<tt class="docutils literal"><span class="pre">iterator_category</span></tt>, and <tt class="docutils literal"><span class="pre">difference_type</span></tt>. Unfortunately,
of any iterator: its <tt class="docutils literal">value_type</tt>, <tt class="docutils literal">reference</tt>, <tt class="docutils literal">pointer</tt>,
<tt class="docutils literal">iterator_category</tt>, and <tt class="docutils literal">difference_type</tt>. Unfortunately,
such a &quot;multi-valued&quot; traits template can be difficult to use in a
metaprogramming context. <tt class="docutils literal"><span class="pre">&lt;boost/iterator/iterator_traits.hpp&gt;</span></tt>
metaprogramming context. <tt class="docutils literal">&lt;boost/iterator/iterator_traits.hpp&gt;</tt>
provides access to these types using a standard <a class="reference external" href="../../mpl/doc/index.html#metafunctions">metafunctions</a>.</p>
</div>
<div class="section" id="summary">
<h1>Summary</h1>
<p>Header <tt class="docutils literal"><span class="pre">&lt;boost/iterator/iterator_traits.hpp&gt;</span></tt>:</p>
<p>Header <tt class="docutils literal">&lt;boost/iterator/iterator_traits.hpp&gt;</tt>:</p>
<pre class="literal-block">
template &lt;class Iterator&gt;
struct iterator_value
@ -98,21 +98,6 @@ struct iterator_category
};
</pre>
</div>
<div class="section" id="broken-compiler-notes">
<h1>Broken Compiler Notes</h1>
<p>Because of workarounds in Boost, you may find that these
<a class="reference external" href="../../mpl/doc/index.html#metafunctions">metafunctions</a> actually work better than the facilities provided by
your compiler's standard library.</p>
<p>On compilers that don't support partial specialization, such as
Microsoft Visual C++ 6.0 or 7.0, you may need to manually invoke
<a class="reference external" href="../../type_traits/index.html#transformations">BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION</a> on the
<tt class="docutils literal"><span class="pre">value_type</span></tt> of pointers that are passed to these metafunctions.</p>
<p>Because of bugs in the implementation of GCC-2.9x, the name of
<tt class="docutils literal"><span class="pre">iterator_category</span></tt> is changed to <tt class="docutils literal"><span class="pre">iterator_category_</span></tt> on that
compiler. A macro, <tt class="docutils literal"><span class="pre">BOOST_ITERATOR_CATEGORY</span></tt>, that expands to
either <tt class="docutils literal"><span class="pre">iterator_category</span></tt> or <tt class="docutils literal"><span class="pre">iterator_category_</span></tt>, as
appropriate to the platform, is provided for portability.</p>
</div>
</div>
<div class="footer">
<hr class="footer" />

0
doc/iterator_traits.pdf Executable file → Normal file
View File

21
doc/iterator_traits.rst Executable file → Normal file
View File

@ -75,24 +75,3 @@ Header ``<boost/iterator/iterator_traits.hpp>``::
detail::iterator_traits<Iterator>::iterator_category
type;
};
Broken Compiler Notes
=====================
Because of workarounds in Boost, you may find that these
metafunctions_ actually work better than the facilities provided by
your compiler's standard library.
On compilers that don't support partial specialization, such as
Microsoft Visual C++ 6.0 or 7.0, you may need to manually invoke
BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION_ on the
``value_type`` of pointers that are passed to these metafunctions.
Because of bugs in the implementation of GCC-2.9x, the name of
``iterator_category`` is changed to ``iterator_category_`` on that
compiler. A macro, ``BOOST_ITERATOR_CATEGORY``, that expands to
either ``iterator_category`` or ``iterator_category_``, as
appropriate to the platform, is provided for portability.
.. _BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION: ../../type_traits/index.html#transformations

0
doc/make_counting_iterator.rst Executable file → Normal file
View File

0
doc/make_filter_iterator.rst Executable file → Normal file
View File

0
doc/make_transform_iterator.rst Executable file → Normal file
View File

0
doc/make_zip_iterator.rst Executable file → Normal file
View File

0
doc/new-iter-concepts.pdf Executable file → Normal file
View File

0
doc/permutation_iterator.pdf Executable file → Normal file
View File

0
doc/pointee.html Executable file → Normal file
View File

0
doc/pointee.pdf Executable file → Normal file
View File

0
doc/pointee.rst Executable file → Normal file
View File

0
doc/pointee_ref.rst Executable file → Normal file
View File

View File

@ -1,4 +1,3 @@
[section:adaptor Iterator Adaptor]
The `iterator_adaptor` class template adapts some `Base` [#base]_
@ -47,7 +46,7 @@ that assumption.
, class Reference = use_default
, class Difference = use_default
>
class iterator_adaptor
class iterator_adaptor
: public iterator_facade<Derived, *V'*, *C'*, *R'*, *D'*> // see details
{
friend class iterator_core_access;
@ -60,21 +59,21 @@ that assumption.
typedef iterator_adaptor iterator_adaptor\_;
Base const& base_reference() const;
Base& base_reference();
private: // Core iterator interface for iterator_facade.
private: // Core iterator interface for iterator_facade.
typename iterator_adaptor::reference dereference() const;
template <
class OtherDerived, class OtherIterator, class V, class C, class R, class D
>
class OtherDerived, class OtherIterator, class V, class C, class R, class D
>
bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& x) const;
void advance(typename iterator_adaptor::difference_type n);
void increment();
void decrement();
template <
class OtherDerived, class OtherIterator, class V, class C, class R, class D
>
>
typename iterator_adaptor::difference_type distance_to(
iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;
@ -132,8 +131,8 @@ above are defined as follows:
iterator_adaptor();
[*Requires:] The `Base` type must be Default Constructible.\n
[*Returns:] An instance of `iterator_adaptor` with
[*Requires:] The `Base` type must be Default Constructible.[br]
[*Returns:] An instance of `iterator_adaptor` with
`m_iterator` default constructed.
@ -167,7 +166,7 @@ above are defined as follows:
template <
class OtherDerived, class OtherIterator, class V, class C, class R, class D
>
>
bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& x) const;
[*Returns:] `m_iterator == x.base()`
@ -188,7 +187,7 @@ above are defined as follows:
template <
class OtherDerived, class OtherIterator, class V, class C, class R, class D
>
>
typename iterator_adaptor::difference_type distance_to(
iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;
@ -206,7 +205,7 @@ we're going to pick up right where it left off.
.. |fac_tut| replace:: `iterator_facade` tutorial
.. _fac_tut: iterator_facade.html#tutorial-example
[blurb [*`node_base*` really *is* an iterator]\n\n
[blurb [*`node_base*` really *is* an iterator][br][br]
It's not really a very interesting iterator, since `node_base`
is an abstract class: a pointer to a `node_base` just points
at some base subobject of an instance of some other class, and
@ -229,7 +228,7 @@ operations on the underlying pointer, via the `node_iterator`\ 's
|dereference_and_equal|_). The only real behavioral difference
between `node_base*` and `node_iterator` can be observed when
they are incremented: `node_iterator` follows the
`m_next` pointer, while `node_base*` just applies an address offset.
`m_next` pointer, while `node_base*` just applies an address offset.
.. |dereference_and_equal| replace:: `dereference` and `equal` member functions
.. _dereference_and_equal: iterator_facade.html#implementing-the-core-operations
@ -287,8 +286,8 @@ this technique is known not to work with Borland C++ 5.6.4 and
Metrowerks CodeWarrior versions prior to 9.0]
You can see an example program that exercises this version of the
node iterators
[@../example/node_iterator3.cpp `here`].
node iterators
[example_link node_iterator3.cpp..here].
In the case of `node_iter`, it's not very compelling to pass
@ -306,7 +305,7 @@ types to its `Base` saves the implementor of
std::iterator_traits<Iterator>::*some-associated-type*
at least four times.
at least four times.
We urge you to review the documentation and implementations of
|reverse_iterator|_ and the other Boost `specialized iterator
@ -330,4 +329,4 @@ __ index.html#specialized-adaptors
[endsect]
[endsect]
[endsect]

View File

@ -0,0 +1,149 @@
[section:algorithms Algorithms]
[section:advance Function template `advance()`]
The `boost::iterators::advance` function template is an adapted version of `std::advance` for the Boost iterator [link iterator.concepts.traversal traversal concepts].
[heading Header]
<boost/iterator/advance.hpp>
[heading Synopsis]
template <typename Iterator, typename Distance>
constexpr void advance(Iterator& it, Distance n);
[heading Description]
Moves `it` forward by `n` increments (or backward by `|n|` decrements if `n` is negative).
[heading Requirements]
`Iterator` should model Incrementable Iterator.
[heading Preconditions]
Let `it`[sub `i`] be the iterator obtained by incrementing (or decrementing if `n` is negative) `it` by `i`. All the iterators `it`[sub `i`] for `i` = 0, 1, 2, ..., `|n|` should be valid.
If `Iterator` does not model [link iterator.concepts.traversal.bidirectional Bidirectional Traversal Iterator], `n` should be non-negative.
[heading Complexity]
If `Iterator` models [link iterator.concepts.traversal.random_access Random Access Traversal Iterator], it takes constant time; otherwise it takes linear time.
[heading Notes]
* This function is not a customization point and is protected against being found by argument-dependent lookup (ADL).
* This function is `constexpr` only in C++14 or later.
[heading Acknowledgements]
Contributed by Michel Morin.
[endsect]
[section:distance Function template `distance()`]
The `boost::iterators::distance` function template is an adapted version of `std::distance` for the Boost iterator [link iterator.concepts.traversal traversal concepts].
[heading Header]
<boost/iterator/distance.hpp>
[heading Synopsis]
template <typename Iterator>
constexpr typename iterator_difference<Iterator>::type
distance(Iterator first, Iterator last);
[heading Description]
Computes the (signed) distance from `first` to `last`.
[heading Requirements]
`Iterator` should model [link iterator.concepts.traversal.single_pass Single Pass Iterator].
[heading Preconditions]
If `Iterator` models [link iterator.concepts.traversal.random_access Random Access Traversal Iterator], `[first, last)` or `[last, first)` should be valid; otherwise `[first, last)` should be valid.
[heading Complexity]
If `Iterator` models [link iterator.concepts.traversal.random_access Random Access Traversal Iterator], it takes constant time; otherwise it takes linear time.
[heading Notes]
* This function is not a customization point and is protected against being found by argument-dependent lookup (ADL).
* This function is `constexpr` only in C++14 or later.
[heading Acknowledgements]
Contributed by Michel Morin.
[endsect]
[section:next_prior Function templates `next()` and `prior()`]
Certain data types, such as the C++ Standard Library's forward and bidirectional iterators, do not provide addition and subtraction via `operator+()` or `operator-()`. This means that non-modifying computation of the next or prior value requires a temporary, even though `operator++()` or `operator--()` is provided. It also means that writing code like `itr+1` inside a template restricts the iterator category to random access iterators.
The `next()` and `prior()` functions defined in `boost/next_prior.hpp` provide a simple way around these problems.
[heading Synopsis]
template <class T>
T next(T x)
{
return ++x;
}
template <class T, class Distance>
T next(T x, Distance n)
{
std::advance(x, n);
return x;
}
template <class T>
T prior(T x)
{
return --x;
}
template <class T, class Distance>
T prior(T x, Distance n)
{
std::advance(x, -n);
return x;
}
[note Function implementations above are given for exposition only. The actual implementation has the same effect for iterators, but has different properties, as documented later.]
[heading Usage]
Usage is simple:
const std::list<T>::iterator p = get_some_iterator();
const std::list<T>::iterator prev = boost::prior(p);
const std::list<T>::iterator next = boost::next(prev, 2);
The distance from the given iterator should be supplied as an absolute value. For example, the iterator four iterators prior to the given iterator `p` may be obtained by `prior(p, 4)`.
With C++11, the Standard Library provides `std::next()` and `std::prev()` function templates, which serve the same purpose. However, there are advantages to `boost::next()` and `boost::prior()`.
First, `boost::next()` and `boost::prior()` are compatible not only with iterators but with any type that provides arithmetic operators `operator++()`, `operator--()`, `operator+()`, `operator-()`, `operator+=()` or `operator-=()`. For example, this is possible:
int x = 10;
int y = boost::next(x, 5);
assert(y == 15);
Second, `boost::next()` and `boost::prior()` use [link iterator.concepts.traversal traversal categories] to select the most efficient implementation. For some kinds of iterators, such as [link iterator.specialized.transform transform iterators], the standard iterator category does not reflect the traversal category correctly and therefore `std::next()` and `std::prev()` will fall back to linear complexity.
[heading Acknowledgements]
Contributed by [@http://www.boost.org/people/dave_abrahams.htm Dave Abrahams]. Two-argument versions by Daniel Walker.
[endsect]
[endsect]

View File

@ -1,4 +1,3 @@
[section:archetypes Iterator Archetypes]
The `iterator_archetype` class constructs a minimal implementation of
@ -41,23 +40,23 @@ The access category types provided correspond to the following
standard iterator access concept combinations:
readable_iterator_t :=
Readable Iterator
writable_iterator_t :=
Writeable Iterator
readable_writable_iterator_t :=
Readable Iterator & Writeable Iterator & Swappable Iterator
readable_lvalue_iterator_t :=
Readable Iterator & Lvalue Iterator
writeable_lvalue_iterator_t :=
Readable Iterator & Writeable Iterator & Swappable Iterator & Lvalue Iterator
[h3 Traits]
@ -66,25 +65,25 @@ The nested trait types are defined as follows:
if (AccessCategory == readable_iterator_t)
value_type = Value
reference = Value
pointer = Value*
else if (AccessCategory == writable_iterator_t)
value_type = void
reference = void
pointer = void
else if (AccessCategory == readable_writable_iterator_t)
value_type = Value
reference :=
A type X that is convertible to Value for which the following
expression is valid. Given an object x of type X and v of type
expression is valid. Given an object x of type X and v of type
Value.
x = v
@ -92,13 +91,13 @@ The nested trait types are defined as follows:
pointer = Value*
else if (AccessCategory == readable_lvalue_iterator_t)
value_type = Value
reference = Value const&
pointer = Value const*
else if (AccessCategory == writable_lvalue_iterator_t)
value_type = Value
reference = Value&
pointer = Value*
@ -108,11 +107,11 @@ The nested trait types are defined as follows:
difference_type := ptrdiff_t
else
difference_type := unspecified type
iterator_category :=
iterator_category :=
A type X satisfying the following two constraints:
@ -156,5 +155,4 @@ the iterator concept specified by `AccessCategory` and
arguments. `iterator_archetype` does not model any other access
concepts or any more derived traversal concepts.
[endsect]
[endsect]

View File

@ -4,7 +4,7 @@ The iterator concept checking classes provide a mechanism for a
template to report better error messages when a user instantiates the
template with a type that does not meet the requirements of the
template. For an introduction to using concept checking classes, see
the documentation for the boost::concept_check library.
the documentation for the _concept_check_ library.
[h2 `iterator_concepts.hpp` Synopsis]
@ -51,4 +51,4 @@ the documentation for the boost::concept_check library.
}
[endsect]
[endsect]

View File

@ -1,9 +1,8 @@
[section:concepts Iterator Concepts]
[section:concepts_access Access]
[section:access Access]
[h2 Readable Iterator Concept]
[section:readable Readable Iterator Concept]
A class or built-in type `X` models the *Readable Iterator* concept
for value type `T` if, in addition to `X` being Assignable and
@ -32,17 +31,18 @@ type `T`.
[`U&`]
[pre: `(*a).m` is well-defined. Equivalent to `(*a).m`.]
]
]
[h2 Writable Iterator Concept ]
]
[endsect]
[section:writable Writable Iterator Concept]
A class or built-in type `X` models the *Writable Iterator* concept
if, in addition to `X` being Copy Constructible, the following
expressions are valid and respect the stated semantics. Writable
Iterators have an associated *set of value types*.
[table Writable Iterator Requirements (in addition to Copy Constructible)
[table Writable Iterator Requirements (in addition to Copy Constructible)
[
[Expression]
[Return Type]
@ -55,13 +55,15 @@ Iterators have an associated *set of value types*.
]
]
[h2 Swappable Iterator Concept]
[endsect]
[section:swappable Swappable Iterator Concept]
A class or built-in type `X` models the *Swappable Iterator* concept
if, in addition to `X` being Copy Constructible, the following
expressions are valid and respect the stated semantics.
[table Swappable Iterator Requirements (in addition to Copy Constructible)
[table Swappable Iterator Requirements (in addition to Copy Constructible)
[
[Expression]
[Return Type]
@ -77,7 +79,9 @@ expressions are valid and respect the stated semantics.
[blurb *Note:* An iterator that is a model of the *Readable* and *Writable Iterator* concepts
is also a model of *Swappable Iterator*. *--end note*]
[h2 Lvalue Iterator Concept]
[endsect]
[section:lvalue Lvalue Iterator Concept]
The *Lvalue Iterator* concept adds the requirement that the return
type of `operator*` type be a reference to the value type of the
@ -101,17 +105,17 @@ iterator.
[endsect]
[section:concepts_traversal Traversal]
[endsect]
[h2 Incrementable Iterator Concept]
[section:traversal Traversal]
[section:incrementable Incrementable Iterator Concept]
A class or built-in type `X` models the *Incrementable Iterator*
concept if, in addition to `X` being Assignable and Copy
Constructible, the following expressions are valid and respect the
stated semantics.
[table Incrementable Iterator Requirements (in addition to Assignable, Copy Constructible)
[
[Expression ]
@ -129,7 +133,7 @@ stated semantics.
[``
{
X tmp = r;
++r;
++r;
return tmp;
}
``]
@ -141,7 +145,9 @@ stated semantics.
]
]
[h2 Single Pass Iterator Concept]
[endsect]
[section:single_pass Single Pass Iterator Concept]
A class or built-in type `X` models the *Single Pass Iterator*
concept if the following expressions are valid and respect the stated
@ -156,7 +162,7 @@ semantics.
[
[`++r`]
[`X&`]
[pre:\n`r` is dereferenceable;\npost:\n`r` is dereferenceable or\n`r` is past-the-end]
[pre:[br]`r` is dereferenceable;[br]post:[br]`r` is dereferenceable or[br]`r` is past-the-end]
]
[
[`a == b`]
@ -168,6 +174,11 @@ semantics.
[convertible to `bool`]
[`!(a == b)`]
]
[
[`iterator_traits<X>::difference_type`]
[A signed integral type representing the distance between iterators]
[]
]
[
[`iterator_traversal<X>::type`]
[Convertible to`single_pass_traversal_tag`]
@ -175,8 +186,9 @@ semantics.
]
]
[endsect]
[h2 Forward Traversal Concept]
[section:forward Forward Traversal Concept]
A class or built-in type `X` models the *Forward Traversal*
concept if, in addition to `X` meeting the requirements of Default
@ -199,11 +211,6 @@ valid and respect the stated semantics.
[`X&`]
[`r == s` and `r` is dereferenceable implies `++r == ++s.`]
]
[
[`iterator_traits<X>::difference_type`]
[A signed integral type representing the distance between iterators]
[]
]
[
[`iterator_traversal<X>::type`]
[Convertible to `forward_traversal_tag`]
@ -211,7 +218,9 @@ valid and respect the stated semantics.
]
]
[h2 Bidirectional Traversal Concept]
[endsect]
[section:bidirectional Bidirectional Traversal Concept]
A class or built-in type `X` models the *Bidirectional Traversal*
concept if, in addition to `X` meeting the requirements of Forward
@ -223,11 +232,11 @@ the stated semantics.
[Expression]
[Return Type]
[Assertion/Semantics/Pre-/Post-condition]
]
]
[
[`--r`]
[`X&`]
[pre: there exists `s` such that `r == ++s`.\n post: `s` is dereferenceable. `--(++r) == r`. `--r == --s` implies `r == s`. `&r == &--r`.]
[pre: there exists `s` such that `r == ++s`.[br] post: `s` is dereferenceable. `--(++r) == r`. `--r == --s` implies `r == s`. `&r == &--r`.]
]
[
[`r--`]
@ -247,7 +256,9 @@ the stated semantics.
]
]
[h2 Random Access Traversal Concept]
[endsect]
[section:random_access Random Access Traversal Concept]
A class or built-in type `X` models the *Random Access Traversal*
concept if the following expressions are valid and respect the stated
@ -255,8 +266,8 @@ semantics. In the table below, `Distance` is
`iterator_traits<X>::difference_type` and `n` represents a
constant object of type `Distance`.
[table Random Access Traversal Iterator Requirements (in addition to Bidirectional Traversal)
[
[table Random Access Traversal Iterator Requirements (in addition to Bidirectional Traversal)
[
[Expression]
[Return Type]
[Operational Semantics]
@ -266,10 +277,10 @@ constant object of type `Distance`.
[`r += n`]
[ `X&`]
[``
{
{
Distance m = n;
if (m >= 0)
while (m--)
while (m--)
++r;
else
while (m++)
@ -279,18 +290,18 @@ constant object of type `Distance`.
``]
[ ]
]
[
[
[`a + n`, `n + a`]
[`X`]
[``
{
{
X tmp = a;
return tmp+= n;
}
``]
[]
]
[
[
[`r -= n`]
[`X&`]
[`return r += -n`]
@ -300,9 +311,9 @@ constant object of type `Distance`.
[`a - n`]
[`X`]
[``
{
{
X tmp = a;
return tmp-= n;
return tmp-= n;
}
``]
[]
@ -314,13 +325,13 @@ constant object of type `Distance`.
[pre: there exists a value `n` of `Distance` such that `a + n == b`. `b == a + (b - a)`.]
]
[
[`a\[n\]`]
[`a[n]`]
[convertible to T]
[`*(a + n)`]
[pre: a is a *Readable Iterator*]
]
[
[`a\[n\] = v`]
[`a[n] = v`]
[convertible to T]
[`*(a + n) = v`]
[pre: a is a *Writable iterator*]
@ -359,4 +370,6 @@ constant object of type `Distance`.
[endsect]
[endsect]
[endsect]
[endsect]

View File

@ -1,4 +1,3 @@
[section:counting Counting Iterator]
A `counting_iterator` adapts an object by adding an `operator*` that
@ -18,28 +17,30 @@ into the first array via indirection through the second array.
std::vector<int> numbers;
typedef std::vector<int>::iterator n_iter;
std::copy(boost::counting_iterator<int>(0),
boost::counting_iterator<int>(N),
std::back_inserter(numbers));
boost::counting_iterator<int>(N),
std::back_inserter(numbers));
std::vector<std::vector<int>::iterator> pointers;
std::copy(boost::make_counting_iterator(numbers.begin()),
boost::make_counting_iterator(numbers.end()),
std::back_inserter(pointers));
boost::make_counting_iterator(numbers.end()),
std::back_inserter(pointers));
std::cout << "indirectly printing out the numbers from 0 to "
<< N << std::endl;
std::cout << "indirectly printing out the numbers from 0 to "
<< N << std::endl;
std::copy(boost::make_indirect_iterator(pointers.begin()),
boost::make_indirect_iterator(pointers.end()),
std::ostream_iterator<int>(std::cout, " "));
boost::make_indirect_iterator(pointers.end()),
std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
The output is:
indirectly printing out the numbers from 0 to 7
0 1 2 3 4 5 6
[pre
indirectly printing out the numbers from 0 to 7
0 1 2 3 4 5 6
]
The source code for this example can be found [@../example/counting_iterator_example.cpp here].
The source code for this example can be found [example_link counting_iterator_example.cpp..here].
[h2 Reference]
@ -86,9 +87,9 @@ algorithm:
random_access_traversal_tag, Incrementable, const Incrementable&)
else
return |iterator-category|_\ (
iterator_traversal<Incrementable>::type,
iterator_traversal<Incrementable>::type,
Incrementable, const Incrementable&)
[blurb *Note:* implementers are encouraged to provide an implementation of
`operator-` and a `difference_type` that avoids overflows in
the cases where `std::numeric_limits<Incrementable>::is_specialized`
@ -152,7 +153,7 @@ operations.
counting_iterator();
[*Requires: ] `Incrementable` is Default Constructible.\n
[*Requires: ] `Incrementable` is Default Constructible.[br]
[*Effects: ] Default construct the member `m_inc`.
@ -174,14 +175,14 @@ operations.
counting_iterator& operator++();
[*Effects: ] `++m_inc`\n
[*Effects: ] `++m_inc`[br]
[*Returns: ] `*this`
counting_iterator& operator--();
[*Effects: ] `--m_inc`\n
[*Returns: ] `*this`
[*Effects: ] `--m_inc`[br]
[*Returns: ] `*this`
Incrementable const& base() const;
@ -189,4 +190,4 @@ operations.
[*Returns: ] `m_inc`
[endsect]
[endsect]

View File

@ -1,4 +1,3 @@
[section:facade Iterator Facade]
While the iterator interface is rich, there is a core subset of the
@ -68,6 +67,7 @@ requirements.
[
[`i.dereference()`]
[Access the value referred to]
]
[
[`i.equal(j)`]
[Compare for equality with `j`]
@ -83,6 +83,7 @@ requirements.
[
[`i.advance(n)`]
[Advance by `n` positions]
]
[
[`i.distance_to(j)`]
[Measure the distance to `j`]
@ -139,7 +140,7 @@ standardize the gateway protocol. Note that even if
open a safety loophole, as every core member function preserves the
invariants of the iterator.
[h2 `operator\[\]`]
[h2 `operator[]`]
The indexing operator for a generalized iterator presents special
challenges. A random access iterator's `operator[]` is only
@ -287,7 +288,7 @@ The `iterator_category` member of `iterator_facade` is
.. parsed-literal::
*iterator-category*\ (CategoryOrTraversal, value_type, reference)
*iterator-category*\ (CategoryOrTraversal, reference, value_type)
where *iterator-category* is defined as follows:
@ -295,10 +296,10 @@ where *iterator-category* is defined as follows:
The `enable_if_interoperable` template used above is for exposition
purposes. The member operators should only be in an overload set
provided the derived types `Dr1` and `Dr2` are interoperable,
provided the derived types `Dr1` and `Dr2` are interoperable,
meaning that at least one of the types is convertible to the other. The
`enable_if_interoperable` approach uses SFINAE to take the operators
out of the overload set when the types are not interoperable.
out of the overload set when the types are not interoperable.
The operators should behave *as-if* `enable_if_interoperable`
were defined to be:
@ -398,7 +399,7 @@ through member functions of class `iterator_core_access`.
__ `operator arrow`_
[*Returns:] If `reference` is a reference type, an object of type `pointer` equal to: `&static_cast<Derived const*>(this)->dereference()`
Otherwise returns an object of unspecified type such that,
Otherwise returns an object of unspecified type such that,
`(*static_cast<Derived const*>(this))->m` is equivalent to `(w = **static_cast<Derived const*>(this),
w.m)` for some temporary object `w` of type `value_type`.
@ -415,7 +416,7 @@ w.m)` for some temporary object `w` of type `value_type`.
Derived& operator++();
[*Effects:]
[*Effects:]
static_cast<Derived*>(this)->increment();
return *static_cast<Derived*>(this);
@ -455,7 +456,7 @@ w.m)` for some temporary object `w` of type `value_type`.
Derived& operator-=(difference_type n);
[*Effects:]
static_cast<Derived*>(this)->advance(-n);
return *static_cast<Derived*>(this);
@ -487,14 +488,16 @@ w.m)` for some temporary object `w` of type `value_type`.
iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
[*Returns:]
[pre
if `is_convertible<Dr2,Dr1>::value`
then
then
`((Dr1 const&)lhs).equal((Dr2 const&)rhs)`.
Otherwise,
Otherwise,
`((Dr2 const&)rhs).equal((Dr1 const&)lhs)`.
]
template <class Dr1, class V1, class TC1, class R1, class D1,
@ -504,14 +507,16 @@ w.m)` for some temporary object `w` of type `value_type`.
iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
[*Returns:]
[pre
if `is_convertible<Dr2,Dr1>::value`
then
then
`!((Dr1 const&)lhs).equal((Dr2 const&)rhs)`.
Otherwise,
Otherwise,
`!((Dr2 const&)rhs).equal((Dr1 const&)lhs)`.
]
template <class Dr1, class V1, class TC1, class R1, class D1,
@ -521,14 +526,16 @@ w.m)` for some temporary object `w` of type `value_type`.
iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
[*Returns:]
[pre
if `is_convertible<Dr2,Dr1>::value`
then
then
`((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) < 0`.
Otherwise,
Otherwise,
`((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) > 0`.
]
template <class Dr1, class V1, class TC1, class R1, class D1,
@ -538,14 +545,16 @@ w.m)` for some temporary object `w` of type `value_type`.
iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
[*Returns:]
[pre
if `is_convertible<Dr2,Dr1>::value`
then
then
`((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) <= 0`.
Otherwise,
Otherwise,
`((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) >= 0`.
]
template <class Dr1, class V1, class TC1, class R1, class D1,
@ -555,14 +564,16 @@ w.m)` for some temporary object `w` of type `value_type`.
iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
[*Returns:]
[pre
if `is_convertible<Dr2,Dr1>::value`
then
then
`((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) > 0`.
Otherwise,
Otherwise,
`((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) < 0`.
]
template <class Dr1, class V1, class TC1, class R1, class D1,
@ -572,14 +583,16 @@ w.m)` for some temporary object `w` of type `value_type`.
iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
[*Returns:]
[pre
if `is_convertible<Dr2,Dr1>::value`
then
then
`((Dr1 const&)lhs).distance_to((Dr2 const&)rhs) >= 0`.
Otherwise,
Otherwise,
`((Dr2 const&)rhs).distance_to((Dr1 const&)lhs) <= 0`.
]
.. _minus:
@ -591,29 +604,33 @@ w.m)` for some temporary object `w` of type `value_type`.
iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
[*Return Type:]
[pre
if `is_convertible<Dr2,Dr1>::value`
then
then
`difference` shall be
`iterator_traits<Dr1>::difference_type`.
Otherwise
Otherwise
`difference` shall be `iterator_traits<Dr2>::difference_type`
]
[*Returns:]
[pre
if `is_convertible<Dr2,Dr1>::value`
then
then
`-((Dr1 const&)lhs).distance_to((Dr2 const&)rhs)`.
Otherwise,
Otherwise,
`((Dr2 const&)rhs).distance_to((Dr1 const&)lhs)`.
]
[endsect]
[include facade_tutorial.qbk]
[endsect]
[endsect]

View File

@ -1,12 +1,11 @@
[section:facade_tutorial Tutorial]
In this section we'll walk through the implementation of a few
iterators using `iterator_facade`, based around the simple
example of a linked list of polymorphic objects. This example was
inspired by a
inspired by a
[@http://thread.gmane.org/gmane.comp.lib.boost.user/5100 `posting`]
by Keith Macdonald on the
by Keith Macdonald on the
[@http://www.boost.org/more/mailing_lists.htm#users `Boost-Users`]
mailing list.
@ -30,16 +29,16 @@ Say we've written a polymorphic linked list node base class:
// print to the stream
virtual void print(std::ostream& s) const = 0;
// double the value
virtual void double_me() = 0;
void append(node_base* p)
{
if (m_next)
m_next->append(p);
if (m_next)
m_next->append(p);
else
m_next = p;
m_next = p;
}
private:
@ -210,7 +209,7 @@ the concepts we want our iterator to model. Referring to the
table__, we can see that the first three rows are applicable
because `node_iterator` needs to satisfy the requirements for
`readable iterator`_, `single pass iterator`_, and `incrementable
iterator`_.
iterator`_.
__ `core operations`_
@ -254,24 +253,24 @@ make them private and grant friendship to
};
Voila; a complete and conforming readable, forward-traversal
iterator! For a working example of its use, see
[@../example/node_iterator1.cpp `this program`].
iterator! For a working example of its use, see
[example_link node_iterator1.cpp..this program].
__ ../example/node_iterator1.cpp
__ ../../example/node_iterator1.cpp
[h2 A constant `node_iterator`]
[blurb *Constant and Mutable iterators*\n\n
[blurb *Constant and Mutable iterators*[br][br]
The term **mutable iterator** means an iterator through which
the object it references (its "referent") can be modified. A
**constant iterator** is one which doesn't allow modification of
its referent.\n\n
its referent.[br][br]
The words *constant* and *mutable* don't refer to the ability to
modify the iterator itself. For example, an `int const*` is a
non-\ `const` *constant iterator*, which can be incremented
but doesn't allow modification of its referent, and `int*
const` is a `const` *mutable iterator*, which cannot be
modified but which allows modification of its referent.\n\n
modified but which allows modification of its referent.[br][br]
Confusing? We agree, but those are the standard terms. It
probably doesn't help much that a container's constant iterator
is called `const_iterator`.
@ -285,7 +284,7 @@ changes:
class const_node_iterator
: public boost::iterator_facade<
node_iterator
const_node_iterator
, node_base **const**
, boost::forward_traversal_tag
>
@ -312,7 +311,7 @@ changes:
node_base **const**\ * m_node;
};
[blurb `const` and an iterator's `value_type`\n\n
[blurb `const` and an iterator's `value_type`[br][br]
The C++ standard requires an iterator's `value_type` *not* be
`const`\ -qualified, so `iterator_facade` strips the
`const` from its `Value` parameter in order to produce the
@ -402,7 +401,7 @@ adding a templatized converting constructor [#broken]_ [#random]_:
template <class OtherValue>
bool equal(node_iter<OtherValue> const& other) const
{
{
return this->m_node == other.m_node;
}
@ -428,11 +427,11 @@ adding a templatized converting constructor [#broken]_ [#random]_:
`distance_to` function as well.
__ ../example/node_iterator2.hpp
__ ../../example/node_iterator2.hpp
You can see an example program which exercises our interoperable
iterators
[@../example/node_iterator2.cpp `here`].
iterators
[example_link node_iterator2.cpp..here].
[h2 Telling the Truth]
@ -467,7 +466,7 @@ appropriate:
...
private:
private:
struct enabler {};
public:

View File

@ -1,4 +1,3 @@
[section:filter Filter Iterator]
The filter iterator adaptor creates a view of an iterator range in
@ -19,7 +18,6 @@ This example uses `filter_iterator` and then
array of integers. Then `make_filter_iterator` is is used to output
the integers greater than `-2`.
struct is_positive_number {
bool operator()(int x) { return 0 < x; }
};
@ -33,7 +31,7 @@ the integers greater than `-2`.
base_iterator numbers(numbers_);
// Example using filter_iterator
typedef boost::filter_iterator<is_positive_number, base_iterator>
typedef boost::filter_iterator<is_positive_number, base_iterator>
FilterIter;
is_positive_number predicate;
@ -52,11 +50,11 @@ the integers greater than `-2`.
// Another example using make_filter_iterator()
std::copy(
boost::make_filter_iterator(
std::bind2nd(std::greater<int>(), -2)
std::bind(std::greater<int>(), std::placeholders::_1, -2)
, numbers, numbers + N)
, boost::make_filter_iterator(
std::bind2nd(std::greater<int>(), -2)
std::bind(std::greater<int>(), std::placeholders::_1, -2)
, numbers + N, numbers + N)
, std::ostream_iterator<int>(std::cout, " ")
@ -70,12 +68,13 @@ the integers greater than `-2`.
The output is:
4 5 8
4 5 8
0 -1 4 5 8
[pre
4 5 8
4 5 8
0 -1 4 5 8
]
The source code for this example can be found [@../example/filter_iterator_example.cpp here].
The source code for this example can be found [example_link filter_iterator_example.cpp..here].
[h2 Reference]
@ -114,10 +113,10 @@ The source code for this example can be found [@../example/filter_iterator_examp
If `Iterator` models Readable Lvalue Iterator and Bidirectional Traversal
Iterator then `iterator_category` is convertible to
`std::bidirectional_iterator_tag`.
`std::bidirectional_iterator_tag`.
Otherwise, if `Iterator` models Readable Lvalue Iterator and Forward Traversal
Iterator then `iterator_category` is convertible to
`std::forward_iterator_tag`.
`std::forward_iterator_tag`.
Otherwise `iterator_category` is
convertible to `std::input_iterator_tag`.
@ -164,7 +163,7 @@ following tables.
[[Writable Lvalue Iterator, Bidirectional Iterator ][Mutable Bidirectional Iterator]]
]
`filter_iterator<P1, X>` is interoperable with `filter_iterator<P2, Y>`
`filter_iterator<P1, X>` is interoperable with `filter_iterator<P2, Y>`
if and only if `X` is interoperable with `Y`.
@ -178,15 +177,15 @@ operations.
filter_iterator();
[*Requires: ]`Predicate` and `Iterator` must be Default Constructible.\n
[*Effects: ] Constructs a `filter_iterator` whose`m_pred`, `m_iter`, and `m_end`
[*Requires: ]`Predicate` and `Iterator` must be Default Constructible.[br]
[*Effects: ] Constructs a `filter_iterator` whose`m_pred`, `m_iter`, and `m_end`
members are a default constructed.
filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());
[*Effects: ] Constructs a `filter_iterator` where `m_iter` is either
the first position in the range `[x,end)` such that `f(*m_iter) == true`
the first position in the range `[x,end)` such that `f(*m_iter) == true`
or else`m_iter == end`. The member `m_pred` is constructed from
`f` and `m_end` from `end`.
@ -195,9 +194,9 @@ operations.
filter_iterator(Iterator x, Iterator end = Iterator());
[*Requires: ] `Predicate` must be Default Constructible and
`Predicate` is a class type (not a function pointer).\n
`Predicate` is a class type (not a function pointer).[br]
[*Effects: ] Constructs a `filter_iterator` where `m_iter` is either
the first position in the range `[x,end)` such that `m_pred(*m_iter) == true`
the first position in the range `[x,end)` such that `m_pred(*m_iter) == true`
or else`m_iter == end`. The member `m_pred` is default constructed.
@ -205,9 +204,9 @@ operations.
filter_iterator(
filter_iterator<Predicate, OtherIterator> const& t
, typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
);`
);
[*Requires: ] `OtherIterator` is implicitly convertible to `Iterator`.\n
[*Requires: ] `OtherIterator` is implicitly convertible to `Iterator`.[br]
[*Effects: ] Constructs a filter iterator whose members are copied from `t`.
@ -235,8 +234,7 @@ operations.
[*Effects: ] Increments `m_iter` and then continues to
increment `m_iter` until either `m_iter == m_end`
or `m_pred(*m_iter) == true`.\n
[*Returns: ] `*this`
or `m_pred(*m_iter) == true`.[br]
[*Returns: ] `*this`
[endsect]
[endsect]

View File

@ -1,4 +1,3 @@
[section:function_output Function Output Iterator]
The function output iterator adaptor makes it easier to create custom
@ -34,8 +33,8 @@ proxy object.
x.push_back("!");
std::string s = "";
std::copy(x.begin(), x.end(),
boost::make_function_output_iterator(string_appender(s)));
std::copy(x.begin(), x.end(),
boost::make_function_output_iterator(string_appender(s)));
std::cout << s << std::endl;
@ -68,7 +67,7 @@ proxy object.
[h3 Requirements]
`UnaryFunction` must be Assignable and Copy Constructible.
`UnaryFunction` must be Assignable and Copy Constructible.
[h3 Concepts]
@ -79,14 +78,14 @@ Incrementable Iterator concepts.
explicit function_output_iterator(const UnaryFunction& f = UnaryFunction());
[*Effects: ] Constructs an instance of `function_output_iterator`
[*Effects: ] Constructs an instance of `function_output_iterator`
with `m_f` constructed from `f`.
unspecified_type operator*();
[*Returns: ] An object `r` of unspecified type such that `r = t`
is equivalent to `m_f(t)` for all `t`.
function_output_iterator& operator++();
@ -97,4 +96,4 @@ Incrementable Iterator concepts.
[*Returns: ] `*this`.
[endsect]
[endsect]

View File

@ -1,4 +1,3 @@
[section:indirect Indirect Iterator]
`indirect_iterator` adapts an iterator by applying an
@ -50,30 +49,31 @@ using the `make_indirect_iterator` helper function.
const_indirect_last(pointers_to_chars + N);
std::transform(const_indirect_first, const_indirect_last,
mutable_indirect_first, std::bind1st(std::plus<char>(), 1));
mutable_indirect_first, std::bind(std::plus<char>(), 1, std::placeholders::_1));
std::copy(mutable_indirect_first, mutable_indirect_last,
std::ostream_iterator<char>(std::cout, ","));
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::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;
The output is:
a,b,c,d,e,f,g,
b,c,d,e,f,g,h,
a,b,c,d,e,f,g,
[pre
a,b,c,d,e,f,g,
b,c,d,e,f,g,h,
a,b,c,d,e,f,g,
]
The source code for this example can be found
[@../example/indirect_iterator_example.cpp here].
The source code for this example can be found
[example_link indirect_iterator_example.cpp..here].
[h2 Reference]
@ -137,9 +137,9 @@ the following pseudo-code, where `V` is
else
typedef Reference reference;
if (Value is use_default) then
if (Value is use_default) then
typedef pointee<V>::type\* pointer;
else
else
typedef Value\* pointer;
if (Difference is use_default)
@ -203,8 +203,8 @@ following operations:
indirect_iterator();
[*Requires: ] `Iterator` must be Default Constructible.\n
[*Effects: ] Constructs an instance of `indirect_iterator` with
[*Requires: ] `Iterator` must be Default Constructible.[br]
[*Effects: ] Constructs an instance of `indirect_iterator` with
a default-constructed `m_iterator`.
@ -225,8 +225,8 @@ following operations:
, typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
);
[*Requires: ] `Iterator2` is implicitly convertible to `Iterator`.\n
[*Effects: ] Constructs an instance of `indirect_iterator` whose
[*Requires: ] `Iterator2` is implicitly convertible to `Iterator`.[br]
[*Effects: ] Constructs an instance of `indirect_iterator` whose
`m_iterator` subobject is constructed from `y.base()`.
@ -242,13 +242,13 @@ following operations:
indirect_iterator& operator++();
[*Effects: ] `++m_iterator`\n
[*Effects: ] `++m_iterator`[br]
[*Returns: ] `*this`
indirect_iterator& operator--();
[*Effects: ] `--m_iterator`\n
[*Effects: ] `--m_iterator`[br]
[*Returns: ] `*this`
[endsect]
[endsect]

View File

@ -1,6 +1,6 @@
[library Boost.Iterator
[/ version 1.0.1]
[quickbook 1.6]
[authors [Abrahams, David], [Siek, Jeremy], [Witt, Thomas]]
[copyright 2003 2005 David Abrahams Jeremy Siek Thomas Witt]
[category iterator]
@ -28,7 +28,11 @@
[/ Links ]
[def _iterator_ [@../../libs/iterator/doc/index.html Boost.Iterator]]
[def _iterator_ [@../../../iterator/doc/index.html Boost.Iterator]]
[def _concept_check_ [@../../../concept_check/index.html Boost.ConceptCheck]]
[template example_link[name descr]'''<ulink url="../../example/'''[name]'''">'''[descr]'''</ulink>''']
[template sub[x]'''<subscript>'''[x]'''</subscript>''']
[section:intro Introduction]
@ -70,19 +74,23 @@ and a _GOTW_50_. New-style iterators go well beyond
patching up `vector<bool>`, though: there are lots of other
iterators already in use which can't be adequately represented by
the existing concepts. For details about the new iterator
concepts, see our [@./new-iter-concepts.html Standard Proposal for New-Style Iterators].
concepts, see our [@../new-iter-concepts.html Standard Proposal for New-Style Iterators].
[h2 Iterator Facade and Adaptor]
[def _facade_ [@./iterator_facade.html facade]]
[def _adaptor_ [@./iterator_adaptor.html adaptor]]
[/
[def _facade_ [link iterator.generic.facade facade]]
[def _adaptor_ [link iterator.generic.adaptor adaptor]]
]
[def _facade_ [@../iterator_facade.html facade]]
[def _adaptor_ [@../iterator_adaptor.html adaptor]]
Writing standard-conforming iterators is tricky, but the need comes
up often. In order to ease the implementation of new iterators,
the Boost.Iterator library provides the _facade_ class template,
which implements many useful defaults and compile-time checks
designed to help the iterator author ensure that his iterator is
correct.
correct.
It is also common to define a new iterator that is similar to some
underlying iterator or iterator-like type, but that modifies some
@ -91,26 +99,28 @@ library supplies the _adaptor_ class template, which is specially
designed to take advantage of as much of the underlying type's
behavior as possible.
Both _facade_ and _adaptor_ as well as many of the `specialized
adaptors`_ mentioned below have been proposed for standardization
([@./facade-and-adaptor.html Standard Proposal For Iterator Facade and Adaptor]).
Both _facade_ and _adaptor_ as well as many of the [link iterator.specialized specialized
adaptors] mentioned below have been proposed for standardization
([@../facade-and-adaptor.html Standard Proposal For Iterator Facade and Adaptor]).
[h2 Specialized Adaptors]
The iterator library supplies a useful suite of standard-conforming
iterator templates based on the Boost [link
intro.iterator_facade_and_adaptor iterator facade and adaptor]
iterator.intro.iterator_facade_and_adaptor iterator facade and adaptor]
templates.
[def _counting_ [@./counting_iterator.html `counting_iterator`]]
[def _filter_ [@./filter_iterator.html `filter_iterator`]]
[def _function_ [@./function_output_iterator.html `function_output_iterator`]]
[def _indirect_ [@./indirect_iterator.html `indirect_iterator`]]
[def _permutation_ [@./permutation_iterator.html `permutation_iterator`]]
[def _reverse_ [@./reverse_iterator.html `reverse_iterator`]]
[def _shared_ [@./shared_container_iterator.html `shared_container_iterator`]]
[def _transform_ [@./transform_iterator.html `transform_iterator`]]
[def _zip_ [@./zip_iterator.html `zip_iterator`]]
[def _counting_ [link iterator.specialized.counting `counting_iterator`]]
[def _filter_ [link iterator.specialized.filter `filter_iterator`]]
[def _function_input_ [@../function_input_iterator.html `function_input_iterator`]]
[def _function_output_ [link iterator.specialized.function_output `function_output_iterator`]]
[def _generator_ [@../generator_iterator.htm `generator_iterator`]]
[def _indirect_ [link iterator.specialized.indirect `indirect_iterator`]]
[def _permutation_ [link iterator.specialized.permutation `permutation_iterator`]]
[def _reverse_ [link iterator.specialized.reverse `reverse_iterator`]]
[def _shared_ [link iterator.specialized.shared_container `shared_container_iterator`]]
[def _transform_ [link iterator.specialized.transform `transform_iterator`]]
[def _zip_ [link iterator.specialized.zip `zip_iterator`]]
[def _shared_ptr_ [@../../smart_ptr/shared_ptr.htm `shared_ptr`]]
@ -120,10 +130,18 @@ templates.
* _filter_: an iterator over the subset of elements of some
sequence which satisfy a given predicate
* _function_: an output iterator wrapping a unary function
* _function_input_: an input iterator wrapping a generator (nullary
function object); each time the iterator is dereferenced, the function object
is called to get the value to return.
* _function_output_: an output iterator wrapping a unary function
object; each time an element is written into the dereferenced
iterator, it is passed as a parameter to the function object.
* _generator_: an input iterator wrapping a generator (nullary
function object); each time the iterator is dereferenced, the function object
is called to get the value to return. An outdated analogue of _function_input_.
* _indirect_: an iterator over the objects *pointed-to* by the
elements of some sequence.
@ -132,7 +150,7 @@ templates.
* _reverse_: an iterator which traverses the elements of some
bidirectional sequence in reverse. Corrects many of the
shortcomings of C++98's ``std::reverse_iterator``.
shortcomings of C++98's `std::reverse_iterator`.
* _shared_: an iterator over elements of a container whose
lifetime is maintained by a _shared_ptr_ stored in the iterator.
@ -140,7 +158,7 @@ templates.
* _transform_: an iterator over elements which are the result of
applying some functional transformation to the elements of an
underlying sequence. This component also replaces the old
``projection_iterator_adaptor``.
`projection_iterator_adaptor`.
* _zip_: an iterator over tuples of the elements at corresponding
positions of heterogeneous underlying iterators.
@ -149,9 +167,9 @@ templates.
[h3 Traits]
[def _pointee_ [@./pointee.html `pointee.hpp`]]
[def _iterator_traits_ [@./iterator_traits.html `iterator_traits.hpp`]]
[def _interoperable_ [@./interoperable.html `interoperable.hpp`]]
[def _pointee_ [link iterator.utilities.traits `pointee.hpp`]]
[def _iterator_traits_ [link iterator.utilities.iterator_traits `iterator_traits.hpp`]]
[def _interoperable_ [@../interoperable.html `interoperable.hpp`]]
[def _MPL_ [@../../mpl/doc/index.html [*MPL]]]
* _pointee_: Provides the capability to deduce the referent types
@ -162,19 +180,40 @@ templates.
retrieve an iterator's traits. Also corrects for the deficiencies
of broken implementations of `std::iterator_traits`.
[\ * |interoperable|_ (PDF__): Provides an _MPL_ compatible metafunction for
testing iterator interoperability
[/
* _interoperable_: Provides an _MPL_ compatible metafunction for
testing iterator interoperability
]
[h3 Testing and Concept Checking]
[def _iterator_concepts_ [@./iterator_concepts.html `iterator_concepts.hpp`]]
[def _iterator_archetypes_ [@./iterator_archetypes.html `iterator_archetypes.hpp`]]
[def _iterator_concepts_ [link iterator.concepts `iterator_concepts.hpp`]]
[def _iterator_archetypes_ [link iterator.utilities.archetypes `iterator_archetypes.hpp`]]
* _iterator_concepts_: Concept checking classes for the new iterator concepts.
* _iterator_archetypes_: Concept archetype classes for the new iterators concepts.
[h2 Iterator Algorithms]
The library provides a number of generic algorithms for use with iterators. These
algorithms take advantage of the new concepts defined by the library to provide
better performance and functionality.
[def _advance_ [link iterator.algorithms.advance `advance.hpp`]]
[def _distance_ [link iterator.algorithms.distance `distance.hpp`]]
[def _next_prior_ [link iterator.algorithms.next_prior `next_prior.hpp`]]
* _advance_: Provides `advance()` function for advancing an iterator a given number
of positions forward or backward.
* _distance_: Provides `distance()` function for computing distance between two
iterators.
* _next_prior_: Provides `next()` and `prior()` functions for obtaining
next and prior iterators to a given iterator. The functions are also compatible
with non-iterator types.
[endsect]
[include concepts.qbk]
@ -195,12 +234,14 @@ templates.
[include concept_checking.qbk]
[include traits.qbk]
[include iterator_traits.qbk]
[include utilities.qbk]
[include type_traits.qbk]
[endsect]
[include algorithms.qbk]
[section:upgrading Upgrading from the old Boost Iterator Adaptor Library]
[def _type_generator_ [@http://www.boost.org/more/generic_programming.html#type_generator type generator]]
@ -264,5 +305,3 @@ library you see today.
Patterns, C++ Report, February 1995, pp. 24-27.]
[endsect]

View File

@ -0,0 +1,54 @@
[section:iterator_traits Iterator Traits]
`std::iterator_traits` provides access to five associated types
of any iterator: its `value_type`, `reference`, `pointer`,
`iterator_category`, and `difference_type`. Unfortunately,
such a "multi-valued" traits template can be difficult to use in a
metaprogramming context. `<boost/iterator/iterator_traits.hpp>`
provides access to these types using a standard metafunctions_.
[h2 Synopsis]
Header `<boost/iterator/iterator_traits.hpp>`:
template <class Iterator>
struct iterator_value
{
typedef typename
std::iterator_traits<Iterator>::value_type
type;
};
template <class Iterator>
struct iterator_reference
{
typedef typename
std::iterator_traits<Iterator>::reference
type;
};
template <class Iterator>
struct iterator_pointer
{
typedef typename
std::iterator_traits<Iterator>::pointer
type;
};
template <class Iterator>
struct iterator_difference
{
typedef typename
detail::iterator_traits<Iterator>::difference_type
type;
};
template <class Iterator>
struct iterator_category
{
typedef typename
detail::iterator_traits<Iterator>::iterator_category
type;
};
[endsect]

View File

@ -1,4 +1,3 @@
[section:permutation Permutation Iterator]
The permutation iterator adaptor provides a permuted view of a given
@ -35,7 +34,7 @@ past-the-end iterator to the indices.
*el_it = std::distance(elements.begin(), el_it);
index_type indices( index_size );
for(index_type::iterator i_it = indices.begin() ; i_it != indices.end() ; ++i_it )
for(index_type::iterator i_it = indices.begin() ; i_it != indices.end() ; ++i_it )
*i_it = element_range_size - index_size + std::distance(indices.begin(), i_it);
std::reverse( indices.begin(), indices.end() );
@ -75,27 +74,28 @@ past-the-end iterator to the indices.
The output is:
The original range is : 0 1 2 3 4 5 6 7 8 9
The reindexing scheme is : 9 8 7 6
The permutated range is : 9 8 7 6
Elements at even indices in the permutation : 9 7
Permutation backwards : 6 7 8 9
Iterate backward with stride 2 : 6 8
[pre
The original range is : 0 1 2 3 4 5 6 7 8 9
The reindexing scheme is : 9 8 7 6
The permutated range is : 9 8 7 6
Elements at even indices in the permutation : 9 7
Permutation backwards : 6 7 8 9
Iterate backward with stride 2 : 6 8
]
The source code for this example can be found
[@../example/permutation_iter_example.cpp here].
[example_link permutation_iter_example.cpp..here].
[h2 Reference]
[h3 Synopsis]
template< class ElementIterator
, class IndexIterator
, class ValueT = use_default
, class CategoryT = use_default
, class ReferenceT = use_default
, class DifferenceT = use_default >
, class IndexIterator
, class ValueT = use_default
, class CategoryT = use_default
, class ReferenceT = use_default
, class DifferenceT = use_default >
class permutation_iterator
{
public:
@ -104,10 +104,10 @@ The source code for this example can be found
template< class OEIter, class OIIter, class V, class C, class R, class D >
permutation_iterator(
permutation_iterator<OEIter, OIIter, V, C, R, D> const& r
, typename enable_if_convertible<OEIter, ElementIterator>::type* = 0
, typename enable_if_convertible<OIIter, IndexIterator>::type* = 0
);
permutation_iterator<OEIter, OIIter, V, C, R, D> const& r
, typename enable_if_convertible<OEIter, ElementIterator>::type* = 0
, typename enable_if_convertible<OIIter, IndexIterator>::type* = 0
);
reference operator*() const;
permutation_iterator& operator++();
ElementIterator const& base() const;
@ -117,7 +117,7 @@ The source code for this example can be found
};
template <class ElementIterator, class IndexIterator>
permutation_iterator<ElementIterator, IndexIterator>
permutation_iterator<ElementIterator, IndexIterator>
make_permutation_iterator( ElementIterator e, IndexIterator i);
@ -134,15 +134,15 @@ the `IndexIterator` must be convertible to the difference type of
as `IndexIterator` and the same iterator access concepts as
`ElementIterator`.
If `IndexIterator` models Single Pass Iterator and
If `IndexIterator` models Single Pass Iterator and
`ElementIterator` models Readable Iterator then
`permutation_iterator` models Input Iterator.
If `IndexIterator` models Forward Traversal Iterator and
If `IndexIterator` models Forward Traversal Iterator and
`ElementIterator` models Readable Lvalue Iterator then
`permutation_iterator` models Forward Iterator.
If `IndexIterator` models Bidirectional Traversal Iterator and
If `IndexIterator` models Bidirectional Traversal Iterator and
`ElementIterator` models Readable Lvalue Iterator then
`permutation_iterator` models Bidirectional Iterator.
@ -173,10 +173,10 @@ following operations.
template< class OEIter, class OIIter, class V, class C, class R, class D >
permutation_iterator(
permutation_iterator<OEIter, OIIter, V, C, R, D> const& r
, typename enable_if_convertible<OEIter, ElementIterator>::type* = 0
, typename enable_if_convertible<OIIter, IndexIterator>::type* = 0
);
permutation_iterator<OEIter, OIIter, V, C, R, D> const& r
, typename enable_if_convertible<OEIter, ElementIterator>::type* = 0
, typename enable_if_convertible<OIIter, IndexIterator>::type* = 0
);
[*Effects: ] Constructs `m_elt` from `r.m_elt` and
`m_order` from `y.m_order`.
@ -189,7 +189,7 @@ following operations.
permutation_iterator& operator++();
[*Effects: ] `++m_order`\n
[*Effects: ] `++m_order`[br]
[*Returns: ] `*this`
@ -199,9 +199,9 @@ following operations.
template <class ElementIterator, class IndexIterator>
permutation_iterator<ElementIterator, IndexIterator>
permutation_iterator<ElementIterator, IndexIterator>
make_permutation_iterator(ElementIterator e, IndexIterator i);
[*Returns: ] `permutation_iterator<ElementIterator, IndexIterator>(e, i)`
[endsect]
[endsect]

View File

@ -1,4 +1,3 @@
[section:reverse Reverse Iterator]
The reverse iterator adaptor iterates through the adapted iterator
@ -9,7 +8,6 @@ range in the opposite direction.
The following example prints an array of characters in reverse order
using `reverse_iterator`.
char letters_[] = "hello world!";
const int N = sizeof(letters_)/sizeof(char) - 1;
typedef char* base_iterator;
@ -35,13 +33,14 @@ using `reverse_iterator`.
The output is:
original sequence of letters: hello world!
sequence in reverse order: !dlrow olleh
sequence in double-reversed (normal) order: hello world!
[pre
original sequence of letters: hello world!
sequence in reverse order: !dlrow olleh
sequence in double-reversed (normal) order: hello world!
]
The source code for this example can be found
[@../example/reverse_iterator_example.cpp here].
[example_link reverse_iterator_example.cpp..here].
[h2 Reference]
@ -115,8 +114,8 @@ operations.
reverse_iterator();
[*Requires: ] `Iterator` must be Default Constructible.\n
[*Effects: ] Constructs an instance of `reverse_iterator` with `m_iterator`
[*Requires: ] `Iterator` must be Default Constructible.[br]
[*Effects: ] Constructs an instance of `reverse_iterator` with `m_iterator`
default constructed.
explicit reverse_iterator(Iterator x);
@ -131,8 +130,8 @@ operations.
, typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
);
[*Requires: ] `OtherIterator` is implicitly convertible to `Iterator`.\n
[*Effects: ] Constructs instance of `reverse_iterator` whose
[*Requires: ] `OtherIterator` is implicitly convertible to `Iterator`.[br]
[*Effects: ] Constructs instance of `reverse_iterator` whose
`m_iterator` subobject is constructed from `y.base()`.
@ -149,12 +148,12 @@ operations.
reverse_iterator& operator++();
[*Effects: ] `--m_iterator`\n
[*Effects: ] `--m_iterator`[br]
[*Returns: ] `*this`
reverse_iterator& operator--();
[*Effects: ] `++m_iterator`\n
[*Effects: ] `++m_iterator`[br]
[*Returns: ] `*this`
[endsect]
[endsect]

View File

@ -1,4 +1,3 @@
[section:shared_container Shared Container Iterator]
Defined in header [@../../../boost/shared_container_iterator.hpp `boost/shared_container_iterator.hpp`].
@ -27,12 +26,12 @@ iterator.
namespace boost {
template <typename Container>
class shared_container_iterator;
template <typename Container>
shared_container_iterator<Container>
make_shared_container_iterator(typename Container::iterator base,
make_shared_container_iterator(typename Container::iterator base,
boost::shared_ptr<Container> const& container);
std::pair<
typename shared_container_iterator<Container>,
typename shared_container_iterator<Container>
@ -46,7 +45,7 @@ iterator.
The class template `shared_container_iterator` is the shared container
iterator type. The `Container` template type argument must model the
[@http://www.sgi.com/tech/stl/Container.html Container] concept.
[@http://www.sgi.com/tech/stl/Container.html Container] concept.
[h2 Example]
@ -56,48 +55,50 @@ original shared pointer `ints` ceases to exist after `set_range()`
returns, the `shared_counter_iterator` objects maintain references to
the underlying vector and thereby extend the container's lifetime.
[@../../../libs/utility/shared_iterator_example1.cpp `shared_iterator_example1.cpp`]:
[example_link shared_iterator_example1.cpp..`shared_iterator_example1.cpp`]:
#include "shared_container_iterator.hpp"
#include "boost/shared_ptr.hpp"
#include <algorithm>
#include <iostream>
#include <vector>
typedef boost::shared_container_iterator< std::vector<int> > iterator;
void set_range(iterator& i, iterator& end) {
boost::shared_ptr< std::vector<int> > ints(new std::vector<int>());
ints->push_back(0);
ints->push_back(1);
ints->push_back(2);
ints->push_back(3);
ints->push_back(4);
ints->push_back(5);
i = iterator(ints->begin(),ints);
end = iterator(ints->end(),ints);
}
int main() {
iterator i,end;
set_range(i,end);
std::copy(i,end,std::ostream_iterator<int>(std::cout,","));
std::cout.put('\n');
return 0;
}
The output from this part is:
0,1,2,3,4,5,
[pre
0,1,2,3,4,5,
]
[table Template Parameters
[[Parameter][Description]]
@ -130,16 +131,16 @@ iterator will be valid. In addition it has the following constructor:
boost::shared_ptr<Container> const& container)
This function provides an alternative to directly constructing a
`shared_container_iterator`. Using the object generator, a
`shared_container_iterator`. Using the object generator, a
`shared_container_iterator` can be created and passed to a function without
explicitly specifying its type.
[h2 Example]
This example, similar to the previous,
This example, similar to the previous,
uses `make_shared_container_iterator()` to create the iterators.
[@../../../libs/utility/shared_iterator_example2.cpp `shared_iterator_example2.cpp`]:
[example_link shared_iterator_example2.cpp..`shared_iterator_example2.cpp`]:
#include "shared_container_iterator.hpp"
#include "boost/shared_ptr.hpp"
@ -147,35 +148,35 @@ uses `make_shared_container_iterator()` to create the iterators.
#include <iterator>
#include <iostream>
#include <vector>
template <typename Iterator>
void print_range_nl (Iterator begin, Iterator end) {
typedef typename std::iterator_traits<Iterator>::value_type val;
std::copy(begin,end,std::ostream_iterator<val>(std::cout,","));
std::cout.put('\n');
}
int main() {
typedef boost::shared_ptr< std::vector<int> > ints_t;
{
ints_t ints(new std::vector<int>());
ints->push_back(0);
ints->push_back(1);
ints->push_back(2);
ints->push_back(3);
ints->push_back(4);
ints->push_back(5);
print_range_nl(boost::make_shared_container_iterator(ints->begin(),ints),
boost::make_shared_container_iterator(ints->end(),ints));
}
return 0;
}
@ -200,18 +201,18 @@ named. The output from this example is the same as the previous.
In the following example, a range of values is returned as a pair of shared_container_iterator objects.
[@../../../libs/utility/shared_iterator_example3.cpp `shared_iterator_example3.cpp`]:
[example_link shared_iterator_example3.cpp..`shared_iterator_example3.cpp`]:
#include "shared_container_iterator.hpp"
#include "boost/shared_ptr.hpp"
#include "boost/tuple/tuple.hpp" // for boost::tie
#include <algorithm> // for std::copy
#include <iostream>
#include <iostream>
#include <vector>
typedef boost::shared_container_iterator< std::vector<int> > iterator;
typedef boost::shared_container_iterator< std::vector<int> > iterator;
std::pair<iterator,iterator>
return_range() {
boost::shared_ptr< std::vector<int> > range(new std::vector<int>());
@ -223,18 +224,18 @@ In the following example, a range of values is returned as a pair of shared_cont
range->push_back(5);
return boost::make_shared_container_range(range);
}
int main() {
iterator i,end;
boost::tie(i,end) = return_range();
std::copy(i,end,std::ostream_iterator<int>(std::cout,","));
std::cout.put('\n');
return 0;
}
@ -245,4 +246,4 @@ the same as the previous two.
[endsect]
[endsect]
[endsect]

View File

@ -1,4 +1,3 @@
[section:specialized Specialized Adaptors]
[include ./counting_iterator.qbk]
@ -19,4 +18,4 @@
[include ./zip_iterator.qbk]
[endsect]
[endsect]

View File

@ -1,72 +0,0 @@
[section:traits Iterator Traits]
`std::iterator_traits` provides access to five associated types
of any iterator: its `value_type`, `reference`, `pointer`,
`iterator_category`, and `difference_type`. Unfortunately,
such a "multi-valued" traits template can be difficult to use in a
metaprogramming context. `<boost/iterator/iterator_traits.hpp>`
provides access to these types using a standard metafunctions_.
[h2 Synopsis]
Header `<boost/iterator/iterator_traits.hpp>`:
template <class Iterator>
struct iterator_value
{
typedef typename
std::iterator_traits<Iterator>::value_type
type;
};
template <class Iterator>
struct iterator_reference
{
typedef typename
std::iterator_traits<Iterator>::reference
type;
};
template <class Iterator>
struct iterator_pointer
{
typedef typename
std::iterator_traits<Iterator>::pointer
type;
};
template <class Iterator>
struct iterator_difference
{
typedef typename
detail::iterator_traits<Iterator>::difference_type
type;
};
template <class Iterator>
struct iterator_category
{
typedef typename
detail::iterator_traits<Iterator>::iterator_category
type;
};
[h2 Broken Compiler Notes]
Because of workarounds in Boost, you may find that these
[@../../mpl/doc/index.html#metafunctions metafunctions] actually work better than the facilities provided by
your compiler's standard library.
On compilers that don't support partial specialization, such as
Microsoft Visual C++ 6.0 or 7.0, you may need to manually invoke
[@../../type_traits/index.html#transformations BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION] on the
`value_type` of pointers that are passed to these metafunctions.
Because of bugs in the implementation of GCC-2.9x, the name of
`iterator_category` is changed to `iterator_category_` on that
compiler. A macro, `BOOST_ITERATOR_CATEGORY`, that expands to
either `iterator_category` or `iterator_category_`, as
appropriate to the platform, is provided for portability.
[endsect]

View File

@ -1,4 +1,3 @@
[section:transform Transform Iterator]
The transform iterator adapts an iterator by modifying the
@ -14,37 +13,38 @@ generate iterators that multiply (or add to) the value returned by
dereferencing the iterator. It would be cooler to use lambda library
in this example.
int x[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
const int N = sizeof(x)/sizeof(int);
typedef boost::binder1st< std::multiplies<int> > Function;
typedef boost::transform_iterator<Function, int*> doubling_iterator;
doubling_iterator i(x, boost::bind1st(std::multiplies<int>(), 2)),
i_end(x + N, boost::bind1st(std::multiplies<int>(), 2));
std::cout << "multiplying the array by 2:" << std::endl;
while (i != i_end)
std::cout << *i++ << " ";
std::cout << std::endl;
std::cout << "adding 4 to each element in the array:" << std::endl;
std::copy(boost::make_transform_iterator(x, boost::bind1st(std::plus<int>(), 4)),
boost::make_transform_iterator(x + N, boost::bind1st(std::plus<int>(), 4)),
std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
int x[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
const int N = sizeof(x)/sizeof(int);
typedef boost::binder1st< std::multiplies<int> > Function;
typedef boost::transform_iterator<Function, int*> doubling_iterator;
doubling_iterator i(x, boost::bind1st(std::multiplies<int>(), 2)),
i_end(x + N, boost::bind1st(std::multiplies<int>(), 2));
std::cout << "multiplying the array by 2:" << std::endl;
while (i != i_end)
std::cout << *i++ << " ";
std::cout << std::endl;
std::cout << "adding 4 to each element in the array:" << std::endl;
std::copy(boost::make_transform_iterator(x, boost::bind1st(std::plus<int>(), 4)),
boost::make_transform_iterator(x + N, boost::bind1st(std::plus<int>(), 4)),
std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
The output is:
multiplying the array by 2:
2 4 6 8 10 12 14 16
adding 4 to each element in the array:
5 6 7 8 9 10 11 12
[pre
multiplying the array by 2:
2 4 6 8 10 12 14 16
adding 4 to each element in the array:
5 6 7 8 9 10 11 12
]
The source code for this example can be found
[@../example/transform_iterator_example.cpp here].
The source code for this example can be found
[example_link transform_iterator_example.cpp..here].
[h2 Reference]
@ -52,8 +52,8 @@ The source code for this example can be found
[h3 Synopsis]
template <class UnaryFunction,
class Iterator,
class Reference = use_default,
class Iterator,
class Reference = use_default,
class Value = use_default>
class transform_iterator
{
@ -85,8 +85,8 @@ The source code for this example can be found
If `Reference` is `use_default` then the `reference` member of
`transform_iterator` is\n
`result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type`.
`transform_iterator` is[br]
`result_of<const UnaryFunction(iterator_traits<Iterator>::reference)>::type`.
Otherwise, `reference` is `Reference`.
@ -110,13 +110,13 @@ convertible to `input_iterator_tag`.
The type `UnaryFunction` must be Assignable, Copy Constructible, and
the expression `f(*i)` must be valid where `f` is an object of
the expression `f(*i)` must be valid where `f` is a const object of
type `UnaryFunction`, `i` is an object of type `Iterator`, and
where the type of `f(*i)` must be
`result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type`.
`result_of<const UnaryFunction(iterator_traits<Iterator>::reference)>::type`.
The argument `Iterator` shall model Readable Iterator.
The argument `Iterator` shall model Readable Iterator.
[h3 Concepts]
@ -126,11 +126,11 @@ The resulting `transform_iterator` models the most refined of the
following that is also modeled by `Iterator`.
* Writable Lvalue Iterator if `transform_iterator::reference` is a non-const reference.
* Writable Lvalue Iterator if `transform_iterator::reference` is a non-const reference.
* Readable Lvalue Iterator if `transform_iterator::reference` is a const reference.
* Readable Iterator otherwise.
* Readable Iterator otherwise.
The `transform_iterator` models the most refined standard traversal
@ -143,11 +143,11 @@ the `Iterator` argument models.
[table Category
[[If `Iterator` models][then `transform_iterator` models]]
[[Single Pass Iterator][Input Iterator]]
[[Forward Traversal Iterator][Forward Iterator]]
[[Bidirectional Traversal Iterator][Bidirectional Iterator]]
[[Random Access Traversal Iterator][Random Access Iterator]]
[[If `Iterator` models][then `transform_iterator` models]]
[[Single Pass Iterator][Input Iterator]]
[[Forward Traversal Iterator][Forward Iterator]]
[[Bidirectional Traversal Iterator][Bidirectional Iterator]]
[[Random Access Traversal Iterator][Random Access Iterator]]
]
If `transform_iterator` models Writable Lvalue Iterator then it is a
@ -160,7 +160,7 @@ interoperable with `Y`.
[h3 Operations]
In addition to the operations required by the [link transform.concepts concepts] modeled by
In addition to the operations required by the [link iterator.specialized.transform.concepts concepts] modeled by
`transform_iterator`, `transform_iterator` provides the following
operations:
@ -177,13 +177,13 @@ operations:
template<class F2, class I2, class R2, class V2>
transform_iterator(
transform_iterator<F2, I2, R2, V2> const& t
, typename enable_if_convertible<I2, Iterator>::type* = 0 // exposition only
, typename enable_if_convertible<I2, Iterator>::type* = 0 // exposition only
, typename enable_if_convertible<F2, UnaryFunction>::type* = 0 // exposition only
);
[*Returns: ] An instance of `transform_iterator` with `m_f`
initialized to `t.functor()` and `m_iterator` initialized to
`t.base()`.\n
`t.base()`.[br]
[*Requires: ] `OtherIterator` is implicitly convertible to `Iterator`.
@ -204,13 +204,13 @@ operations:
transform_iterator& operator++();
[*Effects: ] `++m_iterator`\n
[*Effects: ] `++m_iterator`[br]
[*Returns: ] `*this`
transform_iterator& operator--();
[*Effects: ] `--m_iterator`\n
[*Effects: ] `--m_iterator`[br]
[*Returns: ] `*this`
[endsect]

View File

@ -0,0 +1,211 @@
[section:traits Type Traits]
[h2 Overview]
Have you ever wanted to write a generic function that can operate
on any kind of dereferenceable object? If you have, you've
probably run into the problem of how to determine the type that the
object "points at":
template <class Dereferenceable>
void f(Dereferenceable p)
{
*what-goes-here?* value = \*p;
...
}
[h2 `pointee`]
It turns out to be impossible to come up with a fully-general
algorithm to do determine *what-goes-here* directly, but it is
possible to require that `pointee<Dereferenceable>::type` is
correct. Naturally, `pointee` has the same difficulty: it can't
determine the appropriate `::type` reliably for all
`Dereferenceable`\ s, but it makes very good guesses (it works
for all pointers, standard and boost smart pointers, and
iterators), and when it guesses wrongly, it can be specialized as
necessary:
namespace boost
{
template <class T>
struct pointee<third_party_lib::smart_pointer<T> >
{
typedef T type;
};
}
[h2 `indirect_reference`]
`indirect_reference<T>::type` is rather more specialized than
`pointee`, and is meant to be used to forward the result of
dereferencing an object of its argument type. Most dereferenceable
types just return a reference to their pointee, but some return
proxy references or return the pointee by value. When that
information is needed, call on `indirect_reference`.
Both of these templates are essential to the correct functioning of
[link iterator.specialized.indirect `indirect_iterator`].
[h2 `minimum_category`]
`minimum_category` takes two iterator categories or two iterator traversal tags
and returns the one that is the weakest (i.e. least advanced). For example:
static_assert(
is_same<
minimum_category<
std::forward_iterator_tag,
std::random_access_iterator_tag
>::type,
std::forward_iterator_tag
>::value,
"Unexpected minimum_category result"
);
[h2 Iterator category and traversal tags manipulation]
The library provides several utilities to simplify conversions between iterator categories
and traversal tags:
* `iterator_category_to_traversal<C>::type` - the metafunction takes an iterator category `C` and returns
the corresponding traversal tag.
* `iterator_traversal<T>::type` - a shorthand for `iterator_category_to_traversal<iterator_category<T>::type>::type`.
* `pure_traversal_tag<T>::type` - the metafunction takes a tag `T` which derives from one of the iterator traversal tags
and returns that traversal tag. `T` may also derive from other tags describing the iterator (e.g. whether this is a `const`-iterator
or not), these additional tags are not considered.
* `pure_iterator_traversal<T>::type` - a shorthand for `pure_traversal_tag<iterator_traversal<T>::type>::type`.
[h2 Reference]
[h3 `pointee`]
template <class Dereferenceable>
struct pointee
{
typedef /* see below */ type;
};
[*Requires:] For an object `x` of type `Dereferenceable`, `*x`
is well-formed. If `++x` is ill-formed it shall neither be
ambiguous nor shall it violate access control, and
`Dereferenceable::element_type` shall be an accessible type.
Otherwise `iterator_traits<Dereferenceable>::value_type` shall
be well formed. \[Note: These requirements need not apply to
explicit or partial specializations of `pointee`\]
`type` is determined according to the following algorithm, where
`x` is an object of type `Dereferenceable`:
if ( ++x is ill-formed )
{
return Dereferenceable::element_type
}
else if (*x is a mutable reference to
std::iterator_traits<Dereferenceable>::value_type)
{
return iterator_traits<Dereferenceable>::value_type
}
else
{
return iterator_traits<Dereferenceable>::value_type const
}
[h3 `indirect_reference`]
template <class Dereferenceable>
struct indirect_reference
{
typedef /* see below */ type;
};
[*Requires:] For an object `x` of type `Dereferenceable`, `*x`
is well-formed. If `++x` is ill-formed it shall neither be
ambiguous nor shall it violate access control, and
`pointee<Dereferenceable>::type&` shall be well-formed.
Otherwise `iterator_traits<Dereferenceable>::reference` shall
be well formed. \[Note: These requirements need not apply to
explicit or partial specializations of `indirect_reference`\]
`type` is determined according to the following algorithm, where
`x` is an object of type `Dereferenceable`:
if ( ++x is ill-formed )
return pointee<Dereferenceable>::type&
else
std::iterator_traits<Dereferenceable>::reference
[h3 `minimum_category`]
template <typename C1, typename C2>
struct minimum_category
{
typedef /* see below */ type;
};
[*Requires:] Both `C1` and `C2` shall be standard iterator categories or
iterator traversal tags.
`type` is determined according to the following algorithm, where `c1` is an
object of type `C1` and `c2` is an object of type `C2`:
if (c1 is convertible to c2)
return C2;
else
return C1;
[note The above definition relies on the fact that the more restricting categories
and traversal tags are convertible to the less restricting ones.]
[h3 `iterator_category_to_traversal`]
template <typename C>
struct iterator_category_to_traversal
{
typedef /* see below */ type;
};
[*Requires:] `C` shall be a standard iterator category or an
iterator traversal tag.
If `C` is an iterator traversal tag or convertible to one, `type` equivalent to `C`.
Otherwise, `type` is defined to the closest iterator traversal tag matching `C`.
[h3 `iterator_traversal`]
template <typename Iterator>
struct iterator_traversal
{
typedef typename iterator_category_to_traversal<
typename iterator_category<Iterator>::type
>::type type;
};
[*Requires:] `Iterator` shall be an iterator.
[h3 `pure_traversal_tag`]
template <typename T>
struct pure_traversal_tag
{
typedef /* see below */ type;
};
[*Requires:] `T` shall be convertible to an iterator traversal tag.
`type` is defined to be the most advanced traversal tag `Tag` so that `T` is convertible to `Tag`.
[h3 `pure_iterator_traversal`]
template <typename Iterator>
struct pure_iterator_traversal
{
typedef typename pure_traversal_tag<
typename iterator_traversal<Iterator>::type
>::type type;
};
[*Requires:] `Iterator` shall be an iterator.
[endsect]

View File

@ -1,224 +0,0 @@
[section:utilities Iterator Utilities]
[section:utilities_traits Traits]
[h2 Overview]
Have you ever wanted to write a generic function that can operate
on any kind of dereferenceable object? If you have, you've
probably run into the problem of how to determine the type that the
object "points at":
template <class Dereferenceable>
void f(Dereferenceable p)
{
*what-goes-here?* value = \*p;
...
}
[h2 `pointee`]
It turns out to be impossible to come up with a fully-general
algorithm to do determine *what-goes-here* directly, but it is
possible to require that `pointee<Dereferenceable>::type` is
correct. Naturally, `pointee` has the same difficulty: it can't
determine the appropriate `::type` reliably for all
`Dereferenceable`\ s, but it makes very good guesses (it works
for all pointers, standard and boost smart pointers, and
iterators), and when it guesses wrongly, it can be specialized as
necessary:
namespace boost
{
template <class T>
struct pointee<third_party_lib::smart_pointer<T> >
{
typedef T type;
};
}
[h2 `indirect_reference`]
`indirect_reference<T>::type` is rather more specialized than
`pointee`, and is meant to be used to forward the result of
dereferencing an object of its argument type. Most dereferenceable
types just return a reference to their pointee, but some return
proxy references or return the pointee by value. When that
information is needed, call on `indirect_reference`.
Both of these templates are essential to the correct functioning of
[link indirecct `indirect_iterator`].
[h2 Reference]
[h3 `pointeee`]
template <class Dereferenceable>
struct pointee
{
typedef /* see below */ type;
};
[*Requires:] For an object `x` of type `Dereferenceable`, `*x`
is well-formed. If `++x` is ill-formed it shall neither be
ambiguous nor shall it violate access control, and
`Dereferenceable::element_type` shall be an accessible type.
Otherwise `iterator_traits<Dereferenceable>::value_type` shall
be well formed. \[Note: These requirements need not apply to
explicit or partial specializations of `pointee`\]
`type` is determined according to the following algorithm, where
`x` is an object of type `Dereferenceable`:
if ( ++x is ill-formed )
{
return `Dereferenceable::element_type`
}
else if (`*x` is a mutable reference to
std::iterator_traits<Dereferenceable>::value_type)
{
return iterator_traits<Dereferenceable>::value_type
}
else
{
return iterator_traits<Dereferenceable>::value_type const
}
[h3 `indirect_reference`]
template <class Dereferenceable>
struct indirect_reference
{
typedef /* see below */ type;
};
[*Requires:] For an object `x` of type `Dereferenceable`, `*x`
is well-formed. If `++x` is ill-formed it shall neither be
ambiguous nor shall it violate access control, and
`pointee<Dereferenceable>::type&` shall be well-formed.
Otherwise `iterator_traits<Dereferenceable>::reference` shall
be well formed. \[Note: These requirements need not apply to
explicit or partial specializations of `indirect_reference`\]
`type` is determined according to the following algorithm, where
`x` is an object of type `Dereferenceable`:
if ( ++x is ill-formed )
return `pointee<Dereferenceable>::type&`
else
std::iterator_traits<Dereferenceable>::reference
[endsect]
[section:utilities_testing Testing and Concept Checking]
The iterator concept checking classes provide a mechanism for a
template to report better error messages when a user instantiates
the template with a type that does not meet the requirements of the
template.
For an introduction to using concept checking classes, see
the documentation for the
[@../../concept_check/index.html `boost::concept_check`] library.
[h2 Reference]
[h3 Iterator Access Concepts]
* |Readable|_
* |Writable|_
* |Swappable|_
* |Lvalue|_
[/ .. |Readable| replace:: *Readable Iterator* ]
[/ .. _Readable: ReadableIterator.html ]
[/ ]
[/ .. |Writable| replace:: *Writable Iterator* ]
[/ .. _Writable: WritableIterator.html ]
[/ ]
[/ .. |Swappable| replace:: *Swappable Iterator* ]
[/ .. _Swappable: SwappableIterator.html ]
[/ ]
[/ .. |Lvalue| replace:: *Lvalue Iterator* ]
[/ .. _Lvalue: LvalueIterator.html ]
Iterator Traversal Concepts
...........................
* |Incrementable|_
* |SinglePass|_
* |Forward|_
* |Bidir|_
* |Random|_
[/ .. |Incrementable| replace:: *Incrementable Iterator* ]
[/ .. _Incrementable: IncrementableIterator.html ]
[/ ]
[/ .. |SinglePass| replace:: *Single Pass Iterator* ]
[/ .. _SinglePass: SinglePassIterator.html ]
[/ ]
[/ .. |Forward| replace:: *Forward Traversal* ]
[/ .. _Forward: ForwardTraversal.html ]
[/ ]
[/ .. |Bidir| replace:: *Bidirectional Traversal* ]
[/ .. _Bidir: BidirectionalTraversal.html ]
[/ ]
[/ .. |Random| replace:: *Random Access Traversal* ]
[/ .. _Random: RandomAccessTraversal.html ]
[h3 `iterator_concepts.hpp` Synopsis]
namespace boost_concepts {
// Iterator Access Concepts
template <typename Iterator>
class ReadableIteratorConcept;
template <
typename Iterator
, typename ValueType = std::iterator_traits<Iterator>::value_type
>
class WritableIteratorConcept;
template <typename Iterator>
class SwappableIteratorConcept;
template <typename Iterator>
class LvalueIteratorConcept;
// Iterator Traversal Concepts
template <typename Iterator>
class IncrementableIteratorConcept;
template <typename Iterator>
class SinglePassIteratorConcept;
template <typename Iterator>
class ForwardTraversalConcept;
template <typename Iterator>
class BidirectionalTraversalConcept;
template <typename Iterator>
class RandomAccessTraversalConcept;
// Interoperability
template <typename Iterator, typename ConstIterator>
class InteroperableIteratorConcept;
}
[endsect]
[endsect]

View File

@ -1,20 +1,29 @@
[section:zip Zip Iterator]
The zip iterator provides the ability to parallel-iterate
over several controlled sequences simultaneously. A zip
over several controlled sequences simultaneously. A zip
iterator is constructed from a tuple of iterators. Moving
the zip iterator moves all the iterators in parallel.
Dereferencing the zip iterator returns a tuple that contains
the results of dereferencing the individual iterators.
the results of dereferencing the individual iterators.
The tuple of iterators is now implemented in terms of a Boost fusion sequence.
Because of this the 'tuple' may be any Boost fusion sequence and, for backwards
compatibility through a Boost fusion sequence adapter, a Boost tuple. Because the
'tuple' may be any boost::fusion sequence the 'tuple' may also be any type for which a
Boost fusion adapter exists. This includes, among others, a std::tuple and a std::pair.
Just remember to include the appropriate Boost fusion adapter header files for these
other Boost fusion adapters. The zip_iterator header file already includes the
Boost fusion adapter header file for Boost tuple, so you need not include it yourself
to use a Boost tuple as your 'tuple'.
[section:zip_example Example]
There are two main types of applications of the `zip_iterator`. The first
one concerns runtime efficiency: If one has several controlled sequences
of the same length that must be somehow processed, e.g., with the
of the same length that must be somehow processed, e.g., with the
`for_each` algorithm, then it is more efficient to perform just
one parallel-iteration rather than several individual iterations. For an
one parallel-iteration rather than several individual iterations. For an
example, assume that `vect_of_doubles` and `vect_of_ints`
are two vectors of equal length containing doubles and ints, respectively,
and consider the following two iterations:
@ -43,7 +52,7 @@ These two iterations can now be replaced with a single one as follows:
A non-generic implementation of `zip_func` could look as follows:
struct zip_func :
struct zip_func :
public std::unary_function<const boost::tuple<const double&, const int&>&, void>
{
void operator()(const boost::tuple<const double&, const int&>& t) const
@ -62,16 +71,16 @@ to make combining iterators. A combining iterator is an iterator
that parallel-iterates over several controlled sequences and, upon
dereferencing, returns the result of applying a functor to the values of the
sequences at the respective positions. This can now be achieved by using the
`zip_iterator` in conjunction with the `transform_iterator`.
`zip_iterator` in conjunction with the `transform_iterator`.
Suppose, for example, that you have two vectors of doubles, say
Suppose, for example, that you have two vectors of doubles, say
`vect_1` and `vect_2`, and you need to expose to a client
a controlled sequence containing the products of the elements of
a controlled sequence containing the products of the elements of
`vect_1` and `vect_2`. Rather than placing these products
in a third vector, you can use a combining iterator that calculates the
products on the fly. Let us assume that `tuple_multiplies` is a
functor that works like `std::multiplies`, except that it takes
its two arguments packaged in a tuple. Then the two iterators
its two arguments packaged in a tuple. Then the two iterators
`it_begin` and `it_end` defined below delimit a controlled
sequence containing the products of the elements of `vect_1` and
`vect_2`:
@ -118,7 +127,7 @@ sequence containing the products of the elements of `vect_1` and
template<typename IteratorTuple>
class zip_iterator
{
{
public:
typedef /* see below */ reference;
@ -144,8 +153,8 @@ sequence containing the products of the elements of `vect_1` and
IteratorTuple m_iterator_tuple; // exposition only
};
template<typename IteratorTuple>
zip_iterator<IteratorTuple>
template<typename IteratorTuple>
zip_iterator<IteratorTuple>
make_zip_iterator(IteratorTuple t);
The `reference` member of `zip_iterator` is the type of the tuple
@ -158,23 +167,23 @@ of the first of the iterator types in the `IteratorTuple` argument.
The `iterator_category` member of `zip_iterator` is convertible to the
minimum of the traversal categories of the iterator types in the `IteratorTuple`
argument. For example, if the `zip_iterator` holds only vector
iterators, then `iterator_category` is convertible to
iterators, then `iterator_category` is convertible to
`boost::random_access_traversal_tag`. If you add a list iterator, then
`iterator_category` will be convertible to `boost::bidirectional_traversal_tag`,
but no longer to `boost::random_access_traversal_tag`.
[h2 Requirements]
All iterator types in the argument `IteratorTuple` shall model Readable Iterator.
All iterator types in the argument `IteratorTuple` shall model Readable Iterator.
[h2 Concepts]
The resulting `zip_iterator` models Readable Iterator.
The fact that the `zip_iterator` models only Readable Iterator does not
The fact that the `zip_iterator` models only Readable Iterator does not
prevent you from modifying the values that the individual iterators point
to. The tuple returned by the `zip_iterator`'s `operator*` is a tuple
constructed from the reference types of the individual iterators, not
to. The tuple returned by the `zip_iterator`'s `operator*` is a tuple
constructed from the reference types of the individual iterators, not
their value types. For example, if `zip_it` is a `zip_iterator` whose
first member iterator is an `std::vector<double>::iterator`, then the
following line will modify the value which the first member iterator of
@ -185,7 +194,7 @@ following line will modify the value which the first member iterator of
Consider the set of standard traversal concepts obtained by taking
the most refined standard traversal concept modeled by each individual
iterator type in the `IteratorTuple` argument.The `zip_iterator`
iterator type in the `IteratorTuple` argument.The `zip_iterator`
models the least refined standard traversal concept in this set.
`zip_iterator<IteratorTuple1>` is interoperable with
@ -218,7 +227,7 @@ operations.
, IteratorTuple>::type* = 0 // exposition only
);
[*Returns:] An instance of `zip_iterator` that is a copy of `other`.\n
[*Returns:] An instance of `zip_iterator` that is a copy of `other`.[br]
[*Requires:] `OtherIteratorTuple` is implicitly convertible to `IteratorTuple`.
@ -235,17 +244,17 @@ operations.
zip_iterator& operator++();
[*Effects:] Increments each iterator in `m_iterator_tuple`.\n
[*Effects:] Increments each iterator in `m_iterator_tuple`.[br]
[*Returns:] `*this`
zip_iterator& operator--();
[*Effects:] Decrements each iterator in `m_iterator_tuple`.\n
[*Effects:] Decrements each iterator in `m_iterator_tuple`.[br]
[*Returns:] `*this`
template<typename IteratorTuple>
zip_iterator<IteratorTuple>
template<typename IteratorTuple>
zip_iterator<IteratorTuple>
make_zip_iterator(IteratorTuple t);
[*Returns:] An instance of `zip_iterator<IteratorTuple>` with `m_iterator_tuple`
@ -253,4 +262,4 @@ operations.
[endsect]
[endsect]
[endsect]

0
doc/reverse_iterator.pdf Executable file → Normal file
View File

0
doc/transform_iterator.pdf Executable file → Normal file
View File

0
doc/transform_iterator_eg.rst Executable file → Normal file
View File

0
doc/zip_iterator.html Executable file → Normal file
View File

0
doc/zip_iterator.pdf Executable file → Normal file
View File

0
doc/zip_iterator.rst Executable file → Normal file
View File

10
doc/zip_iterator_abstract.rst Executable file → Normal file
View File

@ -8,3 +8,13 @@ iterator is constructed from a tuple of iterators. Moving
the zip iterator moves all the iterators in parallel.
Dereferencing the zip iterator returns a tuple that contains
the results of dereferencing the individual iterators.
The tuple of iterators is now implemented in terms of a Boost fusion sequence.
Because of this the 'tuple' may be any Boost fusion sequence and, for backwards
compatibility through a Boost fusion sequence adapter, a Boost tuple. Because the
'tuple' may be any boost::fusion sequence the 'tuple' may also be any type for which a
Boost fusion adapter exists. This includes, among others, a std::tuple and a std::pair.
Just remember to include the appropriate Boost fusion adapter header files for these
other Boost fusion adapters. The zip_iterator header file already includes the
Boost fusion adapter header file for Boost tuple, so you need not include it yourself
to use a Boost tuple as your 'tuple'.

3
doc/zip_iterator_eg.rst Executable file → Normal file
View File

@ -45,8 +45,7 @@ A non-generic implementation of ``zip_func`` could look as follows:
::
struct zip_func :
public std::unary_function<const boost::tuple<const double&, const int&>&, void>
struct zip_func
{
void operator()(const boost::tuple<const double&, const int&>& t) const
{

0
doc/zip_iterator_ref.rst Executable file → Normal file
View File

View File

@ -41,12 +41,12 @@ int main(int, char*[])
// Use indirect iterator to print out numbers by accessing
// them through the array of pointers.
std::cout << "indirectly printing out the numbers from 0 to "
std::cout << "indirectly printing out the numbers from 0 to "
<< N << std::endl;
std::copy(boost::make_indirect_iterator(pointers.begin()),
boost::make_indirect_iterator(pointers.end()),
std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
return boost::exit_success;
}

View File

@ -8,6 +8,7 @@
#include <functional>
#include <iostream>
#include <boost/iterator/filter_iterator.hpp>
#include <boost/bind/bind.hpp>
#include <boost/cstdlib.hpp> // for exit_success
struct is_positive_number {
@ -18,10 +19,10 @@ int main()
{
int numbers_[] = { 0, -1, 4, -3, 5, 8, -2 };
const int N = sizeof(numbers_)/sizeof(int);
typedef int* base_iterator;
base_iterator numbers(numbers_);
// Example using make_filter_iterator()
std::copy(boost::make_filter_iterator<is_positive_number>(numbers, numbers + N),
boost::make_filter_iterator<is_positive_number>(numbers + N, numbers + N),
@ -31,7 +32,7 @@ int main()
// Example using filter_iterator
typedef boost::filter_iterator<is_positive_number, base_iterator>
FilterIter;
is_positive_number predicate;
FilterIter filter_iter_first(predicate, numbers, numbers + N);
FilterIter filter_iter_last(predicate, numbers + N, numbers + N);
@ -42,17 +43,17 @@ int main()
// Another example using make_filter_iterator()
std::copy(
boost::make_filter_iterator(
std::bind2nd(std::greater<int>(), -2)
boost::bind(std::greater<int>(), boost::placeholders::_1, -2)
, numbers, numbers + N)
, boost::make_filter_iterator(
std::bind2nd(std::greater<int>(), -2)
boost::bind(std::greater<int>(), boost::placeholders::_1, -2)
, numbers + N, numbers + N)
, std::ostream_iterator<int>(std::cout, " ")
);
std::cout << std::endl;
return boost::exit_success;
}

View File

@ -12,14 +12,14 @@
#include <string>
#include <vector>
#include <boost/function_output_iterator.hpp>
#include <boost/iterator/function_output_iterator.hpp>
struct string_appender
{
string_appender(std::string& s)
: m_str(&s)
{}
void operator()(const std::string& x) const
{
*m_str += x;
@ -37,9 +37,9 @@ int main(int, char*[])
x.push_back("!");
std::string s = "";
std::copy(x.begin(), x.end(),
std::copy(x.begin(), x.end(),
boost::make_function_output_iterator(string_appender(s)));
std::cout << s << std::endl;
return 0;

View File

@ -9,6 +9,7 @@
#include <iterator>
#include <functional>
#include <algorithm>
#include <boost/bind/bind.hpp>
#include <boost/iterator/indirect_iterator.hpp>
int main(int, char*[])
@ -20,13 +21,13 @@ int main(int, char*[])
pointers_to_chars[i] = &characters[i];
// Example of using indirect_iterator
boost::indirect_iterator<char**, char>
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 making mutable and constant indirect iterators
@ -41,19 +42,19 @@ int main(int, char*[])
const_indirect_last(pointers_to_chars + N);
std::transform(const_indirect_first, const_indirect_last,
mutable_indirect_first, std::bind1st(std::plus<char>(), 1));
mutable_indirect_first, boost::bind(std::plus<char>(), 1, boost::placeholders::_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),
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;
}

0
example/node.hpp Executable file → Normal file
View File

12
example/node_iterator1.cpp Executable file → Normal file
View File

@ -11,7 +11,17 @@
int main()
{
#if defined(BOOST_NO_CXX11_SMART_PTR)
std::auto_ptr<node<int> > nodes(new node<int>(42));
#else
std::unique_ptr<node<int> > nodes(new node<int>(42));
#endif
nodes->append(new node<std::string>(" is greater than "));
nodes->append(new node<int>(13));
@ -20,7 +30,7 @@ int main()
, std::ostream_iterator<node_base>(std::cout, " ")
);
std::cout << std::endl;
std::for_each(
node_iterator(nodes.get()), node_iterator()
, std::mem_fun_ref(&node_base::double_me)

0
example/node_iterator1.hpp Executable file → Normal file
View File

16
example/node_iterator2.cpp Executable file → Normal file
View File

@ -12,23 +12,33 @@
int main()
{
#if defined(BOOST_NO_CXX11_SMART_PTR)
std::auto_ptr<node<int> > nodes(new node<int>(42));
#else
std::unique_ptr<node<int> > nodes(new node<int>(42));
#endif
nodes->append(new node<std::string>(" is greater than "));
nodes->append(new node<int>(13));
// Check interoperability
assert(node_iterator(nodes.get()) == node_const_iterator(nodes.get()));
assert(node_const_iterator(nodes.get()) == node_iterator(nodes.get()));
assert(node_iterator(nodes.get()) != node_const_iterator());
assert(node_const_iterator(nodes.get()) != node_iterator());
std::copy(
node_iterator(nodes.get()), node_iterator()
, std::ostream_iterator<node_base>(std::cout, " ")
);
std::cout << std::endl;
std::for_each(
node_iterator(nodes.get()), node_iterator()
, boost::mem_fn(&node_base::double_me)

0
example/node_iterator2.hpp Executable file → Normal file
View File

16
example/node_iterator3.cpp Executable file → Normal file
View File

@ -12,23 +12,33 @@
int main()
{
#if defined(BOOST_NO_CXX11_SMART_PTR)
std::auto_ptr<node<int> > nodes(new node<int>(42));
#else
std::unique_ptr<node<int> > nodes(new node<int>(42));
#endif
nodes->append(new node<std::string>(" is greater than "));
nodes->append(new node<int>(13));
// Check interoperability
assert(node_iterator(nodes.get()) == node_const_iterator(nodes.get()));
assert(node_const_iterator(nodes.get()) == node_iterator(nodes.get()));
assert(node_iterator(nodes.get()) != node_const_iterator());
assert(node_const_iterator(nodes.get()) != node_iterator());
std::copy(
node_iterator(nodes.get()), node_iterator()
, std::ostream_iterator<node_base>(std::cout, " ")
);
std::cout << std::endl;
std::for_each(
node_iterator(nodes.get()), node_iterator()
, boost::mem_fn(&node_base::double_me)

0
example/node_iterator3.hpp Executable file → Normal file
View File

View File

@ -27,7 +27,7 @@ int main() {
*el_it = std::distance(elements.begin(), el_it);
index_type indices( index_size );
for(index_type::iterator i_it = indices.begin() ; i_it != indices.end() ; ++i_it )
for(index_type::iterator i_it = indices.begin() ; i_it != indices.end() ; ++i_it )
*i_it = element_range_size - index_size + std::distance(indices.begin(), i_it);
std::reverse( indices.begin(), indices.end() );

View File

@ -15,13 +15,13 @@ int main(int, char*[])
const int N = sizeof(letters_)/sizeof(char) - 1;
typedef char* base_iterator;
base_iterator letters(letters_);
std::cout << "original sequence of letters:\t\t\t"
<< letters_ << std::endl;
// Use reverse_iterator to print a sequence of letters in reverse
// order.
boost::reverse_iterator<base_iterator>
reverse_letters_first(letters + N),
reverse_letters_last(letters);

View File

@ -0,0 +1,42 @@
// Copyright 2003 The Trustees of Indiana University.
// Use, modification and distribution is 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)
#include "boost/shared_container_iterator.hpp"
#include "boost/shared_ptr.hpp"
#include <algorithm>
#include <iostream>
#include <vector>
typedef boost::shared_container_iterator< std::vector<int> > iterator;
void set_range(iterator& i, iterator& end) {
boost::shared_ptr< std::vector<int> > ints(new std::vector<int>());
ints->push_back(0);
ints->push_back(1);
ints->push_back(2);
ints->push_back(3);
ints->push_back(4);
ints->push_back(5);
i = iterator(ints->begin(),ints);
end = iterator(ints->end(),ints);
}
int main() {
iterator i,end;
set_range(i,end);
std::copy(i,end,std::ostream_iterator<int>(std::cout,","));
std::cout.put('\n');
return 0;
}

View File

@ -0,0 +1,43 @@
// Copyright 2003 The Trustees of Indiana University.
// Use, modification and distribution is 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)
#include "boost/shared_container_iterator.hpp"
#include "boost/shared_ptr.hpp"
#include <algorithm>
#include <iterator>
#include <iostream>
#include <vector>
template <typename Iterator>
void print_range_nl (Iterator begin, Iterator end) {
typedef typename std::iterator_traits<Iterator>::value_type val;
std::copy(begin,end,std::ostream_iterator<val>(std::cout,","));
std::cout.put('\n');
}
int main() {
typedef boost::shared_ptr< std::vector<int> > ints_t;
{
ints_t ints(new std::vector<int>());
ints->push_back(0);
ints->push_back(1);
ints->push_back(2);
ints->push_back(3);
ints->push_back(4);
ints->push_back(5);
print_range_nl(boost::make_shared_container_iterator(ints->begin(),ints),
boost::make_shared_container_iterator(ints->end(),ints));
}
return 0;
}

View File

@ -0,0 +1,41 @@
// Copyright 2003 The Trustees of Indiana University.
// Use, modification and distribution is 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)
#include "boost/shared_container_iterator.hpp"
#include "boost/shared_ptr.hpp"
#include "boost/tuple/tuple.hpp" // for boost::tie
#include <algorithm> // for std::copy
#include <iostream>
#include <vector>
typedef boost::shared_container_iterator< std::vector<int> > iterator;
std::pair<iterator,iterator>
return_range() {
boost::shared_ptr< std::vector<int> > range(new std::vector<int>());
range->push_back(0);
range->push_back(1);
range->push_back(2);
range->push_back(3);
range->push_back(4);
range->push_back(5);
return boost::make_shared_container_range(range);
}
int main() {
iterator i,end;
boost::tie(i,end) = return_range();
std::copy(i,end,std::ostream_iterator<int>(std::cout,","));
std::cout.put('\n');
return 0;
}

View File

@ -1,4 +1,4 @@
// (C) Copyright Jeremy Siek 2000-2004.
// (C) Copyright Jeremy Siek 2000-2004.
// Distributed under 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)
@ -15,10 +15,11 @@
namespace boost {
template <class Operation>
class binder1st
: public std::unary_function<typename Operation::second_argument_type,
typename Operation::result_type> {
template <class Operation>
class binder1st {
public:
typedef typename Operation::result_type result_type;
typedef typename Operation::second_argument_type argument_type;
protected:
Operation op;
typename Operation::first_argument_type value;
@ -29,7 +30,7 @@ namespace boost {
: op(x), value(y) {}
typename Operation::result_type
operator()(const typename Operation::second_argument_type& x) const {
return op(value, x);
return op(value, x);
}
};
@ -69,8 +70,6 @@ main(int, char*[])
boost::make_transform_iterator(x + N, boost::bind1st(std::plus<int>(), 4)),
std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
return 0;
}

View File

@ -1,56 +1,18 @@
// (C) Copyright Jeremy Siek 2001.
// (C) Copyright Andrey Semashev 2017.
// Distributed under 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)
// Revision History:
// 27 Feb 2001 Jeremy Siek
// Initial checkin.
#ifndef BOOST_FUNCTION_OUTPUT_ITERATOR_HPP
#define BOOST_FUNCTION_OUTPUT_ITERATOR_HPP
#include <iterator>
// This is a deprecated header left for backward compatibility.
// Use boost/iterator/function_output_iterator.hpp instead.
namespace boost {
#include <boost/config/header_deprecated.hpp>
template <class UnaryFunction>
class function_output_iterator {
typedef function_output_iterator self;
public:
typedef std::output_iterator_tag iterator_category;
typedef void value_type;
typedef void difference_type;
typedef void pointer;
typedef void reference;
BOOST_HEADER_DEPRECATED("<boost/iterator/function_output_iterator.hpp>")
explicit function_output_iterator() {}
explicit function_output_iterator(const UnaryFunction& f)
: m_f(f) {}
struct output_proxy {
output_proxy(UnaryFunction& f) : m_f(f) { }
template <class T> output_proxy& operator=(const T& value) {
m_f(value);
return *this;
}
UnaryFunction& m_f;
};
output_proxy operator*() { return output_proxy(m_f); }
self& operator++() { return *this; }
self& operator++(int) { return *this; }
private:
UnaryFunction m_f;
};
template <class UnaryFunction>
inline function_output_iterator<UnaryFunction>
make_function_output_iterator(const UnaryFunction& f = UnaryFunction()) {
return function_output_iterator<UnaryFunction>(f);
}
} // namespace boost
#include <boost/iterator/function_output_iterator.hpp>
#endif // BOOST_FUNCTION_OUTPUT_ITERATOR_HPP

View File

@ -17,6 +17,7 @@
#include <boost/ref.hpp>
namespace boost {
namespace iterators {
template<class Generator>
class generator_iterator
@ -33,7 +34,7 @@ class generator_iterator
, single_pass_traversal_tag
, typename Generator::result_type const&
> super_t;
public:
generator_iterator() {}
generator_iterator(Generator* g) : m_g(g), m_value((*m_g)()) {}
@ -73,8 +74,12 @@ make_generator_iterator(Generator & gen)
return result_t(&gen);
}
} // namespace iterators
using iterators::generator_iterator;
using iterators::generator_iterator_generator;
using iterators::make_generator_iterator;
} // namespace boost
#endif // BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP

Some files were not shown because too many files have changed in this diff Show More