mirror of
https://github.com/boostorg/iterator.git
synced 2025-06-27 21:11:02 +02:00
Compare commits
281 Commits
boost-1.64
...
develop
Author | SHA1 | Date | |
---|---|---|---|
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 |
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) | [](http://www.boost.org/development/tests/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) | [](http://www.boost.org/development/tests/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
|
||||||
|
;
|
||||||
|
|
@ -13,11 +13,11 @@ boostbook standalone
|
|||||||
:
|
:
|
||||||
iterator
|
iterator
|
||||||
:
|
:
|
||||||
<xsl:param>boost.root=../../../..
|
<xsl:param>"boost.root=../../../.."
|
||||||
<xsl:param>toc.max.depth=3
|
<xsl:param>toc.max.depth=3
|
||||||
<xsl:param>toc.section.depth=3
|
<xsl:param>toc.section.depth=3
|
||||||
<xsl:param>chunk.section.depth=4
|
<xsl:param>chunk.section.depth=2
|
||||||
<format>pdf:<xsl:param>boost.url.prefix=http://www.boost.org/doc/libs/release/libs/iterator/doc
|
<format>pdf:<xsl:param>"boost.url.prefix=http://www.boost.org/doc/libs/release/libs/iterator/doc/html"
|
||||||
;
|
;
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
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
|
@ -11,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,8 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
: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
|
boostinspect:nolicense
|
||||||
|
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
|
@ -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
|
||||||
|
@ -2622,7 +2622,7 @@ proxy object.</p>
|
|||||||
<div class="section" id="header">
|
<div class="section" id="header">
|
||||||
<h4><a class="toc-backref" href="#id70">Header</a></h4>
|
<h4><a class="toc-backref" href="#id70">Header</a></h4>
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
#include <boost/function_output_iterator.hpp>
|
#include <boost/iterator/function_output_iterator.hpp>
|
||||||
</pre>
|
</pre>
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
template <class UnaryFunction>
|
template <class UnaryFunction>
|
||||||
|
@ -10,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
|
||||||
|
@ -11,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
|
||||||
|
@ -7,7 +7,7 @@ Header
|
|||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
#include <boost/function_output_iterator.hpp>
|
#include <boost/iterator/function_output_iterator.hpp>
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ proxy object.</td>
|
|||||||
<div class="section" id="header">
|
<div class="section" id="header">
|
||||||
<h1><a class="toc-backref" href="#id1">Header</a></h1>
|
<h1><a class="toc-backref" href="#id1">Header</a></h1>
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
#include <boost/function_output_iterator.hpp>
|
#include <boost/iterator/function_output_iterator.hpp>
|
||||||
</pre>
|
</pre>
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
template <class UnaryFunction>
|
template <class UnaryFunction>
|
||||||
|
@ -11,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
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
<h1>Generator Iterator Adaptor</h1>
|
<h1>Generator Iterator Adaptor</h1>
|
||||||
|
|
||||||
<p>Defined in header <a href=
|
<p>Defined in header <a href=
|
||||||
"../../boost/generator_iterator.hpp">boost/generator_iterator.hpp</a></p>
|
"../../boost/iterator/generator_iterator.hpp">boost/iterator/generator_iterator.hpp</a></p>
|
||||||
|
|
||||||
<p>The generator iterator adaptor makes it easier to create custom input
|
<p>The generator iterator adaptor makes it easier to create custom input
|
||||||
iterators from 0-ary functions and function objects. The adaptor takes a
|
iterators from 0-ary functions and function objects. The adaptor takes a
|
||||||
@ -33,9 +33,7 @@
|
|||||||
<blockquote>
|
<blockquote>
|
||||||
<pre>
|
<pre>
|
||||||
namespace boost {
|
namespace boost {
|
||||||
template <class Generator>
|
namespace iterators {
|
||||||
class generator_iterator_policies;
|
|
||||||
|
|
||||||
template <class Generator>
|
template <class Generator>
|
||||||
class generator_iterator_generator;
|
class generator_iterator_generator;
|
||||||
|
|
||||||
@ -43,6 +41,7 @@ namespace boost {
|
|||||||
typename generator_iterator_generator<Generator>::type
|
typename generator_iterator_generator<Generator>::type
|
||||||
make_generator_iterator(Generator & gen);
|
make_generator_iterator(Generator & gen);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
</pre>
|
</pre>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
<hr>
|
<hr>
|
||||||
@ -60,8 +59,8 @@ template <class Generator>
|
|||||||
class generator_iterator_generator
|
class generator_iterator_generator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef <i>unspecified</i> type; // the resulting generator iterator type
|
using type = <i>unspecified</i>; // the resulting generator iterator type
|
||||||
}
|
};
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h3>Template Parameters</h3>
|
<h3>Template Parameters</h3>
|
||||||
@ -78,8 +77,8 @@ public:
|
|||||||
"http://www.sgi.com/tech/stl/Generator.html">Generator</a></tt></td>
|
"http://www.sgi.com/tech/stl/Generator.html">Generator</a></tt></td>
|
||||||
|
|
||||||
<td>The generator (0-ary function object) type being wrapped. The
|
<td>The generator (0-ary function object) type being wrapped. The
|
||||||
return type of the function must be defined as
|
return type of the function is deduced automatically from its
|
||||||
<tt>Generator::result_type</tt>. The function object must be a model of
|
<tt>operator()</tt>. The function object must be a model of
|
||||||
<a href=
|
<a href=
|
||||||
"http://www.sgi.com/tech/stl/Generator.html">Generator</a>.</td>
|
"http://www.sgi.com/tech/stl/Generator.html">Generator</a>.</td>
|
||||||
</tr>
|
</tr>
|
||||||
@ -122,14 +121,14 @@ make_generator_iterator(Generator & gen);
|
|||||||
<blockquote>
|
<blockquote>
|
||||||
<pre>
|
<pre>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <boost/generator_iterator.hpp>
|
#include <boost/iterators/generator_iterator.hpp>
|
||||||
|
|
||||||
class my_generator
|
class my_generator
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef int result_type;
|
using result_type = int;
|
||||||
my_generator() : state(0) { }
|
my_generator() : state(0) { }
|
||||||
int operator()() { return ++state; }
|
result_type operator()() { return ++state; }
|
||||||
private:
|
private:
|
||||||
int state;
|
int state;
|
||||||
};
|
};
|
||||||
@ -137,7 +136,7 @@ private:
|
|||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
my_generator gen;
|
my_generator gen;
|
||||||
boost::generator_iterator_generator<my_generator>::type it = boost::make_generator_iterator(gen);
|
auto it = boost::iterators::make_generator_iterator(gen);
|
||||||
for(int i = 0; i < 10; ++i, ++it)
|
for(int i = 0; i < 10; ++i, ++it)
|
||||||
std::cout << *it << std::endl;
|
std::cout << *it << std::endl;
|
||||||
}
|
}
|
||||||
|
@ -26,8 +26,6 @@
|
|||||||
<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
|
<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 external" 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>
|
||||||
<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, 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>
|
||||||
</tbody>
|
</tbody>
|
||||||
@ -131,6 +129,9 @@ is called to get the value to return.</li>
|
|||||||
<li><a class="reference external" href="function_output_iterator.html"><tt class="docutils literal"><span class="pre">function_output_iterator</span></tt></a> (<a class="reference external" href="function_output_iterator.pdf">PDF</a>): an output iterator wrapping a unary function
|
<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 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
|
<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 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
|
<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
|
||||||
@ -139,7 +140,7 @@ sequence, rearranged according to some sequence of integer indices.</li>
|
|||||||
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 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
|
<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 external" 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 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
|
<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
|
||||||
|
@ -19,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.
|
||||||
|
|
||||||
@ -146,6 +145,10 @@ iterator templates based on the Boost `iterator facade and adaptor`_.
|
|||||||
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.
|
||||||
|
|
||||||
@ -183,6 +186,9 @@ __ function_input_iterator.pdf
|
|||||||
.. _function_output: function_output_iterator.html
|
.. _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
|
||||||
@ -213,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
|
||||||
------
|
------
|
||||||
|
|
||||||
|
@ -11,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
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
Interoperability Revisited
|
Interoperability Revisited
|
||||||
++++++++++++++++++++++++++++
|
++++++++++++++++++++++++++++
|
||||||
|
|
||||||
:date: $Date$
|
|
||||||
:copyright: Copyright Thomas Witt 2004.
|
:copyright: Copyright Thomas Witt 2004.
|
||||||
|
|
||||||
.. Distributed under the Boost
|
.. Distributed under the Boost
|
||||||
|
@ -8,7 +8,6 @@
|
|||||||
: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
|
||||||
|
@ -11,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
|
||||||
|
@ -10,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
|
||||||
|
@ -10,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
|
||||||
|
@ -11,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
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
<title>Iterator Traits</title>
|
<title>Iterator Traits</title>
|
||||||
<meta name="author" content="David Abrahams" />
|
<meta name="author" content="David Abrahams" />
|
||||||
<meta name="organization" content="Boost Consulting" />
|
<meta name="organization" content="Boost Consulting" />
|
||||||
<meta name="date" content="$Date$" />
|
|
||||||
<meta name="copyright" content="Copyright David Abrahams 2004." />
|
<meta name="copyright" content="Copyright David Abrahams 2004." />
|
||||||
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
|
<link rel="stylesheet" href="../../../rst.css" type="text/css" />
|
||||||
</head>
|
</head>
|
||||||
@ -24,8 +23,6 @@
|
|||||||
<td><a class="first last reference external" href="mailto:dave@boost-consulting.com">dave@boost-consulting.com</a></td></tr>
|
<td><a class="first last reference external" href="mailto:dave@boost-consulting.com">dave@boost-consulting.com</a></td></tr>
|
||||||
<tr><th class="docinfo-name">Organization:</th>
|
<tr><th class="docinfo-name">Organization:</th>
|
||||||
<td><a class="first last reference external" href="http://www.boost-consulting.com">Boost Consulting</a></td></tr>
|
<td><a class="first last reference external" href="http://www.boost-consulting.com">Boost Consulting</a></td></tr>
|
||||||
<tr><th class="docinfo-name">Date:</th>
|
|
||||||
<td>$Date$</td></tr>
|
|
||||||
<tr><th class="docinfo-name">Copyright:</th>
|
<tr><th class="docinfo-name">Copyright:</th>
|
||||||
<td>Copyright David Abrahams 2004.</td></tr>
|
<td>Copyright David Abrahams 2004.</td></tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
:Author: David Abrahams
|
:Author: David Abrahams
|
||||||
:Contact: dave@boost-consulting.com
|
:Contact: dave@boost-consulting.com
|
||||||
:organization: `Boost Consulting`_
|
:organization: `Boost Consulting`_
|
||||||
:date: $Date$
|
|
||||||
:copyright: Copyright David Abrahams 2004.
|
:copyright: Copyright David Abrahams 2004.
|
||||||
|
|
||||||
.. _`Boost Consulting`: http://www.boost-consulting.com
|
.. _`Boost Consulting`: http://www.boost-consulting.com
|
||||||
|
@ -13,7 +13,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 n1550_\ =03-0133, which was
|
:Number: This is a revised version of n1550_\ =03-0133, which was
|
||||||
accepted for Technical Report 1 by the C++ standard
|
accepted for Technical Report 1 by the C++ standard
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu
|
:Contact: dave@boost-consulting.com, jsiek@osl.iu.edu
|
||||||
:organization: `Boost Consulting`_, Indiana University `Open Systems
|
:organization: `Boost Consulting`_, Indiana University `Open Systems
|
||||||
Lab`_
|
Lab`_
|
||||||
:date: $Date$
|
|
||||||
:copyright: Copyright Toon Knapen, David Abrahams, Roland Richter, and Jeremy Siek 2003.
|
:copyright: Copyright Toon Knapen, David Abrahams, Roland Richter, and Jeremy Siek 2003.
|
||||||
|
|
||||||
.. _`Boost Consulting`: http://www.boost-consulting.com
|
.. _`Boost Consulting`: http://www.boost-consulting.com
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
:Author: David Abrahams
|
:Author: David Abrahams
|
||||||
:Contact: dave@boost-consulting.com
|
:Contact: dave@boost-consulting.com
|
||||||
:organization: `Boost Consulting`_
|
:organization: `Boost Consulting`_
|
||||||
:date: $Date$
|
|
||||||
:copyright: Copyright David Abrahams 2004.
|
:copyright: Copyright David Abrahams 2004.
|
||||||
|
|
||||||
.. _`Boost Consulting`: http://www.boost-consulting.com
|
.. _`Boost Consulting`: http://www.boost-consulting.com
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
[section:adaptor Iterator Adaptor]
|
[section:adaptor Iterator Adaptor]
|
||||||
|
|
||||||
The `iterator_adaptor` class template adapts some `Base` [#base]_
|
The `iterator_adaptor` class template adapts some `Base` [#base]_
|
||||||
@ -288,7 +287,7 @@ Metrowerks CodeWarrior versions prior to 9.0]
|
|||||||
|
|
||||||
You can see an example program that exercises this version of the
|
You can see an example program that exercises this version of the
|
||||||
node iterators
|
node iterators
|
||||||
[@../example/node_iterator3.cpp `here`].
|
[example_link node_iterator3.cpp..here].
|
||||||
|
|
||||||
|
|
||||||
In the case of `node_iter`, it's not very compelling to pass
|
In the case of `node_iter`, it's not very compelling to pass
|
||||||
|
149
doc/quickbook/algorithms.qbk
Normal file
149
doc/quickbook/algorithms.qbk
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
[section:algorithms Algorithms]
|
||||||
|
|
||||||
|
[section:advance Function template `advance()`]
|
||||||
|
|
||||||
|
The `boost::iterators::advance` function template is an adapted version of `std::advance` for the Boost iterator [link iterator.concepts.traversal traversal concepts].
|
||||||
|
|
||||||
|
[heading Header]
|
||||||
|
|
||||||
|
<boost/iterator/advance.hpp>
|
||||||
|
|
||||||
|
[heading Synopsis]
|
||||||
|
|
||||||
|
template <typename Iterator, typename Distance>
|
||||||
|
constexpr void advance(Iterator& it, Distance n);
|
||||||
|
|
||||||
|
|
||||||
|
[heading Description]
|
||||||
|
|
||||||
|
Moves `it` forward by `n` increments (or backward by `|n|` decrements if `n` is negative).
|
||||||
|
|
||||||
|
[heading Requirements]
|
||||||
|
|
||||||
|
`Iterator` should model Incrementable Iterator.
|
||||||
|
|
||||||
|
[heading Preconditions]
|
||||||
|
|
||||||
|
Let `it`[sub `i`] be the iterator obtained by incrementing (or decrementing if `n` is negative) `it` by `i`. All the iterators `it`[sub `i`] for `i` = 0, 1, 2, ..., `|n|` should be valid.
|
||||||
|
|
||||||
|
If `Iterator` does not model [link iterator.concepts.traversal.bidirectional Bidirectional Traversal Iterator], `n` should be non-negative.
|
||||||
|
|
||||||
|
[heading Complexity]
|
||||||
|
|
||||||
|
If `Iterator` models [link iterator.concepts.traversal.random_access Random Access Traversal Iterator], it takes constant time; otherwise it takes linear time.
|
||||||
|
|
||||||
|
[heading Notes]
|
||||||
|
|
||||||
|
* This function is not a customization point and is protected against being found by argument-dependent lookup (ADL).
|
||||||
|
* This function is `constexpr` only in C++14 or later.
|
||||||
|
|
||||||
|
[heading Acknowledgements]
|
||||||
|
|
||||||
|
Contributed by Michel Morin.
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
|
||||||
|
[section:distance Function template `distance()`]
|
||||||
|
|
||||||
|
The `boost::iterators::distance` function template is an adapted version of `std::distance` for the Boost iterator [link iterator.concepts.traversal traversal concepts].
|
||||||
|
|
||||||
|
[heading Header]
|
||||||
|
|
||||||
|
<boost/iterator/distance.hpp>
|
||||||
|
|
||||||
|
[heading Synopsis]
|
||||||
|
|
||||||
|
template <typename Iterator>
|
||||||
|
constexpr typename iterator_difference<Iterator>::type
|
||||||
|
distance(Iterator first, Iterator last);
|
||||||
|
|
||||||
|
[heading Description]
|
||||||
|
|
||||||
|
Computes the (signed) distance from `first` to `last`.
|
||||||
|
|
||||||
|
[heading Requirements]
|
||||||
|
|
||||||
|
`Iterator` should model [link iterator.concepts.traversal.single_pass Single Pass Iterator].
|
||||||
|
|
||||||
|
[heading Preconditions]
|
||||||
|
|
||||||
|
If `Iterator` models [link iterator.concepts.traversal.random_access Random Access Traversal Iterator], `[first, last)` or `[last, first)` should be valid; otherwise `[first, last)` should be valid.
|
||||||
|
|
||||||
|
[heading Complexity]
|
||||||
|
|
||||||
|
If `Iterator` models [link iterator.concepts.traversal.random_access Random Access Traversal Iterator], it takes constant time; otherwise it takes linear time.
|
||||||
|
|
||||||
|
[heading Notes]
|
||||||
|
|
||||||
|
* This function is not a customization point and is protected against being found by argument-dependent lookup (ADL).
|
||||||
|
* This function is `constexpr` only in C++14 or later.
|
||||||
|
|
||||||
|
[heading Acknowledgements]
|
||||||
|
|
||||||
|
Contributed by Michel Morin.
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
|
||||||
|
[section:next_prior Function templates `next()` and `prior()`]
|
||||||
|
|
||||||
|
Certain data types, such as the C++ Standard Library's forward and bidirectional iterators, do not provide addition and subtraction via `operator+()` or `operator-()`. This means that non-modifying computation of the next or prior value requires a temporary, even though `operator++()` or `operator--()` is provided. It also means that writing code like `itr+1` inside a template restricts the iterator category to random access iterators.
|
||||||
|
|
||||||
|
The `next()` and `prior()` functions defined in `boost/next_prior.hpp` provide a simple way around these problems.
|
||||||
|
|
||||||
|
[heading Synopsis]
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
T next(T x)
|
||||||
|
{
|
||||||
|
return ++x;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, class Distance>
|
||||||
|
T next(T x, Distance n)
|
||||||
|
{
|
||||||
|
std::advance(x, n);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
T prior(T x)
|
||||||
|
{
|
||||||
|
return --x;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T, class Distance>
|
||||||
|
T prior(T x, Distance n)
|
||||||
|
{
|
||||||
|
std::advance(x, -n);
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
[note Function implementations above are given for exposition only. The actual implementation has the same effect for iterators, but has different properties, as documented later.]
|
||||||
|
|
||||||
|
[heading Usage]
|
||||||
|
|
||||||
|
Usage is simple:
|
||||||
|
|
||||||
|
const std::list<T>::iterator p = get_some_iterator();
|
||||||
|
const std::list<T>::iterator prev = boost::prior(p);
|
||||||
|
const std::list<T>::iterator next = boost::next(prev, 2);
|
||||||
|
|
||||||
|
The distance from the given iterator should be supplied as an absolute value. For example, the iterator four iterators prior to the given iterator `p` may be obtained by `prior(p, 4)`.
|
||||||
|
|
||||||
|
With C++11, the Standard Library provides `std::next()` and `std::prev()` function templates, which serve the same purpose. However, there are advantages to `boost::next()` and `boost::prior()`.
|
||||||
|
|
||||||
|
First, `boost::next()` and `boost::prior()` are compatible not only with iterators but with any type that provides arithmetic operators `operator++()`, `operator--()`, `operator+()`, `operator-()`, `operator+=()` or `operator-=()`. For example, this is possible:
|
||||||
|
|
||||||
|
int x = 10;
|
||||||
|
int y = boost::next(x, 5);
|
||||||
|
assert(y == 15);
|
||||||
|
|
||||||
|
Second, `boost::next()` and `boost::prior()` use [link iterator.concepts.traversal traversal categories] to select the most efficient implementation. For some kinds of iterators, such as [link iterator.specialized.transform transform iterators], the standard iterator category does not reflect the traversal category correctly and therefore `std::next()` and `std::prev()` will fall back to linear complexity.
|
||||||
|
|
||||||
|
[heading Acknowledgements]
|
||||||
|
|
||||||
|
Contributed by [@http://www.boost.org/people/dave_abrahams.htm Dave Abrahams]. Two-argument versions by Daniel Walker.
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
|
||||||
|
[endsect]
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
[section:archetypes Iterator Archetypes]
|
[section:archetypes Iterator Archetypes]
|
||||||
|
|
||||||
The `iterator_archetype` class constructs a minimal implementation of
|
The `iterator_archetype` class constructs a minimal implementation of
|
||||||
@ -156,5 +155,4 @@ the iterator concept specified by `AccessCategory` and
|
|||||||
arguments. `iterator_archetype` does not model any other access
|
arguments. `iterator_archetype` does not model any other access
|
||||||
concepts or any more derived traversal concepts.
|
concepts or any more derived traversal concepts.
|
||||||
|
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
@ -4,7 +4,7 @@ The iterator concept checking classes provide a mechanism for a
|
|||||||
template to report better error messages when a user instantiates the
|
template to report better error messages when a user instantiates the
|
||||||
template with a type that does not meet the requirements of the
|
template with a type that does not meet the requirements of the
|
||||||
template. For an introduction to using concept checking classes, see
|
template. For an introduction to using concept checking classes, see
|
||||||
the documentation for the boost::concept_check library.
|
the documentation for the _concept_check_ library.
|
||||||
|
|
||||||
[h2 `iterator_concepts.hpp` Synopsis]
|
[h2 `iterator_concepts.hpp` Synopsis]
|
||||||
|
|
||||||
|
@ -1,9 +1,8 @@
|
|||||||
|
|
||||||
[section:concepts Iterator Concepts]
|
[section:concepts Iterator Concepts]
|
||||||
|
|
||||||
[section:concepts_access Access]
|
[section:access Access]
|
||||||
|
|
||||||
[h2 Readable Iterator Concept]
|
[section:readable Readable Iterator Concept]
|
||||||
|
|
||||||
A class or built-in type `X` models the *Readable Iterator* concept
|
A class or built-in type `X` models the *Readable Iterator* concept
|
||||||
for value type `T` if, in addition to `X` being Assignable and
|
for value type `T` if, in addition to `X` being Assignable and
|
||||||
@ -34,8 +33,9 @@ type `T`.
|
|||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
|
||||||
[h2 Writable Iterator Concept ]
|
[endsect]
|
||||||
|
|
||||||
|
[section:writable Writable Iterator Concept]
|
||||||
|
|
||||||
A class or built-in type `X` models the *Writable Iterator* concept
|
A class or built-in type `X` models the *Writable Iterator* concept
|
||||||
if, in addition to `X` being Copy Constructible, the following
|
if, in addition to `X` being Copy Constructible, the following
|
||||||
@ -55,7 +55,9 @@ Iterators have an associated *set of value types*.
|
|||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
|
||||||
[h2 Swappable Iterator Concept]
|
[endsect]
|
||||||
|
|
||||||
|
[section:swappable Swappable Iterator Concept]
|
||||||
|
|
||||||
A class or built-in type `X` models the *Swappable Iterator* concept
|
A class or built-in type `X` models the *Swappable Iterator* concept
|
||||||
if, in addition to `X` being Copy Constructible, the following
|
if, in addition to `X` being Copy Constructible, the following
|
||||||
@ -77,7 +79,9 @@ expressions are valid and respect the stated semantics.
|
|||||||
[blurb *Note:* An iterator that is a model of the *Readable* and *Writable Iterator* concepts
|
[blurb *Note:* An iterator that is a model of the *Readable* and *Writable Iterator* concepts
|
||||||
is also a model of *Swappable Iterator*. *--end note*]
|
is also a model of *Swappable Iterator*. *--end note*]
|
||||||
|
|
||||||
[h2 Lvalue Iterator Concept]
|
[endsect]
|
||||||
|
|
||||||
|
[section:lvalue Lvalue Iterator Concept]
|
||||||
|
|
||||||
The *Lvalue Iterator* concept adds the requirement that the return
|
The *Lvalue Iterator* concept adds the requirement that the return
|
||||||
type of `operator*` type be a reference to the value type of the
|
type of `operator*` type be a reference to the value type of the
|
||||||
@ -101,17 +105,17 @@ iterator.
|
|||||||
|
|
||||||
[endsect]
|
[endsect]
|
||||||
|
|
||||||
[section:concepts_traversal Traversal]
|
[endsect]
|
||||||
|
|
||||||
[h2 Incrementable Iterator Concept]
|
[section:traversal Traversal]
|
||||||
|
|
||||||
|
[section:incrementable Incrementable Iterator Concept]
|
||||||
|
|
||||||
A class or built-in type `X` models the *Incrementable Iterator*
|
A class or built-in type `X` models the *Incrementable Iterator*
|
||||||
concept if, in addition to `X` being Assignable and Copy
|
concept if, in addition to `X` being Assignable and Copy
|
||||||
Constructible, the following expressions are valid and respect the
|
Constructible, the following expressions are valid and respect the
|
||||||
stated semantics.
|
stated semantics.
|
||||||
|
|
||||||
|
|
||||||
[table Incrementable Iterator Requirements (in addition to Assignable, Copy Constructible)
|
[table Incrementable Iterator Requirements (in addition to Assignable, Copy Constructible)
|
||||||
[
|
[
|
||||||
[Expression ]
|
[Expression ]
|
||||||
@ -141,7 +145,9 @@ stated semantics.
|
|||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
|
||||||
[h2 Single Pass Iterator Concept]
|
[endsect]
|
||||||
|
|
||||||
|
[section:single_pass Single Pass Iterator Concept]
|
||||||
|
|
||||||
A class or built-in type `X` models the *Single Pass Iterator*
|
A class or built-in type `X` models the *Single Pass Iterator*
|
||||||
concept if the following expressions are valid and respect the stated
|
concept if the following expressions are valid and respect the stated
|
||||||
@ -168,6 +174,11 @@ semantics.
|
|||||||
[convertible to `bool`]
|
[convertible to `bool`]
|
||||||
[`!(a == b)`]
|
[`!(a == b)`]
|
||||||
]
|
]
|
||||||
|
[
|
||||||
|
[`iterator_traits<X>::difference_type`]
|
||||||
|
[A signed integral type representing the distance between iterators]
|
||||||
|
[]
|
||||||
|
]
|
||||||
[
|
[
|
||||||
[`iterator_traversal<X>::type`]
|
[`iterator_traversal<X>::type`]
|
||||||
[Convertible to`single_pass_traversal_tag`]
|
[Convertible to`single_pass_traversal_tag`]
|
||||||
@ -175,8 +186,9 @@ semantics.
|
|||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
|
||||||
[h2 Forward Traversal Concept]
|
[section:forward Forward Traversal Concept]
|
||||||
|
|
||||||
A class or built-in type `X` models the *Forward Traversal*
|
A class or built-in type `X` models the *Forward Traversal*
|
||||||
concept if, in addition to `X` meeting the requirements of Default
|
concept if, in addition to `X` meeting the requirements of Default
|
||||||
@ -199,11 +211,6 @@ valid and respect the stated semantics.
|
|||||||
[`X&`]
|
[`X&`]
|
||||||
[`r == s` and `r` is dereferenceable implies `++r == ++s.`]
|
[`r == s` and `r` is dereferenceable implies `++r == ++s.`]
|
||||||
]
|
]
|
||||||
[
|
|
||||||
[`iterator_traits<X>::difference_type`]
|
|
||||||
[A signed integral type representing the distance between iterators]
|
|
||||||
[]
|
|
||||||
]
|
|
||||||
[
|
[
|
||||||
[`iterator_traversal<X>::type`]
|
[`iterator_traversal<X>::type`]
|
||||||
[Convertible to `forward_traversal_tag`]
|
[Convertible to `forward_traversal_tag`]
|
||||||
@ -211,7 +218,9 @@ valid and respect the stated semantics.
|
|||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
|
||||||
[h2 Bidirectional Traversal Concept]
|
[endsect]
|
||||||
|
|
||||||
|
[section:bidirectional Bidirectional Traversal Concept]
|
||||||
|
|
||||||
A class or built-in type `X` models the *Bidirectional Traversal*
|
A class or built-in type `X` models the *Bidirectional Traversal*
|
||||||
concept if, in addition to `X` meeting the requirements of Forward
|
concept if, in addition to `X` meeting the requirements of Forward
|
||||||
@ -247,7 +256,9 @@ the stated semantics.
|
|||||||
]
|
]
|
||||||
]
|
]
|
||||||
|
|
||||||
[h2 Random Access Traversal Concept]
|
[endsect]
|
||||||
|
|
||||||
|
[section:random_access Random Access Traversal Concept]
|
||||||
|
|
||||||
A class or built-in type `X` models the *Random Access Traversal*
|
A class or built-in type `X` models the *Random Access Traversal*
|
||||||
concept if the following expressions are valid and respect the stated
|
concept if the following expressions are valid and respect the stated
|
||||||
@ -314,13 +325,13 @@ constant object of type `Distance`.
|
|||||||
[pre: there exists a value `n` of `Distance` such that `a + n == b`. `b == a + (b - a)`.]
|
[pre: there exists a value `n` of `Distance` such that `a + n == b`. `b == a + (b - a)`.]
|
||||||
]
|
]
|
||||||
[
|
[
|
||||||
[`a\[n\]`]
|
[`a[n]`]
|
||||||
[convertible to T]
|
[convertible to T]
|
||||||
[`*(a + n)`]
|
[`*(a + n)`]
|
||||||
[pre: a is a *Readable Iterator*]
|
[pre: a is a *Readable Iterator*]
|
||||||
]
|
]
|
||||||
[
|
[
|
||||||
[`a\[n\] = v`]
|
[`a[n] = v`]
|
||||||
[convertible to T]
|
[convertible to T]
|
||||||
[`*(a + n) = v`]
|
[`*(a + n) = v`]
|
||||||
[pre: a is a *Writable iterator*]
|
[pre: a is a *Writable iterator*]
|
||||||
@ -360,3 +371,5 @@ constant object of type `Distance`.
|
|||||||
[endsect]
|
[endsect]
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
||||||
|
|
||||||
|
[endsect]
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
[section:counting Counting Iterator]
|
[section:counting Counting Iterator]
|
||||||
|
|
||||||
A `counting_iterator` adapts an object by adding an `operator*` that
|
A `counting_iterator` adapts an object by adding an `operator*` that
|
||||||
@ -36,10 +35,12 @@ into the first array via indirection through the second array.
|
|||||||
|
|
||||||
The output is:
|
The output is:
|
||||||
|
|
||||||
|
[pre
|
||||||
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
|
||||||
|
]
|
||||||
|
|
||||||
The source code for this example can be found [@../example/counting_iterator_example.cpp here].
|
The source code for this example can be found [example_link counting_iterator_example.cpp..here].
|
||||||
|
|
||||||
[h2 Reference]
|
[h2 Reference]
|
||||||
|
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
[section:facade Iterator Facade]
|
[section:facade Iterator Facade]
|
||||||
|
|
||||||
While the iterator interface is rich, there is a core subset of the
|
While the iterator interface is rich, there is a core subset of the
|
||||||
@ -141,7 +140,7 @@ standardize the gateway protocol. Note that even if
|
|||||||
open a safety loophole, as every core member function preserves the
|
open a safety loophole, as every core member function preserves the
|
||||||
invariants of the iterator.
|
invariants of the iterator.
|
||||||
|
|
||||||
[h2 `operator\[\]`]
|
[h2 `operator[]`]
|
||||||
|
|
||||||
The indexing operator for a generalized iterator presents special
|
The indexing operator for a generalized iterator presents special
|
||||||
challenges. A random access iterator's `operator[]` is only
|
challenges. A random access iterator's `operator[]` is only
|
||||||
@ -289,7 +288,7 @@ The `iterator_category` member of `iterator_facade` is
|
|||||||
|
|
||||||
.. parsed-literal::
|
.. parsed-literal::
|
||||||
|
|
||||||
*iterator-category*\ (CategoryOrTraversal, value_type, reference)
|
*iterator-category*\ (CategoryOrTraversal, reference, value_type)
|
||||||
|
|
||||||
where *iterator-category* is defined as follows:
|
where *iterator-category* is defined as follows:
|
||||||
|
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
[section:facade_tutorial Tutorial]
|
[section:facade_tutorial Tutorial]
|
||||||
|
|
||||||
In this section we'll walk through the implementation of a few
|
In this section we'll walk through the implementation of a few
|
||||||
@ -255,9 +254,9 @@ make them private and grant friendship to
|
|||||||
|
|
||||||
Voila; a complete and conforming readable, forward-traversal
|
Voila; a complete and conforming readable, forward-traversal
|
||||||
iterator! For a working example of its use, see
|
iterator! For a working example of its use, see
|
||||||
[@../example/node_iterator1.cpp `this program`].
|
[example_link node_iterator1.cpp..this program].
|
||||||
|
|
||||||
__ ../example/node_iterator1.cpp
|
__ ../../example/node_iterator1.cpp
|
||||||
|
|
||||||
[h2 A constant `node_iterator`]
|
[h2 A constant `node_iterator`]
|
||||||
|
|
||||||
@ -285,7 +284,7 @@ changes:
|
|||||||
|
|
||||||
class const_node_iterator
|
class const_node_iterator
|
||||||
: public boost::iterator_facade<
|
: public boost::iterator_facade<
|
||||||
node_iterator
|
const_node_iterator
|
||||||
, node_base **const**
|
, node_base **const**
|
||||||
, boost::forward_traversal_tag
|
, boost::forward_traversal_tag
|
||||||
>
|
>
|
||||||
@ -428,11 +427,11 @@ adding a templatized converting constructor [#broken]_ [#random]_:
|
|||||||
`distance_to` function as well.
|
`distance_to` function as well.
|
||||||
|
|
||||||
|
|
||||||
__ ../example/node_iterator2.hpp
|
__ ../../example/node_iterator2.hpp
|
||||||
|
|
||||||
You can see an example program which exercises our interoperable
|
You can see an example program which exercises our interoperable
|
||||||
iterators
|
iterators
|
||||||
[@../example/node_iterator2.cpp `here`].
|
[example_link node_iterator2.cpp..here].
|
||||||
|
|
||||||
|
|
||||||
[h2 Telling the Truth]
|
[h2 Telling the Truth]
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
[section:filter Filter Iterator]
|
[section:filter Filter Iterator]
|
||||||
|
|
||||||
The filter iterator adaptor creates a view of an iterator range in
|
The filter iterator adaptor creates a view of an iterator range in
|
||||||
@ -19,7 +18,6 @@ This example uses `filter_iterator` and then
|
|||||||
array of integers. Then `make_filter_iterator` is is used to output
|
array of integers. Then `make_filter_iterator` is is used to output
|
||||||
the integers greater than `-2`.
|
the integers greater than `-2`.
|
||||||
|
|
||||||
|
|
||||||
struct is_positive_number {
|
struct is_positive_number {
|
||||||
bool operator()(int x) { return 0 < x; }
|
bool operator()(int x) { return 0 < x; }
|
||||||
};
|
};
|
||||||
@ -52,11 +50,11 @@ the integers greater than `-2`.
|
|||||||
// Another example using make_filter_iterator()
|
// Another example using make_filter_iterator()
|
||||||
std::copy(
|
std::copy(
|
||||||
boost::make_filter_iterator(
|
boost::make_filter_iterator(
|
||||||
std::bind2nd(std::greater<int>(), -2)
|
std::bind(std::greater<int>(), std::placeholders::_1, -2)
|
||||||
, numbers, numbers + N)
|
, numbers, numbers + N)
|
||||||
|
|
||||||
, boost::make_filter_iterator(
|
, boost::make_filter_iterator(
|
||||||
std::bind2nd(std::greater<int>(), -2)
|
std::bind(std::greater<int>(), std::placeholders::_1, -2)
|
||||||
, numbers + N, numbers + N)
|
, numbers + N, numbers + N)
|
||||||
|
|
||||||
, std::ostream_iterator<int>(std::cout, " ")
|
, std::ostream_iterator<int>(std::cout, " ")
|
||||||
@ -70,12 +68,13 @@ the integers greater than `-2`.
|
|||||||
|
|
||||||
The output is:
|
The output is:
|
||||||
|
|
||||||
|
[pre
|
||||||
4 5 8
|
4 5 8
|
||||||
4 5 8
|
4 5 8
|
||||||
0 -1 4 5 8
|
0 -1 4 5 8
|
||||||
|
]
|
||||||
|
|
||||||
|
The source code for this example can be found [example_link filter_iterator_example.cpp..here].
|
||||||
The source code for this example can be found [@../example/filter_iterator_example.cpp here].
|
|
||||||
|
|
||||||
[h2 Reference]
|
[h2 Reference]
|
||||||
|
|
||||||
@ -238,5 +237,4 @@ operations.
|
|||||||
or `m_pred(*m_iter) == true`.[br]
|
or `m_pred(*m_iter) == true`.[br]
|
||||||
[*Returns: ] `*this`
|
[*Returns: ] `*this`
|
||||||
|
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
[section:function_output Function Output Iterator]
|
[section:function_output Function Output Iterator]
|
||||||
|
|
||||||
The function output iterator adaptor makes it easier to create custom
|
The function output iterator adaptor makes it easier to create custom
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
[section:indirect Indirect Iterator]
|
[section:indirect Indirect Iterator]
|
||||||
|
|
||||||
`indirect_iterator` adapts an iterator by applying an
|
`indirect_iterator` adapts an iterator by applying an
|
||||||
@ -50,7 +49,7 @@ using the `make_indirect_iterator` helper function.
|
|||||||
const_indirect_last(pointers_to_chars + N);
|
const_indirect_last(pointers_to_chars + N);
|
||||||
|
|
||||||
std::transform(const_indirect_first, const_indirect_last,
|
std::transform(const_indirect_first, const_indirect_last,
|
||||||
mutable_indirect_first, std::bind1st(std::plus<char>(), 1));
|
mutable_indirect_first, std::bind(std::plus<char>(), 1, std::placeholders::_1));
|
||||||
|
|
||||||
std::copy(mutable_indirect_first, mutable_indirect_last,
|
std::copy(mutable_indirect_first, mutable_indirect_last,
|
||||||
std::ostream_iterator<char>(std::cout, ","));
|
std::ostream_iterator<char>(std::cout, ","));
|
||||||
@ -67,13 +66,14 @@ using the `make_indirect_iterator` helper function.
|
|||||||
|
|
||||||
The output is:
|
The output is:
|
||||||
|
|
||||||
|
[pre
|
||||||
a,b,c,d,e,f,g,
|
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,
|
||||||
|
]
|
||||||
|
|
||||||
The source code for this example can be found
|
The source code for this example can be found
|
||||||
[@../example/indirect_iterator_example.cpp here].
|
[example_link indirect_iterator_example.cpp..here].
|
||||||
|
|
||||||
|
|
||||||
[h2 Reference]
|
[h2 Reference]
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
[library Boost.Iterator
|
[library Boost.Iterator
|
||||||
[/ version 1.0.1]
|
[/ version 1.0.1]
|
||||||
[quickbook 1.6]
|
[quickbook 1.6]
|
||||||
@ -29,7 +28,11 @@
|
|||||||
|
|
||||||
[/ Links ]
|
[/ Links ]
|
||||||
|
|
||||||
[def _iterator_ [@../../libs/iterator/doc/index.html Boost.Iterator]]
|
[def _iterator_ [@../../../iterator/doc/index.html Boost.Iterator]]
|
||||||
|
[def _concept_check_ [@../../../concept_check/index.html Boost.ConceptCheck]]
|
||||||
|
[template example_link[name descr]'''<ulink url="../../example/'''[name]'''">'''[descr]'''</ulink>''']
|
||||||
|
|
||||||
|
[template sub[x]'''<subscript>'''[x]'''</subscript>''']
|
||||||
|
|
||||||
[section:intro Introduction]
|
[section:intro Introduction]
|
||||||
|
|
||||||
@ -71,12 +74,16 @@ and a _GOTW_50_. New-style iterators go well beyond
|
|||||||
patching up `vector<bool>`, though: there are lots of other
|
patching up `vector<bool>`, 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 [@./new-iter-concepts.html Standard Proposal for New-Style Iterators].
|
concepts, see our [@../new-iter-concepts.html Standard Proposal for New-Style Iterators].
|
||||||
|
|
||||||
[h2 Iterator Facade and Adaptor]
|
[h2 Iterator Facade and Adaptor]
|
||||||
|
|
||||||
[def _facade_ [@./iterator_facade.html facade]]
|
[/
|
||||||
[def _adaptor_ [@./iterator_adaptor.html adaptor]]
|
[def _facade_ [link iterator.generic.facade facade]]
|
||||||
|
[def _adaptor_ [link iterator.generic.adaptor adaptor]]
|
||||||
|
]
|
||||||
|
[def _facade_ [@../iterator_facade.html facade]]
|
||||||
|
[def _adaptor_ [@../iterator_adaptor.html adaptor]]
|
||||||
|
|
||||||
Writing standard-conforming iterators is tricky, but the need comes
|
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,
|
||||||
@ -92,9 +99,9 @@ library supplies the _adaptor_ class template, which is specially
|
|||||||
designed to take advantage of as much of the underlying type's
|
designed to take advantage of as much of the underlying type's
|
||||||
behavior as possible.
|
behavior as possible.
|
||||||
|
|
||||||
Both _facade_ and _adaptor_ as well as many of the `specialized
|
Both _facade_ and _adaptor_ as well as many of the [link iterator.specialized specialized
|
||||||
adaptors`_ mentioned below have been proposed for standardization
|
adaptors] mentioned below have been proposed for standardization
|
||||||
([@./facade-and-adaptor.html Standard Proposal For Iterator Facade and Adaptor]).
|
([@../facade-and-adaptor.html Standard Proposal For Iterator Facade and Adaptor]).
|
||||||
|
|
||||||
[h2 Specialized Adaptors]
|
[h2 Specialized Adaptors]
|
||||||
|
|
||||||
@ -103,15 +110,17 @@ iterator templates based on the Boost [link
|
|||||||
iterator.intro.iterator_facade_and_adaptor iterator facade and adaptor]
|
iterator.intro.iterator_facade_and_adaptor iterator facade and adaptor]
|
||||||
templates.
|
templates.
|
||||||
|
|
||||||
[def _counting_ [@./counting_iterator.html `counting_iterator`]]
|
[def _counting_ [link iterator.specialized.counting `counting_iterator`]]
|
||||||
[def _filter_ [@./filter_iterator.html `filter_iterator`]]
|
[def _filter_ [link iterator.specialized.filter `filter_iterator`]]
|
||||||
[def _function_ [@./function_output_iterator.html `function_output_iterator`]]
|
[def _function_input_ [@../function_input_iterator.html `function_input_iterator`]]
|
||||||
[def _indirect_ [@./indirect_iterator.html `indirect_iterator`]]
|
[def _function_output_ [link iterator.specialized.function_output `function_output_iterator`]]
|
||||||
[def _permutation_ [@./permutation_iterator.html `permutation_iterator`]]
|
[def _generator_ [@../generator_iterator.htm `generator_iterator`]]
|
||||||
[def _reverse_ [@./reverse_iterator.html `reverse_iterator`]]
|
[def _indirect_ [link iterator.specialized.indirect `indirect_iterator`]]
|
||||||
[def _shared_ [@./shared_container_iterator.html `shared_container_iterator`]]
|
[def _permutation_ [link iterator.specialized.permutation `permutation_iterator`]]
|
||||||
[def _transform_ [@./transform_iterator.html `transform_iterator`]]
|
[def _reverse_ [link iterator.specialized.reverse `reverse_iterator`]]
|
||||||
[def _zip_ [@./zip_iterator.html `zip_iterator`]]
|
[def _shared_ [link iterator.specialized.shared_container `shared_container_iterator`]]
|
||||||
|
[def _transform_ [link iterator.specialized.transform `transform_iterator`]]
|
||||||
|
[def _zip_ [link iterator.specialized.zip `zip_iterator`]]
|
||||||
|
|
||||||
[def _shared_ptr_ [@../../smart_ptr/shared_ptr.htm `shared_ptr`]]
|
[def _shared_ptr_ [@../../smart_ptr/shared_ptr.htm `shared_ptr`]]
|
||||||
|
|
||||||
@ -121,10 +130,18 @@ templates.
|
|||||||
* _filter_: an iterator over the subset of elements of some
|
* _filter_: an iterator over the subset of elements of some
|
||||||
sequence which satisfy a given predicate
|
sequence which satisfy a given predicate
|
||||||
|
|
||||||
* _function_: an output iterator wrapping a unary function
|
* _function_input_: an input iterator wrapping a generator (nullary
|
||||||
|
function object); each time the iterator is dereferenced, the function object
|
||||||
|
is called to get the value to return.
|
||||||
|
|
||||||
|
* _function_output_: an output iterator wrapping a unary function
|
||||||
object; each time an element is written into the dereferenced
|
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. An outdated analogue of _function_input_.
|
||||||
|
|
||||||
* _indirect_: an iterator over the objects *pointed-to* by the
|
* _indirect_: an iterator over the objects *pointed-to* by the
|
||||||
elements of some sequence.
|
elements of some sequence.
|
||||||
|
|
||||||
@ -133,7 +150,7 @@ templates.
|
|||||||
|
|
||||||
* _reverse_: an iterator which traverses the elements of some
|
* _reverse_: 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 ``std::reverse_iterator``.
|
shortcomings of C++98's `std::reverse_iterator`.
|
||||||
|
|
||||||
* _shared_: an iterator over elements of a container whose
|
* _shared_: an iterator over elements of a container whose
|
||||||
lifetime is maintained by a _shared_ptr_ stored in the iterator.
|
lifetime is maintained by a _shared_ptr_ stored in the iterator.
|
||||||
@ -141,7 +158,7 @@ templates.
|
|||||||
* _transform_: an iterator over elements which are the result of
|
* _transform_: 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
|
||||||
``projection_iterator_adaptor``.
|
`projection_iterator_adaptor`.
|
||||||
|
|
||||||
* _zip_: an iterator over tuples of the elements at corresponding
|
* _zip_: an iterator over tuples of the elements at corresponding
|
||||||
positions of heterogeneous underlying iterators.
|
positions of heterogeneous underlying iterators.
|
||||||
@ -150,9 +167,9 @@ templates.
|
|||||||
|
|
||||||
[h3 Traits]
|
[h3 Traits]
|
||||||
|
|
||||||
[def _pointee_ [@./pointee.html `pointee.hpp`]]
|
[def _pointee_ [link iterator.utilities.traits `pointee.hpp`]]
|
||||||
[def _iterator_traits_ [@./iterator_traits.html `iterator_traits.hpp`]]
|
[def _iterator_traits_ [link iterator.utilities.iterator_traits `iterator_traits.hpp`]]
|
||||||
[def _interoperable_ [@./interoperable.html `interoperable.hpp`]]
|
[def _interoperable_ [@../interoperable.html `interoperable.hpp`]]
|
||||||
[def _MPL_ [@../../mpl/doc/index.html [*MPL]]]
|
[def _MPL_ [@../../mpl/doc/index.html [*MPL]]]
|
||||||
|
|
||||||
* _pointee_: Provides the capability to deduce the referent types
|
* _pointee_: Provides the capability to deduce the referent types
|
||||||
@ -163,19 +180,40 @@ templates.
|
|||||||
retrieve an iterator's traits. Also corrects for the deficiencies
|
retrieve an iterator's traits. Also corrects for the deficiencies
|
||||||
of broken implementations of `std::iterator_traits`.
|
of broken implementations of `std::iterator_traits`.
|
||||||
|
|
||||||
[\ * |interoperable|_ (PDF__): Provides an _MPL_ compatible metafunction for
|
[/
|
||||||
|
* _interoperable_: Provides an _MPL_ compatible metafunction for
|
||||||
testing iterator interoperability
|
testing iterator interoperability
|
||||||
]
|
]
|
||||||
|
|
||||||
[h3 Testing and Concept Checking]
|
[h3 Testing and Concept Checking]
|
||||||
|
|
||||||
[def _iterator_concepts_ [@./iterator_concepts.html `iterator_concepts.hpp`]]
|
[def _iterator_concepts_ [link iterator.concepts `iterator_concepts.hpp`]]
|
||||||
[def _iterator_archetypes_ [@./iterator_archetypes.html `iterator_archetypes.hpp`]]
|
[def _iterator_archetypes_ [link iterator.utilities.archetypes `iterator_archetypes.hpp`]]
|
||||||
|
|
||||||
* _iterator_concepts_: Concept checking classes for the new iterator concepts.
|
* _iterator_concepts_: Concept checking classes for the new iterator concepts.
|
||||||
|
|
||||||
* _iterator_archetypes_: Concept archetype classes for the new iterators concepts.
|
* _iterator_archetypes_: Concept archetype classes for the new iterators concepts.
|
||||||
|
|
||||||
|
[h2 Iterator Algorithms]
|
||||||
|
|
||||||
|
The library provides a number of generic algorithms for use with iterators. These
|
||||||
|
algorithms take advantage of the new concepts defined by the library to provide
|
||||||
|
better performance and functionality.
|
||||||
|
|
||||||
|
[def _advance_ [link iterator.algorithms.advance `advance.hpp`]]
|
||||||
|
[def _distance_ [link iterator.algorithms.distance `distance.hpp`]]
|
||||||
|
[def _next_prior_ [link iterator.algorithms.next_prior `next_prior.hpp`]]
|
||||||
|
|
||||||
|
* _advance_: Provides `advance()` function for advancing an iterator a given number
|
||||||
|
of positions forward or backward.
|
||||||
|
|
||||||
|
* _distance_: Provides `distance()` function for computing distance between two
|
||||||
|
iterators.
|
||||||
|
|
||||||
|
* _next_prior_: Provides `next()` and `prior()` functions for obtaining
|
||||||
|
next and prior iterators to a given iterator. The functions are also compatible
|
||||||
|
with non-iterator types.
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
||||||
|
|
||||||
[include concepts.qbk]
|
[include concepts.qbk]
|
||||||
@ -196,12 +234,14 @@ templates.
|
|||||||
|
|
||||||
[include concept_checking.qbk]
|
[include concept_checking.qbk]
|
||||||
|
|
||||||
[include traits.qbk]
|
[include iterator_traits.qbk]
|
||||||
|
|
||||||
[include utilities.qbk]
|
[include type_traits.qbk]
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
||||||
|
|
||||||
|
[include algorithms.qbk]
|
||||||
|
|
||||||
[section:upgrading Upgrading from the old Boost Iterator Adaptor Library]
|
[section:upgrading Upgrading from the old Boost Iterator Adaptor Library]
|
||||||
|
|
||||||
[def _type_generator_ [@http://www.boost.org/more/generic_programming.html#type_generator type generator]]
|
[def _type_generator_ [@http://www.boost.org/more/generic_programming.html#type_generator type generator]]
|
||||||
@ -265,5 +305,3 @@ library you see today.
|
|||||||
Patterns, C++ Report, February 1995, pp. 24-27.]
|
Patterns, C++ Report, February 1995, pp. 24-27.]
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
||||||
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
|||||||
|
[section:iterator_traits Iterator Traits]
|
||||||
[section:traits Iterator Traits]
|
|
||||||
|
|
||||||
`std::iterator_traits` provides access to five associated types
|
`std::iterator_traits` provides access to five associated types
|
||||||
of any iterator: its `value_type`, `reference`, `pointer`,
|
of any iterator: its `value_type`, `reference`, `pointer`,
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
[section:permutation Permutation Iterator]
|
[section:permutation Permutation Iterator]
|
||||||
|
|
||||||
The permutation iterator adaptor provides a permuted view of a given
|
The permutation iterator adaptor provides a permuted view of a given
|
||||||
@ -75,16 +74,17 @@ past-the-end iterator to the indices.
|
|||||||
|
|
||||||
The output is:
|
The output is:
|
||||||
|
|
||||||
|
[pre
|
||||||
The original range is : 0 1 2 3 4 5 6 7 8 9
|
The original range is : 0 1 2 3 4 5 6 7 8 9
|
||||||
The reindexing scheme is : 9 8 7 6
|
The reindexing scheme is : 9 8 7 6
|
||||||
The permutated range is : 9 8 7 6
|
The permutated range is : 9 8 7 6
|
||||||
Elements at even indices in the permutation : 9 7
|
Elements at even indices in the permutation : 9 7
|
||||||
Permutation backwards : 6 7 8 9
|
Permutation backwards : 6 7 8 9
|
||||||
Iterate backward with stride 2 : 6 8
|
Iterate backward with stride 2 : 6 8
|
||||||
|
]
|
||||||
|
|
||||||
The source code for this example can be found
|
The source code for this example can be found
|
||||||
[@../example/permutation_iter_example.cpp here].
|
[example_link permutation_iter_example.cpp..here].
|
||||||
|
|
||||||
[h2 Reference]
|
[h2 Reference]
|
||||||
|
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
[section:reverse Reverse Iterator]
|
[section:reverse Reverse Iterator]
|
||||||
|
|
||||||
The reverse iterator adaptor iterates through the adapted iterator
|
The reverse iterator adaptor iterates through the adapted iterator
|
||||||
@ -9,7 +8,6 @@ range in the opposite direction.
|
|||||||
The following example prints an array of characters in reverse order
|
The following example prints an array of characters in reverse order
|
||||||
using `reverse_iterator`.
|
using `reverse_iterator`.
|
||||||
|
|
||||||
|
|
||||||
char letters_[] = "hello world!";
|
char letters_[] = "hello world!";
|
||||||
const int N = sizeof(letters_)/sizeof(char) - 1;
|
const int N = sizeof(letters_)/sizeof(char) - 1;
|
||||||
typedef char* base_iterator;
|
typedef char* base_iterator;
|
||||||
@ -35,13 +33,14 @@ using `reverse_iterator`.
|
|||||||
|
|
||||||
The output is:
|
The output is:
|
||||||
|
|
||||||
|
[pre
|
||||||
original sequence of letters: hello world!
|
original sequence of letters: hello world!
|
||||||
sequence in reverse order: !dlrow olleh
|
sequence in reverse order: !dlrow olleh
|
||||||
sequence in double-reversed (normal) order: hello world!
|
sequence in double-reversed (normal) order: hello world!
|
||||||
|
]
|
||||||
|
|
||||||
The source code for this example can be found
|
The source code for this example can be found
|
||||||
[@../example/reverse_iterator_example.cpp here].
|
[example_link reverse_iterator_example.cpp..here].
|
||||||
|
|
||||||
[h2 Reference]
|
[h2 Reference]
|
||||||
|
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
|
|
||||||
[section:shared_container Shared Container Iterator]
|
[section:shared_container Shared Container Iterator]
|
||||||
|
|
||||||
Defined in header [@../../../boost/shared_container_iterator.hpp `boost/shared_container_iterator.hpp`].
|
Defined in header [@../../../boost/iterator/shared_container_iterator.hpp `boost/iterator/shared_container_iterator.hpp`].
|
||||||
|
|
||||||
The purpose of the shared container iterator is to attach the lifetime
|
The purpose of the shared container iterator is to attach the lifetime
|
||||||
of a container to the lifetime of its iterators. In other words, the
|
of a container to the lifetime of its iterators. In other words, the
|
||||||
@ -25,9 +24,22 @@ iterator.
|
|||||||
[h2 Synopsis]
|
[h2 Synopsis]
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
|
namespace iterators {
|
||||||
template <typename Container>
|
template <typename Container>
|
||||||
class shared_container_iterator;
|
class shared_container_iterator;
|
||||||
|
|
||||||
|
template <typename Container>
|
||||||
|
shared_container_iterator<Container>
|
||||||
|
make_shared_container_iterator(typename Container::iterator base,
|
||||||
|
std::shared_ptr<Container> const& container);
|
||||||
|
|
||||||
|
std::pair<
|
||||||
|
typename shared_container_iterator<Container>,
|
||||||
|
typename shared_container_iterator<Container>
|
||||||
|
>
|
||||||
|
make_shared_container_range(std::shared_ptr<Container> const& container);
|
||||||
|
|
||||||
|
// Backward compatibility with boost::shared_ptr
|
||||||
template <typename Container>
|
template <typename Container>
|
||||||
shared_container_iterator<Container>
|
shared_container_iterator<Container>
|
||||||
make_shared_container_iterator(typename Container::iterator base,
|
make_shared_container_iterator(typename Container::iterator base,
|
||||||
@ -39,6 +51,15 @@ iterator.
|
|||||||
>
|
>
|
||||||
make_shared_container_range(boost::shared_ptr<Container> const& container);
|
make_shared_container_range(boost::shared_ptr<Container> const& container);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[note `shared_container_iterator` and its factory functions support both
|
||||||
|
`std::shared_ptr` and `boost::shared_ptr` for a smart pointer that holds
|
||||||
|
a shared reference to the container. However, the support for `boost::shared_ptr`
|
||||||
|
comes at a cost of wrapping it in a `std::shared_ptr` internally. This means
|
||||||
|
that when constructing the iterator from a `boost::shared_ptr`, the construction
|
||||||
|
will have to allocate memory for `std::shared_ptr` shared state, which may
|
||||||
|
potentially fail. It is recommended to use `std::shared_ptr` directly.]
|
||||||
|
|
||||||
[section:shared_container_type The Shared Container Iterator Type]
|
[section:shared_container_type The Shared Container Iterator Type]
|
||||||
|
|
||||||
@ -56,20 +77,19 @@ original shared pointer `ints` ceases to exist after `set_range()`
|
|||||||
returns, the `shared_counter_iterator` objects maintain references to
|
returns, the `shared_counter_iterator` objects maintain references to
|
||||||
the underlying vector and thereby extend the container's lifetime.
|
the underlying vector and thereby extend the container's lifetime.
|
||||||
|
|
||||||
[@../../../libs/utility/shared_iterator_example1.cpp `shared_iterator_example1.cpp`]:
|
[example_link shared_iterator_example1.cpp..`shared_iterator_example1.cpp`]:
|
||||||
|
|
||||||
#include "shared_container_iterator.hpp"
|
#include <boost/iterator/shared_container_iterator.hpp>
|
||||||
#include "boost/shared_ptr.hpp"
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
typedef boost::shared_container_iterator< std::vector<int> > iterator;
|
using iterator = boost::iterators::shared_container_iterator< std::vector<int> >;
|
||||||
|
|
||||||
|
|
||||||
void set_range(iterator& i, iterator& end) {
|
void set_range(iterator& i, iterator& end) {
|
||||||
|
std::shared_ptr< std::vector<int> > ints(new std::vector<int>());
|
||||||
boost::shared_ptr< std::vector<int> > ints(new std::vector<int>());
|
|
||||||
|
|
||||||
ints->push_back(0);
|
ints->push_back(0);
|
||||||
ints->push_back(1);
|
ints->push_back(1);
|
||||||
@ -84,7 +104,6 @@ the underlying vector and thereby extend the container's lifetime.
|
|||||||
|
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
|
||||||
iterator i, end;
|
iterator i, end;
|
||||||
|
|
||||||
set_range(i, end);
|
set_range(i, end);
|
||||||
@ -97,7 +116,9 @@ the underlying vector and thereby extend the container's lifetime.
|
|||||||
|
|
||||||
The output from this part is:
|
The output from this part is:
|
||||||
|
|
||||||
|
[pre
|
||||||
0,1,2,3,4,5,
|
0,1,2,3,4,5,
|
||||||
|
]
|
||||||
|
|
||||||
[table Template Parameters
|
[table Template Parameters
|
||||||
[[Parameter][Description]]
|
[[Parameter][Description]]
|
||||||
@ -115,8 +136,12 @@ The `shared_container_iterator` type implements the member functions
|
|||||||
and operators required of the
|
and operators required of the
|
||||||
[@http://www.sgi.com/tech/stl/RandomAccessIterator.html Random Access
|
[@http://www.sgi.com/tech/stl/RandomAccessIterator.html Random Access
|
||||||
Iterator] concept, though only operations defined for the base
|
Iterator] concept, though only operations defined for the base
|
||||||
iterator will be valid. In addition it has the following constructor:
|
iterator will be valid. In addition it has the following constructors:
|
||||||
|
|
||||||
|
shared_container_iterator(Container::iterator const& it,
|
||||||
|
std::shared_ptr<Container> const& container)
|
||||||
|
|
||||||
|
// Backward compatibility with boost::shared_ptr
|
||||||
shared_container_iterator(Container::iterator const& it,
|
shared_container_iterator(Container::iterator const& it,
|
||||||
boost::shared_ptr<Container> const& container)
|
boost::shared_ptr<Container> const& container)
|
||||||
|
|
||||||
@ -124,6 +149,12 @@ iterator will be valid. In addition it has the following constructor:
|
|||||||
|
|
||||||
[section:shared_container_object_generator The Shared Container Iterator Object Generator]
|
[section:shared_container_object_generator The Shared Container Iterator Object Generator]
|
||||||
|
|
||||||
|
template <typename Container>
|
||||||
|
shared_container_iterator<Container>
|
||||||
|
make_shared_container_iterator(Container::iterator base,
|
||||||
|
std::shared_ptr<Container> const& container)
|
||||||
|
|
||||||
|
// Backward compatibility with boost::shared_ptr
|
||||||
template <typename Container>
|
template <typename Container>
|
||||||
shared_container_iterator<Container>
|
shared_container_iterator<Container>
|
||||||
make_shared_container_iterator(Container::iterator base,
|
make_shared_container_iterator(Container::iterator base,
|
||||||
@ -139,27 +170,25 @@ explicitly specifying its type.
|
|||||||
This example, similar to the previous,
|
This example, similar to the previous,
|
||||||
uses `make_shared_container_iterator()` to create the iterators.
|
uses `make_shared_container_iterator()` to create the iterators.
|
||||||
|
|
||||||
[@../../../libs/utility/shared_iterator_example2.cpp `shared_iterator_example2.cpp`]:
|
[example_link shared_iterator_example2.cpp..`shared_iterator_example2.cpp`]:
|
||||||
|
|
||||||
#include "shared_container_iterator.hpp"
|
#include <boost/iterator/shared_container_iterator.hpp>
|
||||||
#include "boost/shared_ptr.hpp"
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
|
||||||
template <typename Iterator>
|
template <typename Iterator>
|
||||||
void print_range_nl(Iterator begin, Iterator end) {
|
void print_range_nl(Iterator begin, Iterator end) {
|
||||||
typedef typename std::iterator_traits<Iterator>::value_type val;
|
using val = typename std::iterator_traits<Iterator>::value_type;
|
||||||
std::copy(begin, end, std::ostream_iterator<val>(std::cout, ","));
|
std::copy(begin, end, std::ostream_iterator<val>(std::cout, ","));
|
||||||
std::cout.put('\n');
|
std::cout.put('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
using ints_t = std::shared_ptr< std::vector<int> >;
|
||||||
typedef boost::shared_ptr< std::vector<int> > ints_t;
|
|
||||||
{
|
{
|
||||||
ints_t ints(new std::vector<int>());
|
ints_t ints(new std::vector<int>());
|
||||||
|
|
||||||
@ -170,12 +199,10 @@ uses `make_shared_container_iterator()` to create the iterators.
|
|||||||
ints->push_back(4);
|
ints->push_back(4);
|
||||||
ints->push_back(5);
|
ints->push_back(5);
|
||||||
|
|
||||||
print_range_nl(boost::make_shared_container_iterator(ints->begin(),ints),
|
print_range_nl(boost::iterators::make_shared_container_iterator(ints->begin(), ints),
|
||||||
boost::make_shared_container_iterator(ints->end(),ints));
|
boost::iterators::make_shared_container_iterator(ints->end(), ints));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -186,51 +213,59 @@ named. The output from this example is the same as the previous.
|
|||||||
|
|
||||||
[section:shared_container_generator The Shared Container Iterator Range Generator]
|
[section:shared_container_generator The Shared Container Iterator Range Generator]
|
||||||
|
|
||||||
|
template <typename Container>
|
||||||
|
std::pair<
|
||||||
|
shared_container_iterator<Container>,
|
||||||
|
shared_container_iterator<Container>
|
||||||
|
>
|
||||||
|
make_shared_container_range(std::shared_ptr<Container> const& container);
|
||||||
|
|
||||||
|
// Backward compatibility with boost::shared_ptr
|
||||||
template <typename Container>
|
template <typename Container>
|
||||||
std::pair<
|
std::pair<
|
||||||
shared_container_iterator<Container>,
|
shared_container_iterator<Container>,
|
||||||
shared_container_iterator<Container>
|
shared_container_iterator<Container>
|
||||||
>
|
>
|
||||||
make_shared_container_range(boost::shared_ptr<Container> const& container);
|
make_shared_container_range(boost::shared_ptr<Container> const& container);
|
||||||
Class shared_container_iterator is meant primarily to return, using iterators, a range of values that we can guarantee will be alive as long as the iterators are. This is a convenience function to do just that. It is equivalent to
|
|
||||||
|
Class `shared_container_iterator` is meant primarily to return, using iterators,
|
||||||
|
a range of values that we can guarantee will be alive as long as the iterators are.
|
||||||
|
This is a convenience function to do just that. It is functionally equivalent to this:
|
||||||
|
|
||||||
std::make_pair(make_shared_container_iterator(container->begin(), container),
|
std::make_pair(make_shared_container_iterator(container->begin(), container),
|
||||||
make_shared_container_iterator(container->end(), container));
|
make_shared_container_iterator(container->end(), container));
|
||||||
|
|
||||||
[h2 Example]
|
[h2 Example]
|
||||||
|
|
||||||
In the following example, a range of values is returned as a pair of shared_container_iterator objects.
|
In the following example, a range of values is returned as a pair of `shared_container_iterator` objects.
|
||||||
|
|
||||||
[@../../../libs/utility/shared_iterator_example3.cpp `shared_iterator_example3.cpp`]:
|
[example_link shared_iterator_example3.cpp..`shared_iterator_example3.cpp`]:
|
||||||
|
|
||||||
#include "shared_container_iterator.hpp"
|
#include <boost/iterator/shared_container_iterator.hpp>
|
||||||
#include "boost/shared_ptr.hpp"
|
|
||||||
#include "boost/tuple/tuple.hpp" // for boost::tie
|
|
||||||
#include <algorithm> // for std::copy
|
#include <algorithm> // for std::copy
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <memory>
|
||||||
|
#include <tuple> // for std::tie
|
||||||
|
|
||||||
|
|
||||||
typedef boost::shared_container_iterator< std::vector<int> > iterator;
|
using iterator = boost::iterators::shared_container_iterator< std::vector<int> >;
|
||||||
|
|
||||||
std::pair<iterator, iterator>
|
std::pair<iterator, iterator>
|
||||||
return_range() {
|
return_range() {
|
||||||
boost::shared_ptr< std::vector<int> > range(new std::vector<int>());
|
std::shared_ptr< std::vector<int> > range(new std::vector<int>());
|
||||||
range->push_back(0);
|
range->push_back(0);
|
||||||
range->push_back(1);
|
range->push_back(1);
|
||||||
range->push_back(2);
|
range->push_back(2);
|
||||||
range->push_back(3);
|
range->push_back(3);
|
||||||
range->push_back(4);
|
range->push_back(4);
|
||||||
range->push_back(5);
|
range->push_back(5);
|
||||||
return boost::make_shared_container_range(range);
|
return boost::iterators::make_shared_container_range(range);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
|
||||||
|
|
||||||
iterator i,end;
|
iterator i,end;
|
||||||
|
std::tie(i, end) = return_range();
|
||||||
boost::tie(i,end) = return_range();
|
|
||||||
|
|
||||||
std::copy(i, end, std::ostream_iterator<int>(std::cout, ","));
|
std::copy(i, end, std::ostream_iterator<int>(std::cout, ","));
|
||||||
std::cout.put('\n');
|
std::cout.put('\n');
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
[section:specialized Specialized Adaptors]
|
[section:specialized Specialized Adaptors]
|
||||||
|
|
||||||
[include ./counting_iterator.qbk]
|
[include ./counting_iterator.qbk]
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
[section:transform Transform Iterator]
|
[section:transform Transform Iterator]
|
||||||
|
|
||||||
The transform iterator adapts an iterator by modifying the
|
The transform iterator adapts an iterator by modifying the
|
||||||
@ -37,14 +36,15 @@ in this example.
|
|||||||
|
|
||||||
The output is:
|
The output is:
|
||||||
|
|
||||||
|
[pre
|
||||||
multiplying the array by 2:
|
multiplying the array by 2:
|
||||||
2 4 6 8 10 12 14 16
|
2 4 6 8 10 12 14 16
|
||||||
adding 4 to each element in the array:
|
adding 4 to each element in the array:
|
||||||
5 6 7 8 9 10 11 12
|
5 6 7 8 9 10 11 12
|
||||||
|
]
|
||||||
|
|
||||||
The source code for this example can be found
|
The source code for this example can be found
|
||||||
[@../example/transform_iterator_example.cpp here].
|
[example_link transform_iterator_example.cpp..here].
|
||||||
|
|
||||||
[h2 Reference]
|
[h2 Reference]
|
||||||
|
|
||||||
@ -86,7 +86,7 @@ The source code for this example can be found
|
|||||||
|
|
||||||
If `Reference` is `use_default` then the `reference` member of
|
If `Reference` is `use_default` then the `reference` member of
|
||||||
`transform_iterator` is[br]
|
`transform_iterator` is[br]
|
||||||
`result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type`.
|
`result_of<const UnaryFunction(iterator_traits<Iterator>::reference)>::type`.
|
||||||
Otherwise, `reference` is `Reference`.
|
Otherwise, `reference` is `Reference`.
|
||||||
|
|
||||||
|
|
||||||
@ -110,10 +110,10 @@ convertible to `input_iterator_tag`.
|
|||||||
|
|
||||||
|
|
||||||
The type `UnaryFunction` must be Assignable, Copy Constructible, and
|
The type `UnaryFunction` must be Assignable, Copy Constructible, and
|
||||||
the expression `f(*i)` must be valid where `f` is an object of
|
the expression `f(*i)` must be valid where `f` is a const object of
|
||||||
type `UnaryFunction`, `i` is an object of type `Iterator`, and
|
type `UnaryFunction`, `i` is an object of type `Iterator`, and
|
||||||
where the type of `f(*i)` must be
|
where the type of `f(*i)` must be
|
||||||
`result_of<UnaryFunction(iterator_traits<Iterator>::reference)>::type`.
|
`result_of<const UnaryFunction(iterator_traits<Iterator>::reference)>::type`.
|
||||||
|
|
||||||
|
|
||||||
The argument `Iterator` shall model Readable Iterator.
|
The argument `Iterator` shall model Readable Iterator.
|
||||||
|
@ -1,7 +1,4 @@
|
|||||||
|
[section:traits Type Traits]
|
||||||
[section:utilities Iterator Utilities]
|
|
||||||
|
|
||||||
[section:utilities_traits Traits]
|
|
||||||
|
|
||||||
[h2 Overview]
|
[h2 Overview]
|
||||||
|
|
||||||
@ -51,14 +48,14 @@ information is needed, call on `indirect_reference`.
|
|||||||
Both of these templates are essential to the correct functioning of
|
Both of these templates are essential to the correct functioning of
|
||||||
[link iterator.specialized.indirect `indirect_iterator`].
|
[link iterator.specialized.indirect `indirect_iterator`].
|
||||||
|
|
||||||
[h2 `minimum_category`]
|
[h2 `min_category`]
|
||||||
|
|
||||||
`minimum_category` takes two iterator categories or two iterator traversal tags
|
`min_category` takes one or more iterator categories or iterator traversal tags
|
||||||
and returns the one that is the weakest (i.e. least advanced). For example:
|
and returns the one that is the weakest (i.e. least advanced). For example:
|
||||||
|
|
||||||
static_assert(
|
static_assert(
|
||||||
is_same<
|
is_same<
|
||||||
minimum_category<
|
min_category<
|
||||||
std::forward_iterator_tag,
|
std::forward_iterator_tag,
|
||||||
std::random_access_iterator_tag
|
std::random_access_iterator_tag
|
||||||
>::type,
|
>::type,
|
||||||
@ -212,113 +209,3 @@ Otherwise, `type` is defined to the closest iterator traversal tag matching `C`.
|
|||||||
[*Requires:] `Iterator` shall be an iterator.
|
[*Requires:] `Iterator` shall be an iterator.
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
||||||
|
|
||||||
[section:utilities_testing Testing and Concept Checking]
|
|
||||||
|
|
||||||
The iterator concept checking classes provide a mechanism for a
|
|
||||||
template to report better error messages when a user instantiates
|
|
||||||
the template with a type that does not meet the requirements of the
|
|
||||||
template.
|
|
||||||
|
|
||||||
For an introduction to using concept checking classes, see
|
|
||||||
the documentation for the
|
|
||||||
[@../../concept_check/index.html `boost::concept_check`] library.
|
|
||||||
|
|
||||||
|
|
||||||
[h2 Reference]
|
|
||||||
|
|
||||||
[h3 Iterator Access Concepts]
|
|
||||||
|
|
||||||
* |Readable|_
|
|
||||||
* |Writable|_
|
|
||||||
* |Swappable|_
|
|
||||||
* |Lvalue|_
|
|
||||||
|
|
||||||
[/ .. |Readable| replace:: *Readable Iterator* ]
|
|
||||||
[/ .. _Readable: ReadableIterator.html ]
|
|
||||||
[/ ]
|
|
||||||
[/ .. |Writable| replace:: *Writable Iterator* ]
|
|
||||||
[/ .. _Writable: WritableIterator.html ]
|
|
||||||
[/ ]
|
|
||||||
[/ .. |Swappable| replace:: *Swappable Iterator* ]
|
|
||||||
[/ .. _Swappable: SwappableIterator.html ]
|
|
||||||
[/ ]
|
|
||||||
[/ .. |Lvalue| replace:: *Lvalue Iterator* ]
|
|
||||||
[/ .. _Lvalue: LvalueIterator.html ]
|
|
||||||
|
|
||||||
|
|
||||||
Iterator Traversal Concepts
|
|
||||||
...........................
|
|
||||||
|
|
||||||
* |Incrementable|_
|
|
||||||
* |SinglePass|_
|
|
||||||
* |Forward|_
|
|
||||||
* |Bidir|_
|
|
||||||
* |Random|_
|
|
||||||
|
|
||||||
|
|
||||||
[/ .. |Incrementable| replace:: *Incrementable Iterator* ]
|
|
||||||
[/ .. _Incrementable: IncrementableIterator.html ]
|
|
||||||
[/ ]
|
|
||||||
[/ .. |SinglePass| replace:: *Single Pass Iterator* ]
|
|
||||||
[/ .. _SinglePass: SinglePassIterator.html ]
|
|
||||||
[/ ]
|
|
||||||
[/ .. |Forward| replace:: *Forward Traversal* ]
|
|
||||||
[/ .. _Forward: ForwardTraversal.html ]
|
|
||||||
[/ ]
|
|
||||||
[/ .. |Bidir| replace:: *Bidirectional Traversal* ]
|
|
||||||
[/ .. _Bidir: BidirectionalTraversal.html ]
|
|
||||||
[/ ]
|
|
||||||
[/ .. |Random| replace:: *Random Access Traversal* ]
|
|
||||||
[/ .. _Random: RandomAccessTraversal.html ]
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[h3 `iterator_concepts.hpp` Synopsis]
|
|
||||||
|
|
||||||
namespace boost_concepts {
|
|
||||||
|
|
||||||
// Iterator Access Concepts
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
class ReadableIteratorConcept;
|
|
||||||
|
|
||||||
template <
|
|
||||||
typename Iterator
|
|
||||||
, typename ValueType = std::iterator_traits<Iterator>::value_type
|
|
||||||
>
|
|
||||||
class WritableIteratorConcept;
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
class SwappableIteratorConcept;
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
class LvalueIteratorConcept;
|
|
||||||
|
|
||||||
// Iterator Traversal Concepts
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
class IncrementableIteratorConcept;
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
class SinglePassIteratorConcept;
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
class ForwardTraversalConcept;
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
class BidirectionalTraversalConcept;
|
|
||||||
|
|
||||||
template <typename Iterator>
|
|
||||||
class RandomAccessTraversalConcept;
|
|
||||||
|
|
||||||
// Interoperability
|
|
||||||
|
|
||||||
template <typename Iterator, typename ConstIterator>
|
|
||||||
class InteroperableIteratorConcept;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
[endsect]
|
|
||||||
|
|
||||||
[endsect]
|
|
@ -1,4 +1,3 @@
|
|||||||
|
|
||||||
[section:zip Zip Iterator]
|
[section:zip Zip Iterator]
|
||||||
|
|
||||||
The zip iterator provides the ability to parallel-iterate
|
The zip iterator provides the ability to parallel-iterate
|
||||||
@ -53,9 +52,10 @@ These two iterations can now be replaced with a single one as follows:
|
|||||||
A non-generic implementation of `zip_func` could look as follows:
|
A non-generic implementation of `zip_func` could look as follows:
|
||||||
|
|
||||||
|
|
||||||
struct zip_func :
|
struct zip_func
|
||||||
public std::unary_function<const boost::tuple<const double&, const int&>&, void>
|
|
||||||
{
|
{
|
||||||
|
using result_type = void;
|
||||||
|
|
||||||
void operator()(const boost::tuple<const double&, const int&>& t) const
|
void operator()(const boost::tuple<const double&, const int&>& t) const
|
||||||
{
|
{
|
||||||
m_f0(t.get<0>());
|
m_f0(t.get<0>());
|
||||||
|
@ -8,7 +8,6 @@
|
|||||||
: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
|
||||||
|
@ -11,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
|
||||||
|
@ -11,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
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
:Author: David Abrahams, Thomas Becker
|
:Author: David Abrahams, Thomas Becker
|
||||||
:Contact: dave@boost-consulting.com, thomas@styleadvisor.com
|
:Contact: dave@boost-consulting.com, thomas@styleadvisor.com
|
||||||
:organization: `Boost Consulting`_, `Zephyr Associates, Inc.`_
|
:organization: `Boost Consulting`_, `Zephyr Associates, Inc.`_
|
||||||
:date: $Date$
|
|
||||||
:copyright: Copyright David Abrahams and Thomas Becker 2003.
|
:copyright: Copyright David Abrahams and Thomas Becker 2003.
|
||||||
|
|
||||||
.. _`Boost Consulting`: http://www.boost-consulting.com
|
.. _`Boost Consulting`: http://www.boost-consulting.com
|
||||||
|
@ -45,8 +45,7 @@ A non-generic implementation of ``zip_func`` could look as follows:
|
|||||||
::
|
::
|
||||||
|
|
||||||
|
|
||||||
struct zip_func :
|
struct zip_func
|
||||||
public std::unary_function<const boost::tuple<const double&, const int&>&, void>
|
|
||||||
{
|
{
|
||||||
void operator()(const boost::tuple<const double&, const int&>& t) const
|
void operator()(const boost::tuple<const double&, const int&>& t) const
|
||||||
{
|
{
|
||||||
|
@ -8,6 +8,7 @@
|
|||||||
#include <functional>
|
#include <functional>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <boost/iterator/filter_iterator.hpp>
|
#include <boost/iterator/filter_iterator.hpp>
|
||||||
|
#include <boost/bind/bind.hpp>
|
||||||
#include <boost/cstdlib.hpp> // for exit_success
|
#include <boost/cstdlib.hpp> // for exit_success
|
||||||
|
|
||||||
struct is_positive_number {
|
struct is_positive_number {
|
||||||
@ -42,11 +43,11 @@ int main()
|
|||||||
// Another example using make_filter_iterator()
|
// Another example using make_filter_iterator()
|
||||||
std::copy(
|
std::copy(
|
||||||
boost::make_filter_iterator(
|
boost::make_filter_iterator(
|
||||||
std::bind2nd(std::greater<int>(), -2)
|
boost::bind(std::greater<int>(), boost::placeholders::_1, -2)
|
||||||
, numbers, numbers + N)
|
, numbers, numbers + N)
|
||||||
|
|
||||||
, boost::make_filter_iterator(
|
, boost::make_filter_iterator(
|
||||||
std::bind2nd(std::greater<int>(), -2)
|
boost::bind(std::greater<int>(), boost::placeholders::_1, -2)
|
||||||
, numbers + N, numbers + N)
|
, numbers + N, numbers + N)
|
||||||
|
|
||||||
, std::ostream_iterator<int>(std::cout, " ")
|
, std::ostream_iterator<int>(std::cout, " ")
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <boost/function_output_iterator.hpp>
|
#include <boost/iterator/function_output_iterator.hpp>
|
||||||
|
|
||||||
struct string_appender
|
struct string_appender
|
||||||
{
|
{
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#include <iterator>
|
#include <iterator>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <boost/bind/bind.hpp>
|
||||||
#include <boost/iterator/indirect_iterator.hpp>
|
#include <boost/iterator/indirect_iterator.hpp>
|
||||||
|
|
||||||
int main(int, char*[])
|
int main(int, char*[])
|
||||||
@ -41,7 +42,7 @@ int main(int, char*[])
|
|||||||
const_indirect_last(pointers_to_chars + N);
|
const_indirect_last(pointers_to_chars + N);
|
||||||
|
|
||||||
std::transform(const_indirect_first, const_indirect_last,
|
std::transform(const_indirect_first, const_indirect_last,
|
||||||
mutable_indirect_first, std::bind1st(std::plus<char>(), 1));
|
mutable_indirect_first, boost::bind(std::plus<char>(), 1, boost::placeholders::_1));
|
||||||
|
|
||||||
std::copy(mutable_indirect_first, mutable_indirect_last,
|
std::copy(mutable_indirect_first, mutable_indirect_last,
|
||||||
std::ostream_iterator<char>(std::cout, ","));
|
std::ostream_iterator<char>(std::cout, ","));
|
||||||
|
@ -11,7 +11,17 @@
|
|||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#if defined(BOOST_NO_CXX11_SMART_PTR)
|
||||||
|
|
||||||
std::auto_ptr<node<int> > nodes(new node<int>(42));
|
std::auto_ptr<node<int> > nodes(new node<int>(42));
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
std::unique_ptr<node<int> > nodes(new node<int>(42));
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
nodes->append(new node<std::string>(" is greater than "));
|
nodes->append(new node<std::string>(" is greater than "));
|
||||||
nodes->append(new node<int>(13));
|
nodes->append(new node<int>(13));
|
||||||
|
|
||||||
|
@ -12,7 +12,17 @@
|
|||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#if defined(BOOST_NO_CXX11_SMART_PTR)
|
||||||
|
|
||||||
std::auto_ptr<node<int> > nodes(new node<int>(42));
|
std::auto_ptr<node<int> > nodes(new node<int>(42));
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
std::unique_ptr<node<int> > nodes(new node<int>(42));
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
nodes->append(new node<std::string>(" is greater than "));
|
nodes->append(new node<std::string>(" is greater than "));
|
||||||
nodes->append(new node<int>(13));
|
nodes->append(new node<int>(13));
|
||||||
|
|
||||||
|
@ -6,11 +6,7 @@
|
|||||||
|
|
||||||
# include "node.hpp"
|
# include "node.hpp"
|
||||||
# include <boost/iterator/iterator_facade.hpp>
|
# include <boost/iterator/iterator_facade.hpp>
|
||||||
|
# include <type_traits>
|
||||||
# ifndef BOOST_NO_SFINAE
|
|
||||||
# include <boost/type_traits/is_convertible.hpp>
|
|
||||||
# include <boost/utility/enable_if.hpp>
|
|
||||||
# endif
|
|
||||||
|
|
||||||
template <class Value>
|
template <class Value>
|
||||||
class node_iter
|
class node_iter
|
||||||
@ -33,21 +29,13 @@ class node_iter
|
|||||||
template <class OtherValue>
|
template <class OtherValue>
|
||||||
node_iter(
|
node_iter(
|
||||||
node_iter<OtherValue> const& other
|
node_iter<OtherValue> const& other
|
||||||
# ifndef BOOST_NO_SFINAE
|
, typename std::enable_if<
|
||||||
, typename boost::enable_if<
|
std::is_convertible<OtherValue*,Value*>::value
|
||||||
boost::is_convertible<OtherValue*,Value*>
|
|
||||||
, enabler
|
, enabler
|
||||||
>::type = enabler()
|
>::type = enabler()
|
||||||
# endif
|
|
||||||
)
|
)
|
||||||
: m_node(other.m_node) {}
|
: m_node(other.m_node) {}
|
||||||
|
|
||||||
|
|
||||||
# if !BOOST_WORKAROUND(__GNUC__, == 2)
|
|
||||||
private: // GCC2 can't grant friendship to template member functions
|
|
||||||
friend class boost::iterator_core_access;
|
|
||||||
# endif
|
|
||||||
|
|
||||||
template <class OtherValue>
|
template <class OtherValue>
|
||||||
bool equal(node_iter<OtherValue> const& other) const
|
bool equal(node_iter<OtherValue> const& other) const
|
||||||
{
|
{
|
||||||
|
@ -12,7 +12,17 @@
|
|||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#if defined(BOOST_NO_CXX11_SMART_PTR)
|
||||||
|
|
||||||
std::auto_ptr<node<int> > nodes(new node<int>(42));
|
std::auto_ptr<node<int> > nodes(new node<int>(42));
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
std::unique_ptr<node<int> > nodes(new node<int>(42));
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
nodes->append(new node<std::string>(" is greater than "));
|
nodes->append(new node<std::string>(" is greater than "));
|
||||||
nodes->append(new node<int>(13));
|
nodes->append(new node<int>(13));
|
||||||
|
|
||||||
|
@ -6,11 +6,7 @@
|
|||||||
|
|
||||||
# include "node.hpp"
|
# include "node.hpp"
|
||||||
# include <boost/iterator/iterator_adaptor.hpp>
|
# include <boost/iterator/iterator_adaptor.hpp>
|
||||||
|
# include <type_traits>
|
||||||
# ifndef BOOST_NO_SFINAE
|
|
||||||
# include <boost/type_traits/is_convertible.hpp>
|
|
||||||
# include <boost/utility/enable_if.hpp>
|
|
||||||
# endif
|
|
||||||
|
|
||||||
template <class Value>
|
template <class Value>
|
||||||
class node_iter
|
class node_iter
|
||||||
@ -38,12 +34,10 @@ class node_iter
|
|||||||
template <class OtherValue>
|
template <class OtherValue>
|
||||||
node_iter(
|
node_iter(
|
||||||
node_iter<OtherValue> const& other
|
node_iter<OtherValue> const& other
|
||||||
# ifndef BOOST_NO_SFINAE
|
, typename std::enable_if<
|
||||||
, typename boost::enable_if<
|
std::is_convertible<OtherValue*,Value*>::value
|
||||||
boost::is_convertible<OtherValue*,Value*>
|
|
||||||
, enabler
|
, enabler
|
||||||
>::type = enabler()
|
>::type = enabler()
|
||||||
# endif
|
|
||||||
)
|
)
|
||||||
: super_t(other.base()) {}
|
: super_t(other.base()) {}
|
||||||
|
|
||||||
|
42
example/shared_iterator_example1.cpp
Normal file
42
example/shared_iterator_example1.cpp
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
// Copyright 2003 The Trustees of Indiana University.
|
||||||
|
|
||||||
|
// Use, modification and distribution is subject to the Boost Software
|
||||||
|
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
// http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
|
#include "boost/shared_container_iterator.hpp"
|
||||||
|
#include "boost/shared_ptr.hpp"
|
||||||
|
#include <algorithm>
|
||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
typedef boost::shared_container_iterator< std::vector<int> > iterator;
|
||||||
|
|
||||||
|
|
||||||
|
void set_range(iterator& i, iterator& end) {
|
||||||
|
|
||||||
|
boost::shared_ptr< std::vector<int> > ints(new std::vector<int>());
|
||||||
|
|
||||||
|
ints->push_back(0);
|
||||||
|
ints->push_back(1);
|
||||||
|
ints->push_back(2);
|
||||||
|
ints->push_back(3);
|
||||||
|
ints->push_back(4);
|
||||||
|
ints->push_back(5);
|
||||||
|
|
||||||
|
i = iterator(ints->begin(),ints);
|
||||||
|
end = iterator(ints->end(),ints);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
|
||||||
|
iterator i,end;
|
||||||
|
|
||||||
|
set_range(i,end);
|
||||||
|
|
||||||
|
std::copy(i,end,std::ostream_iterator<int>(std::cout,","));
|
||||||
|
std::cout.put('\n');
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
43
example/shared_iterator_example2.cpp
Normal file
43
example/shared_iterator_example2.cpp
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
// Copyright 2003 The Trustees of Indiana University.
|
||||||
|
|
||||||
|
// Use, modification and distribution is subject to the Boost Software
|
||||||
|
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
// http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
|
#include "boost/shared_container_iterator.hpp"
|
||||||
|
#include "boost/shared_ptr.hpp"
|
||||||
|
#include <algorithm>
|
||||||
|
#include <iterator>
|
||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
|
template <typename Iterator>
|
||||||
|
void print_range_nl (Iterator begin, Iterator end) {
|
||||||
|
typedef typename std::iterator_traits<Iterator>::value_type val;
|
||||||
|
std::copy(begin,end,std::ostream_iterator<val>(std::cout,","));
|
||||||
|
std::cout.put('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
|
||||||
|
typedef boost::shared_ptr< std::vector<int> > ints_t;
|
||||||
|
{
|
||||||
|
ints_t ints(new std::vector<int>());
|
||||||
|
|
||||||
|
ints->push_back(0);
|
||||||
|
ints->push_back(1);
|
||||||
|
ints->push_back(2);
|
||||||
|
ints->push_back(3);
|
||||||
|
ints->push_back(4);
|
||||||
|
ints->push_back(5);
|
||||||
|
|
||||||
|
print_range_nl(boost::make_shared_container_iterator(ints->begin(),ints),
|
||||||
|
boost::make_shared_container_iterator(ints->end(),ints));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
41
example/shared_iterator_example3.cpp
Normal file
41
example/shared_iterator_example3.cpp
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
// Copyright 2003 The Trustees of Indiana University.
|
||||||
|
|
||||||
|
// Use, modification and distribution is subject to the Boost Software
|
||||||
|
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
// http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
|
#include "boost/shared_container_iterator.hpp"
|
||||||
|
#include "boost/shared_ptr.hpp"
|
||||||
|
#include "boost/tuple/tuple.hpp" // for boost::tie
|
||||||
|
#include <algorithm> // for std::copy
|
||||||
|
#include <iostream>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
|
||||||
|
typedef boost::shared_container_iterator< std::vector<int> > iterator;
|
||||||
|
|
||||||
|
std::pair<iterator,iterator>
|
||||||
|
return_range() {
|
||||||
|
boost::shared_ptr< std::vector<int> > range(new std::vector<int>());
|
||||||
|
range->push_back(0);
|
||||||
|
range->push_back(1);
|
||||||
|
range->push_back(2);
|
||||||
|
range->push_back(3);
|
||||||
|
range->push_back(4);
|
||||||
|
range->push_back(5);
|
||||||
|
return boost::make_shared_container_range(range);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
|
||||||
|
|
||||||
|
iterator i,end;
|
||||||
|
|
||||||
|
boost::tie(i,end) = return_range();
|
||||||
|
|
||||||
|
std::copy(i,end,std::ostream_iterator<int>(std::cout,","));
|
||||||
|
std::cout.put('\n');
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
@ -16,9 +16,10 @@
|
|||||||
namespace boost {
|
namespace boost {
|
||||||
|
|
||||||
template <class Operation>
|
template <class Operation>
|
||||||
class binder1st
|
class binder1st {
|
||||||
: public std::unary_function<typename Operation::second_argument_type,
|
public:
|
||||||
typename Operation::result_type> {
|
typedef typename Operation::result_type result_type;
|
||||||
|
typedef typename Operation::second_argument_type argument_type;
|
||||||
protected:
|
protected:
|
||||||
Operation op;
|
Operation op;
|
||||||
typename Operation::first_argument_type value;
|
typename Operation::first_argument_type value;
|
||||||
@ -72,5 +73,3 @@ main(int, char*[])
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,62 +1,18 @@
|
|||||||
// (C) Copyright Jeremy Siek 2001.
|
// (C) Copyright Andrey Semashev 2017.
|
||||||
// Distributed under the Boost Software License, Version 1.0. (See
|
// Distributed under the Boost Software License, Version 1.0. (See
|
||||||
// accompanying file LICENSE_1_0.txt or copy at
|
// accompanying file LICENSE_1_0.txt or copy at
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
// http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
// Revision History:
|
|
||||||
|
|
||||||
// 27 Feb 2001 Jeremy Siek
|
|
||||||
// Initial checkin.
|
|
||||||
|
|
||||||
#ifndef BOOST_FUNCTION_OUTPUT_ITERATOR_HPP
|
#ifndef BOOST_FUNCTION_OUTPUT_ITERATOR_HPP
|
||||||
#define BOOST_FUNCTION_OUTPUT_ITERATOR_HPP
|
#define BOOST_FUNCTION_OUTPUT_ITERATOR_HPP
|
||||||
|
|
||||||
#include <iterator>
|
// This is a deprecated header left for backward compatibility.
|
||||||
|
// Use boost/iterator/function_output_iterator.hpp instead.
|
||||||
|
|
||||||
namespace boost {
|
#include <boost/config/header_deprecated.hpp>
|
||||||
namespace iterators {
|
|
||||||
|
|
||||||
template <class UnaryFunction>
|
BOOST_HEADER_DEPRECATED("<boost/iterator/function_output_iterator.hpp>")
|
||||||
class function_output_iterator {
|
|
||||||
typedef function_output_iterator self;
|
|
||||||
public:
|
|
||||||
typedef std::output_iterator_tag iterator_category;
|
|
||||||
typedef void value_type;
|
|
||||||
typedef void difference_type;
|
|
||||||
typedef void pointer;
|
|
||||||
typedef void reference;
|
|
||||||
|
|
||||||
explicit function_output_iterator() {}
|
#include <boost/iterator/function_output_iterator.hpp>
|
||||||
|
|
||||||
explicit function_output_iterator(const UnaryFunction& f)
|
|
||||||
: m_f(f) {}
|
|
||||||
|
|
||||||
struct output_proxy {
|
|
||||||
output_proxy(UnaryFunction& f) : m_f(f) { }
|
|
||||||
template <class T> output_proxy& operator=(const T& value) {
|
|
||||||
m_f(value);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
UnaryFunction& m_f;
|
|
||||||
};
|
|
||||||
output_proxy operator*() { return output_proxy(m_f); }
|
|
||||||
self& operator++() { return *this; }
|
|
||||||
self& operator++(int) { return *this; }
|
|
||||||
private:
|
|
||||||
UnaryFunction m_f;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class UnaryFunction>
|
|
||||||
inline function_output_iterator<UnaryFunction>
|
|
||||||
make_function_output_iterator(const UnaryFunction& f = UnaryFunction()) {
|
|
||||||
return function_output_iterator<UnaryFunction>(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace iterators
|
|
||||||
|
|
||||||
using iterators::function_output_iterator;
|
|
||||||
using iterators::make_function_output_iterator;
|
|
||||||
|
|
||||||
} // namespace boost
|
|
||||||
|
|
||||||
#endif // BOOST_FUNCTION_OUTPUT_ITERATOR_HPP
|
#endif // BOOST_FUNCTION_OUTPUT_ITERATOR_HPP
|
||||||
|
@ -1,85 +1,14 @@
|
|||||||
// (C) Copyright Jens Maurer 2001.
|
// (C) Copyright Andrey Semashev 2025.
|
||||||
// Distributed under the Boost Software License, Version 1.0. (See
|
// Distributed under the Boost Software License, Version 1.0. (See
|
||||||
// accompanying file LICENSE_1_0.txt or copy at
|
// accompanying file LICENSE_1_0.txt or copy at
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
// http://www.boost.org/LICENSE_1_0.txt)
|
||||||
//
|
|
||||||
// Revision History:
|
|
||||||
|
|
||||||
// 15 Nov 2001 Jens Maurer
|
|
||||||
// created.
|
|
||||||
|
|
||||||
// See http://www.boost.org/libs/utility/iterator_adaptors.htm for documentation.
|
|
||||||
|
|
||||||
#ifndef BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP
|
#ifndef BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP
|
||||||
#define BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP
|
#define BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP
|
||||||
|
|
||||||
#include <boost/iterator/iterator_facade.hpp>
|
// This is a deprecated header left for backward compatibility.
|
||||||
#include <boost/ref.hpp>
|
// Please use <boost/iterator/generator_iterator.hpp> instead.
|
||||||
|
|
||||||
namespace boost {
|
#include <boost/iterator/generator_iterator.hpp>
|
||||||
namespace iterators {
|
|
||||||
|
|
||||||
template<class Generator>
|
|
||||||
class generator_iterator
|
|
||||||
: public iterator_facade<
|
|
||||||
generator_iterator<Generator>
|
|
||||||
, typename Generator::result_type
|
|
||||||
, single_pass_traversal_tag
|
|
||||||
, typename Generator::result_type const&
|
|
||||||
>
|
|
||||||
{
|
|
||||||
typedef iterator_facade<
|
|
||||||
generator_iterator<Generator>
|
|
||||||
, typename Generator::result_type
|
|
||||||
, single_pass_traversal_tag
|
|
||||||
, typename Generator::result_type const&
|
|
||||||
> super_t;
|
|
||||||
|
|
||||||
public:
|
|
||||||
generator_iterator() {}
|
|
||||||
generator_iterator(Generator* g) : m_g(g), m_value((*m_g)()) {}
|
|
||||||
|
|
||||||
void increment()
|
|
||||||
{
|
|
||||||
m_value = (*m_g)();
|
|
||||||
}
|
|
||||||
|
|
||||||
const typename Generator::result_type&
|
|
||||||
dereference() const
|
|
||||||
{
|
|
||||||
return m_value;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool equal(generator_iterator const& y) const
|
|
||||||
{
|
|
||||||
return this->m_g == y.m_g && this->m_value == y.m_value;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
Generator* m_g;
|
|
||||||
typename Generator::result_type m_value;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<class Generator>
|
|
||||||
struct generator_iterator_generator
|
|
||||||
{
|
|
||||||
typedef generator_iterator<Generator> type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class Generator>
|
|
||||||
inline generator_iterator<Generator>
|
|
||||||
make_generator_iterator(Generator & gen)
|
|
||||||
{
|
|
||||||
typedef generator_iterator<Generator> result_t;
|
|
||||||
return result_t(&gen);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace iterators
|
|
||||||
|
|
||||||
using iterators::generator_iterator;
|
|
||||||
using iterators::generator_iterator_generator;
|
|
||||||
using iterators::make_generator_iterator;
|
|
||||||
|
|
||||||
} // namespace boost
|
|
||||||
|
|
||||||
#endif // BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP
|
#endif // BOOST_ITERATOR_ADAPTOR_GENERATOR_ITERATOR_HPP
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#ifndef INDIRECT_REFERENCE_DWA200415_HPP
|
#ifndef BOOST_INDIRECT_REFERENCE_DWA200415_HPP
|
||||||
# define INDIRECT_REFERENCE_DWA200415_HPP
|
#define BOOST_INDIRECT_REFERENCE_DWA200415_HPP
|
||||||
|
|
||||||
//
|
//
|
||||||
// Copyright David Abrahams 2004. Use, modification and distribution is
|
// Copyright David Abrahams 2004. Use, modification and distribution is
|
||||||
@ -11,33 +11,36 @@
|
|||||||
// http://www.boost.org/libs/iterator/doc/pointee.html
|
// http://www.boost.org/libs/iterator/doc/pointee.html
|
||||||
//
|
//
|
||||||
|
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
#include <boost/detail/is_incrementable.hpp>
|
#include <boost/detail/is_incrementable.hpp>
|
||||||
#include <boost/iterator/iterator_traits.hpp>
|
#include <boost/iterator/iterator_traits.hpp>
|
||||||
# include <boost/type_traits/remove_cv.hpp>
|
|
||||||
# include <boost/mpl/eval_if.hpp>
|
|
||||||
#include <boost/pointee.hpp>
|
#include <boost/pointee.hpp>
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
namespace detail
|
template< typename P >
|
||||||
{
|
|
||||||
template <class P>
|
|
||||||
struct smart_ptr_reference
|
struct smart_ptr_reference
|
||||||
{
|
{
|
||||||
typedef typename boost::pointee<P>::type& type;
|
using type = boost::pointee_t< P >&;
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
template <class P>
|
} // namespace detail
|
||||||
struct indirect_reference
|
|
||||||
: mpl::eval_if<
|
template< typename P >
|
||||||
detail::is_incrementable<P>
|
struct indirect_reference :
|
||||||
, iterator_reference<P>
|
std::conditional<
|
||||||
, detail::smart_ptr_reference<P>
|
detail::is_incrementable< P >::value,
|
||||||
>
|
iterator_reference< P >,
|
||||||
|
detail::smart_ptr_reference< P >
|
||||||
|
>::type
|
||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template< typename P >
|
||||||
|
using indirect_reference_t = typename indirect_reference< P >::type;
|
||||||
|
|
||||||
} // namespace boost
|
} // namespace boost
|
||||||
|
|
||||||
#endif // INDIRECT_REFERENCE_DWA200415_HPP
|
#endif // BOOST_INDIRECT_REFERENCE_DWA200415_HPP
|
||||||
|
74
include/boost/iterator/advance.hpp
Normal file
74
include/boost/iterator/advance.hpp
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
// 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)
|
||||||
|
|
||||||
|
#ifndef BOOST_ITERATOR_ADVANCE_HPP
|
||||||
|
#define BOOST_ITERATOR_ADVANCE_HPP
|
||||||
|
|
||||||
|
#include <boost/config.hpp>
|
||||||
|
#include <boost/iterator/iterator_categories.hpp>
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
namespace iterators {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
template< typename InputIterator, typename Distance >
|
||||||
|
inline BOOST_CXX14_CONSTEXPR void advance_impl(InputIterator& it, Distance n, incrementable_traversal_tag)
|
||||||
|
{
|
||||||
|
while (n > 0)
|
||||||
|
{
|
||||||
|
++it;
|
||||||
|
--n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template< typename BidirectionalIterator, typename Distance >
|
||||||
|
inline BOOST_CXX14_CONSTEXPR void advance_impl(BidirectionalIterator& it, Distance n, bidirectional_traversal_tag)
|
||||||
|
{
|
||||||
|
if (n >= 0)
|
||||||
|
{
|
||||||
|
while (n > 0)
|
||||||
|
{
|
||||||
|
++it;
|
||||||
|
--n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while (n < 0)
|
||||||
|
{
|
||||||
|
--it;
|
||||||
|
++n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template< typename RandomAccessIterator, typename Distance >
|
||||||
|
inline BOOST_CXX14_CONSTEXPR void advance_impl(RandomAccessIterator& it, Distance n, random_access_traversal_tag)
|
||||||
|
{
|
||||||
|
it += n;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
|
namespace advance_adl_barrier {
|
||||||
|
|
||||||
|
template< typename InputIterator, typename Distance >
|
||||||
|
inline BOOST_CXX14_CONSTEXPR void advance(InputIterator& it, Distance n)
|
||||||
|
{
|
||||||
|
detail::advance_impl(it, n, typename iterator_traversal< InputIterator >::type());
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace advance_adl_barrier
|
||||||
|
|
||||||
|
using namespace advance_adl_barrier;
|
||||||
|
|
||||||
|
} // namespace iterators
|
||||||
|
|
||||||
|
using namespace iterators::advance_adl_barrier;
|
||||||
|
|
||||||
|
} // namespace boost
|
||||||
|
|
||||||
|
#endif
|
@ -2,127 +2,138 @@
|
|||||||
// Distributed under the Boost Software License, Version 1.0. (See
|
// Distributed under the Boost Software License, Version 1.0. (See
|
||||||
// accompanying file LICENSE_1_0.txt or copy at
|
// accompanying file LICENSE_1_0.txt or copy at
|
||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
// http://www.boost.org/LICENSE_1_0.txt)
|
||||||
#ifndef COUNTING_ITERATOR_DWA200348_HPP
|
#ifndef BOOST_ITERATOR_COUNTING_ITERATOR_DWA200348_HPP
|
||||||
# define COUNTING_ITERATOR_DWA200348_HPP
|
#define BOOST_ITERATOR_COUNTING_ITERATOR_DWA200348_HPP
|
||||||
|
|
||||||
# include <boost/iterator/iterator_adaptor.hpp>
|
#include <limits>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
#include <boost/config.hpp>
|
||||||
|
#include <boost/core/use_default.hpp>
|
||||||
#include <boost/detail/numeric_traits.hpp>
|
#include <boost/detail/numeric_traits.hpp>
|
||||||
# include <boost/mpl/bool.hpp>
|
#include <boost/iterator/iterator_adaptor.hpp>
|
||||||
# include <boost/mpl/if.hpp>
|
#include <boost/iterator/iterator_categories.hpp>
|
||||||
# include <boost/mpl/identity.hpp>
|
#include <boost/iterator/detail/if_default.hpp>
|
||||||
# include <boost/mpl/eval_if.hpp>
|
#include <boost/iterator/detail/eval_if_default.hpp>
|
||||||
|
#include <boost/iterator/detail/type_traits/type_identity.hpp>
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
namespace iterators {
|
namespace iterators {
|
||||||
|
|
||||||
template<
|
template<
|
||||||
class Incrementable
|
typename Incrementable,
|
||||||
, class CategoryOrTraversal
|
typename CategoryOrTraversal,
|
||||||
, class Difference
|
typename Difference
|
||||||
>
|
>
|
||||||
class counting_iterator;
|
class counting_iterator;
|
||||||
|
|
||||||
namespace detail
|
namespace detail {
|
||||||
{
|
|
||||||
// Try to detect numeric types at compile time in ways compatible
|
// Try to detect numeric types at compile time in ways compatible
|
||||||
// with the limitations of the compiler and library.
|
// with the limitations of the compiler and library.
|
||||||
template <class T>
|
template< typename T >
|
||||||
struct is_numeric_impl
|
struct is_numeric :
|
||||||
{
|
public std::integral_constant< bool, std::numeric_limits< T >::is_specialized >
|
||||||
// For a while, this wasn't true, but we rely on it below. This is a regression assert.
|
|
||||||
BOOST_STATIC_ASSERT(::boost::is_integral<char>::value);
|
|
||||||
|
|
||||||
# ifndef BOOST_NO_LIMITS_COMPILE_TIME_CONSTANTS
|
|
||||||
|
|
||||||
BOOST_STATIC_CONSTANT(bool, value = std::numeric_limits<T>::is_specialized);
|
|
||||||
|
|
||||||
# else
|
|
||||||
|
|
||||||
# if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
|
|
||||||
BOOST_STATIC_CONSTANT(
|
|
||||||
bool, value = (
|
|
||||||
boost::is_convertible<int,T>::value
|
|
||||||
&& boost::is_convertible<T,int>::value
|
|
||||||
));
|
|
||||||
# else
|
|
||||||
BOOST_STATIC_CONSTANT(bool, value = ::boost::is_arithmetic<T>::value);
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# endif
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
struct is_numeric
|
|
||||||
: mpl::bool_<(::boost::iterators::detail::is_numeric_impl<T>::value)>
|
|
||||||
{};
|
{};
|
||||||
|
|
||||||
# if defined(BOOST_HAS_LONG_LONG)
|
|
||||||
template<>
|
template<>
|
||||||
struct is_numeric< ::boost::long_long_type>
|
struct is_numeric< long long > :
|
||||||
: mpl::true_ {};
|
public std::true_type
|
||||||
|
{};
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
struct is_numeric< ::boost::ulong_long_type>
|
struct is_numeric< unsigned long long > :
|
||||||
: mpl::true_ {};
|
public std::true_type
|
||||||
|
{};
|
||||||
|
|
||||||
|
#if defined(BOOST_HAS_INT128)
|
||||||
|
template<>
|
||||||
|
struct is_numeric< boost::int128_type > :
|
||||||
|
public std::true_type
|
||||||
|
{};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct is_numeric< boost::uint128_type > :
|
||||||
|
public std::true_type
|
||||||
|
{};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Some compilers fail to have a numeric_limits specialization
|
// Some compilers fail to have a numeric_limits specialization
|
||||||
template<>
|
template<>
|
||||||
struct is_numeric<wchar_t>
|
struct is_numeric< wchar_t > :
|
||||||
: mpl::true_ {};
|
public std::true_type
|
||||||
|
{};
|
||||||
|
|
||||||
template <class T>
|
template< typename T >
|
||||||
struct numeric_difference
|
struct numeric_difference
|
||||||
{
|
{
|
||||||
typedef typename boost::detail::numeric_traits<T>::difference_type type;
|
using type = typename boost::detail::numeric_traits< T >::difference_type;
|
||||||
};
|
};
|
||||||
|
|
||||||
BOOST_STATIC_ASSERT(is_numeric<int>::value);
|
#if defined(BOOST_HAS_INT128)
|
||||||
|
// std::numeric_limits, which is used by numeric_traits, is not specialized for __int128 in some standard libraries
|
||||||
|
template<>
|
||||||
|
struct numeric_difference< boost::int128_type >
|
||||||
|
{
|
||||||
|
using type = boost::int128_type;
|
||||||
|
};
|
||||||
|
|
||||||
template <class Incrementable, class CategoryOrTraversal, class Difference>
|
template<>
|
||||||
|
struct numeric_difference< boost::uint128_type >
|
||||||
|
{
|
||||||
|
using type = boost::int128_type;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
template< typename Incrementable, typename CategoryOrTraversal, typename Difference, bool IsNumeric = is_numeric< Incrementable >::value >
|
||||||
|
struct counting_iterator_types
|
||||||
|
{
|
||||||
|
using traversal = detail::eval_if_default_t<
|
||||||
|
CategoryOrTraversal,
|
||||||
|
iterator_traversal< Incrementable >
|
||||||
|
>;
|
||||||
|
|
||||||
|
using difference = detail::eval_if_default_t<
|
||||||
|
Difference,
|
||||||
|
iterator_difference< Incrementable >
|
||||||
|
>;
|
||||||
|
};
|
||||||
|
|
||||||
|
template< typename Incrementable, typename CategoryOrTraversal, typename Difference >
|
||||||
|
struct counting_iterator_types< Incrementable, CategoryOrTraversal, Difference, true >
|
||||||
|
{
|
||||||
|
using traversal = detail::if_default_t<
|
||||||
|
CategoryOrTraversal,
|
||||||
|
random_access_traversal_tag
|
||||||
|
>;
|
||||||
|
|
||||||
|
using difference = detail::eval_if_default_t<
|
||||||
|
Difference,
|
||||||
|
numeric_difference< Incrementable >
|
||||||
|
>;
|
||||||
|
};
|
||||||
|
|
||||||
|
template< typename Incrementable, typename CategoryOrTraversal, typename Difference >
|
||||||
struct counting_iterator_base
|
struct counting_iterator_base
|
||||||
{
|
{
|
||||||
typedef typename detail::ia_dflt_help<
|
using iterator_types = counting_iterator_types< Incrementable, CategoryOrTraversal, Difference >;
|
||||||
CategoryOrTraversal
|
|
||||||
, mpl::eval_if<
|
|
||||||
is_numeric<Incrementable>
|
|
||||||
, mpl::identity<random_access_traversal_tag>
|
|
||||||
, iterator_traversal<Incrementable>
|
|
||||||
>
|
|
||||||
>::type traversal;
|
|
||||||
|
|
||||||
typedef typename detail::ia_dflt_help<
|
using type = iterator_adaptor<
|
||||||
Difference
|
counting_iterator< Incrementable, CategoryOrTraversal, Difference >, // self
|
||||||
, mpl::eval_if<
|
Incrementable, // Base
|
||||||
is_numeric<Incrementable>
|
|
||||||
, numeric_difference<Incrementable>
|
|
||||||
, iterator_difference<Incrementable>
|
|
||||||
>
|
|
||||||
>::type difference;
|
|
||||||
|
|
||||||
typedef iterator_adaptor<
|
|
||||||
counting_iterator<Incrementable, CategoryOrTraversal, Difference> // self
|
|
||||||
, Incrementable // Base
|
|
||||||
, Incrementable // Value
|
|
||||||
#ifndef BOOST_ITERATOR_REF_CONSTNESS_KILLS_WRITABILITY
|
#ifndef BOOST_ITERATOR_REF_CONSTNESS_KILLS_WRITABILITY
|
||||||
const // MSVC won't strip this. Instead we enable Thomas'
|
const // MSVC won't strip this. Instead we enable Thomas'
|
||||||
// criterion (see boost/iterator/detail/facade_iterator_category.hpp)
|
// criterion (see boost/iterator/detail/facade_iterator_category.hpp)
|
||||||
#endif
|
#endif
|
||||||
, traversal
|
Incrementable, // Value
|
||||||
, Incrementable const& // reference
|
typename iterator_types::traversal,
|
||||||
, difference
|
Incrementable const&, // reference
|
||||||
> type;
|
typename iterator_types::difference
|
||||||
|
>;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Template class distance_policy_select -- choose a policy for computing the
|
// A distance calculation policy for wrapped iterators
|
||||||
// distance between counting_iterators at compile-time based on whether or not
|
template< typename Difference, typename Incrementable1, typename Incrementable2 >
|
||||||
// the iterator wraps an integer or an iterator, using "poor man's partial
|
|
||||||
// specialization".
|
|
||||||
|
|
||||||
template <bool is_integer> struct distance_policy_select;
|
|
||||||
|
|
||||||
// A policy for wrapped iterators
|
|
||||||
template <class Difference, class Incrementable1, class Incrementable2>
|
|
||||||
struct iterator_distance
|
struct iterator_distance
|
||||||
{
|
{
|
||||||
static Difference distance(Incrementable1 x, Incrementable2 y)
|
static Difference distance(Incrementable1 x, Incrementable2 y)
|
||||||
@ -131,8 +142,8 @@ namespace detail
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// A policy for wrapped numbers
|
// A distance calculation policy for wrapped numbers
|
||||||
template <class Difference, class Incrementable1, class Incrementable2>
|
template< typename Difference, typename Incrementable1, typename Incrementable2 >
|
||||||
struct number_distance
|
struct number_distance
|
||||||
{
|
{
|
||||||
static Difference distance(Incrementable1 x, Incrementable2 y)
|
static Difference distance(Incrementable1 x, Incrementable2 y)
|
||||||
@ -140,74 +151,63 @@ namespace detail
|
|||||||
return boost::detail::numeric_distance(x, y);
|
return boost::detail::numeric_distance(x, y);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
template<
|
template<
|
||||||
class Incrementable
|
typename Incrementable,
|
||||||
, class CategoryOrTraversal = use_default
|
typename CategoryOrTraversal = use_default,
|
||||||
, class Difference = use_default
|
typename Difference = use_default
|
||||||
>
|
>
|
||||||
class counting_iterator
|
class counting_iterator :
|
||||||
: public detail::counting_iterator_base<
|
public detail::counting_iterator_base< Incrementable, CategoryOrTraversal, Difference >::type
|
||||||
Incrementable, CategoryOrTraversal, Difference
|
|
||||||
>::type
|
|
||||||
{
|
{
|
||||||
typedef typename detail::counting_iterator_base<
|
|
||||||
Incrementable, CategoryOrTraversal, Difference
|
|
||||||
>::type super_t;
|
|
||||||
|
|
||||||
friend class iterator_core_access;
|
friend class iterator_core_access;
|
||||||
|
|
||||||
|
private:
|
||||||
|
using super_t = typename detail::counting_iterator_base<
|
||||||
|
Incrementable, CategoryOrTraversal, Difference
|
||||||
|
>::type;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
typedef typename super_t::difference_type difference_type;
|
using reference = typename super_t::reference;
|
||||||
|
using difference_type = typename super_t::difference_type;
|
||||||
|
|
||||||
counting_iterator() { }
|
counting_iterator() = default;
|
||||||
|
|
||||||
counting_iterator(counting_iterator const& rhs) : super_t(rhs.base()) {}
|
counting_iterator(counting_iterator const&) = default;
|
||||||
|
counting_iterator& operator=(counting_iterator const&) = default;
|
||||||
|
|
||||||
counting_iterator(Incrementable x)
|
counting_iterator(Incrementable x) :
|
||||||
: super_t(x)
|
super_t(x)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
# if 0
|
|
||||||
template<class OtherIncrementable>
|
|
||||||
counting_iterator(
|
|
||||||
counting_iterator<OtherIncrementable, CategoryOrTraversal, Difference> const& t
|
|
||||||
, typename enable_if_convertible<OtherIncrementable, Incrementable>::type* = 0
|
|
||||||
)
|
|
||||||
: super_t(t.base())
|
|
||||||
{}
|
|
||||||
# endif
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
reference dereference() const
|
||||||
typename super_t::reference dereference() const
|
|
||||||
{
|
{
|
||||||
return this->base_reference();
|
return this->base_reference();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class OtherIncrementable>
|
template< typename OtherIncrementable >
|
||||||
difference_type
|
difference_type
|
||||||
distance_to(counting_iterator< OtherIncrementable, CategoryOrTraversal, Difference > const& y) const
|
distance_to(counting_iterator< OtherIncrementable, CategoryOrTraversal, Difference > const& y) const
|
||||||
{
|
{
|
||||||
typedef typename mpl::if_<
|
using distance_traits = typename std::conditional<
|
||||||
detail::is_numeric<Incrementable>
|
detail::is_numeric< Incrementable >::value,
|
||||||
, detail::number_distance<difference_type, Incrementable, OtherIncrementable>
|
detail::number_distance< difference_type, Incrementable, OtherIncrementable >,
|
||||||
, detail::iterator_distance<difference_type, Incrementable, OtherIncrementable>
|
detail::iterator_distance< difference_type, Incrementable, OtherIncrementable >
|
||||||
>::type d;
|
>::type;
|
||||||
|
|
||||||
return d::distance(this->base(), y.base());
|
return distance_traits::distance(this->base(), y.base());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Manufacture a counting iterator for an arbitrary incrementable type
|
// Manufacture a counting iterator for an arbitrary incrementable type
|
||||||
template <class Incrementable>
|
template< typename Incrementable >
|
||||||
inline counting_iterator<Incrementable>
|
inline counting_iterator< Incrementable > make_counting_iterator(Incrementable x)
|
||||||
make_counting_iterator(Incrementable x)
|
|
||||||
{
|
{
|
||||||
typedef counting_iterator<Incrementable> result_t;
|
return counting_iterator< Incrementable >(x);
|
||||||
return result_t(x);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace iterators
|
} // namespace iterators
|
||||||
@ -217,4 +217,4 @@ using iterators::make_counting_iterator;
|
|||||||
|
|
||||||
} // namespace boost
|
} // namespace boost
|
||||||
|
|
||||||
#endif // COUNTING_ITERATOR_DWA200348_HPP
|
#endif // BOOST_ITERATOR_COUNTING_ITERATOR_DWA200348_HPP
|
||||||
|
@ -1,21 +0,0 @@
|
|||||||
// Copyright David Abrahams 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 http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
#ifndef ANY_CONVERSION_EATER_DWA20031117_HPP
|
|
||||||
# define ANY_CONVERSION_EATER_DWA20031117_HPP
|
|
||||||
|
|
||||||
namespace boost {
|
|
||||||
namespace iterators {
|
|
||||||
namespace detail {
|
|
||||||
|
|
||||||
// This type can be used in traits to "eat" up the one user-defined
|
|
||||||
// implicit conversion allowed.
|
|
||||||
struct any_conversion_eater
|
|
||||||
{
|
|
||||||
template <class T>
|
|
||||||
any_conversion_eater(T const&);
|
|
||||||
};
|
|
||||||
|
|
||||||
}}} // namespace boost::iterators::detail
|
|
||||||
|
|
||||||
#endif // ANY_CONVERSION_EATER_DWA20031117_HPP
|
|
@ -26,8 +26,6 @@
|
|||||||
// libs/iterator/test/constant_iterator_arrow.cpp fails to compile
|
// libs/iterator/test/constant_iterator_arrow.cpp fails to compile
|
||||||
// because the operator-> return is improperly deduced as a non-const
|
// because the operator-> return is improperly deduced as a non-const
|
||||||
// pointer.
|
// pointer.
|
||||||
#if 1 || defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
|
|
||||||
|| BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x531))
|
|
||||||
|
|
||||||
// Recall that in general, compilers without partial specialization
|
// Recall that in general, compilers without partial specialization
|
||||||
// can't strip constness. Consider counting_iterator, which normally
|
// can't strip constness. Consider counting_iterator, which normally
|
||||||
@ -44,85 +42,4 @@
|
|||||||
|
|
||||||
# define BOOST_ITERATOR_REF_CONSTNESS_KILLS_WRITABILITY 1
|
# define BOOST_ITERATOR_REF_CONSTNESS_KILLS_WRITABILITY 1
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x5A0)) \
|
|
||||||
|| (BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, <= 700) && defined(_MSC_VER)) \
|
|
||||||
|| BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590042)) \
|
|
||||||
|| BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x590))
|
|
||||||
|
|
||||||
# define BOOST_NO_LVALUE_RETURN_DETECTION
|
|
||||||
|
|
||||||
# if 0 // test code
|
|
||||||
struct v {};
|
|
||||||
|
|
||||||
typedef char (&no)[3];
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
no foo(T const&, ...);
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
char foo(T&, int);
|
|
||||||
|
|
||||||
|
|
||||||
struct value_iterator
|
|
||||||
{
|
|
||||||
v operator*() const;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
struct lvalue_deref_helper
|
|
||||||
{
|
|
||||||
static T& x;
|
|
||||||
enum { value = (sizeof(foo(*x,0)) == 1) };
|
|
||||||
};
|
|
||||||
|
|
||||||
int z2[(lvalue_deref_helper<v*>::value == 1) ? 1 : -1];
|
|
||||||
int z[(lvalue_deref_helper<value_iterator>::value) == 1 ? -1 : 1 ];
|
|
||||||
# endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if BOOST_WORKAROUND(__MWERKS__, <=0x2407)
|
|
||||||
# define BOOST_NO_IS_CONVERTIBLE // "is_convertible doesn't work for simple types"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if BOOST_WORKAROUND(__GNUC__, == 3) && BOOST_WORKAROUND(__GNUC_MINOR__, < 4) && !defined(__EDG_VERSION__) \
|
|
||||||
|| BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
|
|
||||||
# define BOOST_NO_IS_CONVERTIBLE_TEMPLATE // The following program fails to compile:
|
|
||||||
|
|
||||||
# if 0 // test code
|
|
||||||
#include <boost/type_traits/is_convertible.hpp>
|
|
||||||
template <class T>
|
|
||||||
struct foo
|
|
||||||
{
|
|
||||||
foo(T);
|
|
||||||
|
|
||||||
template <class U>
|
|
||||||
foo(foo<U> const& other) : p(other.p) { }
|
|
||||||
|
|
||||||
T p;
|
|
||||||
};
|
|
||||||
|
|
||||||
bool x = boost::is_convertible<foo<int const*>, foo<int*> >::value;
|
|
||||||
# endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#if !defined(BOOST_MSVC) && (defined(BOOST_NO_SFINAE) || defined(BOOST_NO_IS_CONVERTIBLE) || defined(BOOST_NO_IS_CONVERTIBLE_TEMPLATE))
|
|
||||||
# define BOOST_NO_STRICT_ITERATOR_INTEROPERABILITY
|
|
||||||
#endif
|
|
||||||
|
|
||||||
# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
|
|
||||||
|
|
||||||
// GCC-2.95 (obsolete) eagerly instantiates templated constructors and conversion
|
|
||||||
// operators in convertibility checks, causing premature errors.
|
|
||||||
//
|
|
||||||
// Borland's problems are harder to diagnose due to lack of an
|
|
||||||
// instantiation stack backtrace. They may be due in part to the fact
|
|
||||||
// that it drops cv-qualification willy-nilly in templates.
|
|
||||||
# define BOOST_NO_ONE_WAY_ITERATOR_INTEROP
|
|
||||||
# endif
|
|
||||||
|
|
||||||
// no include guard; multiple inclusion intended
|
// no include guard; multiple inclusion intended
|
||||||
|
@ -11,11 +11,7 @@
|
|||||||
// 23/02/03 thw
|
// 23/02/03 thw
|
||||||
//
|
//
|
||||||
|
|
||||||
#undef BOOST_NO_IS_CONVERTIBLE
|
#undef BOOST_ITERATOR_REF_CONSTNESS_KILLS_WRITABILITY
|
||||||
#undef BOOST_NO_IS_CONVERTIBLE_TEMPLATE
|
|
||||||
#undef BOOST_NO_STRICT_ITERATOR_INTEROPERABILITY
|
|
||||||
#undef BOOST_NO_LVALUE_RETURN_DETECTION
|
|
||||||
#undef BOOST_NO_ONE_WAY_ITERATOR_INTEROP
|
|
||||||
|
|
||||||
#ifdef BOOST_ITERATOR_CONFIG_DEF
|
#ifdef BOOST_ITERATOR_CONFIG_DEF
|
||||||
# undef BOOST_ITERATOR_CONFIG_DEF
|
# undef BOOST_ITERATOR_CONFIG_DEF
|
||||||
|
@ -1,83 +0,0 @@
|
|||||||
// (C) Copyright David Abrahams 2002.
|
|
||||||
// (C) Copyright Jeremy Siek 2002.
|
|
||||||
// (C) Copyright Thomas Witt 2002.
|
|
||||||
// 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)
|
|
||||||
#ifndef BOOST_ENABLE_IF_23022003THW_HPP
|
|
||||||
#define BOOST_ENABLE_IF_23022003THW_HPP
|
|
||||||
|
|
||||||
#include <boost/detail/workaround.hpp>
|
|
||||||
#include <boost/mpl/identity.hpp>
|
|
||||||
|
|
||||||
#include <boost/iterator/detail/config_def.hpp>
|
|
||||||
|
|
||||||
//
|
|
||||||
// Boost iterators uses its own enable_if cause we need
|
|
||||||
// special semantics for deficient compilers.
|
|
||||||
// 23/02/03 thw
|
|
||||||
//
|
|
||||||
|
|
||||||
namespace boost
|
|
||||||
{
|
|
||||||
|
|
||||||
namespace iterators
|
|
||||||
{
|
|
||||||
//
|
|
||||||
// Base machinery for all kinds of enable if
|
|
||||||
//
|
|
||||||
template<bool>
|
|
||||||
struct enabled
|
|
||||||
{
|
|
||||||
template<typename T>
|
|
||||||
struct base
|
|
||||||
{
|
|
||||||
typedef T type;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
//
|
|
||||||
// For compilers that don't support "Substitution Failure Is Not An Error"
|
|
||||||
// enable_if falls back to always enabled. See comments
|
|
||||||
// on operator implementation for consequences.
|
|
||||||
//
|
|
||||||
template<>
|
|
||||||
struct enabled<false>
|
|
||||||
{
|
|
||||||
template<typename T>
|
|
||||||
struct base
|
|
||||||
{
|
|
||||||
#ifdef BOOST_NO_SFINAE
|
|
||||||
|
|
||||||
typedef T type;
|
|
||||||
|
|
||||||
// This way to do it would give a nice error message containing
|
|
||||||
// invalid overload, but has the big disadvantage that
|
|
||||||
// there is no reference to user code in the error message.
|
|
||||||
//
|
|
||||||
// struct invalid_overload;
|
|
||||||
// typedef invalid_overload type;
|
|
||||||
//
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
template <class Cond,
|
|
||||||
class Return>
|
|
||||||
struct enable_if
|
|
||||||
# if !defined(BOOST_NO_SFINAE) && !defined(BOOST_NO_IS_CONVERTIBLE)
|
|
||||||
: enabled<(Cond::value)>::template base<Return>
|
|
||||||
# else
|
|
||||||
: mpl::identity<Return>
|
|
||||||
# endif
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace iterators
|
|
||||||
|
|
||||||
} // namespace boost
|
|
||||||
|
|
||||||
#include <boost/iterator/detail/config_undef.hpp>
|
|
||||||
|
|
||||||
#endif // BOOST_ENABLE_IF_23022003THW_HPP
|
|
44
include/boost/iterator/detail/eval_if_default.hpp
Normal file
44
include/boost/iterator/detail/eval_if_default.hpp
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* 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)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Andrey Semashev
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BOOST_ITERATOR_DETAIL_EVAL_IF_DEFAULT_HPP_INCLUDED_
|
||||||
|
#define BOOST_ITERATOR_DETAIL_EVAL_IF_DEFAULT_HPP_INCLUDED_
|
||||||
|
|
||||||
|
#include <boost/core/use_default.hpp>
|
||||||
|
#include <boost/iterator/detail/type_traits/type_identity.hpp>
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
namespace iterators {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
// If T is use_default, return the result of invoking
|
||||||
|
// DefaultNullaryFn, otherwise - of NondefaultNullaryFn.
|
||||||
|
// By default, NondefaultNullaryFn returns T, which means
|
||||||
|
// the metafunction can be called with just two parameters
|
||||||
|
// and in that case will return either T or the result of
|
||||||
|
// invoking DefaultNullaryFn.
|
||||||
|
template< typename T, typename DefaultNullaryFn, typename NondefaultNullaryFn = detail::type_identity< T > >
|
||||||
|
struct eval_if_default
|
||||||
|
{
|
||||||
|
using type = typename NondefaultNullaryFn::type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template< typename DefaultNullaryFn, typename NondefaultNullaryFn >
|
||||||
|
struct eval_if_default< use_default, DefaultNullaryFn, NondefaultNullaryFn >
|
||||||
|
{
|
||||||
|
using type = typename DefaultNullaryFn::type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template< typename T, typename DefaultNullaryFn, typename NondefaultNullaryFn = detail::type_identity< T > >
|
||||||
|
using eval_if_default_t = typename eval_if_default< T, DefaultNullaryFn, NondefaultNullaryFn >::type;
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
} // namespace iterators
|
||||||
|
} // namespace boost
|
||||||
|
|
||||||
|
#endif // BOOST_ITERATOR_DETAIL_EVAL_IF_DEFAULT_HPP_INCLUDED_
|
@ -4,74 +4,65 @@
|
|||||||
#ifndef FACADE_ITERATOR_CATEGORY_DWA20031118_HPP
|
#ifndef FACADE_ITERATOR_CATEGORY_DWA20031118_HPP
|
||||||
#define FACADE_ITERATOR_CATEGORY_DWA20031118_HPP
|
#define FACADE_ITERATOR_CATEGORY_DWA20031118_HPP
|
||||||
|
|
||||||
|
#include <iterator>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
#include <boost/mp11/utility.hpp>
|
||||||
|
|
||||||
#include <boost/iterator/iterator_categories.hpp>
|
#include <boost/iterator/iterator_categories.hpp>
|
||||||
|
#include <boost/iterator/detail/type_traits/conjunction.hpp>
|
||||||
# include <boost/mpl/or.hpp> // used in iterator_tag inheritance logic
|
#include <boost/iterator/detail/type_traits/disjunction.hpp>
|
||||||
# include <boost/mpl/and.hpp>
|
|
||||||
# include <boost/mpl/if.hpp>
|
|
||||||
# include <boost/mpl/eval_if.hpp>
|
|
||||||
# include <boost/mpl/identity.hpp>
|
|
||||||
# include <boost/mpl/assert.hpp>
|
|
||||||
|
|
||||||
# include <boost/type_traits/is_same.hpp>
|
|
||||||
# include <boost/type_traits/is_const.hpp>
|
|
||||||
# include <boost/type_traits/is_reference.hpp>
|
|
||||||
# include <boost/type_traits/is_convertible.hpp>
|
|
||||||
|
|
||||||
# include <boost/type_traits/is_same.hpp>
|
|
||||||
|
|
||||||
#include <boost/iterator/detail/config_def.hpp> // try to keep this last
|
#include <boost/iterator/detail/config_def.hpp> // try to keep this last
|
||||||
|
|
||||||
# ifdef BOOST_ITERATOR_REF_CONSTNESS_KILLS_WRITABILITY
|
|
||||||
# include <boost/detail/indirect_traits.hpp>
|
|
||||||
# endif
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// iterator_category deduction for iterator_facade
|
// iterator_category deduction for iterator_facade
|
||||||
//
|
//
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
namespace iterators {
|
namespace iterators {
|
||||||
|
|
||||||
// forward declaration
|
|
||||||
struct use_default;
|
|
||||||
|
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
struct input_output_iterator_tag
|
#ifdef BOOST_ITERATOR_REF_CONSTNESS_KILLS_WRITABILITY
|
||||||
: std::input_iterator_tag
|
|
||||||
{
|
template< typename T >
|
||||||
// Using inheritance for only input_iterator_tag helps to avoid
|
struct is_const_lvalue_reference :
|
||||||
// ambiguities when a stdlib implementation dispatches on a
|
public std::false_type
|
||||||
// function which is overloaded on both input_iterator_tag and
|
{};
|
||||||
// output_iterator_tag, as STLPort does, in its __valid_range
|
|
||||||
// function. I claim it's better to avoid the ambiguity in these
|
template< typename T >
|
||||||
// cases.
|
struct is_const_lvalue_reference< T const& > :
|
||||||
operator std::output_iterator_tag() const
|
public std::true_type
|
||||||
{
|
{};
|
||||||
return std::output_iterator_tag();
|
|
||||||
}
|
#endif // BOOST_ITERATOR_REF_CONSTNESS_KILLS_WRITABILITY
|
||||||
};
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// True iff the user has explicitly disabled writability of this
|
// True iff the user has explicitly disabled writability of this
|
||||||
// iterator. Pass the iterator_facade's Value parameter and its
|
// iterator. Pass the iterator_facade's Value parameter and its
|
||||||
// nested ::reference type.
|
// nested ::reference type.
|
||||||
//
|
//
|
||||||
template <class ValueParam, class Reference>
|
template< typename ValueParam, typename Reference >
|
||||||
struct iterator_writability_disabled
|
struct iterator_writability_disabled :
|
||||||
# ifdef BOOST_ITERATOR_REF_CONSTNESS_KILLS_WRITABILITY // Adding Thomas' logic?
|
# ifdef BOOST_ITERATOR_REF_CONSTNESS_KILLS_WRITABILITY // Adding Thomas' logic?
|
||||||
: mpl::or_<
|
public detail::disjunction<
|
||||||
is_const<Reference>
|
detail::is_const_lvalue_reference< Reference >,
|
||||||
, boost::detail::indirect_traits::is_reference_to_const<Reference>
|
std::is_const< Reference >,
|
||||||
, is_const<ValueParam>
|
std::is_const< ValueParam >
|
||||||
>
|
>
|
||||||
# else
|
# else
|
||||||
: is_const<ValueParam>
|
public std::is_const< ValueParam >
|
||||||
# endif
|
# endif
|
||||||
{};
|
{};
|
||||||
|
|
||||||
|
|
||||||
|
template< typename Traversal, typename ValueParam, typename Reference >
|
||||||
|
using is_traversal_of_input_iterator = detail::conjunction<
|
||||||
|
std::is_convertible< Traversal, single_pass_traversal_tag >,
|
||||||
|
|
||||||
|
// check for readability
|
||||||
|
std::is_convertible< Reference, ValueParam >
|
||||||
|
>;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Convert an iterator_facade's traversal category, Value parameter,
|
// Convert an iterator_facade's traversal category, Value parameter,
|
||||||
// and ::reference type to an appropriate old-style category.
|
// and ::reference type to an appropriate old-style category.
|
||||||
@ -80,110 +71,105 @@ struct iterator_writability_disabled
|
|||||||
// to output_iterator_tag.
|
// to output_iterator_tag.
|
||||||
//
|
//
|
||||||
// Change at: https://svn.boost.org/trac/boost/changeset/21683
|
// Change at: https://svn.boost.org/trac/boost/changeset/21683
|
||||||
template <class Traversal, class ValueParam, class Reference>
|
template< typename Traversal, typename ValueParam, typename Reference >
|
||||||
struct iterator_facade_default_category
|
struct iterator_facade_default_category
|
||||||
: mpl::eval_if<
|
|
||||||
mpl::and_<
|
|
||||||
is_reference<Reference>
|
|
||||||
, is_convertible<Traversal,forward_traversal_tag>
|
|
||||||
>
|
|
||||||
, mpl::eval_if<
|
|
||||||
is_convertible<Traversal,random_access_traversal_tag>
|
|
||||||
, mpl::identity<std::random_access_iterator_tag>
|
|
||||||
, mpl::if_<
|
|
||||||
is_convertible<Traversal,bidirectional_traversal_tag>
|
|
||||||
, std::bidirectional_iterator_tag
|
|
||||||
, std::forward_iterator_tag
|
|
||||||
>
|
|
||||||
>
|
|
||||||
, typename mpl::eval_if<
|
|
||||||
mpl::and_<
|
|
||||||
is_convertible<Traversal, single_pass_traversal_tag>
|
|
||||||
|
|
||||||
// check for readability
|
|
||||||
, is_convertible<Reference, ValueParam>
|
|
||||||
>
|
|
||||||
, mpl::identity<std::input_iterator_tag>
|
|
||||||
, mpl::identity<Traversal>
|
|
||||||
>
|
|
||||||
>
|
|
||||||
{
|
{
|
||||||
|
using type = typename std::conditional<
|
||||||
|
detail::is_traversal_of_input_iterator< Traversal, ValueParam, Reference >::value,
|
||||||
|
std::input_iterator_tag,
|
||||||
|
Traversal
|
||||||
|
>::type;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Specialization for the (typical) case when the reference type is an actual reference
|
||||||
|
template< typename Traversal, typename ValueParam, typename Referenced >
|
||||||
|
struct iterator_facade_default_category< Traversal, ValueParam, Referenced& >
|
||||||
|
{
|
||||||
|
using type = mp11::mp_cond<
|
||||||
|
std::is_convertible< Traversal, random_access_traversal_tag >, std::random_access_iterator_tag,
|
||||||
|
std::is_convertible< Traversal, bidirectional_traversal_tag >, std::bidirectional_iterator_tag,
|
||||||
|
std::is_convertible< Traversal, forward_traversal_tag >, std::forward_iterator_tag,
|
||||||
|
detail::is_traversal_of_input_iterator< Traversal, ValueParam, Referenced& >, std::input_iterator_tag,
|
||||||
|
std::true_type, Traversal
|
||||||
|
>;
|
||||||
|
};
|
||||||
|
|
||||||
|
template< typename Traversal, typename ValueParam, typename Reference >
|
||||||
|
using iterator_facade_default_category_t = typename iterator_facade_default_category< Traversal, ValueParam, Reference >::type;
|
||||||
|
|
||||||
// True iff T is convertible to an old-style iterator category.
|
// True iff T is convertible to an old-style iterator category.
|
||||||
template <class T>
|
template< typename T >
|
||||||
struct is_iterator_category
|
struct is_iterator_category :
|
||||||
: mpl::or_<
|
public detail::disjunction<
|
||||||
is_convertible<T,std::input_iterator_tag>
|
std::is_convertible< T, std::input_iterator_tag >,
|
||||||
, is_convertible<T,std::output_iterator_tag>
|
std::is_convertible< T, std::output_iterator_tag >
|
||||||
>
|
>
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
struct is_iterator_traversal
|
|
||||||
: is_convertible<T,incrementable_traversal_tag>
|
|
||||||
{};
|
{};
|
||||||
|
|
||||||
|
template< typename T >
|
||||||
|
struct is_iterator_traversal :
|
||||||
|
public std::is_convertible< T, incrementable_traversal_tag >
|
||||||
|
{};
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// A composite iterator_category tag convertible to Category (a pure
|
// A composite iterator_category tag convertible to Category (a pure
|
||||||
// old-style category) and Traversal (a pure traversal tag).
|
// old-style category) and Traversal (a pure traversal tag).
|
||||||
// Traversal must be a strict increase of the traversal power given by
|
// Traversal must be a strict increase of the traversal power given by
|
||||||
// Category.
|
// Category.
|
||||||
//
|
//
|
||||||
template <class Category, class Traversal>
|
template< typename Category, typename Traversal >
|
||||||
struct iterator_category_with_traversal
|
struct iterator_category_with_traversal :
|
||||||
: Category, Traversal
|
public Category,
|
||||||
|
public Traversal
|
||||||
{
|
{
|
||||||
// Make sure this isn't used to build any categories where
|
// Make sure this isn't used to build any categories where
|
||||||
// convertibility to Traversal is redundant. Should just use the
|
// convertibility to Traversal is redundant. Should just use the
|
||||||
// Category element in that case.
|
// Category element in that case.
|
||||||
BOOST_MPL_ASSERT_NOT((
|
static_assert(
|
||||||
is_convertible<
|
!std::is_convertible< iterator_category_to_traversal_t< Category >, Traversal >::value,
|
||||||
typename iterator_category_to_traversal<Category>::type
|
"Category transformed to corresponding traversal must be convertible to Traversal."
|
||||||
, Traversal
|
);
|
||||||
>));
|
|
||||||
|
|
||||||
BOOST_MPL_ASSERT((is_iterator_category<Category>));
|
static_assert(is_iterator_category< Category >::value, "Category must be an STL iterator category.");
|
||||||
BOOST_MPL_ASSERT_NOT((is_iterator_category<Traversal>));
|
static_assert(!is_iterator_category< Traversal >::value, "Traversal must not be an STL iterator category.");
|
||||||
BOOST_MPL_ASSERT_NOT((is_iterator_traversal<Category>));
|
static_assert(!is_iterator_traversal< Category >::value, "Category must not be a traversal tag.");
|
||||||
# if !BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1310))
|
static_assert(is_iterator_traversal< Traversal >::value, "Traversal must be a traversal tag.");
|
||||||
BOOST_MPL_ASSERT((is_iterator_traversal<Traversal>));
|
|
||||||
# endif
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Computes an iterator_category tag whose traversal is Traversal and
|
// Computes an iterator_category tag whose traversal is Traversal and
|
||||||
// which is appropriate for an iterator
|
// which is appropriate for an iterator
|
||||||
template <class Traversal, class ValueParam, class Reference>
|
template< typename Traversal, typename ValueParam, typename Reference >
|
||||||
struct facade_iterator_category_impl
|
struct facade_iterator_category_impl
|
||||||
{
|
{
|
||||||
BOOST_MPL_ASSERT_NOT((is_iterator_category<Traversal>));
|
static_assert(!is_iterator_category< Traversal >::value, "Traversal must not be an STL iterator category.");
|
||||||
|
|
||||||
typedef typename iterator_facade_default_category<
|
using category = iterator_facade_default_category_t< Traversal, ValueParam, Reference >;
|
||||||
Traversal,ValueParam,Reference
|
|
||||||
>::type category;
|
|
||||||
|
|
||||||
typedef typename mpl::if_<
|
using type = typename std::conditional<
|
||||||
is_same<
|
std::is_same<
|
||||||
Traversal
|
Traversal,
|
||||||
, typename iterator_category_to_traversal<category>::type
|
typename iterator_category_to_traversal< category >::type
|
||||||
>
|
>::value,
|
||||||
, category
|
category,
|
||||||
, iterator_category_with_traversal<category,Traversal>
|
iterator_category_with_traversal< category, Traversal >
|
||||||
>::type type;
|
>::type;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template< typename Traversal, typename ValueParam, typename Reference >
|
||||||
|
using facade_iterator_category_impl_t = typename facade_iterator_category_impl< Traversal, ValueParam, Reference >::type;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Compute an iterator_category for iterator_facade
|
// Compute an iterator_category for iterator_facade
|
||||||
//
|
//
|
||||||
template <class CategoryOrTraversal, class ValueParam, class Reference>
|
template< typename CategoryOrTraversal, typename ValueParam, typename Reference >
|
||||||
struct facade_iterator_category
|
struct facade_iterator_category
|
||||||
: mpl::eval_if<
|
|
||||||
is_iterator_category<CategoryOrTraversal>
|
|
||||||
, mpl::identity<CategoryOrTraversal> // old-style categories are fine as-is
|
|
||||||
, facade_iterator_category_impl<CategoryOrTraversal,ValueParam,Reference>
|
|
||||||
>
|
|
||||||
{
|
{
|
||||||
|
using type = mp11::mp_eval_if<
|
||||||
|
is_iterator_category< CategoryOrTraversal >,
|
||||||
|
CategoryOrTraversal, // old-style categories are fine as-is
|
||||||
|
facade_iterator_category_impl_t, CategoryOrTraversal, ValueParam, Reference
|
||||||
|
>;
|
||||||
};
|
};
|
||||||
|
|
||||||
}}} // namespace boost::iterators::detail
|
}}} // namespace boost::iterators::detail
|
||||||
|
41
include/boost/iterator/detail/if_default.hpp
Normal file
41
include/boost/iterator/detail/if_default.hpp
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* 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)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Andrey Semashev
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BOOST_ITERATOR_DETAIL_IF_DEFAULT_HPP_INCLUDED_
|
||||||
|
#define BOOST_ITERATOR_DETAIL_IF_DEFAULT_HPP_INCLUDED_
|
||||||
|
|
||||||
|
#include <boost/core/use_default.hpp>
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
namespace iterators {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
// If T is use_default, return Default, otherwise - Nondefault.
|
||||||
|
// By default, Nondefault is T, which means
|
||||||
|
// the metafunction can be called with just two parameters
|
||||||
|
// and in that case will return either T or Default.
|
||||||
|
template< typename T, typename Default, typename Nondefault = T >
|
||||||
|
struct if_default
|
||||||
|
{
|
||||||
|
using type = Nondefault;
|
||||||
|
};
|
||||||
|
|
||||||
|
template< typename Default, typename Nondefault >
|
||||||
|
struct if_default< use_default, Default, Nondefault >
|
||||||
|
{
|
||||||
|
using type = Default;
|
||||||
|
};
|
||||||
|
|
||||||
|
template< typename T, typename Default, typename Nondefault = T >
|
||||||
|
using if_default_t = typename if_default< T, Default, Nondefault >::type;
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
} // namespace iterators
|
||||||
|
} // namespace boost
|
||||||
|
|
||||||
|
#endif // BOOST_ITERATOR_DETAIL_IF_DEFAULT_HPP_INCLUDED_
|
@ -1,19 +0,0 @@
|
|||||||
// Copyright David Abrahams 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 http://www.boost.org/LICENSE_1_0.txt)
|
|
||||||
#ifndef MINIMUM_CATEGORY_DWA20031119_HPP
|
|
||||||
# define MINIMUM_CATEGORY_DWA20031119_HPP
|
|
||||||
|
|
||||||
# include <boost/iterator/minimum_category.hpp>
|
|
||||||
|
|
||||||
namespace boost {
|
|
||||||
|
|
||||||
// This import below (as well as the whole header) is for backward compatibility
|
|
||||||
// with boost/token_iterator.hpp. It should be removed as soon as that header is fixed.
|
|
||||||
namespace detail {
|
|
||||||
using iterators::minimum_category;
|
|
||||||
} // namespace detail
|
|
||||||
|
|
||||||
} // namespace boost
|
|
||||||
|
|
||||||
#endif // MINIMUM_CATEGORY_DWA20031119_HPP
|
|
53
include/boost/iterator/detail/type_traits/conjunction.hpp
Normal file
53
include/boost/iterator/detail/type_traits/conjunction.hpp
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* 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)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2024 Georgiy Guminov
|
||||||
|
*/
|
||||||
|
/*!
|
||||||
|
* \file iterator/detail/type_traits/conjunction.hpp
|
||||||
|
*
|
||||||
|
* This header contains definition of \c conjunction type trait.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BOOST_ITERATOR_DETAIL_TYPE_TRAITS_CONJUNCTION_HPP_INCLUDED_
|
||||||
|
#define BOOST_ITERATOR_DETAIL_TYPE_TRAITS_CONJUNCTION_HPP_INCLUDED_
|
||||||
|
|
||||||
|
#include <type_traits>
|
||||||
|
#include <boost/config.hpp>
|
||||||
|
|
||||||
|
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||||||
|
#pragma once
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(__cpp_lib_logical_traits) && (__cpp_lib_logical_traits >= 201510l)) || \
|
||||||
|
(defined(BOOST_MSSTL_VERSION) && (BOOST_MSSTL_VERSION >= 140) && (_MSC_FULL_VER >= 190023918) && (BOOST_CXX_VERSION >= 201703l))
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
namespace iterators {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
using std::conjunction;
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
} // namespace iterator
|
||||||
|
} // namespace boost
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <boost/type_traits/conjunction.hpp>
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
namespace iterators {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
using boost::conjunction;
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
} // namespace iterator
|
||||||
|
} // namespace boost
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // BOOST_ITERATOR_DETAIL_TYPE_TRAITS_CONJUNCTION_HPP_INCLUDED_
|
53
include/boost/iterator/detail/type_traits/disjunction.hpp
Normal file
53
include/boost/iterator/detail/type_traits/disjunction.hpp
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* 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)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2024 Georgiy Guminov
|
||||||
|
*/
|
||||||
|
/*!
|
||||||
|
* \file iterator/detail/type_traits/disjunction.hpp
|
||||||
|
*
|
||||||
|
* This header contains definition of \c disjunction type trait.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BOOST_ITERATOR_DETAIL_TYPE_TRAITS_DISJUNCTION_HPP_INCLUDED_
|
||||||
|
#define BOOST_ITERATOR_DETAIL_TYPE_TRAITS_DISJUNCTION_HPP_INCLUDED_
|
||||||
|
|
||||||
|
#include <type_traits>
|
||||||
|
#include <boost/config.hpp>
|
||||||
|
|
||||||
|
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||||||
|
#pragma once
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(__cpp_lib_logical_traits) && (__cpp_lib_logical_traits >= 201510l)) || \
|
||||||
|
(defined(BOOST_MSSTL_VERSION) && (BOOST_MSSTL_VERSION >= 140) && (_MSC_FULL_VER >= 190023918) && (BOOST_CXX_VERSION >= 201703l))
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
namespace iterators {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
using std::disjunction;
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
} // namespace iterator
|
||||||
|
} // namespace boost
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <boost/type_traits/disjunction.hpp>
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
namespace iterators {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
using boost::disjunction;
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
} // namespace iterator
|
||||||
|
} // namespace boost
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // BOOST_ITERATOR_DETAIL_TYPE_TRAITS_DISJUNCTION_HPP_INCLUDED_
|
53
include/boost/iterator/detail/type_traits/negation.hpp
Normal file
53
include/boost/iterator/detail/type_traits/negation.hpp
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
/*
|
||||||
|
* 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)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2024 Georgiy Guminov
|
||||||
|
*/
|
||||||
|
/*!
|
||||||
|
* \file iterator/detail/type_traits/negation.hpp
|
||||||
|
*
|
||||||
|
* This header contains definition of \c negation type trait.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BOOST_ITERATOR_DETAIL_TYPE_TRAITS_NEGATION_HPP_INCLUDED_
|
||||||
|
#define BOOST_ITERATOR_DETAIL_TYPE_TRAITS_NEGATION_HPP_INCLUDED_
|
||||||
|
|
||||||
|
#include <type_traits>
|
||||||
|
#include <boost/config.hpp>
|
||||||
|
|
||||||
|
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||||||
|
#pragma once
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(__cpp_lib_logical_traits) && (__cpp_lib_logical_traits >= 201510l)) || \
|
||||||
|
(defined(BOOST_MSSTL_VERSION) && (BOOST_MSSTL_VERSION >= 140) && (_MSC_FULL_VER >= 190023918) && (BOOST_CXX_VERSION >= 201703l))
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
namespace iterators {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
using std::negation;
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
} // namespace iterator
|
||||||
|
} // namespace boost
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <boost/type_traits/negation.hpp>
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
namespace iterators {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
using boost::negation;
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
} // namespace iterator
|
||||||
|
} // namespace boost
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // BOOST_ITERATOR_DETAIL_TYPE_TRAITS_NEGATION_HPP_INCLUDED_
|
54
include/boost/iterator/detail/type_traits/type_identity.hpp
Normal file
54
include/boost/iterator/detail/type_traits/type_identity.hpp
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
/*
|
||||||
|
* 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)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Andrey Semashev
|
||||||
|
*/
|
||||||
|
/*!
|
||||||
|
* \file iterator/detail/type_traits/type_identity.hpp
|
||||||
|
*
|
||||||
|
* This header contains definition of \c negation type trait.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BOOST_ITERATOR_DETAIL_TYPE_TRAITS_TYPE_IDENTITY_HPP_INCLUDED_
|
||||||
|
#define BOOST_ITERATOR_DETAIL_TYPE_TRAITS_TYPE_IDENTITY_HPP_INCLUDED_
|
||||||
|
|
||||||
|
#include <type_traits>
|
||||||
|
#include <boost/config.hpp>
|
||||||
|
|
||||||
|
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||||||
|
#pragma once
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if (defined(__cpp_lib_type_identity) && (__cpp_lib_type_identity >= 201806l)) || \
|
||||||
|
/* Note: MSVC 19.21 does not define _MSVC_LANG to 202002 in c++latest (C++20) mode but to a value larger than 201703 */ \
|
||||||
|
(defined(BOOST_MSSTL_VERSION) && (BOOST_MSSTL_VERSION >= 142) && (_MSC_VER >= 1921) && (BOOST_CXX_VERSION > 201703l))
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
namespace iterators {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
using std::type_identity;
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
} // namespace iterator
|
||||||
|
} // namespace boost
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <boost/type_traits/type_identity.hpp>
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
namespace iterators {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
using boost::type_identity;
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
} // namespace iterator
|
||||||
|
} // namespace boost
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // BOOST_ITERATOR_DETAIL_TYPE_TRAITS_TYPE_IDENTITY_HPP_INCLUDED_
|
59
include/boost/iterator/distance.hpp
Normal file
59
include/boost/iterator/distance.hpp
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
// 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)
|
||||||
|
|
||||||
|
#ifndef BOOST_ITERATOR_DISTANCE_HPP
|
||||||
|
#define BOOST_ITERATOR_DISTANCE_HPP
|
||||||
|
|
||||||
|
#include <boost/config.hpp>
|
||||||
|
#include <boost/iterator/iterator_categories.hpp>
|
||||||
|
#include <boost/iterator/iterator_traits.hpp>
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
namespace iterators {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
template< typename SinglePassIterator >
|
||||||
|
inline BOOST_CXX14_CONSTEXPR typename iterator_difference< SinglePassIterator >::type
|
||||||
|
distance_impl(SinglePassIterator first, SinglePassIterator last, single_pass_traversal_tag)
|
||||||
|
{
|
||||||
|
typename iterator_difference< SinglePassIterator >::type n = 0;
|
||||||
|
while (first != last)
|
||||||
|
{
|
||||||
|
++first;
|
||||||
|
++n;
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
template< typename RandomAccessIterator >
|
||||||
|
inline BOOST_CXX14_CONSTEXPR typename iterator_difference< RandomAccessIterator >::type
|
||||||
|
distance_impl(RandomAccessIterator first, RandomAccessIterator last, random_access_traversal_tag)
|
||||||
|
{
|
||||||
|
return last - first;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
|
namespace distance_adl_barrier {
|
||||||
|
|
||||||
|
template< typename SinglePassIterator >
|
||||||
|
inline BOOST_CXX14_CONSTEXPR typename iterator_difference< SinglePassIterator >::type
|
||||||
|
distance(SinglePassIterator first, SinglePassIterator last)
|
||||||
|
{
|
||||||
|
return detail::distance_impl(first, last, typename iterator_traversal< SinglePassIterator >::type());
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace distance_adl_barrier
|
||||||
|
|
||||||
|
using namespace distance_adl_barrier;
|
||||||
|
|
||||||
|
} // namespace iterators
|
||||||
|
|
||||||
|
using namespace iterators::distance_adl_barrier;
|
||||||
|
|
||||||
|
} // namespace boost
|
||||||
|
|
||||||
|
#endif
|
84
include/boost/iterator/enable_if_convertible.hpp
Normal file
84
include/boost/iterator/enable_if_convertible.hpp
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
/*
|
||||||
|
* 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)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2025 Andrey Semashev
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BOOST_ITERATOR_ENABLE_IF_CONVERTIBLE_HPP_INCLUDED_
|
||||||
|
#define BOOST_ITERATOR_ENABLE_IF_CONVERTIBLE_HPP_INCLUDED_
|
||||||
|
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
namespace iterators {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
//
|
||||||
|
// Result type used in enable_if_convertible meta function.
|
||||||
|
// This can be an incomplete type, as only pointers to
|
||||||
|
// enable_if_convertible< ... >::type are used.
|
||||||
|
// We could have used void for this, but conversion to
|
||||||
|
// void* is just too easy.
|
||||||
|
//
|
||||||
|
struct enable_type;
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
|
//
|
||||||
|
// enable_if for use in adapted iterators constructors.
|
||||||
|
//
|
||||||
|
// In order to provide interoperability between adapted constant and
|
||||||
|
// mutable iterators, adapted iterators will usually provide templated
|
||||||
|
// conversion constructors of the following form
|
||||||
|
//
|
||||||
|
// template <class BaseIterator>
|
||||||
|
// class adapted_iterator :
|
||||||
|
// public iterator_adaptor< adapted_iterator<Iterator>, Iterator >
|
||||||
|
// {
|
||||||
|
// public:
|
||||||
|
//
|
||||||
|
// ...
|
||||||
|
//
|
||||||
|
// template <class OtherIterator>
|
||||||
|
// adapted_iterator(
|
||||||
|
// OtherIterator const& it
|
||||||
|
// , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0);
|
||||||
|
//
|
||||||
|
// ...
|
||||||
|
// };
|
||||||
|
//
|
||||||
|
// enable_if_convertible is used to remove those overloads from the overload
|
||||||
|
// set that cannot be instantiated. For all practical purposes only overloads
|
||||||
|
// for constant/mutable interaction will remain. This has the advantage that
|
||||||
|
// meta functions like boost::is_convertible do not return false positives,
|
||||||
|
// as they can only look at the signature of the conversion constructor
|
||||||
|
// and not at the actual instantiation.
|
||||||
|
//
|
||||||
|
// enable_if_interoperable can be safely used in user code. It falls back to
|
||||||
|
// always enabled for compilers that don't support enable_if or is_convertible.
|
||||||
|
// There is no need for compiler specific workarounds in user code.
|
||||||
|
//
|
||||||
|
// The operators implementation relies on boost::is_convertible not returning
|
||||||
|
// false positives for user/library defined iterator types. See comments
|
||||||
|
// on operator implementation for consequences.
|
||||||
|
//
|
||||||
|
template< typename From, typename To >
|
||||||
|
struct enable_if_convertible :
|
||||||
|
public std::enable_if<
|
||||||
|
std::is_convertible< From, To >::value,
|
||||||
|
boost::iterators::detail::enable_type
|
||||||
|
>
|
||||||
|
{};
|
||||||
|
|
||||||
|
template< typename From, typename To >
|
||||||
|
using enable_if_convertible_t = typename enable_if_convertible< From, To >::type;
|
||||||
|
|
||||||
|
} // namespace iterators
|
||||||
|
|
||||||
|
using iterators::enable_if_convertible;
|
||||||
|
|
||||||
|
} // namespace boost
|
||||||
|
|
||||||
|
#endif // BOOST_ITERATOR_ENABLE_IF_CONVERTIBLE_HPP_INCLUDED_
|
@ -7,82 +7,108 @@
|
|||||||
#ifndef BOOST_FILTER_ITERATOR_23022003THW_HPP
|
#ifndef BOOST_FILTER_ITERATOR_23022003THW_HPP
|
||||||
#define BOOST_FILTER_ITERATOR_23022003THW_HPP
|
#define BOOST_FILTER_ITERATOR_23022003THW_HPP
|
||||||
|
|
||||||
#include <boost/iterator.hpp>
|
#include <type_traits>
|
||||||
|
|
||||||
|
#include <boost/core/use_default.hpp>
|
||||||
|
#include <boost/core/empty_value.hpp>
|
||||||
#include <boost/iterator/iterator_adaptor.hpp>
|
#include <boost/iterator/iterator_adaptor.hpp>
|
||||||
#include <boost/iterator/iterator_categories.hpp>
|
#include <boost/iterator/iterator_categories.hpp>
|
||||||
|
#include <boost/iterator/enable_if_convertible.hpp>
|
||||||
#include <boost/type_traits/is_class.hpp>
|
|
||||||
#include <boost/static_assert.hpp>
|
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
namespace iterators {
|
namespace iterators {
|
||||||
|
|
||||||
template <class Predicate, class Iterator>
|
template< typename Predicate, typename Iterator >
|
||||||
class filter_iterator;
|
class filter_iterator;
|
||||||
|
|
||||||
namespace detail
|
namespace detail {
|
||||||
{
|
|
||||||
template <class Predicate, class Iterator>
|
template< typename Predicate, typename Iterator >
|
||||||
struct filter_iterator_base
|
using filter_iterator_base_t = iterator_adaptor<
|
||||||
{
|
filter_iterator< Predicate, Iterator >,
|
||||||
typedef iterator_adaptor<
|
Iterator,
|
||||||
filter_iterator<Predicate, Iterator>
|
use_default,
|
||||||
, Iterator
|
typename std::conditional<
|
||||||
, use_default
|
std::is_convertible<
|
||||||
, typename mpl::if_<
|
iterator_traversal_t< Iterator >,
|
||||||
is_convertible<
|
random_access_traversal_tag
|
||||||
typename iterator_traversal<Iterator>::type
|
>::value,
|
||||||
, random_access_traversal_tag
|
bidirectional_traversal_tag,
|
||||||
>
|
use_default
|
||||||
, bidirectional_traversal_tag
|
|
||||||
, use_default
|
|
||||||
>::type
|
>::type
|
||||||
> type;
|
>;
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Predicate, class Iterator>
|
} // namespace detail
|
||||||
class filter_iterator
|
|
||||||
: public detail::filter_iterator_base<Predicate, Iterator>::type
|
template< typename Predicate, typename Iterator >
|
||||||
|
class filter_iterator :
|
||||||
|
public detail::filter_iterator_base_t< Predicate, Iterator >
|
||||||
{
|
{
|
||||||
typedef typename detail::filter_iterator_base<
|
|
||||||
Predicate, Iterator
|
|
||||||
>::type super_t;
|
|
||||||
|
|
||||||
friend class iterator_core_access;
|
friend class iterator_core_access;
|
||||||
|
|
||||||
|
template< typename, typename >
|
||||||
|
friend class filter_iterator;
|
||||||
|
|
||||||
|
private:
|
||||||
|
using super_t = detail::filter_iterator_base_t< Predicate, Iterator >;
|
||||||
|
|
||||||
|
// Storage class to leverage EBO, when possible
|
||||||
|
struct storage :
|
||||||
|
private boost::empty_value< Predicate >
|
||||||
|
{
|
||||||
|
using predicate_base = boost::empty_value< Predicate >;
|
||||||
|
|
||||||
|
Iterator m_end;
|
||||||
|
|
||||||
|
storage() = default;
|
||||||
|
|
||||||
|
template<
|
||||||
|
typename Iter,
|
||||||
|
typename = typename std::enable_if<
|
||||||
|
!std::is_same<
|
||||||
|
typename std::remove_cv< typename std::remove_reference< Iter >::type >::type,
|
||||||
|
storage
|
||||||
|
>::value
|
||||||
|
>
|
||||||
|
>
|
||||||
|
explicit storage(Iter&& end) :
|
||||||
|
predicate_base(boost::empty_init_t{}), m_end(static_cast< Iterator&& >(end))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
template< typename Pred, typename Iter >
|
||||||
|
storage(Pred&& pred, Iter&& end) :
|
||||||
|
predicate_base(boost::empty_init_t{}, static_cast< Pred&& >(pred)), m_end(static_cast< Iter&& >(end))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
Predicate& predicate() noexcept { return predicate_base::get(); }
|
||||||
|
Predicate const& predicate() const noexcept { return predicate_base::get(); }
|
||||||
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
filter_iterator() { }
|
filter_iterator() = default;
|
||||||
|
|
||||||
filter_iterator(Predicate f, Iterator x, Iterator end_ = Iterator())
|
filter_iterator(Predicate f, Iterator x, Iterator end = Iterator()) :
|
||||||
: super_t(x), m_predicate(f), m_end(end_)
|
super_t(static_cast< Iterator&& >(x)), m_storage(static_cast< Predicate&& >(f), static_cast< Iterator&& >(end))
|
||||||
{
|
{
|
||||||
satisfy_predicate();
|
satisfy_predicate();
|
||||||
}
|
}
|
||||||
|
|
||||||
filter_iterator(Iterator x, Iterator end_ = Iterator())
|
template< bool Requires = std::is_class< Predicate >::value, typename = typename std::enable_if< Requires >::type >
|
||||||
: super_t(x), m_predicate(), m_end(end_)
|
filter_iterator(Iterator x, Iterator end = Iterator()) :
|
||||||
|
super_t(static_cast< Iterator&& >(x)), m_storage(static_cast< Iterator&& >(end))
|
||||||
{
|
{
|
||||||
// Pro8 is a little too aggressive about instantiating the
|
|
||||||
// body of this function.
|
|
||||||
#if !BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003))
|
|
||||||
// Don't allow use of this constructor if Predicate is a
|
|
||||||
// function pointer type, since it will be 0.
|
|
||||||
BOOST_STATIC_ASSERT(is_class<Predicate>::value);
|
|
||||||
#endif
|
|
||||||
satisfy_predicate();
|
satisfy_predicate();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class OtherIterator>
|
template< typename OtherIterator, typename = enable_if_convertible_t< OtherIterator, Iterator > >
|
||||||
filter_iterator(
|
filter_iterator(filter_iterator< Predicate, OtherIterator > const& t) :
|
||||||
filter_iterator<Predicate, OtherIterator> const& t
|
super_t(t.base()), m_storage(t.m_storage.predicate(), t.m_storage.m_end)
|
||||||
, typename enable_if_convertible<OtherIterator, Iterator>::type* = 0
|
{}
|
||||||
)
|
|
||||||
: super_t(t.base()), m_predicate(t.predicate()), m_end(t.end()) {}
|
|
||||||
|
|
||||||
Predicate predicate() const { return m_predicate; }
|
Predicate predicate() const { return m_storage.predicate(); }
|
||||||
|
Iterator end() const { return m_storage.m_end; }
|
||||||
Iterator end() const { return m_end; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void increment()
|
void increment()
|
||||||
@ -93,38 +119,32 @@ namespace iterators {
|
|||||||
|
|
||||||
void decrement()
|
void decrement()
|
||||||
{
|
{
|
||||||
while(!this->m_predicate(*--(this->base_reference()))){};
|
while (!m_storage.predicate()(*--(this->base_reference()))) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
void satisfy_predicate()
|
void satisfy_predicate()
|
||||||
{
|
{
|
||||||
while (this->base() != this->m_end && !this->m_predicate(*this->base()))
|
while (this->base() != m_storage.m_end && !m_storage.predicate()(*this->base()))
|
||||||
++(this->base_reference());
|
++(this->base_reference());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Probably should be the initial base class so it can be
|
private:
|
||||||
// optimized away via EBO if it is an empty class.
|
storage m_storage;
|
||||||
Predicate m_predicate;
|
|
||||||
Iterator m_end;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class Predicate, class Iterator>
|
template< typename Predicate, typename Iterator >
|
||||||
inline filter_iterator<Predicate,Iterator>
|
inline filter_iterator< Predicate, Iterator > make_filter_iterator(Predicate f, Iterator x, Iterator end = Iterator())
|
||||||
make_filter_iterator(Predicate f, Iterator x, Iterator end = Iterator())
|
|
||||||
{
|
{
|
||||||
return filter_iterator<Predicate,Iterator>(f,x,end);
|
return filter_iterator< Predicate, Iterator >(static_cast< Predicate&& >(f), static_cast< Iterator&& >(x), static_cast< Iterator&& >(end));
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Predicate, class Iterator>
|
template< typename Predicate, typename Iterator >
|
||||||
inline filter_iterator<Predicate,Iterator>
|
inline typename std::enable_if<
|
||||||
make_filter_iterator(
|
std::is_class< Predicate >::value,
|
||||||
typename iterators::enable_if<
|
filter_iterator< Predicate, Iterator >
|
||||||
is_class<Predicate>
|
>::type make_filter_iterator(Iterator x, Iterator end = Iterator())
|
||||||
, Iterator
|
|
||||||
>::type x
|
|
||||||
, Iterator end = Iterator())
|
|
||||||
{
|
{
|
||||||
return filter_iterator<Predicate,Iterator>(x,end);
|
return filter_iterator< Predicate, Iterator >(static_cast< Iterator&& >(x), static_cast< Iterator&& >(end));
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace iterators
|
} // namespace iterators
|
||||||
|
@ -6,153 +6,145 @@
|
|||||||
// http://www.boost.org/LICENSE_1_0.txt)
|
// http://www.boost.org/LICENSE_1_0.txt)
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef BOOST_FUNCTION_INPUT_ITERATOR
|
#ifndef BOOST_ITERATOR_FUNCTION_INPUT_ITERATOR_HPP_INCLUDED_
|
||||||
#define BOOST_FUNCTION_INPUT_ITERATOR
|
#define BOOST_ITERATOR_FUNCTION_INPUT_ITERATOR_HPP_INCLUDED_
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
#include <boost/config.hpp>
|
|
||||||
#include <boost/assert.hpp>
|
|
||||||
#include <boost/mpl/if.hpp>
|
|
||||||
#include <boost/function_types/is_function_pointer.hpp>
|
|
||||||
#include <boost/function_types/is_function_reference.hpp>
|
|
||||||
#include <boost/function_types/result_type.hpp>
|
|
||||||
#include <boost/iterator/iterator_facade.hpp>
|
#include <boost/iterator/iterator_facade.hpp>
|
||||||
#include <boost/none.hpp>
|
#include <boost/iterator/iterator_categories.hpp>
|
||||||
|
#include <boost/iterator/detail/type_traits/conjunction.hpp>
|
||||||
#include <boost/optional/optional.hpp>
|
#include <boost/optional/optional.hpp>
|
||||||
#include <boost/utility/result_of.hpp>
|
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
|
|
||||||
namespace iterators {
|
namespace iterators {
|
||||||
|
|
||||||
namespace impl {
|
template< typename Function, typename Input >
|
||||||
|
class function_input_iterator;
|
||||||
|
|
||||||
template <class Function, class Input>
|
namespace detail {
|
||||||
class function_input_iterator
|
|
||||||
: public iterator_facade<
|
template< typename Function, typename Input >
|
||||||
function_input_iterator<Function, Input>,
|
using function_input_iterator_facade_base_t = iterator_facade<
|
||||||
BOOST_DEDUCED_TYPENAME result_of<Function ()>::type,
|
iterators::function_input_iterator< Function, Input >,
|
||||||
|
decltype(std::declval< Function& >()()),
|
||||||
single_pass_traversal_tag,
|
single_pass_traversal_tag,
|
||||||
BOOST_DEDUCED_TYPENAME result_of<Function ()>::type const &
|
decltype(std::declval< Function& >()()) const&
|
||||||
>
|
>;
|
||||||
|
|
||||||
|
template< typename Function, typename Input >
|
||||||
|
class function_object_input_iterator :
|
||||||
|
public function_input_iterator_facade_base_t< Function, Input >
|
||||||
{
|
{
|
||||||
public:
|
|
||||||
function_input_iterator() {}
|
|
||||||
function_input_iterator(Function & f_, Input state_ = Input())
|
|
||||||
: f(&f_), state(state_) {}
|
|
||||||
|
|
||||||
void increment() {
|
|
||||||
if(value)
|
|
||||||
value = none;
|
|
||||||
else
|
|
||||||
(*f)();
|
|
||||||
++state;
|
|
||||||
}
|
|
||||||
|
|
||||||
BOOST_DEDUCED_TYPENAME result_of<Function ()>::type const &
|
|
||||||
dereference() const {
|
|
||||||
return (value ? value : value = (*f)()).get();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool equal(function_input_iterator const & other) const {
|
|
||||||
return f == other.f && state == other.state;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Function * f;
|
using base_type = function_input_iterator_facade_base_t< Function, Input >;
|
||||||
Input state;
|
|
||||||
mutable optional<BOOST_DEDUCED_TYPENAME result_of<Function ()>::type> value;
|
protected:
|
||||||
};
|
using function_arg_type = Function&;
|
||||||
|
|
||||||
template <class Function, class Input>
|
|
||||||
class function_pointer_input_iterator
|
|
||||||
: public iterator_facade<
|
|
||||||
function_pointer_input_iterator<Function, Input>,
|
|
||||||
typename function_types::result_type<Function>::type,
|
|
||||||
single_pass_traversal_tag,
|
|
||||||
typename function_types::result_type<Function>::type const &
|
|
||||||
>
|
|
||||||
{
|
|
||||||
public:
|
public:
|
||||||
function_pointer_input_iterator() {}
|
using value_type = typename base_type::value_type;
|
||||||
function_pointer_input_iterator(Function &f_, Input state_ = Input())
|
|
||||||
: f(f_), state(state_) {}
|
|
||||||
|
|
||||||
void increment() {
|
|
||||||
if(value)
|
|
||||||
value = none;
|
|
||||||
else
|
|
||||||
(*f)();
|
|
||||||
++state;
|
|
||||||
}
|
|
||||||
|
|
||||||
typename function_types::result_type<Function>::type const &
|
|
||||||
dereference() const {
|
|
||||||
return (value ? value : value = (*f)()).get();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool equal(function_pointer_input_iterator const & other) const {
|
|
||||||
return f == other.f && state == other.state;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
Function f;
|
|
||||||
Input state;
|
|
||||||
mutable optional<typename function_types::result_type<Function>::type> value;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class Function, class Input>
|
|
||||||
class function_reference_input_iterator
|
|
||||||
: public function_pointer_input_iterator<Function*,Input>
|
|
||||||
{
|
|
||||||
public:
|
public:
|
||||||
function_reference_input_iterator(Function & f_, Input state_ = Input())
|
function_object_input_iterator(function_arg_type f, Input state) :
|
||||||
: function_pointer_input_iterator<Function*,Input>(&f_, state_)
|
m_f(std::addressof(f)), m_state(state)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
typename std::add_pointer< Function >::type m_f;
|
||||||
|
Input m_state;
|
||||||
|
mutable optional< value_type > m_value;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace impl
|
template< typename Function, typename Input >
|
||||||
|
class function_pointer_input_iterator :
|
||||||
template <class Function, class Input>
|
public function_input_iterator_facade_base_t< Function, Input >
|
||||||
class function_input_iterator
|
|
||||||
: public mpl::if_<
|
|
||||||
function_types::is_function_pointer<Function>,
|
|
||||||
impl::function_pointer_input_iterator<Function,Input>,
|
|
||||||
typename mpl::if_<
|
|
||||||
function_types::is_function_reference<Function>,
|
|
||||||
impl::function_reference_input_iterator<Function,Input>,
|
|
||||||
impl::function_input_iterator<Function,Input>
|
|
||||||
>::type
|
|
||||||
>::type
|
|
||||||
{
|
{
|
||||||
typedef typename mpl::if_<
|
private:
|
||||||
function_types::is_function_pointer<Function>,
|
using base_type = function_input_iterator_facade_base_t< Function, Input >;
|
||||||
impl::function_pointer_input_iterator<Function,Input>,
|
|
||||||
typename mpl::if_<
|
protected:
|
||||||
function_types::is_function_reference<Function>,
|
using function_arg_type = Function;
|
||||||
impl::function_reference_input_iterator<Function,Input>,
|
|
||||||
impl::function_input_iterator<Function,Input>
|
|
||||||
>::type
|
|
||||||
>::type base_type;
|
|
||||||
public:
|
public:
|
||||||
function_input_iterator(Function & f, Input i)
|
using value_type = typename base_type::value_type;
|
||||||
: base_type(f, i) {}
|
|
||||||
|
public:
|
||||||
|
function_pointer_input_iterator(function_arg_type f, Input state) :
|
||||||
|
m_f(f), m_state(state)
|
||||||
|
{}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
Function m_f;
|
||||||
|
Input m_state;
|
||||||
|
mutable optional< value_type > m_value;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class Function, class Input>
|
template< typename Function, typename Input >
|
||||||
inline function_input_iterator<Function, Input>
|
using function_input_iterator_base_t = typename std::conditional<
|
||||||
make_function_input_iterator(Function & f, Input state) {
|
detail::conjunction<
|
||||||
typedef function_input_iterator<Function, Input> result_t;
|
std::is_pointer< Function >,
|
||||||
return result_t(f, state);
|
std::is_function< typename std::remove_pointer< Function >::type >
|
||||||
|
>::value,
|
||||||
|
detail::function_pointer_input_iterator< Function, Input >,
|
||||||
|
detail::function_object_input_iterator< Function, Input >
|
||||||
|
>::type;
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
|
template< typename Function, typename Input >
|
||||||
|
class function_input_iterator :
|
||||||
|
public detail::function_input_iterator_base_t< Function, Input >
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
using base_type = detail::function_input_iterator_base_t< Function, Input >;
|
||||||
|
using function_arg_type = typename base_type::function_arg_type;
|
||||||
|
|
||||||
|
public:
|
||||||
|
using reference = typename base_type::reference;
|
||||||
|
|
||||||
|
public:
|
||||||
|
function_input_iterator(function_arg_type f, Input i) :
|
||||||
|
base_type(f, i)
|
||||||
|
{}
|
||||||
|
|
||||||
|
void increment()
|
||||||
|
{
|
||||||
|
if (this->m_value)
|
||||||
|
this->m_value.reset();
|
||||||
|
else
|
||||||
|
(*this->m_f)();
|
||||||
|
++this->m_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Function, class Input>
|
reference dereference() const
|
||||||
inline function_input_iterator<Function*, Input>
|
{
|
||||||
make_function_input_iterator(Function * f, Input state) {
|
if (!this->m_value)
|
||||||
typedef function_input_iterator<Function*, Input> result_t;
|
this->m_value = (*this->m_f)();
|
||||||
return result_t(f, state);
|
return this->m_value.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
struct infinite {
|
bool equal(function_input_iterator const& other) const
|
||||||
|
{
|
||||||
|
return this->m_f == other.m_f && this->m_state == other.m_state;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template< typename Function, typename Input >
|
||||||
|
inline function_input_iterator< Function, Input > make_function_input_iterator(Function& f, Input state)
|
||||||
|
{
|
||||||
|
return function_input_iterator< Function, Input >(f, state);
|
||||||
|
}
|
||||||
|
|
||||||
|
template< typename Function, typename Input >
|
||||||
|
inline function_input_iterator< Function*, Input > make_function_input_iterator(Function* f, Input state)
|
||||||
|
{
|
||||||
|
return function_input_iterator< Function*, Input >(f, state);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct infinite
|
||||||
|
{
|
||||||
infinite& operator++() { return *this; }
|
infinite& operator++() { return *this; }
|
||||||
infinite& operator++(int) { return *this; }
|
infinite& operator++(int) { return *this; }
|
||||||
bool operator==(infinite&) const { return false; };
|
bool operator==(infinite&) const { return false; };
|
||||||
@ -167,5 +159,4 @@ using iterators::infinite;
|
|||||||
|
|
||||||
} // namespace boost
|
} // namespace boost
|
||||||
|
|
||||||
#endif
|
#endif // BOOST_ITERATOR_FUNCTION_INPUT_ITERATOR_HPP_INCLUDED_
|
||||||
|
|
||||||
|
89
include/boost/iterator/function_output_iterator.hpp
Normal file
89
include/boost/iterator/function_output_iterator.hpp
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
// (C) Copyright Jeremy Siek 2001.
|
||||||
|
// Distributed under the Boost Software License, Version 1.0. (See
|
||||||
|
// accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
// http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
|
||||||
|
// Revision History:
|
||||||
|
|
||||||
|
// 27 Feb 2001 Jeremy Siek
|
||||||
|
// Initial checkin.
|
||||||
|
|
||||||
|
#ifndef BOOST_ITERATOR_FUNCTION_OUTPUT_ITERATOR_HPP_INCLUDED_
|
||||||
|
#define BOOST_ITERATOR_FUNCTION_OUTPUT_ITERATOR_HPP_INCLUDED_
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
#include <iterator>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
namespace iterators {
|
||||||
|
|
||||||
|
template< typename UnaryFunction >
|
||||||
|
class function_output_iterator
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
class output_proxy
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit output_proxy(UnaryFunction& f) noexcept :
|
||||||
|
m_f(f)
|
||||||
|
{}
|
||||||
|
|
||||||
|
template< typename T >
|
||||||
|
typename std::enable_if<
|
||||||
|
!std::is_same< typename std::remove_cv< typename std::remove_reference< T >::type >::type, output_proxy >::value,
|
||||||
|
output_proxy const&
|
||||||
|
>::type operator=(T&& value) const
|
||||||
|
{
|
||||||
|
m_f(static_cast< T&& >(value));
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
output_proxy(output_proxy const& that) = default;
|
||||||
|
output_proxy& operator=(output_proxy const&) = delete;
|
||||||
|
|
||||||
|
private:
|
||||||
|
UnaryFunction& m_f;
|
||||||
|
};
|
||||||
|
|
||||||
|
public:
|
||||||
|
using iterator_category = std::output_iterator_tag;
|
||||||
|
using value_type = void;
|
||||||
|
using difference_type = std::ptrdiff_t;
|
||||||
|
using pointer = void;
|
||||||
|
using reference = void;
|
||||||
|
|
||||||
|
template<
|
||||||
|
bool Requires = std::is_class< UnaryFunction >::value,
|
||||||
|
typename = typename std::enable_if< Requires >::type
|
||||||
|
>
|
||||||
|
function_output_iterator() :
|
||||||
|
m_f()
|
||||||
|
{}
|
||||||
|
|
||||||
|
explicit function_output_iterator(UnaryFunction const& f) :
|
||||||
|
m_f(f)
|
||||||
|
{}
|
||||||
|
|
||||||
|
output_proxy operator*() { return output_proxy(m_f); }
|
||||||
|
function_output_iterator& operator++() { return *this; }
|
||||||
|
function_output_iterator& operator++(int) { return *this; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
UnaryFunction m_f;
|
||||||
|
};
|
||||||
|
|
||||||
|
template< typename UnaryFunction >
|
||||||
|
inline function_output_iterator< UnaryFunction > make_function_output_iterator(UnaryFunction const& f = UnaryFunction())
|
||||||
|
{
|
||||||
|
return function_output_iterator< UnaryFunction >(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace iterators
|
||||||
|
|
||||||
|
using iterators::function_output_iterator;
|
||||||
|
using iterators::make_function_output_iterator;
|
||||||
|
|
||||||
|
} // namespace boost
|
||||||
|
|
||||||
|
#endif // BOOST_ITERATOR_FUNCTION_OUTPUT_ITERATOR_HPP_INCLUDED_
|
96
include/boost/iterator/generator_iterator.hpp
Normal file
96
include/boost/iterator/generator_iterator.hpp
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
// (C) Copyright Jens Maurer 2001.
|
||||||
|
// Distributed under the Boost Software License, Version 1.0. (See
|
||||||
|
// accompanying file LICENSE_1_0.txt or copy at
|
||||||
|
// http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
//
|
||||||
|
// Revision History:
|
||||||
|
|
||||||
|
// 15 Nov 2001 Jens Maurer
|
||||||
|
// created.
|
||||||
|
|
||||||
|
// See http://www.boost.org/libs/utility/iterator_adaptors.htm for documentation.
|
||||||
|
|
||||||
|
#ifndef BOOST_ITERATOR_GENERATOR_ITERATOR_HPP_INCLUDED_
|
||||||
|
#define BOOST_ITERATOR_GENERATOR_ITERATOR_HPP_INCLUDED_
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
#include <boost/iterator/iterator_facade.hpp>
|
||||||
|
#include <boost/iterator/iterator_categories.hpp>
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
namespace iterators {
|
||||||
|
|
||||||
|
template< typename Generator >
|
||||||
|
class generator_iterator :
|
||||||
|
public iterator_facade<
|
||||||
|
generator_iterator< Generator >,
|
||||||
|
decltype(std::declval< Generator& >()()),
|
||||||
|
single_pass_traversal_tag,
|
||||||
|
decltype(std::declval< Generator& >()()) const&
|
||||||
|
>
|
||||||
|
{
|
||||||
|
friend class iterator_core_access;
|
||||||
|
|
||||||
|
private:
|
||||||
|
using super_t = iterator_facade<
|
||||||
|
generator_iterator< Generator >,
|
||||||
|
decltype(std::declval< Generator& >()()),
|
||||||
|
single_pass_traversal_tag,
|
||||||
|
decltype(std::declval< Generator& >()()) const&
|
||||||
|
>;
|
||||||
|
|
||||||
|
public:
|
||||||
|
generator_iterator() :
|
||||||
|
m_g(nullptr),
|
||||||
|
m_value()
|
||||||
|
{}
|
||||||
|
|
||||||
|
generator_iterator(Generator* g) :
|
||||||
|
m_g(g),
|
||||||
|
m_value((*m_g)())
|
||||||
|
{}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void increment()
|
||||||
|
{
|
||||||
|
m_value = (*m_g)();
|
||||||
|
}
|
||||||
|
|
||||||
|
typename super_t::reference dereference() const
|
||||||
|
{
|
||||||
|
return m_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool equal(generator_iterator const& y) const
|
||||||
|
{
|
||||||
|
return m_g == y.m_g && m_value == y.m_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
Generator* m_g;
|
||||||
|
typename Generator::result_type m_value;
|
||||||
|
};
|
||||||
|
|
||||||
|
template< typename Generator >
|
||||||
|
struct generator_iterator_generator
|
||||||
|
{
|
||||||
|
using type = generator_iterator< Generator >;
|
||||||
|
};
|
||||||
|
|
||||||
|
template< typename Generator >
|
||||||
|
inline generator_iterator< Generator > make_generator_iterator(Generator& gen)
|
||||||
|
{
|
||||||
|
return generator_iterator< Generator >(std::addressof(gen));
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace iterators
|
||||||
|
|
||||||
|
using iterators::generator_iterator;
|
||||||
|
using iterators::generator_iterator_generator;
|
||||||
|
using iterators::make_generator_iterator;
|
||||||
|
|
||||||
|
} // namespace boost
|
||||||
|
|
||||||
|
#endif // BOOST_ITERATOR_GENERATOR_ITERATOR_HPP_INCLUDED_
|
@ -7,130 +7,108 @@
|
|||||||
#ifndef BOOST_INDIRECT_ITERATOR_23022003THW_HPP
|
#ifndef BOOST_INDIRECT_ITERATOR_23022003THW_HPP
|
||||||
#define BOOST_INDIRECT_ITERATOR_23022003THW_HPP
|
#define BOOST_INDIRECT_ITERATOR_23022003THW_HPP
|
||||||
|
|
||||||
#include <boost/iterator.hpp>
|
#include <iterator>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
#include <boost/iterator/iterator_adaptor.hpp>
|
#include <boost/iterator/iterator_adaptor.hpp>
|
||||||
|
#include <boost/iterator/enable_if_convertible.hpp>
|
||||||
|
#include <boost/iterator/detail/eval_if_default.hpp>
|
||||||
|
|
||||||
#include <boost/pointee.hpp>
|
#include <boost/pointee.hpp>
|
||||||
#include <boost/indirect_reference.hpp>
|
#include <boost/indirect_reference.hpp>
|
||||||
#include <boost/detail/iterator.hpp>
|
|
||||||
|
|
||||||
#include <boost/detail/indirect_traits.hpp>
|
#include <boost/core/use_default.hpp>
|
||||||
|
|
||||||
#include <boost/type_traits/is_same.hpp>
|
|
||||||
#include <boost/type_traits/add_reference.hpp>
|
|
||||||
|
|
||||||
#include <boost/mpl/bool.hpp>
|
|
||||||
#include <boost/mpl/identity.hpp>
|
|
||||||
#include <boost/mpl/eval_if.hpp>
|
|
||||||
#include <boost/mpl/not.hpp>
|
|
||||||
#include <boost/mpl/has_xxx.hpp>
|
|
||||||
|
|
||||||
#ifdef BOOST_MPL_CFG_NO_HAS_XXX
|
|
||||||
# include <boost/shared_ptr.hpp>
|
|
||||||
# include <boost/scoped_ptr.hpp>
|
|
||||||
# include <boost/mpl/bool.hpp>
|
|
||||||
# include <memory>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <boost/iterator/detail/config_def.hpp> // must be last #include
|
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
namespace iterators {
|
namespace iterators {
|
||||||
|
|
||||||
template <class Iter, class Value, class Category, class Reference, class Difference>
|
template< typename Iter, typename Value, typename Category, typename Reference, typename Difference >
|
||||||
class indirect_iterator;
|
class indirect_iterator;
|
||||||
|
|
||||||
namespace detail
|
namespace detail {
|
||||||
{
|
|
||||||
template <class Iter, class Value, class Category, class Reference, class Difference>
|
template< typename Iter, typename Value, typename Category, typename Reference, typename Difference >
|
||||||
struct indirect_base
|
struct indirect_base
|
||||||
{
|
{
|
||||||
typedef typename boost::detail::iterator_traits<Iter>::value_type dereferenceable;
|
using dereferenceable = typename std::iterator_traits< Iter >::value_type;
|
||||||
|
|
||||||
typedef iterator_adaptor<
|
using type = iterator_adaptor<
|
||||||
indirect_iterator<Iter, Value, Category, Reference, Difference>
|
indirect_iterator< Iter, Value, Category, Reference, Difference >,
|
||||||
, Iter
|
Iter,
|
||||||
, typename ia_dflt_help<
|
detail::eval_if_default_t<
|
||||||
Value, pointee<dereferenceable>
|
Value,
|
||||||
>::type
|
pointee< dereferenceable >
|
||||||
, Category
|
>,
|
||||||
, typename ia_dflt_help<
|
Category,
|
||||||
Reference
|
detail::eval_if_default_t<
|
||||||
, mpl::eval_if<
|
Reference,
|
||||||
is_same<Value,use_default>
|
detail::eval_if_default<
|
||||||
, indirect_reference<dereferenceable>
|
Value,
|
||||||
, add_reference<Value>
|
indirect_reference< dereferenceable >,
|
||||||
|
std::add_lvalue_reference< Value >
|
||||||
>
|
>
|
||||||
>::type
|
>,
|
||||||
, Difference
|
Difference
|
||||||
> type;
|
>;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <>
|
|
||||||
struct indirect_base<int, int, int, int, int> {};
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
|
|
||||||
template<
|
template<
|
||||||
class Iterator
|
typename Iterator,
|
||||||
, class Value = use_default
|
typename Value = use_default,
|
||||||
, class Category = use_default
|
typename Category = use_default,
|
||||||
, class Reference = use_default
|
typename Reference = use_default,
|
||||||
, class Difference = use_default
|
typename Difference = use_default
|
||||||
>
|
>
|
||||||
class indirect_iterator
|
class indirect_iterator :
|
||||||
: public detail::indirect_base<
|
public detail::indirect_base<
|
||||||
Iterator, Value, Category, Reference, Difference
|
Iterator, Value, Category, Reference, Difference
|
||||||
>::type
|
>::type
|
||||||
{
|
{
|
||||||
typedef typename detail::indirect_base<
|
using super_t = typename detail::indirect_base<
|
||||||
Iterator, Value, Category, Reference, Difference
|
Iterator, Value, Category, Reference, Difference
|
||||||
>::type super_t;
|
>::type;
|
||||||
|
|
||||||
friend class iterator_core_access;
|
friend class iterator_core_access;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
indirect_iterator() {}
|
indirect_iterator() = default;
|
||||||
|
|
||||||
indirect_iterator(Iterator iter)
|
indirect_iterator(Iterator iter) :
|
||||||
: super_t(iter) {}
|
super_t(iter)
|
||||||
|
{}
|
||||||
|
|
||||||
template<
|
template<
|
||||||
class Iterator2, class Value2, class Category2
|
typename Iterator2,
|
||||||
, class Reference2, class Difference2
|
typename Value2,
|
||||||
|
typename Category2,
|
||||||
|
typename Reference2,
|
||||||
|
typename Difference2,
|
||||||
|
typename = enable_if_convertible_t< Iterator2, Iterator >
|
||||||
>
|
>
|
||||||
indirect_iterator(
|
indirect_iterator(indirect_iterator< Iterator2, Value2, Category2, Reference2, Difference2 > const& y) :
|
||||||
indirect_iterator<
|
super_t(y.base())
|
||||||
Iterator2, Value2, Category2, Reference2, Difference2
|
|
||||||
> const& y
|
|
||||||
, typename enable_if_convertible<Iterator2, Iterator>::type* = 0
|
|
||||||
)
|
|
||||||
: super_t(y.base())
|
|
||||||
{}
|
{}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typename super_t::reference dereference() const
|
typename super_t::reference dereference() const
|
||||||
{
|
{
|
||||||
# if BOOST_WORKAROUND(__BORLANDC__, < 0x5A0 )
|
|
||||||
return const_cast<super_t::reference>(**this->base());
|
|
||||||
# else
|
|
||||||
return **this->base();
|
return **this->base();
|
||||||
# endif
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class Iter>
|
template< typename Iter >
|
||||||
inline
|
inline indirect_iterator< Iter > make_indirect_iterator(Iter x)
|
||||||
indirect_iterator<Iter> make_indirect_iterator(Iter x)
|
|
||||||
{
|
{
|
||||||
return indirect_iterator< Iter >(x);
|
return indirect_iterator< Iter >(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class Traits, class Iter>
|
template< typename Value, typename Iter >
|
||||||
inline
|
inline indirect_iterator< Iter, Value > make_indirect_iterator(Iter x)
|
||||||
indirect_iterator<Iter,Traits> make_indirect_iterator(Iter x, Traits* = 0)
|
|
||||||
{
|
{
|
||||||
return indirect_iterator<Iter, Traits>(x);
|
return indirect_iterator< Iter, Value >(x);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace iterators
|
} // namespace iterators
|
||||||
@ -140,6 +118,4 @@ using iterators::make_indirect_iterator;
|
|||||||
|
|
||||||
} // namespace boost
|
} // namespace boost
|
||||||
|
|
||||||
#include <boost/iterator/detail/config_undef.hpp>
|
|
||||||
|
|
||||||
#endif // BOOST_INDIRECT_ITERATOR_23022003THW_HPP
|
#endif // BOOST_INDIRECT_ITERATOR_23022003THW_HPP
|
||||||
|
@ -7,12 +7,8 @@
|
|||||||
#ifndef BOOST_INTEROPERABLE_23022003THW_HPP
|
#ifndef BOOST_INTEROPERABLE_23022003THW_HPP
|
||||||
#define BOOST_INTEROPERABLE_23022003THW_HPP
|
#define BOOST_INTEROPERABLE_23022003THW_HPP
|
||||||
|
|
||||||
# include <boost/mpl/bool.hpp>
|
#include <type_traits>
|
||||||
# include <boost/mpl/or.hpp>
|
#include <boost/iterator/detail/type_traits/disjunction.hpp>
|
||||||
|
|
||||||
# include <boost/type_traits/is_convertible.hpp>
|
|
||||||
|
|
||||||
# include <boost/iterator/detail/config_def.hpp> // must appear last
|
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
namespace iterators {
|
namespace iterators {
|
||||||
@ -32,14 +28,8 @@ namespace iterators {
|
|||||||
// on operator implementation for consequences.
|
// on operator implementation for consequences.
|
||||||
//
|
//
|
||||||
template< typename A, typename B >
|
template< typename A, typename B >
|
||||||
struct is_interoperable
|
struct is_interoperable :
|
||||||
# ifdef BOOST_NO_STRICT_ITERATOR_INTEROPERABILITY
|
public detail::disjunction< std::is_convertible< A, B >, std::is_convertible< B, A > >
|
||||||
: mpl::true_
|
|
||||||
# else
|
|
||||||
: mpl::or_<
|
|
||||||
is_convertible< A, B >
|
|
||||||
, is_convertible< B, A > >
|
|
||||||
# endif
|
|
||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -49,6 +39,4 @@ using iterators::is_interoperable;
|
|||||||
|
|
||||||
} // namespace boost
|
} // namespace boost
|
||||||
|
|
||||||
# include <boost/iterator/detail/config_undef.hpp>
|
|
||||||
|
|
||||||
#endif // BOOST_INTEROPERABLE_23022003THW_HPP
|
#endif // BOOST_INTEROPERABLE_23022003THW_HPP
|
||||||
|
148
include/boost/iterator/is_iterator.hpp
Normal file
148
include/boost/iterator/is_iterator.hpp
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
/*
|
||||||
|
* 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)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2023 Andrey Semashev
|
||||||
|
*/
|
||||||
|
/*!
|
||||||
|
* \file iterator/is_iterator.hpp
|
||||||
|
*
|
||||||
|
* This header contains definition of the \c is_iterator type trait.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef BOOST_ITERATOR_IS_ITERATOR_HPP_INCLUDED_
|
||||||
|
#define BOOST_ITERATOR_IS_ITERATOR_HPP_INCLUDED_
|
||||||
|
|
||||||
|
#include <cstddef>
|
||||||
|
#include <boost/config.hpp>
|
||||||
|
#include <boost/type_traits/is_complete.hpp>
|
||||||
|
#include <boost/iterator/detail/type_traits/conjunction.hpp>
|
||||||
|
#include <boost/iterator/detail/type_traits/negation.hpp>
|
||||||
|
#if !defined(BOOST_NO_CXX17_ITERATOR_TRAITS)
|
||||||
|
#include <iterator>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
#ifdef BOOST_HAS_PRAGMA_ONCE
|
||||||
|
#pragma once
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace boost {
|
||||||
|
namespace iterators {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
|
// The trait attempts to detect if the T type is an iterator class. Class-type iterators are assumed
|
||||||
|
// to have the nested type iterator_category. Strictly speaking, this is not required to be the
|
||||||
|
// case (e.g. a user can specialize iterator_traits for T without defining T::iterator_category).
|
||||||
|
// Still, this is a good heuristic in practice, and we can't do anything better anyway.
|
||||||
|
// Since C++17 we can test for iterator_traits<T>::iterator_category presence instead as it is
|
||||||
|
// required to be only present for iterators.
|
||||||
|
namespace has_iterator_category_detail {
|
||||||
|
|
||||||
|
typedef char yes_type;
|
||||||
|
struct no_type { char padding[2]; };
|
||||||
|
|
||||||
|
template< typename T >
|
||||||
|
yes_type check(
|
||||||
|
#if !defined(BOOST_NO_CXX17_ITERATOR_TRAITS)
|
||||||
|
typename std::iterator_traits< T >::iterator_category*
|
||||||
|
#else
|
||||||
|
typename T::iterator_category*
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
template< typename >
|
||||||
|
no_type check(...);
|
||||||
|
|
||||||
|
} // namespace has_iterator_category_detail
|
||||||
|
|
||||||
|
template< typename T >
|
||||||
|
struct is_iterator_impl :
|
||||||
|
public std::integral_constant<
|
||||||
|
bool,
|
||||||
|
sizeof(has_iterator_category_detail::check<T>(0)) == sizeof(has_iterator_category_detail::yes_type)
|
||||||
|
>
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
template< typename T >
|
||||||
|
struct is_iterator_impl< T* > :
|
||||||
|
public conjunction<
|
||||||
|
boost::is_complete<T>,
|
||||||
|
negation< std::is_function< T > >
|
||||||
|
>::type
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
template< typename T, typename U >
|
||||||
|
struct is_iterator_impl< T U::* > :
|
||||||
|
public std::false_type
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
template< typename T >
|
||||||
|
struct is_iterator_impl<T&> :
|
||||||
|
public std::false_type
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
template< typename T, std::size_t N >
|
||||||
|
struct is_iterator_impl< T[N] > :
|
||||||
|
public std::false_type
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
#if !defined(BOOST_TT_HAS_WORKING_IS_COMPLETE)
|
||||||
|
template< typename T >
|
||||||
|
struct is_iterator_impl< T[] > :
|
||||||
|
public std::false_type
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
template< >
|
||||||
|
struct is_iterator_impl< void > :
|
||||||
|
public std::false_type
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
template< >
|
||||||
|
struct is_iterator_impl< void* > :
|
||||||
|
public std::false_type
|
||||||
|
{
|
||||||
|
};
|
||||||
|
#endif // !defined(BOOST_TT_HAS_WORKING_IS_COMPLETE)
|
||||||
|
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
|
/*!
|
||||||
|
* \brief The type trait detects whether the type \c T is an iterator type.
|
||||||
|
*
|
||||||
|
* The type trait yields \c true if its argument type \c T, after stripping top level
|
||||||
|
* cv qualifiers, is one of the following:
|
||||||
|
*
|
||||||
|
* - A pointer type, other than a pointer to function, a pointer to a class member,
|
||||||
|
* or a pointer to an incomplete type, including `void`.
|
||||||
|
* - A class type for which an iterator category is obtainable. Prior to C++17,
|
||||||
|
* the iterator category must be defined as a public `T::iterator_category` type.
|
||||||
|
* Since C++17, the expression `std::iterator_traits< T >::iterator_category` must
|
||||||
|
* be valid and produce the iterator category type.
|
||||||
|
*
|
||||||
|
* Otherwise, the type trait yields \c false.
|
||||||
|
*/
|
||||||
|
template< typename T >
|
||||||
|
struct is_iterator : public detail::is_iterator_impl< T >::type {};
|
||||||
|
template< typename T >
|
||||||
|
struct is_iterator< const T > : public detail::is_iterator_impl< T >::type {};
|
||||||
|
template< typename T >
|
||||||
|
struct is_iterator< volatile T > : public detail::is_iterator_impl< T >::type {};
|
||||||
|
template< typename T >
|
||||||
|
struct is_iterator< const volatile T > : public detail::is_iterator_impl< T >::type {};
|
||||||
|
|
||||||
|
} // namespace iterators
|
||||||
|
|
||||||
|
using iterators::is_iterator;
|
||||||
|
|
||||||
|
} // namespace boost
|
||||||
|
|
||||||
|
#endif // BOOST_ITERATOR_IS_ITERATOR_HPP_INCLUDED_
|
@ -4,151 +4,71 @@
|
|||||||
#ifndef IS_LVALUE_ITERATOR_DWA2003112_HPP
|
#ifndef IS_LVALUE_ITERATOR_DWA2003112_HPP
|
||||||
#define IS_LVALUE_ITERATOR_DWA2003112_HPP
|
#define IS_LVALUE_ITERATOR_DWA2003112_HPP
|
||||||
|
|
||||||
#include <boost/iterator.hpp>
|
#include <boost/iterator/detail/type_traits/conjunction.hpp>
|
||||||
|
|
||||||
#include <boost/detail/workaround.hpp>
|
#include <iterator>
|
||||||
#include <boost/detail/iterator.hpp>
|
#include <type_traits>
|
||||||
|
|
||||||
#include <boost/type_traits/add_lvalue_reference.hpp>
|
|
||||||
#include <boost/iterator/detail/any_conversion_eater.hpp>
|
|
||||||
#include <boost/mpl/bool.hpp>
|
|
||||||
#include <boost/mpl/aux_/lambda_support.hpp>
|
|
||||||
|
|
||||||
// should be the last #includes
|
|
||||||
#include <boost/type_traits/integral_constant.hpp>
|
|
||||||
#include <boost/iterator/detail/config_def.hpp>
|
|
||||||
|
|
||||||
#ifndef BOOST_NO_IS_CONVERTIBLE
|
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
|
|
||||||
namespace iterators {
|
namespace iterators {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
namespace detail
|
// Guts of is_lvalue_iterator. It is the iterator type and
|
||||||
|
// Value is the iterator's value_type.
|
||||||
|
template< typename It, typename Value >
|
||||||
|
struct is_lvalue_iterator_impl :
|
||||||
|
public detail::conjunction<
|
||||||
|
std::is_convertible< decltype(*std::declval< It& >()), typename std::add_lvalue_reference< Value >::type >,
|
||||||
|
std::is_lvalue_reference< decltype(*std::declval< It& >()) >
|
||||||
|
>::type
|
||||||
{
|
{
|
||||||
#ifndef BOOST_NO_LVALUE_RETURN_DETECTION
|
|
||||||
// Calling lvalue_preserver( <expression>, 0 ) returns a reference
|
|
||||||
// to the expression's result if <expression> is an lvalue, or
|
|
||||||
// not_an_lvalue() otherwise.
|
|
||||||
struct not_an_lvalue {};
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
T& lvalue_preserver(T&, int);
|
|
||||||
|
|
||||||
template <class U>
|
|
||||||
not_an_lvalue lvalue_preserver(U const&, ...);
|
|
||||||
|
|
||||||
# define BOOST_LVALUE_PRESERVER(expr) detail::lvalue_preserver(expr,0)
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
# define BOOST_LVALUE_PRESERVER(expr) expr
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Guts of is_lvalue_iterator. Value is the iterator's value_type
|
|
||||||
// and the result is computed in the nested rebind template.
|
|
||||||
template <class Value>
|
|
||||||
struct is_lvalue_iterator_impl
|
|
||||||
{
|
|
||||||
// Eat implicit conversions so we don't report true for things
|
|
||||||
// convertible to Value const&
|
|
||||||
struct conversion_eater
|
|
||||||
{
|
|
||||||
conversion_eater(typename add_lvalue_reference<Value>::type);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static char tester(conversion_eater, int);
|
|
||||||
static char (& tester(any_conversion_eater, ...) )[2];
|
|
||||||
|
|
||||||
template <class It>
|
|
||||||
struct rebind
|
|
||||||
{
|
|
||||||
static It& x;
|
|
||||||
|
|
||||||
BOOST_STATIC_CONSTANT(
|
|
||||||
bool
|
|
||||||
, value = (
|
|
||||||
sizeof(
|
|
||||||
is_lvalue_iterator_impl<Value>::tester(
|
|
||||||
BOOST_LVALUE_PRESERVER(*x), 0
|
|
||||||
)
|
|
||||||
) == 1
|
|
||||||
)
|
|
||||||
);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
#undef BOOST_LVALUE_PRESERVER
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// void specializations to handle std input and output iterators
|
// void specializations to handle std input and output iterators
|
||||||
//
|
//
|
||||||
template <>
|
template< typename It >
|
||||||
struct is_lvalue_iterator_impl<void>
|
struct is_lvalue_iterator_impl< It, void > :
|
||||||
|
public std::false_type
|
||||||
{
|
{
|
||||||
template <class It>
|
|
||||||
struct rebind : boost::mpl::false_
|
|
||||||
{};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
|
template< typename It >
|
||||||
template <>
|
struct is_lvalue_iterator_impl< It, const void > :
|
||||||
struct is_lvalue_iterator_impl<const void>
|
public std::false_type
|
||||||
{
|
{
|
||||||
template <class It>
|
|
||||||
struct rebind : boost::mpl::false_
|
|
||||||
{};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <>
|
template< typename It >
|
||||||
struct is_lvalue_iterator_impl<volatile void>
|
struct is_lvalue_iterator_impl< It, volatile void > :
|
||||||
|
public std::false_type
|
||||||
{
|
{
|
||||||
template <class It>
|
|
||||||
struct rebind : boost::mpl::false_
|
|
||||||
{};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <>
|
template< typename It >
|
||||||
struct is_lvalue_iterator_impl<const volatile void>
|
struct is_lvalue_iterator_impl< It, const volatile void > :
|
||||||
|
public std::false_type
|
||||||
{
|
{
|
||||||
template <class It>
|
|
||||||
struct rebind : boost::mpl::false_
|
|
||||||
{};
|
|
||||||
};
|
};
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
|
||||||
// This level of dispatching is required for Borland. We might save
|
|
||||||
// an instantiation by removing it for others.
|
|
||||||
//
|
|
||||||
template <class It>
|
|
||||||
struct is_readable_lvalue_iterator_impl
|
|
||||||
: is_lvalue_iterator_impl<
|
|
||||||
BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits<It>::value_type const
|
|
||||||
>::template rebind<It>
|
|
||||||
{};
|
|
||||||
|
|
||||||
template <class It>
|
|
||||||
struct is_non_const_lvalue_iterator_impl
|
|
||||||
: is_lvalue_iterator_impl<
|
|
||||||
BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits<It>::value_type
|
|
||||||
>::template rebind<It>
|
|
||||||
{};
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
template< typename T > struct is_lvalue_iterator
|
template< typename T >
|
||||||
: public ::boost::integral_constant<bool,::boost::iterators::detail::is_readable_lvalue_iterator_impl<T>::value>
|
struct is_lvalue_iterator :
|
||||||
|
public iterators::detail::is_lvalue_iterator_impl<
|
||||||
|
T,
|
||||||
|
typename std::iterator_traits< T >::value_type const
|
||||||
|
>::type
|
||||||
{
|
{
|
||||||
public:
|
|
||||||
BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_lvalue_iterator,(T))
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template< typename T > struct is_non_const_lvalue_iterator
|
template< typename T >
|
||||||
: public ::boost::integral_constant<bool,::boost::iterators::detail::is_non_const_lvalue_iterator_impl<T>::value>
|
struct is_non_const_lvalue_iterator :
|
||||||
|
public iterators::detail::is_lvalue_iterator_impl<
|
||||||
|
T,
|
||||||
|
typename std::iterator_traits< T >::value_type
|
||||||
|
>::type
|
||||||
{
|
{
|
||||||
public:
|
|
||||||
BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_non_const_lvalue_iterator,(T))
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace iterators
|
} // namespace iterators
|
||||||
@ -158,8 +78,4 @@ using iterators::is_non_const_lvalue_iterator;
|
|||||||
|
|
||||||
} // namespace boost
|
} // namespace boost
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <boost/iterator/detail/config_undef.hpp>
|
|
||||||
|
|
||||||
#endif // IS_LVALUE_ITERATOR_DWA2003112_HPP
|
#endif // IS_LVALUE_ITERATOR_DWA2003112_HPP
|
||||||
|
@ -4,105 +4,60 @@
|
|||||||
#ifndef IS_READABLE_ITERATOR_DWA2003112_HPP
|
#ifndef IS_READABLE_ITERATOR_DWA2003112_HPP
|
||||||
#define IS_READABLE_ITERATOR_DWA2003112_HPP
|
#define IS_READABLE_ITERATOR_DWA2003112_HPP
|
||||||
|
|
||||||
#include <boost/mpl/bool.hpp>
|
#include <iterator>
|
||||||
#include <boost/mpl/aux_/lambda_support.hpp>
|
#include <type_traits>
|
||||||
#include <boost/detail/iterator.hpp>
|
|
||||||
#include <boost/type_traits/add_lvalue_reference.hpp>
|
|
||||||
|
|
||||||
#include <boost/iterator/detail/any_conversion_eater.hpp>
|
|
||||||
|
|
||||||
// should be the last #include
|
|
||||||
#include <boost/type_traits/integral_constant.hpp>
|
|
||||||
#include <boost/iterator/detail/config_def.hpp>
|
|
||||||
|
|
||||||
#ifndef BOOST_NO_IS_CONVERTIBLE
|
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
|
|
||||||
namespace iterators {
|
namespace iterators {
|
||||||
|
namespace detail {
|
||||||
|
|
||||||
namespace detail
|
// Guts of is_readable_iterator. It is the iterator type and
|
||||||
|
// Value is the iterator's value_type.
|
||||||
|
template< typename It, typename Value >
|
||||||
|
struct is_readable_iterator_impl :
|
||||||
|
public std::is_convertible<
|
||||||
|
decltype(*std::declval< It& >()),
|
||||||
|
typename std::add_lvalue_reference< Value >::type
|
||||||
|
>
|
||||||
{
|
{
|
||||||
// Guts of is_readable_iterator. Value is the iterator's value_type
|
|
||||||
// and the result is computed in the nested rebind template.
|
|
||||||
template <class Value>
|
|
||||||
struct is_readable_iterator_impl
|
|
||||||
{
|
|
||||||
static char tester(typename add_lvalue_reference<Value>::type, int);
|
|
||||||
static char (& tester(any_conversion_eater, ...) )[2];
|
|
||||||
|
|
||||||
template <class It>
|
|
||||||
struct rebind
|
|
||||||
{
|
|
||||||
static It& x;
|
|
||||||
|
|
||||||
BOOST_STATIC_CONSTANT(
|
|
||||||
bool
|
|
||||||
, value = (
|
|
||||||
sizeof(
|
|
||||||
is_readable_iterator_impl<Value>::tester(*x, 1)
|
|
||||||
) == 1
|
|
||||||
)
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
};
|
|
||||||
|
|
||||||
#undef BOOST_READABLE_PRESERVER
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// void specializations to handle std input and output iterators
|
// void specializations to handle std input and output iterators
|
||||||
//
|
//
|
||||||
template <>
|
template< typename It >
|
||||||
struct is_readable_iterator_impl<void>
|
struct is_readable_iterator_impl< It, void > :
|
||||||
|
public std::false_type
|
||||||
{
|
{
|
||||||
template <class It>
|
|
||||||
struct rebind : boost::mpl::false_
|
|
||||||
{};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifndef BOOST_NO_CV_VOID_SPECIALIZATIONS
|
template< typename It >
|
||||||
template <>
|
struct is_readable_iterator_impl< It, const void > :
|
||||||
struct is_readable_iterator_impl<const void>
|
public std::false_type
|
||||||
{
|
{
|
||||||
template <class It>
|
|
||||||
struct rebind : boost::mpl::false_
|
|
||||||
{};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <>
|
template< typename It >
|
||||||
struct is_readable_iterator_impl<volatile void>
|
struct is_readable_iterator_impl< It, volatile void > :
|
||||||
|
public std::false_type
|
||||||
{
|
{
|
||||||
template <class It>
|
|
||||||
struct rebind : boost::mpl::false_
|
|
||||||
{};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
template <>
|
template< typename It >
|
||||||
struct is_readable_iterator_impl<const volatile void>
|
struct is_readable_iterator_impl< It, const volatile void > :
|
||||||
|
public std::false_type
|
||||||
{
|
{
|
||||||
template <class It>
|
|
||||||
struct rebind : boost::mpl::false_
|
|
||||||
{};
|
|
||||||
};
|
};
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
|
||||||
// This level of dispatching is required for Borland. We might save
|
|
||||||
// an instantiation by removing it for others.
|
|
||||||
//
|
|
||||||
template <class It>
|
|
||||||
struct is_readable_iterator_impl2
|
|
||||||
: is_readable_iterator_impl<
|
|
||||||
BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits<It>::value_type const
|
|
||||||
>::template rebind<It>
|
|
||||||
{};
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
template< typename T > struct is_readable_iterator
|
template< typename T >
|
||||||
: public ::boost::integral_constant<bool,::boost::iterators::detail::is_readable_iterator_impl2<T>::value>
|
struct is_readable_iterator :
|
||||||
|
public iterators::detail::is_readable_iterator_impl<
|
||||||
|
T,
|
||||||
|
typename std::iterator_traits< T >::value_type const
|
||||||
|
>::type
|
||||||
{
|
{
|
||||||
public:
|
|
||||||
BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_readable_iterator,(T))
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace iterators
|
} // namespace iterators
|
||||||
@ -111,8 +66,4 @@ using iterators::is_readable_iterator;
|
|||||||
|
|
||||||
} // namespace boost
|
} // namespace boost
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <boost/iterator/detail/config_undef.hpp>
|
|
||||||
|
|
||||||
#endif // IS_READABLE_ITERATOR_DWA2003112_HPP
|
#endif // IS_READABLE_ITERATOR_DWA2003112_HPP
|
||||||
|
@ -7,29 +7,17 @@
|
|||||||
#ifndef BOOST_ITERATOR_ADAPTOR_23022003THW_HPP
|
#ifndef BOOST_ITERATOR_ADAPTOR_23022003THW_HPP
|
||||||
#define BOOST_ITERATOR_ADAPTOR_23022003THW_HPP
|
#define BOOST_ITERATOR_ADAPTOR_23022003THW_HPP
|
||||||
|
|
||||||
#include <boost/static_assert.hpp>
|
#include <type_traits>
|
||||||
#include <boost/iterator.hpp>
|
|
||||||
#include <boost/detail/iterator.hpp>
|
#include <boost/core/use_default.hpp>
|
||||||
|
|
||||||
#include <boost/iterator/iterator_categories.hpp>
|
#include <boost/iterator/iterator_categories.hpp>
|
||||||
#include <boost/iterator/iterator_facade.hpp>
|
#include <boost/iterator/iterator_facade.hpp>
|
||||||
#include <boost/iterator/detail/enable_if.hpp>
|
|
||||||
|
|
||||||
#include <boost/mpl/and.hpp>
|
|
||||||
#include <boost/mpl/not.hpp>
|
|
||||||
#include <boost/mpl/or.hpp>
|
|
||||||
|
|
||||||
#include <boost/type_traits/is_same.hpp>
|
|
||||||
#include <boost/type_traits/is_convertible.hpp>
|
|
||||||
|
|
||||||
#ifdef BOOST_ITERATOR_REF_CONSTNESS_KILLS_WRITABILITY
|
|
||||||
# include <boost/type_traits/remove_reference.hpp>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <boost/type_traits/add_reference.hpp>
|
|
||||||
#include <boost/iterator/detail/config_def.hpp>
|
|
||||||
|
|
||||||
#include <boost/iterator/iterator_traits.hpp>
|
#include <boost/iterator/iterator_traits.hpp>
|
||||||
|
#include <boost/iterator/enable_if_convertible.hpp> // for backward compatibility; remove once downstream users are updated
|
||||||
|
#include <boost/iterator/detail/eval_if_default.hpp>
|
||||||
|
|
||||||
|
#include <boost/iterator/detail/config_def.hpp>
|
||||||
|
|
||||||
namespace boost {
|
namespace boost {
|
||||||
namespace iterators {
|
namespace iterators {
|
||||||
@ -37,183 +25,60 @@ namespace iterators {
|
|||||||
// Used as a default template argument internally, merely to
|
// Used as a default template argument internally, merely to
|
||||||
// indicate "use the default", this can also be passed by users
|
// indicate "use the default", this can also be passed by users
|
||||||
// explicitly in order to specify that the default should be used.
|
// explicitly in order to specify that the default should be used.
|
||||||
struct use_default;
|
using boost::use_default;
|
||||||
|
|
||||||
} // namespace iterators
|
namespace detail {
|
||||||
|
|
||||||
using iterators::use_default;
|
|
||||||
|
|
||||||
// the incompleteness of use_default causes massive problems for
|
|
||||||
// is_convertible (naturally). This workaround is fortunately not
|
|
||||||
// needed for vc6/vc7.
|
|
||||||
template<class To>
|
|
||||||
struct is_convertible<use_default,To>
|
|
||||||
: mpl::false_ {};
|
|
||||||
|
|
||||||
namespace iterators {
|
|
||||||
|
|
||||||
namespace detail
|
|
||||||
{
|
|
||||||
|
|
||||||
//
|
|
||||||
// Result type used in enable_if_convertible meta function.
|
|
||||||
// This can be an incomplete type, as only pointers to
|
|
||||||
// enable_if_convertible< ... >::type are used.
|
|
||||||
// We could have used void for this, but conversion to
|
|
||||||
// void* is just to easy.
|
|
||||||
//
|
|
||||||
struct enable_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// enable_if for use in adapted iterators constructors.
|
|
||||||
//
|
|
||||||
// In order to provide interoperability between adapted constant and
|
|
||||||
// mutable iterators, adapted iterators will usually provide templated
|
|
||||||
// conversion constructors of the following form
|
|
||||||
//
|
|
||||||
// template <class BaseIterator>
|
|
||||||
// class adapted_iterator :
|
|
||||||
// public iterator_adaptor< adapted_iterator<Iterator>, Iterator >
|
|
||||||
// {
|
|
||||||
// public:
|
|
||||||
//
|
|
||||||
// ...
|
|
||||||
//
|
|
||||||
// template <class OtherIterator>
|
|
||||||
// adapted_iterator(
|
|
||||||
// OtherIterator const& it
|
|
||||||
// , typename enable_if_convertible<OtherIterator, Iterator>::type* = 0);
|
|
||||||
//
|
|
||||||
// ...
|
|
||||||
// };
|
|
||||||
//
|
|
||||||
// enable_if_convertible is used to remove those overloads from the overload
|
|
||||||
// set that cannot be instantiated. For all practical purposes only overloads
|
|
||||||
// for constant/mutable interaction will remain. This has the advantage that
|
|
||||||
// meta functions like boost::is_convertible do not return false positives,
|
|
||||||
// as they can only look at the signature of the conversion constructor
|
|
||||||
// and not at the actual instantiation.
|
|
||||||
//
|
|
||||||
// enable_if_interoperable can be safely used in user code. It falls back to
|
|
||||||
// always enabled for compilers that don't support enable_if or is_convertible.
|
|
||||||
// There is no need for compiler specific workarounds in user code.
|
|
||||||
//
|
|
||||||
// The operators implementation relies on boost::is_convertible not returning
|
|
||||||
// false positives for user/library defined iterator types. See comments
|
|
||||||
// on operator implementation for consequences.
|
|
||||||
//
|
|
||||||
# if defined(BOOST_NO_IS_CONVERTIBLE) || defined(BOOST_NO_SFINAE)
|
|
||||||
|
|
||||||
template <class From, class To>
|
|
||||||
struct enable_if_convertible
|
|
||||||
{
|
|
||||||
typedef boost::iterators::detail::enable_type type;
|
|
||||||
};
|
|
||||||
|
|
||||||
# elif BOOST_WORKAROUND(_MSC_FULL_VER, BOOST_TESTED_AT(13102292))
|
|
||||||
|
|
||||||
// For some reason vc7.1 needs us to "cut off" instantiation
|
|
||||||
// of is_convertible in a few cases.
|
|
||||||
template<typename From, typename To>
|
|
||||||
struct enable_if_convertible
|
|
||||||
: iterators::enable_if<
|
|
||||||
mpl::or_<
|
|
||||||
is_same<From,To>
|
|
||||||
, is_convertible<From, To>
|
|
||||||
>
|
|
||||||
, boost::iterators::detail::enable_type
|
|
||||||
>
|
|
||||||
{};
|
|
||||||
|
|
||||||
# else
|
|
||||||
|
|
||||||
template<typename From, typename To>
|
|
||||||
struct enable_if_convertible
|
|
||||||
: iterators::enable_if<
|
|
||||||
is_convertible<From, To>
|
|
||||||
, boost::iterators::detail::enable_type
|
|
||||||
>
|
|
||||||
{};
|
|
||||||
|
|
||||||
# endif
|
|
||||||
|
|
||||||
//
|
|
||||||
// Default template argument handling for iterator_adaptor
|
|
||||||
//
|
|
||||||
namespace detail
|
|
||||||
{
|
|
||||||
// If T is use_default, return the result of invoking
|
|
||||||
// DefaultNullaryFn, otherwise return T.
|
|
||||||
template <class T, class DefaultNullaryFn>
|
|
||||||
struct ia_dflt_help
|
|
||||||
: mpl::eval_if<
|
|
||||||
is_same<T, use_default>
|
|
||||||
, DefaultNullaryFn
|
|
||||||
, mpl::identity<T>
|
|
||||||
>
|
|
||||||
{
|
|
||||||
};
|
|
||||||
|
|
||||||
// A metafunction which computes an iterator_adaptor's base class,
|
// A metafunction which computes an iterator_adaptor's base class,
|
||||||
// a specialization of iterator_facade.
|
// a specialization of iterator_facade.
|
||||||
template<
|
template<
|
||||||
class Derived
|
typename Derived,
|
||||||
, class Base
|
typename Base,
|
||||||
, class Value
|
typename Value,
|
||||||
, class Traversal
|
typename Traversal,
|
||||||
, class Reference
|
typename Reference,
|
||||||
, class Difference
|
typename Difference
|
||||||
>
|
>
|
||||||
struct iterator_adaptor_base
|
using iterator_adaptor_base_t = iterator_facade<
|
||||||
{
|
Derived,
|
||||||
typedef iterator_facade<
|
|
||||||
Derived
|
|
||||||
|
|
||||||
#ifdef BOOST_ITERATOR_REF_CONSTNESS_KILLS_WRITABILITY
|
#ifdef BOOST_ITERATOR_REF_CONSTNESS_KILLS_WRITABILITY
|
||||||
, typename boost::iterators::detail::ia_dflt_help<
|
detail::eval_if_default_t<
|
||||||
Value
|
Value,
|
||||||
, mpl::eval_if<
|
detail::eval_if_default<
|
||||||
is_same<Reference,use_default>
|
Reference,
|
||||||
, iterator_value<Base>
|
iterator_value< Base >,
|
||||||
, remove_reference<Reference>
|
std::remove_reference< Reference >
|
||||||
>
|
>
|
||||||
>::type
|
>,
|
||||||
#else
|
#else
|
||||||
, typename boost::iterators::detail::ia_dflt_help<
|
detail::eval_if_default_t<
|
||||||
Value, iterator_value<Base>
|
Value,
|
||||||
>::type
|
iterator_value< Base >
|
||||||
|
>,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
, typename boost::iterators::detail::ia_dflt_help<
|
detail::eval_if_default_t<
|
||||||
Traversal
|
Traversal,
|
||||||
, iterator_traversal<Base>
|
iterator_traversal< Base >
|
||||||
>::type
|
>,
|
||||||
|
|
||||||
, typename boost::iterators::detail::ia_dflt_help<
|
detail::eval_if_default_t<
|
||||||
Reference
|
Reference,
|
||||||
, mpl::eval_if<
|
detail::eval_if_default<
|
||||||
is_same<Value,use_default>
|
Value,
|
||||||
, iterator_reference<Base>
|
iterator_reference< Base >,
|
||||||
, add_reference<Value>
|
std::add_lvalue_reference< Value >
|
||||||
>
|
>
|
||||||
>::type
|
>,
|
||||||
|
|
||||||
, typename boost::iterators::detail::ia_dflt_help<
|
detail::eval_if_default_t<
|
||||||
Difference, iterator_difference<Base>
|
Difference,
|
||||||
>::type
|
iterator_difference< Base >
|
||||||
>
|
>
|
||||||
type;
|
>;
|
||||||
};
|
|
||||||
|
|
||||||
// workaround for aC++ CR JAGaf33512
|
} // namespace detail
|
||||||
template <class Tr1, class Tr2>
|
|
||||||
inline void iterator_adaptor_assert_traversal ()
|
|
||||||
{
|
|
||||||
BOOST_STATIC_ASSERT((is_convertible<Tr1, Tr2>::value));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Iterator Adaptor
|
// Iterator Adaptor
|
||||||
@ -222,7 +87,7 @@ namespace iterators {
|
|||||||
// versions of iterator_adaptor The idea is that when the user needs
|
// versions of iterator_adaptor The idea is that when the user needs
|
||||||
// to fiddle with the reference type it is highly likely that the
|
// to fiddle with the reference type it is highly likely that the
|
||||||
// iterator category has to be adjusted as well. Any of the
|
// iterator category has to be adjusted as well. Any of the
|
||||||
// following four template arguments may be ommitted or explicitly
|
// following four template arguments may be omitted or explicitly
|
||||||
// replaced by use_default.
|
// replaced by use_default.
|
||||||
//
|
//
|
||||||
// Value - if supplied, the value_type of the resulting iterator, unless
|
// Value - if supplied, the value_type of the resulting iterator, unless
|
||||||
@ -241,49 +106,46 @@ namespace iterators {
|
|||||||
// supplied, iterator_traits<Base>::difference_type is used.
|
// supplied, iterator_traits<Base>::difference_type is used.
|
||||||
//
|
//
|
||||||
template<
|
template<
|
||||||
class Derived
|
typename Derived,
|
||||||
, class Base
|
typename Base,
|
||||||
, class Value = use_default
|
typename Value = use_default,
|
||||||
, class Traversal = use_default
|
typename Traversal = use_default,
|
||||||
, class Reference = use_default
|
typename Reference = use_default,
|
||||||
, class Difference = use_default
|
typename Difference = use_default
|
||||||
>
|
>
|
||||||
class iterator_adaptor
|
class iterator_adaptor :
|
||||||
: public boost::iterators::detail::iterator_adaptor_base<
|
public detail::iterator_adaptor_base_t<
|
||||||
Derived, Base, Value, Traversal, Reference, Difference
|
Derived, Base, Value, Traversal, Reference, Difference
|
||||||
>::type
|
>
|
||||||
{
|
{
|
||||||
friend class iterator_core_access;
|
friend class iterator_core_access;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
typedef typename boost::iterators::detail::iterator_adaptor_base<
|
using super_t = detail::iterator_adaptor_base_t<
|
||||||
Derived, Base, Value, Traversal, Reference, Difference
|
Derived, Base, Value, Traversal, Reference, Difference
|
||||||
>::type super_t;
|
>;
|
||||||
public:
|
|
||||||
iterator_adaptor() {}
|
|
||||||
|
|
||||||
explicit iterator_adaptor(Base const &iter)
|
public:
|
||||||
: m_iterator(iter)
|
using base_type = Base;
|
||||||
|
|
||||||
|
iterator_adaptor() = default;
|
||||||
|
|
||||||
|
explicit iterator_adaptor(Base const& iter) :
|
||||||
|
m_iterator(iter)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef Base base_type;
|
base_type const& base() const { return m_iterator; }
|
||||||
|
|
||||||
Base const& base() const
|
|
||||||
{ return m_iterator; }
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// for convenience in derived classes
|
// for convenience in derived classes
|
||||||
typedef iterator_adaptor<Derived,Base,Value,Traversal,Reference,Difference> iterator_adaptor_;
|
using iterator_adaptor_ = iterator_adaptor< Derived, Base, Value, Traversal, Reference, Difference >;
|
||||||
|
|
||||||
//
|
//
|
||||||
// lvalue access to the Base object for Derived
|
// lvalue access to the Base object for Derived
|
||||||
//
|
//
|
||||||
Base const& base_reference() const
|
Base& base_reference() { return m_iterator; }
|
||||||
{ return m_iterator; }
|
Base const& base_reference() const { return m_iterator; }
|
||||||
|
|
||||||
Base& base_reference()
|
|
||||||
{ return m_iterator; }
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
//
|
//
|
||||||
@ -292,12 +154,9 @@ namespace iterators {
|
|||||||
// will often result in an error. Derived classes should use
|
// will often result in an error. Derived classes should use
|
||||||
// base_reference(), above, to get direct access to m_iterator.
|
// base_reference(), above, to get direct access to m_iterator.
|
||||||
//
|
//
|
||||||
typename super_t::reference dereference() const
|
typename super_t::reference dereference() const { return *m_iterator; }
|
||||||
{ return *m_iterator; }
|
|
||||||
|
|
||||||
template <
|
template< typename OtherDerived, typename OtherIterator, typename V, typename C, typename R, typename 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
|
||||||
{
|
{
|
||||||
// Maybe readd with same_distance
|
// Maybe readd with same_distance
|
||||||
@ -307,16 +166,12 @@ namespace iterators {
|
|||||||
return m_iterator == x.base();
|
return m_iterator == x.base();
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef typename iterator_category_to_traversal<
|
using my_traversal = typename iterator_category_to_traversal< typename super_t::iterator_category >::type;
|
||||||
typename super_t::iterator_category
|
|
||||||
>::type my_traversal;
|
|
||||||
|
|
||||||
# define BOOST_ITERATOR_ADAPTOR_ASSERT_TRAVERSAL(cat) \
|
|
||||||
boost::iterators::detail::iterator_adaptor_assert_traversal<my_traversal, cat>();
|
|
||||||
|
|
||||||
void advance(typename super_t::difference_type n)
|
void advance(typename super_t::difference_type n)
|
||||||
{
|
{
|
||||||
BOOST_ITERATOR_ADAPTOR_ASSERT_TRAVERSAL(random_access_traversal_tag)
|
static_assert(detail::is_traversal_at_least< my_traversal, random_access_traversal_tag >::value,
|
||||||
|
"Iterator must support random access traversal.");
|
||||||
m_iterator += n;
|
m_iterator += n;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -324,17 +179,16 @@ namespace iterators {
|
|||||||
|
|
||||||
void decrement()
|
void decrement()
|
||||||
{
|
{
|
||||||
BOOST_ITERATOR_ADAPTOR_ASSERT_TRAVERSAL(bidirectional_traversal_tag)
|
static_assert(detail::is_traversal_at_least< my_traversal, bidirectional_traversal_tag >::value,
|
||||||
|
"Iterator must support bidirectional traversal.");
|
||||||
--m_iterator;
|
--m_iterator;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <
|
template< typename OtherDerived, typename OtherIterator, typename V, typename C, typename R, typename D >
|
||||||
class OtherDerived, class OtherIterator, class V, class C, class R, class D
|
typename super_t::difference_type distance_to(iterator_adaptor< OtherDerived, OtherIterator, V, C, R, D > const& y) const
|
||||||
>
|
|
||||||
typename super_t::difference_type distance_to(
|
|
||||||
iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D> const& y) const
|
|
||||||
{
|
{
|
||||||
BOOST_ITERATOR_ADAPTOR_ASSERT_TRAVERSAL(random_access_traversal_tag)
|
static_assert(detail::is_traversal_at_least< my_traversal, random_access_traversal_tag >::value,
|
||||||
|
"Super iterator must support random access traversal.");
|
||||||
// Maybe readd with same_distance
|
// Maybe readd with same_distance
|
||||||
// BOOST_STATIC_ASSERT(
|
// BOOST_STATIC_ASSERT(
|
||||||
// (detail::same_category_and_difference<Derived,OtherDerived>::value)
|
// (detail::same_category_and_difference<Derived,OtherDerived>::value)
|
||||||
@ -342,8 +196,6 @@ namespace iterators {
|
|||||||
return y.base() - m_iterator;
|
return y.base() - m_iterator;
|
||||||
}
|
}
|
||||||
|
|
||||||
# undef BOOST_ITERATOR_ADAPTOR_ASSERT_TRAVERSAL
|
|
||||||
|
|
||||||
private: // data members
|
private: // data members
|
||||||
Base m_iterator;
|
Base m_iterator;
|
||||||
};
|
};
|
||||||
@ -351,7 +203,6 @@ namespace iterators {
|
|||||||
} // namespace iterators
|
} // namespace iterators
|
||||||
|
|
||||||
using iterators::iterator_adaptor;
|
using iterators::iterator_adaptor;
|
||||||
using iterators::enable_if_convertible;
|
|
||||||
|
|
||||||
} // namespace boost
|
} // namespace boost
|
||||||
|
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user