mirror of
https://github.com/boostorg/iterator.git
synced 2025-12-19 13:32:46 +01:00
Compare commits
557 Commits
svn-branch
...
boost-1.90
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
248494330d | ||
|
|
ca0e772d2a | ||
|
|
2a0b753691 | ||
|
|
0087a426d9 | ||
|
|
c409288ff5 | ||
|
|
01ac4e1a47 | ||
|
|
e968c3312b | ||
|
|
da00617e56 | ||
|
|
7c77e52509 | ||
|
|
256004a446 | ||
|
|
7e3e9a584e | ||
|
|
3767696513 | ||
|
|
1372e9afb6 | ||
|
|
6428e552e4 | ||
|
|
766c881f9a | ||
|
|
c2b846c57d | ||
|
|
1a7996ebd0 | ||
|
|
eee670608e | ||
|
|
c89e2b325a | ||
|
|
a7150173ed | ||
|
|
e446c6e05c | ||
|
|
8998179e9d | ||
|
|
d35869cd25 | ||
|
|
6e6def930f | ||
|
|
1a58ca89d1 | ||
|
|
34f703cfb6 | ||
|
|
a91fc06bb4 | ||
|
|
fd1445140f | ||
|
|
8c2fdf6053 | ||
|
|
aadd90df45 | ||
|
|
dc57bcf319 | ||
|
|
baf6d06cc2 | ||
|
|
6e60ea7a88 | ||
|
|
cb81a1dfc3 | ||
|
|
c22af90b60 | ||
|
|
b6a41e325c | ||
|
|
0c2eda4bb8 | ||
|
|
dfb1fd9bed | ||
|
|
b12874b6ca | ||
|
|
1875d95019 | ||
|
|
4f5f61e37b | ||
|
|
5aa1c9fef3 | ||
|
|
d6a68dc6eb | ||
|
|
e5ee9a6168 | ||
|
|
82703b7c14 | ||
|
|
d8ce9ddfc7 | ||
|
|
5f713e9b14 | ||
|
|
12ee53d441 | ||
|
|
ef40faf620 | ||
|
|
fc99b7a15d | ||
|
|
241c28018e | ||
|
|
83905b219e | ||
|
|
6fab3bbfa4 | ||
|
|
dec7d0f24c | ||
|
|
b30cbf634c | ||
|
|
7ddbf15868 | ||
|
|
4fc0165034 | ||
|
|
bcf94f9e5d | ||
|
|
d6297a553b | ||
|
|
32d19a72e1 | ||
|
|
cf43da4286 | ||
|
|
10e89b3e4c | ||
|
|
5ed3144969 | ||
|
|
f9effffb6d | ||
|
|
53101ffab9 | ||
|
|
4b40364d6d | ||
|
|
7c55a6cef8 | ||
|
|
1ea8087623 | ||
|
|
e4eaeeac44 | ||
|
|
46ffe06b3d | ||
|
|
8b83324682 | ||
|
|
ce030ab2c3 | ||
|
|
4914e1f40a | ||
|
|
0abef890ee | ||
|
|
4f7219965a | ||
|
|
988594fb9d | ||
|
|
3fa2242082 | ||
|
|
43dde9b9c3 | ||
|
|
7968dd3ea8 | ||
|
|
dfe11e7144 | ||
|
|
9cc1a4fdd1 | ||
|
|
ae5d7d8c0c | ||
|
|
d72d57fa39 | ||
|
|
c98f965388 | ||
|
|
d09f78ae9b | ||
|
|
a9dabd3c65 | ||
|
|
80bb1ac9e4 | ||
|
|
d11499c08c | ||
|
|
6d02c36718 | ||
|
|
85b542e1b6 | ||
|
|
e8fbd92a61 | ||
|
|
7c9b4296a1 | ||
|
|
0a95636faf | ||
|
|
5777e9944b | ||
|
|
853ba3d3c7 | ||
|
|
f82627f2cc | ||
|
|
ed1d96f251 | ||
|
|
ce52aee3ce | ||
|
|
17355c5ad0 | ||
|
|
9504b3bced | ||
|
|
2cc45f1694 | ||
|
|
a3269e536f | ||
|
|
129245a985 | ||
|
|
1a80896934 | ||
|
|
ee2d3a6596 | ||
|
|
cd24487161 | ||
|
|
dd37a27067 | ||
|
|
7b6edb6a7d | ||
|
|
c924b42749 | ||
|
|
85d935bf68 | ||
|
|
d175ba2450 | ||
|
|
75ba1a50c9 | ||
|
|
e4ab917f79 | ||
|
|
c901bd6d7a | ||
|
|
eb0d01126a | ||
|
|
abe6fbfd4b | ||
|
|
7a200905dd | ||
|
|
acf35d2a87 | ||
|
|
5ebbe941be | ||
|
|
72308ef787 | ||
|
|
9124869bcc | ||
|
|
216b442d23 | ||
|
|
c858138495 | ||
|
|
1c6f85d4f9 | ||
|
|
0a59f555ca | ||
|
|
18337e990b | ||
|
|
1447c566d1 | ||
|
|
fc281fa58a | ||
|
|
b76c273946 | ||
|
|
f396a8fef0 | ||
|
|
5a6013e21f | ||
|
|
6dfb175cef | ||
|
|
72a7fb1b73 | ||
|
|
f4b47fd266 | ||
|
|
2c0145bff0 | ||
|
|
987151dde6 | ||
|
|
8e457e716b | ||
|
|
32f4f4d086 | ||
|
|
72f0ebe8d0 | ||
|
|
d7ad43a925 | ||
|
|
733c0fb9cb | ||
|
|
5b18ae976e | ||
|
|
da8604615e | ||
|
|
8fc94469da | ||
|
|
b86c817481 | ||
|
|
9649d42392 | ||
|
|
0c5f0b822a | ||
|
|
dc7bf5cc05 | ||
|
|
80ec58bb3b | ||
|
|
c2929ea6c6 | ||
|
|
4fe679bb0d | ||
|
|
fdcd8439c0 | ||
|
|
3a8728a595 | ||
|
|
897ff65fdc | ||
|
|
bfe2a004d2 | ||
|
|
d528fc0b11 | ||
|
|
540f999d0b | ||
|
|
54dee0db96 | ||
|
|
814965402e | ||
|
|
2af5a16539 | ||
|
|
171c716d03 | ||
|
|
398fe907d0 | ||
|
|
e31ae13df5 | ||
|
|
02e74bf26a | ||
|
|
20b5a9c11a | ||
|
|
73918b8616 | ||
|
|
bb1efd3370 | ||
|
|
3cc4107d01 | ||
|
|
6ab148be01 | ||
|
|
06875a754d | ||
|
|
b844c8df53 | ||
|
|
194087e8ca | ||
|
|
b5edc8b64f | ||
|
|
44cee00831 | ||
|
|
b2adecb951 | ||
|
|
e16f2de233 | ||
|
|
218dc4baf1 | ||
|
|
0013c5c4f0 | ||
|
|
386dbf1054 | ||
|
|
486721bbfe | ||
|
|
5ad48c4d14 | ||
|
|
adecfd94f3 | ||
|
|
affe7e6d84 | ||
|
|
91b392a478 | ||
|
|
84227ea6ba | ||
|
|
67ac957273 | ||
|
|
f86cd29f52 | ||
|
|
fff85e7db9 | ||
|
|
d6c6f0ce16 | ||
|
|
81faa161cf | ||
|
|
7e5a32b3ea | ||
|
|
1b388c2496 | ||
|
|
30b93d7428 | ||
|
|
28b8cc8c9c | ||
|
|
992a314211 | ||
|
|
422ad12716 | ||
|
|
b2585dda6a | ||
|
|
8b5e92a0c4 | ||
|
|
a36ed0f35d | ||
|
|
0a08203107 | ||
|
|
38ef552209 | ||
|
|
a85dfaa7f2 | ||
|
|
2af60e066d | ||
|
|
7442334ce1 | ||
|
|
8577675c85 | ||
|
|
685b3fe855 | ||
|
|
a653a39cf4 | ||
|
|
c338572735 | ||
|
|
07afd26ca2 | ||
|
|
d058933767 | ||
|
|
e2f81e9b48 | ||
|
|
379200dfd1 | ||
|
|
a26314dfb9 | ||
|
|
e61592c553 | ||
|
|
a3751006db | ||
|
|
40da532a4d | ||
|
|
7ce9f87954 | ||
|
|
553b9713ac | ||
|
|
ba32745e80 | ||
|
|
282b28e51f | ||
|
|
479898d9d5 | ||
|
|
c1a375284d | ||
|
|
24d2f58f98 | ||
|
|
25a91d5981 | ||
|
|
9b78dc1006 | ||
|
|
89ca2fd1ae | ||
|
|
79277b78d2 | ||
|
|
eb90ad7a99 | ||
|
|
de07014e9a | ||
|
|
25dc5c6c9c | ||
|
|
048c3dfa72 | ||
|
|
f7dfc36a9c | ||
|
|
c529399fb1 | ||
|
|
6faa3a942b | ||
|
|
0c6b09ef6a | ||
|
|
83220e7aea | ||
|
|
991ea534ee | ||
|
|
210633c08c | ||
|
|
3275ee3c82 | ||
|
|
a72deda3ac | ||
|
|
2b6b6bf8ad | ||
|
|
0107df44ab | ||
|
|
011288c2c8 | ||
|
|
eaf1a48583 | ||
|
|
52fbe950ec | ||
|
|
6a672cecbd | ||
|
|
577203bee8 | ||
|
|
5f6ac9c020 | ||
|
|
a48de6a8b8 | ||
|
|
5f6fd2dec6 | ||
|
|
e3577e7687 | ||
|
|
5ba36b063e | ||
|
|
bab02bb82e | ||
|
|
d251a6f515 | ||
|
|
9d054b25ce | ||
|
|
d1b22ac8e8 | ||
|
|
abe77db3e0 | ||
|
|
398819237e | ||
|
|
a4bacb5077 | ||
|
|
5ba5f2c2d4 | ||
|
|
6c1b356be1 | ||
|
|
bfcf52ace6 | ||
|
|
e2c927628c | ||
|
|
ed027c2cce | ||
|
|
4791425000 | ||
|
|
b7e7e83a11 | ||
|
|
c148962bd9 | ||
|
|
5bfbfb7716 | ||
|
|
af5f6e49e0 | ||
|
|
26ee5ba754 | ||
|
|
67a2336cf4 | ||
|
|
029277f3ed | ||
|
|
847b2a1be3 | ||
|
|
18268069d9 | ||
|
|
bb54ee7900 | ||
|
|
d5b67c7fab | ||
|
|
663a30f659 | ||
|
|
177f719d15 | ||
|
|
cccbd8c6aa | ||
|
|
d6cfed4b20 | ||
|
|
514ac53326 | ||
|
|
ca3b7505ce | ||
|
|
d7c8cccd64 | ||
|
|
7b627fa679 | ||
|
|
760da84f9c | ||
|
|
89d3ec7662 | ||
|
|
c86db2ec8a | ||
|
|
0a18cfb255 | ||
|
|
11e3715f37 | ||
|
|
f2d07f76b5 | ||
|
|
53e8ac401f | ||
|
|
434818cce7 | ||
|
|
c09c8ca2b2 | ||
|
|
22dd100dfd | ||
|
|
2f72016049 | ||
|
|
5b26a8b3fc | ||
|
|
711a0232f8 | ||
|
|
443dfb9901 | ||
|
|
c734f3bfa3 | ||
|
|
b2b9ab1568 | ||
|
|
8b23342969 | ||
|
|
922296f8c8 | ||
|
|
c9a91a1fba | ||
|
|
80e6f4a3bf | ||
|
|
398bbe63bb | ||
|
|
87d82527b1 | ||
|
|
b9448b5fae | ||
|
|
76519ea4a7 | ||
|
|
878812c42f | ||
|
|
2283f084d9 | ||
|
|
a0533d97f5 | ||
|
|
ece225bbda | ||
|
|
b62dc6ba9d | ||
|
|
20dc7b1abe | ||
|
|
0dbbb61bec | ||
|
|
2de2111db2 | ||
|
|
db04fafe21 | ||
|
|
4e0fc90b60 | ||
|
|
53cbba6c09 | ||
|
|
8be623d733 | ||
|
|
d12d60fa12 | ||
|
|
ec7d398578 | ||
|
|
3d3560c12d | ||
|
|
46f9e1753f | ||
|
|
2511f21d62 | ||
|
|
adee905c51 | ||
|
|
82779f78ec | ||
|
|
a569c97969 | ||
|
|
aad821d28d | ||
|
|
23934d7c0d | ||
|
|
1073b7f7bc | ||
|
|
f158dba6ad | ||
|
|
8fe632d6b1 | ||
|
|
810b58cfb0 | ||
|
|
156c13a494 | ||
|
|
785680d929 | ||
|
|
269de2691a | ||
|
|
11f7d1bc18 | ||
|
|
4a403cd3eb | ||
|
|
dc96d371fa | ||
|
|
e000b676cc | ||
|
|
045a05f81f | ||
|
|
25139e1311 | ||
|
|
aad767ed3f | ||
|
|
7fa65a4278 | ||
|
|
fd94cc7d78 | ||
|
|
36988fcf98 | ||
|
|
4283d20261 | ||
|
|
91f782ec52 | ||
|
|
9841d87212 | ||
|
|
782313db8c | ||
|
|
c040d4c38b | ||
|
|
1ddaca8297 | ||
|
|
acf9b4d4cf | ||
|
|
e88b3f475c | ||
|
|
01cffbed98 | ||
|
|
187bc896f6 | ||
|
|
6883d083d2 | ||
|
|
0345db959b | ||
|
|
d814423414 | ||
|
|
eb288b2908 | ||
|
|
0e23f15623 | ||
|
|
6b2a5cccc4 | ||
|
|
a803b5b42d | ||
|
|
d8284fa602 | ||
|
|
8d96469cb4 | ||
|
|
09549a613e | ||
|
|
daac0f2ab1 | ||
|
|
8e5b8025d8 | ||
|
|
c142956936 | ||
|
|
21afa3d8ec | ||
|
|
2d9362fe89 | ||
|
|
8779e0e715 | ||
|
|
3546643667 | ||
|
|
70ac888f75 | ||
|
|
854d39f58a | ||
|
|
7bb83d4646 | ||
|
|
bb27f3ee25 | ||
|
|
96d2e9638c | ||
|
|
f2137c58b7 | ||
|
|
0dfc7bd53c | ||
|
|
ae1d0d0dfe | ||
|
|
9ddc974825 | ||
|
|
1cde579a68 | ||
|
|
73ccc2bac0 | ||
|
|
9b13de9bfe | ||
|
|
35cf24d413 | ||
|
|
a83b13f4e6 | ||
|
|
c6f70f8394 | ||
|
|
0b33da51dd | ||
|
|
39c44e0da3 | ||
|
|
d1c93d3574 | ||
|
|
208400a1d0 | ||
|
|
dae3cf2a9d | ||
|
|
0c44051189 | ||
|
|
4fcb23f8e0 | ||
|
|
8a004c12f6 | ||
|
|
3695e48b68 | ||
|
|
ac3a206eb9 | ||
|
|
f9095485a2 | ||
|
|
1c4527d58e | ||
|
|
455a039c33 | ||
|
|
5d7289ad3e | ||
|
|
40fd24e5b5 | ||
|
|
290cea8289 | ||
|
|
e6babb8bf9 | ||
|
|
84cd6e1be4 | ||
|
|
2325b6070a | ||
|
|
91b2854e4a | ||
|
|
27b44876bc | ||
|
|
123bf514ac | ||
|
|
ac7b14253f | ||
|
|
69df402f70 | ||
|
|
e600d3f65b | ||
|
|
f6e5aa2462 | ||
|
|
21102938e8 | ||
|
|
a1c0cf8373 | ||
|
|
220a11883c | ||
|
|
913df78ec0 | ||
|
|
01f9b396d8 | ||
|
|
67d418a5c6 | ||
|
|
d853e444ce | ||
|
|
e6d5c24b91 | ||
|
|
98db5b4f9a | ||
|
|
739c95411f | ||
|
|
8ce330a111 | ||
|
|
3eef8090d6 | ||
|
|
d291c7b43e | ||
|
|
1471102bfc | ||
|
|
2e099caceb | ||
|
|
3fd1c34411 | ||
|
|
dec42098db | ||
|
|
d4d51389d1 | ||
|
|
4a82a5646f | ||
|
|
fecf28a440 | ||
|
|
bc34e54f6c | ||
|
|
f543f1e7b6 | ||
|
|
9f661c9112 | ||
|
|
04bc178fc1 | ||
|
|
1b2fbfaaca | ||
|
|
a6a8fd00d7 | ||
|
|
30a13b8141 | ||
|
|
db29a874f1 | ||
|
|
8345293f94 | ||
|
|
512298cb5c | ||
|
|
6d0b2d4f8a | ||
|
|
7dbd0f5a89 | ||
|
|
c9463e941f | ||
|
|
1ce1296320 | ||
|
|
9025bbfc2a | ||
|
|
c6f3269f4a | ||
|
|
31c3971720 | ||
|
|
2db78eec90 | ||
|
|
c7fc3470d0 | ||
|
|
ad90dac61d | ||
|
|
964a29979c | ||
|
|
fbbdcf8c99 | ||
|
|
5d72ae48da | ||
|
|
1ca1caddff | ||
|
|
5c477dc695 | ||
|
|
d45b57c33c | ||
|
|
caa0e5035a | ||
|
|
5a88e6f958 | ||
|
|
36565eae63 | ||
|
|
14b1075d6b | ||
|
|
752fc7c185 | ||
|
|
de4ef14f9b | ||
|
|
15f3bf9352 | ||
|
|
d469568de7 | ||
|
|
251b9f8057 | ||
|
|
2786268510 | ||
|
|
6bb82230b9 | ||
|
|
f65f03afcc | ||
|
|
c07f55ff65 | ||
|
|
ac522bc9e1 | ||
|
|
4c60e26bf8 | ||
|
|
d11c7a3ec4 | ||
|
|
cfc04ce11e | ||
|
|
76fd8e27fb | ||
|
|
25d4d34ebe | ||
|
|
ea26e9f109 | ||
|
|
f2433c63d5 | ||
|
|
264c186eac | ||
|
|
55c08b706c | ||
|
|
835498603d | ||
|
|
b0ec5a759b | ||
|
|
2ece3ac5c2 | ||
|
|
e06c4b3279 | ||
|
|
78effefadb | ||
|
|
37c46f7da5 | ||
|
|
bf7d904bf8 | ||
|
|
6d0f901b2e | ||
|
|
efecbd0d27 | ||
|
|
65e229fb0d | ||
|
|
db0e0b7b91 | ||
|
|
23d53055f9 | ||
|
|
bd5731efa9 | ||
|
|
a2d9e63f94 | ||
|
|
f34109aa26 | ||
|
|
ff73538b5b | ||
|
|
0f88de3d88 | ||
|
|
107595b76c | ||
|
|
1f0a885def | ||
|
|
30685528c7 | ||
|
|
c849f35965 | ||
|
|
5bf5110cdb | ||
|
|
aa483f4961 | ||
|
|
0b095e687f | ||
|
|
c0d6dacf62 | ||
|
|
93c010eb51 | ||
|
|
0dc017b1a8 | ||
|
|
92c92bbbf8 | ||
|
|
c080ee4dcf | ||
|
|
f51591cb04 | ||
|
|
9d241238f8 | ||
|
|
624131ce46 | ||
|
|
47da2546f9 | ||
|
|
45f64ea8f7 | ||
|
|
71abf15b60 | ||
|
|
8a53abc1e8 | ||
|
|
7243852b0a | ||
|
|
b258a435cc | ||
|
|
43e4f1a766 | ||
|
|
e7843bdea3 | ||
|
|
02d22c12ae | ||
|
|
bca372da18 | ||
|
|
70ef2f0e81 | ||
|
|
0237e49a17 | ||
|
|
b7283c93c6 | ||
|
|
b5492bd866 | ||
|
|
5184d64b80 | ||
|
|
1fad13e34f | ||
|
|
3355660636 | ||
|
|
eaf9bf62d1 | ||
|
|
9f20320f59 | ||
|
|
2cb253ed35 | ||
|
|
230d47e93a | ||
|
|
e2957cfb0c | ||
|
|
f5b644e765 | ||
|
|
f482354ffd | ||
|
|
28dd458088 | ||
|
|
7a2b9d66a9 | ||
|
|
0dbe767eec | ||
|
|
d79112ee5a | ||
|
|
c0fc8532e7 | ||
|
|
4a5e8f175a | ||
|
|
a4e7ba6c28 | ||
|
|
58341b3517 | ||
|
|
e23a647cff | ||
|
|
d801e64289 | ||
|
|
f5a31849f0 | ||
|
|
7846e4bfd7 | ||
|
|
6368d38802 | ||
|
|
6a79b6014b | ||
|
|
73811245eb | ||
|
|
1c3e6c5b65 | ||
|
|
ae10a3b706 |
620
.github/workflows/ci.yml
vendored
Normal file
620
.github/workflows/ci.yml
vendored
Normal file
@@ -0,0 +1,620 @@
|
|||||||
|
# Copyright 2021-2025 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)
|
||||||
|
|
||||||
|
name: CI
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
- develop
|
||||||
|
- feature/**
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{format('{0}:{1}', github.repository, github.ref)}}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
env:
|
||||||
|
GIT_FETCH_JOBS: 8
|
||||||
|
NET_RETRY_COUNT: 5
|
||||||
|
DEFAULT_BUILD_VARIANT: debug,release
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
posix:
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
# Linux, gcc
|
||||||
|
- toolset: gcc-5
|
||||||
|
cxxstd: "11,14,1z"
|
||||||
|
os: ubuntu-latest
|
||||||
|
container: ubuntu:16.04
|
||||||
|
install:
|
||||||
|
- g++-5
|
||||||
|
- toolset: gcc-6
|
||||||
|
cxxstd: "11,14,1z"
|
||||||
|
os: ubuntu-latest
|
||||||
|
container: ubuntu:18.04
|
||||||
|
install:
|
||||||
|
- g++-6
|
||||||
|
- toolset: gcc-7
|
||||||
|
cxxstd: "11,14,17"
|
||||||
|
os: ubuntu-latest
|
||||||
|
container: ubuntu:18.04
|
||||||
|
install:
|
||||||
|
- g++-7
|
||||||
|
- toolset: gcc-8
|
||||||
|
cxxstd: "11,14,17,2a"
|
||||||
|
os: ubuntu-latest
|
||||||
|
container: ubuntu:18.04
|
||||||
|
install:
|
||||||
|
- g++-8
|
||||||
|
- toolset: gcc-9
|
||||||
|
cxxstd: "11,14,17,2a"
|
||||||
|
os: ubuntu-latest
|
||||||
|
container: ubuntu:20.04
|
||||||
|
install:
|
||||||
|
- g++-9
|
||||||
|
- toolset: gcc-10
|
||||||
|
cxxstd: "11,14,17,20"
|
||||||
|
os: ubuntu-latest
|
||||||
|
container: ubuntu:20.04
|
||||||
|
install:
|
||||||
|
- g++-10
|
||||||
|
- toolset: gcc-11
|
||||||
|
cxxstd: "11,14,17,20,23"
|
||||||
|
os: ubuntu-22.04
|
||||||
|
install:
|
||||||
|
- g++-11
|
||||||
|
- toolset: gcc-12
|
||||||
|
cxxstd: "11,14,17,20,23"
|
||||||
|
os: ubuntu-22.04
|
||||||
|
install:
|
||||||
|
- g++-12
|
||||||
|
- toolset: gcc-13
|
||||||
|
cxxstd: "11,14,17,20,23"
|
||||||
|
os: ubuntu-24.04
|
||||||
|
install:
|
||||||
|
- g++-13
|
||||||
|
- toolset: gcc-14
|
||||||
|
cxxstd: "11,14,17,20,23,26"
|
||||||
|
os: ubuntu-24.04
|
||||||
|
install:
|
||||||
|
- g++-14
|
||||||
|
- toolset: gcc-15
|
||||||
|
cxxstd: "11,14,17,20,23,26"
|
||||||
|
os: ubuntu-latest
|
||||||
|
container: ubuntu:25.04
|
||||||
|
install:
|
||||||
|
- g++-15
|
||||||
|
- name: UBSAN
|
||||||
|
toolset: gcc-13
|
||||||
|
cxxstd: "11,14,17,20,23"
|
||||||
|
ubsan: 1
|
||||||
|
build_variant: debug
|
||||||
|
os: ubuntu-24.04
|
||||||
|
install:
|
||||||
|
- g++-13
|
||||||
|
|
||||||
|
# Linux, clang
|
||||||
|
- toolset: clang
|
||||||
|
compiler: clang++-3.5
|
||||||
|
cxxstd: "11"
|
||||||
|
os: ubuntu-latest
|
||||||
|
container: ubuntu:16.04
|
||||||
|
install:
|
||||||
|
- clang-3.5
|
||||||
|
- toolset: clang
|
||||||
|
compiler: clang++-3.6
|
||||||
|
cxxstd: "11,14"
|
||||||
|
os: ubuntu-latest
|
||||||
|
container: ubuntu:16.04
|
||||||
|
install:
|
||||||
|
- clang-3.6
|
||||||
|
- toolset: clang
|
||||||
|
compiler: clang++-3.7
|
||||||
|
cxxstd: "11,14"
|
||||||
|
os: ubuntu-latest
|
||||||
|
container: ubuntu:16.04
|
||||||
|
install:
|
||||||
|
- clang-3.7
|
||||||
|
- toolset: clang
|
||||||
|
compiler: clang++-3.8
|
||||||
|
cxxstd: "11,14"
|
||||||
|
os: ubuntu-latest
|
||||||
|
container: ubuntu:16.04
|
||||||
|
install:
|
||||||
|
- clang-3.8
|
||||||
|
- toolset: clang
|
||||||
|
compiler: clang++-3.9
|
||||||
|
cxxstd: "11,14"
|
||||||
|
os: ubuntu-latest
|
||||||
|
container: ubuntu:18.04
|
||||||
|
install:
|
||||||
|
- clang-3.9
|
||||||
|
- toolset: clang
|
||||||
|
compiler: clang++-4.0
|
||||||
|
cxxstd: "11,14"
|
||||||
|
os: ubuntu-latest
|
||||||
|
container: ubuntu:18.04
|
||||||
|
install:
|
||||||
|
- clang-4.0
|
||||||
|
- toolset: clang
|
||||||
|
compiler: clang++-5.0
|
||||||
|
cxxstd: "11,14,1z"
|
||||||
|
os: ubuntu-latest
|
||||||
|
container: ubuntu:18.04
|
||||||
|
install:
|
||||||
|
- clang-5.0
|
||||||
|
- toolset: clang
|
||||||
|
compiler: clang++-6.0
|
||||||
|
cxxstd: "11,14,17"
|
||||||
|
os: ubuntu-latest
|
||||||
|
container: ubuntu:18.04
|
||||||
|
install:
|
||||||
|
- clang-6.0
|
||||||
|
- toolset: clang
|
||||||
|
compiler: clang++-7
|
||||||
|
cxxstd: "11,14,17"
|
||||||
|
os: ubuntu-latest
|
||||||
|
container: ubuntu:18.04
|
||||||
|
install:
|
||||||
|
- clang-7
|
||||||
|
# Note: clang-8 does not fully support C++20, so it is not compatible with libstdc++-8 in this mode
|
||||||
|
- toolset: clang
|
||||||
|
compiler: clang++-8
|
||||||
|
cxxstd: "11,14,17,2a"
|
||||||
|
os: ubuntu-latest
|
||||||
|
container: ubuntu:18.04
|
||||||
|
install:
|
||||||
|
- clang-8
|
||||||
|
- g++-7
|
||||||
|
gcc_toolchain: 7
|
||||||
|
- toolset: clang
|
||||||
|
compiler: clang++-9
|
||||||
|
cxxstd: "11,14,17,2a"
|
||||||
|
os: ubuntu-latest
|
||||||
|
container: ubuntu:20.04
|
||||||
|
install:
|
||||||
|
- clang-9
|
||||||
|
- toolset: clang
|
||||||
|
compiler: clang++-10
|
||||||
|
cxxstd: "11,14,17,20"
|
||||||
|
os: ubuntu-latest
|
||||||
|
container: ubuntu:20.04
|
||||||
|
install:
|
||||||
|
- clang-10
|
||||||
|
- toolset: clang
|
||||||
|
compiler: clang++-11
|
||||||
|
cxxstd: "11,14,17,20"
|
||||||
|
os: ubuntu-22.04
|
||||||
|
install:
|
||||||
|
- clang-11
|
||||||
|
- g++-11
|
||||||
|
gcc_toolchain: 11
|
||||||
|
- toolset: clang
|
||||||
|
compiler: clang++-12
|
||||||
|
cxxstd: "11,14,17,20,2b"
|
||||||
|
os: ubuntu-22.04
|
||||||
|
install:
|
||||||
|
- clang-12
|
||||||
|
- g++-11
|
||||||
|
gcc_toolchain: 11
|
||||||
|
- toolset: clang
|
||||||
|
compiler: clang++-13
|
||||||
|
cxxstd: "11,14,17,20,2b"
|
||||||
|
os: ubuntu-22.04
|
||||||
|
install:
|
||||||
|
- clang-13
|
||||||
|
- g++-11
|
||||||
|
gcc_toolchain: 11
|
||||||
|
- toolset: clang
|
||||||
|
compiler: clang++-14
|
||||||
|
cxxstd: "11,14,17,20,2b"
|
||||||
|
os: ubuntu-22.04
|
||||||
|
install:
|
||||||
|
- clang-14
|
||||||
|
- g++-11
|
||||||
|
gcc_toolchain: 11
|
||||||
|
- toolset: clang
|
||||||
|
compiler: clang++-15
|
||||||
|
cxxstd: "11,14,17,20,2b"
|
||||||
|
os: ubuntu-22.04
|
||||||
|
install:
|
||||||
|
- clang-15
|
||||||
|
- g++-11
|
||||||
|
gcc_toolchain: 11
|
||||||
|
- toolset: clang
|
||||||
|
compiler: clang++-16
|
||||||
|
cxxstd: "11,14,17,20,2b"
|
||||||
|
os: ubuntu-24.04
|
||||||
|
install:
|
||||||
|
- clang-16
|
||||||
|
- g++-11
|
||||||
|
gcc_toolchain: 11
|
||||||
|
- toolset: clang
|
||||||
|
compiler: clang++-17
|
||||||
|
cxxstd: "11,14,17,20,23,26"
|
||||||
|
os: ubuntu-24.04
|
||||||
|
install:
|
||||||
|
- clang-17
|
||||||
|
- g++-11
|
||||||
|
gcc_toolchain: 11
|
||||||
|
- toolset: clang
|
||||||
|
compiler: clang++-18
|
||||||
|
cxxstd: "11,14,17,20,23,26"
|
||||||
|
os: ubuntu-24.04
|
||||||
|
install:
|
||||||
|
- clang-18
|
||||||
|
- g++-13
|
||||||
|
- toolset: clang
|
||||||
|
compiler: clang++-19
|
||||||
|
cxxstd: "11,14,17,20,23,26"
|
||||||
|
os: ubuntu-24.04
|
||||||
|
install:
|
||||||
|
- clang-19
|
||||||
|
- toolset: clang
|
||||||
|
compiler: clang++-20
|
||||||
|
cxxstd: "11,14,17,20,23,26"
|
||||||
|
os: ubuntu-latest
|
||||||
|
container: ubuntu:25.04
|
||||||
|
install:
|
||||||
|
- clang-20
|
||||||
|
- toolset: clang
|
||||||
|
compiler: clang++-20
|
||||||
|
cxxstd: "11,14,17,20,23,26"
|
||||||
|
os: ubuntu-latest
|
||||||
|
container: ubuntu:25.04
|
||||||
|
install:
|
||||||
|
- clang-20
|
||||||
|
- libc++-20-dev
|
||||||
|
- libc++abi-20-dev
|
||||||
|
cxxflags: -stdlib=libc++
|
||||||
|
linkflags: -stdlib=libc++
|
||||||
|
- name: UBSAN
|
||||||
|
toolset: clang
|
||||||
|
compiler: clang++-18
|
||||||
|
cxxstd: "11,14,17,20,23,26"
|
||||||
|
cxxflags: -stdlib=libc++
|
||||||
|
linkflags: "-stdlib=libc++ -lubsan"
|
||||||
|
ubsan: 1
|
||||||
|
build_variant: debug
|
||||||
|
os: ubuntu-24.04
|
||||||
|
install:
|
||||||
|
- clang-18
|
||||||
|
- libc++-18-dev
|
||||||
|
- libc++abi-18-dev
|
||||||
|
|
||||||
|
- toolset: clang
|
||||||
|
cxxstd: "11,14,17,20,2b"
|
||||||
|
os: macos-13
|
||||||
|
- toolset: clang
|
||||||
|
cxxstd: "11,14,17,20,2b"
|
||||||
|
os: macos-14
|
||||||
|
- toolset: clang
|
||||||
|
cxxstd: "11,14,17,20,2b"
|
||||||
|
os: macos-15
|
||||||
|
|
||||||
|
- name: CMake tests
|
||||||
|
cmake_tests: 1
|
||||||
|
os: ubuntu-24.04
|
||||||
|
|
||||||
|
timeout-minutes: 20
|
||||||
|
runs-on: ${{matrix.os}}
|
||||||
|
container: ${{matrix.container}}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Setup environment
|
||||||
|
run: |
|
||||||
|
if [ -f "/etc/debian_version" ]
|
||||||
|
then
|
||||||
|
echo "DEBIAN_FRONTEND=noninteractive" >> $GITHUB_ENV
|
||||||
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
|
fi
|
||||||
|
if [ -n "${{matrix.container}}" ]
|
||||||
|
then
|
||||||
|
echo "GHA_CONTAINER=${{matrix.container}}" >> $GITHUB_ENV
|
||||||
|
if [ -f "/etc/debian_version" ]
|
||||||
|
then
|
||||||
|
# Use Azure APT mirrors in containers to avoid HTTP errors due to DDoS filters triggered by lots of CI jobs launching concurrently.
|
||||||
|
# Note that not all Ubuntu versions support "mirror+file:..." URIs in APT sources, so just use Azure mirrors exclusively.
|
||||||
|
# Note also that on recent Ubuntu versions DEB822 format is used for source files.
|
||||||
|
APT_SOURCES=()
|
||||||
|
if [ -d "/etc/apt/sources.list.d" ]
|
||||||
|
then
|
||||||
|
readarray -t APT_SOURCES < <(find "/etc/apt/sources.list.d" -type f -name '*.sources' -print)
|
||||||
|
fi
|
||||||
|
if [ -f "/etc/apt/sources.list" ]
|
||||||
|
then
|
||||||
|
APT_SOURCES+=("/etc/apt/sources.list")
|
||||||
|
fi
|
||||||
|
if [ "${#APT_SOURCES[@]}" -gt 0 ]
|
||||||
|
then
|
||||||
|
sed -i -E -e 's!([^ ]+) (http|https)://(archive|security)\.ubuntu\.com/ubuntu[^ ]*(.*)!\1 http://azure.archive.ubuntu.com/ubuntu/\4!' "${APT_SOURCES[@]}"
|
||||||
|
fi
|
||||||
|
apt-get -o Acquire::Retries=$NET_RETRY_COUNT update
|
||||||
|
if [ "$(apt-cache search "^python-is-python3$" | wc -l)" -ne 0 ]
|
||||||
|
then
|
||||||
|
PYTHON_PACKAGE="python-is-python3"
|
||||||
|
else
|
||||||
|
PYTHON_PACKAGE="python"
|
||||||
|
fi
|
||||||
|
apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y sudo software-properties-common tzdata wget curl apt-transport-https ca-certificates make build-essential g++ $PYTHON_PACKAGE python3 perl git cmake
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
git config --global pack.threads 0
|
||||||
|
|
||||||
|
- name: Install packages
|
||||||
|
if: matrix.install
|
||||||
|
run: |
|
||||||
|
declare -a SOURCE_KEYS SOURCES
|
||||||
|
if [ -n "${{join(matrix.source_keys, ' ')}}" ]
|
||||||
|
then
|
||||||
|
SOURCE_KEYS=("${{join(matrix.source_keys, '" "')}}")
|
||||||
|
fi
|
||||||
|
if [ -n "${{join(matrix.sources, ' ')}}" ]
|
||||||
|
then
|
||||||
|
SOURCES=("${{join(matrix.sources, '" "')}}")
|
||||||
|
fi
|
||||||
|
for key in "${SOURCE_KEYS[@]}"
|
||||||
|
do
|
||||||
|
for i in {1..$NET_RETRY_COUNT}
|
||||||
|
do
|
||||||
|
echo "Adding key: $key"
|
||||||
|
wget -O - "$key" | sudo apt-key add - && break || sleep 2
|
||||||
|
done
|
||||||
|
done
|
||||||
|
if [ ${#SOURCES[@]} -gt 0 ]
|
||||||
|
then
|
||||||
|
APT_ADD_REPO_COMMON_ARGS=("-y")
|
||||||
|
APT_ADD_REPO_SUPPORTED_ARGS="$(apt-add-repository --help | perl -ne 'if (/^\s*-n/) { print "n"; } elsif (/^\s*-P/) { print "P"; } elsif (/^\s*-S/) { print "S"; } elsif (/^\s*-U/) { print "U"; }')"
|
||||||
|
if [ -n "$APT_ADD_REPO_SUPPORTED_ARGS" -a -z "${APT_ADD_REPO_SUPPORTED_ARGS##*n*}" ]
|
||||||
|
then
|
||||||
|
APT_ADD_REPO_COMMON_ARGS+=("-n")
|
||||||
|
fi
|
||||||
|
APT_ADD_REPO_HAS_SOURCE_ARGS="$([ -n "$APT_ADD_REPO_SUPPORTED_ARGS" -a -z "${APT_ADD_REPO_SUPPORTED_ARGS##*P*}" -a -z "${APT_ADD_REPO_SUPPORTED_ARGS##*S*}" -a -z "${APT_ADD_REPO_SUPPORTED_ARGS##*U*}" ] && echo 1 || echo 0)"
|
||||||
|
for source in "${SOURCES[@]}"
|
||||||
|
do
|
||||||
|
for i in {1..$NET_RETRY_COUNT}
|
||||||
|
do
|
||||||
|
APT_ADD_REPO_ARGS=("${APT_ADD_REPO_COMMON_ARGS[@]}")
|
||||||
|
if [ $APT_ADD_REPO_HAS_SOURCE_ARGS -ne 0 ]
|
||||||
|
then
|
||||||
|
case "$source" in
|
||||||
|
"ppa:"*)
|
||||||
|
APT_ADD_REPO_ARGS+=("-P")
|
||||||
|
;;
|
||||||
|
"deb "*)
|
||||||
|
APT_ADD_REPO_ARGS+=("-S")
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
APT_ADD_REPO_ARGS+=("-U")
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
APT_ADD_REPO_ARGS+=("$source")
|
||||||
|
echo "apt-add-repository ${APT_ADD_REPO_ARGS[@]}"
|
||||||
|
sudo -E apt-add-repository "${APT_ADD_REPO_ARGS[@]}" && break || sleep 2
|
||||||
|
done
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT update
|
||||||
|
sudo apt-get -o Acquire::Retries=$NET_RETRY_COUNT install -y ${{join(matrix.install, ' ')}}
|
||||||
|
|
||||||
|
- name: Setup GCC Toolchain
|
||||||
|
if: matrix.gcc_toolchain
|
||||||
|
run: |
|
||||||
|
GCC_TOOLCHAIN_ROOT="$HOME/gcc-toolchain"
|
||||||
|
echo "GCC_TOOLCHAIN_ROOT=\"$GCC_TOOLCHAIN_ROOT\"" >> $GITHUB_ENV
|
||||||
|
MULTIARCH_TRIPLET="$(dpkg-architecture -qDEB_HOST_MULTIARCH)"
|
||||||
|
mkdir -p "$GCC_TOOLCHAIN_ROOT"
|
||||||
|
ln -s /usr/include "$GCC_TOOLCHAIN_ROOT/include"
|
||||||
|
ln -s /usr/bin "$GCC_TOOLCHAIN_ROOT/bin"
|
||||||
|
mkdir -p "$GCC_TOOLCHAIN_ROOT/lib/gcc/$MULTIARCH_TRIPLET"
|
||||||
|
ln -s "/usr/lib/gcc/$MULTIARCH_TRIPLET/${{matrix.gcc_toolchain}}" "$GCC_TOOLCHAIN_ROOT/lib/gcc/$MULTIARCH_TRIPLET/${{matrix.gcc_toolchain}}"
|
||||||
|
|
||||||
|
- name: Setup Boost
|
||||||
|
run: |
|
||||||
|
echo GITHUB_REPOSITORY: $GITHUB_REPOSITORY
|
||||||
|
LIBRARY=${GITHUB_REPOSITORY#*/}
|
||||||
|
echo LIBRARY: $LIBRARY
|
||||||
|
echo "LIBRARY=$LIBRARY" >> $GITHUB_ENV
|
||||||
|
echo GITHUB_BASE_REF: $GITHUB_BASE_REF
|
||||||
|
echo GITHUB_REF: $GITHUB_REF
|
||||||
|
REF=${GITHUB_BASE_REF:-$GITHUB_REF}
|
||||||
|
REF=${REF#refs/heads/}
|
||||||
|
echo REF: $REF
|
||||||
|
BOOST_BRANCH=develop && [ "$REF" = "master" ] && BOOST_BRANCH=master || true
|
||||||
|
echo BOOST_BRANCH: $BOOST_BRANCH
|
||||||
|
BUILD_JOBS=$((nproc || sysctl -n hw.ncpu) 2> /dev/null)
|
||||||
|
echo "BUILD_JOBS=$BUILD_JOBS" >> $GITHUB_ENV
|
||||||
|
echo "CMAKE_BUILD_PARALLEL_LEVEL=$BUILD_JOBS" >> $GITHUB_ENV
|
||||||
|
DEPINST_ARGS=()
|
||||||
|
GIT_VERSION="$(git --version | sed -e 's/git version //')"
|
||||||
|
GIT_HAS_JOBS=1
|
||||||
|
if [ -f "/etc/debian_version" ]
|
||||||
|
then
|
||||||
|
if $(dpkg --compare-versions "$GIT_VERSION" lt 2.8.0)
|
||||||
|
then
|
||||||
|
GIT_HAS_JOBS=0
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
declare -a GIT_VER=(${GIT_VERSION//./ })
|
||||||
|
declare -a GIT_MIN_VER=(2 8 0)
|
||||||
|
for ((i=0; i<${#GIT_VER[@]}; i++))
|
||||||
|
do
|
||||||
|
if [ -z "${GIT_MIN_VER[i]}" ]
|
||||||
|
then
|
||||||
|
GIT_MIN_VER[i]=0
|
||||||
|
fi
|
||||||
|
if [ "${GIT_VER[i]}" -lt "${GIT_MIN_VER[i]}" ]
|
||||||
|
then
|
||||||
|
GIT_HAS_JOBS=0
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
if [ "$GIT_HAS_JOBS" -ne 0 ]
|
||||||
|
then
|
||||||
|
DEPINST_ARGS+=("--git_args" "--jobs $GIT_FETCH_JOBS")
|
||||||
|
fi
|
||||||
|
mkdir -p snapshot
|
||||||
|
cd snapshot
|
||||||
|
echo "Downloading library snapshot: https://github.com/${GITHUB_REPOSITORY}/archive/${GITHUB_SHA}.tar.gz"
|
||||||
|
curl -L --retry "$NET_RETRY_COUNT" -o "${LIBRARY}-${GITHUB_SHA}.tar.gz" "https://github.com/${GITHUB_REPOSITORY}/archive/${GITHUB_SHA}.tar.gz"
|
||||||
|
tar -xf "${LIBRARY}-${GITHUB_SHA}.tar.gz"
|
||||||
|
if [ ! -d "${LIBRARY}-${GITHUB_SHA}" ]
|
||||||
|
then
|
||||||
|
echo "Library snapshot does not contain the library directory ${LIBRARY}-${GITHUB_SHA}:"
|
||||||
|
ls -la
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
rm -f "${LIBRARY}-${GITHUB_SHA}.tar.gz"
|
||||||
|
cd ..
|
||||||
|
git clone -b "$BOOST_BRANCH" --depth 1 "https://github.com/boostorg/boost.git" "boost-root"
|
||||||
|
cd boost-root
|
||||||
|
mkdir -p libs
|
||||||
|
rm -rf "libs/$LIBRARY"
|
||||||
|
mv -f "../snapshot/${LIBRARY}-${GITHUB_SHA}" "libs/$LIBRARY"
|
||||||
|
rm -rf "../snapshot"
|
||||||
|
git submodule update --init tools/boostdep
|
||||||
|
DEPINST_ARGS+=("$LIBRARY")
|
||||||
|
python tools/boostdep/depinst/depinst.py "${DEPINST_ARGS[@]}"
|
||||||
|
if [ -z "${{matrix.cmake_tests}}" ]
|
||||||
|
then
|
||||||
|
./bootstrap.sh
|
||||||
|
./b2 headers
|
||||||
|
if [ -n "${{matrix.compiler}}" -o -n "$GCC_TOOLCHAIN_ROOT" ]
|
||||||
|
then
|
||||||
|
echo -n "using ${{matrix.toolset}} : : ${{matrix.compiler}}" > ~/user-config.jam
|
||||||
|
if [ -n "$GCC_TOOLCHAIN_ROOT" ]
|
||||||
|
then
|
||||||
|
echo -n " : <compileflags>\"--gcc-toolchain=$GCC_TOOLCHAIN_ROOT\" <linkflags>\"--gcc-toolchain=$GCC_TOOLCHAIN_ROOT\"" >> ~/user-config.jam
|
||||||
|
fi
|
||||||
|
echo " ;" >> ~/user-config.jam
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
if: matrix.cmake_tests == ''
|
||||||
|
run: |
|
||||||
|
cd boost-root
|
||||||
|
B2_ARGS=("-j" "$BUILD_JOBS" "toolset=${{matrix.toolset}}" "cxxstd=${{matrix.cxxstd}}")
|
||||||
|
if [ -n "${{matrix.build_variant}}" ]
|
||||||
|
then
|
||||||
|
B2_ARGS+=("variant=${{matrix.build_variant}}")
|
||||||
|
else
|
||||||
|
B2_ARGS+=("variant=$DEFAULT_BUILD_VARIANT")
|
||||||
|
fi
|
||||||
|
if [ -n "${{matrix.threading}}" ]
|
||||||
|
then
|
||||||
|
B2_ARGS+=("threading=${{matrix.threading}}")
|
||||||
|
fi
|
||||||
|
if [ -n "${{matrix.ubsan}}" ]
|
||||||
|
then
|
||||||
|
export UBSAN_OPTIONS="print_stacktrace=1"
|
||||||
|
B2_ARGS+=("cxxflags=-fsanitize=undefined -fno-sanitize-recover=undefined" "linkflags=-fsanitize=undefined -fuse-ld=gold" "define=UBSAN=1" "debug-symbols=on" "visibility=global")
|
||||||
|
fi
|
||||||
|
if [ -n "${{matrix.cxxflags}}" ]
|
||||||
|
then
|
||||||
|
B2_ARGS+=("cxxflags=${{matrix.cxxflags}}")
|
||||||
|
fi
|
||||||
|
if [ -n "${{matrix.linkflags}}" ]
|
||||||
|
then
|
||||||
|
B2_ARGS+=("linkflags=${{matrix.linkflags}}")
|
||||||
|
fi
|
||||||
|
B2_ARGS+=("libs/$LIBRARY/test")
|
||||||
|
./b2 "${B2_ARGS[@]}"
|
||||||
|
|
||||||
|
- name: Run CMake tests
|
||||||
|
if: matrix.cmake_tests
|
||||||
|
run: |
|
||||||
|
if [ -n "${{matrix.macosx_version_min}}" ]
|
||||||
|
then
|
||||||
|
export MACOSX_DEPLOYMENT_TARGET="${{matrix.macosx_version_min}}"
|
||||||
|
fi
|
||||||
|
cd boost-root
|
||||||
|
mkdir __build_static__ && cd __build_static__
|
||||||
|
cmake ../libs/$LIBRARY/test/test_cmake
|
||||||
|
cmake --build . --target boost_${LIBRARY}_cmake_self_test -j $BUILD_JOBS
|
||||||
|
cd ..
|
||||||
|
mkdir __build_shared__ && cd __build_shared__
|
||||||
|
cmake -DBUILD_SHARED_LIBS=On ../libs/$LIBRARY/test/test_cmake
|
||||||
|
cmake --build . --target boost_${LIBRARY}_cmake_self_test -j $BUILD_JOBS
|
||||||
|
|
||||||
|
windows:
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: cmd
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- toolset: msvc-14.3
|
||||||
|
cxxstd: "14,17,20,latest"
|
||||||
|
addrmd: 32,64
|
||||||
|
os: windows-2022
|
||||||
|
- toolset: clang-win
|
||||||
|
cxxstd: "14,17,latest"
|
||||||
|
addrmd: 32,64
|
||||||
|
os: windows-2022
|
||||||
|
- toolset: gcc
|
||||||
|
cxxstd: "11,14,17,20,23"
|
||||||
|
addrmd: 64
|
||||||
|
os: windows-2022
|
||||||
|
|
||||||
|
timeout-minutes: 20
|
||||||
|
runs-on: ${{matrix.os}}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Setup Boost
|
||||||
|
run: |
|
||||||
|
echo GITHUB_REPOSITORY: %GITHUB_REPOSITORY%
|
||||||
|
for /f %%i in ("%GITHUB_REPOSITORY%") do set LIBRARY=%%~nxi
|
||||||
|
echo LIBRARY: %LIBRARY%
|
||||||
|
echo LIBRARY=%LIBRARY%>>%GITHUB_ENV%
|
||||||
|
echo GITHUB_BASE_REF: %GITHUB_BASE_REF%
|
||||||
|
echo GITHUB_REF: %GITHUB_REF%
|
||||||
|
if "%GITHUB_BASE_REF%" == "" set GITHUB_BASE_REF=%GITHUB_REF%
|
||||||
|
set BOOST_BRANCH=develop
|
||||||
|
for /f %%i in ("%GITHUB_BASE_REF%") do if "%%~nxi" == "master" set BOOST_BRANCH=master
|
||||||
|
echo BOOST_BRANCH: %BOOST_BRANCH%
|
||||||
|
mkdir snapshot
|
||||||
|
cd snapshot
|
||||||
|
echo Downloading library snapshot: https://github.com/%GITHUB_REPOSITORY%/archive/%GITHUB_SHA%.zip
|
||||||
|
curl -L --retry %NET_RETRY_COUNT% -o "%LIBRARY%-%GITHUB_SHA%.zip" "https://github.com/%GITHUB_REPOSITORY%/archive/%GITHUB_SHA%.zip"
|
||||||
|
tar -xf "%LIBRARY%-%GITHUB_SHA%.zip"
|
||||||
|
if not exist "%LIBRARY%-%GITHUB_SHA%\" (
|
||||||
|
echo Library snapshot does not contain the library directory %LIBRARY%-%GITHUB_SHA%:
|
||||||
|
dir
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
del /f "%LIBRARY%-%GITHUB_SHA%.zip"
|
||||||
|
cd ..
|
||||||
|
git clone -b %BOOST_BRANCH% --depth 1 https://github.com/boostorg/boost.git boost-root
|
||||||
|
cd boost-root
|
||||||
|
if not exist "libs\" mkdir libs
|
||||||
|
if exist "libs\%LIBRARY%\" rmdir /s /q "libs\%LIBRARY%"
|
||||||
|
move /Y "..\snapshot\%LIBRARY%-%GITHUB_SHA%" "libs\%LIBRARY%"
|
||||||
|
rmdir /s /q "..\snapshot"
|
||||||
|
git submodule update --init tools/boostdep
|
||||||
|
python tools/boostdep/depinst/depinst.py --git_args "--jobs %GIT_FETCH_JOBS%" %LIBRARY%
|
||||||
|
cmd /c bootstrap
|
||||||
|
b2 -d0 headers
|
||||||
|
|
||||||
|
- name: Run tests
|
||||||
|
run: |
|
||||||
|
cd boost-root
|
||||||
|
if not "${{matrix.cxxstd}}" == "" set CXXSTD=cxxstd=${{matrix.cxxstd}}
|
||||||
|
if not "${{matrix.addrmd}}" == "" set ADDRMD=address-model=${{matrix.addrmd}}
|
||||||
|
if not "${{matrix.build_variant}}" == "" (set BUILD_VARIANT=variant=${{matrix.build_variant}}) else (set BUILD_VARIANT=variant=%DEFAULT_BUILD_VARIANT%)
|
||||||
|
b2 -j %NUMBER_OF_PROCESSORS% libs/%LIBRARY%/test toolset=${{matrix.toolset}} %CXXSTD% %ADDRMD% %BUILD_VARIANT% embed-manifest-via=linker
|
||||||
27
CMakeLists.txt
Normal file
27
CMakeLists.txt
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# 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
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.5...3.20)
|
||||||
|
|
||||||
|
project(boost_iterator VERSION "${BOOST_SUPERPROJECT_VERSION}" 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::core
|
||||||
|
Boost::detail
|
||||||
|
Boost::fusion
|
||||||
|
Boost::mpl
|
||||||
|
Boost::optional
|
||||||
|
Boost::type_traits
|
||||||
|
Boost::utility
|
||||||
|
)
|
||||||
27
README.md
Normal file
27
README.md
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# Boost.Iterator
|
||||||
|
|
||||||
|
Boost.Iterator, part of collection of the [Boost C++ Libraries](https://github.com/boostorg), provides tools for building and working with iterators in C++. The library also provides a number of iterator classes that can be used out of the box.
|
||||||
|
|
||||||
|
### Directories
|
||||||
|
|
||||||
|
* **doc** - Documentation sources
|
||||||
|
* **include** - Interface headers of Boost.Iterator
|
||||||
|
* **test** - Boost.Iterator unit tests
|
||||||
|
* **example** - Boost.Iterator usage examples
|
||||||
|
|
||||||
|
### More information
|
||||||
|
|
||||||
|
* [Documentation](https://boost.org/libs/iterator)
|
||||||
|
* [Report bugs](https://github.com/boostorg/iterator/issues/new). Be sure to mention Boost version, platform and compiler you're using. A small compilable code sample to reproduce the problem is always good as well.
|
||||||
|
* Submit your patches as [pull requests](https://github.com/boostorg/iterator/compare) against **develop** branch. Note that by submitting patches you agree to license your modifications under the [Boost Software License, Version 1.0](https://www.boost.org/LICENSE_1_0.txt).
|
||||||
|
|
||||||
|
### Build status
|
||||||
|
|
||||||
|
Branch | GitHub Actions | AppVeyor | Test Matrix | Dependencies |
|
||||||
|
:-------------: | -------------- | -------- | ----------- | ------------ |
|
||||||
|
[`master`](https://github.com/boostorg/iterator/tree/master) | [](https://github.com/boostorg/iterator/actions?query=branch%3Amaster) | [](https://ci.appveyor.com/project/Lastique/iterator/branch/master) | [](https://regression.boost.io/master/developer/iterator.html) | [](https://pdimov.github.io/boostdep-report/master/iterator.html)
|
||||||
|
[`develop`](https://github.com/boostorg/iterator/tree/develop) | [](https://github.com/boostorg/iterator/actions?query=branch%3Adevelop) | [](https://ci.appveyor.com/project/Lastique/iterator/branch/develop) | [](https://regression.boost.io/develop/developer/iterator.html) | [](https://pdimov.github.io/boostdep-report/develop/iterator.html)
|
||||||
|
|
||||||
|
### License
|
||||||
|
|
||||||
|
Distributed under the [Boost Software License, Version 1.0](https://www.boost.org/LICENSE_1_0.txt).
|
||||||
95
appveyor.yml
Normal file
95
appveyor.yml
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
# 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-14.0
|
||||||
|
CXXSTD: 14,latest
|
||||||
|
ADDRMD: 32,64
|
||||||
|
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||||
|
- TOOLSET: msvc-14.1
|
||||||
|
CXXSTD: 14,17,latest
|
||||||
|
ADDRMD: 32,64
|
||||||
|
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||||
|
- TOOLSET: msvc-14.2
|
||||||
|
ADDRMD: 32,64
|
||||||
|
CXXSTD: 14,17,20,latest
|
||||||
|
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
|
||||||
|
- TOOLSET: msvc-14.3
|
||||||
|
ADDRMD: 32,64
|
||||||
|
CXXSTD: 14,17,20,latest
|
||||||
|
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022
|
||||||
|
- TOOLSET: clang-win
|
||||||
|
ADDRMD: 32,64
|
||||||
|
CXXSTD: 14,17,latest
|
||||||
|
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
|
||||||
|
- TOOLSET: gcc
|
||||||
|
CXXSTD: 11,14,1z
|
||||||
|
ADDPATH: C:\cygwin\bin;
|
||||||
|
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||||
|
- TOOLSET: gcc
|
||||||
|
CXXSTD: 11,14,1z
|
||||||
|
ADDPATH: C:\cygwin64\bin;
|
||||||
|
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
|
||||||
|
- TOOLSET: gcc
|
||||||
|
CXXSTD: 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: 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
|
||||||
|
- TEST_CMAKE: 1
|
||||||
|
APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019
|
||||||
|
|
||||||
|
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%
|
||||||
|
|
||||||
|
for:
|
||||||
|
- matrix:
|
||||||
|
only: [TEST_CMAKE: 1]
|
||||||
|
test_script:
|
||||||
|
- mkdir __build_static__
|
||||||
|
- cd __build_static__
|
||||||
|
- cmake ../libs/iterator/test/test_cmake
|
||||||
|
- cmake --build . --target boost_iterator_cmake_self_test -j %NUMBER_OF_PROCESSORS%
|
||||||
|
- cd ..
|
||||||
|
- mkdir __build_shared__
|
||||||
|
- cd __build_shared__
|
||||||
|
- cmake -DBUILD_SHARED_LIBS=On ../libs/iterator/test/test_cmake
|
||||||
|
- cmake --build . --target boost_iterator_cmake_self_test -j %NUMBER_OF_PROCESSORS%
|
||||||
32
build.jam
Normal file
32
build.jam
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
# Copyright René Ferdinand Rivera Morell 2023-2024
|
||||||
|
# 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)
|
||||||
|
|
||||||
|
require-b2 5.2 ;
|
||||||
|
|
||||||
|
constant boost_dependencies :
|
||||||
|
/boost/assert//boost_assert
|
||||||
|
/boost/concept_check//boost_concept_check
|
||||||
|
/boost/config//boost_config
|
||||||
|
/boost/core//boost_core
|
||||||
|
/boost/detail//boost_detail
|
||||||
|
/boost/fusion//boost_fusion
|
||||||
|
/boost/mpl//boost_mpl
|
||||||
|
/boost/optional//boost_optional
|
||||||
|
/boost/type_traits//boost_type_traits
|
||||||
|
/boost/utility//boost_utility ;
|
||||||
|
|
||||||
|
project /boost/iterator
|
||||||
|
: common-requirements
|
||||||
|
<include>include
|
||||||
|
;
|
||||||
|
|
||||||
|
explicit
|
||||||
|
[ alias boost_iterator : : : : <library>$(boost_dependencies) ]
|
||||||
|
[ alias all : boost_iterator test ]
|
||||||
|
;
|
||||||
|
|
||||||
|
call-if : boost-library iterator
|
||||||
|
;
|
||||||
|
|
||||||
@@ -1,159 +0,0 @@
|
|||||||
#ifndef BOOST_ITERATOR_CATEGORIES_HPP
|
|
||||||
#define BOOST_ITERATOR_CATEGORIES_HPP
|
|
||||||
|
|
||||||
#include <boost/config.hpp>
|
|
||||||
#include <boost/type_traits/conversion_traits.hpp>
|
|
||||||
#include <boost/type_traits/cv_traits.hpp>
|
|
||||||
#include <boost/pending/ct_if.hpp>
|
|
||||||
#include <boost/detail/iterator.hpp>
|
|
||||||
|
|
||||||
namespace boost {
|
|
||||||
|
|
||||||
// Return Type Categories
|
|
||||||
struct readable_iterator_tag { };
|
|
||||||
struct writable_iterator_tag { };
|
|
||||||
struct swappable_iterator_tag { };
|
|
||||||
struct mutable_lvalue_iterator_tag :
|
|
||||||
virtual public writable_iterator_tag,
|
|
||||||
virtual public readable_iterator_tag { };
|
|
||||||
struct constant_lvalue_iterator_tag :
|
|
||||||
virtual public readable_iterator_tag { };
|
|
||||||
|
|
||||||
// Traversal Categories
|
|
||||||
struct forward_traversal_tag { };
|
|
||||||
struct bidirectional_traversal_tag : public forward_traversal_tag { };
|
|
||||||
struct random_access_traversal_tag : public bidirectional_traversal_tag { };
|
|
||||||
|
|
||||||
struct error_iterator_tag { };
|
|
||||||
|
|
||||||
// Inherit from iterator_base if your iterator defines its own
|
|
||||||
// return_category and traversal_category. Otherwise, the "old style"
|
|
||||||
// iterator category will be mapped to the return_category and
|
|
||||||
// traversal_category.
|
|
||||||
struct new_iterator_base { };
|
|
||||||
|
|
||||||
namespace detail {
|
|
||||||
|
|
||||||
struct return_category_from_nested_type {
|
|
||||||
template <typename Iterator> struct bind {
|
|
||||||
typedef typename Iterator::return_category type;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
struct traversal_category_from_nested_type {
|
|
||||||
template <typename Iterator> struct bind {
|
|
||||||
typedef typename Iterator::traversal_category type;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename ValueType>
|
|
||||||
struct choose_lvalue_return {
|
|
||||||
typedef typename ct_if<is_const<ValueType>::value,
|
|
||||||
boost::constant_lvalue_iterator_tag,
|
|
||||||
boost::mutable_lvalue_iterator_tag>::type type;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <typename Category, typename ValueType>
|
|
||||||
struct iter_category_to_return {
|
|
||||||
typedef typename ct_if<
|
|
||||||
is_convertible<Category*, std::forward_iterator_tag*>::value,
|
|
||||||
typename choose_lvalue_return<ValueType>::type,
|
|
||||||
typename ct_if<
|
|
||||||
is_convertible<Category*, std::input_iterator_tag*>::value,
|
|
||||||
boost::readable_iterator_tag,
|
|
||||||
typename ct_if<
|
|
||||||
is_convertible<Category*, std::output_iterator_tag*>::value,
|
|
||||||
boost::writable_iterator_tag,
|
|
||||||
boost::error_iterator_tag
|
|
||||||
>::type
|
|
||||||
>::type
|
|
||||||
>::type type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Category>
|
|
||||||
struct iter_category_to_traversal {
|
|
||||||
typedef typename ct_if<
|
|
||||||
is_convertible<Category*, std::random_access_iterator_tag*>::value,
|
|
||||||
random_access_traversal_tag,
|
|
||||||
typename ct_if<
|
|
||||||
is_convertible<Category*, std::bidirectional_iterator_tag*>::value,
|
|
||||||
bidirectional_traversal_tag,
|
|
||||||
forward_traversal_tag
|
|
||||||
>::type
|
|
||||||
>::type type;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct return_category_from_old_traits {
|
|
||||||
template <typename Iterator> class bind {
|
|
||||||
typedef boost::detail::iterator_traits<Iterator> OldTraits;
|
|
||||||
typedef typename OldTraits::iterator_category Cat;
|
|
||||||
typedef typename OldTraits::value_type value_type;
|
|
||||||
public:
|
|
||||||
typedef iter_category_to_return<Cat, value_type>::type type;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
struct traversal_category_from_old_traits {
|
|
||||||
template <typename Iterator> class bind {
|
|
||||||
typedef boost::detail::iterator_traits<Iterator> OldTraits;
|
|
||||||
typedef typename OldTraits::iterator_category Cat;
|
|
||||||
public:
|
|
||||||
typedef iter_category_to_traversal<Cat>::type type;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
class choose_return_category {
|
|
||||||
typedef typename ct_if<is_convertible<Iterator*,
|
|
||||||
new_iterator_base*>::value,
|
|
||||||
return_category_from_nested_type,
|
|
||||||
return_category_from_old_traits>::type Choice;
|
|
||||||
public:
|
|
||||||
typedef typename Choice:: template bind<Iterator>::type type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
class choose_traversal_category {
|
|
||||||
typedef typename ct_if<is_convertible<Iterator*,
|
|
||||||
new_iterator_base*>::value,
|
|
||||||
traversal_category_from_nested_type,
|
|
||||||
traversal_category_from_old_traits>::type Choice;
|
|
||||||
public:
|
|
||||||
typedef typename Choice:: template bind<Iterator>::type type;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace detail
|
|
||||||
|
|
||||||
template <class Iterator>
|
|
||||||
struct return_category {
|
|
||||||
typedef typename detail::choose_return_category<Iterator>::type type;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <class Iterator>
|
|
||||||
struct traversal_category {
|
|
||||||
typedef typename detail::choose_traversal_category<Iterator>::type type;
|
|
||||||
};
|
|
||||||
|
|
||||||
#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct return_category<T*>
|
|
||||||
{
|
|
||||||
typedef typename ct_if<is_const<T>::value,
|
|
||||||
constant_lvalue_iterator_tag,
|
|
||||||
mutable_lvalue_iterator_tag>::type type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct traversal_category<T*>
|
|
||||||
{
|
|
||||||
typedef random_access_traversal_tag type;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} // namespace boost
|
|
||||||
|
|
||||||
#endif // BOOST_ITERATOR_CATEGORIES_HPP
|
|
||||||
@@ -1,172 +0,0 @@
|
|||||||
#ifndef BOOST_ITERATOR_CONCEPTS_HPP
|
|
||||||
#define BOOST_ITERATOR_CONCEPTS_HPP
|
|
||||||
|
|
||||||
#include <boost/concept_check.hpp>
|
|
||||||
#include <boost/iterator_categories.hpp>
|
|
||||||
#include <boost/type_traits/conversion_traits.hpp>
|
|
||||||
#include <boost/static_assert.hpp>
|
|
||||||
|
|
||||||
namespace boost_concepts {
|
|
||||||
// Used a different namespace here (instead of "boost") so that the
|
|
||||||
// concept descriptions do not take for granted the names in
|
|
||||||
// namespace boost.
|
|
||||||
|
|
||||||
|
|
||||||
//===========================================================================
|
|
||||||
// Iterator Access Concepts
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
class ReadableIteratorConcept {
|
|
||||||
public:
|
|
||||||
typedef typename std::iterator_traits<Iterator>::value_type value_type;
|
|
||||||
typedef typename std::iterator_traits<Iterator>::reference reference;
|
|
||||||
typedef typename boost::return_category<Iterator>::type return_category;
|
|
||||||
|
|
||||||
void constraints() {
|
|
||||||
boost::function_requires< boost::SGIAssignableConcept<Iterator> >();
|
|
||||||
boost::function_requires< boost::EqualityComparableConcept<Iterator> >();
|
|
||||||
boost::function_requires<
|
|
||||||
boost::DefaultConstructibleConcept<Iterator> >();
|
|
||||||
|
|
||||||
BOOST_STATIC_ASSERT((boost::is_convertible<return_category*,
|
|
||||||
boost::readable_iterator_tag*>::value));
|
|
||||||
|
|
||||||
reference r = *i; // or perhaps read(x)
|
|
||||||
value_type v(r);
|
|
||||||
boost::ignore_unused_variable_warning(v);
|
|
||||||
}
|
|
||||||
Iterator i;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Iterator, typename ValueType>
|
|
||||||
class WritableIteratorConcept {
|
|
||||||
public:
|
|
||||||
typedef typename boost::return_category<Iterator>::type return_category;
|
|
||||||
|
|
||||||
void constraints() {
|
|
||||||
boost::function_requires< boost::SGIAssignableConcept<Iterator> >();
|
|
||||||
boost::function_requires< boost::EqualityComparableConcept<Iterator> >();
|
|
||||||
boost::function_requires<
|
|
||||||
boost::DefaultConstructibleConcept<Iterator> >();
|
|
||||||
|
|
||||||
BOOST_STATIC_ASSERT((boost::is_convertible<return_category*,
|
|
||||||
boost::writable_iterator_tag*>::value));
|
|
||||||
|
|
||||||
*i = v; // a good alternative could be something like write(x, v)
|
|
||||||
}
|
|
||||||
ValueType v;
|
|
||||||
Iterator i;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
class ConstantLvalueIteratorConcept {
|
|
||||||
public:
|
|
||||||
typedef typename std::iterator_traits<Iterator>::value_type value_type;
|
|
||||||
typedef typename std::iterator_traits<Iterator>::reference reference;
|
|
||||||
typedef typename boost::return_category<Iterator>::type return_category;
|
|
||||||
|
|
||||||
void constraints() {
|
|
||||||
boost::function_requires< ReadableIteratorConcept<Iterator> >();
|
|
||||||
|
|
||||||
BOOST_STATIC_ASSERT((boost::is_convertible<return_category*,
|
|
||||||
boost::constant_lvalue_iterator_tag*>::value));
|
|
||||||
|
|
||||||
BOOST_STATIC_ASSERT((boost::is_same<reference,
|
|
||||||
const value_type&>::value));
|
|
||||||
|
|
||||||
reference v = *i;
|
|
||||||
boost::ignore_unused_variable_warning(v);
|
|
||||||
}
|
|
||||||
Iterator i;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
class MutableLvalueIteratorConcept {
|
|
||||||
public:
|
|
||||||
typedef typename std::iterator_traits<Iterator>::value_type value_type;
|
|
||||||
typedef typename std::iterator_traits<Iterator>::reference reference;
|
|
||||||
typedef typename boost::return_category<Iterator>::type return_category;
|
|
||||||
|
|
||||||
void constraints() {
|
|
||||||
boost::function_requires< ReadableIteratorConcept<Iterator> >();
|
|
||||||
boost::function_requires<
|
|
||||||
WritableIteratorConcept<Iterator, value_type> >();
|
|
||||||
|
|
||||||
BOOST_STATIC_ASSERT((boost::is_convertible<return_category*,
|
|
||||||
boost::mutable_lvalue_iterator_tag*>::value));
|
|
||||||
|
|
||||||
BOOST_STATIC_ASSERT((boost::is_same<reference, value_type&>::value));
|
|
||||||
|
|
||||||
reference v = *i;
|
|
||||||
boost::ignore_unused_variable_warning(v);
|
|
||||||
}
|
|
||||||
Iterator i;
|
|
||||||
};
|
|
||||||
|
|
||||||
//===========================================================================
|
|
||||||
// Iterator Traversal Concepts
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
class ForwardIteratorConcept {
|
|
||||||
public:
|
|
||||||
typedef typename boost::traversal_category<Iterator>::type traversal_category;
|
|
||||||
|
|
||||||
void constraints() {
|
|
||||||
boost::function_requires< boost::SGIAssignableConcept<Iterator> >();
|
|
||||||
boost::function_requires< boost::EqualityComparableConcept<Iterator> >();
|
|
||||||
boost::function_requires<
|
|
||||||
boost::DefaultConstructibleConcept<Iterator> >();
|
|
||||||
|
|
||||||
BOOST_STATIC_ASSERT((boost::is_convertible<traversal_category*,
|
|
||||||
boost::forward_traversal_tag*>::value));
|
|
||||||
++i;
|
|
||||||
(void)i++;
|
|
||||||
}
|
|
||||||
Iterator i;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
class BidirectionalIteratorConcept {
|
|
||||||
public:
|
|
||||||
typedef typename boost::traversal_category<Iterator>::type traversal_category;
|
|
||||||
|
|
||||||
void constraints() {
|
|
||||||
boost::function_requires< ForwardIteratorConcept<Iterator> >();
|
|
||||||
|
|
||||||
BOOST_STATIC_ASSERT((boost::is_convertible<traversal_category*,
|
|
||||||
boost::bidirectional_traversal_tag*>::value));
|
|
||||||
|
|
||||||
--i;
|
|
||||||
(void)i--;
|
|
||||||
}
|
|
||||||
Iterator i;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
class RandomAccessIteratorConcept {
|
|
||||||
public:
|
|
||||||
typedef typename boost::traversal_category<Iterator>::type traversal_category;
|
|
||||||
typedef typename std::iterator_traits<Iterator>::difference_type
|
|
||||||
difference_type;
|
|
||||||
|
|
||||||
void constraints() {
|
|
||||||
boost::function_requires< BidirectionalIteratorConcept<Iterator> >();
|
|
||||||
|
|
||||||
BOOST_STATIC_ASSERT((boost::is_convertible<traversal_category*,
|
|
||||||
boost::random_access_traversal_tag*>::value));
|
|
||||||
|
|
||||||
i += n;
|
|
||||||
i = i + n;
|
|
||||||
i = n + i;
|
|
||||||
i -= n;
|
|
||||||
i = i - n;
|
|
||||||
n = i - j;
|
|
||||||
}
|
|
||||||
difference_type n;
|
|
||||||
Iterator i, j;
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace boost_concepts
|
|
||||||
|
|
||||||
|
|
||||||
#endif // BOOST_ITERATOR_CONCEPTS_HPP
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
#include <boost/iterator_concepts.hpp>
|
|
||||||
#include <boost/operators.hpp>
|
|
||||||
|
|
||||||
struct new_iterator
|
|
||||||
: public boost::iterator<std::random_access_iterator_tag, int>,
|
|
||||||
public boost::new_iterator_base
|
|
||||||
{
|
|
||||||
typedef boost::random_access_traversal_tag traversal_category;
|
|
||||||
typedef boost::mutable_lvalue_iterator_tag return_category;
|
|
||||||
|
|
||||||
int& operator*() const { return *m_x; }
|
|
||||||
new_iterator& operator++() { return *this; }
|
|
||||||
new_iterator operator++(int) { return *this; }
|
|
||||||
new_iterator& operator--() { return *this; }
|
|
||||||
new_iterator operator--(int) { return *this; }
|
|
||||||
new_iterator& operator+=(std::ptrdiff_t) { return *this; }
|
|
||||||
new_iterator operator+(std::ptrdiff_t) { return *this; }
|
|
||||||
new_iterator& operator-=(std::ptrdiff_t) { return *this; }
|
|
||||||
std::ptrdiff_t operator-(const new_iterator&) const { return 0; }
|
|
||||||
new_iterator operator-(std::ptrdiff_t) const { return *this; }
|
|
||||||
bool operator==(const new_iterator&) const { return false; }
|
|
||||||
bool operator!=(const new_iterator&) const { return false; }
|
|
||||||
bool operator<(const new_iterator&) const { return false; }
|
|
||||||
int* m_x;
|
|
||||||
};
|
|
||||||
new_iterator operator+(std::ptrdiff_t, new_iterator x) { return x; }
|
|
||||||
|
|
||||||
struct old_iterator
|
|
||||||
: public boost::iterator<std::random_access_iterator_tag, int>
|
|
||||||
{
|
|
||||||
int& operator*() const { return *m_x; }
|
|
||||||
old_iterator& operator++() { return *this; }
|
|
||||||
old_iterator operator++(int) { return *this; }
|
|
||||||
old_iterator& operator--() { return *this; }
|
|
||||||
old_iterator operator--(int) { return *this; }
|
|
||||||
old_iterator& operator+=(std::ptrdiff_t) { return *this; }
|
|
||||||
old_iterator operator+(std::ptrdiff_t) { return *this; }
|
|
||||||
old_iterator& operator-=(std::ptrdiff_t) { return *this; }
|
|
||||||
old_iterator operator-(std::ptrdiff_t) const { return *this; }
|
|
||||||
std::ptrdiff_t operator-(const old_iterator&) const { return 0; }
|
|
||||||
bool operator==(const old_iterator&) const { return false; }
|
|
||||||
bool operator!=(const old_iterator&) const { return false; }
|
|
||||||
bool operator<(const old_iterator&) const { return false; }
|
|
||||||
int* m_x;
|
|
||||||
};
|
|
||||||
old_iterator operator+(std::ptrdiff_t, old_iterator x) { return x; }
|
|
||||||
|
|
||||||
int
|
|
||||||
main()
|
|
||||||
{
|
|
||||||
#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
|
|
||||||
boost::function_requires<
|
|
||||||
boost_concepts::MutableLvalueIteratorConcept<int*> >();
|
|
||||||
boost::function_requires<
|
|
||||||
boost_concepts::RandomAccessIteratorConcept<int*> >();
|
|
||||||
|
|
||||||
boost::function_requires<
|
|
||||||
boost_concepts::ConstantLvalueIteratorConcept<const int*> >();
|
|
||||||
boost::function_requires<
|
|
||||||
boost_concepts::RandomAccessIteratorConcept<const int*> >();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
boost::function_requires<
|
|
||||||
boost_concepts::MutableLvalueIteratorConcept<new_iterator> >();
|
|
||||||
boost::function_requires<
|
|
||||||
boost_concepts::RandomAccessIteratorConcept<new_iterator> >();
|
|
||||||
|
|
||||||
boost::function_requires<
|
|
||||||
boost_concepts::MutableLvalueIteratorConcept<old_iterator> >();
|
|
||||||
boost::function_requires<
|
|
||||||
boost_concepts::RandomAccessIteratorConcept<old_iterator> >();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -1,160 +0,0 @@
|
|||||||
<html>
|
|
||||||
<!--
|
|
||||||
-- Copyright (c) Jeremy Siek 2000,2001
|
|
||||||
--
|
|
||||||
-- Permission to use, copy, modify, distribute and sell this software
|
|
||||||
-- and its documentation for any purpose is hereby granted without fee,
|
|
||||||
-- provided that the above copyright notice appears in all copies and
|
|
||||||
-- that both that copyright notice and this permission notice appear
|
|
||||||
-- in supporting documentation. I make no representations about the
|
|
||||||
-- suitability of this software for any purpose. It is provided "as is"
|
|
||||||
-- without express or implied warranty.
|
|
||||||
-->
|
|
||||||
<head>
|
|
||||||
<title>Boost Iterator Traits</title>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
|
||||||
ALINK="#ff0000">
|
|
||||||
<IMG SRC="../../../../c++boost.gif"
|
|
||||||
ALT="C++ Boost" width="277" height="86">
|
|
||||||
<BR Clear>
|
|
||||||
|
|
||||||
<h1>Boost Iterator Category Traits</h1>
|
|
||||||
Header <tt><a href="../../boost/iterator_categories.hpp">boost/iterator_categories.hpp</a></tt>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The <tt>boost::traversal_category</tt> and
|
|
||||||
<tt>boost::return_category</tt> traits classes provides access to the
|
|
||||||
category tags for iterators that model the Boost <a
|
|
||||||
href="./iterator_concepts.htm">Iterator Concepts</a>, which are a
|
|
||||||
replacement for the iterator requirements in the C++ standard. The
|
|
||||||
other associated types of the Boost iterator concepts are accessed
|
|
||||||
through the <tt>std::iterator_traits</tt> class.
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li><tt>traversal_category<Iter>::type</tt> Can the iterator go forward, backward, etc.?
|
|
||||||
<li><tt>return_category<Iter>::type</tt> Is the iterator read or write only?
|
|
||||||
Is the dereferenced type an lvalue?
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
An important feature of the <tt>boost::traversal_category</tt> and
|
|
||||||
<tt>boost::return_category</tt> classes is that they are <b>backwards
|
|
||||||
compatible</b>, i.e., they automatically work for iterators for which
|
|
||||||
there are valid definitions of <tt>std::iterator_traits</tt>. The old
|
|
||||||
<tt>iterator_category</tt> is mapped to the appropriate traversal and
|
|
||||||
return categories.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
When creating a new iterator type that is meant to work with
|
|
||||||
<tt>boost::traversal_category</tt> and
|
|
||||||
<tt>boost::return_category</tt>, you can either create a
|
|
||||||
specialization of these classes for your iterator type, or you can
|
|
||||||
provide all the necessary associated types as nested typedefs. In
|
|
||||||
this case, your iterator class will need to inherit from
|
|
||||||
<tt>new_iterator_base</tt> to let the category traits know
|
|
||||||
that it will be able to find typedefs for <tt>traversal_category</tt>
|
|
||||||
and <tt>return_category</tt> in you iterator class.
|
|
||||||
|
|
||||||
|
|
||||||
Each of the new iterator requirements will need a category tag.
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
namespace boost {
|
|
||||||
|
|
||||||
// Return Type Categories
|
|
||||||
struct readable_iterator_tag { };
|
|
||||||
struct writable_iterator_tag { };
|
|
||||||
struct swappable_iterator_tag { };
|
|
||||||
struct mutable_lvalue_iterator_tag : virtual public writable_iterator_tag,
|
|
||||||
virtual public readable_iterator_tag { };
|
|
||||||
struct constant_lvalue_iterator_tag : public readable_iterator_tag { };
|
|
||||||
|
|
||||||
// Traversal Categories
|
|
||||||
struct forward_traversal_tag { };
|
|
||||||
struct bidirectional_traversal_tag : public forward_traversal_tag { };
|
|
||||||
struct random_access_traversal_tag : public bidirectional_traversal_tag { };
|
|
||||||
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The following is pseudo-code for the iterator category traits classes.
|
|
||||||
|
|
||||||
<pre>
|
|
||||||
namespace boost {
|
|
||||||
|
|
||||||
<i>// Inherit from iterator_base if your iterator defines its own
|
|
||||||
// return_category and traversal_category. Otherwise, the "old style"
|
|
||||||
// iterator category will be mapped to the return_category and
|
|
||||||
// traversal_category.</i>
|
|
||||||
struct new_iterator_base { };
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
struct return_category
|
|
||||||
{
|
|
||||||
<b><i>// Pseudo-code</i></b>
|
|
||||||
if (Iterator inherits from new_iterator_base) {
|
|
||||||
typedef typename Iterator::return_category type;
|
|
||||||
} else {
|
|
||||||
typedef std::iterator_traits<Iterator> OldTraits;
|
|
||||||
typedef typename OldTraits::iterator_category Cat;
|
|
||||||
if (Cat inherits from std::forward_iterator_tag)
|
|
||||||
if (is-const(T))
|
|
||||||
typedef boost::constant_lvalue_iterator_tag type;
|
|
||||||
else
|
|
||||||
typedef boost::mutable_lvalue_iterator_tag type;
|
|
||||||
else if (Cat inherits from std::input_iterator_tag)
|
|
||||||
typedef boost::readable_iterator_tag type;
|
|
||||||
else if (Cat inherits from std::output_iterator_tag)
|
|
||||||
typedef boost::writable_iterator_tag type;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct return_category<T*>
|
|
||||||
{
|
|
||||||
<b><i>// Pseudo-code</i></b>
|
|
||||||
if (is-const(T))
|
|
||||||
typedef boost::constant_lvalue_iterator_tag type;
|
|
||||||
else
|
|
||||||
typedef boost::mutable_lvalue_iterator_tag type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
struct traversal_category
|
|
||||||
{
|
|
||||||
<b><i>// Pseudo-code</i></b>
|
|
||||||
if (Iterator inherits from new_iterator_base) {
|
|
||||||
typedef typename Iterator::traversal_category type;
|
|
||||||
} else {
|
|
||||||
typedef std::iterator_traits<Iterator> OldTraits;
|
|
||||||
typedef typename OldTraits::iterator_category Cat;
|
|
||||||
|
|
||||||
if (Cat inherits from std::random_access_iterator_tag)
|
|
||||||
typedef boost::random_access_traversal_tag type;
|
|
||||||
else if (Cat inherits from std::bidirectional_iterator_tag)
|
|
||||||
typedef boost::bidirectional_traversal_tag type;
|
|
||||||
else if (Cat inherits from std::forward_iterator_tag)
|
|
||||||
typedef boost::forward_traversal_tag type;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T>
|
|
||||||
struct traversal_category<T*>
|
|
||||||
{
|
|
||||||
typedef boost::random_access_traversal_tag type;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
</pre>
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<address><a href="mailto:jsiek@lsc.nd.edu">jeremy siek</a></address>
|
|
||||||
<!-- Created: Sun Mar 18 14:06:57 EST 2001 -->
|
|
||||||
<!-- hhmts start -->
|
|
||||||
Last modified: Mon Mar 19 12:59:30 EST 2001
|
|
||||||
<!-- hhmts end -->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
#FIG 3.2
|
|
||||||
Landscape
|
|
||||||
Center
|
|
||||||
Inches
|
|
||||||
Letter
|
|
||||||
100.00
|
|
||||||
Single
|
|
||||||
-2
|
|
||||||
1200 2
|
|
||||||
6 150 2325 4275 4350
|
|
||||||
2 1 0 1 0 7 100 0 -1 4.000 0 0 -1 1 0 2
|
|
||||||
1 1 1.00 60.00 120.00
|
|
||||||
1725 4050 1725 3450
|
|
||||||
2 1 0 1 0 7 100 0 -1 4.000 0 0 -1 1 0 2
|
|
||||||
1 1 1.00 60.00 120.00
|
|
||||||
1725 3150 1725 2550
|
|
||||||
4 0 0 100 0 19 18 0.0000 4 210 3180 375 2550 ForwardTraversalIterator\001
|
|
||||||
4 0 0 100 0 19 18 0.0000 4 210 3765 225 3450 BidirectionalTraversalIterator\001
|
|
||||||
4 0 0 100 0 19 18 0.0000 4 210 4125 150 4350 RandomAccessTraversalIterator\001
|
|
||||||
-6
|
|
||||||
2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
|
|
||||||
1 1 1.00 60.00 120.00
|
|
||||||
4800 3600 4800 2400
|
|
||||||
2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
|
|
||||||
1 1 1.00 60.00 120.00
|
|
||||||
6900 3000 5400 2400
|
|
||||||
2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
|
|
||||||
1 1 1.00 60.00 120.00
|
|
||||||
6900 3000 7500 2400
|
|
||||||
2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
|
|
||||||
1 1 1.00 60.00 120.00
|
|
||||||
6900 3000 9075 2475
|
|
||||||
4 0 0 100 0 19 18 0.0000 4 210 2040 6600 2400 WritableIterator\001
|
|
||||||
4 0 0 100 0 19 18 0.0000 4 210 2145 3900 2400 ReadableIterator\001
|
|
||||||
4 0 0 50 0 19 18 0.0000 4 210 2835 5700 3300 MutableLvalueIterator\001
|
|
||||||
4 0 0 50 0 19 18 0.0000 4 270 2355 9075 2400 SwappableIterator\001
|
|
||||||
4 0 0 50 0 19 18 0.0000 4 210 2970 3825 3900 ConstantLvalueIterator\001
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 3.2 KiB |
@@ -1,663 +0,0 @@
|
|||||||
<HTML>
|
|
||||||
<!--
|
|
||||||
-- Copyright (c) Jeremy Siek 2000
|
|
||||||
--
|
|
||||||
-- Permission to use, copy, modify, distribute and sell this software
|
|
||||||
-- and its documentation for any purpose is hereby granted without fee,
|
|
||||||
-- provided that the above copyright notice appears in all copies and
|
|
||||||
-- that both that copyright notice and this permission notice appear
|
|
||||||
-- in supporting documentation. I make no representations about the
|
|
||||||
-- suitability of this software for any purpose. It is provided "as is"
|
|
||||||
-- without express or implied warranty.
|
|
||||||
-->
|
|
||||||
<!--
|
|
||||||
-- Copyright (c) 1996-1999
|
|
||||||
-- Silicon Graphics Computer Systems, Inc.
|
|
||||||
--
|
|
||||||
-- Permission to use, copy, modify, distribute and sell this software
|
|
||||||
-- and its documentation for any purpose is hereby granted without fee,
|
|
||||||
-- provided that the above copyright notice appears in all copies and
|
|
||||||
-- that both that copyright notice and this permission notice appear
|
|
||||||
-- in supporting documentation. Silicon Graphics makes no
|
|
||||||
-- representations about the suitability of this software for any
|
|
||||||
-- purpose. It is provided "as is" without express or implied warranty.
|
|
||||||
--
|
|
||||||
-- Copyright (c) 1994
|
|
||||||
-- Hewlett-Packard Company
|
|
||||||
--
|
|
||||||
-- Permission to use, copy, modify, distribute and sell this software
|
|
||||||
-- and its documentation for any purpose is hereby granted without fee,
|
|
||||||
-- provided that the above copyright notice appears in all copies and
|
|
||||||
-- that both that copyright notice and this permission notice appear
|
|
||||||
-- in supporting documentation. Hewlett-Packard Company makes no
|
|
||||||
-- representations about the suitability of this software for any
|
|
||||||
-- purpose. It is provided "as is" without express or implied warranty.
|
|
||||||
--
|
|
||||||
-->
|
|
||||||
<Head>
|
|
||||||
<Title>Iterator Concepts</Title>
|
|
||||||
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b"
|
|
||||||
ALINK="#ff0000">
|
|
||||||
<IMG SRC="../../../../c++boost.gif"
|
|
||||||
ALT="C++ Boost" width="277" height="86">
|
|
||||||
|
|
||||||
<BR Clear>
|
|
||||||
|
|
||||||
|
|
||||||
<h1>Iterator Concepts</h1>
|
|
||||||
|
|
||||||
<p>The standard iterator categories and requirements are flawed because
|
|
||||||
they use a single hierarchy of requirements to address two orthogonal
|
|
||||||
issues: <b><i>iterator traversal</i></b> and <b><i>dereference return
|
|
||||||
type</i></b>. The current iterator requirement hierarchy is mainly
|
|
||||||
geared towards iterator traversal (hence the category names), while
|
|
||||||
requirements that address dereference return type sneak in at various
|
|
||||||
places.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
The iterator requirements should be separated into two hierarchies.
|
|
||||||
One set of concepts handles the return type semantics:
|
|
||||||
<ul>
|
|
||||||
<li><a href="#concept:ReadableIterator">Readable Iterator</a></li>
|
|
||||||
<li><a href="#concept:WritableIterator">Writable Iterator</a></li>
|
|
||||||
<li><a href="#concept:SwappableIterator">Swappable Iterator</a></li>
|
|
||||||
<li><a href="#concept:ConstantLvalueIterator">Constant Lvalue Iterator</a></li>
|
|
||||||
<li><a href="#concept:MutableLvalueIterator">Mutable Lvalue Iterator</a></li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
The other set of concepts handles iterator traversal:
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li><a href="#concept:ForwardTraversalIterator">Forward Traversal Iterator</a></li>
|
|
||||||
<li><a href="#concept:BidirectionalTraversalIterator">Bidirectional Traversal Iterator</a></li>
|
|
||||||
<li><a href="#concept:RandomAccessTraversalIterator">Random Access Traversal Iterator</a></li>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
The current Input Iterator and Output Iterator requirements will
|
|
||||||
continue to be used as is. Note that Input Iterator implies Readable
|
|
||||||
Iterator and Output Iterator implies Writable Iterator.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Note: we considered defining a Single-Pass Iterator, which could be
|
|
||||||
combined with Readable or Writable Iterator to replace the Input and
|
|
||||||
Output Iterator requirements. We rejected this idea because there are
|
|
||||||
some differences between Input and Output Iterators that make it hard
|
|
||||||
to merge them: for example Input Iterator requires Equality Comparable
|
|
||||||
while Output Iterator does not.
|
|
||||||
|
|
||||||
|
|
||||||
<p></p>
|
|
||||||
<DIV ALIGN="CENTER"><A NAME="fig:graph-concepts"></A></A>
|
|
||||||
<TABLE>
|
|
||||||
<CAPTION ALIGN="TOP"><STRONG>Figure 1:</STRONG>
|
|
||||||
The iterator concepts and refinement relationships.
|
|
||||||
</CAPTION>
|
|
||||||
<TR><TD><IMG SRC="./iterator_concepts.gif" ></TD></TR>
|
|
||||||
</TABLE>
|
|
||||||
</DIV>
|
|
||||||
<p></p>
|
|
||||||
|
|
||||||
|
|
||||||
<h2>Relationship with the standard iterator concepts</h2>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
std::Input Iterator implies boost::ReadableIterator.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
std::Output Iterator implies boost::Writable Iterator.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
std::Forward Iterator refines boost::Forward Iterator and
|
|
||||||
boost::Constant Lvalue Iterator or boost::Mutable Lvalue Iterator.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
std::Bidirectional Iterator refines boost::Bidirectional Iterator and
|
|
||||||
boost::Constant Lvalue Iterator or boost::Mutable Lvalue Iterator.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
std::Random Access Iterator refines boost::Random Access Iterator and
|
|
||||||
boost::Constant Lvalue Iterator or boost::Mutable Lvalue Iterator.
|
|
||||||
|
|
||||||
|
|
||||||
<h3>Notation</h3>
|
|
||||||
<Table>
|
|
||||||
<tr>
|
|
||||||
<td><tt>X</tt></td>
|
|
||||||
<td>The iterator type.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><tt>T</tt></td>
|
|
||||||
<td>The value type of <tt>X</tt>, i.e., <tt>std::iterator_traits<X>::value_type</tt>.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><tt>x</tt>, <tt>y</tt></td>
|
|
||||||
<td>An object of type <tt>X</tt>.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><tt>t</tt></td>
|
|
||||||
<td>An object of type <tt>T</tt>.</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<!--------------------------------------------------------------------------->
|
|
||||||
|
|
||||||
<H3><A NAME="concept:ReadableIterator"></A>
|
|
||||||
Readable Iterator
|
|
||||||
</H3>
|
|
||||||
|
|
||||||
A Readable Iterator is an iterator that dereferences to produce an
|
|
||||||
rvalue that is convertible to the <tt>value_type</tt> of the
|
|
||||||
iterator.
|
|
||||||
|
|
||||||
<h3>Associated Types</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Value type</td>
|
|
||||||
<td><tt>std::iterator_traits<X>::value_type</tt></td>
|
|
||||||
<td>The type of the objects pointed to by the iterator.</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Reference type</td>
|
|
||||||
<td><tt>std::iterator_traits<X>::reference</tt></td>
|
|
||||||
<td>
|
|
||||||
The return type of dereferencing the iterator. This
|
|
||||||
type must be convertible to <tt>T</tt>.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Return Category</td>
|
|
||||||
<td><tt>std::return_category<X>::type</tt></td>
|
|
||||||
<td>
|
|
||||||
A type convertible to <tt>std::readable_iterator_tag</tt>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</Table>
|
|
||||||
|
|
||||||
<h3>Refinement of</h3>
|
|
||||||
|
|
||||||
<A href="http://www.boost.org/libs/utility/CopyConstructible.html">Copy Constructible</A>
|
|
||||||
|
|
||||||
<h3>Valid expressions</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
<tr><TH>Name</TH><TH>Expression</TH><TH>Type requirements</TH><TH>Return type</TH></tr>
|
|
||||||
<tr>
|
|
||||||
<td>Dereference</td>
|
|
||||||
<td><tt>*x</tt></td>
|
|
||||||
<td> </td>
|
|
||||||
<td><tt>std::iterator_traits<X>::reference</tt></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Member access</td>
|
|
||||||
<td><tt>x->m</tt></td>
|
|
||||||
<td><tt>T</tt> is a type with a member named <tt>m</tt>.</td>
|
|
||||||
<td>
|
|
||||||
If <tt>m</tt> is a data member, the type of <tt>m</tt>.
|
|
||||||
If <tt>m</tt> is a member function, the return type of <tt>m</tt>.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<!--------------------------------------------------------------------------->
|
|
||||||
|
|
||||||
<H3><A NAME="concept:WritableIterator"></A>
|
|
||||||
Writable Iterator
|
|
||||||
</H3>
|
|
||||||
|
|
||||||
A Writable Iterator is an iterator that can be used to store a value
|
|
||||||
using the dereference-assignment expression.
|
|
||||||
|
|
||||||
<h3>Definitions</h3>
|
|
||||||
|
|
||||||
If <tt>x</tt> is an Writable Iterator of type <tt>X</tt>, then the
|
|
||||||
expression <tt>*x = a;</tt> stores the value <tt>a</tt> into
|
|
||||||
<tt>x</tt>. Note that <tt>operator=</tt>, like other C++ functions,
|
|
||||||
may be overloaded; it may, in fact, even be a template function. In
|
|
||||||
general, then, <tt>a</tt> may be any of several different types. A
|
|
||||||
type <tt>A</tt> belongs to the <i>set of value types</i> of <tt>X</tt>
|
|
||||||
if, for an object <tt>a</tt> of type <tt>A</tt>, <tt>*x = a;</tt> is
|
|
||||||
well-defined and does not require performing any non-trivial
|
|
||||||
conversions on <tt>a</tt>.
|
|
||||||
|
|
||||||
<h3>Associated Types</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Return Category</td>
|
|
||||||
<td><tt>std::return_category<X>::type</tt></td>
|
|
||||||
<td>
|
|
||||||
A type convertible to <tt>std::writable_iterator_tag</tt>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</Table>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<h3>Refinement of</h3>
|
|
||||||
|
|
||||||
<A href="http://www.boost.org/libs/utility/CopyConstructible.html">Copy Constructible</A>
|
|
||||||
|
|
||||||
<h3>Valid expressions</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
<tr>
|
|
||||||
<TH>Name</TH><TH>Expression</TH><TH>Return type</TH>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Dereference assignment</td>
|
|
||||||
<td><tt>*x = a</tt></td>
|
|
||||||
<td>unspecified</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<!--------------------------------------------------------------------------->
|
|
||||||
|
|
||||||
<H3><A NAME="concept:SwappableIterator"></A>
|
|
||||||
Swappable Iterator
|
|
||||||
</H3>
|
|
||||||
|
|
||||||
A Swappable Iterator is an iterator whose dereferenced values can be
|
|
||||||
swapped.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Note: the requirements for Swappable Iterator are dependent on the
|
|
||||||
issues surrounding <tt>std::swap()</tt> being resolved. Here we assume
|
|
||||||
that the issue will be resolved by allowing the overload of
|
|
||||||
<tt>std::swap()</tt> for user-defined types.
|
|
||||||
|
|
||||||
<p>
|
|
||||||
Note: Readable Iterator and Writable Iterator combined implies
|
|
||||||
Swappable Iterator because of the fully templated
|
|
||||||
<tt>std::swap()</tt>. However, Swappable Iterator does not imply
|
|
||||||
Readable Iterator nor Writable Iterator.
|
|
||||||
|
|
||||||
<h3>Associated Types</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Return Category</td>
|
|
||||||
<td><tt>std::return_category<X>::type</tt></td>
|
|
||||||
<td>
|
|
||||||
A type convertible to <tt>std::swappable_iterator_tag</tt>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</Table>
|
|
||||||
|
|
||||||
|
|
||||||
<h3>Valid expressions</h3>
|
|
||||||
|
|
||||||
Of the two valid expressions listed below, only one <b>OR</b> the
|
|
||||||
other is required. If <tt>std::iter_swap()</tt> is overloaded for
|
|
||||||
<tt>X</tt> then <tt>std::swap()</tt> is not required. If
|
|
||||||
<tt>std::iter_swap()</tt> is not overloaded for <tt>X</tt> then the
|
|
||||||
default (fully templated) version is used, which will call
|
|
||||||
<tt>std::swap()</tt> (this means changing the current requirements for
|
|
||||||
<tt>std::iter_swap()</tt>).
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<Table border>
|
|
||||||
<tr>
|
|
||||||
<TH>Name</TH><TH>Expression</TH><TH>Return type</TH>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Iterator Swap</td>
|
|
||||||
<td><tt>std::iter_swap(x, y)</tt></td>
|
|
||||||
<td>void</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Dereference and Swap</td>
|
|
||||||
<td><tt>std::swap(*x, *y)</tt></td>
|
|
||||||
<td>void</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<!--------------------------------------------------------------------------->
|
|
||||||
|
|
||||||
<H3><A NAME="concept:ConstantLvalueIterator"></A>
|
|
||||||
Constant Lvalue Iterator
|
|
||||||
</H3>
|
|
||||||
|
|
||||||
A Constant Lvalue Iterator is an iterator that dereferences to produce a
|
|
||||||
const reference to the pointed-to object, i.e., the associated
|
|
||||||
<tt>reference</tt> type is <tt>const T&</tt>. Changing the value
|
|
||||||
of or destroying an iterator that models Constant Lvalue Iterator does
|
|
||||||
not invalidate pointers and references previously obtained from that
|
|
||||||
iterator.
|
|
||||||
|
|
||||||
|
|
||||||
<h3>Refinement of</h3>
|
|
||||||
|
|
||||||
<a href="#concept:ReadableIterator">Readable Iterator</a>
|
|
||||||
|
|
||||||
<h3>Associated Types</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Reference type</td>
|
|
||||||
<td><tt>std::iterator_traits<X>::reference</tt></td>
|
|
||||||
<td>
|
|
||||||
The return type of dereferencing the iterator, which must be
|
|
||||||
<tt>const T&</tt>.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<!-- I don't think this is needed
|
|
||||||
<tr>
|
|
||||||
<td>Pointer type</td>
|
|
||||||
<td><tt>std::iterator_traits<X>::pointer</tt></td>
|
|
||||||
<td>
|
|
||||||
The pointer to the value type, which must be <tt>const T*</tt>.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Return Category</td>
|
|
||||||
<td><tt>std::return_category<X>::type</tt></td>
|
|
||||||
<td>
|
|
||||||
A type convertible to <tt>std::constant_lvalue_iterator_tag</tt>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<!-- these are not necessary now that we use reference as operator* return type
|
|
||||||
<h3>Valid expressions</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
<tr><TH>Name</TH><TH>Expression</TH><TH>Type requirements</TH><TH>Return type</TH></tr>
|
|
||||||
<tr>
|
|
||||||
<td>Dereference</td>
|
|
||||||
<td><tt>*x</tt></td>
|
|
||||||
<td> </td>
|
|
||||||
<td><tt>std::iterator_traits<X>::reference</tt></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Member access</td>
|
|
||||||
<td><tt>x->m</tt></td>
|
|
||||||
<td><tt>T</tt> is a type with a member named <tt>m</tt>.</td>
|
|
||||||
<td>
|
|
||||||
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
<p>
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
<!--------------------------------------------------------------------------->
|
|
||||||
|
|
||||||
<H3><A NAME="concept:MutableLvalueIterator"></A>
|
|
||||||
Mutable Lvalue Iterator
|
|
||||||
</H3>
|
|
||||||
|
|
||||||
A Mutable Lvalue Iterator is an iterator that dereferences to produce a
|
|
||||||
reference to the pointed-to object. The associated <tt>reference</tt>
|
|
||||||
type is <tt>T&</tt>. Changing the value of or destroying an
|
|
||||||
iterator that models Mutable Lvalue Iterator does not invalidate
|
|
||||||
pointers and references previously obtained from that iterator.
|
|
||||||
|
|
||||||
<h3>Refinement of</h3>
|
|
||||||
|
|
||||||
<a href="#concept:ReadableIterator">Readable Iterator</a>,
|
|
||||||
<a href="#concept:WritableIterator">Writable Iterator</a>,
|
|
||||||
and <a href="#concept:SwappableIterator">Swappable Iterator</a>.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<h3>Associated Types</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Reference type</td>
|
|
||||||
<td><tt>std::iterator_traits<X>::reference</tt></td>
|
|
||||||
<td>The return type of dereferencing the iterator, which must be
|
|
||||||
<tt>T&</tt>.</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<!-- I don't think this is necessary
|
|
||||||
<tr>
|
|
||||||
<td>Pointer type</td>
|
|
||||||
<td><tt>std::iterator_traits<X>::pointer</tt></td>
|
|
||||||
<td>
|
|
||||||
The pointer to the value type, which is <tt>T*</tt>.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
-->
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Return Category</td>
|
|
||||||
<td><tt>std::return_category<X>::type</tt></td>
|
|
||||||
<td>
|
|
||||||
A type convertible to <tt>std::mutable_lvalue_iterator_tag</tt>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<!-- no longer needed since the return type is specified as reference in the readable iterator
|
|
||||||
<h3>Valid expressions</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
<tr><TH>Name</TH><TH>Expression</TH><TH>Type requirements</TH><TH>Return type</TH></tr>
|
|
||||||
<tr>
|
|
||||||
<td>Dereference</td>
|
|
||||||
<td><tt>*x</tt></td>
|
|
||||||
<td> </td>
|
|
||||||
<td><tt>std::iterator_traits<X>::reference</tt></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Member access</td>
|
|
||||||
<td><tt>x->m</tt></td>
|
|
||||||
<td><tt>T</tt> is a type with a member named <tt>m</tt>.</td>
|
|
||||||
<td>
|
|
||||||
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
-->
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<hr>
|
|
||||||
<!--------------------------------------------------------------------------->
|
|
||||||
|
|
||||||
<H3><A NAME="concept:ForwardTraversalIterator"></A>
|
|
||||||
Forward Traversal Iterator
|
|
||||||
</H3>
|
|
||||||
|
|
||||||
The Forward Iterator is an iterator that can be incremented. Also, it
|
|
||||||
is permissible to make multiple passes through the iterator's range.
|
|
||||||
|
|
||||||
<h3>Refinement of</h3>
|
|
||||||
|
|
||||||
<A href="http://www.boost.org/libs/utility/CopyConstructible.html">Copy Constructible</A>,
|
|
||||||
<A href="http://www.boost.org/libs/utility/Assignable.html">Assignable</A>,
|
|
||||||
<A href="http://www.sgi.com/tech/stl/DefaultConstructible.html">Default Constructible</A>, and
|
|
||||||
<A href="http://www.sgi.com/tech/stl/EqualityComparable.html">Equality Comparable</A>
|
|
||||||
|
|
||||||
|
|
||||||
<h3>Associated types</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Difference Type</td>
|
|
||||||
<td><tt>std::iterator_traits<X>::difference_type</tt></td>
|
|
||||||
<td>
|
|
||||||
A signed integral type used for representing distances
|
|
||||||
between iterators that point into the same range.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
|
|
||||||
<tr>
|
|
||||||
<td>Traversal Category</td>
|
|
||||||
<td><tt>std::traversal_category<X>::type</tt></td>
|
|
||||||
<td>
|
|
||||||
A type convertible to <tt>std::forward_traversal_tag</tt>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</Table>
|
|
||||||
|
|
||||||
<h3>Valid expressions</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
<tr>
|
|
||||||
<TH>Name</TH><TH>Expression</TH><TH>Type requirements</TH>
|
|
||||||
<TH>Return type</TH>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Preincrement</td>
|
|
||||||
<td><tt>++i</tt></td><td> </td><td><tt>X&</tt></td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Postincrement</td>
|
|
||||||
<td><tt>i++</tt></td><td> </td><td>convertible to <tt>const X&</tt></td>
|
|
||||||
</tr>
|
|
||||||
</Table>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<hr>
|
|
||||||
<!--------------------------------------------------------------------------->
|
|
||||||
|
|
||||||
<H3><A NAME="concept:BidirectionalTraversalIterator"></A>
|
|
||||||
Bidirectional Traversal Iterator
|
|
||||||
</H3>
|
|
||||||
|
|
||||||
An iterator that can be incremented and decremented.
|
|
||||||
|
|
||||||
<h3>Refinement of</h3>
|
|
||||||
|
|
||||||
<a href="#concept:ForwardTraversalIterator">Forward Traversal Iterator</a>
|
|
||||||
|
|
||||||
<h3>Associated types</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
<tr>
|
|
||||||
<td>Traversal Category</td>
|
|
||||||
<td><tt>std::traversal_category<X>::type</tt></td>
|
|
||||||
<td>
|
|
||||||
A type convertible to <tt>std::bidirectional_traversal_tag</tt>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</Table>
|
|
||||||
|
|
||||||
<h3>Valid expressions</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
<tr>
|
|
||||||
<TH>Name</TH><TH>Expression</TH><TH>Type requirements</TH>
|
|
||||||
<TH>Return type</TH>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Predecrement</td>
|
|
||||||
<td><tt>--i</tt></td><td> </td><td><tt>X&</tt></td>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Postdecrement</td>
|
|
||||||
<td><tt>i--</tt></td><td> </td><td>convertible to <tt>const X&</tt></td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
<hr>
|
|
||||||
<!--------------------------------------------------------------------------->
|
|
||||||
|
|
||||||
<H3><A NAME="concept:RandomAccessTraversalIterator"></A>
|
|
||||||
Random Access Traversal Iterator
|
|
||||||
</H3>
|
|
||||||
|
|
||||||
An iterator that provides constant-time methods for moving forward and
|
|
||||||
backward in arbitrary-sized steps.
|
|
||||||
|
|
||||||
<h3>Refinement of</h3>
|
|
||||||
|
|
||||||
<a href="#concept:BidirectionalTraversalIterator">Bidirectional Traversal Iterator</a> and
|
|
||||||
<A href="http://www.sgi.com/tech/stl/LessThanComparable.html">Less Than Comparable</A> where <tt><</tt> is a total ordering
|
|
||||||
|
|
||||||
<h3>Associated types</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
<tr>
|
|
||||||
<td>Traversal Category</td>
|
|
||||||
<td><tt>std::traversal_category<X>::type</tt></td>
|
|
||||||
<td>
|
|
||||||
A type convertible to <tt>std::random_access_traversal_tag</tt>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</Table>
|
|
||||||
|
|
||||||
<h3>Valid expressions</h3>
|
|
||||||
|
|
||||||
<Table border>
|
|
||||||
<tr><TH>Name</TH><TH>Expression</TH><TH>Type requirements</TH>
|
|
||||||
<TH>Return type</TH>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Iterator addition</td>
|
|
||||||
<td><tt>i += n</tt></td><td> </td><td><tt>X&</tt></td>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Iterator addition</td>
|
|
||||||
<td><tt>i + n</tt> or <tt>n + i</tt></td><td> </td><td><tt>X</tt></td>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Iterator subtraction</td>
|
|
||||||
<td><tt>i -= n</tt></td><td> </td><td><tt>X&</tt></td>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Iterator subtraction</td>
|
|
||||||
<td><tt>i - n</tt></td><td> </td><td><tt>X</tt></td>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Difference</td>
|
|
||||||
<td><tt>i - j</tt></td><td> </td><td><tt>std::iterator_traits<X>::difference_type</tt></td>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Element operator</td>
|
|
||||||
<td><tt>i[n]</tt></td>
|
|
||||||
<td><tt>X</tt> must also be a model of
|
|
||||||
<a href="#concept:ReadableIterator">Readable Iterator</a>. </td>
|
|
||||||
<td><tt>std::iterator_traits<X>::reference</tt></td>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Element assignment</td>
|
|
||||||
<td><tt>i[n] = t</tt></td>
|
|
||||||
<td><tt>X</tt> must also be a model of
|
|
||||||
<a href="#concept:WritableIterator">Writable Iterator</a>.</td>
|
|
||||||
<td>unspecified</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<p>
|
|
||||||
|
|
||||||
<HR>
|
|
||||||
<TABLE>
|
|
||||||
<TR valign=top>
|
|
||||||
<TD nowrap>Copyright © 2000</TD><TD>
|
|
||||||
<A HREF="../../../../people/jeremy_siek.htm">Jeremy Siek</A>, Univ.of Notre Dame (<A HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)
|
|
||||||
</TD></TR></TABLE>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -3,48 +3,52 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
<meta name="generator" content="Docutils 0.3.6: http://docutils.sourceforge.net/" />
|
<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
|
||||||
<title>Bidirectional Traversal Concept</title>
|
<title>Bidirectional Traversal Concept</title>
|
||||||
<link rel="stylesheet" href="default.css" type="text/css" />
|
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1 class="title">Bidirectional Traversal Concept</h1>
|
|
||||||
<div class="document" id="bidirectional-traversal-concept">
|
<div class="document" id="bidirectional-traversal-concept">
|
||||||
<p>A class or built-in type <tt class="literal"><span class="pre">X</span></tt> models the <em>Bidirectional Traversal</em>
|
<h1 class="title">Bidirectional Traversal Concept</h1>
|
||||||
concept if, in addition to <tt class="literal"><span class="pre">X</span></tt> meeting the requirements of Forward
|
|
||||||
|
<!-- Copyright David Abrahams 2006. 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) -->
|
||||||
|
<p>A class or built-in type <tt class="docutils literal"><span class="pre">X</span></tt> models the <em>Bidirectional Traversal</em>
|
||||||
|
concept if, in addition to <tt class="docutils literal"><span class="pre">X</span></tt> meeting the requirements of Forward
|
||||||
Traversal Iterator, the following expressions are valid and respect
|
Traversal Iterator, the following expressions are valid and respect
|
||||||
the stated semantics.</p>
|
the stated semantics.</p>
|
||||||
<table border="1" class="table">
|
<table border="1" class="docutils">
|
||||||
<colgroup>
|
<colgroup>
|
||||||
<col width="38%" />
|
<col width="38%" />
|
||||||
<col width="37%" />
|
<col width="37%" />
|
||||||
<col width="25%" />
|
<col width="25%" />
|
||||||
</colgroup>
|
</colgroup>
|
||||||
<thead valign="bottom">
|
<thead valign="bottom">
|
||||||
<tr><th colspan="3">Bidirectional Traversal Iterator Requirements (in addition to Forward Traversal
|
<tr><th class="head" colspan="3">Bidirectional Traversal Iterator Requirements (in addition to Forward Traversal
|
||||||
Iterator)</th>
|
Iterator)</th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><th>Expression</th>
|
<tr><th class="head">Expression</th>
|
||||||
<th>Return Type</th>
|
<th class="head">Return Type</th>
|
||||||
<th>Assertion/Semantics /
|
<th class="head">Assertion/Semantics /
|
||||||
Pre-/Post-condition</th>
|
Pre-/Post-condition</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr><td><tt class="literal"><span class="pre">--r</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">--r</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">X&</span></tt></td>
|
<td><tt class="docutils literal"><span class="pre">X&</span></tt></td>
|
||||||
<td>pre: there exists
|
<td>pre: there exists
|
||||||
<tt class="literal"><span class="pre">s</span></tt> such that <tt class="literal"><span class="pre">r</span>
|
<tt class="docutils literal"><span class="pre">s</span></tt> such that <tt class="docutils literal"><span class="pre">r</span>
|
||||||
<span class="pre">==</span> <span class="pre">++s</span></tt>. post:
|
<span class="pre">==</span> <span class="pre">++s</span></tt>. post:
|
||||||
<tt class="literal"><span class="pre">s</span></tt> is
|
<tt class="docutils literal"><span class="pre">s</span></tt> is
|
||||||
dereferenceable.
|
dereferenceable.
|
||||||
<tt class="literal"><span class="pre">--(++r)</span> <span class="pre">==</span> <span class="pre">r</span></tt>.
|
<tt class="docutils literal"><span class="pre">--(++r)</span> <span class="pre">==</span> <span class="pre">r</span></tt>.
|
||||||
<tt class="literal"><span class="pre">--r</span> <span class="pre">==</span> <span class="pre">--s</span></tt>
|
<tt class="docutils literal"><span class="pre">--r</span> <span class="pre">==</span> <span class="pre">--s</span></tt>
|
||||||
implies <tt class="literal"><span class="pre">r</span> <span class="pre">==</span>
|
implies <tt class="docutils literal"><span class="pre">r</span> <span class="pre">==</span>
|
||||||
<span class="pre">s</span></tt>. <tt class="literal"><span class="pre">&r</span> <span class="pre">==</span> <span class="pre">&--r</span></tt>.</td>
|
<span class="pre">s</span></tt>. <tt class="docutils literal"><span class="pre">&r</span> <span class="pre">==</span> <span class="pre">&--r</span></tt>.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td><tt class="literal"><span class="pre">r--</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">r--</span></tt></td>
|
||||||
<td>convertible to <tt class="literal"><span class="pre">const</span> <span class="pre">X&</span></tt></td>
|
<td>convertible to <tt class="docutils literal"><span class="pre">const</span> <span class="pre">X&</span></tt></td>
|
||||||
<td><pre class="first last literal-block">
|
<td><pre class="first last literal-block">
|
||||||
{
|
{
|
||||||
X tmp = r;
|
X tmp = r;
|
||||||
@@ -54,18 +58,19 @@ implies <tt class="literal"><span class="pre">r</span> <span class="pre">==</spa
|
|||||||
</pre>
|
</pre>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td><tt class="literal"><span class="pre">iterator_traversal<X>::type</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">iterator_traversal<X>::type</span></tt></td>
|
||||||
<td>Convertible to
|
<td>Convertible to
|
||||||
<tt class="literal"><span class="pre">bidirectional_traversal_tag</span></tt></td>
|
<tt class="docutils literal"><span class="pre">bidirectional_traversal_tag</span></tt></td>
|
||||||
<td> </td>
|
<td> </td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<hr class="footer" />
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<a class="reference" href="BidirectionalTraversal.rst">View document source</a>.
|
<hr class="footer" />
|
||||||
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
<a class="reference external" href="BidirectionalTraversal.rst">View document source</a>.
|
||||||
|
Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
4
doc/BidirectionalTraversal.rst
Executable file → Normal file
4
doc/BidirectionalTraversal.rst
Executable file → Normal file
@@ -1,3 +1,7 @@
|
|||||||
|
.. Copyright David Abrahams 2006. 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)
|
||||||
|
|
||||||
Bidirectional Traversal Concept
|
Bidirectional Traversal Concept
|
||||||
...............................
|
...............................
|
||||||
|
|
||||||
|
|||||||
@@ -3,60 +3,65 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
<meta name="generator" content="Docutils 0.3.6: http://docutils.sourceforge.net/" />
|
<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
|
||||||
<title>Forward Traversal Concept</title>
|
<title>Forward Traversal Concept</title>
|
||||||
<link rel="stylesheet" href="default.css" type="text/css" />
|
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1 class="title">Forward Traversal Concept</h1>
|
|
||||||
<div class="document" id="forward-traversal-concept">
|
<div class="document" id="forward-traversal-concept">
|
||||||
<p>A class or built-in type <tt class="literal"><span class="pre">X</span></tt> models the <em>Forward Traversal</em>
|
<h1 class="title">Forward Traversal Concept</h1>
|
||||||
concept if, in addition to <tt class="literal"><span class="pre">X</span></tt> meeting the requirements of Default
|
|
||||||
|
<!-- Copyright David Abrahams 2006. 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) -->
|
||||||
|
<p>A class or built-in type <tt class="docutils literal"><span class="pre">X</span></tt> models the <em>Forward Traversal</em>
|
||||||
|
concept if, in addition to <tt class="docutils literal"><span class="pre">X</span></tt> meeting the requirements of Default
|
||||||
Constructible and Single Pass Iterator, the following expressions are
|
Constructible and Single Pass Iterator, the following expressions are
|
||||||
valid and respect the stated semantics.</p>
|
valid and respect the stated semantics.</p>
|
||||||
<table border="1" class="table">
|
<table border="1" class="docutils">
|
||||||
<colgroup>
|
<colgroup>
|
||||||
<col width="38%" />
|
<col width="38%" />
|
||||||
<col width="34%" />
|
<col width="34%" />
|
||||||
<col width="27%" />
|
<col width="27%" />
|
||||||
</colgroup>
|
</colgroup>
|
||||||
<thead valign="bottom">
|
<thead valign="bottom">
|
||||||
<tr><th colspan="3">Forward Traversal Iterator Requirements (in addition to Default Constructible and Single Pass Iterator)</th>
|
<tr><th class="head" colspan="3">Forward Traversal Iterator Requirements (in addition to Default Constructible and Single Pass Iterator)</th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><th>Expression</th>
|
<tr><th class="head">Expression</th>
|
||||||
<th>Return Type</th>
|
<th class="head">Return Type</th>
|
||||||
<th>Assertion/Note</th>
|
<th class="head">Assertion/Note</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr><td><tt class="literal"><span class="pre">X</span> <span class="pre">u;</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">X</span> <span class="pre">u;</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">X&</span></tt></td>
|
<td><tt class="docutils literal"><span class="pre">X&</span></tt></td>
|
||||||
<td>note: <tt class="literal"><span class="pre">u</span></tt> may have a
|
<td>note: <tt class="docutils literal"><span class="pre">u</span></tt> may have a
|
||||||
singular value.</td>
|
singular value.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td><tt class="literal"><span class="pre">++r</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">++r</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">X&</span></tt></td>
|
<td><tt class="docutils literal"><span class="pre">X&</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">r</span> <span class="pre">==</span> <span class="pre">s</span></tt> and <tt class="literal"><span class="pre">r</span></tt> is
|
<td><tt class="docutils literal"><span class="pre">r</span> <span class="pre">==</span> <span class="pre">s</span></tt> and <tt class="docutils literal"><span class="pre">r</span></tt> is
|
||||||
dereferenceable implies
|
dereferenceable implies
|
||||||
<tt class="literal"><span class="pre">++r</span> <span class="pre">==</span> <span class="pre">++s.</span></tt></td>
|
<tt class="docutils literal"><span class="pre">++r</span> <span class="pre">==</span> <span class="pre">++s.</span></tt></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td><tt class="literal"><span class="pre">iterator_traits<X>::difference_type</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">iterator_traits<X>::difference_type</span></tt></td>
|
||||||
<td>A signed integral type representing
|
<td>A signed integral type representing
|
||||||
the distance between iterators</td>
|
the distance between iterators</td>
|
||||||
<td> </td>
|
<td> </td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td><tt class="literal"><span class="pre">iterator_traversal<X>::type</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">iterator_traversal<X>::type</span></tt></td>
|
||||||
<td>Convertible to
|
<td>Convertible to
|
||||||
<tt class="literal"><span class="pre">forward_traversal_tag</span></tt></td>
|
<tt class="docutils literal"><span class="pre">forward_traversal_tag</span></tt></td>
|
||||||
<td> </td>
|
<td> </td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<hr class="footer" />
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<a class="reference" href="ForwardTraversal.rst">View document source</a>.
|
<hr class="footer" />
|
||||||
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
<a class="reference external" href="ForwardTraversal.rst">View document source</a>.
|
||||||
|
Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
4
doc/ForwardTraversal.rst
Executable file → Normal file
4
doc/ForwardTraversal.rst
Executable file → Normal file
@@ -1,3 +1,7 @@
|
|||||||
|
.. Copyright David Abrahams 2006. 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)
|
||||||
|
|
||||||
Forward Traversal Concept
|
Forward Traversal Concept
|
||||||
.........................
|
.........................
|
||||||
|
|
||||||
|
|||||||
0
doc/GNUmakefile
Executable file → Normal file
0
doc/GNUmakefile
Executable file → Normal file
@@ -3,38 +3,42 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
<meta name="generator" content="Docutils 0.3.6: http://docutils.sourceforge.net/" />
|
<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
|
||||||
<title>Incrementable Iterator Concept</title>
|
<title>Incrementable Iterator Concept</title>
|
||||||
<link rel="stylesheet" href="default.css" type="text/css" />
|
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1 class="title">Incrementable Iterator Concept</h1>
|
|
||||||
<div class="document" id="incrementable-iterator-concept">
|
<div class="document" id="incrementable-iterator-concept">
|
||||||
<p>A class or built-in type <tt class="literal"><span class="pre">X</span></tt> models the <em>Incrementable Iterator</em>
|
<h1 class="title">Incrementable Iterator Concept</h1>
|
||||||
concept if, in addition to <tt class="literal"><span class="pre">X</span></tt> being Assignable and Copy
|
|
||||||
|
<!-- Copyright David Abrahams 2006. 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) -->
|
||||||
|
<p>A class or built-in type <tt class="docutils literal"><span class="pre">X</span></tt> models the <em>Incrementable Iterator</em>
|
||||||
|
concept if, in addition to <tt class="docutils literal"><span class="pre">X</span></tt> being Assignable and Copy
|
||||||
Constructible, the following expressions are valid and respect the
|
Constructible, the following expressions are valid and respect the
|
||||||
stated semantics.</p>
|
stated semantics.</p>
|
||||||
<table border="1" class="table">
|
<table border="1" class="docutils">
|
||||||
<colgroup>
|
<colgroup>
|
||||||
<col width="39%" />
|
<col width="39%" />
|
||||||
<col width="37%" />
|
<col width="37%" />
|
||||||
<col width="24%" />
|
<col width="24%" />
|
||||||
</colgroup>
|
</colgroup>
|
||||||
<thead valign="bottom">
|
<thead valign="bottom">
|
||||||
<tr><th colspan="3">Incrementable Iterator Requirements (in addition to Assignable, Copy Constructible)</th>
|
<tr><th class="head" colspan="3">Incrementable Iterator Requirements (in addition to Assignable, Copy Constructible)</th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><th>Expression</th>
|
<tr><th class="head">Expression</th>
|
||||||
<th>Return Type</th>
|
<th class="head">Return Type</th>
|
||||||
<th>Assertion/Semantics</th>
|
<th class="head">Assertion/Semantics</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr><td><tt class="literal"><span class="pre">++r</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">++r</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">X&</span></tt></td>
|
<td><tt class="docutils literal"><span class="pre">X&</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">&r</span> <span class="pre">==</span> <span class="pre">&++r</span></tt></td>
|
<td><tt class="docutils literal"><span class="pre">&r</span> <span class="pre">==</span> <span class="pre">&++r</span></tt></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td><tt class="literal"><span class="pre">r++</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">r++</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">X</span></tt></td>
|
<td><tt class="docutils literal"><span class="pre">X</span></tt></td>
|
||||||
<td><pre class="first last literal-block">
|
<td><pre class="first last literal-block">
|
||||||
{
|
{
|
||||||
X tmp = r;
|
X tmp = r;
|
||||||
@@ -44,18 +48,19 @@ stated semantics.</p>
|
|||||||
</pre>
|
</pre>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td><tt class="literal"><span class="pre">iterator_traversal<X>::type</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">iterator_traversal<X>::type</span></tt></td>
|
||||||
<td>Convertible to
|
<td>Convertible to
|
||||||
<tt class="literal"><span class="pre">incrementable_traversal_tag</span></tt></td>
|
<tt class="docutils literal"><span class="pre">incrementable_traversal_tag</span></tt></td>
|
||||||
<td> </td>
|
<td> </td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<hr class="footer" />
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<a class="reference" href="IncrementableIterator.rst">View document source</a>.
|
<hr class="footer" />
|
||||||
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
<a class="reference external" href="IncrementableIterator.rst">View document source</a>.
|
||||||
|
Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
4
doc/IncrementableIterator.rst
Executable file → Normal file
4
doc/IncrementableIterator.rst
Executable file → Normal file
@@ -1,3 +1,7 @@
|
|||||||
|
.. Copyright David Abrahams 2006. 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)
|
||||||
|
|
||||||
Incrementable Iterator Concept
|
Incrementable Iterator Concept
|
||||||
..............................
|
..............................
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
.. Copyright David Abrahams 2006. 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)
|
||||||
|
|
||||||
Interoperable Iterator Concept
|
Interoperable Iterator Concept
|
||||||
..............................
|
..............................
|
||||||
|
|
||||||
|
|||||||
27
doc/Jamfile.v2
Normal file
27
doc/Jamfile.v2
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# Copyright Thomas Witt 2005. Use, modification, and distribution are
|
||||||
|
# subject to the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
|
using quickbook ;
|
||||||
|
|
||||||
|
xml iterator
|
||||||
|
:
|
||||||
|
quickbook/iterator.qbk
|
||||||
|
;
|
||||||
|
|
||||||
|
boostbook standalone
|
||||||
|
:
|
||||||
|
iterator
|
||||||
|
:
|
||||||
|
<xsl:param>"boost.root=../../../.."
|
||||||
|
<xsl:param>toc.max.depth=3
|
||||||
|
<xsl:param>toc.section.depth=3
|
||||||
|
<xsl:param>chunk.section.depth=2
|
||||||
|
<format>pdf:<xsl:param>"boost.url.prefix=http://www.boost.org/doc/libs/release/libs/iterator/doc/html"
|
||||||
|
;
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
alias boostdoc ;
|
||||||
|
explicit boostdoc ;
|
||||||
|
alias boostrelease : standalone ;
|
||||||
|
explicit boostrelease ;
|
||||||
@@ -3,49 +3,54 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
<meta name="generator" content="Docutils 0.3.6: http://docutils.sourceforge.net/" />
|
<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
|
||||||
<title>Lvalue Iterator Concept</title>
|
<title>Lvalue Iterator Concept</title>
|
||||||
<link rel="stylesheet" href="default.css" type="text/css" />
|
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1 class="title">Lvalue Iterator Concept</h1>
|
|
||||||
<div class="document" id="lvalue-iterator-concept">
|
<div class="document" id="lvalue-iterator-concept">
|
||||||
|
<h1 class="title">Lvalue Iterator Concept</h1>
|
||||||
|
|
||||||
|
<!-- Copyright David Abrahams 2006. 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) -->
|
||||||
<p>The <em>Lvalue Iterator</em> concept adds the requirement that the return
|
<p>The <em>Lvalue Iterator</em> concept adds the requirement that the return
|
||||||
type of <tt class="literal"><span class="pre">operator*</span></tt> type be a reference to the value type of the
|
type of <tt class="docutils literal"><span class="pre">operator*</span></tt> type be a reference to the value type of the
|
||||||
iterator.</p>
|
iterator.</p>
|
||||||
<table border="1" class="table">
|
<table border="1" class="docutils">
|
||||||
<colgroup>
|
<colgroup>
|
||||||
<col width="22%" />
|
<col width="22%" />
|
||||||
<col width="19%" />
|
<col width="19%" />
|
||||||
<col width="59%" />
|
<col width="59%" />
|
||||||
</colgroup>
|
</colgroup>
|
||||||
<thead valign="bottom">
|
<thead valign="bottom">
|
||||||
<tr><th colspan="3">Lvalue Iterator Requirements</th>
|
<tr><th class="head" colspan="3">Lvalue Iterator Requirements</th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><th>Expression</th>
|
<tr><th class="head">Expression</th>
|
||||||
<th>Return Type</th>
|
<th class="head">Return Type</th>
|
||||||
<th>Note/Assertion</th>
|
<th class="head">Note/Assertion</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr><td><tt class="literal"><span class="pre">*a</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">*a</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">T&</span></tt></td>
|
<td><tt class="docutils literal"><span class="pre">T&</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">T</span></tt> is <em>cv</em>
|
<td><tt class="docutils literal"><span class="pre">T</span></tt> is <em>cv</em>
|
||||||
<tt class="literal"><span class="pre">iterator_traits<X>::value_type</span></tt>
|
<tt class="docutils literal"><span class="pre">iterator_traits<X>::value_type</span></tt>
|
||||||
where <em>cv</em> is an optional
|
where <em>cv</em> is an optional
|
||||||
cv-qualification.
|
cv-qualification.
|
||||||
pre: <tt class="literal"><span class="pre">a</span></tt> is
|
pre: <tt class="docutils literal"><span class="pre">a</span></tt> is
|
||||||
dereferenceable. If <tt class="literal"><span class="pre">a</span>
|
dereferenceable. If <tt class="docutils literal"><span class="pre">a</span>
|
||||||
<span class="pre">==</span> <span class="pre">b</span></tt> then <tt class="literal"><span class="pre">*a</span></tt> is
|
<span class="pre">==</span> <span class="pre">b</span></tt> then <tt class="docutils literal"><span class="pre">*a</span></tt> is
|
||||||
equivalent to <tt class="literal"><span class="pre">*b</span></tt>.</td>
|
equivalent to <tt class="docutils literal"><span class="pre">*b</span></tt>.</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<hr class="footer" />
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<a class="reference" href="LvalueIterator.rst">View document source</a>.
|
<hr class="footer" />
|
||||||
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
<a class="reference external" href="LvalueIterator.rst">View document source</a>.
|
||||||
|
Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
4
doc/LvalueIterator.rst
Executable file → Normal file
4
doc/LvalueIterator.rst
Executable file → Normal file
@@ -1,3 +1,7 @@
|
|||||||
|
.. Copyright David Abrahams 2006. 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)
|
||||||
|
|
||||||
Lvalue Iterator Concept
|
Lvalue Iterator Concept
|
||||||
.......................
|
.......................
|
||||||
|
|
||||||
|
|||||||
@@ -3,19 +3,23 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
<meta name="generator" content="Docutils 0.3.6: http://docutils.sourceforge.net/" />
|
<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
|
||||||
<title>Random Access Traversal Concept</title>
|
<title>Random Access Traversal Concept</title>
|
||||||
<link rel="stylesheet" href="default.css" type="text/css" />
|
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1 class="title">Random Access Traversal Concept</h1>
|
|
||||||
<div class="document" id="random-access-traversal-concept">
|
<div class="document" id="random-access-traversal-concept">
|
||||||
<p>A class or built-in type <tt class="literal"><span class="pre">X</span></tt> models the <em>Random Access Traversal</em>
|
<h1 class="title">Random Access Traversal Concept</h1>
|
||||||
|
|
||||||
|
<!-- Copyright David Abrahams 2006. 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) -->
|
||||||
|
<p>A class or built-in type <tt class="docutils literal"><span class="pre">X</span></tt> models the <em>Random Access Traversal</em>
|
||||||
concept if the following expressions are valid and respect the stated
|
concept if the following expressions are valid and respect the stated
|
||||||
semantics. In the table below, <tt class="literal"><span class="pre">Distance</span></tt> is
|
semantics. In the table below, <tt class="docutils literal"><span class="pre">Distance</span></tt> is
|
||||||
<tt class="literal"><span class="pre">iterator_traits<X>::difference_type</span></tt> and <tt class="literal"><span class="pre">n</span></tt> represents a
|
<tt class="docutils literal"><span class="pre">iterator_traits<X>::difference_type</span></tt> and <tt class="docutils literal"><span class="pre">n</span></tt> represents a
|
||||||
constant object of type <tt class="literal"><span class="pre">Distance</span></tt>.</p>
|
constant object of type <tt class="docutils literal"><span class="pre">Distance</span></tt>.</p>
|
||||||
<table border="1" class="table">
|
<table border="1" class="docutils">
|
||||||
<colgroup>
|
<colgroup>
|
||||||
<col width="28%" />
|
<col width="28%" />
|
||||||
<col width="30%" />
|
<col width="30%" />
|
||||||
@@ -23,18 +27,18 @@ constant object of type <tt class="literal"><span class="pre">Distance</span></t
|
|||||||
<col width="20%" />
|
<col width="20%" />
|
||||||
</colgroup>
|
</colgroup>
|
||||||
<thead valign="bottom">
|
<thead valign="bottom">
|
||||||
<tr><th colspan="4">Random Access Traversal Iterator Requirements (in addition to Bidirectional Traversal)</th>
|
<tr><th class="head" colspan="4">Random Access Traversal Iterator Requirements (in addition to Bidirectional Traversal)</th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><th>Expression</th>
|
<tr><th class="head">Expression</th>
|
||||||
<th>Return Type</th>
|
<th class="head">Return Type</th>
|
||||||
<th>Operational Semantics</th>
|
<th class="head">Operational Semantics</th>
|
||||||
<th>Assertion/
|
<th class="head">Assertion/
|
||||||
Precondition</th>
|
Precondition</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr><td><tt class="literal"><span class="pre">r</span> <span class="pre">+=</span> <span class="pre">n</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">r</span> <span class="pre">+=</span> <span class="pre">n</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">X&</span></tt></td>
|
<td><tt class="docutils literal"><span class="pre">X&</span></tt></td>
|
||||||
<td><pre class="first last literal-block">
|
<td><pre class="first last literal-block">
|
||||||
{
|
{
|
||||||
Distance m = n;
|
Distance m = n;
|
||||||
@@ -50,80 +54,81 @@ Precondition</th>
|
|||||||
</td>
|
</td>
|
||||||
<td> </td>
|
<td> </td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td><tt class="literal"><span class="pre">a</span> <span class="pre">+</span> <span class="pre">n</span></tt>, <tt class="literal"><span class="pre">n</span> <span class="pre">+</span> <span class="pre">a</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">a</span> <span class="pre">+</span> <span class="pre">n</span></tt>, <tt class="docutils literal"><span class="pre">n</span> <span class="pre">+</span> <span class="pre">a</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">X</span></tt></td>
|
<td><tt class="docutils literal"><span class="pre">X</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">{</span> <span class="pre">X</span> <span class="pre">tmp</span> <span class="pre">=</span> <span class="pre">a;</span> <span class="pre">return</span> <span class="pre">tmp</span>
|
<td><tt class="docutils literal"><span class="pre">{</span> <span class="pre">X</span> <span class="pre">tmp</span> <span class="pre">=</span> <span class="pre">a;</span> <span class="pre">return</span> <span class="pre">tmp</span>
|
||||||
<span class="pre">+=</span> <span class="pre">n;</span> <span class="pre">}</span></tt></td>
|
<span class="pre">+=</span> <span class="pre">n;</span> <span class="pre">}</span></tt></td>
|
||||||
<td> </td>
|
<td> </td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td><tt class="literal"><span class="pre">r</span> <span class="pre">-=</span> <span class="pre">n</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">r</span> <span class="pre">-=</span> <span class="pre">n</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">X&</span></tt></td>
|
<td><tt class="docutils literal"><span class="pre">X&</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">return</span> <span class="pre">r</span> <span class="pre">+=</span> <span class="pre">-n</span></tt></td>
|
<td><tt class="docutils literal"><span class="pre">return</span> <span class="pre">r</span> <span class="pre">+=</span> <span class="pre">-n</span></tt></td>
|
||||||
<td> </td>
|
<td> </td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td><tt class="literal"><span class="pre">a</span> <span class="pre">-</span> <span class="pre">n</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">a</span> <span class="pre">-</span> <span class="pre">n</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">X</span></tt></td>
|
<td><tt class="docutils literal"><span class="pre">X</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">{</span> <span class="pre">X</span> <span class="pre">tmp</span> <span class="pre">=</span> <span class="pre">a;</span> <span class="pre">return</span> <span class="pre">tmp</span>
|
<td><tt class="docutils literal"><span class="pre">{</span> <span class="pre">X</span> <span class="pre">tmp</span> <span class="pre">=</span> <span class="pre">a;</span> <span class="pre">return</span> <span class="pre">tmp</span>
|
||||||
<span class="pre">-=</span> <span class="pre">n;</span> <span class="pre">}</span></tt></td>
|
<span class="pre">-=</span> <span class="pre">n;</span> <span class="pre">}</span></tt></td>
|
||||||
<td> </td>
|
<td> </td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td><tt class="literal"><span class="pre">b</span> <span class="pre">-</span> <span class="pre">a</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">b</span> <span class="pre">-</span> <span class="pre">a</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">Distance</span></tt></td>
|
<td><tt class="docutils literal"><span class="pre">Distance</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">a</span> <span class="pre"><</span> <span class="pre">b</span> <span class="pre">?</span> <span class="pre">distance(a,b)</span>
|
<td><tt class="docutils literal"><span class="pre">a</span> <span class="pre"><</span> <span class="pre">b</span> <span class="pre">?</span> <span class="pre">distance(a,b)</span>
|
||||||
<span class="pre">:</span> <span class="pre">-distance(b,a)</span></tt></td>
|
<span class="pre">:</span> <span class="pre">-distance(b,a)</span></tt></td>
|
||||||
<td>pre: there exists a
|
<td>pre: there exists a
|
||||||
value <tt class="literal"><span class="pre">n</span></tt> of
|
value <tt class="docutils literal"><span class="pre">n</span></tt> of
|
||||||
<tt class="literal"><span class="pre">Distance</span></tt> such that
|
<tt class="docutils literal"><span class="pre">Distance</span></tt> such that
|
||||||
<tt class="literal"><span class="pre">a</span> <span class="pre">+</span> <span class="pre">n</span> <span class="pre">==</span> <span class="pre">b</span></tt>. <tt class="literal"><span class="pre">b</span>
|
<tt class="docutils literal"><span class="pre">a</span> <span class="pre">+</span> <span class="pre">n</span> <span class="pre">==</span> <span class="pre">b</span></tt>. <tt class="docutils literal"><span class="pre">b</span>
|
||||||
<span class="pre">==</span> <span class="pre">a</span> <span class="pre">+</span> <span class="pre">(b</span> <span class="pre">-</span> <span class="pre">a)</span></tt>.</td>
|
<span class="pre">==</span> <span class="pre">a</span> <span class="pre">+</span> <span class="pre">(b</span> <span class="pre">-</span> <span class="pre">a)</span></tt>.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td><tt class="literal"><span class="pre">a[n]</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">a[n]</span></tt></td>
|
||||||
<td>convertible to T</td>
|
<td>convertible to T</td>
|
||||||
<td><tt class="literal"><span class="pre">*(a</span> <span class="pre">+</span> <span class="pre">n)</span></tt></td>
|
<td><tt class="docutils literal"><span class="pre">*(a</span> <span class="pre">+</span> <span class="pre">n)</span></tt></td>
|
||||||
<td>pre: a is a <em>Readable
|
<td>pre: a is a <em>Readable
|
||||||
Iterator</em></td>
|
Iterator</em></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td><tt class="literal"><span class="pre">a[n]</span> <span class="pre">=</span> <span class="pre">v</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">a[n]</span> <span class="pre">=</span> <span class="pre">v</span></tt></td>
|
||||||
<td>convertible to T</td>
|
<td>convertible to T</td>
|
||||||
<td><tt class="literal"><span class="pre">*(a</span> <span class="pre">+</span> <span class="pre">n)</span> <span class="pre">=</span> <span class="pre">v</span></tt></td>
|
<td><tt class="docutils literal"><span class="pre">*(a</span> <span class="pre">+</span> <span class="pre">n)</span> <span class="pre">=</span> <span class="pre">v</span></tt></td>
|
||||||
<td>pre: a is a <em>Writable
|
<td>pre: a is a <em>Writable
|
||||||
iterator</em></td>
|
iterator</em></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td><tt class="literal"><span class="pre">a</span> <span class="pre"><</span> <span class="pre">b</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">a</span> <span class="pre"><</span> <span class="pre">b</span></tt></td>
|
||||||
<td>convertible to <tt class="literal"><span class="pre">bool</span></tt></td>
|
<td>convertible to <tt class="docutils literal"><span class="pre">bool</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">b</span> <span class="pre">-</span> <span class="pre">a</span> <span class="pre">></span> <span class="pre">0</span></tt></td>
|
<td><tt class="docutils literal"><span class="pre">b</span> <span class="pre">-</span> <span class="pre">a</span> <span class="pre">></span> <span class="pre">0</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre"><</span></tt> is a total
|
<td><tt class="docutils literal"><span class="pre"><</span></tt> is a total
|
||||||
ordering relation</td>
|
ordering relation</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td><tt class="literal"><span class="pre">a</span> <span class="pre">></span> <span class="pre">b</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">a</span> <span class="pre">></span> <span class="pre">b</span></tt></td>
|
||||||
<td>convertible to <tt class="literal"><span class="pre">bool</span></tt></td>
|
<td>convertible to <tt class="docutils literal"><span class="pre">bool</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">b</span> <span class="pre"><</span> <span class="pre">a</span></tt></td>
|
<td><tt class="docutils literal"><span class="pre">b</span> <span class="pre"><</span> <span class="pre">a</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">></span></tt> is a total
|
<td><tt class="docutils literal"><span class="pre">></span></tt> is a total
|
||||||
ordering relation</td>
|
ordering relation</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td><tt class="literal"><span class="pre">a</span> <span class="pre">>=</span> <span class="pre">b</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">a</span> <span class="pre">>=</span> <span class="pre">b</span></tt></td>
|
||||||
<td>convertible to <tt class="literal"><span class="pre">bool</span></tt></td>
|
<td>convertible to <tt class="docutils literal"><span class="pre">bool</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">!(a</span> <span class="pre"><</span> <span class="pre">b)</span></tt></td>
|
<td><tt class="docutils literal"><span class="pre">!(a</span> <span class="pre"><</span> <span class="pre">b)</span></tt></td>
|
||||||
<td> </td>
|
<td> </td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td><tt class="literal"><span class="pre">a</span> <span class="pre"><=</span> <span class="pre">b</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">a</span> <span class="pre"><=</span> <span class="pre">b</span></tt></td>
|
||||||
<td>convertible to <tt class="literal"><span class="pre">bool</span></tt></td>
|
<td>convertible to <tt class="docutils literal"><span class="pre">bool</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">!(a</span> <span class="pre">></span> <span class="pre">b)</span></tt></td>
|
<td><tt class="docutils literal"><span class="pre">!(a</span> <span class="pre">></span> <span class="pre">b)</span></tt></td>
|
||||||
<td> </td>
|
<td> </td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td><tt class="literal"><span class="pre">iterator_traversal<X>::type</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">iterator_traversal<X>::type</span></tt></td>
|
||||||
<td>Convertible to
|
<td>Convertible to
|
||||||
<tt class="literal"><span class="pre">random_access_traversal_tag</span></tt></td>
|
<tt class="docutils literal"><span class="pre">random_access_traversal_tag</span></tt></td>
|
||||||
<td> </td>
|
<td> </td>
|
||||||
<td> </td>
|
<td> </td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<hr class="footer" />
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<a class="reference" href="RandomAccessTraversal.rst">View document source</a>.
|
<hr class="footer" />
|
||||||
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
<a class="reference external" href="RandomAccessTraversal.rst">View document source</a>.
|
||||||
|
Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
.. Copyright David Abrahams 2006. 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)
|
||||||
|
|
||||||
Random Access Traversal Concept
|
Random Access Traversal Concept
|
||||||
...............................
|
...............................
|
||||||
|
|
||||||
|
|||||||
@@ -3,57 +3,62 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
<meta name="generator" content="Docutils 0.3.6: http://docutils.sourceforge.net/" />
|
<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
|
||||||
<title>Readable Iterator Concept</title>
|
<title>Readable Iterator Concept</title>
|
||||||
<link rel="stylesheet" href="default.css" type="text/css" />
|
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1 class="title">Readable Iterator Concept</h1>
|
|
||||||
<div class="document" id="readable-iterator-concept">
|
<div class="document" id="readable-iterator-concept">
|
||||||
<p>A class or built-in type <tt class="literal"><span class="pre">X</span></tt> models the <em>Readable Iterator</em> concept
|
<h1 class="title">Readable Iterator Concept</h1>
|
||||||
for value type <tt class="literal"><span class="pre">T</span></tt> if, in addition to <tt class="literal"><span class="pre">X</span></tt> being Assignable and
|
|
||||||
|
<!-- Copyright David Abrahams 2006. 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) -->
|
||||||
|
<p>A class or built-in type <tt class="docutils literal"><span class="pre">X</span></tt> models the <em>Readable Iterator</em> concept
|
||||||
|
for value type <tt class="docutils literal"><span class="pre">T</span></tt> if, in addition to <tt class="docutils literal"><span class="pre">X</span></tt> being Assignable and
|
||||||
Copy Constructible, the following expressions are valid and respect
|
Copy Constructible, the following expressions are valid and respect
|
||||||
the stated semantics. <tt class="literal"><span class="pre">U</span></tt> is the type of any specified member of
|
the stated semantics. <tt class="docutils literal"><span class="pre">U</span></tt> is the type of any specified member of
|
||||||
type <tt class="literal"><span class="pre">T</span></tt>.</p>
|
type <tt class="docutils literal"><span class="pre">T</span></tt>.</p>
|
||||||
<table border="1" class="table">
|
<table border="1" class="docutils">
|
||||||
<colgroup>
|
<colgroup>
|
||||||
<col width="28%" />
|
<col width="28%" />
|
||||||
<col width="20%" />
|
<col width="20%" />
|
||||||
<col width="52%" />
|
<col width="52%" />
|
||||||
</colgroup>
|
</colgroup>
|
||||||
<thead valign="bottom">
|
<thead valign="bottom">
|
||||||
<tr><th colspan="3">Readable Iterator Requirements (in addition to Assignable and Copy Constructible)</th>
|
<tr><th class="head" colspan="3">Readable Iterator Requirements (in addition to Assignable and Copy Constructible)</th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><th>Expression</th>
|
<tr><th class="head">Expression</th>
|
||||||
<th>Return Type</th>
|
<th class="head">Return Type</th>
|
||||||
<th>Note/Precondition</th>
|
<th class="head">Note/Precondition</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr><td><tt class="literal"><span class="pre">iterator_traits<X>::value_type</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">iterator_traits<X>::value_type</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">T</span></tt></td>
|
<td><tt class="docutils literal"><span class="pre">T</span></tt></td>
|
||||||
<td>Any non-reference,
|
<td>Any non-reference,
|
||||||
non-cv-qualified type</td>
|
non-cv-qualified type</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td><tt class="literal"><span class="pre">*a</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">*a</span></tt></td>
|
||||||
<td>Convertible to <tt class="literal"><span class="pre">T</span></tt></td>
|
<td>Convertible to <tt class="docutils literal"><span class="pre">T</span></tt></td>
|
||||||
<td><dl class="first last">
|
<td><dl class="first last docutils">
|
||||||
<dt>pre: <tt class="literal"><span class="pre">a</span></tt> is dereferenceable. If <tt class="literal"><span class="pre">a</span> <span class="pre">==</span> <span class="pre">b</span></tt> then <tt class="literal"><span class="pre">*a</span></tt></dt>
|
<dt>pre: <tt class="docutils literal"><span class="pre">a</span></tt> is dereferenceable. If <tt class="docutils literal"><span class="pre">a</span> <span class="pre">==</span> <span class="pre">b</span></tt> then <tt class="docutils literal"><span class="pre">*a</span></tt></dt>
|
||||||
<dd>is equivalent to <tt class="literal"><span class="pre">*b</span></tt>.</dd>
|
<dd>is equivalent to <tt class="docutils literal"><span class="pre">*b</span></tt>.</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td><tt class="literal"><span class="pre">a->m</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">a->m</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">U&</span></tt></td>
|
<td><tt class="docutils literal"><span class="pre">U&</span></tt></td>
|
||||||
<td>pre: <tt class="literal"><span class="pre">pre:</span> <span class="pre">(*a).m</span></tt> is well-defined. Equivalent to <tt class="literal"><span class="pre">(*a).m</span></tt>.</td>
|
<td>pre: <tt class="docutils literal"><span class="pre">pre:</span> <span class="pre">(*a).m</span></tt> is well-defined. Equivalent to <tt class="docutils literal"><span class="pre">(*a).m</span></tt>.</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<hr class="footer" />
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<a class="reference" href="ReadableIterator.rst">View document source</a>.
|
<hr class="footer" />
|
||||||
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
<a class="reference external" href="ReadableIterator.rst">View document source</a>.
|
||||||
|
Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
3
doc/ReadableIterator.rst
Executable file → Normal file
3
doc/ReadableIterator.rst
Executable file → Normal file
@@ -1,3 +1,6 @@
|
|||||||
|
.. Copyright David Abrahams 2006. 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)
|
||||||
|
|
||||||
Readable Iterator Concept
|
Readable Iterator Concept
|
||||||
.........................
|
.........................
|
||||||
|
|||||||
@@ -3,61 +3,66 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
<meta name="generator" content="Docutils 0.3.6: http://docutils.sourceforge.net/" />
|
<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
|
||||||
<title>Single Pass Iterator Concept</title>
|
<title>Single Pass Iterator Concept</title>
|
||||||
<link rel="stylesheet" href="default.css" type="text/css" />
|
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1 class="title">Single Pass Iterator Concept</h1>
|
|
||||||
<div class="document" id="single-pass-iterator-concept">
|
<div class="document" id="single-pass-iterator-concept">
|
||||||
<p>A class or built-in type <tt class="literal"><span class="pre">X</span></tt> models the <em>Single Pass Iterator</em>
|
<h1 class="title">Single Pass Iterator Concept</h1>
|
||||||
|
|
||||||
|
<!-- Copyright David Abrahams 2006. 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) -->
|
||||||
|
<p>A class or built-in type <tt class="docutils literal"><span class="pre">X</span></tt> models the <em>Single Pass Iterator</em>
|
||||||
concept if the following expressions are valid and respect the stated
|
concept if the following expressions are valid and respect the stated
|
||||||
semantics.</p>
|
semantics.</p>
|
||||||
<table border="1" class="table">
|
<table border="1" class="docutils">
|
||||||
<colgroup>
|
<colgroup>
|
||||||
<col width="36%" />
|
<col width="36%" />
|
||||||
<col width="33%" />
|
<col width="33%" />
|
||||||
<col width="31%" />
|
<col width="31%" />
|
||||||
</colgroup>
|
</colgroup>
|
||||||
<thead valign="bottom">
|
<thead valign="bottom">
|
||||||
<tr><th colspan="3">Single Pass Iterator Requirements (in addition to Incrementable Iterator and Equality
|
<tr><th class="head" colspan="3">Single Pass Iterator Requirements (in addition to Incrementable Iterator and Equality
|
||||||
Comparable)</th>
|
Comparable)</th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><th>Expression</th>
|
<tr><th class="head">Expression</th>
|
||||||
<th>Return Type</th>
|
<th class="head">Return Type</th>
|
||||||
<th>Assertion/Semantics /
|
<th class="head">Assertion/Semantics /
|
||||||
Pre-/Post-condition</th>
|
Pre-/Post-condition</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr><td><tt class="literal"><span class="pre">++r</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">++r</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">X&</span></tt></td>
|
<td><tt class="docutils literal"><span class="pre">X&</span></tt></td>
|
||||||
<td>pre: <tt class="literal"><span class="pre">r</span></tt> is
|
<td>pre: <tt class="docutils literal"><span class="pre">r</span></tt> is
|
||||||
dereferenceable; post:
|
dereferenceable; post:
|
||||||
<tt class="literal"><span class="pre">r</span></tt> is dereferenceable or
|
<tt class="docutils literal"><span class="pre">r</span></tt> is dereferenceable or
|
||||||
<tt class="literal"><span class="pre">r</span></tt> is past-the-end</td>
|
<tt class="docutils literal"><span class="pre">r</span></tt> is past-the-end</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td><tt class="literal"><span class="pre">a</span> <span class="pre">==</span> <span class="pre">b</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">a</span> <span class="pre">==</span> <span class="pre">b</span></tt></td>
|
||||||
<td>convertible to <tt class="literal"><span class="pre">bool</span></tt></td>
|
<td>convertible to <tt class="docutils literal"><span class="pre">bool</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">==</span></tt> is an equivalence
|
<td><tt class="docutils literal"><span class="pre">==</span></tt> is an equivalence
|
||||||
relation over its domain</td>
|
relation over its domain</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td><tt class="literal"><span class="pre">a</span> <span class="pre">!=</span> <span class="pre">b</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">a</span> <span class="pre">!=</span> <span class="pre">b</span></tt></td>
|
||||||
<td>convertible to <tt class="literal"><span class="pre">bool</span></tt></td>
|
<td>convertible to <tt class="docutils literal"><span class="pre">bool</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">!(a</span> <span class="pre">==</span> <span class="pre">b)</span></tt></td>
|
<td><tt class="docutils literal"><span class="pre">!(a</span> <span class="pre">==</span> <span class="pre">b)</span></tt></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><td><tt class="literal"><span class="pre">iterator_traversal<X>::type</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">iterator_traversal<X>::type</span></tt></td>
|
||||||
<td>Convertible to
|
<td>Convertible to
|
||||||
<tt class="literal"><span class="pre">single_pass_traversal_tag</span></tt></td>
|
<tt class="docutils literal"><span class="pre">single_pass_traversal_tag</span></tt></td>
|
||||||
<td> </td>
|
<td> </td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<hr class="footer" />
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<a class="reference" href="SinglePassIterator.rst">View document source</a>.
|
<hr class="footer" />
|
||||||
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
<a class="reference external" href="SinglePassIterator.rst">View document source</a>.
|
||||||
|
Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
4
doc/SinglePassIterator.rst
Executable file → Normal file
4
doc/SinglePassIterator.rst
Executable file → Normal file
@@ -1,3 +1,7 @@
|
|||||||
|
.. Copyright David Abrahams 2006. 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)
|
||||||
|
|
||||||
Single Pass Iterator Concept
|
Single Pass Iterator Concept
|
||||||
............................
|
............................
|
||||||
|
|
||||||
|
|||||||
@@ -3,47 +3,52 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
<meta name="generator" content="Docutils 0.3.6: http://docutils.sourceforge.net/" />
|
<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
|
||||||
<title>Swappable Iterator Concept</title>
|
<title>Swappable Iterator Concept</title>
|
||||||
<link rel="stylesheet" href="default.css" type="text/css" />
|
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1 class="title">Swappable Iterator Concept</h1>
|
|
||||||
<div class="document" id="swappable-iterator-concept">
|
<div class="document" id="swappable-iterator-concept">
|
||||||
<p>A class or built-in type <tt class="literal"><span class="pre">X</span></tt> models the <em>Swappable Iterator</em> concept
|
<h1 class="title">Swappable Iterator Concept</h1>
|
||||||
if, in addition to <tt class="literal"><span class="pre">X</span></tt> being Copy Constructible, the following
|
|
||||||
|
<!-- Copyright David Abrahams 2006. 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) -->
|
||||||
|
<p>A class or built-in type <tt class="docutils literal"><span class="pre">X</span></tt> models the <em>Swappable Iterator</em> concept
|
||||||
|
if, in addition to <tt class="docutils literal"><span class="pre">X</span></tt> being Copy Constructible, the following
|
||||||
expressions are valid and respect the stated semantics.</p>
|
expressions are valid and respect the stated semantics.</p>
|
||||||
<table border="1" class="table">
|
<table border="1" class="docutils">
|
||||||
<colgroup>
|
<colgroup>
|
||||||
<col width="37%" />
|
<col width="37%" />
|
||||||
<col width="19%" />
|
<col width="19%" />
|
||||||
<col width="43%" />
|
<col width="43%" />
|
||||||
</colgroup>
|
</colgroup>
|
||||||
<thead valign="bottom">
|
<thead valign="bottom">
|
||||||
<tr><th colspan="3">Swappable Iterator Requirements (in addition to Copy Constructible)</th>
|
<tr><th class="head" colspan="3">Swappable Iterator Requirements (in addition to Copy Constructible)</th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><th>Expression</th>
|
<tr><th class="head">Expression</th>
|
||||||
<th>Return Type</th>
|
<th class="head">Return Type</th>
|
||||||
<th>Postcondition</th>
|
<th class="head">Postcondition</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr><td><tt class="literal"><span class="pre">iter_swap(a,</span> <span class="pre">b)</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">iter_swap(a,</span> <span class="pre">b)</span></tt></td>
|
||||||
<td><tt class="literal"><span class="pre">void</span></tt></td>
|
<td><tt class="docutils literal"><span class="pre">void</span></tt></td>
|
||||||
<td>the pointed to values are
|
<td>the pointed to values are
|
||||||
exchanged</td>
|
exchanged</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<dl>
|
<dl class="docutils">
|
||||||
<dt>[<em>Note:</em> An iterator that is a model of the <em>Readable</em> and <em>Writable Iterator</em> concepts</dt>
|
<dt>[<em>Note:</em> An iterator that is a model of the <em>Readable</em> and <em>Writable Iterator</em> concepts</dt>
|
||||||
<dd>is also a model of <em>Swappable Iterator</em>. <em>--end note</em>]</dd>
|
<dd>is also a model of <em>Swappable Iterator</em>. <em>--end note</em>]</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
<hr class="footer" />
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<a class="reference" href="SwappableIterator.rst">View document source</a>.
|
<hr class="footer" />
|
||||||
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
<a class="reference external" href="SwappableIterator.rst">View document source</a>.
|
||||||
|
Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
4
doc/SwappableIterator.rst
Executable file → Normal file
4
doc/SwappableIterator.rst
Executable file → Normal file
@@ -1,3 +1,7 @@
|
|||||||
|
.. Copyright David Abrahams 2006. 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)
|
||||||
|
|
||||||
Swappable Iterator Concept
|
Swappable Iterator Concept
|
||||||
..........................
|
..........................
|
||||||
|
|
||||||
|
|||||||
@@ -3,45 +3,50 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
<meta name="generator" content="Docutils 0.3.6: http://docutils.sourceforge.net/" />
|
<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
|
||||||
<title>Writable Iterator Concept</title>
|
<title>Writable Iterator Concept</title>
|
||||||
<link rel="stylesheet" href="default.css" type="text/css" />
|
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<h1 class="title">Writable Iterator Concept</h1>
|
|
||||||
<div class="document" id="writable-iterator-concept">
|
<div class="document" id="writable-iterator-concept">
|
||||||
<p>A class or built-in type <tt class="literal"><span class="pre">X</span></tt> models the <em>Writable Iterator</em> concept
|
<h1 class="title">Writable Iterator Concept</h1>
|
||||||
if, in addition to <tt class="literal"><span class="pre">X</span></tt> being Copy Constructible, the following
|
|
||||||
|
<!-- Copyright David Abrahams 2006. 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) -->
|
||||||
|
<p>A class or built-in type <tt class="docutils literal"><span class="pre">X</span></tt> models the <em>Writable Iterator</em> concept
|
||||||
|
if, in addition to <tt class="docutils literal"><span class="pre">X</span></tt> being Copy Constructible, the following
|
||||||
expressions are valid and respect the stated semantics. Writable
|
expressions are valid and respect the stated semantics. Writable
|
||||||
Iterators have an associated <em>set of value types</em>.</p>
|
Iterators have an associated <em>set of value types</em>.</p>
|
||||||
<table border="1" class="table">
|
<table border="1" class="docutils">
|
||||||
<colgroup>
|
<colgroup>
|
||||||
<col width="37%" />
|
<col width="37%" />
|
||||||
<col width="21%" />
|
<col width="21%" />
|
||||||
<col width="42%" />
|
<col width="42%" />
|
||||||
</colgroup>
|
</colgroup>
|
||||||
<thead valign="bottom">
|
<thead valign="bottom">
|
||||||
<tr><th colspan="3">Writable Iterator Requirements (in addition to Copy Constructible)</th>
|
<tr><th class="head" colspan="3">Writable Iterator Requirements (in addition to Copy Constructible)</th>
|
||||||
</tr>
|
</tr>
|
||||||
<tr><th>Expression</th>
|
<tr><th class="head">Expression</th>
|
||||||
<th>Return Type</th>
|
<th class="head">Return Type</th>
|
||||||
<th>Precondition</th>
|
<th class="head">Precondition</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr><td><tt class="literal"><span class="pre">*a</span> <span class="pre">=</span> <span class="pre">o</span></tt></td>
|
<tr><td><tt class="docutils literal"><span class="pre">*a</span> <span class="pre">=</span> <span class="pre">o</span></tt></td>
|
||||||
<td> </td>
|
<td> </td>
|
||||||
<td>pre: The type of <tt class="literal"><span class="pre">o</span></tt>
|
<td>pre: The type of <tt class="docutils literal"><span class="pre">o</span></tt>
|
||||||
is in the set of
|
is in the set of
|
||||||
value types of <tt class="literal"><span class="pre">X</span></tt></td>
|
value types of <tt class="docutils literal"><span class="pre">X</span></tt></td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<hr class="footer" />
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<a class="reference" href="WritableIterator.rst">View document source</a>.
|
<hr class="footer" />
|
||||||
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
<a class="reference external" href="WritableIterator.rst">View document source</a>.
|
||||||
|
Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
4
doc/WritableIterator.rst
Executable file → Normal file
4
doc/WritableIterator.rst
Executable file → Normal file
@@ -1,3 +1,7 @@
|
|||||||
|
.. Copyright David Abrahams 2006. 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)
|
||||||
|
|
||||||
Writable Iterator Concept
|
Writable Iterator Concept
|
||||||
.........................
|
.........................
|
||||||
|
|
||||||
|
|||||||
75
doc/advance.rst
Normal file
75
doc/advance.rst
Normal 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
|
||||||
@@ -3,13 +3,13 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
<meta name="generator" content="Docutils 0.3.8: http://docutils.sourceforge.net/" />
|
<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
|
||||||
<title>Counting Iterator</title>
|
<title>Counting Iterator</title>
|
||||||
<meta name="author" content="David Abrahams, Jeremy Siek, Thomas Witt" />
|
<meta name="author" content="David Abrahams, Jeremy Siek, Thomas Witt" />
|
||||||
<meta name="organization" content="Boost Consulting, Indiana University Open Systems Lab, University of Hanover Institute for Transport Railway Operation and Construction" />
|
<meta name="organization" content="Boost Consulting, Indiana University Open Systems Lab, University of Hanover Institute for Transport Railway Operation and Construction" />
|
||||||
<meta name="date" content="2004-11-01" />
|
<meta name="date" content="2006-09-11" />
|
||||||
<meta name="copyright" content="Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003." />
|
<meta name="copyright" content="Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003." />
|
||||||
<link rel="stylesheet" href="default.css" type="text/css" />
|
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="document" id="counting-iterator">
|
<div class="document" id="counting-iterator">
|
||||||
@@ -21,17 +21,20 @@
|
|||||||
<tr><th class="docinfo-name">Author:</th>
|
<tr><th class="docinfo-name">Author:</th>
|
||||||
<td>David Abrahams, Jeremy Siek, Thomas Witt</td></tr>
|
<td>David Abrahams, Jeremy Siek, Thomas Witt</td></tr>
|
||||||
<tr><th class="docinfo-name">Contact:</th>
|
<tr><th class="docinfo-name">Contact:</th>
|
||||||
<td><a class="first reference" href="mailto:dave@boost-consulting.com">dave@boost-consulting.com</a>, <a class="reference" href="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</a>, <a class="last reference" href="mailto:witt@ive.uni-hannover.de">witt@ive.uni-hannover.de</a></td></tr>
|
<td><a class="first reference external" href="mailto:dave@boost-consulting.com">dave@boost-consulting.com</a>, <a class="reference external" href="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</a>, <a class="last reference external" href="mailto:witt@ive.uni-hannover.de">witt@ive.uni-hannover.de</a></td></tr>
|
||||||
<tr><th class="docinfo-name">Organization:</th>
|
<tr><th class="docinfo-name">Organization:</th>
|
||||||
<td><a class="first reference" href="http://www.boost-consulting.com">Boost Consulting</a>, Indiana University <a class="reference" href="http://www.osl.iu.edu">Open Systems
|
<td><a class="first reference external" href="http://www.boost-consulting.com">Boost Consulting</a>, Indiana University <a class="reference external" href="http://www.osl.iu.edu">Open Systems
|
||||||
Lab</a>, University of Hanover <a class="last reference" href="http://www.ive.uni-hannover.de">Institute for Transport
|
Lab</a>, University of Hanover <a class="last reference external" href="http://www.ive.uni-hannover.de">Institute for Transport
|
||||||
Railway Operation and Construction</a></td></tr>
|
Railway Operation and Construction</a></td></tr>
|
||||||
<tr><th class="docinfo-name">Date:</th>
|
<tr><th class="docinfo-name">Date:</th>
|
||||||
<td>2004-11-01</td></tr>
|
<td>2006-09-11</td></tr>
|
||||||
<tr><th class="docinfo-name">Copyright:</th>
|
<tr><th class="docinfo-name">Copyright:</th>
|
||||||
<td>Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.</td></tr>
|
<td>Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.</td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<!-- 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) -->
|
||||||
<table class="docutils field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
@@ -44,6 +47,9 @@ The counting iterator adaptor adds this crucial piece of
|
|||||||
functionality to whatever type it wraps. One can use the
|
functionality to whatever type it wraps. One can use the
|
||||||
counting iterator adaptor not only with integer types, but with
|
counting iterator adaptor not only with integer types, but with
|
||||||
any incrementable type.</p>
|
any incrementable type.</p>
|
||||||
|
<!-- Copyright David Abrahams 2006. 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) -->
|
||||||
<p class="last"><tt class="docutils literal"><span class="pre">counting_iterator</span></tt> adapts an object by adding an <tt class="docutils literal"><span class="pre">operator*</span></tt> that
|
<p class="last"><tt class="docutils literal"><span class="pre">counting_iterator</span></tt> adapts an object by adding an <tt class="docutils literal"><span class="pre">operator*</span></tt> that
|
||||||
returns the current value of the object. All other iterator operations
|
returns the current value of the object. All other iterator operations
|
||||||
are forwarded to the adapted object.</p>
|
are forwarded to the adapted object.</p>
|
||||||
@@ -52,17 +58,20 @@ are forwarded to the adapted object.</p>
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<div class="contents topic" id="table-of-contents">
|
<div class="contents topic" id="table-of-contents">
|
||||||
<p class="topic-title first"><a name="table-of-contents">Table of Contents</a></p>
|
<p class="topic-title first">Table of Contents</p>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><a class="reference" href="#counting-iterator-synopsis" id="id2" name="id2"><tt class="docutils literal"><span class="pre">counting_iterator</span></tt> synopsis</a></li>
|
<li><a class="reference internal" href="#counting-iterator-synopsis" id="id2"><tt class="docutils literal"><span class="pre">counting_iterator</span></tt> synopsis</a></li>
|
||||||
<li><a class="reference" href="#counting-iterator-requirements" id="id3" name="id3"><tt class="docutils literal"><span class="pre">counting_iterator</span></tt> requirements</a></li>
|
<li><a class="reference internal" href="#counting-iterator-requirements" id="id3"><tt class="docutils literal"><span class="pre">counting_iterator</span></tt> requirements</a></li>
|
||||||
<li><a class="reference" href="#counting-iterator-models" id="id4" name="id4"><tt class="docutils literal"><span class="pre">counting_iterator</span></tt> models</a></li>
|
<li><a class="reference internal" href="#counting-iterator-models" id="id4"><tt class="docutils literal"><span class="pre">counting_iterator</span></tt> models</a></li>
|
||||||
<li><a class="reference" href="#counting-iterator-operations" id="id5" name="id5"><tt class="docutils literal"><span class="pre">counting_iterator</span></tt> operations</a></li>
|
<li><a class="reference internal" href="#counting-iterator-operations" id="id5"><tt class="docutils literal"><span class="pre">counting_iterator</span></tt> operations</a></li>
|
||||||
<li><a class="reference" href="#example" id="id6" name="id6">Example</a></li>
|
<li><a class="reference internal" href="#example" id="id6">Example</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="counting-iterator-synopsis">
|
<div class="section" id="counting-iterator-synopsis">
|
||||||
<h1><a class="toc-backref" href="#id2" name="counting-iterator-synopsis"><tt class="docutils literal"><span class="pre">counting_iterator</span></tt> synopsis</a></h1>
|
<h1><a class="toc-backref" href="#id2"><tt class="docutils literal"><span class="pre">counting_iterator</span></tt> synopsis</a></h1>
|
||||||
|
<!-- Copyright David Abrahams 2006. 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) -->
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
template <
|
template <
|
||||||
class Incrementable
|
class Incrementable
|
||||||
@@ -98,11 +107,11 @@ algorithm:</p>
|
|||||||
if (CategoryOrTraversal is not use_default)
|
if (CategoryOrTraversal is not use_default)
|
||||||
return CategoryOrTraversal
|
return CategoryOrTraversal
|
||||||
else if (numeric_limits<Incrementable>::is_specialized)
|
else if (numeric_limits<Incrementable>::is_specialized)
|
||||||
return <a class="reference" href="iterator_facade.html#iterator-category"><em>iterator-category</em></a>(
|
return <a class="reference external" href="iterator_facade.html#iterator-category"><em>iterator-category</em></a>(
|
||||||
random_access_traversal_tag, Incrementable, const Incrementable&)
|
random_access_traversal_tag, Incrementable, const Incrementable&)
|
||||||
else
|
else
|
||||||
return <a class="reference" href="iterator_facade.html#iterator-category"><em>iterator-category</em></a>(
|
return <a class="reference external" href="iterator_facade.html#iterator-category"><em>iterator-category</em></a>(
|
||||||
iterator_traversal<Incrementable>::type,
|
iterator_traversal<Incrementable>::type,
|
||||||
Incrementable, const Incrementable&)
|
Incrementable, const Incrementable&)
|
||||||
</pre>
|
</pre>
|
||||||
<dl class="docutils">
|
<dl class="docutils">
|
||||||
@@ -113,7 +122,7 @@ is true.]</dd>
|
|||||||
</dl>
|
</dl>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="counting-iterator-requirements">
|
<div class="section" id="counting-iterator-requirements">
|
||||||
<h1><a class="toc-backref" href="#id3" name="counting-iterator-requirements"><tt class="docutils literal"><span class="pre">counting_iterator</span></tt> requirements</a></h1>
|
<h1><a class="toc-backref" href="#id3"><tt class="docutils literal"><span class="pre">counting_iterator</span></tt> requirements</a></h1>
|
||||||
<p>The <tt class="docutils literal"><span class="pre">Incrementable</span></tt> argument shall be Copy Constructible and Assignable.</p>
|
<p>The <tt class="docutils literal"><span class="pre">Incrementable</span></tt> argument shall be Copy Constructible and Assignable.</p>
|
||||||
<p>If <tt class="docutils literal"><span class="pre">iterator_category</span></tt> is convertible to <tt class="docutils literal"><span class="pre">forward_iterator_tag</span></tt>
|
<p>If <tt class="docutils literal"><span class="pre">iterator_category</span></tt> is convertible to <tt class="docutils literal"><span class="pre">forward_iterator_tag</span></tt>
|
||||||
or <tt class="docutils literal"><span class="pre">forward_traversal_tag</span></tt>, the following must be well-formed:</p>
|
or <tt class="docutils literal"><span class="pre">forward_traversal_tag</span></tt>, the following must be well-formed:</p>
|
||||||
@@ -139,7 +148,7 @@ i < j;
|
|||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="counting-iterator-models">
|
<div class="section" id="counting-iterator-models">
|
||||||
<h1><a class="toc-backref" href="#id4" name="counting-iterator-models"><tt class="docutils literal"><span class="pre">counting_iterator</span></tt> models</a></h1>
|
<h1><a class="toc-backref" href="#id4"><tt class="docutils literal"><span class="pre">counting_iterator</span></tt> models</a></h1>
|
||||||
<p>Specializations of <tt class="docutils literal"><span class="pre">counting_iterator</span></tt> model Readable Lvalue
|
<p>Specializations of <tt class="docutils literal"><span class="pre">counting_iterator</span></tt> model Readable Lvalue
|
||||||
Iterator. In addition, they model the concepts corresponding to the
|
Iterator. In addition, they model the concepts corresponding to the
|
||||||
iterator tags to which their <tt class="docutils literal"><span class="pre">iterator_category</span></tt> is convertible.
|
iterator tags to which their <tt class="docutils literal"><span class="pre">iterator_category</span></tt> is convertible.
|
||||||
@@ -155,7 +164,7 @@ concepts modeled by <tt class="docutils literal"><span class="pre">Incrementable
|
|||||||
interoperable with <tt class="docutils literal"><span class="pre">Y</span></tt>.</p>
|
interoperable with <tt class="docutils literal"><span class="pre">Y</span></tt>.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="counting-iterator-operations">
|
<div class="section" id="counting-iterator-operations">
|
||||||
<h1><a class="toc-backref" href="#id5" name="counting-iterator-operations"><tt class="docutils literal"><span class="pre">counting_iterator</span></tt> operations</a></h1>
|
<h1><a class="toc-backref" href="#id5"><tt class="docutils literal"><span class="pre">counting_iterator</span></tt> operations</a></h1>
|
||||||
<p>In addition to the operations required by the concepts modeled by
|
<p>In addition to the operations required by the concepts modeled by
|
||||||
<tt class="docutils literal"><span class="pre">counting_iterator</span></tt>, <tt class="docutils literal"><span class="pre">counting_iterator</span></tt> provides the following
|
<tt class="docutils literal"><span class="pre">counting_iterator</span></tt>, <tt class="docutils literal"><span class="pre">counting_iterator</span></tt> provides the following
|
||||||
operations.</p>
|
operations.</p>
|
||||||
@@ -228,6 +237,9 @@ operations.</p>
|
|||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<!-- Copyright David Abrahams 2006. 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) -->
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
template <class Incrementable>
|
template <class Incrementable>
|
||||||
counting_iterator<Incrementable> make_counting_iterator(Incrementable x);
|
counting_iterator<Incrementable> make_counting_iterator(Incrementable x);
|
||||||
@@ -241,9 +253,12 @@ with <tt class="docutils literal"><span class="pre">current</span></tt> construc
|
|||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<!-- Copyright David Abrahams 2006. 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) -->
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="example">
|
<div class="section" id="example">
|
||||||
<h1><a class="toc-backref" href="#id6" name="example">Example</a></h1>
|
<h1><a class="toc-backref" href="#id6">Example</a></h1>
|
||||||
<p>This example fills an array with numbers and a second array with
|
<p>This example fills an array with numbers and a second array with
|
||||||
pointers into the first array, using <tt class="docutils literal"><span class="pre">counting_iterator</span></tt> for both
|
pointers into the first array, using <tt class="docutils literal"><span class="pre">counting_iterator</span></tt> for both
|
||||||
tasks. Finally <tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> is used to print out the numbers
|
tasks. Finally <tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> is used to print out the numbers
|
||||||
@@ -261,7 +276,7 @@ std::copy(boost::make_counting_iterator(numbers.begin()),
|
|||||||
boost::make_counting_iterator(numbers.end()),
|
boost::make_counting_iterator(numbers.end()),
|
||||||
std::back_inserter(pointers));
|
std::back_inserter(pointers));
|
||||||
|
|
||||||
std::cout << "indirectly printing out the numbers from 0 to "
|
std::cout << "indirectly printing out the numbers from 0 to "
|
||||||
<< N << std::endl;
|
<< N << std::endl;
|
||||||
std::copy(boost::make_indirect_iterator(pointers.begin()),
|
std::copy(boost::make_indirect_iterator(pointers.begin()),
|
||||||
boost::make_indirect_iterator(pointers.end()),
|
boost::make_indirect_iterator(pointers.end()),
|
||||||
@@ -271,15 +286,16 @@ std::cout << std::endl;
|
|||||||
<p>The output is:</p>
|
<p>The output is:</p>
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
indirectly printing out the numbers from 0 to 7
|
indirectly printing out the numbers from 0 to 7
|
||||||
0 1 2 3 4 5 6
|
0 1 2 3 4 5 6
|
||||||
</pre>
|
</pre>
|
||||||
<p>The source code for this example can be found <a class="reference" href="../example/counting_iterator_example.cpp">here</a>.</p>
|
<p>The source code for this example can be found <a class="reference external" href="../example/counting_iterator_example.cpp">here</a>.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr class="docutils footer" />
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<a class="reference" href="counting_iterator.rst">View document source</a>.
|
<hr class="footer" />
|
||||||
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
<a class="reference external" href="counting_iterator.rst">View document source</a>.
|
||||||
|
Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
BIN
doc/counting_iterator.pdf
Executable file → Normal file
BIN
doc/counting_iterator.pdf
Executable file → Normal file
Binary file not shown.
@@ -1,3 +1,7 @@
|
|||||||
|
.. 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)
|
||||||
|
|
||||||
+++++++++++++++++++
|
+++++++++++++++++++
|
||||||
Counting Iterator
|
Counting Iterator
|
||||||
+++++++++++++++++++
|
+++++++++++++++++++
|
||||||
@@ -7,7 +11,6 @@
|
|||||||
:organization: `Boost Consulting`_, Indiana University `Open Systems
|
:organization: `Boost Consulting`_, Indiana University `Open Systems
|
||||||
Lab`_, University of Hanover `Institute for Transport
|
Lab`_, University of Hanover `Institute for Transport
|
||||||
Railway Operation and Construction`_
|
Railway Operation and Construction`_
|
||||||
:date: $Date$
|
|
||||||
:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
|
:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
|
||||||
|
|
||||||
.. _`Boost Consulting`: http://www.boost-consulting.com
|
.. _`Boost Consulting`: http://www.boost-consulting.com
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
.. Copyright David Abrahams 2006. 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)
|
||||||
|
|
||||||
``counting_iterator`` adapts an object by adding an ``operator*`` that
|
``counting_iterator`` adapts an object by adding an ``operator*`` that
|
||||||
returns the current value of the object. All other iterator operations
|
returns the current value of the object. All other iterator operations
|
||||||
are forwarded to the adapted object.
|
are forwarded to the adapted object.
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
.. Copyright David Abrahams 2006. 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)
|
||||||
|
|
||||||
Example
|
Example
|
||||||
.......
|
.......
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
.. Copyright David Abrahams 2006. 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)
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
template <
|
template <
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
/*
|
/*
|
||||||
:Author: David Goodger
|
:Author: David Goodger
|
||||||
:Contact: goodger@users.sourceforge.net
|
:Contact: goodger@users.sourceforge.net
|
||||||
:date: $Date$
|
|
||||||
:version: $Revision$
|
|
||||||
:copyright: This stylesheet has been placed in the public domain.
|
:copyright: This stylesheet has been placed in the public domain.
|
||||||
|
|
||||||
|
boostinspect:nolicense
|
||||||
|
|
||||||
Default cascading style sheet for the HTML output of Docutils.
|
Default cascading style sheet for the HTML output of Docutils.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|||||||
72
doc/distance.rst
Normal file
72
doc/distance.rst
Normal 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
|
||||||
1
doc/docutils.sty
Executable file → Normal file
1
doc/docutils.sty
Executable file → Normal file
@@ -4,7 +4,6 @@
|
|||||||
%%
|
%%
|
||||||
%% o author: Alexander Schmolck (a.schmolck@gmx.net)
|
%% o author: Alexander Schmolck (a.schmolck@gmx.net)
|
||||||
%% o created: 2002-07-07 10:50:31+00:40
|
%% o created: 2002-07-07 10:50:31+00:40
|
||||||
%% o last modified: $Date: 2004/01/29 05:55:26 $
|
|
||||||
%% o keywords:
|
%% o keywords:
|
||||||
%% o license:
|
%% o license:
|
||||||
%XXX titlesec
|
%XXX titlesec
|
||||||
|
|||||||
@@ -1,228 +0,0 @@
|
|||||||
Index: facade-and-adaptor.rst
|
|
||||||
===================================================================
|
|
||||||
RCS file: /cvsroot/boost/boost/libs/iterator/doc/facade-and-adaptor.rst,v
|
|
||||||
retrieving revision 1.9
|
|
||||||
retrieving revision 1.14
|
|
||||||
diff -b -d -u -r1.9 -r1.14
|
|
||||||
--- facade-and-adaptor.rst 22 Sep 2003 19:55:00 -0000 1.9
|
|
||||||
+++ facade-and-adaptor.rst 18 Jan 2004 15:51:06 -0000 1.14
|
|
||||||
@@ -3,17 +3,25 @@ None
|
|
||||||
+++++++++++++++++++++++++++++
|
|
||||||
|
|
||||||
:Author: David Abrahams, Jeremy Siek, Thomas Witt
|
|
||||||
-:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@acm.org
|
|
||||||
+:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com
|
|
||||||
:organization: `Boost Consulting`_, Indiana University `Open Systems
|
|
||||||
- Lab`_, University of Hanover `Institute for Transport
|
|
||||||
- Railway Operation and Construction`_
|
|
||||||
-:date: $Date: 2004/01/18 19:56:39 $
|
|
||||||
-:Number: N1530=03-0113
|
|
||||||
+ Lab`_, `Zephyr Associates, Inc.`_
|
|
||||||
+:date: $Date: 2004/01/18 19:56:39 $
|
|
||||||
+
|
|
||||||
+:Number: This is a revised version of N1530_\ =03-0113, which was
|
|
||||||
+ accepted for Technical Report 1 by the C++ standard
|
|
||||||
+ committee's library working group.
|
|
||||||
+
|
|
||||||
+.. Version 1.9 of this ReStructuredText document corresponds to
|
|
||||||
+ n1530_, the paper accepted by the LWG.
|
|
||||||
+
|
|
||||||
+.. _n1530: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1530.html
|
|
||||||
+
|
|
||||||
:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved
|
|
||||||
|
|
||||||
.. _`Boost Consulting`: http://www.boost-consulting.com
|
|
||||||
.. _`Open Systems Lab`: http://www.osl.iu.edu
|
|
||||||
-.. _`Institute for Transport Railway Operation and Construction`: http://www.ive.uni-hannover.de
|
|
||||||
+.. _`Zephyr Associates, Inc.`: http://www.styleadvisor.com
|
|
||||||
|
|
||||||
:abstract: We propose a set of class templates that help programmers
|
|
||||||
build standard-conforming iterators, both from scratch and
|
|
||||||
@@ -124,15 +132,15 @@ None
|
|
||||||
=================
|
|
||||||
|
|
||||||
This proposal is formulated in terms of the new ``iterator concepts``
|
|
||||||
-as proposed in `n1477`_, since user-defined and especially adapted
|
|
||||||
+as proposed in n1550_, since user-defined and especially adapted
|
|
||||||
iterators suffer from the well known categorization problems that are
|
|
||||||
inherent to the current iterator categories.
|
|
||||||
|
|
||||||
-.. _`n1477`: http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/papers/2003/n1477.html
|
|
||||||
+.. _n1550: http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/papers/2003/n1550.html
|
|
||||||
|
|
||||||
-This proposal does not strictly depend on proposal `n1477`_, as there
|
|
||||||
+This proposal does not strictly depend on proposal n1550_, as there
|
|
||||||
is a direct mapping between new and old categories. This proposal
|
|
||||||
-could be reformulated using this mapping if `n1477`_ was not accepted.
|
|
||||||
+could be reformulated using this mapping if n1550_ was not accepted.
|
|
||||||
|
|
||||||
Interoperability
|
|
||||||
================
|
|
||||||
@@ -141,24 +149,24 @@ None
|
|
||||||
current standard. There are currently two defect reports that are
|
|
||||||
concerned with interoperability issues.
|
|
||||||
|
|
||||||
-Issue `179`_ concerns the fact that mutable container iterator types
|
|
||||||
+Issue 179_ concerns the fact that mutable container iterator types
|
|
||||||
are only required to be convertible to the corresponding constant
|
|
||||||
iterator types, but objects of these types are not required to
|
|
||||||
interoperate in comparison or subtraction expressions. This situation
|
|
||||||
is tedious in practice and out of line with the way built in types
|
|
||||||
work. This proposal implements the proposed resolution to issue
|
|
||||||
-`179`_, as most standard library implementations do nowadays. In other
|
|
||||||
+179_, as most standard library implementations do nowadays. In other
|
|
||||||
words, if an iterator type A has an implicit or user defined
|
|
||||||
conversion to an iterator type B, the iterator types are interoperable
|
|
||||||
and the usual set of operators are available.
|
|
||||||
|
|
||||||
-Issue `280`_ concerns the current lack of interoperability between
|
|
||||||
+Issue 280_ concerns the current lack of interoperability between
|
|
||||||
reverse iterator types. The proposed new reverse_iterator template
|
|
||||||
fixes the issues raised in 280. It provides the desired
|
|
||||||
interoperability without introducing unwanted overloads.
|
|
||||||
|
|
||||||
-.. _`179`: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#179
|
|
||||||
-.. _`280`: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-active.html#280
|
|
||||||
+.. _179: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#179
|
|
||||||
+.. _280: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-active.html#280
|
|
||||||
|
|
||||||
|
|
||||||
Iterator Facade
|
|
||||||
@@ -195,7 +203,7 @@ None
|
|
||||||
* ``filter_iterator``, which provides a view of an iterator range in
|
|
||||||
which some elements of the underlying range are skipped.
|
|
||||||
|
|
||||||
-.. _counting_iterator:
|
|
||||||
+.. _counting:
|
|
||||||
|
|
||||||
* ``counting_iterator``, which adapts any incrementable type
|
|
||||||
(e.g. integers, iterators) so that incrementing/decrementing the
|
|
||||||
@@ -226,15 +234,13 @@ Issue 9.1 et al
|
|
||||||
::
|
|
||||||
|
|
||||||
struct use_default;
|
|
||||||
- const unsigned use_default_access = -1;
|
|
||||||
|
|
||||||
struct iterator_core_access { /* implementation detail */ };
|
|
||||||
|
|
||||||
template <
|
|
||||||
class Derived
|
|
||||||
, class Value
|
|
||||||
- , unsigned AccessCategory
|
|
||||||
- , class TraversalCategory
|
|
||||||
+ , class CategoryOrTraversal
|
|
||||||
, class Reference = Value&
|
|
||||||
, class Difference = ptrdiff_t
|
|
||||||
>
|
|
||||||
@@ -244,8 +250,7 @@ Issue 9.1 et al.
|
|
||||||
class Derived
|
|
||||||
, class Base
|
|
||||||
, class Value = use_default
|
|
||||||
- , unsigned Access = use_default_access
|
|
||||||
- , class Traversal = use_default
|
|
||||||
+ , class CategoryOrTraversal = use_default
|
|
||||||
, class Reference = use_default
|
|
||||||
, class Difference = use_default
|
|
||||||
>
|
|
||||||
@@ -254,10 +259,9 @@ Issue 9.1 et al.
|
|
||||||
template <
|
|
||||||
class Iterator
|
|
||||||
, class Value = use_default
|
|
||||||
- , unsigned Access = use_default_access
|
|
||||||
- , class Traversal = use_default
|
|
||||||
+ , class CategoryOrTraversal = use_default
|
|
||||||
, class Reference = use_default
|
|
||||||
, class Difference = use_default
|
|
||||||
>
|
|
||||||
class indirect_iterator;
|
|
||||||
|
|
||||||
Issue 9.44y
|
|
||||||
|
|
||||||
+ template <class Dereferenceable>
|
|
||||||
+ struct pointee;
|
|
||||||
+
|
|
||||||
+ template <class Dereferenceable>
|
|
||||||
+ struct indirect_reference;
|
|
||||||
+
|
|
||||||
template <class Iterator>
|
|
||||||
class reverse_iterator;
|
|
||||||
|
|
||||||
@@ -277,8 +287,7 @@ Issue 9.1 et al.
|
|
||||||
|
|
||||||
template <
|
|
||||||
class Incrementable
|
|
||||||
- , unsigned Access = use_default_access
|
|
||||||
- , class Traversal = use_default
|
|
||||||
+ , class CategoryOrTraversal = use_default
|
|
||||||
, class Difference = use_default
|
|
||||||
>
|
|
||||||
class counting_iterator
|
|
||||||
@@ -312,17 +321,35 @@ Issue 9.8
|
|
||||||
Specialized adaptors [lib.iterator.special.adaptors]
|
|
||||||
====================================================
|
|
||||||
|
|
||||||
-.. The requirements for all of these need to be written *much* more
|
|
||||||
- formally -DWA
|
|
||||||
-
|
|
||||||
|
|
||||||
-[*Note:* The ``enable_if_convertible<X,Y>::type`` expression used in
|
|
||||||
+The ``enable_if_convertible<X,Y>::type`` expression used in
|
|
||||||
this section is for exposition purposes. The converting constructors
|
|
||||||
for specialized adaptors should be only be in an overload set provided
|
|
||||||
that an object of type ``X`` is implicitly convertible to an object of
|
|
||||||
-type ``Y``. The ``enable_if_convertible`` approach uses SFINAE to
|
|
||||||
+type ``Y``.
|
|
||||||
+The signatures involving ``enable_if_convertible`` should behave
|
|
||||||
+*as-if* ``enable_if_convertible`` were defined to be::
|
|
||||||
+
|
|
||||||
+ template <bool> enable_if_convertible_impl
|
|
||||||
+ {};
|
|
||||||
+
|
|
||||||
+ template <> enable_if_convertible_impl<true>
|
|
||||||
+ { struct type; };
|
|
||||||
+
|
|
||||||
+ template<typename From, typename To>
|
|
||||||
+ struct enable_if_convertible
|
|
||||||
+ : enable_if_convertible_impl<is_convertible<From,To>::value>
|
|
||||||
+ {};
|
|
||||||
+
|
|
||||||
+If an expression other than the default argument is used to supply
|
|
||||||
+the value of a function parameter whose type is written in terms
|
|
||||||
+of ``enable_if_convertible``, the program is ill-formed, no
|
|
||||||
+diagnostic required.
|
|
||||||
+
|
|
||||||
+[*Note:* The ``enable_if_convertible`` approach uses SFINAE to
|
|
||||||
take the constructor out of the overload set when the types are not
|
|
||||||
-implicitly convertible.]
|
|
||||||
+implicitly convertible.
|
|
||||||
+]
|
|
||||||
|
|
||||||
|
|
||||||
Indirect iterator
|
|
||||||
@@ -330,6 +357,16 @@ Issue 9.44y
|
|
||||||
|
|
||||||
.. include:: indirect_iterator_abstract.rst
|
|
||||||
|
|
||||||
+Class template ``pointee``
|
|
||||||
+....................................
|
|
||||||
+
|
|
||||||
+.. include:: pointee_ref.rst
|
|
||||||
+
|
|
||||||
+Class template ``indirect_reference``
|
|
||||||
+.....................................
|
|
||||||
+
|
|
||||||
+.. include:: indirect_reference_ref.rst
|
|
||||||
+
|
|
||||||
Class template ``indirect_iterator``
|
|
||||||
....................................
|
|
||||||
|
|
||||||
@@ -393,8 +430,7 @@
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-..
|
|
||||||
- LocalWords: Abrahams Siek Witt istream ostream iter MTL strided interoperate
|
|
||||||
+.. LocalWords: Abrahams Siek Witt istream ostream iter MTL strided interoperate
|
|
||||||
LocalWords: CRTP metafunctions inlining lvalue JGS incrementable BGL LEDA cv
|
|
||||||
LocalWords: GraphBase struct ptrdiff UnaryFunction const int typename bool pp
|
|
||||||
LocalWords: lhs rhs SFINAE markup iff tmp OtherDerived OtherIterator DWA foo
|
|
||||||
572
doc/facade-and-adaptor.html
Executable file → Normal file
572
doc/facade-and-adaptor.html
Executable file → Normal file
File diff suppressed because it is too large
Load Diff
BIN
doc/facade-and-adaptor.pdf
Executable file → Normal file
BIN
doc/facade-and-adaptor.pdf
Executable file → Normal file
Binary file not shown.
@@ -1,3 +1,7 @@
|
|||||||
|
.. 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)
|
||||||
|
|
||||||
+++++++++++++++++++++++++++++
|
+++++++++++++++++++++++++++++
|
||||||
Iterator Facade and Adaptor
|
Iterator Facade and Adaptor
|
||||||
+++++++++++++++++++++++++++++
|
+++++++++++++++++++++++++++++
|
||||||
@@ -6,7 +10,6 @@
|
|||||||
:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com
|
:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com
|
||||||
:organization: `Boost Consulting`_, Indiana University `Open Systems
|
:organization: `Boost Consulting`_, Indiana University `Open Systems
|
||||||
Lab`_, `Zephyr Associates, Inc.`_
|
Lab`_, `Zephyr Associates, Inc.`_
|
||||||
:date: $Date$
|
|
||||||
|
|
||||||
:Number: This is a revised version of N1530_\ =03-0113, which was
|
:Number: This is a revised version of N1530_\ =03-0113, which was
|
||||||
accepted for Technical Report 1 by the C++ standard
|
accepted for Technical Report 1 by the C++ standard
|
||||||
@@ -15,7 +18,7 @@
|
|||||||
.. Version 1.9 of this ReStructuredText document corresponds to
|
.. Version 1.9 of this ReStructuredText document corresponds to
|
||||||
n1530_, the paper accepted by the LWG.
|
n1530_, the paper accepted by the LWG.
|
||||||
|
|
||||||
.. _n1530: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1530.html
|
.. _n1530: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1530.html
|
||||||
|
|
||||||
:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
|
:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
|
||||||
|
|
||||||
@@ -136,7 +139,7 @@ as proposed in n1550_, since user-defined and especially adapted
|
|||||||
iterators suffer from the well known categorization problems that are
|
iterators suffer from the well known categorization problems that are
|
||||||
inherent to the current iterator categories.
|
inherent to the current iterator categories.
|
||||||
|
|
||||||
.. _n1550: http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/papers/2003/n1550.html
|
.. _n1550: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2003/n1550.htm
|
||||||
|
|
||||||
This proposal does not strictly depend on proposal n1550_, as there
|
This proposal does not strictly depend on proposal n1550_, as there
|
||||||
is a direct mapping between new and old categories. This proposal
|
is a direct mapping between new and old categories. This proposal
|
||||||
@@ -165,8 +168,8 @@ reverse iterator types. The proposed new reverse_iterator template
|
|||||||
fixes the issues raised in 280. It provides the desired
|
fixes the issues raised in 280. It provides the desired
|
||||||
interoperability without introducing unwanted overloads.
|
interoperability without introducing unwanted overloads.
|
||||||
|
|
||||||
.. _179: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#179
|
.. _179: http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#179
|
||||||
.. _280: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-active.html#280
|
.. _280: http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#280
|
||||||
|
|
||||||
|
|
||||||
Iterator Facade
|
Iterator Facade
|
||||||
|
|||||||
0
doc/facade_iterator_category.rst
Executable file → Normal file
0
doc/facade_iterator_category.rst
Executable file → Normal file
@@ -3,15 +3,16 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
<meta name="generator" content="Docutils 0.3.6: http://docutils.sourceforge.net/" />
|
<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
|
||||||
<title>Filter Iterator</title>
|
<title>Filter Iterator</title>
|
||||||
<meta name="author" content="David Abrahams, Jeremy Siek, Thomas Witt" />
|
<meta name="author" content="David Abrahams, Jeremy Siek, Thomas Witt" />
|
||||||
<meta name="organization" content="Boost Consulting, Indiana University Open Systems Lab, University of Hanover Institute for Transport Railway Operation and Construction" />
|
<meta name="organization" content="Boost Consulting, Indiana University Open Systems Lab, University of Hanover Institute for Transport Railway Operation and Construction" />
|
||||||
<meta name="date" content="2004-11-01" />
|
<meta name="date" content="2006-09-11" />
|
||||||
<meta name="copyright" content="Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003." />
|
<meta name="copyright" content="Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003." />
|
||||||
<link rel="stylesheet" href="default.css" type="text/css" />
|
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
<div class="document" id="filter-iterator">
|
||||||
<h1 class="title">Filter Iterator</h1>
|
<h1 class="title">Filter Iterator</h1>
|
||||||
<table class="docinfo" frame="void" rules="none">
|
<table class="docinfo" frame="void" rules="none">
|
||||||
<col class="docinfo-name" />
|
<col class="docinfo-name" />
|
||||||
@@ -20,27 +21,32 @@
|
|||||||
<tr><th class="docinfo-name">Author:</th>
|
<tr><th class="docinfo-name">Author:</th>
|
||||||
<td>David Abrahams, Jeremy Siek, Thomas Witt</td></tr>
|
<td>David Abrahams, Jeremy Siek, Thomas Witt</td></tr>
|
||||||
<tr><th class="docinfo-name">Contact:</th>
|
<tr><th class="docinfo-name">Contact:</th>
|
||||||
<td><a class="first reference" href="mailto:dave@boost-consulting.com">dave@boost-consulting.com</a>, <a class="reference" href="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</a>, <a class="last reference" href="mailto:witt@ive.uni-hannover.de">witt@ive.uni-hannover.de</a></td></tr>
|
<td><a class="first reference external" href="mailto:dave@boost-consulting.com">dave@boost-consulting.com</a>, <a class="reference external" href="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</a>, <a class="last reference external" href="mailto:witt@ive.uni-hannover.de">witt@ive.uni-hannover.de</a></td></tr>
|
||||||
<tr><th class="docinfo-name">Organization:</th>
|
<tr><th class="docinfo-name">Organization:</th>
|
||||||
<td><a class="first reference" href="http://www.boost-consulting.com">Boost Consulting</a>, Indiana University <a class="reference" href="http://www.osl.iu.edu">Open Systems
|
<td><a class="first reference external" href="http://www.boost-consulting.com">Boost Consulting</a>, Indiana University <a class="reference external" href="http://www.osl.iu.edu">Open Systems
|
||||||
Lab</a>, University of Hanover <a class="last reference" href="http://www.ive.uni-hannover.de">Institute for Transport
|
Lab</a>, University of Hanover <a class="last reference external" href="http://www.ive.uni-hannover.de">Institute for Transport
|
||||||
Railway Operation and Construction</a></td></tr>
|
Railway Operation and Construction</a></td></tr>
|
||||||
<tr><th class="docinfo-name">Date:</th>
|
<tr><th class="docinfo-name">Date:</th>
|
||||||
<td>2004-11-01</td></tr>
|
<td>2006-09-11</td></tr>
|
||||||
<tr><th class="docinfo-name">Copyright:</th>
|
<tr><th class="docinfo-name">Copyright:</th>
|
||||||
<td>Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.</td></tr>
|
<td>Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.</td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<div class="document" id="filter-iterator">
|
<!-- Distributed under the Boost -->
|
||||||
<table class="field-list" frame="void" rules="none">
|
<!-- Software License, Version 1.0. (See accompanying -->
|
||||||
|
<!-- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
|
||||||
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">abstract:</th><td class="field-body">The filter iterator adaptor creates a view of an iterator range in
|
<tr class="field"><th class="field-name">abstract:</th><td class="field-body"><!-- Copyright David Abrahams 2006. 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) -->
|
||||||
|
The filter iterator adaptor creates a view of an iterator range in
|
||||||
which some elements of the range are skipped. A predicate function
|
which some elements of the range are skipped. A predicate function
|
||||||
object controls which elements are skipped. When the predicate is
|
object controls which elements are skipped. When the predicate is
|
||||||
applied to an element, if it returns <tt class="literal"><span class="pre">true</span></tt> then the element is
|
applied to an element, if it returns <tt class="docutils literal"><span class="pre">true</span></tt> then the element is
|
||||||
retained and if it returns <tt class="literal"><span class="pre">false</span></tt> then the element is skipped
|
retained and if it returns <tt class="docutils literal"><span class="pre">false</span></tt> then the element is skipped
|
||||||
over. When skipping over elements, it is necessary for the filter
|
over. When skipping over elements, it is necessary for the filter
|
||||||
adaptor to know when to stop so as to avoid going past the end of the
|
adaptor to know when to stop so as to avoid going past the end of the
|
||||||
underlying range. A filter iterator is therefore constructed with pair
|
underlying range. A filter iterator is therefore constructed with pair
|
||||||
@@ -50,21 +56,21 @@ sequence to be traversed.</td>
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<div class="contents topic" id="table-of-contents">
|
<div class="contents topic" id="table-of-contents">
|
||||||
<p class="topic-title first"><a name="table-of-contents">Table of Contents</a></p>
|
<p class="topic-title first">Table of Contents</p>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><a class="reference" href="#filter-iterator-synopsis" id="id3" name="id3"><tt class="literal"><span class="pre">filter_iterator</span></tt> synopsis</a></li>
|
<li><a class="reference internal" href="#filter-iterator-synopsis" id="id2"><tt class="docutils literal"><span class="pre">filter_iterator</span></tt> synopsis</a></li>
|
||||||
<li><a class="reference" href="#filter-filter-iterator" id="id4" name="id4"><tt class="literal"><span class="pre">filter_iterator</span></tt> requirements</a></li>
|
<li><a class="reference internal" href="#filter-iterator-requirements" id="id3"><tt class="docutils literal"><span class="pre">filter_iterator</span></tt> requirements</a></li>
|
||||||
<li><a class="reference" href="#filter-iterator-models" id="id5" name="id5"><tt class="literal"><span class="pre">filter_iterator</span></tt> models</a></li>
|
<li><a class="reference internal" href="#filter-iterator-models" id="id4"><tt class="docutils literal"><span class="pre">filter_iterator</span></tt> models</a></li>
|
||||||
<li><a class="reference" href="#id1" id="id6" name="id6"><tt class="literal"><span class="pre">filter_iterator</span></tt> operations</a></li>
|
<li><a class="reference internal" href="#filter-iterator-operations" id="id5"><tt class="docutils literal"><span class="pre">filter_iterator</span></tt> operations</a></li>
|
||||||
<li><a class="reference" href="#example" id="id7" name="id7">Example</a></li>
|
<li><a class="reference internal" href="#example" id="id6">Example</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="filter-iterator-synopsis">
|
<div class="section" id="filter-iterator-synopsis">
|
||||||
<h1><a class="toc-backref" href="#id3" name="filter-iterator-synopsis"><tt class="literal"><span class="pre">filter_iterator</span></tt> synopsis</a></h1>
|
<h1><a class="toc-backref" href="#id2"><tt class="docutils literal"><span class="pre">filter_iterator</span></tt> synopsis</a></h1>
|
||||||
<!-- Copyright David Abrahams, Jeremy Siek, and Thomas Witt -->
|
<!-- Copyright David Abrahams, Jeremy Siek, and Thomas Witt -->
|
||||||
<!-- 2004. Use, modification and distribution is subject to the Boost -->
|
<!-- 2004. Use, modification and distribution is subject to the Boost -->
|
||||||
<!-- Software License, Version 1.0. (See accompanying file -->
|
<!-- Software License, Version 1.0. (See accompanying file -->
|
||||||
<!-- LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
|
<!-- LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
template <class Predicate, class Iterator>
|
template <class Predicate, class Iterator>
|
||||||
class filter_iterator
|
class filter_iterator
|
||||||
@@ -95,39 +101,39 @@ private:
|
|||||||
Iterator m_end; // exposition only
|
Iterator m_end; // exposition only
|
||||||
};
|
};
|
||||||
</pre>
|
</pre>
|
||||||
<p>If <tt class="literal"><span class="pre">Iterator</span></tt> models Readable Lvalue Iterator and Bidirectional Traversal
|
<p>If <tt class="docutils literal"><span class="pre">Iterator</span></tt> models Readable Lvalue Iterator and Bidirectional Traversal
|
||||||
Iterator then <tt class="literal"><span class="pre">iterator_category</span></tt> is convertible to
|
Iterator then <tt class="docutils literal"><span class="pre">iterator_category</span></tt> is convertible to
|
||||||
<tt class="literal"><span class="pre">std::bidirectional_iterator_tag</span></tt>.
|
<tt class="docutils literal"><span class="pre">std::bidirectional_iterator_tag</span></tt>.
|
||||||
Otherwise, if <tt class="literal"><span class="pre">Iterator</span></tt> models Readable Lvalue Iterator and Forward Traversal
|
Otherwise, if <tt class="docutils literal"><span class="pre">Iterator</span></tt> models Readable Lvalue Iterator and Forward Traversal
|
||||||
Iterator then <tt class="literal"><span class="pre">iterator_category</span></tt> is convertible to
|
Iterator then <tt class="docutils literal"><span class="pre">iterator_category</span></tt> is convertible to
|
||||||
<tt class="literal"><span class="pre">std::forward_iterator_tag</span></tt>.
|
<tt class="docutils literal"><span class="pre">std::forward_iterator_tag</span></tt>.
|
||||||
Otherwise <tt class="literal"><span class="pre">iterator_category</span></tt> is
|
Otherwise <tt class="docutils literal"><span class="pre">iterator_category</span></tt> is
|
||||||
convertible to <tt class="literal"><span class="pre">std::input_iterator_tag</span></tt>.</p>
|
convertible to <tt class="docutils literal"><span class="pre">std::input_iterator_tag</span></tt>.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="filter-filter-iterator">
|
<div class="section" id="filter-iterator-requirements">
|
||||||
<h1><a class="toc-backref" href="#id4" name="filter-filter-iterator"><tt class="literal"><span class="pre">filter_iterator</span></tt> requirements</a></h1>
|
<h1><a class="toc-backref" href="#id3"><tt class="docutils literal"><span class="pre">filter_iterator</span></tt> requirements</a></h1>
|
||||||
<p>The <tt class="literal"><span class="pre">Iterator</span></tt> argument shall meet the requirements of Readable
|
<p>The <tt class="docutils literal"><span class="pre">Iterator</span></tt> argument shall meet the requirements of Readable
|
||||||
Iterator and Single Pass Iterator or it shall meet the requirements of
|
Iterator and Single Pass Iterator or it shall meet the requirements of
|
||||||
Input Iterator.</p>
|
Input Iterator.</p>
|
||||||
<p>The <tt class="literal"><span class="pre">Predicate</span></tt> argument must be Assignable, Copy Constructible, and
|
<p>The <tt class="docutils literal"><span class="pre">Predicate</span></tt> argument must be Assignable, Copy Constructible, and
|
||||||
the expression <tt class="literal"><span class="pre">p(x)</span></tt> must be valid where <tt class="literal"><span class="pre">p</span></tt> is an object of type
|
the expression <tt class="docutils literal"><span class="pre">p(x)</span></tt> must be valid where <tt class="docutils literal"><span class="pre">p</span></tt> is an object of type
|
||||||
<tt class="literal"><span class="pre">Predicate</span></tt>, <tt class="literal"><span class="pre">x</span></tt> is an object of type
|
<tt class="docutils literal"><span class="pre">Predicate</span></tt>, <tt class="docutils literal"><span class="pre">x</span></tt> is an object of type
|
||||||
<tt class="literal"><span class="pre">iterator_traits<Iterator>::value_type</span></tt>, and where the type of
|
<tt class="docutils literal"><span class="pre">iterator_traits<Iterator>::value_type</span></tt>, and where the type of
|
||||||
<tt class="literal"><span class="pre">p(x)</span></tt> must be convertible to <tt class="literal"><span class="pre">bool</span></tt>.</p>
|
<tt class="docutils literal"><span class="pre">p(x)</span></tt> must be convertible to <tt class="docutils literal"><span class="pre">bool</span></tt>.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="filter-iterator-models">
|
<div class="section" id="filter-iterator-models">
|
||||||
<h1><a class="toc-backref" href="#id5" name="filter-iterator-models"><tt class="literal"><span class="pre">filter_iterator</span></tt> models</a></h1>
|
<h1><a class="toc-backref" href="#id4"><tt class="docutils literal"><span class="pre">filter_iterator</span></tt> models</a></h1>
|
||||||
<p>The concepts that <tt class="literal"><span class="pre">filter_iterator</span></tt> models are dependent on which
|
<p>The concepts that <tt class="docutils literal"><span class="pre">filter_iterator</span></tt> models are dependent on which
|
||||||
concepts the <tt class="literal"><span class="pre">Iterator</span></tt> argument models, as specified in the
|
concepts the <tt class="docutils literal"><span class="pre">Iterator</span></tt> argument models, as specified in the
|
||||||
following tables.</p>
|
following tables.</p>
|
||||||
<table border="1" class="table">
|
<table border="1" class="docutils">
|
||||||
<colgroup>
|
<colgroup>
|
||||||
<col width="44%" />
|
<col width="44%" />
|
||||||
<col width="56%" />
|
<col width="56%" />
|
||||||
</colgroup>
|
</colgroup>
|
||||||
<thead valign="bottom">
|
<thead valign="bottom">
|
||||||
<tr><th>If <tt class="literal"><span class="pre">Iterator</span></tt> models</th>
|
<tr><th class="head">If <tt class="docutils literal"><span class="pre">Iterator</span></tt> models</th>
|
||||||
<th>then <tt class="literal"><span class="pre">filter_iterator</span></tt> models</th>
|
<th class="head">then <tt class="docutils literal"><span class="pre">filter_iterator</span></tt> models</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
@@ -142,14 +148,14 @@ following tables.</p>
|
|||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<table border="1" class="table">
|
<table border="1" class="docutils">
|
||||||
<colgroup>
|
<colgroup>
|
||||||
<col width="41%" />
|
<col width="41%" />
|
||||||
<col width="59%" />
|
<col width="59%" />
|
||||||
</colgroup>
|
</colgroup>
|
||||||
<thead valign="bottom">
|
<thead valign="bottom">
|
||||||
<tr><th>If <tt class="literal"><span class="pre">Iterator</span></tt> models</th>
|
<tr><th class="head">If <tt class="docutils literal"><span class="pre">Iterator</span></tt> models</th>
|
||||||
<th>then <tt class="literal"><span class="pre">filter_iterator</span></tt> models</th>
|
<th class="head">then <tt class="docutils literal"><span class="pre">filter_iterator</span></tt> models</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
@@ -164,14 +170,14 @@ following tables.</p>
|
|||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<table border="1" class="table">
|
<table border="1" class="docutils">
|
||||||
<colgroup>
|
<colgroup>
|
||||||
<col width="63%" />
|
<col width="63%" />
|
||||||
<col width="38%" />
|
<col width="38%" />
|
||||||
</colgroup>
|
</colgroup>
|
||||||
<thead valign="bottom">
|
<thead valign="bottom">
|
||||||
<tr><th>If <tt class="literal"><span class="pre">Iterator</span></tt> models</th>
|
<tr><th class="head">If <tt class="docutils literal"><span class="pre">Iterator</span></tt> models</th>
|
||||||
<th>then <tt class="literal"><span class="pre">filter_iterator</span></tt> models</th>
|
<th class="head">then <tt class="docutils literal"><span class="pre">filter_iterator</span></tt> models</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
@@ -189,49 +195,49 @@ following tables.</p>
|
|||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<p><tt class="literal"><span class="pre">filter_iterator<P1,</span> <span class="pre">X></span></tt> is interoperable with <tt class="literal"><span class="pre">filter_iterator<P2,</span> <span class="pre">Y></span></tt>
|
<p><tt class="docutils literal"><span class="pre">filter_iterator<P1,</span> <span class="pre">X></span></tt> is interoperable with <tt class="docutils literal"><span class="pre">filter_iterator<P2,</span> <span class="pre">Y></span></tt>
|
||||||
if and only if <tt class="literal"><span class="pre">X</span></tt> is interoperable with <tt class="literal"><span class="pre">Y</span></tt>.</p>
|
if and only if <tt class="docutils literal"><span class="pre">X</span></tt> is interoperable with <tt class="docutils literal"><span class="pre">Y</span></tt>.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="id1">
|
<div class="section" id="filter-iterator-operations">
|
||||||
<h1><a class="toc-backref" href="#id6" name="id1"><tt class="literal"><span class="pre">filter_iterator</span></tt> operations</a></h1>
|
<h1><a class="toc-backref" href="#id5"><tt class="docutils literal"><span class="pre">filter_iterator</span></tt> operations</a></h1>
|
||||||
<p>In addition to those operations required by the concepts that
|
<p>In addition to those operations required by the concepts that
|
||||||
<tt class="literal"><span class="pre">filter_iterator</span></tt> models, <tt class="literal"><span class="pre">filter_iterator</span></tt> provides the following
|
<tt class="docutils literal"><span class="pre">filter_iterator</span></tt> models, <tt class="docutils literal"><span class="pre">filter_iterator</span></tt> provides the following
|
||||||
operations.</p>
|
operations.</p>
|
||||||
<p><tt class="literal"><span class="pre">filter_iterator();</span></tt></p>
|
<p><tt class="docutils literal"><span class="pre">filter_iterator();</span></tt></p>
|
||||||
<table class="field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">Requires:</th><td class="field-body"><tt class="literal"><span class="pre">Predicate</span></tt> and <tt class="literal"><span class="pre">Iterator</span></tt> must be Default Constructible.</td>
|
<tr class="field"><th class="field-name">Requires:</th><td class="field-body"><tt class="docutils literal"><span class="pre">Predicate</span></tt> and <tt class="docutils literal"><span class="pre">Iterator</span></tt> must be Default Constructible.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs a <tt class="literal"><span class="pre">filter_iterator</span></tt> whose``m_pred``, <tt class="literal"><span class="pre">m_iter</span></tt>, and <tt class="literal"><span class="pre">m_end</span></tt>
|
<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs a <tt class="docutils literal"><span class="pre">filter_iterator</span></tt> whose``m_pred``, <tt class="docutils literal"><span class="pre">m_iter</span></tt>, and <tt class="docutils literal"><span class="pre">m_end</span></tt>
|
||||||
members are a default constructed.</td>
|
members are a default constructed.</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<p><tt class="literal"><span class="pre">filter_iterator(Predicate</span> <span class="pre">f,</span> <span class="pre">Iterator</span> <span class="pre">x,</span> <span class="pre">Iterator</span> <span class="pre">end</span> <span class="pre">=</span> <span class="pre">Iterator());</span></tt></p>
|
<p><tt class="docutils literal"><span class="pre">filter_iterator(Predicate</span> <span class="pre">f,</span> <span class="pre">Iterator</span> <span class="pre">x,</span> <span class="pre">Iterator</span> <span class="pre">end</span> <span class="pre">=</span> <span class="pre">Iterator());</span></tt></p>
|
||||||
<table class="field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs a <tt class="literal"><span class="pre">filter_iterator</span></tt> where <tt class="literal"><span class="pre">m_iter</span></tt> is either
|
<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs a <tt class="docutils literal"><span class="pre">filter_iterator</span></tt> where <tt class="docutils literal"><span class="pre">m_iter</span></tt> is either
|
||||||
the first position in the range <tt class="literal"><span class="pre">[x,end)</span></tt> such that <tt class="literal"><span class="pre">f(*m_iter)</span> <span class="pre">==</span> <span class="pre">true</span></tt>
|
the first position in the range <tt class="docutils literal"><span class="pre">[x,end)</span></tt> such that <tt class="docutils literal"><span class="pre">f(*m_iter)</span> <span class="pre">==</span> <span class="pre">true</span></tt>
|
||||||
or else``m_iter == end``. The member <tt class="literal"><span class="pre">m_pred</span></tt> is constructed from
|
or else``m_iter == end``. The member <tt class="docutils literal"><span class="pre">m_pred</span></tt> is constructed from
|
||||||
<tt class="literal"><span class="pre">f</span></tt> and <tt class="literal"><span class="pre">m_end</span></tt> from <tt class="literal"><span class="pre">end</span></tt>.</td>
|
<tt class="docutils literal"><span class="pre">f</span></tt> and <tt class="docutils literal"><span class="pre">m_end</span></tt> from <tt class="docutils literal"><span class="pre">end</span></tt>.</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<p><tt class="literal"><span class="pre">filter_iterator(Iterator</span> <span class="pre">x,</span> <span class="pre">Iterator</span> <span class="pre">end</span> <span class="pre">=</span> <span class="pre">Iterator());</span></tt></p>
|
<p><tt class="docutils literal"><span class="pre">filter_iterator(Iterator</span> <span class="pre">x,</span> <span class="pre">Iterator</span> <span class="pre">end</span> <span class="pre">=</span> <span class="pre">Iterator());</span></tt></p>
|
||||||
<table class="field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">Requires:</th><td class="field-body"><tt class="literal"><span class="pre">Predicate</span></tt> must be Default Constructible and
|
<tr class="field"><th class="field-name">Requires:</th><td class="field-body"><tt class="docutils literal"><span class="pre">Predicate</span></tt> must be Default Constructible and
|
||||||
<tt class="literal"><span class="pre">Predicate</span></tt> is a class type (not a function pointer).</td>
|
<tt class="docutils literal"><span class="pre">Predicate</span></tt> is a class type (not a function pointer).</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs a <tt class="literal"><span class="pre">filter_iterator</span></tt> where <tt class="literal"><span class="pre">m_iter</span></tt> is either
|
<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs a <tt class="docutils literal"><span class="pre">filter_iterator</span></tt> where <tt class="docutils literal"><span class="pre">m_iter</span></tt> is either
|
||||||
the first position in the range <tt class="literal"><span class="pre">[x,end)</span></tt> such that <tt class="literal"><span class="pre">m_pred(*m_iter)</span> <span class="pre">==</span> <span class="pre">true</span></tt>
|
the first position in the range <tt class="docutils literal"><span class="pre">[x,end)</span></tt> such that <tt class="docutils literal"><span class="pre">m_pred(*m_iter)</span> <span class="pre">==</span> <span class="pre">true</span></tt>
|
||||||
or else``m_iter == end``. The member <tt class="literal"><span class="pre">m_pred</span></tt> is default constructed.</td>
|
or else``m_iter == end``. The member <tt class="docutils literal"><span class="pre">m_pred</span></tt> is default constructed.</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
@@ -242,71 +248,74 @@ filter_iterator(
|
|||||||
, typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
|
, typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
|
||||||
);``
|
);``
|
||||||
</pre>
|
</pre>
|
||||||
<table class="field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">Requires:</th><td class="field-body"><tt class="literal"><span class="pre">OtherIterator</span></tt> is implicitly convertible to <tt class="literal"><span class="pre">Iterator</span></tt>.</td>
|
<tr class="field"><th class="field-name">Requires:</th><td class="field-body"><tt class="docutils literal"><span class="pre">OtherIterator</span></tt> is implicitly convertible to <tt class="docutils literal"><span class="pre">Iterator</span></tt>.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs a filter iterator whose members are copied from <tt class="literal"><span class="pre">t</span></tt>.</td>
|
<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs a filter iterator whose members are copied from <tt class="docutils literal"><span class="pre">t</span></tt>.</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<p><tt class="literal"><span class="pre">Predicate</span> <span class="pre">predicate()</span> <span class="pre">const;</span></tt></p>
|
<p><tt class="docutils literal"><span class="pre">Predicate</span> <span class="pre">predicate()</span> <span class="pre">const;</span></tt></p>
|
||||||
<table class="field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">m_pred</span></tt></td>
|
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="docutils literal"><span class="pre">m_pred</span></tt></td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<p><tt class="literal"><span class="pre">Iterator</span> <span class="pre">end()</span> <span class="pre">const;</span></tt></p>
|
<p><tt class="docutils literal"><span class="pre">Iterator</span> <span class="pre">end()</span> <span class="pre">const;</span></tt></p>
|
||||||
<table class="field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">m_end</span></tt></td>
|
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="docutils literal"><span class="pre">m_end</span></tt></td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<p><tt class="literal"><span class="pre">Iterator</span> <span class="pre">const&</span> <span class="pre">base()</span> <span class="pre">const;</span></tt></p>
|
<p><tt class="docutils literal"><span class="pre">Iterator</span> <span class="pre">const&</span> <span class="pre">base()</span> <span class="pre">const;</span></tt></p>
|
||||||
<table class="field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">m_iterator</span></tt></td>
|
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="docutils literal"><span class="pre">m_iterator</span></tt></td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<p><tt class="literal"><span class="pre">reference</span> <span class="pre">operator*()</span> <span class="pre">const;</span></tt></p>
|
<p><tt class="docutils literal"><span class="pre">reference</span> <span class="pre">operator*()</span> <span class="pre">const;</span></tt></p>
|
||||||
<table class="field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">*m_iter</span></tt></td>
|
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="docutils literal"><span class="pre">*m_iter</span></tt></td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<p><tt class="literal"><span class="pre">filter_iterator&</span> <span class="pre">operator++();</span></tt></p>
|
<p><tt class="docutils literal"><span class="pre">filter_iterator&</span> <span class="pre">operator++();</span></tt></p>
|
||||||
<table class="field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Increments <tt class="literal"><span class="pre">m_iter</span></tt> and then continues to
|
<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Increments <tt class="docutils literal"><span class="pre">m_iter</span></tt> and then continues to
|
||||||
increment <tt class="literal"><span class="pre">m_iter</span></tt> until either <tt class="literal"><span class="pre">m_iter</span> <span class="pre">==</span> <span class="pre">m_end</span></tt>
|
increment <tt class="docutils literal"><span class="pre">m_iter</span></tt> until either <tt class="docutils literal"><span class="pre">m_iter</span> <span class="pre">==</span> <span class="pre">m_end</span></tt>
|
||||||
or <tt class="literal"><span class="pre">m_pred(*m_iter)</span> <span class="pre">==</span> <span class="pre">true</span></tt>.</td>
|
or <tt class="docutils literal"><span class="pre">m_pred(*m_iter)</span> <span class="pre">==</span> <span class="pre">true</span></tt>.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">*this</span></tt></td>
|
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="docutils literal"><span class="pre">*this</span></tt></td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<!-- Copyright David Abrahams 2006. 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) -->
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
template <class Predicate, class Iterator>
|
template <class Predicate, class Iterator>
|
||||||
filter_iterator<Predicate,Iterator>
|
filter_iterator<Predicate,Iterator>
|
||||||
make_filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());
|
make_filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());
|
||||||
</pre>
|
</pre>
|
||||||
<table class="field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
@@ -319,7 +328,7 @@ template <class Predicate, class Iterator>
|
|||||||
filter_iterator<Predicate,Iterator>
|
filter_iterator<Predicate,Iterator>
|
||||||
make_filter_iterator(Iterator x, Iterator end = Iterator());
|
make_filter_iterator(Iterator x, Iterator end = Iterator());
|
||||||
</pre>
|
</pre>
|
||||||
<table class="field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
@@ -327,13 +336,16 @@ make_filter_iterator(Iterator x, Iterator end = Iterator());
|
|||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<!-- Copyright David Abrahams 2006. 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) -->
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="example">
|
<div class="section" id="example">
|
||||||
<h1><a class="toc-backref" href="#id7" name="example">Example</a></h1>
|
<h1><a class="toc-backref" href="#id6">Example</a></h1>
|
||||||
<p>This example uses <tt class="literal"><span class="pre">filter_iterator</span></tt> and then
|
<p>This example uses <tt class="docutils literal"><span class="pre">filter_iterator</span></tt> and then
|
||||||
<tt class="literal"><span class="pre">make_filter_iterator</span></tt> to output only the positive integers from an
|
<tt class="docutils literal"><span class="pre">make_filter_iterator</span></tt> to output only the positive integers from an
|
||||||
array of integers. Then <tt class="literal"><span class="pre">make_filter_iterator</span></tt> is is used to output
|
array of integers. Then <tt class="docutils literal"><span class="pre">make_filter_iterator</span></tt> is is used to output
|
||||||
the integers greater than <tt class="literal"><span class="pre">-2</span></tt>.</p>
|
the integers greater than <tt class="docutils literal"><span class="pre">-2</span></tt>.</p>
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
struct is_positive_number {
|
struct is_positive_number {
|
||||||
bool operator()(int x) { return 0 < x; }
|
bool operator()(int x) { return 0 < x; }
|
||||||
@@ -384,17 +396,18 @@ int main()
|
|||||||
</pre>
|
</pre>
|
||||||
<p>The output is:</p>
|
<p>The output is:</p>
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
4 5 8
|
4 5 8
|
||||||
4 5 8
|
4 5 8
|
||||||
0 -1 4 5 8
|
0 -1 4 5 8
|
||||||
</pre>
|
</pre>
|
||||||
<p>The source code for this example can be found <a class="reference" href="../example/filter_iterator_example.cpp">here</a>.</p>
|
<p>The source code for this example can be found <a class="reference external" href="../example/filter_iterator_example.cpp">here</a>.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr class="footer" />
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<a class="reference" href="filter_iterator.rst">View document source</a>.
|
<hr class="footer" />
|
||||||
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
<a class="reference external" href="filter_iterator.rst">View document source</a>.
|
||||||
|
Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
BIN
doc/filter_iterator.pdf
Executable file → Normal file
BIN
doc/filter_iterator.pdf
Executable file → Normal file
Binary file not shown.
@@ -1,3 +1,7 @@
|
|||||||
|
.. 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)
|
||||||
|
|
||||||
+++++++++++++++++
|
+++++++++++++++++
|
||||||
Filter Iterator
|
Filter Iterator
|
||||||
+++++++++++++++++
|
+++++++++++++++++
|
||||||
@@ -7,7 +11,6 @@
|
|||||||
:organization: `Boost Consulting`_, Indiana University `Open Systems
|
:organization: `Boost Consulting`_, Indiana University `Open Systems
|
||||||
Lab`_, University of Hanover `Institute for Transport
|
Lab`_, University of Hanover `Institute for Transport
|
||||||
Railway Operation and Construction`_
|
Railway Operation and Construction`_
|
||||||
:date: $Date$
|
|
||||||
:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
|
:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
|
||||||
|
|
||||||
.. _`Boost Consulting`: http://www.boost-consulting.com
|
.. _`Boost Consulting`: http://www.boost-consulting.com
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
.. Copyright David Abrahams 2006. 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)
|
||||||
|
|
||||||
The filter iterator adaptor creates a view of an iterator range in
|
The filter iterator adaptor creates a view of an iterator range in
|
||||||
which some elements of the range are skipped. A predicate function
|
which some elements of the range are skipped. A predicate function
|
||||||
object controls which elements are skipped. When the predicate is
|
object controls which elements are skipped. When the predicate is
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
.. Copyright David Abrahams 2006. 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)
|
||||||
|
|
||||||
Example
|
Example
|
||||||
.......
|
.......
|
||||||
|
|||||||
@@ -1,259 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" ?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<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.3.6: http://docutils.sourceforge.net/" />
|
|
||||||
<title></title>
|
|
||||||
<link rel="stylesheet" href="default.css" type="text/css" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="document">
|
|
||||||
<!-- Copyright David Abrahams, Jeremy Siek, and Thomas Witt -->
|
|
||||||
<!-- 2004. 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) -->
|
|
||||||
<pre class="literal-block">
|
|
||||||
template <class Predicate, class Iterator>
|
|
||||||
class filter_iterator
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
typedef iterator_traits<Iterator>::value_type value_type;
|
|
||||||
typedef iterator_traits<Iterator>::reference reference;
|
|
||||||
typedef iterator_traits<Iterator>::pointer pointer;
|
|
||||||
typedef iterator_traits<Iterator>::difference_type difference_type;
|
|
||||||
typedef /* see below */ iterator_category;
|
|
||||||
|
|
||||||
filter_iterator();
|
|
||||||
filter_iterator(Predicate f, Iterator x, Iterator end = Iterator());
|
|
||||||
filter_iterator(Iterator x, Iterator end = Iterator());
|
|
||||||
template<class OtherIterator>
|
|
||||||
filter_iterator(
|
|
||||||
filter_iterator<Predicate, OtherIterator> const& t
|
|
||||||
, typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
|
|
||||||
);
|
|
||||||
Predicate predicate() const;
|
|
||||||
Iterator end() const;
|
|
||||||
Iterator const& base() const;
|
|
||||||
reference operator*() const;
|
|
||||||
filter_iterator& operator++();
|
|
||||||
private:
|
|
||||||
Predicate m_pred; // exposition only
|
|
||||||
Iterator m_iter; // exposition only
|
|
||||||
Iterator m_end; // exposition only
|
|
||||||
};
|
|
||||||
</pre>
|
|
||||||
<p>If <tt class="literal"><span class="pre">Iterator</span></tt> models Readable Lvalue Iterator and Bidirectional Traversal
|
|
||||||
Iterator then <tt class="literal"><span class="pre">iterator_category</span></tt> is convertible to
|
|
||||||
<tt class="literal"><span class="pre">std::bidirectional_iterator_tag</span></tt>.
|
|
||||||
Otherwise, if <tt class="literal"><span class="pre">Iterator</span></tt> models Readable Lvalue Iterator and Forward Traversal
|
|
||||||
Iterator then <tt class="literal"><span class="pre">iterator_category</span></tt> is convertible to
|
|
||||||
<tt class="literal"><span class="pre">std::forward_iterator_tag</span></tt>.
|
|
||||||
Otherwise <tt class="literal"><span class="pre">iterator_category</span></tt> is
|
|
||||||
convertible to <tt class="literal"><span class="pre">std::input_iterator_tag</span></tt>.</p>
|
|
||||||
<div class="section" id="filter-iterator">
|
|
||||||
<h1><a name="filter-iterator"><tt class="literal"><span class="pre">filter_iterator</span></tt> requirements</a></h1>
|
|
||||||
<p>The <tt class="literal"><span class="pre">Iterator</span></tt> argument shall meet the requirements of Readable
|
|
||||||
Iterator and Single Pass Iterator or it shall meet the requirements of
|
|
||||||
Input Iterator.</p>
|
|
||||||
<p>The <tt class="literal"><span class="pre">Predicate</span></tt> argument must be Assignable, Copy Constructible, and
|
|
||||||
the expression <tt class="literal"><span class="pre">p(x)</span></tt> must be valid where <tt class="literal"><span class="pre">p</span></tt> is an object of type
|
|
||||||
<tt class="literal"><span class="pre">Predicate</span></tt>, <tt class="literal"><span class="pre">x</span></tt> is an object of type
|
|
||||||
<tt class="literal"><span class="pre">iterator_traits<Iterator>::value_type</span></tt>, and where the type of
|
|
||||||
<tt class="literal"><span class="pre">p(x)</span></tt> must be convertible to <tt class="literal"><span class="pre">bool</span></tt>.</p>
|
|
||||||
</div>
|
|
||||||
<div class="section" id="filter-iterator-models">
|
|
||||||
<h1><a name="filter-iterator-models"><tt class="literal"><span class="pre">filter_iterator</span></tt> models</a></h1>
|
|
||||||
<p>The concepts that <tt class="literal"><span class="pre">filter_iterator</span></tt> models are dependent on which
|
|
||||||
concepts the <tt class="literal"><span class="pre">Iterator</span></tt> argument models, as specified in the
|
|
||||||
following tables.</p>
|
|
||||||
<table border="1" class="table">
|
|
||||||
<colgroup>
|
|
||||||
<col width="44%" />
|
|
||||||
<col width="56%" />
|
|
||||||
</colgroup>
|
|
||||||
<thead valign="bottom">
|
|
||||||
<tr><th>If <tt class="literal"><span class="pre">Iterator</span></tt> models</th>
|
|
||||||
<th>then <tt class="literal"><span class="pre">filter_iterator</span></tt> models</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr><td>Single Pass Iterator</td>
|
|
||||||
<td>Single Pass Iterator</td>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Forward Traversal Iterator</td>
|
|
||||||
<td>Forward Traversal Iterator</td>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Bidirectional Traversal Iterator</td>
|
|
||||||
<td>Bidirectional Traversal Iterator</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<table border="1" class="table">
|
|
||||||
<colgroup>
|
|
||||||
<col width="41%" />
|
|
||||||
<col width="59%" />
|
|
||||||
</colgroup>
|
|
||||||
<thead valign="bottom">
|
|
||||||
<tr><th>If <tt class="literal"><span class="pre">Iterator</span></tt> models</th>
|
|
||||||
<th>then <tt class="literal"><span class="pre">filter_iterator</span></tt> models</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr><td>Readable Iterator</td>
|
|
||||||
<td>Readable Iterator</td>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Writable Iterator</td>
|
|
||||||
<td>Writable Iterator</td>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Lvalue Iterator</td>
|
|
||||||
<td>Lvalue Iterator</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<table border="1" class="table">
|
|
||||||
<colgroup>
|
|
||||||
<col width="63%" />
|
|
||||||
<col width="38%" />
|
|
||||||
</colgroup>
|
|
||||||
<thead valign="bottom">
|
|
||||||
<tr><th>If <tt class="literal"><span class="pre">Iterator</span></tt> models</th>
|
|
||||||
<th>then <tt class="literal"><span class="pre">filter_iterator</span></tt> models</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr><td>Readable Iterator, Single Pass Iterator</td>
|
|
||||||
<td>Input Iterator</td>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Readable Lvalue Iterator, Forward Traversal Iterator</td>
|
|
||||||
<td>Forward Iterator</td>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Writable Lvalue Iterator, Forward Traversal Iterator</td>
|
|
||||||
<td>Mutable Forward Iterator</td>
|
|
||||||
</tr>
|
|
||||||
<tr><td>Writable Lvalue Iterator, Bidirectional Iterator</td>
|
|
||||||
<td>Mutable Bidirectional Iterator</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<p><tt class="literal"><span class="pre">filter_iterator<P1,</span> <span class="pre">X></span></tt> is interoperable with <tt class="literal"><span class="pre">filter_iterator<P2,</span> <span class="pre">Y></span></tt>
|
|
||||||
if and only if <tt class="literal"><span class="pre">X</span></tt> is interoperable with <tt class="literal"><span class="pre">Y</span></tt>.</p>
|
|
||||||
</div>
|
|
||||||
<div class="section" id="id1">
|
|
||||||
<h1><a name="id1"><tt class="literal"><span class="pre">filter_iterator</span></tt> operations</a></h1>
|
|
||||||
<p>In addition to those operations required by the concepts that
|
|
||||||
<tt class="literal"><span class="pre">filter_iterator</span></tt> models, <tt class="literal"><span class="pre">filter_iterator</span></tt> provides the following
|
|
||||||
operations.</p>
|
|
||||||
<p><tt class="literal"><span class="pre">filter_iterator();</span></tt></p>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Requires:</th><td class="field-body"><tt class="literal"><span class="pre">Predicate</span></tt> and <tt class="literal"><span class="pre">Iterator</span></tt> must be Default Constructible.</td>
|
|
||||||
</tr>
|
|
||||||
<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs a <tt class="literal"><span class="pre">filter_iterator</span></tt> whose``m_pred``, <tt class="literal"><span class="pre">m_iter</span></tt>, and <tt class="literal"><span class="pre">m_end</span></tt>
|
|
||||||
members are a default constructed.</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<p><tt class="literal"><span class="pre">filter_iterator(Predicate</span> <span class="pre">f,</span> <span class="pre">Iterator</span> <span class="pre">x,</span> <span class="pre">Iterator</span> <span class="pre">end</span> <span class="pre">=</span> <span class="pre">Iterator());</span></tt></p>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs a <tt class="literal"><span class="pre">filter_iterator</span></tt> where <tt class="literal"><span class="pre">m_iter</span></tt> is either
|
|
||||||
the first position in the range <tt class="literal"><span class="pre">[x,end)</span></tt> such that <tt class="literal"><span class="pre">f(*m_iter)</span> <span class="pre">==</span> <span class="pre">true</span></tt>
|
|
||||||
or else``m_iter == end``. The member <tt class="literal"><span class="pre">m_pred</span></tt> is constructed from
|
|
||||||
<tt class="literal"><span class="pre">f</span></tt> and <tt class="literal"><span class="pre">m_end</span></tt> from <tt class="literal"><span class="pre">end</span></tt>.</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<p><tt class="literal"><span class="pre">filter_iterator(Iterator</span> <span class="pre">x,</span> <span class="pre">Iterator</span> <span class="pre">end</span> <span class="pre">=</span> <span class="pre">Iterator());</span></tt></p>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Requires:</th><td class="field-body"><tt class="literal"><span class="pre">Predicate</span></tt> must be Default Constructible and
|
|
||||||
<tt class="literal"><span class="pre">Predicate</span></tt> is a class type (not a function pointer).</td>
|
|
||||||
</tr>
|
|
||||||
<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs a <tt class="literal"><span class="pre">filter_iterator</span></tt> where <tt class="literal"><span class="pre">m_iter</span></tt> is either
|
|
||||||
the first position in the range <tt class="literal"><span class="pre">[x,end)</span></tt> such that <tt class="literal"><span class="pre">m_pred(*m_iter)</span> <span class="pre">==</span> <span class="pre">true</span></tt>
|
|
||||||
or else``m_iter == end``. The member <tt class="literal"><span class="pre">m_pred</span></tt> is default constructed.</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<pre class="literal-block">
|
|
||||||
template <class OtherIterator>
|
|
||||||
filter_iterator(
|
|
||||||
filter_iterator<Predicate, OtherIterator> const& t
|
|
||||||
, typename enable_if_convertible<OtherIterator, Iterator>::type* = 0 // exposition
|
|
||||||
);``
|
|
||||||
</pre>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Requires:</th><td class="field-body"><tt class="literal"><span class="pre">OtherIterator</span></tt> is implicitly convertible to <tt class="literal"><span class="pre">Iterator</span></tt>.</td>
|
|
||||||
</tr>
|
|
||||||
<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs a filter iterator whose members are copied from <tt class="literal"><span class="pre">t</span></tt>.</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<p><tt class="literal"><span class="pre">Predicate</span> <span class="pre">predicate()</span> <span class="pre">const;</span></tt></p>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">m_pred</span></tt></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<p><tt class="literal"><span class="pre">Iterator</span> <span class="pre">end()</span> <span class="pre">const;</span></tt></p>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">m_end</span></tt></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<p><tt class="literal"><span class="pre">Iterator</span> <span class="pre">const&</span> <span class="pre">base()</span> <span class="pre">const;</span></tt></p>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">m_iterator</span></tt></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<p><tt class="literal"><span class="pre">reference</span> <span class="pre">operator*()</span> <span class="pre">const;</span></tt></p>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">*m_iter</span></tt></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<p><tt class="literal"><span class="pre">filter_iterator&</span> <span class="pre">operator++();</span></tt></p>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Increments <tt class="literal"><span class="pre">m_iter</span></tt> and then continues to
|
|
||||||
increment <tt class="literal"><span class="pre">m_iter</span></tt> until either <tt class="literal"><span class="pre">m_iter</span> <span class="pre">==</span> <span class="pre">m_end</span></tt>
|
|
||||||
or <tt class="literal"><span class="pre">m_pred(*m_iter)</span> <span class="pre">==</span> <span class="pre">true</span></tt>.</td>
|
|
||||||
</tr>
|
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">*this</span></tt></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<hr class="footer" />
|
|
||||||
<div class="footer">
|
|
||||||
<a class="reference" href="filter_iterator_ref.rst">View document source</a>.
|
|
||||||
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,3 +1,7 @@
|
|||||||
|
.. Copyright David Abrahams 2006. 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)
|
||||||
|
|
||||||
The function output iterator adaptor makes it easier to create custom
|
The function output iterator adaptor makes it easier to create custom
|
||||||
output iterators. The adaptor takes a unary function and creates a
|
output iterators. The adaptor takes a unary function and creates a
|
||||||
model of Output Iterator. Each item assigned to the output iterator is
|
model of Output Iterator. Each item assigned to the output iterator is
|
||||||
|
|||||||
@@ -1,3 +1,14 @@
|
|||||||
|
.. Copyright David Abrahams 2006. 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)
|
||||||
|
|
||||||
|
Header
|
||||||
|
......
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
#include <boost/iterator/function_output_iterator.hpp>
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
template <class UnaryFunction>
|
template <class UnaryFunction>
|
||||||
|
|||||||
142
doc/function_input_iterator.html
Normal file
142
doc/function_input_iterator.html
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<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.6: http://docutils.sourceforge.net/" />
|
||||||
|
<title></title>
|
||||||
|
<meta name="author" content="Dean Michael Berris" />
|
||||||
|
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="document">
|
||||||
|
|
||||||
|
<table class="docinfo" frame="void" rules="none">
|
||||||
|
<col class="docinfo-name" />
|
||||||
|
<col class="docinfo-content" />
|
||||||
|
<tbody valign="top">
|
||||||
|
<tr><th class="docinfo-name">Author:</th>
|
||||||
|
<td><a class="first reference external" href="mailto:mikhailberis@gmail.com">Dean Michael Berris</a></td></tr>
|
||||||
|
<tr class="field"><th class="docinfo-name">License:</th><td class="field-body">Distributed under the Boost Software License, Version 1.0
|
||||||
|
(See accompanying file LICENSE_1_0.txt or copy at <a class="reference external" href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</a>)</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<div class="section" id="function-input-iterator">
|
||||||
|
<h1>Function Input Iterator</h1>
|
||||||
|
<p>The Function Input Iterator allows for creating iterators that encapsulate
|
||||||
|
a nullary function object and a state object which tracks the number of times
|
||||||
|
the iterator has been incremented. A Function Input Iterator models the
|
||||||
|
<a class="reference external" href="http://www.sgi.com/tech/stl/InputIterator.html">InputIterator</a> concept and is useful for creating bounded input iterators.</p>
|
||||||
|
<p>Like the Generator Iterator, the Function Input Iterator takes a function
|
||||||
|
that models the <a class="reference external" href="http://www.sgi.com/tech/stl/Generator.html">Generator</a> concept (which is basically a nullary or 0-arity
|
||||||
|
function object). Each increment of the function Function Input Iterator
|
||||||
|
invokes the generator function and stores the value in the iterator. When
|
||||||
|
the iterator is dereferenced the stored value is returned.</p>
|
||||||
|
<p>The Function Input Iterator encapsulates a state object which models the
|
||||||
|
<a class="reference internal" href="#incrementable-concept">Incrementable Concept</a> and the <a class="reference external" href="http://www.sgi.com/tech/stl/EqualityComparable.html">EqualityComparable</a> Concept. These concepts are
|
||||||
|
described below as:</p>
|
||||||
|
<div class="section" id="incrementable-concept">
|
||||||
|
<h2>Incrementable Concept</h2>
|
||||||
|
<p>A type models the Incrementable Concept when it supports the pre- and post-
|
||||||
|
increment operators. For a given object <tt class="docutils literal"><span class="pre">i</span></tt> with type <tt class="docutils literal"><span class="pre">I</span></tt>, the following
|
||||||
|
constructs should be valid:</p>
|
||||||
|
<table border="1" class="docutils">
|
||||||
|
<colgroup>
|
||||||
|
<col width="24%" />
|
||||||
|
<col width="46%" />
|
||||||
|
<col width="30%" />
|
||||||
|
</colgroup>
|
||||||
|
<tbody valign="top">
|
||||||
|
<tr><td colspan="3">Construct Description Return Type</td>
|
||||||
|
</tr>
|
||||||
|
<tr><td>i++</td>
|
||||||
|
<td>Post-increment i.</td>
|
||||||
|
<td>I</td>
|
||||||
|
</tr>
|
||||||
|
<tr><td>++i</td>
|
||||||
|
<td>Pre-increment i.</td>
|
||||||
|
<td>I&</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<p>NOTE: An Incrementable type should also be <a class="reference external" href="http://www.sgi.com/tech/stl/DefaultConstructible.html">DefaultConstructible</a>.</p>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="synopsis">
|
||||||
|
<h2>Synopsis</h2>
|
||||||
|
<pre class="literal-block">
|
||||||
|
namespace {
|
||||||
|
template <class Function, class State>
|
||||||
|
class function_input_iterator;
|
||||||
|
|
||||||
|
template <class Function, class State>
|
||||||
|
typename function_input_iterator<Function, State>
|
||||||
|
make_function_input_iterator(Function & f);
|
||||||
|
|
||||||
|
struct infinite;
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="function-input-iterator-class">
|
||||||
|
<h2>Function Input Iterator Class</h2>
|
||||||
|
<p>The class Function Input Iterator class takes two template parameters
|
||||||
|
<tt class="docutils literal"><span class="pre">Function</span></tt> and <tt class="docutils literal"><span class="pre">State</span></tt>. These two template parameters tell the
|
||||||
|
Function Input Iterator the type of the function to encapsulate and
|
||||||
|
the type of the internal state value to hold.</p>
|
||||||
|
<p>The <tt class="docutils literal"><span class="pre">State</span></tt> parameter is important in cases where you want to
|
||||||
|
control the type of the counter which determines whether two iterators
|
||||||
|
are at the same state. This allows for creating a pair of iterators which
|
||||||
|
bound the range of the invocations of the encapsulated functions.</p>
|
||||||
|
</div>
|
||||||
|
<div class="section" id="examples">
|
||||||
|
<h2>Examples</h2>
|
||||||
|
<p>The following example shows how we use the function input iterator class
|
||||||
|
in cases where we want to create bounded (lazy) generated ranges.</p>
|
||||||
|
<pre class="literal-block">
|
||||||
|
struct generator {
|
||||||
|
typedef int result_type;
|
||||||
|
generator() { srand(time(0)); }
|
||||||
|
result_type operator() () const {
|
||||||
|
return rand();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
int main(int argc, char * argv[]) {
|
||||||
|
generator f;
|
||||||
|
copy(
|
||||||
|
make_function_input_iterator(f, 0),
|
||||||
|
make_function_input_iterator(f, 10),
|
||||||
|
ostream_iterator<int>(cout, " ")
|
||||||
|
);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
<p>Here we can see that we've bounded the number of invocations using an <tt class="docutils literal"><span class="pre">int</span></tt>
|
||||||
|
that counts from <tt class="docutils literal"><span class="pre">0</span></tt> to <tt class="docutils literal"><span class="pre">10</span></tt>. Say we want to create an endless stream
|
||||||
|
of random numbers and encapsulate that in a pair of integers, we can do
|
||||||
|
it with the <tt class="docutils literal"><span class="pre">boost::infinite</span></tt> helper class.</p>
|
||||||
|
<pre class="literal-block">
|
||||||
|
copy(
|
||||||
|
make_function_input_iterator(f,infinite()),
|
||||||
|
make_function_input_iterator(f,infinite()),
|
||||||
|
ostream_iterator<int>(count, " ")
|
||||||
|
);
|
||||||
|
</pre>
|
||||||
|
<p>Above, instead of creating a huge vector we rely on the STL copy algorithm
|
||||||
|
to traverse the function input iterator and call the function object f
|
||||||
|
as it increments the iterator. The special property of <tt class="docutils literal"><span class="pre">boost::infinite</span></tt>
|
||||||
|
is that equating two instances always yield false -- and that incrementing
|
||||||
|
an instance of <tt class="docutils literal"><span class="pre">boost::infinite</span></tt> doesn't do anything. This is an efficient
|
||||||
|
way of stating that the iterator range provided by two iterators with an
|
||||||
|
encapsulated infinite state will definitely be infinite.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="footer">
|
||||||
|
<hr class="footer" />
|
||||||
|
<a class="reference external" href="function_input_iterator.rst">View document source</a>.
|
||||||
|
Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
132
doc/function_input_iterator.rst
Normal file
132
doc/function_input_iterator.rst
Normal file
@@ -0,0 +1,132 @@
|
|||||||
|
:Author:
|
||||||
|
`Dean Michael Berris <mailto:me@deanberris.com>`_
|
||||||
|
|
||||||
|
:License:
|
||||||
|
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)
|
||||||
|
|
||||||
|
:Copyright:
|
||||||
|
Copyright 2012 Google, Inc.
|
||||||
|
|
||||||
|
Function Input Iterator
|
||||||
|
=======================
|
||||||
|
|
||||||
|
The Function Input Iterator allows for creating iterators that encapsulate
|
||||||
|
a nullary function object and a state object which tracks the number of times
|
||||||
|
the iterator has been incremented. A Function Input Iterator models the
|
||||||
|
`InputIterator`_ concept and is useful for creating bounded input iterators.
|
||||||
|
|
||||||
|
.. _InputIterator: http://www.sgi.com/tech/stl/InputIterator.html
|
||||||
|
|
||||||
|
The Function Input Iterator takes a function that models the Generator_ concept
|
||||||
|
(which is basically a nullary or 0-arity function object). The first dereference
|
||||||
|
of the iterator at a given position invokes the generator function and stores
|
||||||
|
and returns the result; subsequent dereferences at the same position simply
|
||||||
|
return the same stored result. Incrementing the iterator places it at a new
|
||||||
|
position, hence a subsequent dereference will generate a new value via another
|
||||||
|
invokation of the generator function. This ensures the generator function is
|
||||||
|
invoked precisely when the iterator is requested to return a (new) value.
|
||||||
|
|
||||||
|
.. _Generator: http://www.sgi.com/tech/stl/Generator.html
|
||||||
|
|
||||||
|
The Function Input Iterator encapsulates a state object which models the
|
||||||
|
`Incrementable Concept`_ and the EqualityComparable_ Concept. These concepts are
|
||||||
|
described below as:
|
||||||
|
|
||||||
|
.. _EqualityComparable: http://www.sgi.com/tech/stl/EqualityComparable.html
|
||||||
|
|
||||||
|
Incrementable Concept
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
A type models the Incrementable Concept when it supports the pre- and post-
|
||||||
|
increment operators. For a given object ``i`` with type ``I``, the following
|
||||||
|
constructs should be valid:
|
||||||
|
|
||||||
|
========= ================= ===========
|
||||||
|
Construct Description Return Type
|
||||||
|
-----------------------------------------
|
||||||
|
i++ Post-increment i. I
|
||||||
|
++i Pre-increment i. I&
|
||||||
|
========= ================= ===========
|
||||||
|
|
||||||
|
NOTE: An Incrementable type should also be DefaultConstructible_.
|
||||||
|
|
||||||
|
.. _DefaultConstructible: http://www.sgi.com/tech/stl/DefaultConstructible.html
|
||||||
|
|
||||||
|
Synopsis
|
||||||
|
--------
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
template <class Function, class State>
|
||||||
|
class function_input_iterator;
|
||||||
|
|
||||||
|
template <class Function, class State>
|
||||||
|
typename function_input_iterator<Function, State>
|
||||||
|
make_function_input_iterator(Function & f, State s);
|
||||||
|
|
||||||
|
struct infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
Function Input Iterator Class
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
The class Function Input Iterator class takes two template parameters
|
||||||
|
``Function`` and ``State``. These two template parameters tell the
|
||||||
|
Function Input Iterator the type of the function to encapsulate and
|
||||||
|
the type of the internal state value to hold.
|
||||||
|
|
||||||
|
The ``State`` parameter is important in cases where you want to
|
||||||
|
control the type of the counter which determines whether two iterators
|
||||||
|
are at the same state. This allows for creating a pair of iterators which
|
||||||
|
bound the range of the invocations of the encapsulated functions.
|
||||||
|
|
||||||
|
Examples
|
||||||
|
--------
|
||||||
|
|
||||||
|
The following example shows how we use the function input iterator class
|
||||||
|
in cases where we want to create bounded (lazy) generated ranges.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
struct generator {
|
||||||
|
typedef int result_type;
|
||||||
|
generator() { srand(time(0)); }
|
||||||
|
result_type operator() () const {
|
||||||
|
return rand();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
int main(int argc, char * argv[]) {
|
||||||
|
generator f;
|
||||||
|
copy(
|
||||||
|
make_function_input_iterator(f, 0),
|
||||||
|
make_function_input_iterator(f, 10),
|
||||||
|
ostream_iterator<int>(cout, " ")
|
||||||
|
);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
Here we can see that we've bounded the number of invocations using an ``int``
|
||||||
|
that counts from ``0`` to ``10``. Say we want to create an endless stream
|
||||||
|
of random numbers and encapsulate that in a pair of integers, we can do
|
||||||
|
it with the ``boost::infinite`` helper class.
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
copy(
|
||||||
|
make_function_input_iterator(f,infinite()),
|
||||||
|
make_function_input_iterator(f,infinite()),
|
||||||
|
ostream_iterator<int>(cout, " ")
|
||||||
|
);
|
||||||
|
|
||||||
|
Above, instead of creating a huge vector we rely on the STL copy algorithm
|
||||||
|
to traverse the function input iterator and call the function object f
|
||||||
|
as it increments the iterator. The special property of ``boost::infinite``
|
||||||
|
is that equating two instances always yield false -- and that incrementing
|
||||||
|
an instance of ``boost::infinite`` doesn't do anything. This is an efficient
|
||||||
|
way of stating that the iterator range provided by two iterators with an
|
||||||
|
encapsulated infinite state will definitely be infinite.
|
||||||
|
|
||||||
|
|
||||||
@@ -3,13 +3,13 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
<meta name="generator" content="Docutils 0.3.8: http://docutils.sourceforge.net/" />
|
<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
|
||||||
<title>Function Output Iterator</title>
|
<title>Function Output Iterator</title>
|
||||||
<meta name="author" content="David Abrahams, Jeremy Siek, Thomas Witt" />
|
<meta name="author" content="David Abrahams, Jeremy Siek, Thomas Witt" />
|
||||||
<meta name="organization" content="Boost Consulting, Indiana University Open Systems Lab, University of Hanover Institute for Transport Railway Operation and Construction" />
|
<meta name="organization" content="Boost Consulting, Indiana University Open Systems Lab, University of Hanover Institute for Transport Railway Operation and Construction" />
|
||||||
<meta name="date" content="2004-11-01" />
|
<meta name="date" content="2006-09-11" />
|
||||||
<meta name="copyright" content="Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003." />
|
<meta name="copyright" content="Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003." />
|
||||||
<link rel="stylesheet" href="default.css" type="text/css" />
|
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="document" id="function-output-iterator">
|
<div class="document" id="function-output-iterator">
|
||||||
@@ -21,22 +21,28 @@
|
|||||||
<tr><th class="docinfo-name">Author:</th>
|
<tr><th class="docinfo-name">Author:</th>
|
||||||
<td>David Abrahams, Jeremy Siek, Thomas Witt</td></tr>
|
<td>David Abrahams, Jeremy Siek, Thomas Witt</td></tr>
|
||||||
<tr><th class="docinfo-name">Contact:</th>
|
<tr><th class="docinfo-name">Contact:</th>
|
||||||
<td><a class="first reference" href="mailto:dave@boost-consulting.com">dave@boost-consulting.com</a>, <a class="reference" href="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</a>, <a class="last reference" href="mailto:witt@ive.uni-hannover.de">witt@ive.uni-hannover.de</a></td></tr>
|
<td><a class="first reference external" href="mailto:dave@boost-consulting.com">dave@boost-consulting.com</a>, <a class="reference external" href="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</a>, <a class="last reference external" href="mailto:witt@ive.uni-hannover.de">witt@ive.uni-hannover.de</a></td></tr>
|
||||||
<tr><th class="docinfo-name">Organization:</th>
|
<tr><th class="docinfo-name">Organization:</th>
|
||||||
<td><a class="first reference" href="http://www.boost-consulting.com">Boost Consulting</a>, Indiana University <a class="reference" href="http://www.osl.iu.edu">Open Systems
|
<td><a class="first reference external" href="http://www.boost-consulting.com">Boost Consulting</a>, Indiana University <a class="reference external" href="http://www.osl.iu.edu">Open Systems
|
||||||
Lab</a>, University of Hanover <a class="last reference" href="http://www.ive.uni-hannover.de">Institute for Transport
|
Lab</a>, University of Hanover <a class="last reference external" href="http://www.ive.uni-hannover.de">Institute for Transport
|
||||||
Railway Operation and Construction</a></td></tr>
|
Railway Operation and Construction</a></td></tr>
|
||||||
<tr><th class="docinfo-name">Date:</th>
|
<tr><th class="docinfo-name">Date:</th>
|
||||||
<td>2004-11-01</td></tr>
|
<td>2006-09-11</td></tr>
|
||||||
<tr><th class="docinfo-name">Copyright:</th>
|
<tr><th class="docinfo-name">Copyright:</th>
|
||||||
<td>Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.</td></tr>
|
<td>Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.</td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<!-- 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) -->
|
||||||
<table class="docutils field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">abstract:</th><td class="field-body">The function output iterator adaptor makes it easier to create custom
|
<tr class="field"><th class="field-name">abstract:</th><td class="field-body"><!-- Copyright David Abrahams 2006. 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) -->
|
||||||
|
The function output iterator adaptor makes it easier to create custom
|
||||||
output iterators. The adaptor takes a unary function and creates a
|
output iterators. The adaptor takes a unary function and creates a
|
||||||
model of Output Iterator. Each item assigned to the output iterator is
|
model of Output Iterator. Each item assigned to the output iterator is
|
||||||
passed as an argument to the unary function. The motivation for this
|
passed as an argument to the unary function. The motivation for this
|
||||||
@@ -47,14 +53,23 @@ proxy object.</td>
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<div class="contents topic" id="table-of-contents">
|
<div class="contents topic" id="table-of-contents">
|
||||||
<p class="topic-title first"><a name="table-of-contents">Table of Contents</a></p>
|
<p class="topic-title first">Table of Contents</p>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><a class="reference" href="#function-output-iterator-requirements" id="id1" name="id1"><tt class="docutils literal"><span class="pre">function_output_iterator</span></tt> requirements</a></li>
|
<li><a class="reference internal" href="#header" id="id1">Header</a></li>
|
||||||
<li><a class="reference" href="#function-output-iterator-models" id="id2" name="id2"><tt class="docutils literal"><span class="pre">function_output_iterator</span></tt> models</a></li>
|
<li><a class="reference internal" href="#function-output-iterator-requirements" id="id2"><tt class="docutils literal"><span class="pre">function_output_iterator</span></tt> requirements</a></li>
|
||||||
<li><a class="reference" href="#function-output-iterator-operations" id="id3" name="id3"><tt class="docutils literal"><span class="pre">function_output_iterator</span></tt> operations</a></li>
|
<li><a class="reference internal" href="#function-output-iterator-models" id="id3"><tt class="docutils literal"><span class="pre">function_output_iterator</span></tt> models</a></li>
|
||||||
<li><a class="reference" href="#example" id="id4" name="id4">Example</a></li>
|
<li><a class="reference internal" href="#function-output-iterator-operations" id="id4"><tt class="docutils literal"><span class="pre">function_output_iterator</span></tt> operations</a></li>
|
||||||
|
<li><a class="reference internal" href="#example" id="id5">Example</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
<!-- Copyright David Abrahams 2006. 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) -->
|
||||||
|
<div class="section" id="header">
|
||||||
|
<h1><a class="toc-backref" href="#id1">Header</a></h1>
|
||||||
|
<pre class="literal-block">
|
||||||
|
#include <boost/iterator/function_output_iterator.hpp>
|
||||||
|
</pre>
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
template <class UnaryFunction>
|
template <class UnaryFunction>
|
||||||
class function_output_iterator {
|
class function_output_iterator {
|
||||||
@@ -76,23 +91,24 @@ private:
|
|||||||
UnaryFunction m_f; // exposition only
|
UnaryFunction m_f; // exposition only
|
||||||
};
|
};
|
||||||
</pre>
|
</pre>
|
||||||
|
</div>
|
||||||
<div class="section" id="function-output-iterator-requirements">
|
<div class="section" id="function-output-iterator-requirements">
|
||||||
<h1><a class="toc-backref" href="#id1" name="function-output-iterator-requirements"><tt class="docutils literal"><span class="pre">function_output_iterator</span></tt> requirements</a></h1>
|
<h1><a class="toc-backref" href="#id2"><tt class="docutils literal"><span class="pre">function_output_iterator</span></tt> requirements</a></h1>
|
||||||
<p><tt class="docutils literal"><span class="pre">UnaryFunction</span></tt> must be Assignable and Copy Constructible.</p>
|
<p><tt class="docutils literal"><span class="pre">UnaryFunction</span></tt> must be Assignable and Copy Constructible.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="function-output-iterator-models">
|
<div class="section" id="function-output-iterator-models">
|
||||||
<h1><a class="toc-backref" href="#id2" name="function-output-iterator-models"><tt class="docutils literal"><span class="pre">function_output_iterator</span></tt> models</a></h1>
|
<h1><a class="toc-backref" href="#id3"><tt class="docutils literal"><span class="pre">function_output_iterator</span></tt> models</a></h1>
|
||||||
<p><tt class="docutils literal"><span class="pre">function_output_iterator</span></tt> is a model of the Writable and
|
<p><tt class="docutils literal"><span class="pre">function_output_iterator</span></tt> is a model of the Writable and
|
||||||
Incrementable Iterator concepts.</p>
|
Incrementable Iterator concepts.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="function-output-iterator-operations">
|
<div class="section" id="function-output-iterator-operations">
|
||||||
<h1><a class="toc-backref" href="#id3" name="function-output-iterator-operations"><tt class="docutils literal"><span class="pre">function_output_iterator</span></tt> operations</a></h1>
|
<h1><a class="toc-backref" href="#id4"><tt class="docutils literal"><span class="pre">function_output_iterator</span></tt> operations</a></h1>
|
||||||
<p><tt class="docutils literal"><span class="pre">explicit</span> <span class="pre">function_output_iterator(const</span> <span class="pre">UnaryFunction&</span> <span class="pre">f</span> <span class="pre">=</span> <span class="pre">UnaryFunction());</span></tt></p>
|
<p><tt class="docutils literal"><span class="pre">explicit</span> <span class="pre">function_output_iterator(const</span> <span class="pre">UnaryFunction&</span> <span class="pre">f</span> <span class="pre">=</span> <span class="pre">UnaryFunction());</span></tt></p>
|
||||||
<table class="docutils field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs an instance of <tt class="docutils literal"><span class="pre">function_output_iterator</span></tt>
|
<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs an instance of <tt class="docutils literal"><span class="pre">function_output_iterator</span></tt>
|
||||||
with <tt class="docutils literal"><span class="pre">m_f</span></tt> constructed from <tt class="docutils literal"><span class="pre">f</span></tt>.</td>
|
with <tt class="docutils literal"><span class="pre">m_f</span></tt> constructed from <tt class="docutils literal"><span class="pre">f</span></tt>.</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
@@ -125,9 +141,12 @@ is equivalent to <tt class="docutils literal"><span class="pre">m_f(t)</span></t
|
|||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<!-- Copyright David Abrahams 2006. 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) -->
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="example">
|
<div class="section" id="example">
|
||||||
<h1><a class="toc-backref" href="#id4" name="example">Example</a></h1>
|
<h1><a class="toc-backref" href="#id5">Example</a></h1>
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
struct string_appender
|
struct string_appender
|
||||||
{
|
{
|
||||||
@@ -152,7 +171,7 @@ int main(int, char*[])
|
|||||||
x.push_back("!");
|
x.push_back("!");
|
||||||
|
|
||||||
std::string s = "";
|
std::string s = "";
|
||||||
std::copy(x.begin(), x.end(),
|
std::copy(x.begin(), x.end(),
|
||||||
boost::make_function_output_iterator(string_appender(s)));
|
boost::make_function_output_iterator(string_appender(s)));
|
||||||
|
|
||||||
std::cout << s << std::endl;
|
std::cout << s << std::endl;
|
||||||
@@ -162,10 +181,11 @@ int main(int, char*[])
|
|||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr class="docutils footer" />
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<a class="reference" href="function_output_iterator.rst">View document source</a>.
|
<hr class="footer" />
|
||||||
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
<a class="reference external" href="function_output_iterator.rst">View document source</a>.
|
||||||
|
Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
BIN
doc/function_output_iterator.pdf
Executable file → Normal file
BIN
doc/function_output_iterator.pdf
Executable file → Normal file
Binary file not shown.
@@ -1,3 +1,7 @@
|
|||||||
|
.. 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)
|
||||||
|
|
||||||
++++++++++++++++++++++++++
|
++++++++++++++++++++++++++
|
||||||
Function Output Iterator
|
Function Output Iterator
|
||||||
++++++++++++++++++++++++++
|
++++++++++++++++++++++++++
|
||||||
@@ -7,7 +11,6 @@
|
|||||||
:organization: `Boost Consulting`_, Indiana University `Open Systems
|
:organization: `Boost Consulting`_, Indiana University `Open Systems
|
||||||
Lab`_, University of Hanover `Institute for Transport
|
Lab`_, University of Hanover `Institute for Transport
|
||||||
Railway Operation and Construction`_
|
Railway Operation and Construction`_
|
||||||
:date: $Date$
|
|
||||||
:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
|
:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
|
||||||
|
|
||||||
.. _`Boost Consulting`: http://www.boost-consulting.com
|
.. _`Boost Consulting`: http://www.boost-consulting.com
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
.. Copyright David Abrahams 2006. 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)
|
||||||
|
|
||||||
Example
|
Example
|
||||||
.......
|
.......
|
||||||
|
|
||||||
|
|||||||
162
doc/generator_iterator.htm
Normal file
162
doc/generator_iterator.htm
Normal file
@@ -0,0 +1,162 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Language" content="en-us">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
|
||||||
|
|
||||||
|
<title>Generator Iterator Adaptor Documentation</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body bgcolor="#FFFFFF" text="#000000">
|
||||||
|
<img src="../../boost.png" alt="boost.png (6897 bytes)" align="middle"
|
||||||
|
width="277" height="86">
|
||||||
|
|
||||||
|
<h1>Generator Iterator Adaptor</h1>
|
||||||
|
|
||||||
|
<p>Defined in header <a href=
|
||||||
|
"../../boost/iterator/generator_iterator.hpp">boost/iterator/generator_iterator.hpp</a></p>
|
||||||
|
|
||||||
|
<p>The generator iterator adaptor makes it easier to create custom input
|
||||||
|
iterators from 0-ary functions and function objects. The adaptor takes a
|
||||||
|
<a href="http://www.sgi.com/tech/stl/Generator.html">Generator</a> and
|
||||||
|
creates a model of <a href=
|
||||||
|
"http://www.sgi.com/tech/stl/InputIterator.html">Input Iterator</a>. Each
|
||||||
|
increment retrieves an item from the generator and makes it available to be
|
||||||
|
retrieved by dereferencing. The motivation for this iterator is that some
|
||||||
|
concepts can be more naturally expressed as a generator, while most STL
|
||||||
|
algorithms expect an iterator. An example is the <a href=
|
||||||
|
"../random/index.html">Random Number</a> library.</p>
|
||||||
|
|
||||||
|
<h2>Synopsis</h2>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<pre>
|
||||||
|
namespace boost {
|
||||||
|
namespace iterators {
|
||||||
|
template <class Generator>
|
||||||
|
class generator_iterator_generator;
|
||||||
|
|
||||||
|
template <class Generator>
|
||||||
|
typename generator_iterator_generator<Generator>::type
|
||||||
|
make_generator_iterator(Generator & gen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
</blockquote>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>The Generator Iterator Generator Class</h2>
|
||||||
|
|
||||||
|
<p>The class generator_iterator_generator is a helper class whose purpose
|
||||||
|
is to construct a generator iterator type. The template parameter for this
|
||||||
|
class is the Generator function object type that is being wrapped. The
|
||||||
|
generator iterator adaptor only holds a reference (or pointer) to the
|
||||||
|
function object, therefore the function object must outlive the generator
|
||||||
|
iterator adaptor constructed from it.</p>
|
||||||
|
<pre>
|
||||||
|
template <class Generator>
|
||||||
|
class generator_iterator_generator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using type = <i>unspecified</i>; // the resulting generator iterator type
|
||||||
|
};
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h3>Template Parameters</h3>
|
||||||
|
|
||||||
|
<table border summary="">
|
||||||
|
<tr>
|
||||||
|
<th>Parameter</th>
|
||||||
|
|
||||||
|
<th>Description</th>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><tt><a href=
|
||||||
|
"http://www.sgi.com/tech/stl/Generator.html">Generator</a></tt></td>
|
||||||
|
|
||||||
|
<td>The generator (0-ary function object) type being wrapped. The
|
||||||
|
return type of the function is deduced automatically from its
|
||||||
|
<tt>operator()</tt>. The function object must be a model of
|
||||||
|
<a href=
|
||||||
|
"http://www.sgi.com/tech/stl/Generator.html">Generator</a>.</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h3>Concept Model</h3>
|
||||||
|
|
||||||
|
<p>The generator iterator class is a model of <a href=
|
||||||
|
"http://www.sgi.com/tech/stl/InputIterator.html">Input Iterator</a>.</p>
|
||||||
|
|
||||||
|
<h3>Members</h3>
|
||||||
|
|
||||||
|
<p>The generator iterator implements the member functions and operators
|
||||||
|
required of the <a href=
|
||||||
|
"http://www.sgi.com/tech/stl/InputIterator.html">Input Iterator</a>
|
||||||
|
concept.<br></p>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="make_generator_iterator" id="make_generator_iterator">The
|
||||||
|
Generator Iterator Object Generator</a></h2>
|
||||||
|
|
||||||
|
<p>The <tt>make_generator_iterator()</tt> function provides a convenient
|
||||||
|
way to create generator iterator objects. The function saves the user the
|
||||||
|
trouble of explicitly writing out the iterator types.</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<pre>
|
||||||
|
template <class Generator>
|
||||||
|
typename generator_iterator_generator<Generator>::type
|
||||||
|
make_generator_iterator(Generator & gen);
|
||||||
|
</pre>
|
||||||
|
</blockquote>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h3>Example</h3>
|
||||||
|
|
||||||
|
<p>The following program shows how <code>generator_iterator</code>
|
||||||
|
transforms a generator into an input iterator.</p>
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<pre>
|
||||||
|
#include <iostream>
|
||||||
|
#include <boost/iterators/generator_iterator.hpp>
|
||||||
|
|
||||||
|
class my_generator
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
using result_type = int;
|
||||||
|
my_generator() : state(0) { }
|
||||||
|
result_type operator()() { return ++state; }
|
||||||
|
private:
|
||||||
|
int state;
|
||||||
|
};
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
my_generator gen;
|
||||||
|
auto it = boost::iterators::make_generator_iterator(gen);
|
||||||
|
for(int i = 0; i < 10; ++i, ++it)
|
||||||
|
std::cout << *it << std::endl;
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
</blockquote>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<p><a href="http://validator.w3.org/check?uri=referer"><img border="0" src=
|
||||||
|
"../../doc/images/valid-html401.png" alt="Valid HTML 4.01 Transitional"
|
||||||
|
height="31" width="88"></a></p>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B, %Y" startspan -->05 December, 2006<!--webbot bot="Timestamp" endspan i-checksum="38516" --></p>
|
||||||
|
|
||||||
|
<p><i>Copyright © 2001 <a href=
|
||||||
|
"http://www.boost.org/people/jens_maurer.htm">Jens Maurer</a></i></p>
|
||||||
|
|
||||||
|
<p><i>Distributed under the Boost Software License, Version 1.0. (See
|
||||||
|
accompanying file <a href="../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or
|
||||||
|
copy at <a href=
|
||||||
|
"http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</a>)</i></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
119
doc/index.html
Executable file → Normal file
119
doc/index.html
Executable file → Normal file
@@ -3,13 +3,17 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
<meta name="generator" content="Docutils 0.3.8: http://docutils.sourceforge.net/" />
|
<meta name="generator" content="Docutils 0.6: http://docutils.sourceforge.net/" />
|
||||||
<title>The Boost.Iterator Library Boost</title>
|
<title>The Boost.Iterator Library Boost</title>
|
||||||
<link rel="stylesheet" href="default.css" type="text/css" />
|
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="document" id="the-boost-iterator-library-logo">
|
<div class="document" id="the-boost-iterator-library-logo">
|
||||||
<h1 class="title">The Boost.Iterator Library <a class="reference" href="../../../index.htm"><img alt="Boost" src="../../../boost.png" /></a></h1>
|
<h1 class="title">The Boost.Iterator Library <a class="reference external" href="../../../index.htm"><img alt="Boost" src="../../../boost.png" /></a></h1>
|
||||||
|
|
||||||
|
<!-- 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) -->
|
||||||
<hr class="docutils" />
|
<hr class="docutils" />
|
||||||
<table class="docutils field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
@@ -17,12 +21,10 @@
|
|||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">Authors:</th><td class="field-body">David Abrahams, Jeremy Siek, Thomas Witt</td>
|
<tr class="field"><th class="field-name">Authors:</th><td class="field-body">David Abrahams, Jeremy Siek, Thomas Witt</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="field"><th class="field-name">Contact:</th><td class="field-body"><a class="reference" href="mailto:dave@boost-consulting.com">dave@boost-consulting.com</a>, <a class="reference" href="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</a>, <a class="reference" href="mailto:witt@styleadvisor.com">witt@styleadvisor.com</a></td>
|
<tr class="field"><th class="field-name">Contact:</th><td class="field-body"><a class="reference external" href="mailto:dave@boost-consulting.com">dave@boost-consulting.com</a>, <a class="reference external" href="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</a>, <a class="reference external" href="mailto:witt@styleadvisor.com">witt@styleadvisor.com</a></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="field"><th class="field-name">organizations:</th><td class="field-body"><a class="reference" href="http://www.boost-consulting.com">Boost Consulting</a>, Indiana University <a class="reference" href="http://www.osl.iu.edu">Open Systems
|
<tr class="field"><th class="field-name">organizations:</th><td class="field-body"><a class="reference external" href="http://www.boost-consulting.com">Boost Consulting</a>, Indiana University <a class="reference external" href="http://www.osl.iu.edu">Open Systems
|
||||||
Lab</a>, <a class="reference" href="http://www.styleadvisor.com">Zephyr Associates, Inc.</a></td>
|
Lab</a>, <a class="reference external" href="http://www.styleadvisor.com">Zephyr Associates, Inc.</a></td>
|
||||||
</tr>
|
|
||||||
<tr class="field"><th class="field-name">date:</th><td class="field-body">$Date$</td>
|
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="field"><th class="field-name">copyright:</th><td class="field-body">Copyright David Abrahams, Jeremy Siek, Thomas Witt 2003.</td>
|
<tr class="field"><th class="field-name">copyright:</th><td class="field-body">Copyright David Abrahams, Jeremy Siek, Thomas Witt 2003.</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -33,7 +35,7 @@ Lab</a>, <a class="reference" href="http://www.styleadvisor.com">Zephyr Associat
|
|||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">Abstract:</th><td class="field-body">The Boost Iterator Library contains two parts. The first
|
<tr class="field"><th class="field-name">Abstract:</th><td class="field-body">The Boost Iterator Library contains two parts. The first
|
||||||
is a system of <a class="reference" href="../../../more/generic_programming.html#concept">concepts</a> which extend the C++ standard
|
is a system of <a class="reference external" href="http://www.boost.org/more/generic_programming.html#concept">concepts</a> which extend the C++ standard
|
||||||
iterator requirements. The second is a framework of
|
iterator requirements. The second is a framework of
|
||||||
components for building iterators based on these
|
components for building iterators based on these
|
||||||
extended concepts and includes several useful iterator
|
extended concepts and includes several useful iterator
|
||||||
@@ -51,23 +53,23 @@ older Boost Iterator Adaptor Library.</td>
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<div class="contents topic" id="table-of-contents">
|
<div class="contents topic" id="table-of-contents">
|
||||||
<p class="topic-title first"><a name="table-of-contents"><strong>Table of Contents</strong></a></p>
|
<p class="topic-title first"><strong>Table of Contents</strong></p>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><a class="reference" href="#new-style-iterators" id="id22" name="id22">New-Style Iterators</a></li>
|
<li><a class="reference internal" href="#new-style-iterators" id="id23">New-Style Iterators</a></li>
|
||||||
<li><a class="reference" href="#iterator-facade-and-adaptor" id="id23" name="id23">Iterator Facade and Adaptor</a></li>
|
<li><a class="reference internal" href="#iterator-facade-and-adaptor" id="id24">Iterator Facade and Adaptor</a></li>
|
||||||
<li><a class="reference" href="#specialized-adaptors" id="id24" name="id24">Specialized Adaptors</a></li>
|
<li><a class="reference internal" href="#specialized-adaptors" id="id25">Specialized Adaptors</a></li>
|
||||||
<li><a class="reference" href="#iterator-utilities" id="id25" name="id25">Iterator Utilities</a><ul>
|
<li><a class="reference internal" href="#iterator-utilities" id="id26">Iterator Utilities</a><ul>
|
||||||
<li><a class="reference" href="#traits" id="id26" name="id26">Traits</a></li>
|
<li><a class="reference internal" href="#traits" id="id27">Traits</a></li>
|
||||||
<li><a class="reference" href="#testing-and-concept-checking" id="id27" name="id27">Testing and Concept Checking</a></li>
|
<li><a class="reference internal" href="#testing-and-concept-checking" id="id28">Testing and Concept Checking</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a class="reference" href="#upgrading-from-the-old-boost-iterator-adaptor-library" id="id28" name="id28">Upgrading from the old Boost Iterator Adaptor Library</a></li>
|
<li><a class="reference internal" href="#upgrading-from-the-old-boost-iterator-adaptor-library" id="id29">Upgrading from the old Boost Iterator Adaptor Library</a></li>
|
||||||
<li><a class="reference" href="#history" id="id29" name="id29">History</a></li>
|
<li><a class="reference internal" href="#history" id="id30">History</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<hr class="docutils" />
|
<hr class="docutils" />
|
||||||
<div class="section" id="new-style-iterators">
|
<div class="section" id="new-style-iterators">
|
||||||
<h1><a class="toc-backref" href="#id22" name="new-style-iterators">New-Style Iterators</a></h1>
|
<h1><a class="toc-backref" href="#id23">New-Style Iterators</a></h1>
|
||||||
<p>The iterator categories defined in C++98 are extremely limiting
|
<p>The iterator categories defined in C++98 are extremely limiting
|
||||||
because they bind together two orthogonal concepts: traversal and
|
because they bind together two orthogonal concepts: traversal and
|
||||||
element access. For example, because a random access iterator is
|
element access. For example, because a random access iterator is
|
||||||
@@ -76,17 +78,17 @@ it is impossible to capture the capabilities of
|
|||||||
<tt class="docutils literal"><span class="pre">vector<bool>::iterator</span></tt> using the C++98 categories. This is the
|
<tt class="docutils literal"><span class="pre">vector<bool>::iterator</span></tt> using the C++98 categories. This is the
|
||||||
infamous "<tt class="docutils literal"><span class="pre">vector<bool></span></tt> is not a container, and its iterators
|
infamous "<tt class="docutils literal"><span class="pre">vector<bool></span></tt> is not a container, and its iterators
|
||||||
aren't random access iterators", debacle about which Herb Sutter
|
aren't random access iterators", debacle about which Herb Sutter
|
||||||
wrote two papers for the standards comittee (<a class="reference" href="http://www.gotw.ca/publications/N1185.pdf">n1185</a> and <a class="reference" href="http://www.gotw.ca/publications/N1211.pdf">n1211</a>),
|
wrote two papers for the standards comittee (<a class="reference external" href="http://www.gotw.ca/publications/N1185.pdf">n1185</a> and <a class="reference external" href="http://www.gotw.ca/publications/N1211.pdf">n1211</a>),
|
||||||
and a <a class="reference" href="http://www.gotw.ca/gotw/050.htm">Guru of the Week</a>. New-style iterators go well beyond
|
and a <a class="reference external" href="http://www.gotw.ca/gotw/050.htm">Guru of the Week</a>. New-style iterators go well beyond
|
||||||
patching up <tt class="docutils literal"><span class="pre">vector<bool></span></tt>, though: there are lots of other
|
patching up <tt class="docutils literal"><span class="pre">vector<bool></span></tt>, though: there are lots of other
|
||||||
iterators already in use which can't be adequately represented by
|
iterators already in use which can't be adequately represented by
|
||||||
the existing concepts. For details about the new iterator
|
the existing concepts. For details about the new iterator
|
||||||
concepts, see our</p>
|
concepts, see our</p>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<a class="reference" href="new-iter-concepts.html">Standard Proposal For New-Style Iterators</a> (<a class="reference" href="new-iter-concepts.pdf">PDF</a>)</blockquote>
|
<a class="reference external" href="new-iter-concepts.html">Standard Proposal For New-Style Iterators</a> (<a class="reference external" href="new-iter-concepts.pdf">PDF</a>)</blockquote>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="iterator-facade-and-adaptor">
|
<div class="section" id="iterator-facade-and-adaptor">
|
||||||
<h1><a class="toc-backref" href="#id23" name="iterator-facade-and-adaptor">Iterator Facade and Adaptor</a></h1>
|
<h1><a class="toc-backref" href="#id24">Iterator Facade and Adaptor</a></h1>
|
||||||
<p>Writing standard-conforming iterators is tricky, but the need comes
|
<p>Writing standard-conforming iterators is tricky, but the need comes
|
||||||
up often. In order to ease the implementation of new iterators,
|
up often. In order to ease the implementation of new iterators,
|
||||||
the Boost.Iterator library provides the <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> class template,
|
the Boost.Iterator library provides the <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> class template,
|
||||||
@@ -102,54 +104,60 @@ behavior as possible.</p>
|
|||||||
<p>The documentation for these two classes can be found at the following
|
<p>The documentation for these two classes can be found at the following
|
||||||
web pages:</p>
|
web pages:</p>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><a class="reference" href="iterator_facade.html"><tt class="docutils literal"><span class="pre">iterator_facade</span></tt></a> (<a class="reference" href="iterator_facade.pdf">PDF</a>)</li>
|
<li><a class="reference external" href="iterator_facade.html"><tt class="docutils literal"><span class="pre">iterator_facade</span></tt></a> (<a class="reference external" href="iterator_facade.pdf">PDF</a>)</li>
|
||||||
<li><a class="reference" href="iterator_adaptor.html"><tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt></a> (<a class="reference" href="iterator_adaptor.pdf">PDF</a>)</li>
|
<li><a class="reference external" href="iterator_adaptor.html"><tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt></a> (<a class="reference external" href="iterator_adaptor.pdf">PDF</a>)</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>Both <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> and <tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> as well as many of the <a class="reference" href="#specialized-adaptors">specialized
|
<p>Both <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> and <tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> as well as many of the <a class="reference internal" href="#specialized-adaptors">specialized
|
||||||
adaptors</a> mentioned below have been proposed for standardization,
|
adaptors</a> mentioned below have been proposed for standardization,
|
||||||
and accepted into the first C++ technical report; see our</p>
|
and accepted into the first C++ technical report; see our</p>
|
||||||
<blockquote>
|
<blockquote>
|
||||||
<a class="reference" href="facade-and-adaptor.html">Standard Proposal For Iterator Facade and Adaptor</a> (<a class="reference" href="facade-and-adaptor.pdf">PDF</a>)</blockquote>
|
<a class="reference external" href="facade-and-adaptor.html">Standard Proposal For Iterator Facade and Adaptor</a> (<a class="reference external" href="facade-and-adaptor.pdf">PDF</a>)</blockquote>
|
||||||
<p>for more details.</p>
|
<p>for more details.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="specialized-adaptors">
|
<div class="section" id="specialized-adaptors">
|
||||||
<h1><a class="toc-backref" href="#id24" name="specialized-adaptors">Specialized Adaptors</a></h1>
|
<h1><a class="toc-backref" href="#id25">Specialized Adaptors</a></h1>
|
||||||
<p>The iterator library supplies a useful suite of standard-conforming
|
<p>The iterator library supplies a useful suite of standard-conforming
|
||||||
iterator templates based on the Boost <a class="reference" href="#iterator-facade-and-adaptor">iterator facade and adaptor</a>.</p>
|
iterator templates based on the Boost <a class="reference internal" href="#iterator-facade-and-adaptor">iterator facade and adaptor</a>.</p>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><a class="reference" href="counting_iterator.html"><tt class="docutils literal"><span class="pre">counting_iterator</span></tt></a> (<a class="reference" href="counting_iterator.pdf">PDF</a>): an iterator over a sequence of consecutive values.
|
<li><a class="reference external" href="counting_iterator.html"><tt class="docutils literal"><span class="pre">counting_iterator</span></tt></a> (<a class="reference external" href="counting_iterator.pdf">PDF</a>): an iterator over a sequence of consecutive values.
|
||||||
Implements a "lazy sequence"</li>
|
Implements a "lazy sequence"</li>
|
||||||
<li><a class="reference" href="filter_iterator.html"><tt class="docutils literal"><span class="pre">filter_iterator</span></tt></a> (<a class="reference" href="filter_iterator.pdf">PDF</a>): an iterator over the subset of elements of some
|
<li><a class="reference external" href="filter_iterator.html"><tt class="docutils literal"><span class="pre">filter_iterator</span></tt></a> (<a class="reference external" href="filter_iterator.pdf">PDF</a>): an iterator over the subset of elements of some
|
||||||
sequence which satisfy a given predicate</li>
|
sequence which satisfy a given predicate</li>
|
||||||
<li><a class="reference" href="function_output_iterator.html"><tt class="docutils literal"><span class="pre">function_output_iterator</span></tt></a> (<a class="reference" href="function_output_iterator.pdf">PDF</a>): an output iterator wrapping a unary function
|
<li><a class="reference external" href="function_input_iterator.html"><tt class="docutils literal"><span class="pre">function_input_iterator</span></tt></a> (<a class="reference external" href="function_input_iterator.pdf">PDF</a>): 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.</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
|
object; each time an element is written into the dereferenced
|
||||||
iterator, it is passed as a parameter to the function object.</li>
|
iterator, it is passed as a parameter to the function object.</li>
|
||||||
<li><a class="reference" href="indirect_iterator.html"><tt class="docutils literal"><span class="pre">indirect_iterator</span></tt></a> (<a class="reference" href="indirect_iterator.pdf">PDF</a>): an iterator over the objects <em>pointed-to</em> by the
|
<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>
|
elements of some sequence.</li>
|
||||||
<li><a class="reference" href="permutation_iterator.html"><tt class="docutils literal"><span class="pre">permutation_iterator</span></tt></a> (<a class="reference" href="permutation_iterator.pdf">PDF</a>): an iterator over the elements of some random-access
|
<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
|
||||||
sequence, rearranged according to some sequence of integer indices.</li>
|
sequence, rearranged according to some sequence of integer indices.</li>
|
||||||
<li><a class="reference" href="reverse_iterator.html"><tt class="docutils literal"><span class="pre">reverse_iterator</span></tt></a> (<a class="reference" href="reverse_iterator.pdf">PDF</a>): an iterator which traverses the elements of some
|
<li><a class="reference external" href="reverse_iterator.html"><tt class="docutils literal"><span class="pre">reverse_iterator</span></tt></a> (<a class="reference external" href="reverse_iterator.pdf">PDF</a>): an iterator which traverses the elements of some
|
||||||
bidirectional sequence in reverse. Corrects many of the
|
bidirectional sequence in reverse. Corrects many of the
|
||||||
shortcomings of C++98's <tt class="docutils literal"><span class="pre">std::reverse_iterator</span></tt>.</li>
|
shortcomings of C++98's <tt class="docutils literal"><span class="pre">std::reverse_iterator</span></tt>.</li>
|
||||||
<li><a class="reference" href="../../utility/shared_container_iterator.html"><tt class="docutils literal"><span class="pre">shared_container_iterator</span></tt></a>: an iterator over elements of a container whose
|
<li><a class="reference external" href="../../utility/shared_container_iterator.html"><tt class="docutils literal"><span class="pre">shared_container_iterator</span></tt></a>: an iterator over elements of a container whose
|
||||||
lifetime is maintained by a <a class="reference" href="../../smart_ptr/shared_ptr.htm"><tt class="docutils literal"><span class="pre">shared_ptr</span></tt></a> stored in the iterator.</li>
|
lifetime is maintained by a <tt class="docutils literal"><span class="pre">shared_ptr</span></tt> stored in the iterator.</li>
|
||||||
<li><a class="reference" href="transform_iterator.html"><tt class="docutils literal"><span class="pre">transform_iterator</span></tt></a> (<a class="reference" href="transform_iterator.pdf">PDF</a>): an iterator over elements which are the result of
|
<li><a class="reference external" href="transform_iterator.html"><tt class="docutils literal"><span class="pre">transform_iterator</span></tt></a> (<a class="reference external" href="transform_iterator.pdf">PDF</a>): an iterator over elements which are the result of
|
||||||
applying some functional transformation to the elements of an
|
applying some functional transformation to the elements of an
|
||||||
underlying sequence. This component also replaces the old
|
underlying sequence. This component also replaces the old
|
||||||
<tt class="docutils literal"><span class="pre">projection_iterator_adaptor</span></tt>.</li>
|
<tt class="docutils literal"><span class="pre">projection_iterator_adaptor</span></tt>.</li>
|
||||||
<li><a class="reference" href="zip_iterator.html"><tt class="docutils literal"><span class="pre">zip_iterator</span></tt></a> (<a class="reference" href="zip_iterator.pdf">PDF</a>): an iterator over tuples of the elements at corresponding
|
<li><a class="reference external" href="zip_iterator.html"><tt class="docutils literal"><span class="pre">zip_iterator</span></tt></a> (<a class="reference external" href="zip_iterator.pdf">PDF</a>): an iterator over tuples of the elements at corresponding
|
||||||
positions of heterogeneous underlying iterators.</li>
|
positions of heterogeneous underlying iterators.</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="iterator-utilities">
|
<div class="section" id="iterator-utilities">
|
||||||
<h1><a class="toc-backref" href="#id25" name="iterator-utilities">Iterator Utilities</a></h1>
|
<h1><a class="toc-backref" href="#id26">Iterator Utilities</a></h1>
|
||||||
<div class="section" id="traits">
|
<div class="section" id="traits">
|
||||||
<h2><a class="toc-backref" href="#id26" name="traits">Traits</a></h2>
|
<h2><a class="toc-backref" href="#id27">Traits</a></h2>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><a class="reference" href="pointee.html"><tt class="docutils literal"><span class="pre">pointee.hpp</span></tt></a> (<a class="reference" href="pointee.pdf">PDF</a>): Provides the capability to deduce the referent types
|
<li><a class="reference external" href="pointee.html"><tt class="docutils literal"><span class="pre">pointee.hpp</span></tt></a> (<a class="reference external" href="pointee.pdf">PDF</a>): Provides the capability to deduce the referent types
|
||||||
of pointers, smart pointers and iterators in generic code. Used
|
of pointers, smart pointers and iterators in generic code. Used
|
||||||
in <tt class="docutils literal"><span class="pre">indirect_iterator</span></tt>.</li>
|
in <tt class="docutils literal"><span class="pre">indirect_iterator</span></tt>.</li>
|
||||||
<li><a class="reference" href="iterator_traits.html"><tt class="docutils literal"><span class="pre">iterator_traits.hpp</span></tt></a> (<a class="reference" href="iterator_traits.pdf">PDF</a>): Provides <a class="reference" href="../../mpl/doc/index.html">MPL</a>-compatible metafunctions which
|
<li><a class="reference external" href="iterator_traits.html"><tt class="docutils literal"><span class="pre">iterator_traits.hpp</span></tt></a> (<a class="reference external" href="iterator_traits.pdf">PDF</a>): Provides <a class="reference external" href="../../mpl/doc/index.html">MPL</a>-compatible metafunctions which
|
||||||
retrieve an iterator's traits. Also corrects for the deficiencies
|
retrieve an iterator's traits. Also corrects for the deficiencies
|
||||||
of broken implementations of <tt class="docutils literal"><span class="pre">std::iterator_traits</span></tt>.</li>
|
of broken implementations of <tt class="docutils literal"><span class="pre">std::iterator_traits</span></tt>.</li>
|
||||||
</ul>
|
</ul>
|
||||||
@@ -158,25 +166,25 @@ testing iterator interoperability -->
|
|||||||
<!-- comment! __ interoperable.pdf -->
|
<!-- comment! __ interoperable.pdf -->
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="testing-and-concept-checking">
|
<div class="section" id="testing-and-concept-checking">
|
||||||
<h2><a class="toc-backref" href="#id27" name="testing-and-concept-checking">Testing and Concept Checking</a></h2>
|
<h2><a class="toc-backref" href="#id28">Testing and Concept Checking</a></h2>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><a class="reference" href="iterator_concepts.html"><tt class="docutils literal"><span class="pre">iterator_concepts.hpp</span></tt></a> (<a class="reference" href="iterator_concepts.pdf">PDF</a>): Concept checking classes for the new iterator concepts.</li>
|
<li><a class="reference external" href="iterator_concepts.html"><tt class="docutils literal"><span class="pre">iterator_concepts.hpp</span></tt></a> (<a class="reference external" href="iterator_concepts.pdf">PDF</a>): Concept checking classes for the new iterator concepts.</li>
|
||||||
<li><a class="reference" href="iterator_archetypes.html"><tt class="docutils literal"><span class="pre">iterator_archetypes.hpp</span></tt></a> (<a class="reference" href="iterator_archetypes.pdf">PDF</a>): Concept archetype classes for the new iterators concepts.</li>
|
<li><a class="reference external" href="iterator_archetypes.html"><tt class="docutils literal"><span class="pre">iterator_archetypes.hpp</span></tt></a> (<a class="reference external" href="iterator_archetypes.pdf">PDF</a>): Concept archetype classes for the new iterators concepts.</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="upgrading-from-the-old-boost-iterator-adaptor-library">
|
<div class="section" id="upgrading-from-the-old-boost-iterator-adaptor-library">
|
||||||
<h1><a class="toc-backref" href="#id28" name="upgrading-from-the-old-boost-iterator-adaptor-library">Upgrading from the old Boost Iterator Adaptor Library</a></h1>
|
<h1><a class="toc-backref" href="#id29">Upgrading from the old Boost Iterator Adaptor Library</a></h1>
|
||||||
<a class="target" id="upgrading" name="upgrading"></a><p>If you have been using the old Boost Iterator Adaptor library to
|
<p id="upgrading">If you have been using the old Boost Iterator Adaptor library to
|
||||||
implement iterators, you probably wrote a <tt class="docutils literal"><span class="pre">Policies</span></tt> class which
|
implement iterators, you probably wrote a <tt class="docutils literal"><span class="pre">Policies</span></tt> class which
|
||||||
captures the core operations of your iterator. In the new library
|
captures the core operations of your iterator. In the new library
|
||||||
design, you'll move those same core operations into the body of the
|
design, you'll move those same core operations into the body of the
|
||||||
iterator class itself. If you were writing a family of iterators,
|
iterator class itself. If you were writing a family of iterators,
|
||||||
you probably wrote a <a class="reference" href="../../../more/generic_programming.html#type_generator">type generator</a> to build the
|
you probably wrote a <a class="reference external" href="http://www.boost.org/more/generic_programming.html#type_generator">type generator</a> to build the
|
||||||
<tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> specialization you needed; in the new library
|
<tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> specialization you needed; in the new library
|
||||||
design you don't need a type generator (though may want to keep it
|
design you don't need a type generator (though may want to keep it
|
||||||
around as a compatibility aid for older code) because, due to the
|
around as a compatibility aid for older code) because, due to the
|
||||||
use of the Curiously Recurring Template Pattern (CRTP) <a class="citation-reference" href="#cop95" id="id21" name="id21">[Cop95]</a>,
|
use of the Curiously Recurring Template Pattern (CRTP) <a class="citation-reference" href="#cop95" id="id22">[Cop95]</a>,
|
||||||
you can now define the iterator class yourself and acquire
|
you can now define the iterator class yourself and acquire
|
||||||
functionality through inheritance from <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> or
|
functionality through inheritance from <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> or
|
||||||
<tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt>. As a result, you also get much finer control
|
<tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt>. As a result, you also get much finer control
|
||||||
@@ -191,7 +199,7 @@ type, <tt class="docutils literal"><span class="pre">transform_iterator</span></
|
|||||||
<tt class="docutils literal"><span class="pre">projection_iterator</span></tt> used to.</p>
|
<tt class="docutils literal"><span class="pre">projection_iterator</span></tt> used to.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="history">
|
<div class="section" id="history">
|
||||||
<h1><a class="toc-backref" href="#id29" name="history">History</a></h1>
|
<h1><a class="toc-backref" href="#id30">History</a></h1>
|
||||||
<p>In 2000 Dave Abrahams was writing an iterator for a container of
|
<p>In 2000 Dave Abrahams was writing an iterator for a container of
|
||||||
pointers, which would access the pointed-to elements when
|
pointers, which would access the pointed-to elements when
|
||||||
dereferenced. Naturally, being a library writer, he decided to
|
dereferenced. Naturally, being a library writer, he decided to
|
||||||
@@ -219,7 +227,7 @@ library you see today.</p>
|
|||||||
<table class="docutils citation" frame="void" id="cop95" rules="none">
|
<table class="docutils citation" frame="void" id="cop95" rules="none">
|
||||||
<colgroup><col class="label" /><col /></colgroup>
|
<colgroup><col class="label" /><col /></colgroup>
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr><td class="label"><a class="fn-backref" href="#id21" name="cop95">[Cop95]</a></td><td>[Coplien, 1995] Coplien, J., Curiously Recurring Template
|
<tr><td class="label"><a class="fn-backref" href="#id22">[Cop95]</a></td><td>[Coplien, 1995] Coplien, J., Curiously Recurring Template
|
||||||
Patterns, C++ Report, February 1995, pp. 24-27.</td></tr>
|
Patterns, C++ Report, February 1995, pp. 24-27.</td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
@@ -232,10 +240,11 @@ LocalWords: incrementable xxx min prev inplace png oldeqnew AccessTag struct
|
|||||||
LocalWords: TraversalTag typename lvalues DWA Hmm JGS -->
|
LocalWords: TraversalTag typename lvalues DWA Hmm JGS -->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr class="docutils footer" />
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<a class="reference" href="index.rst">View document source</a>.
|
<hr class="footer" />
|
||||||
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
<a class="reference external" href="index.rst">View document source</a>.
|
||||||
|
Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
51
doc/index.rst
Executable file → Normal file
51
doc/index.rst
Executable file → Normal file
@@ -1,3 +1,7 @@
|
|||||||
|
.. 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)
|
||||||
|
|
||||||
+++++++++++++++++++++++++++++++++++++++++++++++++
|
+++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
The Boost.Iterator Library |(logo)|__
|
The Boost.Iterator Library |(logo)|__
|
||||||
+++++++++++++++++++++++++++++++++++++++++++++++++
|
+++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
@@ -15,7 +19,6 @@ __ ../../../index.htm
|
|||||||
:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com
|
:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com
|
||||||
:organizations: `Boost Consulting`_, Indiana University `Open Systems
|
:organizations: `Boost Consulting`_, Indiana University `Open Systems
|
||||||
Lab`_, `Zephyr Associates, Inc.`_
|
Lab`_, `Zephyr Associates, Inc.`_
|
||||||
:date: $Date$
|
|
||||||
|
|
||||||
:copyright: Copyright David Abrahams, Jeremy Siek, Thomas Witt 2003.
|
:copyright: Copyright David Abrahams, Jeremy Siek, Thomas Witt 2003.
|
||||||
|
|
||||||
@@ -39,7 +42,7 @@ __ ../../../index.htm
|
|||||||
The components of the Boost Iterator Library replace the
|
The components of the Boost Iterator Library replace the
|
||||||
older Boost Iterator Adaptor Library.
|
older Boost Iterator Adaptor Library.
|
||||||
|
|
||||||
.. _concepts: ../../../more/generic_programming.html#concept
|
.. _concepts: http://www.boost.org/more/generic_programming.html#concept
|
||||||
|
|
||||||
.. contents:: **Table of Contents**
|
.. contents:: **Table of Contents**
|
||||||
|
|
||||||
@@ -111,8 +114,8 @@ __ iterator_facade.pdf
|
|||||||
__ iterator_adaptor.pdf
|
__ iterator_adaptor.pdf
|
||||||
|
|
||||||
Both |facade| and |adaptor| as well as many of the `specialized
|
Both |facade| and |adaptor| as well as many of the `specialized
|
||||||
adaptors`_ mentioned below have been proposed for standardization,
|
adaptors`_ mentioned below have been proposed for standardization;
|
||||||
and accepted into the first C++ technical report; see our
|
see our
|
||||||
|
|
||||||
`Standard Proposal For Iterator Facade and Adaptor`__ (PDF__)
|
`Standard Proposal For Iterator Facade and Adaptor`__ (PDF__)
|
||||||
|
|
||||||
@@ -134,10 +137,18 @@ iterator templates based on the Boost `iterator facade and adaptor`_.
|
|||||||
* |filter|_ (PDF__): an iterator over the subset of elements of some
|
* |filter|_ (PDF__): an iterator over the subset of elements of some
|
||||||
sequence which satisfy a given predicate
|
sequence which satisfy a given predicate
|
||||||
|
|
||||||
* |function|_ (PDF__): an output iterator wrapping a unary function
|
* |function_input|_ (PDF__): 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|_ (PDF__): an output iterator wrapping a unary function
|
||||||
object; each time an element is written into the dereferenced
|
object; each time an element is written into the dereferenced
|
||||||
iterator, it is passed as a parameter to the function object.
|
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
|
* |indirect|_ (PDF__): an iterator over the objects *pointed-to* by the
|
||||||
elements of some sequence.
|
elements of some sequence.
|
||||||
|
|
||||||
@@ -167,10 +178,17 @@ __ counting_iterator.pdf
|
|||||||
.. _filter: filter_iterator.html
|
.. _filter: filter_iterator.html
|
||||||
__ filter_iterator.pdf
|
__ filter_iterator.pdf
|
||||||
|
|
||||||
.. |function| replace:: ``function_output_iterator``
|
.. |function_input| replace:: ``function_input_iterator``
|
||||||
.. _function: function_output_iterator.html
|
.. _function_input: function_input_iterator.html
|
||||||
|
__ function_input_iterator.pdf
|
||||||
|
|
||||||
|
.. |function_output| replace:: ``function_output_iterator``
|
||||||
|
.. _function_output: function_output_iterator.html
|
||||||
__ function_output_iterator.pdf
|
__ function_output_iterator.pdf
|
||||||
|
|
||||||
|
.. |generator| replace:: ``generator_iterator``
|
||||||
|
.. _generator: generator_iterator.htm
|
||||||
|
|
||||||
.. |indirect| replace:: ``indirect_iterator``
|
.. |indirect| replace:: ``indirect_iterator``
|
||||||
.. _indirect: indirect_iterator.html
|
.. _indirect: indirect_iterator.html
|
||||||
__ indirect_iterator.pdf
|
__ indirect_iterator.pdf
|
||||||
@@ -201,6 +219,23 @@ __ zip_iterator.pdf
|
|||||||
Iterator Utilities
|
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
|
Traits
|
||||||
------
|
------
|
||||||
|
|
||||||
@@ -267,7 +302,7 @@ over how your iterator works: you can add additional constructors,
|
|||||||
or even override the iterator functionality provided by the
|
or even override the iterator functionality provided by the
|
||||||
library.
|
library.
|
||||||
|
|
||||||
.. _`type generator`: ../../../more/generic_programming.html#type_generator
|
.. _`type generator`: http://www.boost.org/more/generic_programming.html#type_generator
|
||||||
|
|
||||||
If you're looking for the old ``projection_iterator`` component,
|
If you're looking for the old ``projection_iterator`` component,
|
||||||
its functionality has been merged into ``transform_iterator``: as
|
its functionality has been merged into ``transform_iterator``: as
|
||||||
|
|||||||
@@ -3,13 +3,13 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
<meta name="generator" content="Docutils 0.3.8: http://docutils.sourceforge.net/" />
|
<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
|
||||||
<title>Indirect Iterator</title>
|
<title>Indirect Iterator</title>
|
||||||
<meta name="author" content="David Abrahams, Jeremy Siek, Thomas Witt" />
|
<meta name="author" content="David Abrahams, Jeremy Siek, Thomas Witt" />
|
||||||
<meta name="organization" content="Boost Consulting, Indiana University Open Systems Lab, University of Hanover Institute for Transport Railway Operation and Construction" />
|
<meta name="organization" content="Boost Consulting, Indiana University Open Systems Lab, University of Hanover Institute for Transport Railway Operation and Construction" />
|
||||||
<meta name="date" content="2004-11-01" />
|
<meta name="date" content="2006-09-11" />
|
||||||
<meta name="copyright" content="Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003." />
|
<meta name="copyright" content="Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003." />
|
||||||
<link rel="stylesheet" href="default.css" type="text/css" />
|
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="document" id="indirect-iterator">
|
<div class="document" id="indirect-iterator">
|
||||||
@@ -21,22 +21,28 @@
|
|||||||
<tr><th class="docinfo-name">Author:</th>
|
<tr><th class="docinfo-name">Author:</th>
|
||||||
<td>David Abrahams, Jeremy Siek, Thomas Witt</td></tr>
|
<td>David Abrahams, Jeremy Siek, Thomas Witt</td></tr>
|
||||||
<tr><th class="docinfo-name">Contact:</th>
|
<tr><th class="docinfo-name">Contact:</th>
|
||||||
<td><a class="first reference" href="mailto:dave@boost-consulting.com">dave@boost-consulting.com</a>, <a class="reference" href="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</a>, <a class="last reference" href="mailto:witt@ive.uni-hannover.de">witt@ive.uni-hannover.de</a></td></tr>
|
<td><a class="first reference external" href="mailto:dave@boost-consulting.com">dave@boost-consulting.com</a>, <a class="reference external" href="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</a>, <a class="last reference external" href="mailto:witt@ive.uni-hannover.de">witt@ive.uni-hannover.de</a></td></tr>
|
||||||
<tr><th class="docinfo-name">Organization:</th>
|
<tr><th class="docinfo-name">Organization:</th>
|
||||||
<td><a class="first reference" href="http://www.boost-consulting.com">Boost Consulting</a>, Indiana University <a class="reference" href="http://www.osl.iu.edu">Open Systems
|
<td><a class="first reference external" href="http://www.boost-consulting.com">Boost Consulting</a>, Indiana University <a class="reference external" href="http://www.osl.iu.edu">Open Systems
|
||||||
Lab</a>, University of Hanover <a class="last reference" href="http://www.ive.uni-hannover.de">Institute for Transport
|
Lab</a>, University of Hanover <a class="last reference external" href="http://www.ive.uni-hannover.de">Institute for Transport
|
||||||
Railway Operation and Construction</a></td></tr>
|
Railway Operation and Construction</a></td></tr>
|
||||||
<tr><th class="docinfo-name">Date:</th>
|
<tr><th class="docinfo-name">Date:</th>
|
||||||
<td>2004-11-01</td></tr>
|
<td>2006-09-11</td></tr>
|
||||||
<tr><th class="docinfo-name">Copyright:</th>
|
<tr><th class="docinfo-name">Copyright:</th>
|
||||||
<td>Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.</td></tr>
|
<td>Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.</td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<!-- 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) -->
|
||||||
<table class="docutils field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">abstract:</th><td class="field-body"><tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> adapts an iterator by applying an
|
<tr class="field"><th class="field-name">abstract:</th><td class="field-body"><!-- Copyright David Abrahams 2006. 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) -->
|
||||||
|
<tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> adapts an iterator by applying an
|
||||||
<em>extra</em> dereference inside of <tt class="docutils literal"><span class="pre">operator*()</span></tt>. For example, this
|
<em>extra</em> dereference inside of <tt class="docutils literal"><span class="pre">operator*()</span></tt>. For example, this
|
||||||
iterator adaptor makes it possible to view a container of pointers
|
iterator adaptor makes it possible to view a container of pointers
|
||||||
(e.g. <tt class="docutils literal"><span class="pre">list<foo*></span></tt>) as if it were a container of the pointed-to type
|
(e.g. <tt class="docutils literal"><span class="pre">list<foo*></span></tt>) as if it were a container of the pointed-to type
|
||||||
@@ -48,17 +54,20 @@ not an iterator.</td>
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<div class="contents topic" id="table-of-contents">
|
<div class="contents topic" id="table-of-contents">
|
||||||
<p class="topic-title first"><a name="table-of-contents">Table of Contents</a></p>
|
<p class="topic-title first">Table of Contents</p>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><a class="reference" href="#indirect-iterator-synopsis" id="id2" name="id2"><tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> synopsis</a></li>
|
<li><a class="reference internal" href="#indirect-iterator-synopsis" id="id2"><tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> synopsis</a></li>
|
||||||
<li><a class="reference" href="#indirect-iterator-requirements" id="id3" name="id3"><tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> requirements</a></li>
|
<li><a class="reference internal" href="#indirect-iterator-requirements" id="id3"><tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> requirements</a></li>
|
||||||
<li><a class="reference" href="#indirect-iterator-models" id="id4" name="id4"><tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> models</a></li>
|
<li><a class="reference internal" href="#indirect-iterator-models" id="id4"><tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> models</a></li>
|
||||||
<li><a class="reference" href="#indirect-iterator-operations" id="id5" name="id5"><tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> operations</a></li>
|
<li><a class="reference internal" href="#indirect-iterator-operations" id="id5"><tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> operations</a></li>
|
||||||
<li><a class="reference" href="#example" id="id6" name="id6">Example</a></li>
|
<li><a class="reference internal" href="#example" id="id6">Example</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="indirect-iterator-synopsis">
|
<div class="section" id="indirect-iterator-synopsis">
|
||||||
<h1><a class="toc-backref" href="#id2" name="indirect-iterator-synopsis"><tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> synopsis</a></h1>
|
<h1><a class="toc-backref" href="#id2"><tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> synopsis</a></h1>
|
||||||
|
<!-- Copyright David Abrahams 2006. 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) -->
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
template <
|
template <
|
||||||
class Iterator
|
class Iterator
|
||||||
@@ -115,9 +124,9 @@ if (Reference is use_default) then
|
|||||||
else
|
else
|
||||||
typedef Reference reference;
|
typedef Reference reference;
|
||||||
|
|
||||||
if (Value is use_default) then
|
if (Value is use_default) then
|
||||||
typedef pointee<V>::type* pointer;
|
typedef pointee<V>::type* pointer;
|
||||||
else
|
else
|
||||||
typedef Value* pointer;
|
typedef Value* pointer;
|
||||||
|
|
||||||
if (Difference is use_default)
|
if (Difference is use_default)
|
||||||
@@ -136,7 +145,7 @@ else
|
|||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="indirect-iterator-requirements">
|
<div class="section" id="indirect-iterator-requirements">
|
||||||
<h1><a class="toc-backref" href="#id3" name="indirect-iterator-requirements"><tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> requirements</a></h1>
|
<h1><a class="toc-backref" href="#id3"><tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> requirements</a></h1>
|
||||||
<p>The expression <tt class="docutils literal"><span class="pre">*v</span></tt>, where <tt class="docutils literal"><span class="pre">v</span></tt> is an object of
|
<p>The expression <tt class="docutils literal"><span class="pre">*v</span></tt>, where <tt class="docutils literal"><span class="pre">v</span></tt> is an object of
|
||||||
<tt class="docutils literal"><span class="pre">iterator_traits<Iterator>::value_type</span></tt>, shall be valid
|
<tt class="docutils literal"><span class="pre">iterator_traits<Iterator>::value_type</span></tt>, shall be valid
|
||||||
expression and convertible to <tt class="docutils literal"><span class="pre">reference</span></tt>. <tt class="docutils literal"><span class="pre">Iterator</span></tt> shall
|
expression and convertible to <tt class="docutils literal"><span class="pre">reference</span></tt>. <tt class="docutils literal"><span class="pre">Iterator</span></tt> shall
|
||||||
@@ -150,7 +159,7 @@ parameter is not <tt class="docutils literal"><span class="pre">use_default</spa
|
|||||||
deducing the default for the <tt class="docutils literal"><span class="pre">value_type</span></tt> member.]</p>
|
deducing the default for the <tt class="docutils literal"><span class="pre">value_type</span></tt> member.]</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="indirect-iterator-models">
|
<div class="section" id="indirect-iterator-models">
|
||||||
<h1><a class="toc-backref" href="#id4" name="indirect-iterator-models"><tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> models</a></h1>
|
<h1><a class="toc-backref" href="#id4"><tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> models</a></h1>
|
||||||
<p>In addition to the concepts indicated by <tt class="docutils literal"><span class="pre">iterator_category</span></tt>
|
<p>In addition to the concepts indicated by <tt class="docutils literal"><span class="pre">iterator_category</span></tt>
|
||||||
and by <tt class="docutils literal"><span class="pre">iterator_traversal<indirect_iterator>::type</span></tt>, a
|
and by <tt class="docutils literal"><span class="pre">iterator_traversal<indirect_iterator>::type</span></tt>, a
|
||||||
specialization of <tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> models the following
|
specialization of <tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> models the following
|
||||||
@@ -171,7 +180,7 @@ expression (where <tt class="docutils literal"><span class="pre">t</span></tt> i
|
|||||||
interoperable with <tt class="docutils literal"><span class="pre">Y</span></tt>.</p>
|
interoperable with <tt class="docutils literal"><span class="pre">Y</span></tt>.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="indirect-iterator-operations">
|
<div class="section" id="indirect-iterator-operations">
|
||||||
<h1><a class="toc-backref" href="#id5" name="indirect-iterator-operations"><tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> operations</a></h1>
|
<h1><a class="toc-backref" href="#id5"><tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> operations</a></h1>
|
||||||
<p>In addition to the operations required by the concepts described
|
<p>In addition to the operations required by the concepts described
|
||||||
above, specializations of <tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> provide the
|
above, specializations of <tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> provide the
|
||||||
following operations.</p>
|
following operations.</p>
|
||||||
@@ -182,7 +191,7 @@ following operations.</p>
|
|||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">Requires:</th><td class="field-body"><tt class="docutils literal"><span class="pre">Iterator</span></tt> must be Default Constructible.</td>
|
<tr class="field"><th class="field-name">Requires:</th><td class="field-body"><tt class="docutils literal"><span class="pre">Iterator</span></tt> must be Default Constructible.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs an instance of <tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> with
|
<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs an instance of <tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> with
|
||||||
a default-constructed <tt class="docutils literal"><span class="pre">m_iterator</span></tt>.</td>
|
a default-constructed <tt class="docutils literal"><span class="pre">m_iterator</span></tt>.</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
@@ -215,7 +224,7 @@ indirect_iterator(
|
|||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">Requires:</th><td class="field-body"><tt class="docutils literal"><span class="pre">Iterator2</span></tt> is implicitly convertible to <tt class="docutils literal"><span class="pre">Iterator</span></tt>.</td>
|
<tr class="field"><th class="field-name">Requires:</th><td class="field-body"><tt class="docutils literal"><span class="pre">Iterator2</span></tt> is implicitly convertible to <tt class="docutils literal"><span class="pre">Iterator</span></tt>.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs an instance of <tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> whose
|
<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs an instance of <tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> whose
|
||||||
<tt class="docutils literal"><span class="pre">m_iterator</span></tt> subobject is constructed from <tt class="docutils literal"><span class="pre">y.base()</span></tt>.</td>
|
<tt class="docutils literal"><span class="pre">m_iterator</span></tt> subobject is constructed from <tt class="docutils literal"><span class="pre">y.base()</span></tt>.</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
@@ -260,9 +269,12 @@ indirect_iterator(
|
|||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<!-- Copyright David Abrahams 2006. 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) -->
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="example">
|
<div class="section" id="example">
|
||||||
<h1><a class="toc-backref" href="#id6" name="example">Example</a></h1>
|
<h1><a class="toc-backref" href="#id6">Example</a></h1>
|
||||||
<p>This example prints an array of characters, using
|
<p>This example prints an array of characters, using
|
||||||
<tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> to access the array of characters through an
|
<tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> to access the array of characters through an
|
||||||
array of pointers. Next <tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> is used with the
|
array of pointers. Next <tt class="docutils literal"><span class="pre">indirect_iterator</span></tt> is used with the
|
||||||
@@ -309,7 +321,7 @@ std::cout << std::endl;
|
|||||||
|
|
||||||
// Example of using make_indirect_iterator()
|
// 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),
|
boost::make_indirect_iterator(pointers_to_chars + N),
|
||||||
std::ostream_iterator<char>(std::cout, ","));
|
std::ostream_iterator<char>(std::cout, ","));
|
||||||
std::cout << std::endl;
|
std::cout << std::endl;
|
||||||
@@ -320,13 +332,14 @@ a,b,c,d,e,f,g,
|
|||||||
b,c,d,e,f,g,h,
|
b,c,d,e,f,g,h,
|
||||||
a,b,c,d,e,f,g,
|
a,b,c,d,e,f,g,
|
||||||
</pre>
|
</pre>
|
||||||
<p>The source code for this example can be found <a class="reference" href="../example/indirect_iterator_example.cpp">here</a>.</p>
|
<p>The source code for this example can be found <a class="reference external" href="../example/indirect_iterator_example.cpp">here</a>.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr class="docutils footer" />
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<a class="reference" href="indirect_iterator.rst">View document source</a>.
|
<hr class="footer" />
|
||||||
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
<a class="reference external" href="indirect_iterator.rst">View document source</a>.
|
||||||
|
Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
BIN
doc/indirect_iterator.pdf
Executable file → Normal file
BIN
doc/indirect_iterator.pdf
Executable file → Normal file
Binary file not shown.
@@ -1,3 +1,7 @@
|
|||||||
|
.. 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)
|
||||||
|
|
||||||
+++++++++++++++++++
|
+++++++++++++++++++
|
||||||
Indirect Iterator
|
Indirect Iterator
|
||||||
+++++++++++++++++++
|
+++++++++++++++++++
|
||||||
@@ -7,7 +11,6 @@
|
|||||||
:organization: `Boost Consulting`_, Indiana University `Open Systems
|
:organization: `Boost Consulting`_, Indiana University `Open Systems
|
||||||
Lab`_, University of Hanover `Institute for Transport
|
Lab`_, University of Hanover `Institute for Transport
|
||||||
Railway Operation and Construction`_
|
Railway Operation and Construction`_
|
||||||
:date: $Date$
|
|
||||||
:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
|
:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
|
||||||
|
|
||||||
.. _`Boost Consulting`: http://www.boost-consulting.com
|
.. _`Boost Consulting`: http://www.boost-consulting.com
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
.. Copyright David Abrahams 2006. 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)
|
||||||
|
|
||||||
``indirect_iterator`` adapts an iterator by applying an
|
``indirect_iterator`` adapts an iterator by applying an
|
||||||
*extra* dereference inside of ``operator*()``. For example, this
|
*extra* dereference inside of ``operator*()``. For example, this
|
||||||
iterator adaptor makes it possible to view a container of pointers
|
iterator adaptor makes it possible to view a container of pointers
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
.. Copyright David Abrahams 2006. 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)
|
||||||
|
|
||||||
Example
|
Example
|
||||||
.......
|
.......
|
||||||
|
|
||||||
|
|||||||
@@ -1,245 +0,0 @@
|
|||||||
Index: indirect_iterator_ref.rst
|
|
||||||
===================================================================
|
|
||||||
RCS file: /cvsroot/boost/boost/libs/iterator/doc/indirect_iterator_ref.rst,v
|
|
||||||
retrieving revision 1.2
|
|
||||||
retrieving revision 1.21
|
|
||||||
diff -w -d -u -b -r1.2 -r1.21
|
|
||||||
--- indirect_iterator_ref.rst 22 Sep 2003 19:55:00 -0000 1.2
|
|
||||||
+++ indirect_iterator_ref.rst 15 Jan 2004 00:01:33 -0000 1.21
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -3,82 +3,139 @@
|
|
||||||
template <
|
|
||||||
class Iterator
|
|
||||||
, class Value = use_default
|
|
||||||
|
|
||||||
Issue 9.15
|
|
||||||
|
|
||||||
- , unsigned Access = use_default_access
|
|
||||||
- , class Traversal = use_default
|
|
||||||
+ , class CategoryOrTraversal = use_default
|
|
||||||
, class Reference = use_default
|
|
||||||
, class Difference = use_default
|
|
||||||
>
|
|
||||||
class indirect_iterator
|
|
||||||
|
|
||||||
Issue 9.37x
|
|
||||||
|
|
||||||
- : public iterator_adaptor</* see discussion */>
|
|
||||||
{
|
|
||||||
- friend class iterator_core_access;
|
|
||||||
public:
|
|
||||||
+ typedef /* see below */ value_type;
|
|
||||||
+ typedef /* see below */ reference;
|
|
||||||
+ typedef /* see below */ pointer;
|
|
||||||
+ typedef /* see below */ difference_type;
|
|
||||||
+ typedef /* see below */ iterator_category;
|
|
||||||
+
|
|
||||||
indirect_iterator();
|
|
||||||
indirect_iterator(Iterator x);
|
|
||||||
+
|
|
||||||
|
|
||||||
Issue 9.15
|
|
||||||
|
|
||||||
template <
|
|
||||||
- class Iterator2, class Value2, unsigned Access2, class Traversal2
|
|
||||||
+ class Iterator2, class Value2, class Category2
|
|
||||||
, class Reference2, class Difference2
|
|
||||||
>
|
|
||||||
indirect_iterator(
|
|
||||||
indirect_iterator<
|
|
||||||
- Iterator2, Value2, Access2, Traversal2, Reference2, Difference2
|
|
||||||
+ Iterator2, Value2, Category2, Reference2, Difference2
|
|
||||||
> const& y
|
|
||||||
, typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
|
|
||||||
);
|
|
||||||
|
|
||||||
Issue 9.37x
|
|
||||||
|
|
||||||
- private: // as-if specification
|
|
||||||
- typename indirect_iterator::reference dereference() const
|
|
||||||
- {
|
|
||||||
- return **this->base();
|
|
||||||
- }
|
|
||||||
+
|
|
||||||
+ Iterator const& base() const;
|
|
||||||
+ reference operator*() const;
|
|
||||||
+ indirect_iterator& operator++();
|
|
||||||
+ indirect_iterator& operator--();
|
|
||||||
+ private:
|
|
||||||
+ Iterator m_iterator; // exposition
|
|
||||||
};
|
|
||||||
|
|
||||||
+
|
|
||||||
+The member types of ``indirect_iterator`` are defined according to
|
|
||||||
+the following pseudo-code, where ``V`` is
|
|
||||||
+``iterator_traits<Iterator>::value_type``
|
|
||||||
+
|
|
||||||
+.. parsed-literal::
|
|
||||||
+
|
|
||||||
+ if (Value is use_default) then
|
|
||||||
+ typedef remove_const<pointee<V>::type>::type value_type;
|
|
||||||
+ else
|
|
||||||
+ typedef remove_const<Value>::type value_type;
|
|
||||||
+
|
|
||||||
+ if (Reference is use_default) then
|
|
||||||
+ if (Value is use_default) then
|
|
||||||
+ typedef indirect_reference<V>::type reference;
|
|
||||||
+ else
|
|
||||||
+ typedef Value& reference;
|
|
||||||
+ else
|
|
||||||
+ typedef Reference reference;
|
|
||||||
+
|
|
||||||
+ if (Value is use_default) then
|
|
||||||
+ typedef pointee<V>::type\* pointer;
|
|
||||||
+ else
|
|
||||||
+ typedef Value\* pointer;
|
|
||||||
+
|
|
||||||
+ if (Difference is use_default)
|
|
||||||
+ typedef iterator_traits<Iterator>::difference_type difference_type;
|
|
||||||
+ else
|
|
||||||
+ typedef Difference difference_type;
|
|
||||||
+
|
|
||||||
+ if (CategoryOrTraversal is use_default)
|
|
||||||
+ typedef |iterator-category|_\ (
|
|
||||||
+ iterator_traversal<Iterator>::type,``reference``,``value_type``
|
|
||||||
+ ) iterator_category;
|
|
||||||
+ else
|
|
||||||
+ typedef |iterator-category|_\ (
|
|
||||||
+ CategoryOrTraversal,``reference``,``value_type``
|
|
||||||
+ ) iterator_category;
|
|
||||||
+
|
|
||||||
+
|
|
||||||
|
|
||||||
``indirect_iterator`` requirements
|
|
||||||
..................................
|
|
||||||
|
|
||||||
Issue 9.40x
|
|
||||||
|
|
||||||
-The ``value_type`` of the ``Iterator`` template parameter should
|
|
||||||
-itself be dereferenceable. The return type of the ``operator*`` for
|
|
||||||
-the ``value_type`` must be the same type as the ``Reference`` template
|
|
||||||
-parameter. The ``Value`` template parameter will be the ``value_type``
|
|
||||||
-for the ``indirect_iterator``, unless ``Value`` is const. If ``Value``
|
|
||||||
-is ``const X``, then ``value_type`` will be *non-* ``const X``. The
|
|
||||||
-default for ``Value`` is
|
|
||||||
+The expression ``*v``, where ``v`` is an object of
|
|
||||||
+``iterator_traits<Iterator>::value_type``, shall be valid
|
|
||||||
+expression and convertible to ``reference``. ``Iterator`` shall
|
|
||||||
+model the traversal concept indicated by ``iterator_category``.
|
|
||||||
+``Value``, ``Reference``, and ``Difference`` shall be chosen so
|
|
||||||
+that ``value_type``, ``reference``, and ``difference_type`` meet
|
|
||||||
+the requirements indicated by ``iterator_category``.
|
|
||||||
|
|
||||||
-::
|
|
||||||
+[Note: there are further requirements on the
|
|
||||||
+``iterator_traits<Iterator>::value_type`` if the ``Value``
|
|
||||||
+parameter is not ``use_default``, as implied by the algorithm for
|
|
||||||
+deducing the default for the ``value_type`` member.]
|
|
||||||
|
|
||||||
- iterator_traits< iterator_traits<Iterator>::value_type >::value_type
|
|
||||||
|
|
||||||
Issue 9.37x
|
|
||||||
|
|
||||||
+``indirect_iterator`` models
|
|
||||||
+............................
|
|
||||||
|
|
||||||
-If the default is used for ``Value``, then there must be a valid
|
|
||||||
-specialization of ``iterator_traits`` for the value type of the base
|
|
||||||
-iterator.
|
|
||||||
+In addition to the concepts indicated by ``iterator_category``
|
|
||||||
+and by ``iterator_traversal<indirect_iterator>::type``, a
|
|
||||||
+specialization of ``indirect_iterator`` models the following
|
|
||||||
+concepts, Where ``v`` is an object of
|
|
||||||
+``iterator_traits<Iterator>::value_type``:
|
|
||||||
|
|
||||||
-The ``Reference`` parameter will be the ``reference`` type of the
|
|
||||||
-``indirect_iterator``. The default is ``Value&``.
|
|
||||||
+ * Readable Iterator if ``reference(*v)`` is convertible to
|
|
||||||
+ ``value_type``.
|
|
||||||
|
|
||||||
-The ``Access`` and ``Traversal`` parameters are passed unchanged to
|
|
||||||
-the corresponding parameters of the ``iterator_adaptor`` base
|
|
||||||
-class, and the ``Iterator`` parameter is passed unchanged as the
|
|
||||||
-``Base`` parameter to the ``iterator_adaptor`` base class.
|
|
||||||
+ * Writable Iterator if ``reference(*v) = t`` is a valid
|
|
||||||
+ expression (where ``t`` is an object of type
|
|
||||||
+ ``indirect_iterator::value_type``)
|
|
||||||
|
|
||||||
-The indirect iterator will model the most refined standard traversal
|
|
||||||
-concept that is modeled by the ``Iterator`` type. The indirect
|
|
||||||
-iterator will model the most refined standard access concept that is
|
|
||||||
-modeled by the value type of ``Iterator``.
|
|
||||||
+ * Lvalue Iterator if ``reference`` is a reference type.
|
|
||||||
+
|
|
||||||
+``indirect_iterator<X,V1,C1,R1,D1>`` is interoperable with
|
|
||||||
+``indirect_iterator<Y,V2,C2,R2,D2>`` if and only if ``X`` is
|
|
||||||
+interoperable with ``Y``.
|
|
||||||
|
|
||||||
|
|
||||||
``indirect_iterator`` operations
|
|
||||||
................................
|
|
||||||
|
|
||||||
Issue 9.37x
|
|
||||||
|
|
||||||
+In addition to the operations required by the concepts described
|
|
||||||
+above, specializations of ``indirect_iterator`` provide the
|
|
||||||
+following operations.
|
|
||||||
+
|
|
||||||
+
|
|
||||||
|
|
||||||
Issue 9.28 and 9.37x
|
|
||||||
|
|
||||||
``indirect_iterator();``
|
|
||||||
|
|
||||||
:Requires: ``Iterator`` must be Default Constructible.
|
|
||||||
:Returns: An instance of ``indirect_iterator`` with
|
|
||||||
- a default constructed base object.
|
|
||||||
+ a default-constructed ``m_iterator``.
|
|
||||||
|
|
||||||
|
|
||||||
Issue 9.37x
|
|
||||||
|
|
||||||
``indirect_iterator(Iterator x);``
|
|
||||||
|
|
||||||
:Returns: An instance of ``indirect_iterator`` with
|
|
||||||
- the ``iterator_adaptor`` subobject copy constructed from ``x``.
|
|
||||||
+ ``m_iterator`` copy constructed from ``x``.
|
|
||||||
|
|
||||||
::
|
|
||||||
|
|
||||||
|
|
||||||
Issue 9.29
|
|
||||||
|
|
||||||
@@ -94,5 +151,27 @@
|
|
||||||
);
|
|
||||||
|
|
||||||
:Requires: ``Iterator2`` is implicitly convertible to ``Iterator``.
|
|
||||||
-:Returns: An instance of ``indirect_iterator`` that is a copy of ``y``.
|
|
||||||
+:Returns: An instance of ``indirect_iterator`` whose
|
|
||||||
+ ``m_iterator`` subobject is constructed from ``y.base()``.
|
|
||||||
+
|
|
||||||
|
|
||||||
Issue 9.37x
|
|
||||||
|
|
||||||
+``Iterator const& base() const;``
|
|
||||||
|
|
||||||
+:Returns: ``m_iterator``
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+``reference operator*() const;``
|
|
||||||
+
|
|
||||||
+:Returns: ``**m_iterator``
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+``indirect_iterator& operator++();``
|
|
||||||
+
|
|
||||||
+:Effects: ``++m_iterator``
|
|
||||||
+:Returns: ``*this``
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+``indirect_iterator& operator--();``
|
|
||||||
+
|
|
||||||
+:Effects: ``--m_iterator``
|
|
||||||
+:Returns: ``*this``
|
|
||||||
@@ -1,220 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" ?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<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.3.6: http://docutils.sourceforge.net/" />
|
|
||||||
<title></title>
|
|
||||||
<link rel="stylesheet" href="default.css" type="text/css" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="document">
|
|
||||||
<pre class="literal-block">
|
|
||||||
template <
|
|
||||||
class Iterator
|
|
||||||
, class Value = use_default
|
|
||||||
, class CategoryOrTraversal = use_default
|
|
||||||
, class Reference = use_default
|
|
||||||
, class Difference = use_default
|
|
||||||
>
|
|
||||||
class indirect_iterator
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
typedef /* see below */ value_type;
|
|
||||||
typedef /* see below */ reference;
|
|
||||||
typedef /* see below */ pointer;
|
|
||||||
typedef /* see below */ difference_type;
|
|
||||||
typedef /* see below */ iterator_category;
|
|
||||||
|
|
||||||
indirect_iterator();
|
|
||||||
indirect_iterator(Iterator x);
|
|
||||||
|
|
||||||
template <
|
|
||||||
class Iterator2, class Value2, class Category2
|
|
||||||
, class Reference2, class Difference2
|
|
||||||
>
|
|
||||||
indirect_iterator(
|
|
||||||
indirect_iterator<
|
|
||||||
Iterator2, Value2, Category2, Reference2, Difference2
|
|
||||||
> const& y
|
|
||||||
, typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
|
|
||||||
);
|
|
||||||
|
|
||||||
Iterator const& base() const;
|
|
||||||
reference operator*() const;
|
|
||||||
indirect_iterator& operator++();
|
|
||||||
indirect_iterator& operator--();
|
|
||||||
private:
|
|
||||||
Iterator m_iterator; // exposition
|
|
||||||
};
|
|
||||||
</pre>
|
|
||||||
<p>The member types of <tt class="literal"><span class="pre">indirect_iterator</span></tt> are defined according to
|
|
||||||
the following pseudo-code, where <tt class="literal"><span class="pre">V</span></tt> is
|
|
||||||
<tt class="literal"><span class="pre">iterator_traits<Iterator>::value_type</span></tt></p>
|
|
||||||
<pre class="literal-block">
|
|
||||||
if (Value is use_default) then
|
|
||||||
typedef remove_const<pointee<V>::type>::type value_type;
|
|
||||||
else
|
|
||||||
typedef remove_const<Value>::type value_type;
|
|
||||||
|
|
||||||
if (Reference is use_default) then
|
|
||||||
if (Value is use_default) then
|
|
||||||
typedef indirect_reference<V>::type reference;
|
|
||||||
else
|
|
||||||
typedef Value& reference;
|
|
||||||
else
|
|
||||||
typedef Reference reference;
|
|
||||||
|
|
||||||
if (Value is use_default) then
|
|
||||||
typedef pointee<V>::type* pointer;
|
|
||||||
else
|
|
||||||
typedef Value* pointer;
|
|
||||||
|
|
||||||
if (Difference is use_default)
|
|
||||||
typedef iterator_traits<Iterator>::difference_type difference_type;
|
|
||||||
else
|
|
||||||
typedef Difference difference_type;
|
|
||||||
|
|
||||||
if (CategoryOrTraversal is use_default)
|
|
||||||
typedef <em>iterator-category</em> (
|
|
||||||
iterator_traversal<Iterator>::type,``reference``,``value_type``
|
|
||||||
) iterator_category;
|
|
||||||
else
|
|
||||||
typedef <em>iterator-category</em> (
|
|
||||||
CategoryOrTraversal,``reference``,``value_type``
|
|
||||||
) iterator_category;
|
|
||||||
</pre>
|
|
||||||
<div class="section" id="indirect-iterator-requirements">
|
|
||||||
<h1><a name="indirect-iterator-requirements"><tt class="literal"><span class="pre">indirect_iterator</span></tt> requirements</a></h1>
|
|
||||||
<p>The expression <tt class="literal"><span class="pre">*v</span></tt>, where <tt class="literal"><span class="pre">v</span></tt> is an object of
|
|
||||||
<tt class="literal"><span class="pre">iterator_traits<Iterator>::value_type</span></tt>, shall be valid
|
|
||||||
expression and convertible to <tt class="literal"><span class="pre">reference</span></tt>. <tt class="literal"><span class="pre">Iterator</span></tt> shall
|
|
||||||
model the traversal concept indicated by <tt class="literal"><span class="pre">iterator_category</span></tt>.
|
|
||||||
<tt class="literal"><span class="pre">Value</span></tt>, <tt class="literal"><span class="pre">Reference</span></tt>, and <tt class="literal"><span class="pre">Difference</span></tt> shall be chosen so
|
|
||||||
that <tt class="literal"><span class="pre">value_type</span></tt>, <tt class="literal"><span class="pre">reference</span></tt>, and <tt class="literal"><span class="pre">difference_type</span></tt> meet
|
|
||||||
the requirements indicated by <tt class="literal"><span class="pre">iterator_category</span></tt>.</p>
|
|
||||||
<p>[Note: there are further requirements on the
|
|
||||||
<tt class="literal"><span class="pre">iterator_traits<Iterator>::value_type</span></tt> if the <tt class="literal"><span class="pre">Value</span></tt>
|
|
||||||
parameter is not <tt class="literal"><span class="pre">use_default</span></tt>, as implied by the algorithm for
|
|
||||||
deducing the default for the <tt class="literal"><span class="pre">value_type</span></tt> member.]</p>
|
|
||||||
</div>
|
|
||||||
<div class="section" id="indirect-iterator-models">
|
|
||||||
<h1><a name="indirect-iterator-models"><tt class="literal"><span class="pre">indirect_iterator</span></tt> models</a></h1>
|
|
||||||
<p>In addition to the concepts indicated by <tt class="literal"><span class="pre">iterator_category</span></tt>
|
|
||||||
and by <tt class="literal"><span class="pre">iterator_traversal<indirect_iterator>::type</span></tt>, a
|
|
||||||
specialization of <tt class="literal"><span class="pre">indirect_iterator</span></tt> models the following
|
|
||||||
concepts, Where <tt class="literal"><span class="pre">v</span></tt> is an object of
|
|
||||||
<tt class="literal"><span class="pre">iterator_traits<Iterator>::value_type</span></tt>:</p>
|
|
||||||
<blockquote>
|
|
||||||
<ul class="simple">
|
|
||||||
<li>Readable Iterator if <tt class="literal"><span class="pre">reference(*v)</span></tt> is convertible to
|
|
||||||
<tt class="literal"><span class="pre">value_type</span></tt>.</li>
|
|
||||||
<li>Writable Iterator if <tt class="literal"><span class="pre">reference(*v)</span> <span class="pre">=</span> <span class="pre">t</span></tt> is a valid
|
|
||||||
expression (where <tt class="literal"><span class="pre">t</span></tt> is an object of type
|
|
||||||
<tt class="literal"><span class="pre">indirect_iterator::value_type</span></tt>)</li>
|
|
||||||
<li>Lvalue Iterator if <tt class="literal"><span class="pre">reference</span></tt> is a reference type.</li>
|
|
||||||
</ul>
|
|
||||||
</blockquote>
|
|
||||||
<p><tt class="literal"><span class="pre">indirect_iterator<X,V1,C1,R1,D1></span></tt> is interoperable with
|
|
||||||
<tt class="literal"><span class="pre">indirect_iterator<Y,V2,C2,R2,D2></span></tt> if and only if <tt class="literal"><span class="pre">X</span></tt> is
|
|
||||||
interoperable with <tt class="literal"><span class="pre">Y</span></tt>.</p>
|
|
||||||
</div>
|
|
||||||
<div class="section" id="indirect-iterator-operations">
|
|
||||||
<h1><a name="indirect-iterator-operations"><tt class="literal"><span class="pre">indirect_iterator</span></tt> operations</a></h1>
|
|
||||||
<p>In addition to the operations required by the concepts described
|
|
||||||
above, specializations of <tt class="literal"><span class="pre">indirect_iterator</span></tt> provide the
|
|
||||||
following operations.</p>
|
|
||||||
<p><tt class="literal"><span class="pre">indirect_iterator();</span></tt></p>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Requires:</th><td class="field-body"><tt class="literal"><span class="pre">Iterator</span></tt> must be Default Constructible.</td>
|
|
||||||
</tr>
|
|
||||||
<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs an instance of <tt class="literal"><span class="pre">indirect_iterator</span></tt> with
|
|
||||||
a default-constructed <tt class="literal"><span class="pre">m_iterator</span></tt>.</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<p><tt class="literal"><span class="pre">indirect_iterator(Iterator</span> <span class="pre">x);</span></tt></p>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs an instance of <tt class="literal"><span class="pre">indirect_iterator</span></tt> with
|
|
||||||
<tt class="literal"><span class="pre">m_iterator</span></tt> copy constructed from <tt class="literal"><span class="pre">x</span></tt>.</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<pre class="literal-block">
|
|
||||||
template <
|
|
||||||
class Iterator2, class Value2, unsigned Access, class Traversal
|
|
||||||
, class Reference2, class Difference2
|
|
||||||
>
|
|
||||||
indirect_iterator(
|
|
||||||
indirect_iterator<
|
|
||||||
Iterator2, Value2, Access, Traversal, Reference2, Difference2
|
|
||||||
> const& y
|
|
||||||
, typename enable_if_convertible<Iterator2, Iterator>::type* = 0 // exposition
|
|
||||||
);
|
|
||||||
</pre>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Requires:</th><td class="field-body"><tt class="literal"><span class="pre">Iterator2</span></tt> is implicitly convertible to <tt class="literal"><span class="pre">Iterator</span></tt>.</td>
|
|
||||||
</tr>
|
|
||||||
<tr class="field"><th class="field-name">Effects:</th><td class="field-body">Constructs an instance of <tt class="literal"><span class="pre">indirect_iterator</span></tt> whose
|
|
||||||
<tt class="literal"><span class="pre">m_iterator</span></tt> subobject is constructed from <tt class="literal"><span class="pre">y.base()</span></tt>.</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<p><tt class="literal"><span class="pre">Iterator</span> <span class="pre">const&</span> <span class="pre">base()</span> <span class="pre">const;</span></tt></p>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">m_iterator</span></tt></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<p><tt class="literal"><span class="pre">reference</span> <span class="pre">operator*()</span> <span class="pre">const;</span></tt></p>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">**m_iterator</span></tt></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<p><tt class="literal"><span class="pre">indirect_iterator&</span> <span class="pre">operator++();</span></tt></p>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Effects:</th><td class="field-body"><tt class="literal"><span class="pre">++m_iterator</span></tt></td>
|
|
||||||
</tr>
|
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">*this</span></tt></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<p><tt class="literal"><span class="pre">indirect_iterator&</span> <span class="pre">operator--();</span></tt></p>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Effects:</th><td class="field-body"><tt class="literal"><span class="pre">--m_iterator</span></tt></td>
|
|
||||||
</tr>
|
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">*this</span></tt></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<hr class="footer" />
|
|
||||||
<div class="footer">
|
|
||||||
<a class="reference" href="indirect_iterator_ref.rst">View document source</a>.
|
|
||||||
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,3 +1,7 @@
|
|||||||
|
.. Copyright David Abrahams 2006. 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)
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
template <
|
template <
|
||||||
|
|||||||
0
doc/indirect_reference_ref.rst
Executable file → Normal file
0
doc/indirect_reference_ref.rst
Executable file → Normal file
287
doc/interoperability-revisited.rst
Executable file → Normal file
287
doc/interoperability-revisited.rst
Executable file → Normal file
@@ -2,9 +2,11 @@
|
|||||||
Interoperability Revisited
|
Interoperability Revisited
|
||||||
++++++++++++++++++++++++++++
|
++++++++++++++++++++++++++++
|
||||||
|
|
||||||
:date: $Date$
|
|
||||||
:copyright: Copyright Thomas Witt 2004.
|
:copyright: Copyright Thomas Witt 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)
|
||||||
|
|
||||||
Problem
|
Problem
|
||||||
=======
|
=======
|
||||||
@@ -15,86 +17,87 @@ implement interoperable iterators.
|
|||||||
In the following text a simplified example of the current iterator_facade specification is used to
|
In the following text a simplified example of the current iterator_facade specification is used to
|
||||||
illustrate the problem.
|
illustrate the problem.
|
||||||
|
|
||||||
In the current specification binary operators are implemented in the following way:
|
In the current specification binary operators are implemented in the following way::
|
||||||
|
|
||||||
template <class Derived>
|
template <class Derived>
|
||||||
struct Facade
|
struct Facade
|
||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class T1, T2>
|
template <class T1, T2>
|
||||||
struct is_interoperable :
|
struct is_interoperable :
|
||||||
or_<
|
or_<
|
||||||
is_convertible<T1, T2>
|
is_convertible<T1, T2>
|
||||||
, is_convertible<T2, T1>
|
, is_convertible<T2, T1>
|
||||||
>
|
>
|
||||||
{};
|
{};
|
||||||
|
|
||||||
template<
|
template<
|
||||||
class Derived1
|
class Derived1
|
||||||
, class Derived2
|
, class Derived2
|
||||||
>
|
>
|
||||||
enable_if<is_interoperable<Derived1, Derived2>, bool> operator==(
|
enable_if<is_interoperable<Derived1, Derived2>, bool> operator==(
|
||||||
Derived1 const& lhs
|
Derived1 const& lhs
|
||||||
, Derived2 const& rhs
|
, Derived2 const& rhs
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return static_cast<Derived1 const&>(lhs).equal_to(static_cast<Derived2 const&(rhs));
|
return static_cast<Derived1 const&>(lhs).equal_to(static_cast<Derived2 const&(rhs));
|
||||||
}
|
}
|
||||||
|
|
||||||
The problem with this is that operator== always forwards to Derived1::equal_to. The net effect is that the
|
The problem with this is that operator== always forwards to Derived1::equal_to. The net effect is that the
|
||||||
following "obvious" implementation of to interoperable types does not quite work.
|
following "obvious" implementation of to interoperable types does
|
||||||
|
not quite work. ::
|
||||||
|
|
||||||
struct Mutable : Facade<Mutable>
|
struct Mutable : Facade<Mutable>
|
||||||
{
|
{
|
||||||
bool equal_to(Mutable const&);
|
bool equal_to(Mutable const&);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Constant : Facade<Constant>
|
struct Constant : Facade<Constant>
|
||||||
{
|
{
|
||||||
Constant();
|
Constant();
|
||||||
Constant(Constant const&);
|
Constant(Constant const&);
|
||||||
Constant(Mutable const&);
|
Constant(Mutable const&);
|
||||||
|
|
||||||
...
|
|
||||||
|
|
||||||
bool equal_to(Constant const&);
|
...
|
||||||
};
|
|
||||||
|
|
||||||
Constant c;
|
bool equal_to(Constant const&);
|
||||||
Mutable m;
|
};
|
||||||
|
|
||||||
c == m; // ok, dispatched to Constant::equal_to
|
Constant c;
|
||||||
m == c; // !! error, dispatched to Mutable::equal_to
|
Mutable m;
|
||||||
|
|
||||||
Instead the following "slightly" more complicated implementation is necessary
|
c == m; // ok, dispatched to Constant::equal_to
|
||||||
|
m == c; // !! error, dispatched to Mutable::equal_to
|
||||||
|
|
||||||
struct Mutable : Facade<Mutable>
|
Instead the following "slightly" more complicated implementation is necessary
|
||||||
{
|
|
||||||
template <class T>
|
|
||||||
enable_if<is_convertible<Mutable, T> || is_convertible<T, Mutable>, bool>::type equal_to(T const&);
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Constant : Tag<Constant>
|
struct Mutable : Facade<Mutable>
|
||||||
{
|
{
|
||||||
Constant();
|
template <class T>
|
||||||
Constant(Constant const&);
|
enable_if<is_convertible<Mutable, T> || is_convertible<T, Mutable>, bool>::type equal_to(T const&);
|
||||||
Constant(Mutable const&);
|
};
|
||||||
|
|
||||||
template <class T>
|
struct Constant : Tag<Constant>
|
||||||
enable_if<is_convertible<Constant, T> || is_convertible<T, Constant>, bool>::type equal_to(T const&);
|
{
|
||||||
};
|
Constant();
|
||||||
|
Constant(Constant const&);
|
||||||
|
Constant(Mutable const&);
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
enable_if<is_convertible<Constant, T> || is_convertible<T, Constant>, bool>::type equal_to(T const&);
|
||||||
|
};
|
||||||
|
|
||||||
Beside the fact that the code is significantly more complex to understand and to teach there is
|
Beside the fact that the code is significantly more complex to understand and to teach there is
|
||||||
a major design problem lurking here. Note that in both types equal_to is a function template with
|
a major design problem lurking here. Note that in both types equal_to is a function template with
|
||||||
an unconstrained argument T. This is necessary so that further types can be made interoperable with
|
an unconstrained argument T. This is necessary so that further types can be made interoperable with
|
||||||
Mutable or Constant. Would Mutable be defined as
|
Mutable or Constant. Would Mutable be defined as ::
|
||||||
|
|
||||||
struct Mutable : Facade<Mutable>
|
struct Mutable : Facade<Mutable>
|
||||||
{
|
{
|
||||||
bool equal_to(Mutable const&);
|
bool equal_to(Mutable const&);
|
||||||
bool equal_to(Constant const&);
|
bool equal_to(Constant const&);
|
||||||
};
|
};
|
||||||
|
|
||||||
Constant and Mutable would still be interoperable but no further interoperable could be added
|
Constant and Mutable would still be interoperable but no further interoperable could be added
|
||||||
without changing Mutable. Even if this would be considered acceptable the current specification forces
|
without changing Mutable. Even if this would be considered acceptable the current specification forces
|
||||||
@@ -108,44 +111,45 @@ The two way dependency can be avoided by enabling type conversion in the binary
|
|||||||
implementation. Note that this is the usual way interoperability betwween types is achieved
|
implementation. Note that this is the usual way interoperability betwween types is achieved
|
||||||
for binary operators and one reason why binary operators are usually implemented as non-members.
|
for binary operators and one reason why binary operators are usually implemented as non-members.
|
||||||
|
|
||||||
A simple implementation of this strategy would look like this
|
A simple implementation of this strategy would look like this ::
|
||||||
|
|
||||||
template<
|
template<
|
||||||
class T1
|
class T1
|
||||||
, class T2
|
, class T2
|
||||||
>
|
>
|
||||||
struct interoperable_base :
|
struct interoperable_base :
|
||||||
if_<
|
if_<
|
||||||
is_convertible<
|
is_convertible<
|
||||||
T2
|
T2
|
||||||
, T1
|
, T1
|
||||||
>
|
>
|
||||||
, T1
|
, T1
|
||||||
, T2>
|
, T2>
|
||||||
{};
|
{};
|
||||||
|
|
||||||
|
|
||||||
template<
|
template<
|
||||||
class Derived1
|
class Derived1
|
||||||
, class Derived2
|
, class Derived2
|
||||||
>
|
>
|
||||||
enable_if<is_interoperable<Derived1, Derived2>, bool> operator==(
|
enable_if<is_interoperable<Derived1, Derived2>, bool> operator==(
|
||||||
Derived1 const& lhs
|
Derived1 const& lhs
|
||||||
, Derived2 const& rhs
|
, Derived2 const& rhs
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
typedef interoperable_base<
|
typedef interoperable_base<
|
||||||
Derived1
|
Derived1
|
||||||
, Derived2
|
, Derived2
|
||||||
>::type Base;
|
>::type Base;
|
||||||
|
|
||||||
return static_cast<Base const&>(lhs).equal_to(static_cast<Derived2 const&(rhs));
|
return static_cast<Base const&>(lhs).equal_to(static_cast<Derived2 const&(rhs));
|
||||||
}
|
}
|
||||||
|
|
||||||
This way our original simple and "obvious" implementation would work again.
|
This way our original simple and "obvious" implementation would
|
||||||
|
work again. ::
|
||||||
|
|
||||||
c == m; // ok, dispatched to Constant::equal_to
|
c == m; // ok, dispatched to Constant::equal_to
|
||||||
m == c; // ok, dispatched to Constant::equal_to, m converted to Constant
|
m == c; // ok, dispatched to Constant::equal_to, m converted to Constant
|
||||||
|
|
||||||
The backdraw of this approach is that a possibly costly conversion of iterator objects
|
The backdraw of this approach is that a possibly costly conversion of iterator objects
|
||||||
is forced on the user even in cases where direct comparison could be implemented
|
is forced on the user even in cases where direct comparison could be implemented
|
||||||
@@ -155,70 +159,71 @@ that iteration is a very basic operation this possible performance degradation i
|
|||||||
acceptable.
|
acceptable.
|
||||||
|
|
||||||
Luckily whe can have our cake and eat it by a slightly more clever implementation of the binary
|
Luckily whe can have our cake and eat it by a slightly more clever implementation of the binary
|
||||||
operators.
|
operators. ::
|
||||||
|
|
||||||
template<
|
template<
|
||||||
class Derived1
|
class Derived1
|
||||||
, class Derived2
|
, class Derived2
|
||||||
>
|
>
|
||||||
enable_if<is_convertible<Derived2, Derived1>, bool> operator==(
|
enable_if<is_convertible<Derived2, Derived1>, bool> operator==(
|
||||||
Derived1 const& lhs
|
Derived1 const& lhs
|
||||||
, Derived2 const& rhs
|
, Derived2 const& rhs
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return static_cast<Derived1 const&>(lhs).equal_to(static_cast<Derived2 const&(rhs));
|
return static_cast<Derived1 const&>(lhs).equal_to(static_cast<Derived2 const&(rhs));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<
|
template<
|
||||||
class Derived1
|
class Derived1
|
||||||
, class Derived2
|
, class Derived2
|
||||||
>
|
>
|
||||||
enable_if<is_convertible<Derived1, Derived2>, bool> operator==(
|
enable_if<is_convertible<Derived1, Derived2>, bool> operator==(
|
||||||
Derived1 const& lhs
|
Derived1 const& lhs
|
||||||
, Derived2 const& rhs
|
, Derived2 const& rhs
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return static_cast<Derived2 const&>(rhs).equal_to(static_cast<Derived1 const&(lhs));
|
return static_cast<Derived2 const&>(rhs).equal_to(static_cast<Derived1 const&(lhs));
|
||||||
}
|
}
|
||||||
|
|
||||||
Given our simple and obvious definition of Mutable and Constant nothing has changed yet.
|
Given our simple and obvious definition of Mutable and Constant nothing has changed yet. ::
|
||||||
|
|
||||||
c == m; // ok, dispatched to Constant::equal_to, m converted to Constant
|
c == m; // ok, dispatched to Constant::equal_to, m converted to Constant
|
||||||
m == c; // ok, dispatched to Constant::equal_to, m converted to Constant
|
m == c; // ok, dispatched to Constant::equal_to, m converted to Constant
|
||||||
|
|
||||||
But now the user can avoid the type conversion by supplying the appropriate overload in Constant
|
But now the user can avoid the type conversion by supplying the
|
||||||
|
appropriate overload in Constant ::
|
||||||
|
|
||||||
struct Constant : Facade<Constant>
|
struct Constant : Facade<Constant>
|
||||||
{
|
{
|
||||||
Constant();
|
Constant();
|
||||||
Constant(Constant const&);
|
Constant(Constant const&);
|
||||||
Constant(Mutable const&);
|
Constant(Mutable const&);
|
||||||
|
|
||||||
...
|
|
||||||
|
|
||||||
bool equal_to(Constant const&);
|
...
|
||||||
bool equal_to(Mutable const&);
|
|
||||||
};
|
|
||||||
|
|
||||||
c == m; // ok, dispatched to Constant::equal_to(Mutable const&), no conversion
|
bool equal_to(Constant const&);
|
||||||
m == c; // ok, dispatched to Constant::equal_to(Mutable const&), no conversion
|
bool equal_to(Mutable const&);
|
||||||
|
};
|
||||||
|
|
||||||
|
c == m; // ok, dispatched to Constant::equal_to(Mutable const&), no conversion
|
||||||
|
m == c; // ok, dispatched to Constant::equal_to(Mutable const&), no conversion
|
||||||
|
|
||||||
This definition of operator== introduces a possible ambiguity when both types are convertible
|
This definition of operator== introduces a possible ambiguity when both types are convertible
|
||||||
to each other. I don't think this is a problem as this behaviour is the same with concrete types.
|
to each other. I don't think this is a problem as this behaviour is the same with concrete types.
|
||||||
I.e.
|
I.e. ::
|
||||||
|
|
||||||
struct A {};
|
struct A {};
|
||||||
|
|
||||||
bool operator==(A, A);
|
bool operator==(A, A);
|
||||||
|
|
||||||
struct B { B(A); };
|
struct B { B(A); };
|
||||||
|
|
||||||
bool operator==(B, B);
|
bool operator==(B, B);
|
||||||
|
|
||||||
A a;
|
A a;
|
||||||
B b(a);
|
B b(a);
|
||||||
|
|
||||||
a == b; // error, ambiguous overload
|
a == b; // error, ambiguous overload
|
||||||
|
|
||||||
Effect
|
Effect
|
||||||
======
|
======
|
||||||
|
|||||||
170
doc/issues.html
170
doc/issues.html
@@ -1,170 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" ?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<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.3.6: http://docutils.sourceforge.net/" />
|
|
||||||
<title>Problem with is_writable and is_swappable in N1550</title>
|
|
||||||
<link rel="stylesheet" href="default.css" type="text/css" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<h1 class="title">Problem with <tt class="literal"><span class="pre">is_writable</span></tt> and <tt class="literal"><span class="pre">is_swappable</span></tt> in <a class="reference" href="http://www.boost-consulting.com/writing/n1550.html">N1550</a></h1>
|
|
||||||
<div class="document" id="problem-with-is-writable-and-is-swappable-in-n1550">
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Author:</th><td class="field-body">David Abrahams and Jeremy Siek</td>
|
|
||||||
</tr>
|
|
||||||
<tr class="field"><th class="field-name">Contact:</th><td class="field-body"><a class="reference" href="mailto:dave@boost-consulting.com">dave@boost-consulting.com</a>, <a class="reference" href="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</a></td>
|
|
||||||
</tr>
|
|
||||||
<tr class="field"><th class="field-name">Organization:</th><td class="field-body"><a class="reference" href="http://www.boost-consulting.com">Boost Consulting</a>, Indiana University Bloomington</td>
|
|
||||||
</tr>
|
|
||||||
<tr class="field"><th class="field-name">date:</th><td class="field-body">$Date$</td>
|
|
||||||
</tr>
|
|
||||||
<tr class="field"><th class="field-name">Copyright:</th><td class="field-body">Copyright David Abrahams, Jeremy Siek 2003. Use, modification and
|
|
||||||
distribution is subject to the Boost Software License,
|
|
||||||
Version 1.0. (See accompanying file LICENSE_1_0.txt or copy
|
|
||||||
at <a class="reference" href="http://www.boost.org/LICENSE_1_0.txt">http://www.boost.org/LICENSE_1_0.txt</a>)</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<div class="contents topic" id="table-of-contents">
|
|
||||||
<p class="topic-title first"><a name="table-of-contents">Table of Contents</a></p>
|
|
||||||
<ul class="simple">
|
|
||||||
<li><a class="reference" href="#introduction" id="id1" name="id1">Introduction</a></li>
|
|
||||||
<li><a class="reference" href="#proposed-resolution" id="id2" name="id2">Proposed Resolution</a></li>
|
|
||||||
<li><a class="reference" href="#rationale" id="id3" name="id3">Rationale</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div class="section" id="introduction">
|
|
||||||
<h1><a class="toc-backref" href="#id1" name="introduction">Introduction</a></h1>
|
|
||||||
<p>The <tt class="literal"><span class="pre">is_writable</span></tt> and <tt class="literal"><span class="pre">is_swappable</span></tt> traits classes in <a class="reference" href="http://www.boost-consulting.com/writing/n1550.html">N1550</a>
|
|
||||||
provide a mechanism for determining at compile time if an iterator
|
|
||||||
type is a model of the new Writable Iterator and Swappable Iterator
|
|
||||||
concepts, analogous to <tt class="literal"><span class="pre">iterator_traits<X>::iterator_category</span></tt>
|
|
||||||
for the old iterator concepts. For backward compatibility,
|
|
||||||
<tt class="literal"><span class="pre">is_writable</span></tt> and <tt class="literal"><span class="pre">is_swappable</span></tt> not only work with new
|
|
||||||
iterators, but they also are intended to work for old
|
|
||||||
iterators (iterators that meet the requirements for one of the
|
|
||||||
iterator concepts in the current standard). In the case of old
|
|
||||||
iterators, the writability and swapability is deduced based on the
|
|
||||||
<tt class="literal"><span class="pre">iterator_category</span></tt> and also the <tt class="literal"><span class="pre">reference</span></tt> type. The
|
|
||||||
specification for this deduction gives false positives for forward
|
|
||||||
iterators that have non-assignable value types.</p>
|
|
||||||
<p>To review, the part of the <tt class="literal"><span class="pre">is_writable</span></tt> trait definition which
|
|
||||||
applies to old iterators is:</p>
|
|
||||||
<pre class="literal-block">
|
|
||||||
if (cat is convertible to output_iterator_tag)
|
|
||||||
return true;
|
|
||||||
else if (cat is convertible to forward_iterator_tag
|
|
||||||
and iterator_traits<Iterator>::reference is a
|
|
||||||
mutable reference)
|
|
||||||
return true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
</pre>
|
|
||||||
<p>Suppose the <tt class="literal"><span class="pre">value_type</span></tt> of the iterator <tt class="literal"><span class="pre">It</span></tt> has a private
|
|
||||||
assignment operator:</p>
|
|
||||||
<pre class="literal-block">
|
|
||||||
class B {
|
|
||||||
public:
|
|
||||||
...
|
|
||||||
private:
|
|
||||||
B& operator=(const B&);
|
|
||||||
};
|
|
||||||
</pre>
|
|
||||||
<p>and suppose the <tt class="literal"><span class="pre">reference</span></tt> type of the iterator is <tt class="literal"><span class="pre">B&</span></tt>. In
|
|
||||||
that case, <tt class="literal"><span class="pre">is_writable<It>::value</span></tt> will be true when in fact
|
|
||||||
attempting to write into <tt class="literal"><span class="pre">B</span></tt> will cause an error.</p>
|
|
||||||
<p>The same problem applies to <tt class="literal"><span class="pre">is_swappable</span></tt>.</p>
|
|
||||||
</div>
|
|
||||||
<div class="section" id="proposed-resolution">
|
|
||||||
<h1><a class="toc-backref" href="#id2" name="proposed-resolution">Proposed Resolution</a></h1>
|
|
||||||
<ol class="arabic">
|
|
||||||
<li><p class="first">Remove the <tt class="literal"><span class="pre">is_writable</span></tt> and <tt class="literal"><span class="pre">is_swappable</span></tt> traits, and remove the
|
|
||||||
requirements in the Writable Iterator and Swappable Iterator concepts
|
|
||||||
that require their models to support these traits.</p>
|
|
||||||
</li>
|
|
||||||
<li><p class="first">Change the <tt class="literal"><span class="pre">is_readable</span></tt> specification to be:
|
|
||||||
<tt class="literal"><span class="pre">is_readable<X>::type</span></tt> is <tt class="literal"><span class="pre">true_type</span></tt> if the
|
|
||||||
result type of <tt class="literal"><span class="pre">X::operator*</span></tt> is convertible to
|
|
||||||
<tt class="literal"><span class="pre">iterator_traits<X>::value_type</span></tt> and is <tt class="literal"><span class="pre">false_type</span></tt>
|
|
||||||
otherwise. Also, <tt class="literal"><span class="pre">is_readable</span></tt> is required to satisfy
|
|
||||||
the requirements for the UnaryTypeTrait concept
|
|
||||||
(defined in the type traits proposal).</p>
|
|
||||||
<p>Remove the requirement for support of the <tt class="literal"><span class="pre">is_readable</span></tt> trait from
|
|
||||||
the Readable Iterator concept.</p>
|
|
||||||
</li>
|
|
||||||
<li><p class="first">Remove the <tt class="literal"><span class="pre">iterator_tag</span></tt> class.</p>
|
|
||||||
</li>
|
|
||||||
<li><p class="first">Change the specification of <tt class="literal"><span class="pre">traversal_category</span></tt> to:</p>
|
|
||||||
<pre class="literal-block">
|
|
||||||
traversal-category(Iterator) =
|
|
||||||
let cat = iterator_traits<Iterator>::iterator_category
|
|
||||||
if (cat is convertible to incrementable_iterator_tag)
|
|
||||||
return cat; // Iterator is a new iterator
|
|
||||||
else if (cat is convertible to random_access_iterator_tag)
|
|
||||||
return random_access_traversal_tag;
|
|
||||||
else if (cat is convertible to bidirectional_iterator_tag)
|
|
||||||
return bidirectional_traversal_tag;
|
|
||||||
else if (cat is convertible to forward_iterator_tag)
|
|
||||||
return forward_traversal_tag;
|
|
||||||
else if (cat is convertible to input_iterator_tag)
|
|
||||||
return single_pass_iterator_tag;
|
|
||||||
else if (cat is convertible to output_iterator_tag)
|
|
||||||
return incrementable_iterator_tag;
|
|
||||||
else
|
|
||||||
return null_category_tag;
|
|
||||||
</pre>
|
|
||||||
</li>
|
|
||||||
</ol>
|
|
||||||
</div>
|
|
||||||
<div class="section" id="rationale">
|
|
||||||
<h1><a class="toc-backref" href="#id3" name="rationale">Rationale</a></h1>
|
|
||||||
<ol class="arabic simple">
|
|
||||||
<li>There are two reasons for removing <tt class="literal"><span class="pre">is_writable</span></tt>
|
|
||||||
and <tt class="literal"><span class="pre">is_swappable</span></tt>. The first is that we do not know of
|
|
||||||
a way to fix the specification so that it gives the correct
|
|
||||||
answer for all iterators. Second, there was only a weak
|
|
||||||
motivation for having <tt class="literal"><span class="pre">is_writable</span></tt> and <tt class="literal"><span class="pre">is_swappable</span></tt>
|
|
||||||
there in the first place. The main motivation was simply
|
|
||||||
uniformity: we have tags for the old iterator categories
|
|
||||||
so we should have tags for the new iterator categories.
|
|
||||||
While having tags and the capability to dispatch based
|
|
||||||
on the traversal categories is often used, we see
|
|
||||||
less of a need for dispatching based on writability
|
|
||||||
and swappability, since typically algorithms
|
|
||||||
that need these capabilities have no alternative if
|
|
||||||
they are not provided.</li>
|
|
||||||
<li>We discovered that the <tt class="literal"><span class="pre">is_readable</span></tt> trait can be implemented
|
|
||||||
using only the iterator type itself and its <tt class="literal"><span class="pre">value_type</span></tt>.
|
|
||||||
Therefore we remove the requirement for <tt class="literal"><span class="pre">is_readable</span></tt> from the
|
|
||||||
Readable Iterator concept, and change the definition of
|
|
||||||
<tt class="literal"><span class="pre">is_readable</span></tt> so that it works for any iterator type.</li>
|
|
||||||
<li>The purpose of the <tt class="literal"><span class="pre">iterator_tag</span></tt> class was to
|
|
||||||
bundle the traversal and access category tags
|
|
||||||
into the <tt class="literal"><span class="pre">iterator_category</span></tt> typedef.
|
|
||||||
With <tt class="literal"><span class="pre">is_writable</span></tt> and <tt class="literal"><span class="pre">is_swappable</span></tt> gone, and
|
|
||||||
<tt class="literal"><span class="pre">is_readable</span></tt> no longer in need of special hints,
|
|
||||||
there is no reason for iterators to provide
|
|
||||||
information about the access capabilities of an iterator.
|
|
||||||
Thus there is no need for the <tt class="literal"><span class="pre">iterator_tag</span></tt>. The
|
|
||||||
traversal tag can be directly used for the
|
|
||||||
<tt class="literal"><span class="pre">iterator_category</span></tt>. If a new iterator is intended to be backward
|
|
||||||
compatible with old iterator concepts, a tag type
|
|
||||||
that is convertible to both one of the new traversal tags
|
|
||||||
and also to an old iterator tag can be created and use
|
|
||||||
for the <tt class="literal"><span class="pre">iterator_category</span></tt>.</li>
|
|
||||||
<li>The changes to the specification of <tt class="literal"><span class="pre">traversal_category</span></tt> are a
|
|
||||||
direct result of the removal of <tt class="literal"><span class="pre">iterator_tag</span></tt>.</li>
|
|
||||||
</ol>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<hr class="footer" />
|
|
||||||
<div class="footer">
|
|
||||||
<a class="reference" href="issues.rst">View document source</a>.
|
|
||||||
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
3
doc/issues.rst
Executable file → Normal file
3
doc/issues.rst
Executable file → Normal file
@@ -3,12 +3,11 @@
|
|||||||
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||||||
|
|
||||||
.. _N1550: http://www.boost-consulting.com/writing/n1550.html
|
.. _N1550: http://www.boost-consulting.com/writing/n1550.html
|
||||||
.. _N1530: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2003/n1530.html
|
.. _N1530: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1530.html
|
||||||
|
|
||||||
:Author: David Abrahams and Jeremy Siek
|
:Author: David Abrahams and Jeremy Siek
|
||||||
:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu
|
:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu
|
||||||
:Organization: `Boost Consulting`_, Indiana University Bloomington
|
:Organization: `Boost Consulting`_, Indiana University Bloomington
|
||||||
:date: $Date$
|
|
||||||
:Copyright: Copyright David Abrahams, Jeremy Siek 2003. Use, modification and
|
:Copyright: Copyright David Abrahams, Jeremy Siek 2003. Use, modification and
|
||||||
distribution is subject to the Boost Software License,
|
distribution is subject to the Boost Software License,
|
||||||
Version 1.0. (See accompanying file LICENSE_1_0.txt or copy
|
Version 1.0. (See accompanying file LICENSE_1_0.txt or copy
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -3,13 +3,13 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
<meta name="generator" content="Docutils 0.3.8: http://docutils.sourceforge.net/" />
|
<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
|
||||||
<title>Iterator Adaptor</title>
|
<title>Iterator Adaptor</title>
|
||||||
<meta name="author" content="David Abrahams, Jeremy Siek, Thomas Witt" />
|
<meta name="author" content="David Abrahams, Jeremy Siek, Thomas Witt" />
|
||||||
<meta name="organization" content="Boost Consulting, Indiana University Open Systems Lab, University of Hanover Institute for Transport Railway Operation and Construction" />
|
<meta name="organization" content="Boost Consulting, Indiana University Open Systems Lab, University of Hanover Institute for Transport Railway Operation and Construction" />
|
||||||
<meta name="date" content="2004-11-01" />
|
<meta name="date" content="2006-09-11" />
|
||||||
<meta name="copyright" content="Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003." />
|
<meta name="copyright" content="Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003." />
|
||||||
<link rel="stylesheet" href="default.css" type="text/css" />
|
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="document" id="iterator-adaptor">
|
<div class="document" id="iterator-adaptor">
|
||||||
@@ -21,17 +21,20 @@
|
|||||||
<tr><th class="docinfo-name">Author:</th>
|
<tr><th class="docinfo-name">Author:</th>
|
||||||
<td>David Abrahams, Jeremy Siek, Thomas Witt</td></tr>
|
<td>David Abrahams, Jeremy Siek, Thomas Witt</td></tr>
|
||||||
<tr><th class="docinfo-name">Contact:</th>
|
<tr><th class="docinfo-name">Contact:</th>
|
||||||
<td><a class="first reference" href="mailto:dave@boost-consulting.com">dave@boost-consulting.com</a>, <a class="reference" href="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</a>, <a class="last reference" href="mailto:witt@ive.uni-hannover.de">witt@ive.uni-hannover.de</a></td></tr>
|
<td><a class="first reference external" href="mailto:dave@boost-consulting.com">dave@boost-consulting.com</a>, <a class="reference external" href="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</a>, <a class="last reference external" href="mailto:witt@ive.uni-hannover.de">witt@ive.uni-hannover.de</a></td></tr>
|
||||||
<tr><th class="docinfo-name">Organization:</th>
|
<tr><th class="docinfo-name">Organization:</th>
|
||||||
<td><a class="first reference" href="http://www.boost-consulting.com">Boost Consulting</a>, Indiana University <a class="reference" href="http://www.osl.iu.edu">Open Systems
|
<td><a class="first reference external" href="http://www.boost-consulting.com">Boost Consulting</a>, Indiana University <a class="reference external" href="http://www.osl.iu.edu">Open Systems
|
||||||
Lab</a>, University of Hanover <a class="last reference" href="http://www.ive.uni-hannover.de">Institute for Transport
|
Lab</a>, University of Hanover <a class="last reference external" href="http://www.ive.uni-hannover.de">Institute for Transport
|
||||||
Railway Operation and Construction</a></td></tr>
|
Railway Operation and Construction</a></td></tr>
|
||||||
<tr><th class="docinfo-name">Date:</th>
|
<tr><th class="docinfo-name">Date:</th>
|
||||||
<td>2004-11-01</td></tr>
|
<td>2006-09-11</td></tr>
|
||||||
<tr><th class="docinfo-name">Copyright:</th>
|
<tr><th class="docinfo-name">Copyright:</th>
|
||||||
<td>Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.</td></tr>
|
<td>Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.</td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<!-- 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) -->
|
||||||
<table class="docutils field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
@@ -40,9 +43,12 @@ Railway Operation and Construction</a></td></tr>
|
|||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<!-- 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) -->
|
||||||
<!-- Version 1.1 of this ReStructuredText document corresponds to
|
<!-- Version 1.1 of this ReStructuredText document corresponds to
|
||||||
n1530_, the paper accepted by the LWG. -->
|
n1530_, the paper accepted by the LWG. -->
|
||||||
<!-- Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. -->
|
<!-- Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. -->
|
||||||
<p>Each specialization of the <tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> class template is derived from
|
<p>Each specialization of the <tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> class template is derived from
|
||||||
a specialization of <tt class="docutils literal"><span class="pre">iterator_facade</span></tt>. The core interface functions
|
a specialization of <tt class="docutils literal"><span class="pre">iterator_facade</span></tt>. The core interface functions
|
||||||
expected by <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> are implemented in terms of the
|
expected by <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> are implemented in terms of the
|
||||||
@@ -54,26 +60,29 @@ depends on the operations supported by the <tt class="docutils literal"><span cl
|
|||||||
core interface functions of <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> are redefined in the
|
core interface functions of <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> are redefined in the
|
||||||
<tt class="docutils literal"><span class="pre">Derived</span></tt> class.</p>
|
<tt class="docutils literal"><span class="pre">Derived</span></tt> class.</p>
|
||||||
<div class="contents topic" id="table-of-contents">
|
<div class="contents topic" id="table-of-contents">
|
||||||
<p class="topic-title first"><a name="table-of-contents">Table of Contents</a></p>
|
<p class="topic-title first">Table of Contents</p>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><a class="reference" href="#overview" id="id6" name="id6">Overview</a></li>
|
<li><a class="reference internal" href="#overview" id="id6">Overview</a></li>
|
||||||
<li><a class="reference" href="#reference" id="id7" name="id7">Reference</a><ul>
|
<li><a class="reference internal" href="#reference" id="id7">Reference</a><ul>
|
||||||
<li><a class="reference" href="#iterator-adaptor-requirements" id="id8" name="id8"><tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> requirements</a></li>
|
<li><a class="reference internal" href="#iterator-adaptor-requirements" id="id8"><tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> requirements</a></li>
|
||||||
<li><a class="reference" href="#iterator-adaptor-base-class-parameters" id="id9" name="id9"><tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> base class parameters</a></li>
|
<li><a class="reference internal" href="#iterator-adaptor-base-class-parameters" id="id9"><tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> base class parameters</a></li>
|
||||||
<li><a class="reference" href="#iterator-adaptor-public-operations" id="id10" name="id10"><tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> public operations</a></li>
|
<li><a class="reference internal" href="#iterator-adaptor-public-operations" id="id10"><tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> public operations</a></li>
|
||||||
<li><a class="reference" href="#iterator-adaptor-protected-member-functions" id="id11" name="id11"><tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> protected member functions</a></li>
|
<li><a class="reference internal" href="#iterator-adaptor-protected-member-functions" id="id11"><tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> protected member functions</a></li>
|
||||||
<li><a class="reference" href="#iterator-adaptor-private-member-functions" id="id12" name="id12"><tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> private member functions</a></li>
|
<li><a class="reference internal" href="#iterator-adaptor-private-member-functions" id="id12"><tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> private member functions</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a class="reference" href="#tutorial-example" id="id13" name="id13">Tutorial Example</a></li>
|
<li><a class="reference internal" href="#tutorial-example" id="id13">Tutorial Example</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="overview">
|
<div class="section" id="overview">
|
||||||
<h1><a class="toc-backref" href="#id6" name="overview">Overview</a></h1>
|
<h1><a class="toc-backref" href="#id6">Overview</a></h1>
|
||||||
|
<!-- 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) -->
|
||||||
<!-- Version 1.2 of this ReStructuredText document corresponds to
|
<!-- Version 1.2 of this ReStructuredText document corresponds to
|
||||||
n1530_, the paper accepted by the LWG for TR1. -->
|
n1530_, the paper accepted by the LWG for TR1. -->
|
||||||
<!-- Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. -->
|
<!-- Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. -->
|
||||||
<p>The <tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> class template adapts some <tt class="docutils literal"><span class="pre">Base</span></tt> <a class="footnote-reference" href="#base" id="id1" name="id1">[1]</a>
|
<p>The <tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> class template adapts some <tt class="docutils literal"><span class="pre">Base</span></tt><a class="footnote-reference" href="#base" id="id1"><sup>1</sup></a>
|
||||||
type to create a new iterator. Instantiations of <tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt>
|
type to create a new iterator. Instantiations of <tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt>
|
||||||
are derived from a corresponding instantiation of <tt class="docutils literal"><span class="pre">iterator_facade</span></tt>
|
are derived from a corresponding instantiation of <tt class="docutils literal"><span class="pre">iterator_facade</span></tt>
|
||||||
and implement the core behaviors in terms of the <tt class="docutils literal"><span class="pre">Base</span></tt> type. In
|
and implement the core behaviors in terms of the <tt class="docutils literal"><span class="pre">Base</span></tt> type. In
|
||||||
@@ -82,7 +91,7 @@ instance of the <tt class="docutils literal"><span class="pre">Base</span></tt>
|
|||||||
<table class="docutils footnote" frame="void" id="base" rules="none">
|
<table class="docutils footnote" frame="void" id="base" rules="none">
|
||||||
<colgroup><col class="label" /><col /></colgroup>
|
<colgroup><col class="label" /><col /></colgroup>
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr><td class="label"><a name="base">[1]</a></td><td><em>(<a class="fn-backref" href="#id1">1</a>, <a class="fn-backref" href="#id3">2</a>)</em> The term "Base" here does not refer to a base class and is
|
<tr><td class="label">[1]</td><td><em>(<a class="fn-backref" href="#id1">1</a>, <a class="fn-backref" href="#id3">2</a>)</em> The term "Base" here does not refer to a base class and is
|
||||||
not meant to imply the use of derivation. We have followed the lead
|
not meant to imply the use of derivation. We have followed the lead
|
||||||
of the standard library, which provides a base() function to access
|
of the standard library, which provides a base() function to access
|
||||||
the underlying iterator object of a <tt class="docutils literal"><span class="pre">reverse_iterator</span></tt> adaptor.</td></tr>
|
the underlying iterator object of a <tt class="docutils literal"><span class="pre">reverse_iterator</span></tt> adaptor.</td></tr>
|
||||||
@@ -110,10 +119,13 @@ template parameter may not always be identical to the iterator's
|
|||||||
that assumption.</p>
|
that assumption.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="reference">
|
<div class="section" id="reference">
|
||||||
<h1><a class="toc-backref" href="#id7" name="reference">Reference</a></h1>
|
<h1><a class="toc-backref" href="#id7">Reference</a></h1>
|
||||||
|
<!-- 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) -->
|
||||||
<!-- Version 1.4 of this ReStructuredText document corresponds to
|
<!-- Version 1.4 of this ReStructuredText document corresponds to
|
||||||
n1530_, the paper accepted by the LWG for TR1. -->
|
n1530_, the paper accepted by the LWG for TR1. -->
|
||||||
<!-- Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. -->
|
<!-- Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. -->
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
template <
|
template <
|
||||||
class Derived
|
class Derived
|
||||||
@@ -123,8 +135,8 @@ template <
|
|||||||
, class Reference = use_default
|
, class Reference = use_default
|
||||||
, class Difference = use_default
|
, class Difference = use_default
|
||||||
>
|
>
|
||||||
class iterator_adaptor
|
class iterator_adaptor
|
||||||
: public iterator_facade<Derived, <em>V'</em>, <em>C'</em>, <em>R'</em>, <em>D'</em>> // see <a class="reference" href="#base-parameters">details</a>
|
: public iterator_facade<Derived, <em>V'</em>, <em>C'</em>, <em>R'</em>, <em>D'</em>> // see <a class="reference internal" href="#base-parameters">details</a>
|
||||||
{
|
{
|
||||||
friend class iterator_core_access;
|
friend class iterator_core_access;
|
||||||
public:
|
public:
|
||||||
@@ -136,12 +148,12 @@ class iterator_adaptor
|
|||||||
typedef iterator_adaptor iterator_adaptor_;
|
typedef iterator_adaptor iterator_adaptor_;
|
||||||
Base const& base_reference() const;
|
Base const& base_reference() const;
|
||||||
Base& base_reference();
|
Base& base_reference();
|
||||||
private: // Core iterator interface for iterator_facade.
|
private: // Core iterator interface for iterator_facade.
|
||||||
typename iterator_adaptor::reference dereference() const;
|
typename iterator_adaptor::reference dereference() const;
|
||||||
|
|
||||||
template <
|
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;
|
bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& x) const;
|
||||||
|
|
||||||
void advance(typename iterator_adaptor::difference_type n);
|
void advance(typename iterator_adaptor::difference_type n);
|
||||||
@@ -150,7 +162,7 @@ class iterator_adaptor
|
|||||||
|
|
||||||
template <
|
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
|
||||||
>
|
>
|
||||||
typename iterator_adaptor::difference_type distance_to(
|
typename iterator_adaptor::difference_type distance_to(
|
||||||
iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;
|
iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;
|
||||||
|
|
||||||
@@ -158,13 +170,13 @@ class iterator_adaptor
|
|||||||
Base m_iterator; // exposition only
|
Base m_iterator; // exposition only
|
||||||
};
|
};
|
||||||
</pre>
|
</pre>
|
||||||
<a class="target" id="requirements" name="requirements"></a><div class="section" id="iterator-adaptor-requirements">
|
<div class="section" id="iterator-adaptor-requirements">
|
||||||
<h2><a class="toc-backref" href="#id8" name="iterator-adaptor-requirements"><tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> requirements</a></h2>
|
<span id="requirements"></span><h2><a class="toc-backref" href="#id8"><tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> requirements</a></h2>
|
||||||
<p><tt class="docutils literal"><span class="pre">static_cast<Derived*>(iterator_adaptor*)</span></tt> shall be well-formed.
|
<p><tt class="docutils literal"><span class="pre">static_cast<Derived*>(iterator_adaptor*)</span></tt> shall be well-formed.
|
||||||
The <tt class="docutils literal"><span class="pre">Base</span></tt> argument shall be Assignable and Copy Constructible.</p>
|
The <tt class="docutils literal"><span class="pre">Base</span></tt> argument shall be Assignable and Copy Constructible.</p>
|
||||||
<a class="target" id="base-parameters" name="base-parameters"></a></div>
|
</div>
|
||||||
<div class="section" id="iterator-adaptor-base-class-parameters">
|
<div class="section" id="iterator-adaptor-base-class-parameters">
|
||||||
<h2><a class="toc-backref" href="#id9" name="iterator-adaptor-base-class-parameters"><tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> base class parameters</a></h2>
|
<span id="base-parameters"></span><h2><a class="toc-backref" href="#id9"><tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> base class parameters</a></h2>
|
||||||
<p>The <em>V'</em>, <em>C'</em>, <em>R'</em>, and <em>D'</em> parameters of the <tt class="docutils literal"><span class="pre">iterator_facade</span></tt>
|
<p>The <em>V'</em>, <em>C'</em>, <em>R'</em>, and <em>D'</em> parameters of the <tt class="docutils literal"><span class="pre">iterator_facade</span></tt>
|
||||||
used as a base class in the summary of <tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt>
|
used as a base class in the summary of <tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt>
|
||||||
above are defined as follows:</p>
|
above are defined as follows:</p>
|
||||||
@@ -205,7 +217,7 @@ expression involving ``Derived`` in those concepts' requirements. -->
|
|||||||
<!-- That's why it's removed. We're embracing inheritance, remember? -->
|
<!-- That's why it's removed. We're embracing inheritance, remember? -->
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="iterator-adaptor-public-operations">
|
<div class="section" id="iterator-adaptor-public-operations">
|
||||||
<h2><a class="toc-backref" href="#id10" name="iterator-adaptor-public-operations"><tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> public operations</a></h2>
|
<h2><a class="toc-backref" href="#id10"><tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> public operations</a></h2>
|
||||||
<p><tt class="docutils literal"><span class="pre">iterator_adaptor();</span></tt></p>
|
<p><tt class="docutils literal"><span class="pre">iterator_adaptor();</span></tt></p>
|
||||||
<table class="docutils field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
@@ -213,7 +225,7 @@ expression involving ``Derived`` in those concepts' requirements. -->
|
|||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">Requires:</th><td class="field-body">The <tt class="docutils literal"><span class="pre">Base</span></tt> type must be Default Constructible.</td>
|
<tr class="field"><th class="field-name">Requires:</th><td class="field-body">The <tt class="docutils literal"><span class="pre">Base</span></tt> type must be Default Constructible.</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body">An instance of <tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> with
|
<tr class="field"><th class="field-name">Returns:</th><td class="field-body">An instance of <tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> with
|
||||||
<tt class="docutils literal"><span class="pre">m_iterator</span></tt> default constructed.</td>
|
<tt class="docutils literal"><span class="pre">m_iterator</span></tt> default constructed.</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
@@ -239,7 +251,7 @@ expression involving ``Derived`` in those concepts' requirements. -->
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="iterator-adaptor-protected-member-functions">
|
<div class="section" id="iterator-adaptor-protected-member-functions">
|
||||||
<h2><a class="toc-backref" href="#id11" name="iterator-adaptor-protected-member-functions"><tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> protected member functions</a></h2>
|
<h2><a class="toc-backref" href="#id11"><tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> protected member functions</a></h2>
|
||||||
<p><tt class="docutils literal"><span class="pre">Base</span> <span class="pre">const&</span> <span class="pre">base_reference()</span> <span class="pre">const;</span></tt></p>
|
<p><tt class="docutils literal"><span class="pre">Base</span> <span class="pre">const&</span> <span class="pre">base_reference()</span> <span class="pre">const;</span></tt></p>
|
||||||
<table class="docutils field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
@@ -260,7 +272,7 @@ expression involving ``Derived`` in those concepts' requirements. -->
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="iterator-adaptor-private-member-functions">
|
<div class="section" id="iterator-adaptor-private-member-functions">
|
||||||
<h2><a class="toc-backref" href="#id12" name="iterator-adaptor-private-member-functions"><tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> private member functions</a></h2>
|
<h2><a class="toc-backref" href="#id12"><tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> private member functions</a></h2>
|
||||||
<p><tt class="docutils literal"><span class="pre">typename</span> <span class="pre">iterator_adaptor::reference</span> <span class="pre">dereference()</span> <span class="pre">const;</span></tt></p>
|
<p><tt class="docutils literal"><span class="pre">typename</span> <span class="pre">iterator_adaptor::reference</span> <span class="pre">dereference()</span> <span class="pre">const;</span></tt></p>
|
||||||
<table class="docutils field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
@@ -273,7 +285,7 @@ expression involving ``Derived`` in those concepts' requirements. -->
|
|||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
template <
|
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;
|
bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& x) const;
|
||||||
</pre>
|
</pre>
|
||||||
<table class="docutils field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
@@ -314,7 +326,7 @@ bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const
|
|||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
template <
|
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
|
||||||
>
|
>
|
||||||
typename iterator_adaptor::difference_type distance_to(
|
typename iterator_adaptor::difference_type distance_to(
|
||||||
iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;
|
iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const;
|
||||||
</pre>
|
</pre>
|
||||||
@@ -329,12 +341,12 @@ typename iterator_adaptor::difference_type distance_to(
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="tutorial-example">
|
<div class="section" id="tutorial-example">
|
||||||
<h1><a class="toc-backref" href="#id13" name="tutorial-example">Tutorial Example</a></h1>
|
<h1><a class="toc-backref" href="#id13">Tutorial Example</a></h1>
|
||||||
<!-- Copyright David Abrahams 2004. Use, modification and distribution is -->
|
<!-- Copyright David Abrahams 2004. Use, modification and distribution is -->
|
||||||
<!-- subject to the Boost Software License, Version 1.0. (See accompanying -->
|
<!-- 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) -->
|
<!-- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
|
||||||
<p>In this section we'll further refine the <tt class="docutils literal"><span class="pre">node_iter</span></tt> class
|
<p>In this section we'll further refine the <tt class="docutils literal"><span class="pre">node_iter</span></tt> class
|
||||||
template we developed in the <a class="reference" href="iterator_facade.html#tutorial-example"><tt class="docutils literal"><span class="pre">iterator_facade</span></tt> tutorial</a>. If you haven't already
|
template we developed in the <a class="reference external" href="iterator_facade.html#tutorial-example"><tt class="docutils literal"><span class="pre">iterator_facade</span></tt> tutorial</a>. If you haven't already
|
||||||
read that material, you should go back now and check it out because
|
read that material, you should go back now and check it out because
|
||||||
we're going to pick up right where it left off.</p>
|
we're going to pick up right where it left off.</p>
|
||||||
<div class="sidebar">
|
<div class="sidebar">
|
||||||
@@ -357,12 +369,12 @@ of the same associated types (<tt class="docutils literal"><span class="pre">val
|
|||||||
core functionality is the same: <tt class="docutils literal"><span class="pre">operator*</span></tt> and <tt class="docutils literal"><span class="pre">operator==</span></tt> on
|
core functionality is the same: <tt class="docutils literal"><span class="pre">operator*</span></tt> and <tt class="docutils literal"><span class="pre">operator==</span></tt> on
|
||||||
the <tt class="docutils literal"><span class="pre">node_iterator</span></tt> return the result of invoking the same
|
the <tt class="docutils literal"><span class="pre">node_iterator</span></tt> return the result of invoking the same
|
||||||
operations on the underlying pointer, via the <tt class="docutils literal"><span class="pre">node_iterator</span></tt>'s
|
operations on the underlying pointer, via the <tt class="docutils literal"><span class="pre">node_iterator</span></tt>'s
|
||||||
<a class="reference" href="iterator_facade.html#implementing-the-core-operations"><tt class="docutils literal"><span class="pre">dereference</span></tt> and <tt class="docutils literal"><span class="pre">equal</span></tt> member functions</a>). The only real behavioral difference
|
<a class="reference external" href="iterator_facade.html#implementing-the-core-operations"><tt class="docutils literal"><span class="pre">dereference</span></tt> and <tt class="docutils literal"><span class="pre">equal</span></tt> member functions</a>). The only real behavioral difference
|
||||||
between <tt class="docutils literal"><span class="pre">node_base*</span></tt> and <tt class="docutils literal"><span class="pre">node_iterator</span></tt> can be observed when
|
between <tt class="docutils literal"><span class="pre">node_base*</span></tt> and <tt class="docutils literal"><span class="pre">node_iterator</span></tt> can be observed when
|
||||||
they are incremented: <tt class="docutils literal"><span class="pre">node_iterator</span></tt> follows the
|
they are incremented: <tt class="docutils literal"><span class="pre">node_iterator</span></tt> follows the
|
||||||
<tt class="docutils literal"><span class="pre">m_next</span></tt> pointer, while <tt class="docutils literal"><span class="pre">node_base*</span></tt> just applies an address offset.</p>
|
<tt class="docutils literal"><span class="pre">m_next</span></tt> pointer, while <tt class="docutils literal"><span class="pre">node_base*</span></tt> just applies an address offset.</p>
|
||||||
<p>It turns out that the pattern of building an iterator on another
|
<p>It turns out that the pattern of building an iterator on another
|
||||||
iterator-like type (the <tt class="docutils literal"><span class="pre">Base</span></tt> <a class="footnote-reference" href="#base" id="id3" name="id3">[1]</a> type) while modifying
|
iterator-like type (the <tt class="docutils literal"><span class="pre">Base</span></tt><a class="footnote-reference" href="#base" id="id3"><sup>1</sup></a> type) while modifying
|
||||||
just a few aspects of the underlying type's behavior is an
|
just a few aspects of the underlying type's behavior is an
|
||||||
extremely common one, and it's the pattern addressed by
|
extremely common one, and it's the pattern addressed by
|
||||||
<tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt>. Using <tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> is very much like
|
<tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt>. Using <tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt> is very much like
|
||||||
@@ -413,7 +425,7 @@ the complicated base class type of <tt class="docutils literal"><span class="pre
|
|||||||
this technique is known not to work with Borland C++ 5.6.4 and
|
this technique is known not to work with Borland C++ 5.6.4 and
|
||||||
Metrowerks CodeWarrior versions prior to 9.0]</p>
|
Metrowerks CodeWarrior versions prior to 9.0]</p>
|
||||||
<p>You can see an example program that exercises this version of the
|
<p>You can see an example program that exercises this version of the
|
||||||
node iterators <a class="reference" href="../example/node_iterator3.cpp">here</a>.</p>
|
node iterators <a class="reference external" href="../example/node_iterator3.cpp">here</a>.</p>
|
||||||
<p>In the case of <tt class="docutils literal"><span class="pre">node_iter</span></tt>, it's not very compelling to pass
|
<p>In the case of <tt class="docutils literal"><span class="pre">node_iter</span></tt>, it's not very compelling to pass
|
||||||
<tt class="docutils literal"><span class="pre">boost::use_default</span></tt> as <tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt>'s <tt class="docutils literal"><span class="pre">Value</span></tt>
|
<tt class="docutils literal"><span class="pre">boost::use_default</span></tt> as <tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt>'s <tt class="docutils literal"><span class="pre">Value</span></tt>
|
||||||
argument; we could have just passed <tt class="docutils literal"><span class="pre">node_iter</span></tt>'s <tt class="docutils literal"><span class="pre">Value</span></tt>
|
argument; we could have just passed <tt class="docutils literal"><span class="pre">node_iter</span></tt>'s <tt class="docutils literal"><span class="pre">Value</span></tt>
|
||||||
@@ -431,18 +443,19 @@ std::iterator_traits<Iterator>::<em>some-associated-type</em>
|
|||||||
</pre>
|
</pre>
|
||||||
<p>at least four times.</p>
|
<p>at least four times.</p>
|
||||||
<p>We urge you to review the documentation and implementations of
|
<p>We urge you to review the documentation and implementations of
|
||||||
<a class="reference" href="reverse_iterator.html"><tt class="docutils literal"><span class="pre">reverse_iterator</span></tt></a> and the other Boost <a class="reference" href="index.html#specialized-adaptors">specialized iterator
|
<a class="reference external" href="reverse_iterator.html"><tt class="docutils literal"><span class="pre">reverse_iterator</span></tt></a> and the other Boost <a class="reference external" href="index.html#specialized-adaptors">specialized iterator
|
||||||
adaptors</a> to get an idea of the sorts of things you can do with
|
adaptors</a> to get an idea of the sorts of things you can do with
|
||||||
<tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt>. In particular, have a look at
|
<tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt>. In particular, have a look at
|
||||||
<a class="reference" href="transform_iterator.html"><tt class="docutils literal"><span class="pre">transform_iterator</span></tt></a>, which is perhaps the most straightforward
|
<a class="reference external" href="transform_iterator.html"><tt class="docutils literal"><span class="pre">transform_iterator</span></tt></a>, which is perhaps the most straightforward
|
||||||
adaptor, and also <a class="reference" href="counting_iterator.html"><tt class="docutils literal"><span class="pre">counting_iterator</span></tt></a>, which demonstrates that
|
adaptor, and also <a class="reference external" href="counting_iterator.html"><tt class="docutils literal"><span class="pre">counting_iterator</span></tt></a>, which demonstrates that
|
||||||
<tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt>'s <tt class="docutils literal"><span class="pre">Base</span></tt> type needn't be an iterator.</p>
|
<tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt>'s <tt class="docutils literal"><span class="pre">Base</span></tt> type needn't be an iterator.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr class="docutils footer" />
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<a class="reference" href="iterator_adaptor.rst">View document source</a>.
|
<hr class="footer" />
|
||||||
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
<a class="reference external" href="iterator_adaptor.rst">View document source</a>.
|
||||||
|
Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
BIN
doc/iterator_adaptor.pdf
Executable file → Normal file
BIN
doc/iterator_adaptor.pdf
Executable file → Normal file
Binary file not shown.
@@ -1,3 +1,7 @@
|
|||||||
|
.. 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)
|
||||||
|
|
||||||
+++++++++++++++++
|
+++++++++++++++++
|
||||||
Iterator Adaptor
|
Iterator Adaptor
|
||||||
+++++++++++++++++
|
+++++++++++++++++
|
||||||
@@ -7,7 +11,6 @@
|
|||||||
:organization: `Boost Consulting`_, Indiana University `Open Systems
|
:organization: `Boost Consulting`_, Indiana University `Open Systems
|
||||||
Lab`_, University of Hanover `Institute for Transport
|
Lab`_, University of Hanover `Institute for Transport
|
||||||
Railway Operation and Construction`_
|
Railway Operation and Construction`_
|
||||||
:date: $Date$
|
|
||||||
:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
|
:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
|
||||||
|
|
||||||
.. _`Boost Consulting`: http://www.boost-consulting.com
|
.. _`Boost Consulting`: http://www.boost-consulting.com
|
||||||
|
|||||||
@@ -1,22 +0,0 @@
|
|||||||
Index: iterator_adaptor_abstract.rst
|
|
||||||
===================================================================
|
|
||||||
RCS file: /cvsroot/boost/boost/libs/iterator/doc/iterator_adaptor_abstract.rst,v
|
|
||||||
retrieving revision 1.1
|
|
||||||
retrieving revision 1.2
|
|
||||||
diff -b -d -u -r1.1 -r1.2
|
|
||||||
--- iterator_adaptor_abstract.rst 5 Aug 2003 18:19:55 -0000 1.1
|
|
||||||
+++ iterator_adaptor_abstract.rst 24 Nov 2003 05:02:46 -0000 1.2
|
|
||||||
@@ -1,5 +1,11 @@ Issue 9.21
|
|
||||||
-The ``iterator_adaptor`` is a base class template derived from an
|
|
||||||
-instantiation of ``iterator_facade``. The core interface functions
|
|
||||||
+.. Version 1.1 of this ReStructuredText document corresponds to
|
|
||||||
+ n1530_, the paper accepted by the LWG.
|
|
||||||
+
|
|
||||||
+.. Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All
|
|
||||||
+ rights reserved
|
|
||||||
+
|
|
||||||
+Each specialization of the ``iterator_adaptor`` class template is derived from
|
|
||||||
+a specialization of ``iterator_facade``. The core interface functions
|
|
||||||
expected by ``iterator_facade`` are implemented in terms of the
|
|
||||||
``iterator_adaptor``\ 's ``Base`` template parameter. A class derived
|
|
||||||
from ``iterator_adaptor`` typically redefines some of the core
|
|
||||||
@@ -1,3 +1,7 @@
|
|||||||
|
.. 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)
|
||||||
|
|
||||||
.. Version 1.1 of this ReStructuredText document corresponds to
|
.. Version 1.1 of this ReStructuredText document corresponds to
|
||||||
n1530_, the paper accepted by the LWG.
|
n1530_, the paper accepted by the LWG.
|
||||||
|
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
Index: iterator_adaptor_body.rst
|
|
||||||
===================================================================
|
|
||||||
RCS file: /cvsroot/boost/boost/libs/iterator/doc/iterator_adaptor_body.rst,v
|
|
||||||
retrieving revision 1.2
|
|
||||||
retrieving revision 1.3
|
|
||||||
diff -b -d -u -r1.2 -r1.3
|
|
||||||
--- iterator_adaptor_body.rst 22 Sep 2003 19:55:00 -0000 1.2
|
|
||||||
+++ iterator_adaptor_body.rst 24 Nov 2003 05:02:46 -0000 1.3
|
|
||||||
@@ -1,3 +1,9 @@
|
|
||||||
+.. Version 1.2 of this ReStructuredText document corresponds to
|
|
||||||
+ n1530_, the paper accepted by the LWG for TR1.
|
|
||||||
+
|
|
||||||
+.. Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All
|
|
||||||
+ rights reserved
|
|
||||||
+
|
|
||||||
The ``iterator_adaptor`` class template adapts some ``Base`` [#base]_
|
|
||||||
type to create a new iterator. Instantiations of ``iterator_adaptor``
|
|
||||||
are derived from a corresponding instantiation of ``iterator_facade``
|
|
||||||
@@ -19,7 +25,7 @@ Issue 9.1 et al
|
|
||||||
redefined in the user's derived class.
|
|
||||||
|
|
||||||
Several of the template parameters of ``iterator_adaptor`` default
|
|
||||||
-to ``use_default`` (or ``use_default_access``). This allows the
|
|
||||||
+to ``use_default``. This allows the
|
|
||||||
user to make use of a default parameter even when she wants to
|
|
||||||
specify a parameter later in the parameter list. Also, the
|
|
||||||
defaults for the corresponding associated types are somewhat
|
|
||||||
@@ -28,6 +34,6 @@ Issue 9.45y
|
|
||||||
the identity of the ``use_default`` type is not left unspecified
|
|
||||||
because specification helps to highlight that the ``Reference``
|
|
||||||
template parameter may not always be identical to the iterator's
|
|
||||||
-``reference`` type, and will keep users making mistakes based on
|
|
||||||
+``reference`` type, and will keep users from making mistakes based on
|
|
||||||
that assumption.
|
|
||||||
|
|
||||||
@@ -1,3 +1,7 @@
|
|||||||
|
.. 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)
|
||||||
|
|
||||||
.. Version 1.2 of this ReStructuredText document corresponds to
|
.. Version 1.2 of this ReStructuredText document corresponds to
|
||||||
n1530_, the paper accepted by the LWG for TR1.
|
n1530_, the paper accepted by the LWG for TR1.
|
||||||
|
|
||||||
|
|||||||
@@ -1,234 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8" ?>
|
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
||||||
<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.3.6: http://docutils.sourceforge.net/" />
|
|
||||||
<title></title>
|
|
||||||
<link rel="stylesheet" href="default.css" type="text/css" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="document">
|
|
||||||
<!-- Version 1.4 of this ReStructuredText document corresponds to
|
|
||||||
n1530_, the paper accepted by the LWG for TR1. -->
|
|
||||||
<!-- Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. -->
|
|
||||||
<pre class="literal-block">
|
|
||||||
template <
|
|
||||||
class Derived
|
|
||||||
, class Base
|
|
||||||
, class Value = use_default
|
|
||||||
, class CategoryOrTraversal = use_default
|
|
||||||
, class Reference = use_default
|
|
||||||
, class Difference = use_default
|
|
||||||
>
|
|
||||||
class iterator_adaptor
|
|
||||||
: public iterator_facade<Derived, <em>V'</em>, <em>C'</em>, <em>R'</em>, <em>D'</em>> // see <a class="reference" href="#base-parameters">details</a>
|
|
||||||
{
|
|
||||||
friend class iterator_core_access;
|
|
||||||
public:
|
|
||||||
iterator_adaptor();
|
|
||||||
explicit iterator_adaptor(Base iter);
|
|
||||||
Base const& base() const;
|
|
||||||
protected:
|
|
||||||
typedef iterator_adaptor iterator_adaptor_;
|
|
||||||
Base const& base_reference() const;
|
|
||||||
Base& base_reference();
|
|
||||||
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
|
|
||||||
>
|
|
||||||
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;
|
|
||||||
|
|
||||||
private:
|
|
||||||
Base m_iterator; // exposition only
|
|
||||||
};
|
|
||||||
</pre>
|
|
||||||
<a class="target" id="requirements" name="requirements"></a><div class="section" id="iterator-adaptor-requirements">
|
|
||||||
<h1><a name="iterator-adaptor-requirements"><tt class="literal"><span class="pre">iterator_adaptor</span></tt> requirements</a></h1>
|
|
||||||
<p><tt class="literal"><span class="pre">static_cast<Derived*>(iterator_adaptor*)</span></tt> shall be well-formed.
|
|
||||||
The <tt class="literal"><span class="pre">Base</span></tt> argument shall be Assignable and Copy Constructible.</p>
|
|
||||||
<a class="target" id="base-parameters" name="base-parameters"></a></div>
|
|
||||||
<div class="section" id="iterator-adaptor-base-class-parameters">
|
|
||||||
<h1><a name="iterator-adaptor-base-class-parameters"><tt class="literal"><span class="pre">iterator_adaptor</span></tt> base class parameters</a></h1>
|
|
||||||
<p>The <em>V'</em>, <em>C'</em>, <em>R'</em>, and <em>D'</em> parameters of the <tt class="literal"><span class="pre">iterator_facade</span></tt>
|
|
||||||
used as a base class in the summary of <tt class="literal"><span class="pre">iterator_adaptor</span></tt>
|
|
||||||
above are defined as follows:</p>
|
|
||||||
<pre class="literal-block">
|
|
||||||
<em>V'</em> = if (Value is use_default)
|
|
||||||
return iterator_traits<Base>::value_type
|
|
||||||
else
|
|
||||||
return Value
|
|
||||||
|
|
||||||
<em>C'</em> = if (CategoryOrTraversal is use_default)
|
|
||||||
return iterator_traversal<Base>::type
|
|
||||||
else
|
|
||||||
return CategoryOrTraversal
|
|
||||||
|
|
||||||
<em>R'</em> = if (Reference is use_default)
|
|
||||||
if (Value is use_default)
|
|
||||||
return iterator_traits<Base>::reference
|
|
||||||
else
|
|
||||||
return Value&
|
|
||||||
else
|
|
||||||
return Reference
|
|
||||||
|
|
||||||
<em>D'</em> = if (Difference is use_default)
|
|
||||||
return iterator_traits<Base>::difference_type
|
|
||||||
else
|
|
||||||
return Difference
|
|
||||||
</pre>
|
|
||||||
<!-- ``iterator_adaptor`` models
|
|
||||||
- - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|
||||||
|
|
||||||
In order for ``Derived`` to model the iterator concepts corresponding
|
|
||||||
to ``iterator_traits<Derived>::iterator_category``, the expressions
|
|
||||||
involving ``m_iterator`` in the specifications of those private member
|
|
||||||
functions of ``iterator_adaptor`` that may be called by
|
|
||||||
``iterator_facade<Derived, V, C, R, D>`` in evaluating any valid
|
|
||||||
expression involving ``Derived`` in those concepts' requirements. -->
|
|
||||||
<!-- The above is confusing and needs a rewrite. -JGS -->
|
|
||||||
<!-- That's why it's removed. We're embracing inheritance, remember? -->
|
|
||||||
</div>
|
|
||||||
<div class="section" id="iterator-adaptor-public-operations">
|
|
||||||
<h1><a name="iterator-adaptor-public-operations"><tt class="literal"><span class="pre">iterator_adaptor</span></tt> public operations</a></h1>
|
|
||||||
<p><tt class="literal"><span class="pre">iterator_adaptor();</span></tt></p>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Requires:</th><td class="field-body">The <tt class="literal"><span class="pre">Base</span></tt> type must be Default Constructible.</td>
|
|
||||||
</tr>
|
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body">An instance of <tt class="literal"><span class="pre">iterator_adaptor</span></tt> with
|
|
||||||
<tt class="literal"><span class="pre">m_iterator</span></tt> default constructed.</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<p><tt class="literal"><span class="pre">explicit</span> <span class="pre">iterator_adaptor(Base</span> <span class="pre">iter);</span></tt></p>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body">An instance of <tt class="literal"><span class="pre">iterator_adaptor</span></tt> with
|
|
||||||
<tt class="literal"><span class="pre">m_iterator</span></tt> copy constructed from <tt class="literal"><span class="pre">iter</span></tt>.</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<p><tt class="literal"><span class="pre">Base</span> <span class="pre">const&</span> <span class="pre">base()</span> <span class="pre">const;</span></tt></p>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">m_iterator</span></tt></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<div class="section" id="iterator-adaptor-protected-member-functions">
|
|
||||||
<h1><a name="iterator-adaptor-protected-member-functions"><tt class="literal"><span class="pre">iterator_adaptor</span></tt> protected member functions</a></h1>
|
|
||||||
<p><tt class="literal"><span class="pre">Base</span> <span class="pre">const&</span> <span class="pre">base_reference()</span> <span class="pre">const;</span></tt></p>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body">A const reference to <tt class="literal"><span class="pre">m_iterator</span></tt>.</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<p><tt class="literal"><span class="pre">Base&</span> <span class="pre">base_reference();</span></tt></p>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body">A non-const reference to <tt class="literal"><span class="pre">m_iterator</span></tt>.</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<div class="section" id="iterator-adaptor-private-member-functions">
|
|
||||||
<h1><a name="iterator-adaptor-private-member-functions"><tt class="literal"><span class="pre">iterator_adaptor</span></tt> private member functions</a></h1>
|
|
||||||
<p><tt class="literal"><span class="pre">typename</span> <span class="pre">iterator_adaptor::reference</span> <span class="pre">dereference()</span> <span class="pre">const;</span></tt></p>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">*m_iterator</span></tt></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<pre class="literal-block">
|
|
||||||
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;
|
|
||||||
</pre>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">m_iterator</span> <span class="pre">==</span> <span class="pre">x.base()</span></tt></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<p><tt class="literal"><span class="pre">void</span> <span class="pre">advance(typename</span> <span class="pre">iterator_adaptor::difference_type</span> <span class="pre">n);</span></tt></p>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Effects:</th><td class="field-body"><tt class="literal"><span class="pre">m_iterator</span> <span class="pre">+=</span> <span class="pre">n;</span></tt></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<p><tt class="literal"><span class="pre">void</span> <span class="pre">increment();</span></tt></p>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Effects:</th><td class="field-body"><tt class="literal"><span class="pre">++m_iterator;</span></tt></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<p><tt class="literal"><span class="pre">void</span> <span class="pre">decrement();</span></tt></p>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Effects:</th><td class="field-body"><tt class="literal"><span class="pre">--m_iterator;</span></tt></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<pre class="literal-block">
|
|
||||||
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;
|
|
||||||
</pre>
|
|
||||||
<table class="field-list" frame="void" rules="none">
|
|
||||||
<col class="field-name" />
|
|
||||||
<col class="field-body" />
|
|
||||||
<tbody valign="top">
|
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><tt class="literal"><span class="pre">y.base()</span> <span class="pre">-</span> <span class="pre">m_iterator</span></tt></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<hr class="footer" />
|
|
||||||
<div class="footer">
|
|
||||||
<a class="reference" href="iterator_adaptor_ref.rst">View document source</a>.
|
|
||||||
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,3 +1,7 @@
|
|||||||
|
.. 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)
|
||||||
|
|
||||||
.. Version 1.4 of this ReStructuredText document corresponds to
|
.. Version 1.4 of this ReStructuredText document corresponds to
|
||||||
n1530_, the paper accepted by the LWG for TR1.
|
n1530_, the paper accepted by the LWG for TR1.
|
||||||
|
|
||||||
|
|||||||
0
doc/iterator_adaptor_tutorial.rst
Executable file → Normal file
0
doc/iterator_adaptor_tutorial.rst
Executable file → Normal file
62
doc/iterator_archetypes.html
Executable file → Normal file
62
doc/iterator_archetypes.html
Executable file → Normal file
@@ -3,13 +3,13 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
<meta name="generator" content="Docutils 0.3.8: http://docutils.sourceforge.net/" />
|
<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
|
||||||
<title>Iterator Archetype</title>
|
<title>Iterator Archetype</title>
|
||||||
<meta name="author" content="David Abrahams, Jeremy Siek, Thomas Witt" />
|
<meta name="author" content="David Abrahams, Jeremy Siek, Thomas Witt" />
|
||||||
<meta name="organization" content="Boost Consulting, Indiana University Open Systems Lab, Zephyr Associates, Inc." />
|
<meta name="organization" content="Boost Consulting, Indiana University Open Systems Lab, Zephyr Associates, Inc." />
|
||||||
<meta name="date" content="2004-11-01" />
|
<meta name="date" content="2006-09-11" />
|
||||||
<meta name="copyright" content="Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2004." />
|
<meta name="copyright" content="Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2004." />
|
||||||
<link rel="stylesheet" href="default.css" type="text/css" />
|
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="document" id="iterator-archetype">
|
<div class="document" id="iterator-archetype">
|
||||||
@@ -21,16 +21,19 @@
|
|||||||
<tr><th class="docinfo-name">Author:</th>
|
<tr><th class="docinfo-name">Author:</th>
|
||||||
<td>David Abrahams, Jeremy Siek, Thomas Witt</td></tr>
|
<td>David Abrahams, Jeremy Siek, Thomas Witt</td></tr>
|
||||||
<tr><th class="docinfo-name">Contact:</th>
|
<tr><th class="docinfo-name">Contact:</th>
|
||||||
<td><a class="first reference" href="mailto:dave@boost-consulting.com">dave@boost-consulting.com</a>, <a class="reference" href="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</a>, <a class="last reference" href="mailto:witt@styleadvisor.com">witt@styleadvisor.com</a></td></tr>
|
<td><a class="first reference external" href="mailto:dave@boost-consulting.com">dave@boost-consulting.com</a>, <a class="reference external" href="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</a>, <a class="last reference external" href="mailto:witt@styleadvisor.com">witt@styleadvisor.com</a></td></tr>
|
||||||
<tr><th class="docinfo-name">Organization:</th>
|
<tr><th class="docinfo-name">Organization:</th>
|
||||||
<td><a class="first reference" href="http://www.boost-consulting.com">Boost Consulting</a>, Indiana University <a class="reference" href="http://www.osl.iu.edu">Open Systems
|
<td><a class="first reference external" href="http://www.boost-consulting.com">Boost Consulting</a>, Indiana University <a class="reference external" href="http://www.osl.iu.edu">Open Systems
|
||||||
Lab</a>, <a class="last reference" href="http://www.styleadvisor.com">Zephyr Associates, Inc.</a></td></tr>
|
Lab</a>, <a class="last reference external" href="http://www.styleadvisor.com">Zephyr Associates, Inc.</a></td></tr>
|
||||||
<tr><th class="docinfo-name">Date:</th>
|
<tr><th class="docinfo-name">Date:</th>
|
||||||
<td>2004-11-01</td></tr>
|
<td>2006-09-11</td></tr>
|
||||||
<tr><th class="docinfo-name">Copyright:</th>
|
<tr><th class="docinfo-name">Copyright:</th>
|
||||||
<td>Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2004.</td></tr>
|
<td>Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2004.</td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<!-- 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) -->
|
||||||
<table class="docutils field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
@@ -39,27 +42,27 @@ Lab</a>, <a class="last reference" href="http://www.styleadvisor.com">Zephyr Ass
|
|||||||
one of the iterator access concepts and one of the iterator traversal concepts.
|
one of the iterator access concepts and one of the iterator traversal concepts.
|
||||||
This is used for doing a compile-time check to see if a the type requirements
|
This is used for doing a compile-time check to see if a the type requirements
|
||||||
of a template are really enough to cover the implementation of the template.
|
of a template are really enough to cover the implementation of the template.
|
||||||
For further information see the documentation for the <a class="reference" href="../../concept_check/index.html"><tt class="docutils literal"><span class="pre">boost::concept_check</span></tt></a> library.</td>
|
For further information see the documentation for the <a class="reference external" href="../../concept_check/index.html"><tt class="docutils literal"><span class="pre">boost::concept_check</span></tt></a> library.</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<div class="contents topic" id="table-of-contents">
|
<div class="contents topic" id="table-of-contents">
|
||||||
<p class="topic-title first"><a name="table-of-contents">Table of Contents</a></p>
|
<p class="topic-title first">Table of Contents</p>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><a class="reference" href="#reference" id="id1" name="id1">Reference</a><ul>
|
<li><a class="reference internal" href="#reference" id="id1">Reference</a><ul>
|
||||||
<li><a class="reference" href="#iterator-archetype-synopsis" id="id2" name="id2"><tt class="docutils literal"><span class="pre">iterator_archetype</span></tt> Synopsis</a></li>
|
<li><a class="reference internal" href="#iterator-archetype-synopsis" id="id2"><tt class="docutils literal"><span class="pre">iterator_archetype</span></tt> Synopsis</a></li>
|
||||||
<li><a class="reference" href="#access-category-tags" id="id3" name="id3"><tt class="docutils literal"><span class="pre">Access</span> <span class="pre">Category</span> <span class="pre">Tags</span></tt></a></li>
|
<li><a class="reference internal" href="#access-category-tags" id="id3"><tt class="docutils literal"><span class="pre">Access</span> <span class="pre">Category</span> <span class="pre">Tags</span></tt></a></li>
|
||||||
<li><a class="reference" href="#iterator-archetype-requirements" id="id4" name="id4"><tt class="docutils literal"><span class="pre">iterator_archetype</span></tt> Requirements</a></li>
|
<li><a class="reference internal" href="#iterator-archetype-requirements" id="id4"><tt class="docutils literal"><span class="pre">iterator_archetype</span></tt> Requirements</a></li>
|
||||||
<li><a class="reference" href="#iterator-archetype-models" id="id5" name="id5"><tt class="docutils literal"><span class="pre">iterator_archetype</span></tt> Models</a></li>
|
<li><a class="reference internal" href="#iterator-archetype-models" id="id5"><tt class="docutils literal"><span class="pre">iterator_archetype</span></tt> Models</a></li>
|
||||||
<li><a class="reference" href="#traits" id="id6" name="id6"><tt class="docutils literal"><span class="pre">Traits</span></tt></a></li>
|
<li><a class="reference internal" href="#traits" id="id6"><tt class="docutils literal"><span class="pre">Traits</span></tt></a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="reference">
|
<div class="section" id="reference">
|
||||||
<h1><a class="toc-backref" href="#id1" name="reference">Reference</a></h1>
|
<h1><a class="toc-backref" href="#id1">Reference</a></h1>
|
||||||
<div class="section" id="iterator-archetype-synopsis">
|
<div class="section" id="iterator-archetype-synopsis">
|
||||||
<h2><a class="toc-backref" href="#id2" name="iterator-archetype-synopsis"><tt class="docutils literal"><span class="pre">iterator_archetype</span></tt> Synopsis</a></h2>
|
<h2><a class="toc-backref" href="#id2"><tt class="docutils literal"><span class="pre">iterator_archetype</span></tt> Synopsis</a></h2>
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
namespace iterator_archetypes
|
namespace iterator_archetypes
|
||||||
{
|
{
|
||||||
@@ -89,7 +92,7 @@ class iterator_archetype
|
|||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="access-category-tags">
|
<div class="section" id="access-category-tags">
|
||||||
<h2><a class="toc-backref" href="#id3" name="access-category-tags"><tt class="docutils literal"><span class="pre">Access</span> <span class="pre">Category</span> <span class="pre">Tags</span></tt></a></h2>
|
<h2><a class="toc-backref" href="#id3"><tt class="docutils literal"><span class="pre">Access</span> <span class="pre">Category</span> <span class="pre">Tags</span></tt></a></h2>
|
||||||
<p>The access category types provided correspond to the following
|
<p>The access category types provided correspond to the following
|
||||||
standard iterator access concept combinations:</p>
|
standard iterator access concept combinations:</p>
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
@@ -115,7 +118,7 @@ writeable_lvalue_iterator_t :=
|
|||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="iterator-archetype-requirements">
|
<div class="section" id="iterator-archetype-requirements">
|
||||||
<h2><a class="toc-backref" href="#id4" name="iterator-archetype-requirements"><tt class="docutils literal"><span class="pre">iterator_archetype</span></tt> Requirements</a></h2>
|
<h2><a class="toc-backref" href="#id4"><tt class="docutils literal"><span class="pre">iterator_archetype</span></tt> Requirements</a></h2>
|
||||||
<p>The <tt class="docutils literal"><span class="pre">AccessCategory</span></tt> argument must be one of the predefined access
|
<p>The <tt class="docutils literal"><span class="pre">AccessCategory</span></tt> argument must be one of the predefined access
|
||||||
category tags. The <tt class="docutils literal"><span class="pre">TraversalCategory</span></tt> must be one of the standard
|
category tags. The <tt class="docutils literal"><span class="pre">TraversalCategory</span></tt> must be one of the standard
|
||||||
traversal tags. The <tt class="docutils literal"><span class="pre">Value</span></tt> type must satisfy the requirements of
|
traversal tags. The <tt class="docutils literal"><span class="pre">Value</span></tt> type must satisfy the requirements of
|
||||||
@@ -123,18 +126,18 @@ the iterator concept specified by <tt class="docutils literal"><span class="pre"
|
|||||||
<tt class="docutils literal"><span class="pre">TraversalCategory</span></tt> as implied by the nested traits types.</p>
|
<tt class="docutils literal"><span class="pre">TraversalCategory</span></tt> as implied by the nested traits types.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="iterator-archetype-models">
|
<div class="section" id="iterator-archetype-models">
|
||||||
<h2><a class="toc-backref" href="#id5" name="iterator-archetype-models"><tt class="docutils literal"><span class="pre">iterator_archetype</span></tt> Models</a></h2>
|
<h2><a class="toc-backref" href="#id5"><tt class="docutils literal"><span class="pre">iterator_archetype</span></tt> Models</a></h2>
|
||||||
<p><tt class="docutils literal"><span class="pre">iterator_archetype</span></tt> models the iterator concepts specified by the
|
<p><tt class="docutils literal"><span class="pre">iterator_archetype</span></tt> models the iterator concepts specified by the
|
||||||
<tt class="docutils literal"><span class="pre">AccessCategory</span></tt> and <tt class="docutils literal"><span class="pre">TraversalCategory</span></tt>
|
<tt class="docutils literal"><span class="pre">AccessCategory</span></tt> and <tt class="docutils literal"><span class="pre">TraversalCategory</span></tt>
|
||||||
arguments. <tt class="docutils literal"><span class="pre">iterator_archetype</span></tt> does not model any other access
|
arguments. <tt class="docutils literal"><span class="pre">iterator_archetype</span></tt> does not model any other access
|
||||||
concepts or any more derived traversal concepts.</p>
|
concepts or any more derived traversal concepts.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="traits">
|
<div class="section" id="traits">
|
||||||
<h2><a class="toc-backref" href="#id6" name="traits"><tt class="docutils literal"><span class="pre">Traits</span></tt></a></h2>
|
<h2><a class="toc-backref" href="#id6"><tt class="docutils literal"><span class="pre">Traits</span></tt></a></h2>
|
||||||
<p>The nested trait types are defined as follows:</p>
|
<p>The nested trait types are defined as follows:</p>
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
if (AccessCategory == readable_iterator_t)
|
if (AccessCategory == readable_iterator_t)
|
||||||
|
|
||||||
value_type = Value
|
value_type = Value
|
||||||
reference = Value
|
reference = Value
|
||||||
pointer = Value*
|
pointer = Value*
|
||||||
@@ -152,7 +155,7 @@ else if (AccessCategory == readable_writable_iterator_t)
|
|||||||
reference :=
|
reference :=
|
||||||
|
|
||||||
A type X that is convertible to Value for which the following
|
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.
|
Value.
|
||||||
|
|
||||||
x = v
|
x = v
|
||||||
@@ -160,13 +163,13 @@ else if (AccessCategory == readable_writable_iterator_t)
|
|||||||
pointer = Value*
|
pointer = Value*
|
||||||
|
|
||||||
else if (AccessCategory == readable_lvalue_iterator_t)
|
else if (AccessCategory == readable_lvalue_iterator_t)
|
||||||
|
|
||||||
value_type = Value
|
value_type = Value
|
||||||
reference = Value const&
|
reference = Value const&
|
||||||
pointer = Value const*
|
pointer = Value const*
|
||||||
|
|
||||||
else if (AccessCategory == writable_lvalue_iterator_t)
|
else if (AccessCategory == writable_lvalue_iterator_t)
|
||||||
|
|
||||||
value_type = Value
|
value_type = Value
|
||||||
reference = Value&
|
reference = Value&
|
||||||
pointer = Value*
|
pointer = Value*
|
||||||
@@ -180,7 +183,7 @@ else
|
|||||||
difference_type := unspecified type
|
difference_type := unspecified type
|
||||||
|
|
||||||
|
|
||||||
iterator_category :=
|
iterator_category :=
|
||||||
|
|
||||||
A type X satisfying the following two constraints:
|
A type X satisfying the following two constraints:
|
||||||
|
|
||||||
@@ -211,10 +214,11 @@ iterator_category :=
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr class="docutils footer" />
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<a class="reference" href="iterator_archetypes.rst">View document source</a>.
|
<hr class="footer" />
|
||||||
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
<a class="reference external" href="iterator_archetypes.rst">View document source</a>.
|
||||||
|
Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
0
doc/iterator_archetypes.pdf
Executable file → Normal file
0
doc/iterator_archetypes.pdf
Executable file → Normal file
5
doc/iterator_archetypes.rst
Executable file → Normal file
5
doc/iterator_archetypes.rst
Executable file → Normal file
@@ -1,3 +1,7 @@
|
|||||||
|
.. 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)
|
||||||
|
|
||||||
++++++++++++++++++++
|
++++++++++++++++++++
|
||||||
Iterator Archetype
|
Iterator Archetype
|
||||||
++++++++++++++++++++
|
++++++++++++++++++++
|
||||||
@@ -6,7 +10,6 @@
|
|||||||
:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com
|
:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com
|
||||||
:organization: `Boost Consulting`_, Indiana University `Open Systems
|
:organization: `Boost Consulting`_, Indiana University `Open Systems
|
||||||
Lab`_, `Zephyr Associates, Inc.`_
|
Lab`_, `Zephyr Associates, Inc.`_
|
||||||
:date: $Date$
|
|
||||||
:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2004.
|
:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2004.
|
||||||
|
|
||||||
.. _`Boost Consulting`: http://www.boost-consulting.com
|
.. _`Boost Consulting`: http://www.boost-consulting.com
|
||||||
|
|||||||
@@ -3,13 +3,13 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
<meta name="generator" content="Docutils 0.3.8: http://docutils.sourceforge.net/" />
|
<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
|
||||||
<title>Iterator Concepts</title>
|
<title>Iterator Concepts</title>
|
||||||
<meta name="author" content="David Abrahams, Jeremy Siek, Thomas Witt" />
|
<meta name="author" content="David Abrahams, Jeremy Siek, Thomas Witt" />
|
||||||
<meta name="organization" content="Boost Consulting, Indiana University Open Systems Lab, Zephyr Associates, Inc." />
|
<meta name="organization" content="Boost Consulting, Indiana University Open Systems Lab, Zephyr Associates, Inc." />
|
||||||
<meta name="date" content="2004-11-01" />
|
<meta name="date" content="2006-09-11" />
|
||||||
<meta name="copyright" content="Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2004." />
|
<meta name="copyright" content="Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2004." />
|
||||||
<link rel="stylesheet" href="default.css" type="text/css" />
|
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="document" id="iterator-concepts">
|
<div class="document" id="iterator-concepts">
|
||||||
@@ -21,16 +21,19 @@
|
|||||||
<tr><th class="docinfo-name">Author:</th>
|
<tr><th class="docinfo-name">Author:</th>
|
||||||
<td>David Abrahams, Jeremy Siek, Thomas Witt</td></tr>
|
<td>David Abrahams, Jeremy Siek, Thomas Witt</td></tr>
|
||||||
<tr><th class="docinfo-name">Contact:</th>
|
<tr><th class="docinfo-name">Contact:</th>
|
||||||
<td><a class="first reference" href="mailto:dave@boost-consulting.com">dave@boost-consulting.com</a>, <a class="reference" href="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</a>, <a class="last reference" href="mailto:witt@styleadvisor.com">witt@styleadvisor.com</a></td></tr>
|
<td><a class="first reference external" href="mailto:dave@boost-consulting.com">dave@boost-consulting.com</a>, <a class="reference external" href="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</a>, <a class="last reference external" href="mailto:witt@styleadvisor.com">witt@styleadvisor.com</a></td></tr>
|
||||||
<tr><th class="docinfo-name">Organization:</th>
|
<tr><th class="docinfo-name">Organization:</th>
|
||||||
<td><a class="first reference" href="http://www.boost-consulting.com">Boost Consulting</a>, Indiana University <a class="reference" href="http://www.osl.iu.edu">Open Systems
|
<td><a class="first reference external" href="http://www.boost-consulting.com">Boost Consulting</a>, Indiana University <a class="reference external" href="http://www.osl.iu.edu">Open Systems
|
||||||
Lab</a>, <a class="last reference" href="http://www.styleadvisor.com">Zephyr Associates, Inc.</a></td></tr>
|
Lab</a>, <a class="last reference external" href="http://www.styleadvisor.com">Zephyr Associates, Inc.</a></td></tr>
|
||||||
<tr><th class="docinfo-name">Date:</th>
|
<tr><th class="docinfo-name">Date:</th>
|
||||||
<td>2004-11-01</td></tr>
|
<td>2006-09-11</td></tr>
|
||||||
<tr><th class="docinfo-name">Copyright:</th>
|
<tr><th class="docinfo-name">Copyright:</th>
|
||||||
<td>Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2004.</td></tr>
|
<td>Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2004.</td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<!-- 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) -->
|
||||||
<table class="docutils field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
@@ -43,30 +46,30 @@ the template.</td>
|
|||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<p>For an introduction to using concept checking classes, see
|
<p>For an introduction to using concept checking classes, see
|
||||||
the documentation for the <a class="reference" href="../../concept_check/index.html"><tt class="docutils literal"><span class="pre">boost::concept_check</span></tt></a> library.</p>
|
the documentation for the <a class="reference external" href="../../concept_check/index.html"><tt class="docutils literal"><span class="pre">boost::concept_check</span></tt></a> library.</p>
|
||||||
<div class="section" id="reference">
|
<div class="section" id="reference">
|
||||||
<h1><a name="reference">Reference</a></h1>
|
<h1>Reference</h1>
|
||||||
<div class="section" id="iterator-access-concepts">
|
<div class="section" id="iterator-access-concepts">
|
||||||
<h2><a name="iterator-access-concepts">Iterator Access Concepts</a></h2>
|
<h2>Iterator Access Concepts</h2>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><a class="reference" href="ReadableIterator.html"><em>Readable Iterator</em></a></li>
|
<li><a class="reference external" href="ReadableIterator.html"><em>Readable Iterator</em></a></li>
|
||||||
<li><a class="reference" href="WritableIterator.html"><em>Writable Iterator</em></a></li>
|
<li><a class="reference external" href="WritableIterator.html"><em>Writable Iterator</em></a></li>
|
||||||
<li><a class="reference" href="SwappableIterator.html"><em>Swappable Iterator</em></a></li>
|
<li><a class="reference external" href="SwappableIterator.html"><em>Swappable Iterator</em></a></li>
|
||||||
<li><a class="reference" href="LvalueIterator.html"><em>Lvalue Iterator</em></a></li>
|
<li><a class="reference external" href="LvalueIterator.html"><em>Lvalue Iterator</em></a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="iterator-traversal-concepts">
|
<div class="section" id="iterator-traversal-concepts">
|
||||||
<h2><a name="iterator-traversal-concepts">Iterator Traversal Concepts</a></h2>
|
<h2>Iterator Traversal Concepts</h2>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><a class="reference" href="IncrementableIterator.html"><em>Incrementable Iterator</em></a></li>
|
<li><a class="reference external" href="IncrementableIterator.html"><em>Incrementable Iterator</em></a></li>
|
||||||
<li><a class="reference" href="SinglePassIterator.html"><em>Single Pass Iterator</em></a></li>
|
<li><a class="reference external" href="SinglePassIterator.html"><em>Single Pass Iterator</em></a></li>
|
||||||
<li><a class="reference" href="ForwardTraversal.html"><em>Forward Traversal</em></a></li>
|
<li><a class="reference external" href="ForwardTraversal.html"><em>Forward Traversal</em></a></li>
|
||||||
<li><a class="reference" href="BidirectionalTraversal.html"><em>Bidirectional Traversal</em></a></li>
|
<li><a class="reference external" href="BidirectionalTraversal.html"><em>Bidirectional Traversal</em></a></li>
|
||||||
<li><a class="reference" href="RandomAccessTraversal.html"><em>Random Access Traversal</em></a></li>
|
<li><a class="reference external" href="RandomAccessTraversal.html"><em>Random Access Traversal</em></a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="iterator-concepts-hpp-synopsis">
|
<div class="section" id="iterator-concepts-hpp-synopsis">
|
||||||
<h2><a name="iterator-concepts-hpp-synopsis"><tt class="docutils literal"><span class="pre">iterator_concepts.hpp</span></tt> Synopsis</a></h2>
|
<h2><tt class="docutils literal"><span class="pre">iterator_concepts.hpp</span></tt> Synopsis</h2>
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
namespace boost_concepts {
|
namespace boost_concepts {
|
||||||
|
|
||||||
@@ -114,10 +117,11 @@ namespace boost_concepts {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr class="docutils footer" />
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<a class="reference" href="iterator_concepts.rst">View document source</a>.
|
<hr class="footer" />
|
||||||
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
<a class="reference external" href="iterator_concepts.rst">View document source</a>.
|
||||||
|
Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
0
doc/iterator_concepts.pdf
Executable file → Normal file
0
doc/iterator_concepts.pdf
Executable file → Normal file
5
doc/iterator_concepts.rst
Executable file → Normal file
5
doc/iterator_concepts.rst
Executable file → Normal file
@@ -1,4 +1,6 @@
|
|||||||
|
.. 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)
|
||||||
|
|
||||||
++++++++++++++++++
|
++++++++++++++++++
|
||||||
Iterator Concepts
|
Iterator Concepts
|
||||||
@@ -8,7 +10,6 @@
|
|||||||
:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com
|
:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@styleadvisor.com
|
||||||
:organization: `Boost Consulting`_, Indiana University `Open Systems
|
:organization: `Boost Consulting`_, Indiana University `Open Systems
|
||||||
Lab`_, `Zephyr Associates, Inc.`_
|
Lab`_, `Zephyr Associates, Inc.`_
|
||||||
:date: $Date$
|
|
||||||
:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2004.
|
:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2004.
|
||||||
|
|
||||||
.. _`Boost Consulting`: http://www.boost-consulting.com
|
.. _`Boost Consulting`: http://www.boost-consulting.com
|
||||||
|
|||||||
@@ -3,13 +3,13 @@
|
|||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
<meta name="generator" content="Docutils 0.3.8: http://docutils.sourceforge.net/" />
|
<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
|
||||||
<title>Iterator Facade</title>
|
<title>Iterator Facade</title>
|
||||||
<meta name="author" content="David Abrahams, Jeremy Siek, Thomas Witt" />
|
<meta name="author" content="David Abrahams, Jeremy Siek, Thomas Witt" />
|
||||||
<meta name="organization" content="Boost Consulting, Indiana University Open Systems Lab, University of Hanover Institute for Transport Railway Operation and Construction" />
|
<meta name="organization" content="Boost Consulting, Indiana University Open Systems Lab, University of Hanover Institute for Transport Railway Operation and Construction" />
|
||||||
<meta name="date" content="2004-11-01" />
|
<meta name="date" content="2006-09-11" />
|
||||||
<meta name="copyright" content="Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003." />
|
<meta name="copyright" content="Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003." />
|
||||||
<link rel="stylesheet" href="default.css" type="text/css" />
|
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="document" id="iterator-facade">
|
<div class="document" id="iterator-facade">
|
||||||
@@ -21,70 +21,79 @@
|
|||||||
<tr><th class="docinfo-name">Author:</th>
|
<tr><th class="docinfo-name">Author:</th>
|
||||||
<td>David Abrahams, Jeremy Siek, Thomas Witt</td></tr>
|
<td>David Abrahams, Jeremy Siek, Thomas Witt</td></tr>
|
||||||
<tr><th class="docinfo-name">Contact:</th>
|
<tr><th class="docinfo-name">Contact:</th>
|
||||||
<td><a class="first reference" href="mailto:dave@boost-consulting.com">dave@boost-consulting.com</a>, <a class="reference" href="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</a>, <a class="last reference" href="mailto:witt@ive.uni-hannover.de">witt@ive.uni-hannover.de</a></td></tr>
|
<td><a class="first reference external" href="mailto:dave@boost-consulting.com">dave@boost-consulting.com</a>, <a class="reference external" href="mailto:jsiek@osl.iu.edu">jsiek@osl.iu.edu</a>, <a class="last reference external" href="mailto:witt@ive.uni-hannover.de">witt@ive.uni-hannover.de</a></td></tr>
|
||||||
<tr><th class="docinfo-name">Organization:</th>
|
<tr><th class="docinfo-name">Organization:</th>
|
||||||
<td><a class="first reference" href="http://www.boost-consulting.com">Boost Consulting</a>, Indiana University <a class="reference" href="http://www.osl.iu.edu">Open Systems
|
<td><a class="first reference external" href="http://www.boost-consulting.com">Boost Consulting</a>, Indiana University <a class="reference external" href="http://www.osl.iu.edu">Open Systems
|
||||||
Lab</a>, University of Hanover <a class="last reference" href="http://www.ive.uni-hannover.de">Institute for Transport
|
Lab</a>, University of Hanover <a class="last reference external" href="http://www.ive.uni-hannover.de">Institute for Transport
|
||||||
Railway Operation and Construction</a></td></tr>
|
Railway Operation and Construction</a></td></tr>
|
||||||
<tr><th class="docinfo-name">Date:</th>
|
<tr><th class="docinfo-name">Date:</th>
|
||||||
<td>2004-11-01</td></tr>
|
<td>2006-09-11</td></tr>
|
||||||
<tr><th class="docinfo-name">Copyright:</th>
|
<tr><th class="docinfo-name">Copyright:</th>
|
||||||
<td>Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.</td></tr>
|
<td>Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.</td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
<!-- 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) -->
|
||||||
<table class="docutils field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">abstract:</th><td class="field-body"><tt class="docutils literal"><span class="pre">iterator_facade</span></tt> is a base class template that implements the
|
<tr class="field"><th class="field-name">abstract:</th><td class="field-body"><!-- Copyright David Abrahams 2006. 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) -->
|
||||||
|
<tt class="docutils literal"><span class="pre">iterator_facade</span></tt> is a base class template that implements the
|
||||||
interface of standard iterators in terms of a few core functions
|
interface of standard iterators in terms of a few core functions
|
||||||
and associated types, to be supplied by a derived iterator class.</td>
|
and associated types, to be supplied by a derived iterator class.</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<div class="contents topic" id="table-of-contents">
|
<div class="contents topic" id="table-of-contents">
|
||||||
<p class="topic-title first"><a name="table-of-contents">Table of Contents</a></p>
|
<p class="topic-title first">Table of Contents</p>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><a class="reference" href="#overview" id="id23" name="id23">Overview</a><ul>
|
<li><a class="reference internal" href="#overview" id="id23">Overview</a><ul>
|
||||||
<li><a class="reference" href="#usage" id="id24" name="id24">Usage</a></li>
|
<li><a class="reference internal" href="#usage" id="id24">Usage</a></li>
|
||||||
<li><a class="reference" href="#iterator-core-access" id="id25" name="id25">Iterator Core Access</a></li>
|
<li><a class="reference internal" href="#iterator-core-access" id="id25">Iterator Core Access</a></li>
|
||||||
<li><a class="reference" href="#operator" id="id26" name="id26"><tt class="docutils literal"><span class="pre">operator[]</span></tt></a></li>
|
<li><a class="reference internal" href="#operator" id="id26"><tt class="docutils literal"><span class="pre">operator[]</span></tt></a></li>
|
||||||
<li><a class="reference" href="#id2" id="id27" name="id27"><tt class="docutils literal"><span class="pre">operator-></span></tt></a></li>
|
<li><a class="reference internal" href="#id2" id="id27"><tt class="docutils literal"><span class="pre">operator-></span></tt></a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a class="reference" href="#reference" id="id28" name="id28">Reference</a><ul>
|
<li><a class="reference internal" href="#reference" id="id28">Reference</a><ul>
|
||||||
<li><a class="reference" href="#iterator-facade-requirements" id="id29" name="id29"><tt class="docutils literal"><span class="pre">iterator_facade</span></tt> Requirements</a></li>
|
<li><a class="reference internal" href="#iterator-facade-requirements" id="id29"><tt class="docutils literal"><span class="pre">iterator_facade</span></tt> Requirements</a></li>
|
||||||
<li><a class="reference" href="#iterator-facade-operations" id="id30" name="id30"><tt class="docutils literal"><span class="pre">iterator_facade</span></tt> operations</a></li>
|
<li><a class="reference internal" href="#iterator-facade-operations" id="id30"><tt class="docutils literal"><span class="pre">iterator_facade</span></tt> operations</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a class="reference" href="#tutorial-example" id="id31" name="id31">Tutorial Example</a><ul>
|
<li><a class="reference internal" href="#tutorial-example" id="id31">Tutorial Example</a><ul>
|
||||||
<li><a class="reference" href="#the-problem" id="id32" name="id32">The Problem</a></li>
|
<li><a class="reference internal" href="#the-problem" id="id32">The Problem</a></li>
|
||||||
<li><a class="reference" href="#a-basic-iterator-using-iterator-facade" id="id33" name="id33">A Basic Iterator Using <tt class="docutils literal"><span class="pre">iterator_facade</span></tt></a><ul>
|
<li><a class="reference internal" href="#a-basic-iterator-using-iterator-facade" id="id33">A Basic Iterator Using <tt class="docutils literal"><span class="pre">iterator_facade</span></tt></a><ul>
|
||||||
<li><a class="reference" href="#template-arguments-for-iterator-facade" id="id34" name="id34">Template Arguments for <tt class="docutils literal"><span class="pre">iterator_facade</span></tt></a><ul>
|
<li><a class="reference internal" href="#template-arguments-for-iterator-facade" id="id34">Template Arguments for <tt class="docutils literal"><span class="pre">iterator_facade</span></tt></a><ul>
|
||||||
<li><a class="reference" href="#derived" id="id35" name="id35"><tt class="docutils literal"><span class="pre">Derived</span></tt></a></li>
|
<li><a class="reference internal" href="#derived" id="id35"><tt class="docutils literal"><span class="pre">Derived</span></tt></a></li>
|
||||||
<li><a class="reference" href="#value" id="id36" name="id36"><tt class="docutils literal"><span class="pre">Value</span></tt></a></li>
|
<li><a class="reference internal" href="#value" id="id36"><tt class="docutils literal"><span class="pre">Value</span></tt></a></li>
|
||||||
<li><a class="reference" href="#categoryortraversal" id="id37" name="id37"><tt class="docutils literal"><span class="pre">CategoryOrTraversal</span></tt></a></li>
|
<li><a class="reference internal" href="#categoryortraversal" id="id37"><tt class="docutils literal"><span class="pre">CategoryOrTraversal</span></tt></a></li>
|
||||||
<li><a class="reference" href="#id12" id="id38" name="id38"><tt class="docutils literal"><span class="pre">Reference</span></tt></a></li>
|
<li><a class="reference internal" href="#id12" id="id38"><tt class="docutils literal"><span class="pre">Reference</span></tt></a></li>
|
||||||
<li><a class="reference" href="#difference" id="id39" name="id39"><tt class="docutils literal"><span class="pre">Difference</span></tt></a></li>
|
<li><a class="reference internal" href="#difference" id="id39"><tt class="docutils literal"><span class="pre">Difference</span></tt></a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a class="reference" href="#constructors-and-data-members" id="id40" name="id40">Constructors and Data Members</a></li>
|
<li><a class="reference internal" href="#constructors-and-data-members" id="id40">Constructors and Data Members</a></li>
|
||||||
<li><a class="reference" href="#implementing-the-core-operations" id="id41" name="id41">Implementing the Core Operations</a></li>
|
<li><a class="reference internal" href="#implementing-the-core-operations" id="id41">Implementing the Core Operations</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li><a class="reference" href="#a-constant-node-iterator" id="id42" name="id42">A constant <tt class="docutils literal"><span class="pre">node_iterator</span></tt></a></li>
|
<li><a class="reference internal" href="#a-constant-node-iterator" id="id42">A constant <tt class="docutils literal"><span class="pre">node_iterator</span></tt></a></li>
|
||||||
<li><a class="reference" href="#interoperability" id="id43" name="id43">Interoperability</a></li>
|
<li><a class="reference internal" href="#interoperability" id="id43">Interoperability</a></li>
|
||||||
<li><a class="reference" href="#telling-the-truth" id="id44" name="id44">Telling the Truth</a></li>
|
<li><a class="reference internal" href="#telling-the-truth" id="id44">Telling the Truth</a></li>
|
||||||
<li><a class="reference" href="#wrap-up" id="id45" name="id45">Wrap Up</a></li>
|
<li><a class="reference internal" href="#wrap-up" id="id45">Wrap Up</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="overview">
|
<div class="section" id="overview">
|
||||||
<h1><a class="toc-backref" href="#id23" name="overview">Overview</a></h1>
|
<h1><a class="toc-backref" href="#id23">Overview</a></h1>
|
||||||
|
<!-- 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) -->
|
||||||
<!-- Version 1.1 of this ReStructuredText document corresponds to
|
<!-- Version 1.1 of this ReStructuredText document corresponds to
|
||||||
n1530_, the paper accepted by the LWG for TR1. -->
|
n1530_, the paper accepted by the LWG for TR1. -->
|
||||||
<!-- Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. -->
|
<!-- Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. -->
|
||||||
<p>While the iterator interface is rich, there is a core subset of the
|
<p>While the iterator interface is rich, there is a core subset of the
|
||||||
interface that is necessary for all the functionality. We have
|
interface that is necessary for all the functionality. We have
|
||||||
identified the following core behaviors for iterators:</p>
|
identified the following core behaviors for iterators:</p>
|
||||||
@@ -101,7 +110,7 @@ include the associated types exposed through iterator traits:
|
|||||||
<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">difference_type</span></tt>, and
|
<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">difference_type</span></tt>, and
|
||||||
<tt class="docutils literal"><span class="pre">iterator_category</span></tt>.</p>
|
<tt class="docutils literal"><span class="pre">iterator_category</span></tt>.</p>
|
||||||
<p>Iterator facade uses the Curiously Recurring Template
|
<p>Iterator facade uses the Curiously Recurring Template
|
||||||
Pattern (CRTP) <a class="citation-reference" href="#cop95" id="id1" name="id1">[Cop95]</a> so that the user can specify the behavior
|
Pattern (CRTP) <a class="citation-reference" href="#cop95" id="id1">[Cop95]</a> so that the user can specify the behavior
|
||||||
of <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> in a derived class. Former designs used
|
of <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> in a derived class. Former designs used
|
||||||
policy objects to specify the behavior, but that approach was
|
policy objects to specify the behavior, but that approach was
|
||||||
discarded for several reasons:</p>
|
discarded for several reasons:</p>
|
||||||
@@ -125,7 +134,7 @@ impossible.</li>
|
|||||||
</ol>
|
</ol>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
<div class="section" id="usage">
|
<div class="section" id="usage">
|
||||||
<h2><a class="toc-backref" href="#id24" name="usage">Usage</a></h2>
|
<h2><a class="toc-backref" href="#id24">Usage</a></h2>
|
||||||
<p>The user of <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> derives his iterator class from a
|
<p>The user of <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> derives his iterator class from a
|
||||||
specialization of <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> and passes the derived
|
specialization of <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> and passes the derived
|
||||||
iterator class as <tt class="docutils literal"><span class="pre">iterator_facade</span></tt>'s first template parameter.
|
iterator class as <tt class="docutils literal"><span class="pre">iterator_facade</span></tt>'s first template parameter.
|
||||||
@@ -148,8 +157,8 @@ requirements.</p>
|
|||||||
<col width="56%" />
|
<col width="56%" />
|
||||||
</colgroup>
|
</colgroup>
|
||||||
<thead valign="bottom">
|
<thead valign="bottom">
|
||||||
<tr><th>Expression</th>
|
<tr><th class="head">Expression</th>
|
||||||
<th>Effects</th>
|
<th class="head">Effects</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
@@ -189,7 +198,7 @@ Iterator or a more-refined iterator concept, a default constructor is
|
|||||||
required.</p>
|
required.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="iterator-core-access">
|
<div class="section" id="iterator-core-access">
|
||||||
<h2><a class="toc-backref" href="#id25" name="iterator-core-access">Iterator Core Access</a></h2>
|
<h2><a class="toc-backref" href="#id25">Iterator Core Access</a></h2>
|
||||||
<p><tt class="docutils literal"><span class="pre">iterator_facade</span></tt> and the operator implementations need to be able
|
<p><tt class="docutils literal"><span class="pre">iterator_facade</span></tt> and the operator implementations need to be able
|
||||||
to access the core member functions in the derived class. Making the
|
to access the core member functions in the derived class. Making the
|
||||||
core member functions public would expose an implementation detail to
|
core member functions public would expose an implementation detail to
|
||||||
@@ -212,7 +221,7 @@ provided, a class that acts as a gateway to the core member functions
|
|||||||
in the derived iterator class. The author of the derived class only
|
in the derived iterator class. The author of the derived class only
|
||||||
needs to grant friendship to <tt class="docutils literal"><span class="pre">iterator_core_access</span></tt> to make his core
|
needs to grant friendship to <tt class="docutils literal"><span class="pre">iterator_core_access</span></tt> to make his core
|
||||||
member functions available to the library.</p>
|
member functions available to the library.</p>
|
||||||
<!-- This is no long uptodate -thw -->
|
<!-- This is no long uptodate -thw -->
|
||||||
<!-- Yes it is; I made sure of it! -DWA -->
|
<!-- Yes it is; I made sure of it! -DWA -->
|
||||||
<p><tt class="docutils literal"><span class="pre">iterator_core_access</span></tt> will be typically implemented as an empty
|
<p><tt class="docutils literal"><span class="pre">iterator_core_access</span></tt> will be typically implemented as an empty
|
||||||
class containing only private static member functions which invoke the
|
class containing only private static member functions which invoke the
|
||||||
@@ -223,18 +232,18 @@ open a safety loophole, as every core member function preserves the
|
|||||||
invariants of the iterator.</p>
|
invariants of the iterator.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="operator">
|
<div class="section" id="operator">
|
||||||
<h2><a class="toc-backref" href="#id26" name="operator"><tt class="docutils literal"><span class="pre">operator[]</span></tt></a></h2>
|
<h2><a class="toc-backref" href="#id26"><tt class="docutils literal"><span class="pre">operator[]</span></tt></a></h2>
|
||||||
<p>The indexing operator for a generalized iterator presents special
|
<p>The indexing operator for a generalized iterator presents special
|
||||||
challenges. A random access iterator's <tt class="docutils literal"><span class="pre">operator[]</span></tt> is only
|
challenges. A random access iterator's <tt class="docutils literal"><span class="pre">operator[]</span></tt> is only
|
||||||
required to return something convertible to its <tt class="docutils literal"><span class="pre">value_type</span></tt>.
|
required to return something convertible to its <tt class="docutils literal"><span class="pre">value_type</span></tt>.
|
||||||
Requiring that it return an lvalue would rule out currently-legal
|
Requiring that it return an lvalue would rule out currently-legal
|
||||||
random-access iterators which hold the referenced value in a data
|
random-access iterators which hold the referenced value in a data
|
||||||
member (e.g. <a class="reference" href="counting_iterator.html"><tt class="docutils literal"><span class="pre">counting_iterator</span></tt></a>), because <tt class="docutils literal"><span class="pre">*(p+n)</span></tt> is a reference
|
member (e.g. <a class="reference external" href="counting_iterator.html"><tt class="docutils literal"><span class="pre">counting_iterator</span></tt></a>), because <tt class="docutils literal"><span class="pre">*(p+n)</span></tt> is a reference
|
||||||
into the temporary iterator <tt class="docutils literal"><span class="pre">p+n</span></tt>, which is destroyed when
|
into the temporary iterator <tt class="docutils literal"><span class="pre">p+n</span></tt>, which is destroyed when
|
||||||
<tt class="docutils literal"><span class="pre">operator[]</span></tt> returns.</p>
|
<tt class="docutils literal"><span class="pre">operator[]</span></tt> returns.</p>
|
||||||
<p>Writable iterators built with <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> implement the
|
<p>Writable iterators built with <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> implement the
|
||||||
semantics required by the preferred resolution to <a class="reference" href="http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-active.html#299">issue 299</a> and
|
semantics required by the preferred resolution to <a class="reference external" href="http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#299">issue 299</a> and
|
||||||
adopted by proposal <a class="reference" href="http://www.open-std.org/jtc1/sc22/WG21/docs/papers/2003/n1550.htm">n1550</a>: the result of <tt class="docutils literal"><span class="pre">p[n]</span></tt> is an object
|
adopted by proposal <a class="reference external" href="http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2003/n1550.htm">n1550</a>: the result of <tt class="docutils literal"><span class="pre">p[n]</span></tt> is an object
|
||||||
convertible to the iterator's <tt class="docutils literal"><span class="pre">value_type</span></tt>, and <tt class="docutils literal"><span class="pre">p[n]</span> <span class="pre">=</span> <span class="pre">x</span></tt> is
|
convertible to the iterator's <tt class="docutils literal"><span class="pre">value_type</span></tt>, and <tt class="docutils literal"><span class="pre">p[n]</span> <span class="pre">=</span> <span class="pre">x</span></tt> is
|
||||||
equivalent to <tt class="docutils literal"><span class="pre">*(p</span> <span class="pre">+</span> <span class="pre">n)</span> <span class="pre">=</span> <span class="pre">x</span></tt> (Note: This result object may be
|
equivalent to <tt class="docutils literal"><span class="pre">*(p</span> <span class="pre">+</span> <span class="pre">n)</span> <span class="pre">=</span> <span class="pre">x</span></tt> (Note: This result object may be
|
||||||
implemented as a proxy containing a copy of <tt class="docutils literal"><span class="pre">p+n</span></tt>). This approach
|
implemented as a proxy containing a copy of <tt class="docutils literal"><span class="pre">p+n</span></tt>). This approach
|
||||||
@@ -244,9 +253,9 @@ the implementation of her iterator is free to implement an
|
|||||||
<tt class="docutils literal"><span class="pre">operator[]</span></tt> that returns an lvalue in the derived iterator
|
<tt class="docutils literal"><span class="pre">operator[]</span></tt> that returns an lvalue in the derived iterator
|
||||||
class; it will hide the one supplied by <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> from
|
class; it will hide the one supplied by <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> from
|
||||||
clients of her iterator.</p>
|
clients of her iterator.</p>
|
||||||
<a class="target" id="operator-arrow" name="operator-arrow"></a></div>
|
</div>
|
||||||
<div class="section" id="id2">
|
<div class="section" id="id2">
|
||||||
<h2><a class="toc-backref" href="#id27" name="id2"><tt class="docutils literal"><span class="pre">operator-></span></tt></a></h2>
|
<span id="operator-arrow"></span><h2><a class="toc-backref" href="#id27"><tt class="docutils literal"><span class="pre">operator-></span></tt></a></h2>
|
||||||
<p>The <tt class="docutils literal"><span class="pre">reference</span></tt> type of a readable iterator (and today's input
|
<p>The <tt class="docutils literal"><span class="pre">reference</span></tt> type of a readable iterator (and today's input
|
||||||
iterator) need not in fact be a reference, so long as it is
|
iterator) need not in fact be a reference, so long as it is
|
||||||
convertible to the iterator's <tt class="docutils literal"><span class="pre">value_type</span></tt>. When the <tt class="docutils literal"><span class="pre">value_type</span></tt>
|
convertible to the iterator's <tt class="docutils literal"><span class="pre">value_type</span></tt>. When the <tt class="docutils literal"><span class="pre">value_type</span></tt>
|
||||||
@@ -261,17 +270,20 @@ satisfied by the <tt class="docutils literal"><span class="pre">iterator_facade<
|
|||||||
<table class="docutils citation" frame="void" id="cop95" rules="none">
|
<table class="docutils citation" frame="void" id="cop95" rules="none">
|
||||||
<colgroup><col class="label" /><col /></colgroup>
|
<colgroup><col class="label" /><col /></colgroup>
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr><td class="label"><a name="cop95">[Cop95]</a></td><td><em>(<a class="fn-backref" href="#id1">1</a>, <a class="fn-backref" href="#id10">2</a>)</em> [Coplien, 1995] Coplien, J., Curiously Recurring Template
|
<tr><td class="label">[Cop95]</td><td><em>(<a class="fn-backref" href="#id1">1</a>, <a class="fn-backref" href="#id10">2</a>)</em> [Coplien, 1995] Coplien, J., Curiously Recurring Template
|
||||||
Patterns, C++ Report, February 1995, pp. 24-27.</td></tr>
|
Patterns, C++ Report, February 1995, pp. 24-27.</td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="reference">
|
<div class="section" id="reference">
|
||||||
<h1><a class="toc-backref" href="#id28" name="reference">Reference</a></h1>
|
<h1><a class="toc-backref" href="#id28">Reference</a></h1>
|
||||||
|
<!-- 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) -->
|
||||||
<!-- Version 1.3 of this ReStructuredText document corresponds to
|
<!-- Version 1.3 of this ReStructuredText document corresponds to
|
||||||
n1530_, the paper accepted by the LWG for TR1. -->
|
n1530_, the paper accepted by the LWG for TR1. -->
|
||||||
<!-- Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. -->
|
<!-- Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. -->
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
template <
|
template <
|
||||||
class Derived
|
class Derived
|
||||||
@@ -286,11 +298,11 @@ class iterator_facade {
|
|||||||
typedef Reference reference;
|
typedef Reference reference;
|
||||||
typedef Value* pointer;
|
typedef Value* pointer;
|
||||||
typedef Difference difference_type;
|
typedef Difference difference_type;
|
||||||
typedef /* see <a class="reference" href="#iterator-category">below</a> */ iterator_category;
|
typedef /* see <a class="reference internal" href="#iterator-category">below</a> */ iterator_category;
|
||||||
|
|
||||||
reference operator*() const;
|
reference operator*() const;
|
||||||
/* see <a class="reference" href="#operator-arrow">below</a> */ operator->() const;
|
/* see <a class="reference internal" href="#operator-arrow">below</a> */ operator->() const;
|
||||||
/* see <a class="reference" href="#brackets">below</a> */ operator[](difference_type n) const;
|
/* see <a class="reference internal" href="#brackets">below</a> */ operator[](difference_type n) const;
|
||||||
Derived& operator++();
|
Derived& operator++();
|
||||||
Derived operator++(int);
|
Derived operator++(int);
|
||||||
Derived& operator--();
|
Derived& operator--();
|
||||||
@@ -342,7 +354,7 @@ operator >=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
|
|||||||
// Iterator difference
|
// Iterator difference
|
||||||
template <class Dr1, class V1, class TC1, class R1, class D1,
|
template <class Dr1, class V1, class TC1, class R1, class D1,
|
||||||
class Dr2, class V2, class TC2, class R2, class D2>
|
class Dr2, class V2, class TC2, class R2, class D2>
|
||||||
/* see <a class="reference" href="#minus">below</a> */
|
/* see <a class="reference internal" href="#minus">below</a> */
|
||||||
operator-(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
|
operator-(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
|
||||||
iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
|
iterator_facade<Dr2,V2,TC2,R2,D2> const& rhs);
|
||||||
|
|
||||||
@@ -355,12 +367,12 @@ template <class Dr, class V, class TC, class R, class D>
|
|||||||
Derived operator+ (typename Derived::difference_type n,
|
Derived operator+ (typename Derived::difference_type n,
|
||||||
iterator_facade<Dr,V,TC,R,D> const&);
|
iterator_facade<Dr,V,TC,R,D> const&);
|
||||||
</pre>
|
</pre>
|
||||||
<a class="target" id="iterator-category" name="iterator-category"></a><p>The <tt class="docutils literal"><span class="pre">iterator_category</span></tt> member of <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> is</p>
|
<p id="iterator-category">The <tt class="docutils literal"><span class="pre">iterator_category</span></tt> member of <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> is</p>
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
<em>iterator-category</em>(CategoryOrTraversal, value_type, reference)
|
<em>iterator-category</em>(CategoryOrTraversal, value_type, reference)
|
||||||
</pre>
|
</pre>
|
||||||
<p>where <em>iterator-category</em> is defined as follows:</p>
|
<p>where <em>iterator-category</em> is defined as follows:</p>
|
||||||
<a class="target" id="id7" name="id7"></a><pre class="literal-block">
|
<pre class="literal-block" id="id7">
|
||||||
<em>iterator-category</em>(C,R,V) :=
|
<em>iterator-category</em>(C,R,V) :=
|
||||||
if (C is convertible to std::input_iterator_tag
|
if (C is convertible to std::input_iterator_tag
|
||||||
|| C is convertible to std::output_iterator_tag
|
|| C is convertible to std::output_iterator_tag
|
||||||
@@ -394,7 +406,7 @@ Derived operator+ (typename Derived::difference_type n,
|
|||||||
X1 = C
|
X1 = C
|
||||||
}
|
}
|
||||||
|
|
||||||
2. <a class="reference" href="new-iter-concepts.html#category-to-traversal"><em>category-to-traversal</em></a>(X) is convertible to the most
|
2. <a class="reference external" href="new-iter-concepts.html#category-to-traversal"><em>category-to-traversal</em></a>(X) is convertible to the most
|
||||||
derived traversal tag type to which X is also
|
derived traversal tag type to which X is also
|
||||||
convertible, and not to any more-derived traversal tag
|
convertible, and not to any more-derived traversal tag
|
||||||
type.
|
type.
|
||||||
@@ -407,10 +419,10 @@ traversal tags would add no information]</p>
|
|||||||
<!-- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
|
<!-- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
|
||||||
<p>The <tt class="docutils literal"><span class="pre">enable_if_interoperable</span></tt> template used above is for exposition
|
<p>The <tt class="docutils literal"><span class="pre">enable_if_interoperable</span></tt> template used above is for exposition
|
||||||
purposes. The member operators should only be in an overload set
|
purposes. The member operators should only be in an overload set
|
||||||
provided the derived types <tt class="docutils literal"><span class="pre">Dr1</span></tt> and <tt class="docutils literal"><span class="pre">Dr2</span></tt> are interoperable,
|
provided the derived types <tt class="docutils literal"><span class="pre">Dr1</span></tt> and <tt class="docutils literal"><span class="pre">Dr2</span></tt> are interoperable,
|
||||||
meaning that at least one of the types is convertible to the other. The
|
meaning that at least one of the types is convertible to the other. The
|
||||||
<tt class="docutils literal"><span class="pre">enable_if_interoperable</span></tt> approach uses SFINAE to take the operators
|
<tt class="docutils literal"><span class="pre">enable_if_interoperable</span></tt> 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 <em>as-if</em> <tt class="docutils literal"><span class="pre">enable_if_interoperable</span></tt>
|
The operators should behave <em>as-if</em> <tt class="docutils literal"><span class="pre">enable_if_interoperable</span></tt>
|
||||||
were defined to be:</p>
|
were defined to be:</p>
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
@@ -429,7 +441,7 @@ struct enable_if_interoperable
|
|||||||
{};
|
{};
|
||||||
</pre>
|
</pre>
|
||||||
<div class="section" id="iterator-facade-requirements">
|
<div class="section" id="iterator-facade-requirements">
|
||||||
<h2><a class="toc-backref" href="#id29" name="iterator-facade-requirements"><tt class="docutils literal"><span class="pre">iterator_facade</span></tt> Requirements</a></h2>
|
<h2><a class="toc-backref" href="#id29"><tt class="docutils literal"><span class="pre">iterator_facade</span></tt> Requirements</a></h2>
|
||||||
<p>The following table describes the typical valid expressions on
|
<p>The following table describes the typical valid expressions on
|
||||||
<tt class="docutils literal"><span class="pre">iterator_facade</span></tt>'s <tt class="docutils literal"><span class="pre">Derived</span></tt> parameter, depending on the
|
<tt class="docutils literal"><span class="pre">iterator_facade</span></tt>'s <tt class="docutils literal"><span class="pre">Derived</span></tt> parameter, depending on the
|
||||||
iterator concept(s) it will model. The operations in the first
|
iterator concept(s) it will model. The operations in the first
|
||||||
@@ -442,7 +454,7 @@ object of type <tt class="docutils literal"><span class="pre">X</span></tt>, <tt
|
|||||||
object of a single pass iterator type interoperable with <tt class="docutils literal"><span class="pre">X</span></tt>, and <tt class="docutils literal"><span class="pre">z</span></tt>
|
object of a single pass iterator type interoperable with <tt class="docutils literal"><span class="pre">X</span></tt>, and <tt class="docutils literal"><span class="pre">z</span></tt>
|
||||||
is a constant object of a random access traversal iterator type
|
is a constant object of a random access traversal iterator type
|
||||||
interoperable with <tt class="docutils literal"><span class="pre">X</span></tt>.</p>
|
interoperable with <tt class="docutils literal"><span class="pre">X</span></tt>.</p>
|
||||||
<a class="target" id="core-operations" name="core-operations"></a><div class="topic">
|
<div class="topic" id="core-operations">
|
||||||
<p class="topic-title first"><tt class="docutils literal"><span class="pre">iterator_facade</span></tt> Core Operations</p>
|
<p class="topic-title first"><tt class="docutils literal"><span class="pre">iterator_facade</span></tt> Core Operations</p>
|
||||||
<table border="1" class="docutils">
|
<table border="1" class="docutils">
|
||||||
<colgroup>
|
<colgroup>
|
||||||
@@ -452,10 +464,10 @@ interoperable with <tt class="docutils literal"><span class="pre">X</span></tt>.
|
|||||||
<col width="29%" />
|
<col width="29%" />
|
||||||
</colgroup>
|
</colgroup>
|
||||||
<thead valign="bottom">
|
<thead valign="bottom">
|
||||||
<tr><th>Expression</th>
|
<tr><th class="head">Expression</th>
|
||||||
<th>Return Type</th>
|
<th class="head">Return Type</th>
|
||||||
<th>Assertion/Note</th>
|
<th class="head">Assertion/Note</th>
|
||||||
<th>Used to implement Iterator
|
<th class="head">Used to implement Iterator
|
||||||
Concept(s)</th>
|
Concept(s)</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
@@ -503,7 +515,7 @@ Iterator</td>
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="iterator-facade-operations">
|
<div class="section" id="iterator-facade-operations">
|
||||||
<h2><a class="toc-backref" href="#id30" name="iterator-facade-operations"><tt class="docutils literal"><span class="pre">iterator_facade</span></tt> operations</a></h2>
|
<h2><a class="toc-backref" href="#id30"><tt class="docutils literal"><span class="pre">iterator_facade</span></tt> operations</a></h2>
|
||||||
<p>The operations in this section are described in terms of operations on
|
<p>The operations in this section are described in terms of operations on
|
||||||
the core interface of <tt class="docutils literal"><span class="pre">Derived</span></tt> which may be inaccessible
|
the core interface of <tt class="docutils literal"><span class="pre">Derived</span></tt> which may be inaccessible
|
||||||
(i.e. private). The implementation should access these operations
|
(i.e. private). The implementation should access these operations
|
||||||
@@ -517,7 +529,7 @@ through member functions of class <tt class="docutils literal"><span class="pre"
|
|||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<p><tt class="docutils literal"><span class="pre">operator->()</span> <span class="pre">const;</span></tt> (see <a class="reference" href="#operator-arrow">below</a>)</p>
|
<p><tt class="docutils literal"><span class="pre">operator->()</span> <span class="pre">const;</span></tt> (see <a class="reference internal" href="#operator-arrow">below</a>)</p>
|
||||||
<table class="docutils field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
@@ -527,14 +539,14 @@ of type <tt class="docutils literal"><span class="pre">pointer</span></tt> equal
|
|||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
&static_cast<Derived const*>(this)->dereference()
|
&static_cast<Derived const*>(this)->dereference()
|
||||||
</pre>
|
</pre>
|
||||||
<p class="last">Otherwise returns an object of unspecified type such that,
|
<p class="last">Otherwise returns an object of unspecified type such that,
|
||||||
<tt class="docutils literal"><span class="pre">(*static_cast<Derived</span> <span class="pre">const*>(this))->m</span></tt> is equivalent to <tt class="docutils literal"><span class="pre">(w</span> <span class="pre">=</span> <span class="pre">**static_cast<Derived</span> <span class="pre">const*>(this),</span>
|
<tt class="docutils literal"><span class="pre">(*static_cast<Derived</span> <span class="pre">const*>(this))->m</span></tt> is equivalent to <tt class="docutils literal"><span class="pre">(w</span> <span class="pre">=</span> <span class="pre">**static_cast<Derived</span> <span class="pre">const*>(this),</span>
|
||||||
<span class="pre">w.m)</span></tt> for some temporary object <tt class="docutils literal"><span class="pre">w</span></tt> of type <tt class="docutils literal"><span class="pre">value_type</span></tt>.</p>
|
<span class="pre">w.m)</span></tt> for some temporary object <tt class="docutils literal"><span class="pre">w</span></tt> of type <tt class="docutils literal"><span class="pre">value_type</span></tt>.</p>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<a class="target" id="brackets" name="brackets"></a><p><em>unspecified</em> <tt class="docutils literal"><span class="pre">operator[](difference_type</span> <span class="pre">n)</span> <span class="pre">const;</span></tt></p>
|
<p id="brackets"><em>unspecified</em> <tt class="docutils literal"><span class="pre">operator[](difference_type</span> <span class="pre">n)</span> <span class="pre">const;</span></tt></p>
|
||||||
<table class="docutils field-list" frame="void" rules="none">
|
<table class="docutils field-list" frame="void" rules="none">
|
||||||
<col class="field-name" />
|
<col class="field-name" />
|
||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
@@ -675,10 +687,12 @@ operator ==(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
|
|||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">if <tt class="docutils literal"><span class="pre">is_convertible<Dr2,Dr1>::value</span></tt></p>
|
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">if <tt class="docutils literal"><span class="pre">is_convertible<Dr2,Dr1>::value</span></tt></p>
|
||||||
<dl class="last docutils">
|
<dl class="last docutils">
|
||||||
<dt>then </dt>
|
<dt>then</dt>
|
||||||
<dd><tt class="docutils literal"><span class="pre">((Dr1</span> <span class="pre">const&)lhs).equal((Dr2</span> <span class="pre">const&)rhs)</span></tt>.</dd>
|
<dd><p class="first last"><tt class="docutils literal"><span class="pre">((Dr1</span> <span class="pre">const&)lhs).equal((Dr2</span> <span class="pre">const&)rhs)</span></tt>.</p>
|
||||||
<dt>Otherwise, </dt>
|
</dd>
|
||||||
<dd><tt class="docutils literal"><span class="pre">((Dr2</span> <span class="pre">const&)rhs).equal((Dr1</span> <span class="pre">const&)lhs)</span></tt>.</dd>
|
<dt>Otherwise,</dt>
|
||||||
|
<dd><p class="first last"><tt class="docutils literal"><span class="pre">((Dr2</span> <span class="pre">const&)rhs).equal((Dr1</span> <span class="pre">const&)lhs)</span></tt>.</p>
|
||||||
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -697,10 +711,12 @@ operator !=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
|
|||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">if <tt class="docutils literal"><span class="pre">is_convertible<Dr2,Dr1>::value</span></tt></p>
|
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">if <tt class="docutils literal"><span class="pre">is_convertible<Dr2,Dr1>::value</span></tt></p>
|
||||||
<dl class="last docutils">
|
<dl class="last docutils">
|
||||||
<dt>then </dt>
|
<dt>then</dt>
|
||||||
<dd><tt class="docutils literal"><span class="pre">!((Dr1</span> <span class="pre">const&)lhs).equal((Dr2</span> <span class="pre">const&)rhs)</span></tt>.</dd>
|
<dd><p class="first last"><tt class="docutils literal"><span class="pre">!((Dr1</span> <span class="pre">const&)lhs).equal((Dr2</span> <span class="pre">const&)rhs)</span></tt>.</p>
|
||||||
<dt>Otherwise, </dt>
|
</dd>
|
||||||
<dd><tt class="docutils literal"><span class="pre">!((Dr2</span> <span class="pre">const&)rhs).equal((Dr1</span> <span class="pre">const&)lhs)</span></tt>.</dd>
|
<dt>Otherwise,</dt>
|
||||||
|
<dd><p class="first last"><tt class="docutils literal"><span class="pre">!((Dr2</span> <span class="pre">const&)rhs).equal((Dr1</span> <span class="pre">const&)lhs)</span></tt>.</p>
|
||||||
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -719,10 +735,12 @@ operator <(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
|
|||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">if <tt class="docutils literal"><span class="pre">is_convertible<Dr2,Dr1>::value</span></tt></p>
|
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">if <tt class="docutils literal"><span class="pre">is_convertible<Dr2,Dr1>::value</span></tt></p>
|
||||||
<dl class="last docutils">
|
<dl class="last docutils">
|
||||||
<dt>then </dt>
|
<dt>then</dt>
|
||||||
<dd><tt class="docutils literal"><span class="pre">((Dr1</span> <span class="pre">const&)lhs).distance_to((Dr2</span> <span class="pre">const&)rhs)</span> <span class="pre"><</span> <span class="pre">0</span></tt>.</dd>
|
<dd><p class="first last"><tt class="docutils literal"><span class="pre">((Dr1</span> <span class="pre">const&)lhs).distance_to((Dr2</span> <span class="pre">const&)rhs)</span> <span class="pre"><</span> <span class="pre">0</span></tt>.</p>
|
||||||
<dt>Otherwise, </dt>
|
</dd>
|
||||||
<dd><tt class="docutils literal"><span class="pre">((Dr2</span> <span class="pre">const&)rhs).distance_to((Dr1</span> <span class="pre">const&)lhs)</span> <span class="pre">></span> <span class="pre">0</span></tt>.</dd>
|
<dt>Otherwise,</dt>
|
||||||
|
<dd><p class="first last"><tt class="docutils literal"><span class="pre">((Dr2</span> <span class="pre">const&)rhs).distance_to((Dr1</span> <span class="pre">const&)lhs)</span> <span class="pre">></span> <span class="pre">0</span></tt>.</p>
|
||||||
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -741,10 +759,12 @@ operator <=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
|
|||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">if <tt class="docutils literal"><span class="pre">is_convertible<Dr2,Dr1>::value</span></tt></p>
|
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">if <tt class="docutils literal"><span class="pre">is_convertible<Dr2,Dr1>::value</span></tt></p>
|
||||||
<dl class="last docutils">
|
<dl class="last docutils">
|
||||||
<dt>then </dt>
|
<dt>then</dt>
|
||||||
<dd><tt class="docutils literal"><span class="pre">((Dr1</span> <span class="pre">const&)lhs).distance_to((Dr2</span> <span class="pre">const&)rhs)</span> <span class="pre"><=</span> <span class="pre">0</span></tt>.</dd>
|
<dd><p class="first last"><tt class="docutils literal"><span class="pre">((Dr1</span> <span class="pre">const&)lhs).distance_to((Dr2</span> <span class="pre">const&)rhs)</span> <span class="pre"><=</span> <span class="pre">0</span></tt>.</p>
|
||||||
<dt>Otherwise, </dt>
|
</dd>
|
||||||
<dd><tt class="docutils literal"><span class="pre">((Dr2</span> <span class="pre">const&)rhs).distance_to((Dr1</span> <span class="pre">const&)lhs)</span> <span class="pre">>=</span> <span class="pre">0</span></tt>.</dd>
|
<dt>Otherwise,</dt>
|
||||||
|
<dd><p class="first last"><tt class="docutils literal"><span class="pre">((Dr2</span> <span class="pre">const&)rhs).distance_to((Dr1</span> <span class="pre">const&)lhs)</span> <span class="pre">>=</span> <span class="pre">0</span></tt>.</p>
|
||||||
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -763,10 +783,12 @@ operator >(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
|
|||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">if <tt class="docutils literal"><span class="pre">is_convertible<Dr2,Dr1>::value</span></tt></p>
|
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">if <tt class="docutils literal"><span class="pre">is_convertible<Dr2,Dr1>::value</span></tt></p>
|
||||||
<dl class="last docutils">
|
<dl class="last docutils">
|
||||||
<dt>then </dt>
|
<dt>then</dt>
|
||||||
<dd><tt class="docutils literal"><span class="pre">((Dr1</span> <span class="pre">const&)lhs).distance_to((Dr2</span> <span class="pre">const&)rhs)</span> <span class="pre">></span> <span class="pre">0</span></tt>.</dd>
|
<dd><p class="first last"><tt class="docutils literal"><span class="pre">((Dr1</span> <span class="pre">const&)lhs).distance_to((Dr2</span> <span class="pre">const&)rhs)</span> <span class="pre">></span> <span class="pre">0</span></tt>.</p>
|
||||||
<dt>Otherwise, </dt>
|
</dd>
|
||||||
<dd><tt class="docutils literal"><span class="pre">((Dr2</span> <span class="pre">const&)rhs).distance_to((Dr1</span> <span class="pre">const&)lhs)</span> <span class="pre"><</span> <span class="pre">0</span></tt>.</dd>
|
<dt>Otherwise,</dt>
|
||||||
|
<dd><p class="first last"><tt class="docutils literal"><span class="pre">((Dr2</span> <span class="pre">const&)rhs).distance_to((Dr1</span> <span class="pre">const&)lhs)</span> <span class="pre"><</span> <span class="pre">0</span></tt>.</p>
|
||||||
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -785,16 +807,18 @@ operator >=(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
|
|||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">if <tt class="docutils literal"><span class="pre">is_convertible<Dr2,Dr1>::value</span></tt></p>
|
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">if <tt class="docutils literal"><span class="pre">is_convertible<Dr2,Dr1>::value</span></tt></p>
|
||||||
<dl class="last docutils">
|
<dl class="last docutils">
|
||||||
<dt>then </dt>
|
<dt>then</dt>
|
||||||
<dd><tt class="docutils literal"><span class="pre">((Dr1</span> <span class="pre">const&)lhs).distance_to((Dr2</span> <span class="pre">const&)rhs)</span> <span class="pre">>=</span> <span class="pre">0</span></tt>.</dd>
|
<dd><p class="first last"><tt class="docutils literal"><span class="pre">((Dr1</span> <span class="pre">const&)lhs).distance_to((Dr2</span> <span class="pre">const&)rhs)</span> <span class="pre">>=</span> <span class="pre">0</span></tt>.</p>
|
||||||
<dt>Otherwise, </dt>
|
</dd>
|
||||||
<dd><tt class="docutils literal"><span class="pre">((Dr2</span> <span class="pre">const&)rhs).distance_to((Dr1</span> <span class="pre">const&)lhs)</span> <span class="pre"><=</span> <span class="pre">0</span></tt>.</dd>
|
<dt>Otherwise,</dt>
|
||||||
|
<dd><p class="first last"><tt class="docutils literal"><span class="pre">((Dr2</span> <span class="pre">const&)rhs).distance_to((Dr1</span> <span class="pre">const&)lhs)</span> <span class="pre"><=</span> <span class="pre">0</span></tt>.</p>
|
||||||
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<a class="target" id="minus" name="minus"></a><pre class="literal-block">
|
<pre class="literal-block" id="minus">
|
||||||
template <class Dr1, class V1, class TC1, class R1, class D1,
|
template <class Dr1, class V1, class TC1, class R1, class D1,
|
||||||
class Dr2, class V2, class TC2, class R2, class D2>
|
class Dr2, class V2, class TC2, class R2, class D2>
|
||||||
typename enable_if_interoperable<Dr1,Dr2,difference>::type
|
typename enable_if_interoperable<Dr1,Dr2,difference>::type
|
||||||
@@ -806,23 +830,27 @@ operator -(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
|
|||||||
<col class="field-body" />
|
<col class="field-body" />
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr class="field"><th class="field-name">Return Type:</th><td class="field-body"><p class="first">if <tt class="docutils literal"><span class="pre">is_convertible<Dr2,Dr1>::value</span></tt></p>
|
<tr class="field"><th class="field-name">Return Type:</th><td class="field-body"><p class="first">if <tt class="docutils literal"><span class="pre">is_convertible<Dr2,Dr1>::value</span></tt></p>
|
||||||
<blockquote class="last">
|
<blockquote>
|
||||||
<dl class="docutils">
|
<dl class="docutils">
|
||||||
<dt>then </dt>
|
<dt>then</dt>
|
||||||
<dd><tt class="docutils literal"><span class="pre">difference</span></tt> shall be
|
<dd><p class="first last"><tt class="docutils literal"><span class="pre">difference</span></tt> shall be
|
||||||
<tt class="docutils literal"><span class="pre">iterator_traits<Dr1>::difference_type</span></tt>.</dd>
|
<tt class="docutils literal"><span class="pre">iterator_traits<Dr1>::difference_type</span></tt>.</p>
|
||||||
<dt>Otherwise </dt>
|
</dd>
|
||||||
<dd><tt class="docutils literal"><span class="pre">difference</span></tt> shall be <tt class="docutils literal"><span class="pre">iterator_traits<Dr2>::difference_type</span></tt></dd>
|
<dt>Otherwise</dt>
|
||||||
|
<dd><p class="first last"><tt class="docutils literal"><span class="pre">difference</span></tt> shall be <tt class="docutils literal"><span class="pre">iterator_traits<Dr2>::difference_type</span></tt></p>
|
||||||
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">if <tt class="docutils literal"><span class="pre">is_convertible<Dr2,Dr1>::value</span></tt></p>
|
<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><p class="first">if <tt class="docutils literal"><span class="pre">is_convertible<Dr2,Dr1>::value</span></tt></p>
|
||||||
<dl class="last docutils">
|
<dl class="last docutils">
|
||||||
<dt>then </dt>
|
<dt>then</dt>
|
||||||
<dd><tt class="docutils literal"><span class="pre">-((Dr1</span> <span class="pre">const&)lhs).distance_to((Dr2</span> <span class="pre">const&)rhs)</span></tt>.</dd>
|
<dd><p class="first last"><tt class="docutils literal"><span class="pre">-((Dr1</span> <span class="pre">const&)lhs).distance_to((Dr2</span> <span class="pre">const&)rhs)</span></tt>.</p>
|
||||||
<dt>Otherwise, </dt>
|
</dd>
|
||||||
<dd><tt class="docutils literal"><span class="pre">((Dr2</span> <span class="pre">const&)rhs).distance_to((Dr1</span> <span class="pre">const&)lhs)</span></tt>.</dd>
|
<dt>Otherwise,</dt>
|
||||||
|
<dd><p class="first last"><tt class="docutils literal"><span class="pre">((Dr2</span> <span class="pre">const&)rhs).distance_to((Dr1</span> <span class="pre">const&)lhs)</span></tt>.</p>
|
||||||
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -831,17 +859,17 @@ operator -(iterator_facade<Dr1,V1,TC1,R1,D1> const& lhs,
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="tutorial-example">
|
<div class="section" id="tutorial-example">
|
||||||
<h1><a class="toc-backref" href="#id31" name="tutorial-example">Tutorial Example</a></h1>
|
<h1><a class="toc-backref" href="#id31">Tutorial Example</a></h1>
|
||||||
<!-- Copyright David Abrahams 2004. Use, modification and distribution is -->
|
<!-- Copyright David Abrahams 2004. Use, modification and distribution is -->
|
||||||
<!-- subject to the Boost Software License, Version 1.0. (See accompanying -->
|
<!-- 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) -->
|
<!-- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) -->
|
||||||
<p>In this section we'll walk through the implementation of a few
|
<p>In this section we'll walk through the implementation of a few
|
||||||
iterators using <tt class="docutils literal"><span class="pre">iterator_facade</span></tt>, based around the simple
|
iterators using <tt class="docutils literal"><span class="pre">iterator_facade</span></tt>, based around the simple
|
||||||
example of a linked list of polymorphic objects. This example was
|
example of a linked list of polymorphic objects. This example was
|
||||||
inspired by a <a class="reference" href="http://thread.gmane.org/gmane.comp.lib.boost.user/5100">posting</a> by Keith Macdonald on the <a class="reference" href="../../../more/mailing_lists.htm#users">Boost-Users</a>
|
inspired by a <a class="reference external" href="http://thread.gmane.org/gmane.comp.lib.boost.user/5100">posting</a> by Keith Macdonald on the <a class="reference external" href="http://www.boost.org/more/mailing_lists.htm#users">Boost-Users</a>
|
||||||
mailing list.</p>
|
mailing list.</p>
|
||||||
<div class="section" id="the-problem">
|
<div class="section" id="the-problem">
|
||||||
<h2><a class="toc-backref" href="#id32" name="the-problem">The Problem</a></h2>
|
<h2><a class="toc-backref" href="#id32">The Problem</a></h2>
|
||||||
<p>Say we've written a polymorphic linked list node base class:</p>
|
<p>Say we've written a polymorphic linked list node base class:</p>
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
# include <iostream>
|
# include <iostream>
|
||||||
@@ -858,16 +886,16 @@ struct node_base
|
|||||||
|
|
||||||
// print to the stream
|
// print to the stream
|
||||||
virtual void print(std::ostream& s) const = 0;
|
virtual void print(std::ostream& s) const = 0;
|
||||||
|
|
||||||
// double the value
|
// double the value
|
||||||
virtual void double_me() = 0;
|
virtual void double_me() = 0;
|
||||||
|
|
||||||
void append(node_base* p)
|
void append(node_base* p)
|
||||||
{
|
{
|
||||||
if (m_next)
|
if (m_next)
|
||||||
m_next->append(p);
|
m_next->append(p);
|
||||||
else
|
else
|
||||||
m_next = p;
|
m_next = p;
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -903,7 +931,7 @@ inline std::ostream& operator<<(std::ostream& s, node_base const&a
|
|||||||
lists.</p>
|
lists.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="a-basic-iterator-using-iterator-facade">
|
<div class="section" id="a-basic-iterator-using-iterator-facade">
|
||||||
<h2><a class="toc-backref" href="#id33" name="a-basic-iterator-using-iterator-facade">A Basic Iterator Using <tt class="docutils literal"><span class="pre">iterator_facade</span></tt></a></h2>
|
<h2><a class="toc-backref" href="#id33">A Basic Iterator Using <tt class="docutils literal"><span class="pre">iterator_facade</span></tt></a></h2>
|
||||||
<p>We will construct a <tt class="docutils literal"><span class="pre">node_iterator</span></tt> class using inheritance from
|
<p>We will construct a <tt class="docutils literal"><span class="pre">node_iterator</span></tt> class using inheritance from
|
||||||
<tt class="docutils literal"><span class="pre">iterator_facade</span></tt> to implement most of the iterator's operations.</p>
|
<tt class="docutils literal"><span class="pre">iterator_facade</span></tt> to implement most of the iterator's operations.</p>
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
@@ -917,36 +945,36 @@ class node_iterator
|
|||||||
};
|
};
|
||||||
</pre>
|
</pre>
|
||||||
<div class="section" id="template-arguments-for-iterator-facade">
|
<div class="section" id="template-arguments-for-iterator-facade">
|
||||||
<h3><a class="toc-backref" href="#id34" name="template-arguments-for-iterator-facade">Template Arguments for <tt class="docutils literal"><span class="pre">iterator_facade</span></tt></a></h3>
|
<h3><a class="toc-backref" href="#id34">Template Arguments for <tt class="docutils literal"><span class="pre">iterator_facade</span></tt></a></h3>
|
||||||
<p><tt class="docutils literal"><span class="pre">iterator_facade</span></tt> has several template parameters, so we must decide
|
<p><tt class="docutils literal"><span class="pre">iterator_facade</span></tt> has several template parameters, so we must decide
|
||||||
what types to use for the arguments. The parameters are <tt class="docutils literal"><span class="pre">Derived</span></tt>,
|
what types to use for the arguments. The parameters are <tt class="docutils literal"><span class="pre">Derived</span></tt>,
|
||||||
<tt class="docutils literal"><span class="pre">Value</span></tt>, <tt class="docutils literal"><span class="pre">CategoryOrTraversal</span></tt>, <tt class="docutils literal"><span class="pre">Reference</span></tt>, and <tt class="docutils literal"><span class="pre">Difference</span></tt>.</p>
|
<tt class="docutils literal"><span class="pre">Value</span></tt>, <tt class="docutils literal"><span class="pre">CategoryOrTraversal</span></tt>, <tt class="docutils literal"><span class="pre">Reference</span></tt>, and <tt class="docutils literal"><span class="pre">Difference</span></tt>.</p>
|
||||||
<div class="section" id="derived">
|
<div class="section" id="derived">
|
||||||
<h4><a class="toc-backref" href="#id35" name="derived"><tt class="docutils literal"><span class="pre">Derived</span></tt></a></h4>
|
<h4><a class="toc-backref" href="#id35"><tt class="docutils literal"><span class="pre">Derived</span></tt></a></h4>
|
||||||
<p>Because <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> is meant to be used with the CRTP
|
<p>Because <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> is meant to be used with the CRTP
|
||||||
<a class="citation-reference" href="#cop95" id="id10" name="id10">[Cop95]</a> the first parameter is the iterator class name itself,
|
<a class="citation-reference" href="#cop95" id="id10">[Cop95]</a> the first parameter is the iterator class name itself,
|
||||||
<tt class="docutils literal"><span class="pre">node_iterator</span></tt>.</p>
|
<tt class="docutils literal"><span class="pre">node_iterator</span></tt>.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="value">
|
<div class="section" id="value">
|
||||||
<h4><a class="toc-backref" href="#id36" name="value"><tt class="docutils literal"><span class="pre">Value</span></tt></a></h4>
|
<h4><a class="toc-backref" href="#id36"><tt class="docutils literal"><span class="pre">Value</span></tt></a></h4>
|
||||||
<p>The <tt class="docutils literal"><span class="pre">Value</span></tt> parameter determines the <tt class="docutils literal"><span class="pre">node_iterator</span></tt>'s
|
<p>The <tt class="docutils literal"><span class="pre">Value</span></tt> parameter determines the <tt class="docutils literal"><span class="pre">node_iterator</span></tt>'s
|
||||||
<tt class="docutils literal"><span class="pre">value_type</span></tt>. In this case, we are iterating over <tt class="docutils literal"><span class="pre">node_base</span></tt>
|
<tt class="docutils literal"><span class="pre">value_type</span></tt>. In this case, we are iterating over <tt class="docutils literal"><span class="pre">node_base</span></tt>
|
||||||
objects, so <tt class="docutils literal"><span class="pre">Value</span></tt> will be <tt class="docutils literal"><span class="pre">node_base</span></tt>.</p>
|
objects, so <tt class="docutils literal"><span class="pre">Value</span></tt> will be <tt class="docutils literal"><span class="pre">node_base</span></tt>.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="categoryortraversal">
|
<div class="section" id="categoryortraversal">
|
||||||
<h4><a class="toc-backref" href="#id37" name="categoryortraversal"><tt class="docutils literal"><span class="pre">CategoryOrTraversal</span></tt></a></h4>
|
<h4><a class="toc-backref" href="#id37"><tt class="docutils literal"><span class="pre">CategoryOrTraversal</span></tt></a></h4>
|
||||||
<p>Now we have to determine which <a class="reference" href="new-iter-concepts.html#iterator-traversal-concepts-lib-iterator-traversal">iterator traversal concept</a> our
|
<p>Now we have to determine which <a class="reference external" href="new-iter-concepts.html#iterator-traversal-concepts-lib-iterator-traversal">iterator traversal concept</a> our
|
||||||
<tt class="docutils literal"><span class="pre">node_iterator</span></tt> is going to model. Singly-linked lists only have
|
<tt class="docutils literal"><span class="pre">node_iterator</span></tt> is going to model. Singly-linked lists only have
|
||||||
forward links, so our iterator can't can't be a <a class="reference" href="new-iter-concepts.html#bidirectional-traversal-iterators-lib-bidirectional-traversal-iterators">bidirectional
|
forward links, so our iterator can't can't be a <a class="reference external" href="new-iter-concepts.html#bidirectional-traversal-iterators-lib-bidirectional-traversal-iterators">bidirectional
|
||||||
traversal iterator</a>. Our iterator should be able to make multiple
|
traversal iterator</a>. Our iterator should be able to make multiple
|
||||||
passes over the same linked list (unlike, say, an
|
passes over the same linked list (unlike, say, an
|
||||||
<tt class="docutils literal"><span class="pre">istream_iterator</span></tt> which consumes the stream it traverses), so it
|
<tt class="docutils literal"><span class="pre">istream_iterator</span></tt> which consumes the stream it traverses), so it
|
||||||
must be a <a class="reference" href="new-iter-concepts.html#forward-traversal-iterators-lib-forward-traversal-iterators">forward traversal iterator</a>. Therefore, we'll pass
|
must be a <a class="reference external" href="new-iter-concepts.html#forward-traversal-iterators-lib-forward-traversal-iterators">forward traversal iterator</a>. Therefore, we'll pass
|
||||||
<tt class="docutils literal"><span class="pre">boost::forward_traversal_tag</span></tt> in this position <a class="footnote-reference" href="#category" id="id11" name="id11">[1]</a>.</p>
|
<tt class="docutils literal"><span class="pre">boost::forward_traversal_tag</span></tt> in this position<a class="footnote-reference" href="#category" id="id11"><sup>1</sup></a>.</p>
|
||||||
<table class="docutils footnote" frame="void" id="category" rules="none">
|
<table class="docutils footnote" frame="void" id="category" rules="none">
|
||||||
<colgroup><col class="label" /><col /></colgroup>
|
<colgroup><col class="label" /><col /></colgroup>
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr><td class="label"><a class="fn-backref" href="#id11" name="category">[1]</a></td><td><tt class="docutils literal"><span class="pre">iterator_facade</span></tt> also supports old-style category
|
<tr><td class="label"><a class="fn-backref" href="#id11">[1]</a></td><td><tt class="docutils literal"><span class="pre">iterator_facade</span></tt> also supports old-style category
|
||||||
tags, so we could have passed <tt class="docutils literal"><span class="pre">std::forward_iterator_tag</span></tt> here;
|
tags, so we could have passed <tt class="docutils literal"><span class="pre">std::forward_iterator_tag</span></tt> here;
|
||||||
either way, the resulting iterator's <tt class="docutils literal"><span class="pre">iterator_category</span></tt> will
|
either way, the resulting iterator's <tt class="docutils literal"><span class="pre">iterator_category</span></tt> will
|
||||||
end up being <tt class="docutils literal"><span class="pre">std::forward_iterator_tag</span></tt>.</td></tr>
|
end up being <tt class="docutils literal"><span class="pre">std::forward_iterator_tag</span></tt>.</td></tr>
|
||||||
@@ -954,7 +982,7 @@ end up being <tt class="docutils literal"><span class="pre">std::forward_iterato
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="id12">
|
<div class="section" id="id12">
|
||||||
<h4><a class="toc-backref" href="#id38" name="id12"><tt class="docutils literal"><span class="pre">Reference</span></tt></a></h4>
|
<h4><a class="toc-backref" href="#id38"><tt class="docutils literal"><span class="pre">Reference</span></tt></a></h4>
|
||||||
<p>The <tt class="docutils literal"><span class="pre">Reference</span></tt> argument becomes the type returned by
|
<p>The <tt class="docutils literal"><span class="pre">Reference</span></tt> argument becomes the type returned by
|
||||||
<tt class="docutils literal"><span class="pre">node_iterator</span></tt>'s dereference operation, and will also be the
|
<tt class="docutils literal"><span class="pre">node_iterator</span></tt>'s dereference operation, and will also be the
|
||||||
same as <tt class="docutils literal"><span class="pre">std::iterator_traits<node_iterator>::reference</span></tt>. The
|
same as <tt class="docutils literal"><span class="pre">std::iterator_traits<node_iterator>::reference</span></tt>. The
|
||||||
@@ -963,7 +991,7 @@ library's default for this parameter is <tt class="docutils literal"><span class
|
|||||||
type, we can omit this argument, or pass <tt class="docutils literal"><span class="pre">use_default</span></tt>.</p>
|
type, we can omit this argument, or pass <tt class="docutils literal"><span class="pre">use_default</span></tt>.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="difference">
|
<div class="section" id="difference">
|
||||||
<h4><a class="toc-backref" href="#id39" name="difference"><tt class="docutils literal"><span class="pre">Difference</span></tt></a></h4>
|
<h4><a class="toc-backref" href="#id39"><tt class="docutils literal"><span class="pre">Difference</span></tt></a></h4>
|
||||||
<p>The <tt class="docutils literal"><span class="pre">Difference</span></tt> argument determines how the distance between
|
<p>The <tt class="docutils literal"><span class="pre">Difference</span></tt> argument determines how the distance between
|
||||||
two <tt class="docutils literal"><span class="pre">node_iterator</span></tt>s will be measured and will also be the
|
two <tt class="docutils literal"><span class="pre">node_iterator</span></tt>s will be measured and will also be the
|
||||||
same as <tt class="docutils literal"><span class="pre">std::iterator_traits<node_iterator>::difference_type</span></tt>.
|
same as <tt class="docutils literal"><span class="pre">std::iterator_traits<node_iterator>::difference_type</span></tt>.
|
||||||
@@ -990,14 +1018,14 @@ class node_iterator
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="constructors-and-data-members">
|
<div class="section" id="constructors-and-data-members">
|
||||||
<h3><a class="toc-backref" href="#id40" name="constructors-and-data-members">Constructors and Data Members</a></h3>
|
<h3><a class="toc-backref" href="#id40">Constructors and Data Members</a></h3>
|
||||||
<p>Next we need to decide how to represent the iterator's position.
|
<p>Next we need to decide how to represent the iterator's position.
|
||||||
This representation will take the form of data members, so we'll
|
This representation will take the form of data members, so we'll
|
||||||
also need to write constructors to initialize them. The
|
also need to write constructors to initialize them. The
|
||||||
<tt class="docutils literal"><span class="pre">node_iterator</span></tt>'s position is quite naturally represented using
|
<tt class="docutils literal"><span class="pre">node_iterator</span></tt>'s position is quite naturally represented using
|
||||||
a pointer to a <tt class="docutils literal"><span class="pre">node_base</span></tt>. We'll need a constructor to build an
|
a pointer to a <tt class="docutils literal"><span class="pre">node_base</span></tt>. We'll need a constructor to build an
|
||||||
iterator from a <tt class="docutils literal"><span class="pre">node_base*</span></tt>, and a default constructor to
|
iterator from a <tt class="docutils literal"><span class="pre">node_base*</span></tt>, and a default constructor to
|
||||||
satisfy the <a class="reference" href="new-iter-concepts.html#forward-traversal-iterators-lib-forward-traversal-iterators">forward traversal iterator</a> requirements <a class="footnote-reference" href="#default" id="id13" name="id13">[2]</a>.
|
satisfy the <a class="reference external" href="new-iter-concepts.html#forward-traversal-iterators-lib-forward-traversal-iterators">forward traversal iterator</a> requirements<a class="footnote-reference" href="#default" id="id13"><sup>2</sup></a>.
|
||||||
Our <tt class="docutils literal"><span class="pre">node_iterator</span></tt> then becomes:</p>
|
Our <tt class="docutils literal"><span class="pre">node_iterator</span></tt> then becomes:</p>
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
# include "node.hpp"
|
# include "node.hpp"
|
||||||
@@ -1027,7 +1055,7 @@ class node_iterator
|
|||||||
<table class="docutils footnote" frame="void" id="default" rules="none">
|
<table class="docutils footnote" frame="void" id="default" rules="none">
|
||||||
<colgroup><col class="label" /><col /></colgroup>
|
<colgroup><col class="label" /><col /></colgroup>
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr><td class="label"><a class="fn-backref" href="#id13" name="default">[2]</a></td><td>Technically, the C++ standard places almost no
|
<tr><td class="label"><a class="fn-backref" href="#id13">[2]</a></td><td>Technically, the C++ standard places almost no
|
||||||
requirements on a default-constructed iterator, so if we were
|
requirements on a default-constructed iterator, so if we were
|
||||||
really concerned with efficiency, we could've written the
|
really concerned with efficiency, we could've written the
|
||||||
default constructor to leave <tt class="docutils literal"><span class="pre">m_node</span></tt> uninitialized.</td></tr>
|
default constructor to leave <tt class="docutils literal"><span class="pre">m_node</span></tt> uninitialized.</td></tr>
|
||||||
@@ -1035,12 +1063,12 @@ default constructor to leave <tt class="docutils literal"><span class="pre">m_no
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="implementing-the-core-operations">
|
<div class="section" id="implementing-the-core-operations">
|
||||||
<h3><a class="toc-backref" href="#id41" name="implementing-the-core-operations">Implementing the Core Operations</a></h3>
|
<h3><a class="toc-backref" href="#id41">Implementing the Core Operations</a></h3>
|
||||||
<p>The last step is to implement the <a class="reference" href="#core-operations">core operations</a> required by
|
<p>The last step is to implement the <a class="reference internal" href="#core-operations">core operations</a> required by
|
||||||
the concepts we want our iterator to model. Referring to the
|
the concepts we want our iterator to model. Referring to the
|
||||||
<a class="reference" href="#core-operations">table</a>, we can see that the first three rows are applicable
|
<a class="reference internal" href="#core-operations">table</a>, we can see that the first three rows are applicable
|
||||||
because <tt class="docutils literal"><span class="pre">node_iterator</span></tt> needs to satisfy the requirements for
|
because <tt class="docutils literal"><span class="pre">node_iterator</span></tt> needs to satisfy the requirements for
|
||||||
<a class="reference" href="new-iter-concepts.html#readable-iterators-lib-readable-iterators">readable iterator</a>, <a class="reference" href="new-iter-concepts.html#single-pass-iterators-lib-single-pass-iterators">single pass iterator</a>, and <a class="reference" href="new-iter-concepts.html#incrementable-iterators-lib-incrementable-iterators">incrementable
|
<a class="reference external" href="new-iter-concepts.html#readable-iterators-lib-readable-iterators">readable iterator</a>, <a class="reference external" href="new-iter-concepts.html#single-pass-iterators-lib-single-pass-iterators">single pass iterator</a>, and <a class="reference external" href="new-iter-concepts.html#incrementable-iterators-lib-incrementable-iterators">incrementable
|
||||||
iterator</a>.</p>
|
iterator</a>.</p>
|
||||||
<p>We therefore need to supply <tt class="docutils literal"><span class="pre">dereference</span></tt>,
|
<p>We therefore need to supply <tt class="docutils literal"><span class="pre">dereference</span></tt>,
|
||||||
<tt class="docutils literal"><span class="pre">equal</span></tt>, and <tt class="docutils literal"><span class="pre">increment</span></tt> members. We don't want these members
|
<tt class="docutils literal"><span class="pre">equal</span></tt>, and <tt class="docutils literal"><span class="pre">increment</span></tt> members. We don't want these members
|
||||||
@@ -1082,11 +1110,11 @@ class node_iterator
|
|||||||
};
|
};
|
||||||
</pre>
|
</pre>
|
||||||
<p>Voilà; a complete and conforming readable, forward-traversal
|
<p>Voilà; a complete and conforming readable, forward-traversal
|
||||||
iterator! For a working example of its use, see <a class="reference" href="../example/node_iterator1.cpp">this program</a>.</p>
|
iterator! For a working example of its use, see <a class="reference external" href="../example/node_iterator1.cpp">this program</a>.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="a-constant-node-iterator">
|
<div class="section" id="a-constant-node-iterator">
|
||||||
<h2><a class="toc-backref" href="#id42" name="a-constant-node-iterator">A constant <tt class="docutils literal"><span class="pre">node_iterator</span></tt></a></h2>
|
<h2><a class="toc-backref" href="#id42">A constant <tt class="docutils literal"><span class="pre">node_iterator</span></tt></a></h2>
|
||||||
<div class="sidebar">
|
<div class="sidebar">
|
||||||
<p class="first sidebar-title">Constant and Mutable iterators</p>
|
<p class="first sidebar-title">Constant and Mutable iterators</p>
|
||||||
<p>The term <strong>mutable iterator</strong> means an iterator through which
|
<p>The term <strong>mutable iterator</strong> means an iterator through which
|
||||||
@@ -1110,7 +1138,7 @@ changes:</p>
|
|||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
class const_node_iterator
|
class const_node_iterator
|
||||||
: public boost::iterator_facade<
|
: public boost::iterator_facade<
|
||||||
node_iterator
|
const_node_iterator
|
||||||
, node_base <strong>const</strong>
|
, node_base <strong>const</strong>
|
||||||
, boost::forward_traversal_tag
|
, boost::forward_traversal_tag
|
||||||
>
|
>
|
||||||
@@ -1187,7 +1215,7 @@ typedef node_iter<node_base const> node_const_iterator;
|
|||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="interoperability">
|
<div class="section" id="interoperability">
|
||||||
<h2><a class="toc-backref" href="#id43" name="interoperability">Interoperability</a></h2>
|
<h2><a class="toc-backref" href="#id43">Interoperability</a></h2>
|
||||||
<p>Our <tt class="docutils literal"><span class="pre">const_node_iterator</span></tt> works perfectly well on its own, but
|
<p>Our <tt class="docutils literal"><span class="pre">const_node_iterator</span></tt> works perfectly well on its own, but
|
||||||
taken together with <tt class="docutils literal"><span class="pre">node_iterator</span></tt> it doesn't quite meet
|
taken together with <tt class="docutils literal"><span class="pre">node_iterator</span></tt> it doesn't quite meet
|
||||||
expectations. For example, we'd like to be able to pass a
|
expectations. For example, we'd like to be able to pass a
|
||||||
@@ -1197,9 +1225,9 @@ just as you can with <tt class="docutils literal"><span class="pre">std::list<
|
|||||||
<tt class="docutils literal"><span class="pre">node_const_iterator</span></tt> into the same list, we should be able to
|
<tt class="docutils literal"><span class="pre">node_const_iterator</span></tt> into the same list, we should be able to
|
||||||
compare them for equality.</p>
|
compare them for equality.</p>
|
||||||
<p>This expected ability to use two different iterator types together
|
<p>This expected ability to use two different iterator types together
|
||||||
is known as <a class="reference" href="new-iter-concepts.html#interoperable-iterators-lib-interoperable-iterators"><strong>interoperability</strong></a>. Achieving interoperability in
|
is known as <a class="reference external" href="new-iter-concepts.html#interoperable-iterators-lib-interoperable-iterators"><strong>interoperability</strong></a>. Achieving interoperability in
|
||||||
our case is as simple as templatizing the <tt class="docutils literal"><span class="pre">equal</span></tt> function and
|
our case is as simple as templatizing the <tt class="docutils literal"><span class="pre">equal</span></tt> function and
|
||||||
adding a templatized converting constructor <a class="footnote-reference" href="#broken" id="id16" name="id16">[3]</a> <a class="footnote-reference" href="#random" id="id17" name="id17">[4]</a>:</p>
|
adding a templatized converting constructor<a class="footnote-reference" href="#broken" id="id16"><sup>3</sup></a><a class="footnote-reference" href="#random" id="id17"><sup>4</sup></a>:</p>
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
template <class Value>
|
template <class Value>
|
||||||
class node_iter
|
class node_iter
|
||||||
@@ -1226,7 +1254,7 @@ class node_iter
|
|||||||
|
|
||||||
template <class OtherValue>
|
template <class OtherValue>
|
||||||
bool equal(node_iter<OtherValue> const& other) const
|
bool equal(node_iter<OtherValue> const& other) const
|
||||||
{
|
{
|
||||||
return this->m_node == other.m_node;
|
return this->m_node == other.m_node;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1244,23 +1272,23 @@ typedef impl::node_iterator<node_base const> node_const_iterator;
|
|||||||
<table class="docutils footnote" frame="void" id="broken" rules="none">
|
<table class="docutils footnote" frame="void" id="broken" rules="none">
|
||||||
<colgroup><col class="label" /><col /></colgroup>
|
<colgroup><col class="label" /><col /></colgroup>
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr><td class="label"><a class="fn-backref" href="#id16" name="broken">[3]</a></td><td>If you're using an older compiler and it can't handle
|
<tr><td class="label"><a class="fn-backref" href="#id16">[3]</a></td><td>If you're using an older compiler and it can't handle
|
||||||
this example, see the <a class="reference" href="../example/node_iterator2.hpp">example code</a> for workarounds.</td></tr>
|
this example, see the <a class="reference external" href="../example/node_iterator2.hpp">example code</a> for workarounds.</td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<table class="docutils footnote" frame="void" id="random" rules="none">
|
<table class="docutils footnote" frame="void" id="random" rules="none">
|
||||||
<colgroup><col class="label" /><col /></colgroup>
|
<colgroup><col class="label" /><col /></colgroup>
|
||||||
<tbody valign="top">
|
<tbody valign="top">
|
||||||
<tr><td class="label"><a class="fn-backref" href="#id17" name="random">[4]</a></td><td>If <tt class="docutils literal"><span class="pre">node_iterator</span></tt> had been a <a class="reference" href="new-iter-concepts.html#random-access-traversal-iterators-lib-random-access-traversal-iterators">random access
|
<tr><td class="label"><a class="fn-backref" href="#id17">[4]</a></td><td>If <tt class="docutils literal"><span class="pre">node_iterator</span></tt> had been a <a class="reference external" href="new-iter-concepts.html#random-access-traversal-iterators-lib-random-access-traversal-iterators">random access
|
||||||
traversal iterator</a>, we'd have had to templatize its
|
traversal iterator</a>, we'd have had to templatize its
|
||||||
<tt class="docutils literal"><span class="pre">distance_to</span></tt> function as well.</td></tr>
|
<tt class="docutils literal"><span class="pre">distance_to</span></tt> function as well.</td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
<p>You can see an example program which exercises our interoperable
|
<p>You can see an example program which exercises our interoperable
|
||||||
iterators <a class="reference" href="../example/node_iterator2.cpp">here</a>.</p>
|
iterators <a class="reference external" href="../example/node_iterator2.cpp">here</a>.</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="telling-the-truth">
|
<div class="section" id="telling-the-truth">
|
||||||
<h2><a class="toc-backref" href="#id44" name="telling-the-truth">Telling the Truth</a></h2>
|
<h2><a class="toc-backref" href="#id44">Telling the Truth</a></h2>
|
||||||
<p>Now <tt class="docutils literal"><span class="pre">node_iterator</span></tt> and <tt class="docutils literal"><span class="pre">node_const_iterator</span></tt> behave exactly as
|
<p>Now <tt class="docutils literal"><span class="pre">node_iterator</span></tt> and <tt class="docutils literal"><span class="pre">node_const_iterator</span></tt> behave exactly as
|
||||||
you'd expect... almost. We can compare them and we can convert in
|
you'd expect... almost. We can compare them and we can convert in
|
||||||
one direction: from <tt class="docutils literal"><span class="pre">node_iterator</span></tt> to <tt class="docutils literal"><span class="pre">node_const_iterator</span></tt>.
|
one direction: from <tt class="docutils literal"><span class="pre">node_iterator</span></tt> to <tt class="docutils literal"><span class="pre">node_const_iterator</span></tt>.
|
||||||
@@ -1269,15 +1297,15 @@ If we try to convert from <tt class="docutils literal"><span class="pre">node_co
|
|||||||
constructor tries to initialize <tt class="docutils literal"><span class="pre">node_iterator</span></tt>'s <tt class="docutils literal"><span class="pre">m_node</span></tt>, a
|
constructor tries to initialize <tt class="docutils literal"><span class="pre">node_iterator</span></tt>'s <tt class="docutils literal"><span class="pre">m_node</span></tt>, a
|
||||||
<tt class="docutils literal"><span class="pre">node*</span></tt> with a <tt class="docutils literal"><span class="pre">node</span> <span class="pre">const*</span></tt>. So what's the problem?</p>
|
<tt class="docutils literal"><span class="pre">node*</span></tt> with a <tt class="docutils literal"><span class="pre">node</span> <span class="pre">const*</span></tt>. So what's the problem?</p>
|
||||||
<p>The problem is that
|
<p>The problem is that
|
||||||
<tt class="docutils literal"><span class="pre">boost::</span></tt><a class="reference" href="../../../doc/html/boost_typetraits/category.html#boost_typetraits.relate"><tt class="docutils literal"><span class="pre">is_convertible</span></tt></a><tt class="docutils literal"><span class="pre"><node_const_iterator,node_iterator>::value</span></tt>
|
<tt class="docutils literal"><span class="pre">boost::</span></tt><a class="reference external" href="../../type_traits/index.html#relationships"><tt class="docutils literal"><span class="pre">is_convertible</span></tt></a><tt class="docutils literal"><span class="pre"><node_const_iterator,node_iterator>::value</span></tt>
|
||||||
will be <tt class="docutils literal"><span class="pre">true</span></tt>, but it should be <tt class="docutils literal"><span class="pre">false</span></tt>. <a class="reference" href="../../../doc/html/boost_typetraits/category.html#boost_typetraits.relate"><tt class="docutils literal"><span class="pre">is_convertible</span></tt></a>
|
will be <tt class="docutils literal"><span class="pre">true</span></tt>, but it should be <tt class="docutils literal"><span class="pre">false</span></tt>. <a class="reference external" href="../../type_traits/index.html#relationships"><tt class="docutils literal"><span class="pre">is_convertible</span></tt></a>
|
||||||
lies because it can only see as far as the <em>declaration</em> of
|
lies because it can only see as far as the <em>declaration</em> of
|
||||||
<tt class="docutils literal"><span class="pre">node_iter</span></tt>'s converting constructor, but can't look inside at
|
<tt class="docutils literal"><span class="pre">node_iter</span></tt>'s converting constructor, but can't look inside at
|
||||||
the <em>definition</em> to make sure it will compile. A perfect solution
|
the <em>definition</em> to make sure it will compile. A perfect solution
|
||||||
would make <tt class="docutils literal"><span class="pre">node_iter</span></tt>'s converting constructor disappear when
|
would make <tt class="docutils literal"><span class="pre">node_iter</span></tt>'s converting constructor disappear when
|
||||||
the <tt class="docutils literal"><span class="pre">m_node</span></tt> conversion would fail.</p>
|
the <tt class="docutils literal"><span class="pre">m_node</span></tt> conversion would fail.</p>
|
||||||
<p>In fact, that sort of magic is possible using
|
<p>In fact, that sort of magic is possible using
|
||||||
<a class="reference" href="../../utility/enable_if.html"><tt class="docutils literal"><span class="pre">boost::enable_if</span></tt></a>. By rewriting the converting constructor as
|
<a class="reference external" href="../../utility/enable_if.html"><tt class="docutils literal"><span class="pre">boost::enable_if</span></tt></a>. By rewriting the converting constructor as
|
||||||
follows, we can remove it from the overload set when it's not
|
follows, we can remove it from the overload set when it's not
|
||||||
appropriate:</p>
|
appropriate:</p>
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
@@ -1286,7 +1314,7 @@ appropriate:</p>
|
|||||||
|
|
||||||
...
|
...
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct enabler {};
|
struct enabler {};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
@@ -1302,18 +1330,19 @@ public:
|
|||||||
</pre>
|
</pre>
|
||||||
</div>
|
</div>
|
||||||
<div class="section" id="wrap-up">
|
<div class="section" id="wrap-up">
|
||||||
<h2><a class="toc-backref" href="#id45" name="wrap-up">Wrap Up</a></h2>
|
<h2><a class="toc-backref" href="#id45">Wrap Up</a></h2>
|
||||||
<p>This concludes our <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> tutorial, but before you
|
<p>This concludes our <tt class="docutils literal"><span class="pre">iterator_facade</span></tt> tutorial, but before you
|
||||||
stop reading we urge you to take a look at <a class="reference" href="iterator_adaptor.html"><tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt></a>.
|
stop reading we urge you to take a look at <a class="reference external" href="iterator_adaptor.html"><tt class="docutils literal"><span class="pre">iterator_adaptor</span></tt></a>.
|
||||||
There's another way to approach writing these iterators which might
|
There's another way to approach writing these iterators which might
|
||||||
even be superior.</p>
|
even be superior.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr class="docutils footer" />
|
|
||||||
<div class="footer">
|
<div class="footer">
|
||||||
<a class="reference" href="iterator_facade.rst">View document source</a>.
|
<hr class="footer" />
|
||||||
Generated by <a class="reference" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
<a class="reference external" href="iterator_facade.rst">View document source</a>.
|
||||||
|
Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
BIN
doc/iterator_facade.pdf
Executable file → Normal file
BIN
doc/iterator_facade.pdf
Executable file → Normal file
Binary file not shown.
@@ -1,3 +1,7 @@
|
|||||||
|
.. 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)
|
||||||
|
|
||||||
++++++++++++++++
|
++++++++++++++++
|
||||||
Iterator Facade
|
Iterator Facade
|
||||||
++++++++++++++++
|
++++++++++++++++
|
||||||
@@ -7,7 +11,6 @@
|
|||||||
:organization: `Boost Consulting`_, Indiana University `Open Systems
|
:organization: `Boost Consulting`_, Indiana University `Open Systems
|
||||||
Lab`_, University of Hanover `Institute for Transport
|
Lab`_, University of Hanover `Institute for Transport
|
||||||
Railway Operation and Construction`_
|
Railway Operation and Construction`_
|
||||||
:date: $Date$
|
|
||||||
:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
|
:copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003.
|
||||||
|
|
||||||
.. _`Boost Consulting`: http://www.boost-consulting.com
|
.. _`Boost Consulting`: http://www.boost-consulting.com
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
.. Copyright David Abrahams 2006. 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)
|
||||||
|
|
||||||
``iterator_facade`` is a base class template that implements the
|
``iterator_facade`` is a base class template that implements the
|
||||||
interface of standard iterators in terms of a few core functions
|
interface of standard iterators in terms of a few core functions
|
||||||
and associated types, to be supplied by a derived iterator class.
|
and associated types, to be supplied by a derived iterator class.
|
||||||
|
|||||||
@@ -1,3 +1,7 @@
|
|||||||
|
.. 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)
|
||||||
|
|
||||||
.. Version 1.1 of this ReStructuredText document corresponds to
|
.. Version 1.1 of this ReStructuredText document corresponds to
|
||||||
n1530_, the paper accepted by the LWG for TR1.
|
n1530_, the paper accepted by the LWG for TR1.
|
||||||
|
|
||||||
@@ -163,9 +167,9 @@ the implementation of her iterator is free to implement an
|
|||||||
class; it will hide the one supplied by ``iterator_facade`` from
|
class; it will hide the one supplied by ``iterator_facade`` from
|
||||||
clients of her iterator.
|
clients of her iterator.
|
||||||
|
|
||||||
.. _n1550: http://anubis.dkuug.dk/JTC1/SC22/WG21/docs/papers/2003/n1550.html
|
.. _n1550: http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2003/n1550.htm
|
||||||
|
|
||||||
.. _`issue 299`: http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-active.html#299
|
.. _`issue 299`: http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-active.html#299
|
||||||
|
|
||||||
.. _`operator arrow`:
|
.. _`operator arrow`:
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user