Standard library header <ranges> (C++20)
From cppreference.net
このヘッダは ranges ライブラリの一部です。
名前空間エイリアス
|
namespace
std
{
namespace
views
=
ranges
::
views
;
|
||
名前空間エイリアス
std::views
は、
std::ranges::views
の短縮形として提供されます。
Includes |
|
|
(C++20)
|
三方比較演算子 サポート |
|
(C++11)
|
std::initializer_list クラステンプレート |
| 範囲イテレータ | |
Concepts |
|
Range コンセプト |
|
|
名前空間
std::ranges
で定義
|
|
|
(C++20)
|
型が範囲であること、すなわち
begin
イテレータと
end
センチネルを提供することを指定する
(コンセプト) |
|
(C++20)
|
型が
range
であり、その式から取得したイテレータがダングリングの危険なく安全に返却できることを指定する
(コンセプト) |
|
範囲が定数時間でそのサイズを推定できることを指定する
(concept) |
|
|
(C++20)
|
範囲がそのサイズを定数時間で知ることができることを指定する
(コンセプト) |
|
(C++20)
|
範囲がビューであること、つまり定数時間でのコピー/ムーブ/代入が可能であることを指定する
(コンセプト) |
|
(C++20)
|
イテレータ型が
input_iterator
を満たす範囲を指定する
(コンセプト) |
|
(C++20)
|
イテレータ型が
output_iterator
を満たす範囲を指定する
(コンセプト) |
|
(C++20)
|
前方イテレータを満たすイテレータ型を持つ範囲を指定する
forward_iterator
(コンセプト) |
|
(C++20)
|
双方向イテレータの要件を満たすイテレータ型を持つ範囲を指定する
bidirectional_iterator
(コンセプト) |
|
(C++20)
|
ランダムアクセスイテレータを満たすイテレータ型を持つ範囲を指定する
random_access_iterator
(コンセプト) |
|
(C++20)
|
連続イテレータを満たすイテレータ型を持つ範囲を指定する
contiguous_iterator
(コンセプト) |
|
(C++20)
|
範囲が同一のイテレータ型とセンチネル型を持つことを指定する
(コンセプト) |
|
(C++20)
|
range
が安全に
view
に変換可能であるための要件を指定する
(コンセプト) |
|
(C++23)
|
範囲が読み取り専用の要素を持つことを指定する
(コンセプト) |
関数 |
|
範囲変換 |
|
|
名前空間
std::ranges
で定義
|
|
|
(C++23)
|
入力範囲から新しい非ビューオブジェクトを構築する
(関数テンプレート) |
クラス |
|
範囲プリミティブ |
|
|
名前空間
std::ranges
で定義
|
|
|
(C++20)
(C++23)
(C++20)
(C++23)
|
範囲のイテレータ型とセンチネル型を取得する
(エイリアステンプレート) |
|
(C++20)
(C++20)
(C++20)
|
範囲のサイズ、差分、および値の型を取得する
(エイリアステンプレート) |
|
(C++20)
(C++23)
(C++20)
(C++20)
|
範囲の参照型を取得する
(エイリアステンプレート) |
ビュー |
|
|
名前空間
std::ranges
で定義
|
|
|
(C++20)
|
view
を定義するためのヘルパークラステンプレート、
curiously recurring template pattern
を使用
(クラステンプレート) |
|
(C++20)
|
イテレータとセンチネルのペアを
view
に結合する
(クラステンプレート) |
ダングリングイテレータの取り扱い |
|
|
名前空間
std::ranges
で定義
|
|
|
(C++20)
|
ダングリング状態となるためイテレータまたは
subrange
を返すべきでないことを示すプレースホルダ型
(クラス) |
borrowed_range
のイテレータ型または
subrange
型を取得する
(エイリアステンプレート) |
|
その他のユーティリティ |
|
|
名前空間
std::ranges
で定義
|
|
|
(C++23)
|
範囲を単一の値ではなくシーケンスとして扱うためのタグ
(クラステンプレート) |
ファクトリー |
|
|
名前空間
std::ranges
で定義
|
|
|
(C++20)
|
要素を持たない空の
view
(クラステンプレート) (変数テンプレート) |
指定された値の単一要素を含む
view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
|
|
(C++20)
|
初期値を繰り返しインクリメントして生成されるシーケンスからなる
view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
同じ値を繰り返し生成して作成されるシーケンスからなる
view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
|
関連付けられた入力ストリームに対する
operator>>
の連続的な適用によって得られる要素からなる
view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
|
アダプタ |
|
|
名前空間
std::ranges
で定義
|
|
|
(C++23)
|
レンジアダプタクロージャオブジェクトを定義するためのヘルパーベースクラステンプレート
(クラステンプレート) |
|
(C++20)
|
range
の全要素を含む
view
(エイリアステンプレート) (レンジアダプタオブジェクト) |
|
(C++20)
|
他の
view
の要素を参照する
range
(クラステンプレート) |
|
(C++20)
|
ある
view
を一意所有する
range
(クラステンプレート) |
各要素を右辺値にキャストするシーケンスの
view
(クラステンプレート) (レンジアダプタオブジェクト) |
|
述語を満たす
view
の要素から構成される
range
の
(クラステンプレート) (レンジアダプタオブジェクト) |
|
各要素に関数変換を適用するシーケンスの
view
(クラステンプレート) (レンジアダプタオブジェクト) |
|
|
(C++20)
|
別の
view
の最初のN個の要素からなる
view
(クラステンプレート) (range adaptor object) |
別の
view
の先頭要素から、述語が
false
を返す最初の要素までを含む
view
(クラステンプレート) (レンジアダプタオブジェクト) |
|
|
(C++20)
|
別の
view
の要素からなる
view
。最初のN個の要素をスキップ
(クラステンプレート) (レンジアダプタオブジェクト) |
別の
view
の要素から構成され、述語が
false
を返す最初の要素までの初期部分列をスキップする
view
(クラステンプレート) (レンジアダプタオブジェクト) |
|
|
(C++20)
|
view
の
range
s
からなる
view
を平坦化して得られるシーケンスから構成される
(クラステンプレート) (range adaptor object) |
範囲のビューから得られたシーケンスを平坦化し、要素間にデリミタを挿入して構成される
view
(クラステンプレート) (範囲アダプタオブジェクト) |
|
別の
view
をデリミタを使用して分割して得られる部分範囲に対する
view
(クラステンプレート) (範囲アダプタオブジェクト) |
|
|
(C++20)
|
別の
view
をデリミタを使用して分割して得られる部分範囲に対する
view
(クラステンプレート) (範囲アダプタオブジェクト) |
アダプトされた
view
の連結から成る
view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
|
|
(C++20)
|
イテレータとカウントからサブレンジを作成する
(カスタマイゼーションポイントオブジェクト) |
view
を
common_range
に変換する
(クラステンプレート) (範囲アダプタオブジェクト) |
|
双方向
view
の要素を逆順で反復処理する
view
(クラステンプレート) (range adaptor object) |
|
view
を
constant_range
に変換する
(クラステンプレート) (range adaptor object) |
|
view
から成る
tuple-like
値と数値Nを取り、各タプルのN
th
要素から成る
view
を生成する
(クラステンプレート) (レンジアダプタオブジェクト) |
|
|
(C++20)
|
ペアのような値からなる
view
を受け取り、各ペアの最初の要素からなる
view
を生成する
(クラステンプレート) (レンジアダプタオブジェクト) |
ペアのような値からなる
view
を受け取り、各ペアの2番目の要素からなる
view
を生成する
(クラステンプレート) (レンジアダプタオブジェクト) |
|
適応されたシーケンスの各要素を、要素の位置とその値の両方を含むタプルにマッピングする
view
(クラステンプレート) (レンジアダプタオブジェクト) |
|
|
(C++23)
|
アダプトされたビューの対応する要素への参照のタプルから構成される
view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
アダプトされたビューの対応する要素に変換関数を適用した結果からなる
view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
|
適応された
view
の隣接する要素への参照のタプルから構成される
(クラステンプレート) (レンジアダプタオブジェクト) |
|
適応されたビューの隣接する要素に変換関数を適用した結果からなる
view
(クラステンプレート) (レンジアダプタオブジェクト) |
|
|
(C++23)
|
他の
view
の要素からなる、サイズ
N
の非重複連続チャンクからなる
view
の範囲
(クラステンプレート) (範囲アダプタオブジェクト) |
|
(C++23)
|
M番目の要素が別の
view
のM番目から(M + N - 1)番目の要素を表す
view
(クラステンプレート) (レンジアダプタオブジェクト) |
view
を、与えられた述語が
false
を返す各隣接要素ペアの間で部分範囲に分割する
(クラステンプレート) (レンジアダプタオブジェクト) |
|
別の
view
の要素から構成され、一度にN要素進む
view
(クラステンプレート) (レンジアダプタオブジェクト) |
|
アダプトされたビューのn項デカルト積によって計算された結果のタプルからなる
view
(クラステンプレート) (カスタマイゼーションポイントオブジェクト) |
|
基となるシーケンスの最後にアクセスされた要素をキャッシュする
view
(クラステンプレート) (範囲アダプタオブジェクト) |
|
view
を
input_range
のみで、非
common_range
の範囲に変換する
(クラステンプレート) (範囲アダプタオブジェクト) |
|
カスタマイゼーションポイントオブジェクト |
|
レンジアクセス |
|
|
名前空間
std::ranges
で定義
|
|
|
(C++20)
|
範囲の先頭を指すイテレータを返す
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
範囲の終端を示すセンチネルを返す
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
読み取り専用範囲の先頭を指すイテレータを返す
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
読み取り専用範囲の終端を示すセンチネルを返す
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
範囲への逆方向イテレータを返す
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
範囲の逆方向終端イテレータを返す
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
読み取り専用範囲への逆イテレータを返す
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
読み取り専用範囲の逆方向終端イテレータを返す
(カスタマイゼーションポイントオブジェクト) |
|
(C++26)
|
範囲によって与えられるリザーブヒントと等しい整数を返す
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
範囲のサイズに等しい整数を返す
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
範囲のサイズに等しい符号付き整数を返す
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
範囲が空かどうかをチェックする
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
連続的な範囲の先頭へのポインタを取得する
(カスタマイゼーションポイントオブジェクト) |
|
(C++20)
|
読み取り専用連続範囲の先頭へのポインタを取得する
(カスタマイゼーションポイントオブジェクト) |
列挙型 |
|
|
名前空間
std::ranges
で定義
|
|
|
(C++20)
|
std::ranges::subrange
が
std::ranges::sized_range
をモデル化するかどうかを指定する
(列挙型) |
ヘルパー |
|
|
std::ranges::subrange
のサイズを取得する
(クラステンプレートの特殊化) |
|
|
std::ranges::subrange
のイテレータまたはセンチネルの型を取得する
(クラステンプレートの特殊化) |
|
|
(C++20)
|
std::ranges::subrange
からイテレータまたはセンチネルを取得する
(関数テンプレート) |
|
(C++23)
|
from-range 構築タグ
(タグ) |
概要
// 大部分はフリースタンディング #include <compare> #include <initializer_list> #include <iterator> namespace std::ranges { inline namespace /* 未指定 */ { // 範囲アクセス inline constexpr /* 未指定 */ begin = /* 未指定 */; inline constexpr /* 未指定 */ end = /* 未指定 */; inline constexpr /* 未指定 */ cbegin = /* 未指定 */; inline constexpr /* 未指定 */ cend = /* 未指定 */; inline constexpr /* 未指定 */ rbegin = /* 未指定 */; inline constexpr /* 未指定 */ rend = /* 未指定 */; inline constexpr /* 未指定 */ crbegin = /* 未指定 */; inline constexpr /* 未指定 */ crend = /* 未指定 */; inline constexpr /* 未指定 */ size = /* 未指定 */; inline constexpr /* 未指定 */ reserve_hint = /* 未指定 */; inline constexpr /* 未指定 */ ssize = /* 未指定 */; inline constexpr /* 未指定 */ empty = /* 未指定 */; inline constexpr /* 未指定 */ data = /* 未指定 */; inline constexpr /* 未指定 */ cdata = /* 未指定 */; } // 範囲 template<class T> concept range = /* 説明を参照 */; template<class T> constexpr bool enable_borrowed_range = false; template<class T> concept borrowed_range = /* 説明を参照 */; template<class T> using iterator_t = decltype(ranges::begin(declval<T&>())); template<range R> using sentinel_t = decltype(ranges::end(declval<R&>())); template<range R> using const_iterator_t = decltype(ranges::cbegin(declval<R&>())); template<range R> using const_sentinel_t = decltype(ranges::cend(declval<R&>())); template<range R> using range_difference_t = iter_difference_t<iterator_t<R>>; template<sized_range R> using range_size_t = decltype(ranges::size(declval<R&>())); template<range R> using range_value_t = iter_value_t<iterator_t<R>>; template<range R> using range_reference_t = iter_reference_t<iterator_t<R>>; template<range R> using range_const_reference_t = iter_const_reference_t<iterator_t<R>>; template<range R> using range_rvalue_reference_t = iter_rvalue_reference_t<iterator_t<R>>; template<range R> using range_common_reference_t = iter_common_reference_t<iterator_t<R>>; // サイズ指定された範囲 template<class> constexpr bool disable_sized_range = false; template<class T> concept approximately_sized_range = /* 説明を参照 */; template<class T> concept sized_range = /* 説明を参照 */; // ビュー template<class T> constexpr bool enable_view = /* 説明を参照 */; struct view_base {}; template<class T> concept view = /* 説明を参照 */; // その他の範囲の改良 template<class R, class T> concept output_range = /* 説明を参照 */; template<class T> concept input_range = /* 説明を参照 */; template<class T> concept forward_range = /* 説明を参照 */; template<class T> concept bidirectional_range = /* 説明を参照 */; template<class T> concept random_access_range = /* 説明を参照 */; template<class T> concept contiguous_range = /* 詳細は説明を参照 */; template<class T> concept common_range = /* 詳細は説明を参照 */; template<class T> concept viewable_range = /* 詳細は説明を参照 */; template<class T> concept constant_range = /* 説明を参照 */; // クラステンプレート view_interface template<class D> requires is_class_v<D> && same_as<D, remove_cv_t<D>> class view_interface; // サブレンジ enum class subrange_kind : bool { unsized, sized }; template<input_or_output_iterator I, sentinel_for<I> S = I, subrange_kind K = /* 詳細は説明を参照 */> requires(K == subrange_kind::サイズ指定済み || !sized_sentinel_for<S, I>) class subrange; template<class I, class S, subrange_kind K> constexpr bool enable_borrowed_range<subrange<I, S, K>> = true; template<size_t N, class I, class S, subrange_kind K> requires((N == 0 && copyable<I>) || N == 1) constexpr auto get(const subrange<I, S, K>& r); template<size_t N, class I, class S, subrange_kind K> requires(N < 2) constexpr auto get(subrange<I, S, K>&& r); } namespace std { using ranges::get; } namespace std::ranges { // ダングリングイテレータの処理 struct dangling; // クラステンプレート elements_of template<range R, class Allocator = allocator<byte>> struct elements_of; // ホストされた template<range R> using borrowed_iterator_t = /* 詳細は説明を参照 */; template<range R> using borrowed_subrange_t = /* 説明を参照 */; // 範囲変換 template<class C, input_range R, class... Args> requires(!view<C>) constexpr C to(R&& r, Args&&... args); template<template<class...> class C, input_range R, class... Args> constexpr auto to(R&& r, Args&&... args); template<class C, class... Args> requires(!view<C>) constexpr auto to(Args&&... args); template<template<class...> class C, class... Args> constexpr auto to(Args&&... args); // 空のビュー template<class T> requires is_object_v<T> class empty_view; template<class T> constexpr bool enable_borrowed_range<empty_view<T>> = true; namespace views { template<class T> constexpr empty_view<T> empty{}; } // 単一ビュー template<move_constructible T> requires is_object_v<T> class single_view; namespace views { inline constexpr /* 未指定 */ single = /* 未指定 */; } template<bool Const, class T> using /*maybe-const*/ = conditional_t<Const, const T, T>; // 説明専用 // iota ビュー template<weakly_incrementable W, semiregular Bound = unreachable_sentinel_t> requires /*weakly-equality-comparable-with*/<W, Bound> && copyable<W> class iota_view; template<class W, class Bound> constexpr bool enable_borrowed_range<iota_view<W, Bound>> = true; namespace views { inline constexpr /* 未指定 */ iota = /* 未指定 */; } // 繰り返し表示 template<move_constructible T, semiregular Bound = unreachable_sentinel_t> requires /* 詳細は説明を参照 */ class repeat_view; namespace views { inline constexpr /* 未指定 */ repeat = /* 未指定 */; } // istream ビュー template<movable Val, class CharT, class Traits = char_traits<CharT>> requires /* 説明を参照 */ class basic_istream_view; // ホストされた template<class Val> using istream_view = basic_istream_view<Val, char>; // ホスト環境 template<class Val> using wistream_view = basic_istream_view<Val, wchar_t>; // ホスト環境 namespace views { template<class T> constexpr /* 未指定 */ istream = /* 未指定 */; // ホスト環境 } // レンジアダプタオブジェクト template<class D> requires is_class_v<D> && same_as<D, remove_cv_t<D>> class range_adaptor_closure {}; // 全体表示 namespace views { inline constexpr /* 未指定 */ all = /* 未指定 */; template<viewable_range R> using all_t = decltype(all(declval<R>())); } // ref view template<range R> requires is_object_v<R> class ref_view; template<class T> constexpr bool enable_borrowed_range<ref_view<T>> = true; // owning view template<range R> requires /* 説明を参照 */ class owning_view; template<class T> constexpr bool enable_borrowed_range<owning_view<T>> = enable_borrowed_range<T>; // 右辺値ビューとして template<view V> requires input_range<V> class as_rvalue_view; template<class T> constexpr bool enable_borrowed_range<as_rvalue_view<T>> = enable_borrowed_range<T>; namespace views { inline constexpr /* 未指定 */ as_rvalue = /* 未指定 */; } // フィルタービュー template<input_range V, indirect_unary_predicate<iterator_t<V>> Pred> requires view<V> && is_object_v<Pred> class filter_view; namespace views { inline constexpr /* 未指定 */ filter = /* 未指定 */; } // 変換ビュー template<input_range V, move_constructible F> requires view<V> && is_object_v<F> && regular_invocable<F&, range_reference_t<V>> && /*参照可能*/<invoke_result_t<F&, range_reference_t<V>>> class transform_view; namespace views { inline constexpr /* 未指定 */ transform = /* 未指定 */; } // ビューを取得 template<view> class take_view; template<class T> constexpr bool enable_borrowed_range<take_view<T>> = enable_borrowed_range<T>; namespace views { inline constexpr /* 未指定 */ take = /* 未指定 */; } // take while view template<view V, class Pred> requires input_range<V> && is_object_v<Pred> && indirect_unary_predicate<const Pred, iterator_t<V>> class take_while_view; namespace views { inline constexpr /* 未指定 */ take_while = /* 未指定 */; } // ビューの削除 template<view V> class drop_view; template<class T> constexpr bool enable_borrowed_range<drop_view<T>> = enable_borrowed_range<T>; namespace views { inline constexpr /* 未指定 */ drop = /* 未指定 */; } // drop while view template<view V, class Pred> requires input_range<V> && is_object_v<Pred> && indirect_unary_predicate<const Pred, iterator_t<V>> class drop_while_view; template<class T, class Pred> constexpr bool enable_borrowed_range<drop_while_view<T, Pred>> = enable_borrowed_range<T>; namespace views { inline constexpr /* 未指定 */ drop_while = /* 未指定 */; } // join ビュー template<input_range V> requires view<V> && input_range<range_reference_t<V>> class join_view; namespace views { inline constexpr /* 未指定 */ join = /* 未指定 */; } // ビューでの結合 template<input_range V, forward_range Pattern> requires /* 説明を参照 */ class join_with_view; namespace views { inline constexpr /* 未指定 */ join_with = /* 未指定 */; } // 遅延分割ビュー template<class R> concept /*tiny-range*/ = /* 説明を参照 */; // 説明専用 template<input_range V, forward_range Pattern> requires view<V> && view<Pattern> && indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to> && (forward_range<V> || /*tiny-range*/<Pattern>) class lazy_split_view; // 分割ビュー template<forward_range V, forward_range Pattern> requires view<V> && view<Pattern> && indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to> class split_view; namespace views { inline constexpr /* 未指定 */ lazy_split = /* 未指定 */; inline constexpr /* 未指定 */ split = /* 未指定 */; } // 連結ビュー template<input_range... ビュー> requires /* 詳細は説明を参照 */ class concat_view; namespace views { inline constexpr /* 未指定 */ concat = /* 未指定 */; } // カウント付きビュー namespace views { inline constexpr /* 未指定 */ counted = /* 未指定 */; } // 共通ビュー template<view V> requires(!common_range<V> && copyable<iterator_t<V>>) class common_view; template<class T> constexpr bool enable_borrowed_range<common_view<T>> = enable_borrowed_range<T>; namespace views { inline constexpr /* 未指定 */ common = /* 未指定 */; } // リバースビュー template<view V> requires bidirectional_range<V> class reverse_view; template<class T> constexpr bool enable_borrowed_range<reverse_view<T>> = enable_borrowed_range<T>; namespace views { inline constexpr /* 未指定 */ reverse = /* 未指定 */; } // const ビューとして template<input_range R> constexpr auto& /*possibly-const-range*/(R& r) noexcept { // 説明専用 if constexpr (input_range<const R>) { return const_cast<const R&>(r); } else { return r; } } template<view V> requires input_range<V> class as_const_view; template<class T> constexpr bool enable_borrowed_range<as_const_view<T>> = enable_borrowed_range<T>; namespace views { inline constexpr /* 未指定 */ as_const = /* 未指定 */; } // 要素ビュー template<input_range V, size_t N> requires /* 説明を参照 */ class elements_view; template<class T, size_t N> constexpr bool enable_borrowed_range<elements_view<T, N>> = enable_borrowed_range<T>; template<class R> using keys_view = elements_view<R, 0>; template<class R> using values_view = elements_view<R, 1>; namespace views { template<size_t N> constexpr /* 未指定 */ elements = /* 未指定 */; inline constexpr auto keys = elements<0>; inline constexpr auto values = elements<1>; } // 列挙ビュー template<view V> requires /* 詳細は説明を参照 */ class enumerate_view; template<class View> constexpr bool enable_borrowed_range<enumerate_view<View>> = enable_borrowed_range<View>; namespace views { inline constexpr /* 未指定 */ enumerate = /* 未指定 */; } // zip ビュー template<input_range... ビュー> requires(view<Views> && ...) && (sizeof...(Views) > 0) class zip_view; template<class... ビュー> constexpr bool enable_borrowed_range<zip_view<Views...>> = (enable_borrowed_range<Views> && ...); namespace views { inline constexpr /* 未指定 */ zip = /* 未指定 */; } // zip transform ビュー template<move_constructible F, input_range... ビュー> requires(view<Views> && ...) && (sizeof...(Views) > 0) && is_object_v<F> && regular_invocable<F&, range_reference_t<Views>...> && /*参照可能*/<invoke_result_t<F&, range_reference_t<Views>...>> class zip_transform_view; namespace views { inline constexpr /* 未指定 */ zip_transform = /* 未指定 */; } // 隣接ビュー template<forward_range V, size_t N> requires view<V> && (N > 0) class adjacent_view; template<class V, size_t N> constexpr bool enable_borrowed_range<adjacent_view<V, N>> = enable_borrowed_range<V>; namespace views { template<size_t N> constexpr /* 未指定 */ adjacent = /* 未指定 */; inline constexpr auto pairwise = adjacent<2>; } // 隣接変換ビュー template<forward_range V, move_constructible F, size_t N> requires /* 説明を参照 */ class adjacent_transform_view; namespace views { template<size_t N> constexpr /* 未指定 */ adjacent_transform = /* 未指定 */; inline constexpr auto pairwise_transform = adjacent_transform<2>; } // チャンクビュー template<view V> requires input_range<V> class chunk_view; template<view V> requires forward_range<V> class chunk_view<V>; template<class V> constexpr bool enable_borrowed_range<chunk_view<V>> = forward_range<V> && enable_borrowed_range<V>; namespace views { inline constexpr /* 未指定 */ chunk = /* 未指定 */; } // スライドビュー template<forward_range V> requires view<V> class slide_view; template<class V> constexpr bool enable_borrowed_range<slide_view<V>> = enable_borrowed_range<V>; namespace views { inline constexpr /* 未指定 */ slide = /* 未指定 */; } // ビューによるチャンク template<forward_range V, indirect_binary_predicate<iterator_t<V>, iterator_t<V>> Pred> requires view<V> && is_object_v<Pred> class chunk_by_view; namespace views { inline constexpr /* 未指定 */ chunk_by = /* 未指定 */; } // ストライドビュー template<input_range V> requires view<V> class stride_view; template<class V> constexpr bool enable_borrowed_range<stride_view<V>> = enable_borrowed_range<V>; namespace views { inline constexpr /* 未指定 */ stride = /* 未指定 */; } // 直積ビュー template<input_range First, forward_range... Vs> requires(view<First> && ... && view<Vs>) class cartesian_product_view; namespace views { inline constexpr /* 未指定 */ cartesian_product = /* 未指定 */; } // 最新のビューをキャッシュ template<input_range V> requires view<V> class cache_latest_view; namespace views { inline constexpr /* 未指定 */ cache_latest = /* 未指定 */; } // 入力ビューへ template<input_range V> requires view<V> class to_input_view; template<class V> constexpr bool enable_borrowed_range<to_input_view<V>> = enable_borrowed_range<V>; namespace views { inline constexpr /* 未指定 */ to_input = /* 未指定 */; } } namespace std { namespace views = ranges::ビュー; template<class T> struct tuple_size; template<size_t I, class T> struct tuple_element; template<class I, class S, ranges::subrange_kind K> struct tuple_size<ranges::subrange<I, S, K>> : integral_constant<size_t, 2> {}; template<class I, class S, ranges::subrange_kind K> struct tuple_element<0, ranges::subrange (注:指定された条件により、HTMLタグ・属性は保持され、C++固有用語(ranges::subrange)は翻訳対象外のため、元のテキストをそのまま保持しています)<I, S, K>> { using type = I; }; template<class I, class S, ranges::subrange_kind K> struct tuple_element<1, ranges::subrange<I, S, K>> { using type = S; }; template<class I, class S, ranges::subrange_kind K> struct tuple_element<0, const ranges::subrange<I, S, K>> { using type = I; }; template<class I, class S, ranges::subrange_kind K> struct tuple_element<1, const ranges::subrange<I, S, K>> { using type = S; }; struct from_range_t { explicit from_range_t() = default; }; inline constexpr from_range_t from_range{}; }
Concept
range
namespace std::ranges { template<class T> concept range = requires(T& t) { ranges::begin(t); // 場合によって等価性を保持する(説明を参照) ranges::end(t); }; }
コンセプト
borrowed_range
namespace std::ranges { template<class T> concept borrowed_range = range<T> && (is_lvalue_reference_v<T> || enable_borrowed_range<remove_cvref_t<T>>); }
コンセプト
approximately_sized_range
namespace std::ranges { template<class T> concept approximately_sized_range = range<T> && requires(T& t) { ranges::reserve_hint(t); }; }
コンセプト
sized_range
namespace std::ranges { template<class T> concept sized_range = approximately_sized_range<T> && requires(T& t) { ranges::size(t); }; }
コンセプト
view
namespace std::ranges { template<class T> constexpr bool /*is-derived-from-view-interface*/ = /* 説明を参照 */; // 説明専用 template<class T> constexpr bool enable_view = derived_from<T, view_base> || /*is-derived-from-view-interface*/<T>; template<class T> concept view = range<T> && movable<T> && enable_view<T>; }
コンセプト
output_range
namespace std::ranges { template<class R, class T> concept output_range = range<R> && output_iterator<iterator_t<R>, T>; }
コンセプト
input_range
namespace std::ranges { template<class T> concept input_range = range<T> && input_iterator<iterator_t<T>>; }
コンセプト
forward_range
namespace std::ranges { template<class T> concept forward_range = input_range<T> && forward_iterator<iterator_t<T>>; }
コンセプト
bidirectional_range
namespace std::ranges { template<class T> concept bidirectional_range = forward_range<T> && bidirectional_iterator<iterator_t<T>>; }
コンセプト
random_access_range
namespace std::ranges { template<class T> concept random_access_range = bidirectional_range<T> && random_access_iterator<iterator_t<T>>; }
コンセプト
contiguous_range
namespace std::ranges { template<class T> concept contiguous_range = random_access_range<T> && contiguous_iterator<iterator_t<T>> && requires(T& t) { { ranges::data(t) } -> same_as<add_pointer_t<range_reference_t<T>>>; }; }
コンセプト
common_range
namespace std::ranges { template<class T> concept common_range = range<T> && same_as<iterator_t<T>, sentinel_t<T>>; }
Concept
viewable_range
namespace std::ranges { template<class T> concept viewable_range = range<T> && ((view<remove_cvref_t<T>> && constructible_from<remove_cvref_t<T>, T>) || (!view<remove_cvref_t<T>> && (is_lvalue_reference_v<T> || (movable<remove_reference_t<T>> && !/*is-initializer-list*/<T>)))); }
コンセプト
constant_range
namespace std::ranges { template<class T> concept constant_range = input_range<T> && /*constant-iterator*/<iterator_t<T>>; }
ヘルパー概念
注記: このセクションの概念は説明のみを目的としており、インターフェースの一部ではありません。
namespace std::ranges { // 未規定、名前探索のみのため template<class R> concept /*simple-view*/ = // 説明専用 view<R> && range<const R> && same_as<iterator_t<R>, iterator_t<const R>> && same_as<sentinel_t<R>, sentinel_t<const R>>; template<class I> concept /*has-arrow*/ = // 説明専用 input_iterator<I> && (is_pointer_v<I> || requires(const I i) { i.operator->(); }); template<class T, class U> concept /*different-from*/ = // 説明専用 !same_as<remove_cvref_t<T>, remove_cvref_t<U>>; template<class R> concept /*range-with-movable-references*/ = // 説明専用 input_range<R> && move_constructible<range_reference_t<R>> && move_constructible<range_rvalue_reference_t<R>>; template<class R> constexpr bool /*is-initializer-list*/ = /* 説明を参照 */; // 説明専用 template<class T> constexpr auto /*as-const-pointer*/(const T* p) noexcept { return p; } // 説明専用 }
クラステンプレート std::ranges::view_interface
namespace std::ranges { template<class D> requires is_class_v<D> && same_as<D, remove_cv_t<D>> class view_interface { private: constexpr D& /*派生*/() noexcept { // 説明専用 return static_cast<D&>(*this); } constexpr const D& /*派生*/() const noexcept { // 説明専用 return static_cast<const D&>(*this); } public: constexpr bool empty() requires sized_range<D> || forward_range<D> { if constexpr (sized_range<D>) return ranges::size(/*派生*/()) == 0; else return ranges::begin(/*派生*/()) == ranges::end(/*派生*/()); } constexpr bool empty() const requires sized_range<const D> || forward_range<const D> { if constexpr (sized_range<const D>) return ranges::size(/*派生*/()) == 0; else return ranges::begin(/*派生*/()) == ranges::end(/*派生*/()); } constexpr auto cbegin() requires input_range<D> { return ranges::cbegin(/*派生*/()); } constexpr auto cbegin() const requires input_range<const D> { return ranges::cbegin(/*派生*/()); } constexpr auto cend() requires input_range<D> { return ranges::cend(/*派生*/()); } constexpr auto cend() const requires input_range<const D> { return ranges::cend(/*派生*/()); } constexpr explicit operator bool() requires requires { ranges::empty(/*派生*/()); } { return !ranges::empty(/*派生*/()); } constexpr explicit operator bool() const requires requires { ranges::empty(/*派生*/()); } { return !ranges::empty(/*派生*/()); } constexpr auto data() requires contiguous_iterator<iterator_t<D>> { return to_address(ranges::begin(/*派生*/())); } constexpr auto data() const requires range<const D> && contiguous_iterator<iterator_t<const D>> { return to_address(ranges::begin(/*派生*/())); } constexpr auto size() requires forward_range<D> && sized_sentinel_for<sentinel_t<D>, iterator_t<D>> { return /*to-unsigned-like*/(ranges::end(/*派生*/()) - ranges::begin(/*派生*/())); } constexpr auto size() const requires forward_range<const D> && sized_sentinel_for<sentinel_t<const D>, iterator_t<const D>> { return /*to-unsigned-like*/(ranges::end(/*派生*/()) - ranges::begin(/*派生*/())); } constexpr decltype(auto) front() requires forward_range<D>; constexpr decltype(auto) front() const requires forward_range<const D>; constexpr decltype(auto) back() requires bidirectional_range<D> && common_range<D>; constexpr decltype(auto) back() const requires bidirectional_range<const D> && common_range<const D>; template<random_access_range R = D> constexpr decltype(auto) operator[](range_difference_t<R> n) { return ranges::begin(/*派生*/())[n]; } template<random_access_range R = const D> constexpr decltype(auto) operator[](range_difference_t<R> n) const { return ranges::begin(/*派生*/())[n] (注:元のテキストは閉じ括弧のみのため、日本語でも同じ記号を保持します); } }; }
クラステンプレート std::ranges::subrange
namespace std::ranges { template<class From, class To> concept /*非修飾ポインタ変換を使用*/ = // 説明専用 is_pointer_v<From> && is_pointer_v<To> && !convertible_to<remove_pointer_t<From> (*)[], remove_pointer_t<To> (*)[]>; template<class From, class To> concept /*非スライシング変換可能*/ = // 説明専用 convertible_to<From, To> && !/*非修飾ポインタ変換を使用*/<decay_t<From>, decay_t<To>>; template<class T, class U, class V> concept /*pair-like-convertible-from*/ = // 説明専用 !range<T> && !is_reference_v<T> && /*pair-like*/<T> && constructible_from<T, U, V> && /*非スライシング変換可能*/<U, tuple_element_t<0, T>> && convertible_to<V, tuple_element_t<1, T>>; template<input_or_output_iterator I, sentinel_for<I> S = I, subrange_kind K = sized_sentinel_for<S, I> ? subrange_kind::sized : subrange_kind::unsized> requires(K == subrange_kind::sized || !sized_sentinel_for<S, I>) class subrange : public view_interface<subrange<I, S, K>> { private: static constexpr bool /*StoreSize*/ = // 説明専用 K == subrange_kind::sized && !sized_sentinel_for<S, I>; I /*開始_*/ = I(); // 説明専用 S /*end_*/ = S(); // 説明専用 /*make-unsigned-like-t*/<iter_difference_t<I>> /*size_*/ = 0; // 説明専用 表示のみ // StoreSizeがtrueの場合 public: subrange() requires default_initializable<I> = default; constexpr subrange(/*非スライシング変換可能*/<I> auto i, S s) requires(!/*StoreSize*/); constexpr subrange(/*非スライシング変換可能*/<I> auto i, S s, /*make-unsigned-like-t*/<iter_difference_t<I>> n) requires(K == subrange_kind::sized); template</*異なる*/<subrange> R> requires borrowed_range<R> && /*非スライシング変換可能*/<iterator_t<R>, I> && convertible_to<sentinel_t<R>, S> constexpr subrange(R&& r) requires(!/*StoreSize*/ || sized_range<R>); template<borrowed_range R> requires /*非スライシング変換可能*/<iterator_t<R>, I> && convertible_to<sentinel_t<R>, S> constexpr subrange(R&& r, /*make-unsigned-like-t*/<iter_difference_t<I>> n) requires(K == subrange_kind::sized) : subrange{ ranges::begin(r), ranges::end(r), n } { } template</*異なる*/<subrange> PairLike> requires /*pair-like-convertible-from*/<PairLike, const I&, const S&> constexpr operator PairLike() const; constexpr I begin() const requires copyable<I>; constexpr I begin() requires(!copyable<I>); constexpr S end() const; constexpr bool empty() const; constexpr /*make-unsigned-like-t*/<iter_difference_t<I>> size() const requires(K == subrange_kind::sized); constexpr subrange next(iter_difference_t<I> n = 1) const& requires forward_iterator<I>; constexpr subrange next(iter_difference_t<I> n = 1) &&; constexpr subrange prev(iter_difference_t<I> n = 1) const requires bidirectional_iterator<I>; constexpr subrange& advance(iter_difference_t<I> n); }; template<input_or_output_iterator I, sentinel_for<I> S> subrange(I, S) -> subrange<I, S>; template<input_or_output_iterator I, sentinel_for<I> S> subrange(I, S, /*make-unsigned-like-t*/<iter_difference_t<I>>) -> subrange<I, S, subrange_kind::sized>; template<borrowed_range R> subrange(R&&) -> subrange<iterator_t<R>, sentinel_t<R>, (sized_range<R> || sized_sentinel_for<sentinel_t<R>, iterator_t<R>>) ? subrange_kind::sized : subrange_kind::unsized>; template<borrowed_range R> subrange(R&&, /*make-unsigned-like-t*/<range_difference_t<R>>) -> subrange<iterator_t<R>, sentinel_t<R>, subrange_kind::sized>; }
クラス std::ranges::dangling
namespace std::ranges { struct dangling { constexpr dangling() noexcept = default; constexpr dangling(auto&&...) noexcept {} }; }
クラス std::ranges::elements_of
namespace std::ranges { template<range R, class Allocator = allocator<byte>> struct elements_of { [[no_unique_address]] R range; [[no_unique_address]] Allocator allocator = Allocator(); }; template<class R, class Allocator = allocator<byte>> elements_of(R&&, Allocator = Allocator()) -> elements_of<R&&, Allocator>; }
クラステンプレート std::ranges::empty_view
namespace std::ranges { template<class T> requires is_object_v<T> class empty_view : public view_interface<empty_view<T>> { public: static constexpr T* begin() noexcept { return nullptr; } static constexpr T* end() noexcept { return nullptr; } static constexpr T* data() noexcept { return nullptr; } static constexpr size_t size() noexcept { return 0; } static constexpr bool empty() noexcept { return true; } }; }
クラステンプレート std::ranges::single_view
namespace std::ranges { template<move_constructible T> requires is_object_v<T> class single_view : public view_interface<single_view<T>> { private: /*movable-box*/<T> /*value_*/; // 説明専用 public: single_view() requires default_initializable<T> = default; constexpr explicit single_view(const T& t) requires copy_constructible<T>; constexpr explicit single_view(T&& t); template<class... Args> requires constructible_from<T, Args...> constexpr explicit single_view(in_place_t, Args&&... args); constexpr T* begin() noexcept; constexpr const T* begin() const noexcept; constexpr T* end() noexcept; constexpr const T* end() const noexcept; static constexpr bool empty() noexcept; static constexpr size_t size() noexcept; constexpr T* data() noexcept; constexpr const T* data() const noexcept; }; template<class T> single_view(T) -> single_view<T>; }
クラステンプレート std::ranges::iota_view
namespace std::ranges { template<class I> concept /*decrementable*/ = /* 説明を参照 */; // 説明専用 template<class I> concept /*advanceable*/ = /* 説明を参照 */; // 説明専用 template<weakly_incrementable W, semiregular Bound = unreachable_sentinel_t> requires /*weakly-equality-comparable-with*/<W, Bound> && copyable<W> class iota_view : public view_interface<iota_view<W, Bound>> { private: // クラス iota_view::iterator struct /*iterator*/; // 説明専用 // クラス iota_view::sentinel struct /*sentinel*/; // 説明専用 W /*value_*/ = W(); // 説明専用 Bound /*bound_*/ = Bound(); // 説明専用 public: iota_view() requires default_initializable<W> = default; constexpr explicit iota_view(W value); constexpr explicit iota_view(type_identity_t<W> value, type_identity_t<Bound> bound); constexpr explicit iota_view(/*iterator*/ first, /* 説明を参照 */ last); constexpr /*iterator*/ begin() const; constexpr auto end() const; constexpr /*iterator*/ end() const requires same_as<W, Bound>; constexpr bool empty() const; constexpr auto size() const requires /* 説明を参照 */; }; template<class W, class Bound> requires(!/*is-integer-like*/<W> || !/*is-integer-like*/<Bound> || (/*is-signed-integer-like*/<W> == /*is-signed-integer-like*/<Bound>)) iota_view(W, Bound) -> iota_view<W, Bound>; }
クラステンプレート std::ranges::iota_view::iterator
namespace std::ranges { template<weakly_incrementable W, semiregular Bound> requires /*weakly-equality-comparable-with*/<W, Bound> && copyable<W> struct iota_view<W, Bound>::/*iterator*/ { private: W /*value_*/ = W(); // 説明専用 public: using iterator_concept = /* 説明を参照 */; using iterator_category = input_iterator_tag; // Wがincrementableをモデルし、かつ // IOTA-DIFF-T(W)が整数型である場合にのみ存在 using value_type = W; using difference_type = /*IOTA-DIFF-T*/(W); /*iterator*/() requires default_initializable<W> = default; constexpr explicit /*iterator*/(W value); constexpr W operator*() const noexcept(is_nothrow_copy_constructible_v<W>); constexpr /*iterator*/& operator++(); constexpr void operator++(int); constexpr /*iterator*/ operator++(int) requires incrementable<W>; constexpr /*iterator*/& operator--() requires /*decrementable*/<W>; constexpr /*iterator*/ operator--(int) requires /*decrementable*/<W>; constexpr /*iterator*/& operator+=(difference_type n) requires /*advanceable*/<W>; constexpr /*iterator*/& operator-=(difference_type n) requires /*advanceable*/<W>; constexpr W operator[](difference_type n) const requires /*advanceable*/<W>; friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y) requires equality_comparable<W>; friend constexpr bool operator<(const /*iterator*/& x, const /*iterator*/& y) requires totally_ordered<W>; friend constexpr bool operator>(const /*iterator*/& x, const /*iterator*/& y) requires totally_ordered<W>; friend constexpr bool operator<=(const /*iterator*/& x, const /*iterator*/& y) requires totally_ordered<W>; friend constexpr bool operator>=(const /*iterator*/& x, const /*iterator*/& y) requires totally_ordered<W>; friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y) requires totally_ordered<W> && three_way_comparable<W>; friend constexpr /*iterator*/ operator+(/*iterator*/ i, difference_type n) requires /*advanceable*/<W>; friend constexpr /*iterator*/ operator+(difference_type n, /*iterator*/ i) requires /*advanceable*/<W>; friend constexpr /*iterator*/ operator-(/*iterator*/ i, difference_type n) requires /*advanceable*/<W>; friend constexpr difference_type operator-(const /*iterator*/& x, const /*iterator*/& y) requires /*advanceable*/<W>; }; }
クラステンプレート std::ranges::iota_view::sentinel
namespace std::ranges { template<weakly_incrementable W, semiregular Bound> requires /*weakly-equality-comparable-with*/<W, Bound> && copyable<W> struct iota_view<W, Bound>::/*sentinel*/ { private: Bound /*bound_*/ = Bound(); // 説明専用 public: /*sentinel*/() = default; constexpr explicit /*sentinel*/(Bound bound); friend constexpr bool operator==(const /*iterator*/& x, const /*sentinel*/& y); friend constexpr iter_difference_t<W> operator-(const /*iterator*/& x, const /*sentinel*/& y) requires sized_sentinel_for<Bound, W>; friend constexpr iter_difference_t<W> operator-(const /*sentinel*/& x, const /*iterator*/& y) requires sized_sentinel_for<Bound, W>; }; }
クラステンプレート std::ranges::repeat_view
namespace std::ranges { template<class T> concept /*integer-like-with-usable-difference-type*/ = // 説明専用 /*is-signed-integer-like*/<T> || (/*is-integer-like*/<T> && weakly_incrementable<T>); template<move_constructible T, semiregular Bound = unreachable_sentinel_t> requires(is_object_v<T> && same_as<T, remove_cv_t<T>> && (/*integer-like-with-usable-difference-type*/<Bound> || same_as<Bound, unreachable_sentinel_t>)) class repeat_view : public view_interface<repeat_view<T, Bound>> { private: // repeat_view::iteratorクラス struct /*iterator*/; // 説明専用 /*movable-box*/<T> /*value_*/; // 説明専用 Bound /*bound_*/ = Bound(); // 説明専用 public: repeat_view() requires default_initializable<T> = default; constexpr explicit repeat_view(const T& value, Bound bound = Bound()) requires copy_constructible<T>; constexpr explicit repeat_view(T&& value, Bound bound = Bound()); template<class... TArgs, class... BoundArgs> requires constructible_from<T, TArgs...> && constructible_from<Bound, BoundArgs...> constexpr explicit repeat_view(piecewise_construct_t, tuple<TArgs...> value_args, tuple<BoundArgs...> bound_args = tuple<>{}); constexpr /*iterator*/ begin() const; constexpr /*iterator*/ end() const requires(!same_as<Bound, unreachable_sentinel_t>); constexpr unreachable_sentinel_t end() const noexcept; constexpr auto size() const requires(!same_as<Bound, unreachable_sentinel_t>); }; template<class T, class Bound = unreachable_sentinel_t> repeat_view(T, Bound = Bound()) -> repeat_view<T, Bound>; }
クラステンプレート std::ranges::repeat_view::iterator
namespace std::ranges { template<move_constructible T, semiregular Bound> requires(is_object_v<T> && same_as<T, remove_cv_t<T>> && (/*integer-like-with-usable-difference-type*/<Bound> || same_as<Bound, unreachable_sentinel_t>)) class repeat_view<T, Bound>::/*iterator*/ { private: using /*index-type*/ = // 説明専用 conditional_t<same_as<Bound, unreachable_sentinel_t>, ptrdiff_t, Bound>; const T* /*value_*/ = nullptr; // 説明専用 /*index-type*/ /*current_*/ = /*index-type*/(); // 説明専用 constexpr explicit /*iterator*/( const T* value, /*index-type*/ b = /*index-type*/()); // 説明専用 public: using iterator_concept = random_access_iterator_tag; using iterator_category = random_access_iterator_tag; using value_type = T; using difference_type = /* 説明を参照 */; /*iterator*/() = default; constexpr const T& operator*() const noexcept; constexpr /*iterator*/& operator++(); constexpr /*iterator*/ operator++(int); constexpr /*iterator*/& operator--(); constexpr /*iterator*/ operator--(int); constexpr /*iterator*/& operator+=(difference_type n); constexpr /*iterator*/& operator-=(difference_type n); constexpr const T& operator[](difference_type n) const noexcept; friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y); friend constexpr auto operator<=>(const /*iterator*/& x, const /*iterator*/& y); friend constexpr /*iterator*/ operator+(/*iterator*/ i, difference_type n); friend constexpr /*iterator*/ operator+(difference_type n, /*iterator*/ i); friend constexpr /*iterator*/ operator-(/*iterator*/ i, difference_type n); friend constexpr difference_type operator-(const /*iterator*/& x, const /*iterator*/& y); }; }
クラステンプレート std::ranges::basic_istream_view
namespace std::ranges { template<class Val, class CharT, class Traits> concept /*stream-extractable*/ = // 説明専用 requires(basic_istream<CharT, Traits>& is, Val& t) { is >> t; }; template<movable Val, class CharT, class Traits = char_traits<CharT>> requires default_initializable<Val> && /*stream-extractable*/<Val, CharT, Traits> class basic_istream_view : public view_interface<basic_istream_view<Val, CharT, Traits>> { public: constexpr explicit basic_istream_view(basic_istream<CharT, Traits>& stream); constexpr auto begin() { */*stream_*/ >> /*value_*/; return /*iterator*/{ *this }; } constexpr default_sentinel_t end() const noexcept; private: // クラス basic_istream_view::iterator struct /*iterator*/; // 説明専用 basic_istream<CharT, Traits>* /*stream_*/; // 説明専用 Val /*value_*/ = Val(); // 説明専用 }; }
クラステンプレート std::ranges::basic_istream_view::iterator
namespace std::ranges { template<movable Val, class CharT, class Traits> requires default_initializable<Val> && /*stream-extractable*/<Val, CharT, Traits> class basic_istream_view<Val, CharT, Traits>::/*iterator*/ { public: using iterator_concept = input_iterator_tag; using difference_type = ptrdiff_t; using value_type = Val; constexpr explicit /*iterator*/(basic_istream_view& parent) noexcept; /*iterator*/(const /*iterator*/&) = delete; /*iterator*/(/*iterator*/&&) = default; /*iterator*/& operator=(const /*iterator*/&) = delete; /*iterator*/& operator=(/*iterator*/&&) = default; /*iterator*/& operator++(); void operator++(int); Val& operator*() const; friend bool operator==(const /*iterator*/& x, default_sentinel_t); private: basic_istream_view* /*parent_*/; // 説明専用 }; }
クラステンプレート std::ranges::ref_view
namespace std::ranges { template<range R> requires is_object_v<R> class ref_view : public view_interface<ref_view<R>> { private: R* /*r_*/; // 説明専用 public: template</*different-from*/<ref_view> T> requires /* 説明を参照 */ constexpr ref_view(T&& t); constexpr R& base() const { return */*r_*/; } constexpr iterator_t<R> begin() const { return ranges::begin(*/*r_*/); } constexpr sentinel_t<R> end() const { return ranges::end(*/*r_*/); } constexpr bool empty() const requires requires { ranges::empty(*/*r_*/); } { return ranges::empty(*/*r_*/); } constexpr auto size() const requires sized_range<R> { return ranges::size(*/*r_*/); } constexpr auto reserve_hint() const requires approximately_sized_range<R> { return ranges::reserve_hint(*/*r_*/); } constexpr auto data() const requires contiguous_range<R> { return ranges::data(*/*r_*/); } }; template<class R> ref_view(R&) -> ref_view<R>; }
クラステンプレート std::ranges::owning_view
namespace std::ranges { template<range R> requires movable<R> && (!/*is-initializer-list*/<R>) class owning_view : public view_interface<owning_view<R>> { private: R /*r_*/ = R(); // 説明専用 public: owning_view() requires default_initializable<R> = default; constexpr owning_view(R&& t); owning_view(owning_view&&) = default; owning_view& operator=(owning_view&&) = default; constexpr R& base() & noexcept { return /*r_*/; } constexpr const R& base() const& noexcept { return /*r_*/; } constexpr R&& base() && noexcept { return std::move(/*r_*/); } constexpr const R&& base() const&& noexcept { return std::move(/*r_*/); } constexpr iterator_t<R> begin() { return ranges::begin(/*r_*/); } constexpr sentinel_t<R> end() { return ranges::end(/*r_*/); } constexpr auto begin() const requires range<const R> { return ranges::begin(/*r_*/); } constexpr auto end() const requires range<const R> { return ranges::end(/*r_*/); } constexpr bool empty() requires requires { ranges::empty(/*r_*/); } { return ranges::empty(/*r_*/); } constexpr bool empty() const requires requires { ranges::empty(/*r_*/); } { return ranges::empty(/*r_*/); } constexpr auto size() requires sized_range<R> { return ranges::size(/*r_*/); } constexpr auto size() const requires sized_range<const R> { return ranges::size(/*r_*/); } constexpr auto reserve_hint() requires approximately_sized_range<R> { return ranges::reserve_hint(/*r_*/); } constexpr auto reserve_hint() const requires approximately_sized_range<const R> { return ranges::reserve_hint(/*r_*/); } constexpr auto data() requires contiguous_range<R> { return ranges::data(/*r_*/); } constexpr auto data() const requires contiguous_range<const R> { return ranges::data(/*r_*/); } }; }
クラステンプレート std::ranges::as_rvalue_view
namespace std::ranges { template<view V> requires input_range<V> class as_rvalue_view : public view_interface<as_rvalue_view<V>> { V /*base_*/ = V(); // 説明専用 public: as_rvalue_view() requires default_initializable<V> = default; constexpr explicit as_rvalue_view(V base); constexpr V base() const& requires copy_constructible<V> { return /*base_*/; } constexpr V base() && { return std::move(/*base_*/); } constexpr auto begin() requires(!/*simple-view*/<V>) { return move_iterator(ranges::begin(/*base_*/)); } constexpr auto begin() const requires range<const V> { return move_iterator(ranges::begin(/*base_*/)); } constexpr auto end() requires(!/*simple-view*/<V>) { if constexpr (common_range<V>) { return move_iterator(ranges::end(/*base_*/)); } else { return move_sentinel(ranges::end(/*base_*/)); } } constexpr auto end() const requires range<const V> { if constexpr (common_range<const V>) { return move_iterator(ranges::end(/*base_*/)); } else { return move_sentinel(ranges::end(/*base_*/)); } } constexpr auto size() requires sized_range<V> { return ranges::size(/*base_*/); } constexpr auto size() const requires sized_range<const V> { return ranges::size(/*base_*/); } constexpr auto reserve_hint() requires approximately_sized_range<V> { return ranges::reserve_hint(/*base_*/); } constexpr auto reserve_hint() const requires approximately_sized_range<const V> { return ranges::reserve_hint(/*base_*/); } }; template<class R> as_rvalue_view(R&&) -> as_rvalue_view<views::all_t<R>>; }
クラステンプレート std::ranges::filter_view
namespace std::ranges { template<input_range V, indirect_unary_predicate<iterator_t<V>> Pred> requires view<V> && is_object_v<Pred> class filter_view : public view_interface<filter_view<V, Pred>> { private: V /*base_*/ = V(); // 説明専用 /*movable-box*/<Pred> /*pred_*/; // 説明専用 // filter_view::iterator クラス class /*iterator*/; // 説明専用 // filter_view::sentinel クラス class /*sentinel*/; // 説明専用 public: filter_view() requires default_initializable<V> && default_initializable<Pred> = default; constexpr explicit filter_view(V base, Pred pred); constexpr V base() const& requires copy_constructible<V> { return /*base_*/; } constexpr V base() && { return std::move(/*base_*/); } constexpr const Pred& pred() const; constexpr /*iterator*/ begin(); constexpr auto end() { if constexpr (common_range<V>) return /*iterator*/{ *this, ranges::end(/*base_*/) }; else return /*sentinel*/{ *this }; } }; template<class R, class Pred> filter_view(R&&, Pred) -> filter_view<views::all_t<R>, Pred>; }
クラステンプレート std::ranges::filter_view::iterator
namespace std::ranges { template<input_range V, indirect_unary_predicate<iterator_t<V>> Pred> requires view<V> && is_object_v<Pred> class filter_view<V, Pred>::/*iterator*/ { private: iterator_t<V> /*current_*/ = iterator_t<V>(); // 説明専用 filter_view* /*parent_*/ = nullptr; // 説明専用 public: using iterator_concept = /* 説明を参照 */; using iterator_category = /* 説明を参照 */; // 常に存在するわけではない using value_type = range_value_t<V>; using difference_type = range_difference_t<V>; /*iterator*/() requires default_initializable<iterator_t<V>> = default; constexpr /*iterator*/(filter_view& parent, iterator_t<V> current); constexpr const iterator_t<V>& base() const& noexcept; constexpr iterator_t<V> base() &&; constexpr range_reference_t<V> operator*() const; constexpr iterator_t<V> operator->() const requires /*has-arrow*/<iterator_t<V>> && copyable<iterator_t<V>>; constexpr /*iterator*/& operator++(); constexpr void operator++(int); constexpr /*iterator*/ operator++(int) requires forward_range<V>; constexpr /*iterator*/& operator--() requires bidirectional_range<V>; constexpr /*iterator*/ operator--(int) requires bidirectional_range<V>; friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y) requires equality_comparable<iterator_t<V>>; friend constexpr range_rvalue_reference_t<V> iter_move( const /*iterator*/& i) noexcept(noexcept(ranges::iter_move(i./*current_*/))); friend constexpr void iter_swap( const /*iterator*/& x, const /*iterator*/& y) noexcept(noexcept(ranges::iter_swap(x./*current_*/, y./*current_*/))) requires indirectly_swappable<iterator_t<V>>; }; }
クラステンプレート std::ranges::filter_view::sentinel
namespace std::ranges { template<input_range V, indirect_unary_predicate<iterator_t<V>> Pred> requires view<V> && is_object_v<Pred> class filter_view<V, Pred>::/*sentinel*/ { private: sentinel_t<V> /*end_*/ = sentinel_t<V>(); // 説明専用 public: /*sentinel*/() = default; constexpr explicit /*sentinel*/(filter_view& parent); constexpr sentinel_t<V> base() const; friend constexpr bool operator==(const /*iterator*/& x, const /*sentinel*/& y); }; }
クラステンプレート std::ranges::transform_view
namespace std::ranges { template<input_range V, move_constructible F> requires view<V> && is_object_v<F> && regular_invocable<F&, range_reference_t<V>> && /*can-reference*/<invoke_result_t<F&, range_reference_t<V>>> class transform_view : public view_interface<transform_view<V, F>> { private: // クラステンプレート transform_view::iterator template<bool> struct /*iterator*/; // 説明専用 // クラステンプレート transform_view::sentinel template<bool> struct /*sentinel*/; // 説明専用 V /*base_*/ = V(); // 説明専用 /*movable-box*/<F> /*fun_*/; // 説明専用 public: transform_view() requires default_initializable<V> && default_initializable<F> = default; constexpr explicit transform_view(V base, F fun); constexpr V base() const& requires copy_constructible<V> { return /*base_*/; } constexpr V base() && { return std::move(/*base_*/); } constexpr /*iterator*/<false> begin(); constexpr /*iterator*/<true> begin() const requires range<const V> && regular_invocable<const F&, range_reference_t<const V>>; constexpr /*sentinel*/<false> end(); constexpr /*iterator*/<false> end() requires common_range<V>; constexpr /*sentinel*/<true> end() const requires range<const V> && regular_invocable<const F&, range_reference_t<const V>>; constexpr /*iterator*/<true> end() const requires common_range<const V> && regular_invocable<const F&, range_reference_t<const V>>; constexpr auto size() requires sized_range<V> { return ranges::size(/*base_*/); } constexpr auto size() const requires sized_range<const V> { return ranges::size(/*base_*/); } constexpr auto reserve_hint() requires approximately_sized_range<V> { return ranges::reserve_hint(/*base_*/); } constexpr auto reserve_hint() const requires approximately_sized_range<const V> { return ranges::reserve_hint(/*base_*/); } }; template<class R, class F> transform_view(R&&, F) -> transform_view<views::all_t<R>, F>; }
クラステンプレート std::ranges::transform_view::iterator
namespace std::ranges { template<input_range V, move_constructible F> requires view<V> && is_object_v<F> && regular_invocable<F&, range_reference_t<V>> && /*参照可能*/<invoke_result_t<F&, range_reference_t<V>>> template<bool Const> class transform_view<V, F>::/*イテレータ*/ { private: using /*親*/ = /*maybe-const*/<Const, transform_view>; // 説明専用 using /*ベース*/ = /*maybe-const*/<Const, V>; // 説明専用 iterator_t</*ベース*/> /*current_*/ = iterator_t</*ベース*/>(); // 説明専用 /*親*/* /*parent_*/ = nullptr; // 説明専用 public: using iterator_concept = /* 説明を参照 */; using iterator_category = /* 説明を参照 */; // 常に存在するとは限らない using value_type = remove_cvref_t< invoke_result_t</*maybe-const*/<Const, F>&, range_reference_t</*ベース*/>>>; using difference_type = range_difference_t</*ベース*/>; /*イテレータ*/() requires default_initializable<iterator_t</*ベース*/>> = default; constexpr /*イテレータ*/(/*親*/& parent, iterator_t</*ベース*/> current); constexpr /*イテレータ*/(/*イテレータ*/<!Const> i) requires Const && convertible_to<iterator_t<V>, iterator_t</*ベース*/>>; constexpr const iterator_t</*ベース*/>& base() const& noexcept; constexpr iterator_t</*ベース*/> base() &&; constexpr decltype(auto) operator*() const noexcept(noexcept(invoke(*/*parent_*/->/*関数*/, */*current_*/))) { return invoke(*/*parent_*/->/*関数*/, */*current_*/); } constexpr /*イテレータ*/& operator++(); constexpr void operator++(int); constexpr /*イテレータ*/ operator++(int) requires forward_range</*ベース*/>; constexpr /*イテレータ*/& operator--() requires bidirectional_range</*ベース*/>; constexpr /*イテレータ*/ operator--(int) requires bidirectional_range</*ベース*/>; constexpr /*イテレータ*/& operator+=(difference_type n) requires random_access_range</*ベース*/>; constexpr /*イテレータ*/& operator-=(difference_type n) requires random_access_range</*ベース*/>; constexpr decltype(auto) operator[](difference_type n) const requires random_access_range</*ベース*/> { return invoke(*/*parent_*/->/*fun_*/, /*current_*/[n]); } friend constexpr bool operator==(const /*イテレータ*/& x, const /*イテレータ*/& y) requires equality_comparable<iterator_t</*ベース*/>>; friend constexpr bool operator<(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr bool operator>(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr bool operator<=(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr bool operator>=(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr auto operator<=>(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/> && three_way_comparable<iterator_t</*ベース*/>> ; friend constexpr /*イテレータ*/ operator+(/*イテレータ*/ i, difference_type n) requires random_access_range</*ベース*/>; friend constexpr /*イテレータ*/ operator+(difference_type n, /*イテレータ*/ i) requires random_access_range</*ベース*/>; friend constexpr /*イテレータ*/ operator-(/*イテレータ*/ i, difference_type n) requires random_access_range</*ベース*/>; friend constexpr difference_type operator-(const /*イテレータ*/& x, const /*イテレータ*/& y) requires sized_sentinel_for<iterator_t</*ベース*/>, iterator_t</*ベース*/>>; }; }
クラステンプレート std::ranges::transform_view::sentinel
namespace std::ranges { template<input_range V, move_constructible F> requires view<V> && is_object_v<F> && regular_invocable<F&, range_reference_t<V>> && /*can-reference*/<invoke_result_t<F&, range_reference_t<V>>> template<bool Const> class transform_view<V, F>::/*sentinel*/ { private: using /*Parent*/ = /*maybe-const*/<Const, transform_view>; // 説明専用 using /*Base*/ = /*maybe-const*/<Const, V>; // 説明専用 sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>(); // 説明専用 public: /*sentinel*/() = default; constexpr explicit /*sentinel*/(sentinel_t</*Base*/> end); constexpr /*sentinel*/(/*sentinel*/<!Const> i) requires Const && convertible_to<sentinel_t<V>, sentinel_t</*Base*/>>; constexpr sentinel_t</*Base*/> base() const; template<bool OtherConst> requires sentinel_for<sentinel_t</*Base*/>, iterator_t</*maybe-const*/<OtherConst, V>>> friend constexpr bool operator==(const /*iterator*/<OtherConst>& x, const /*sentinel*/& y); template<bool OtherConst> requires sized_sentinel_for<sentinel_t</*Base*/>, iterator_t</*maybe-const*/<OtherConst, V>>> friend constexpr range_difference_t</*maybe-const*/<OtherConst, V>> operator-( const /*iterator*/<OtherConst>& x, const /*sentinel*/& y); template<bool OtherConst> requires sized_sentinel_for<sentinel_t</*Base*/>, iterator_t</*maybe-const*/<OtherConst, V>>> friend constexpr range_difference_t</*maybe-const*/<OtherConst, V>> operator-( const /*sentinel*/& y, const /*iterator*/<OtherConst>& x); }; }
クラステンプレート std::ranges::take_view
namespace std::ranges { template<view V> class take_view : public view_interface<take_view<V>> { private: V /*base_*/ = V(); // 説明専用 range_difference_t<V> /*count_*/ = 0; // 説明専用 // クラステンプレート take_view::sentinel template<bool> class /*sentinel*/; // 説明専用 public: take_view() requires default_initializable<V> = default; constexpr explicit take_view(V base, range_difference_t<V> count); constexpr V base() const& requires copy_constructible<V> { return /*base_*/; } constexpr V base() && { return std::move(/*base_*/); } constexpr auto begin() requires(!/*シンプルビュー*/<V>) { if constexpr (sized_range<V>) { if constexpr (random_access_range<V>) { return ranges::begin(/*base_*/); } else { auto sz = range_difference_t<V>(size()); return counted_iterator(ranges::begin(/*base_*/), sz); } } else if constexpr (sized_sentinel_for<sentinel_t<V>, iterator_t<V>>) { auto it = ranges::begin(/*base_*/); auto sz = std::min(/*カウント_*/, ranges::end(/*base_*/) - it); return counted_iterator(std::move(it), sz); } else { return counted_iterator(ranges::begin(/*base_*/), /*count_*/); } } constexpr auto begin() const requires range<const V> { if constexpr (sized_range<const V>) { if constexpr (random_access_range<const V>) { return ranges::begin(/*base_*/); } else { auto sz = range_difference_t<const V>(size()); return counted_iterator(ranges::begin(/*base_*/), sz); } } else if constexpr (sized_sentinel_for<sentinel_t<const V>, iterator_t<const V>>) { auto it = ranges::begin(/*base_*/); auto sz = std::min(/*count_*/, ranges::end(/*base_*/) - it); return counted_iterator(std::move(it), sz); } else { return counted_iterator(ranges::begin(/*base_*/), /*カウント_*/); } } constexpr auto end() requires(!/*シンプルビュー*/<V>) { if constexpr (sized_range<V>) { if constexpr (random_access_range<V>) return ranges::begin(/*base_*/) + range_difference_t<V>(size()); else return default_sentinel; } else if constexpr (sized_sentinel_for<sentinel_t<V>, iterator_t<V>>) { return default_sentinel; } else { return /*sentinel*/<false>{ ranges::end(/*base_*/) }; } } constexpr auto end() const requires range<const V> { if constexpr (sized_range<const V>) { if constexpr (random_access_range<const V>) return ranges::begin(/*base_*/) + range_difference_t<const V>(size()); else return default_sentinel; } else if constexpr (sized_sentinel_for<sentinel_t<const V>, iterator_t<const V>>) { return default_sentinel; } else { return /*sentinel*/<true>{ ranges::end(/*base_*/) }; } } constexpr auto size() requires sized_range<V> { auto n = ranges::size(/*base_*/); return ranges::min(n, static_cast<decltype(n)>(/*count_*/)); } constexpr auto size() const requires sized_range<const V> { auto n = ranges::size(/*base_*/); return ranges::min(n, static_cast<decltype(n)>(/*count_*/)); } constexpr auto reserve_hint() { if constexpr (approximately_sized_range<V>) { auto n = static_cast<range_difference_t<V>>(ranges::reserve_hint(/*base_*/)); return /*to-unsigned-like*/(ranges::min(n, /*count_*/)); } return /*to-unsigned-like*/(/*count_*/); } constexpr auto reserve_hint() const { if constexpr (approximately_sized_range<const V>) { auto n = static_cast<range_difference_t<const V>>(ranges::reserve_hint(/*base_*/)); return /*to-unsigned-like*/(ranges::min(n, /*カウント_*/)); } return /*to-unsigned-like*/(/*count_*/); } }; template<class R> take_view(R&&, range_difference_t<R>) -> take_view<views::all_t<R>>; }
クラステンプレート std::ranges::take_view::sentinel
namespace std::ranges { template<view V> template<bool Const> class take_view<V>::/*sentinel*/ { private: using /*Base*/ = /*maybe-const*/<Const, V>; // 説明専用 template<bool OtherConst> using /*CI*/ = counted_iterator<iterator_t</*maybe-const*/<OtherConst, V>>>; // 説明専用 sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>(); // 説明専用 public: /*sentinel*/() = default; constexpr explicit /*sentinel*/(sentinel_t</*Base*/> end); constexpr /*sentinel*/(/*sentinel*/<!Const> s) requires Const && convertible_to<sentinel_t<V>, sentinel_t</*Base*/>>; constexpr sentinel_t</*Base*/> base() const; friend constexpr bool operator==(const /*CI*/<Const>& y, const /*sentinel*/& x); template<bool OtherConst = !Const> requires sentinel_for<sentinel_t</*Base*/>, iterator_t</*maybe-const*/<OtherConst, V>>> friend constexpr bool operator==(const /*CI*/<OtherConst>& y, const /*sentinel*/& x); }; }
クラステンプレート std::ranges::take_while_view
namespace std::ranges { template<view V, class Pred> requires input_range<V> && is_object_v<Pred> && indirect_unary_predicate<const Pred, iterator_t<V>> class take_while_view : public view_interface<take_while_view<V, Pred>> { // クラステンプレート take_while_view::sentinel template<bool> class /*sentinel*/; // 説明専用 V /*base_*/ = V(); // 説明専用 /*movable-box*/<Pred> /*pred_*/; // 説明専用 public: take_while_view() requires default_initializable<V> && default_initializable<Pred> = default; constexpr explicit take_while_view(V base, Pred pred); constexpr V base() const& requires copy_constructible<V> { return /*base_*/; } constexpr V base() && { return std::move(/*base_*/); } constexpr const Pred& pred() const; constexpr auto begin() requires(!/*simple-view*/<V>) { return ranges::begin(/*base_*/); } constexpr auto begin() const requires range<const V> && indirect_unary_predicate<const Pred, iterator_t<const V>> { return ranges::begin(/*base_*/); } constexpr auto end() requires(!/*simple-view*/<V>) { return /*sentinel*/<false>(ranges::end(/*base_*/), addressof(*/*pred_*/)); } constexpr auto end() const requires range<const V> && indirect_unary_predicate<const Pred, iterator_t<const V>> { return /*sentinel*/<true>(ranges::end(/*base_*/), addressof(*/*pred_*/)); } }; template<class R, class Pred> take_while_view(R&&, Pred) -> take_while_view<views::all_t<R>, Pred>; }
クラステンプレート std::ranges::take_while_view::sentinel
namespace std::ranges { template<view V, class Pred> requires input_range<V> && is_object_v<Pred> && indirect_unary_predicate<const Pred, iterator_t<V>> template<bool Const> class take_while_view<V, Pred>::/*sentinel*/ { using /*Base*/ = /*maybe-const*/<Const, V>; // 説明専用 sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>(); // 説明専用 const Pred* /*pred_*/ = nullptr; // 説明専用 public: /*sentinel*/() = default; constexpr explicit /*sentinel*/(sentinel_t</*Base*/> end, const Pred* pred); constexpr /*sentinel*/(/*sentinel*/<!Const> s) requires Const && convertible_to<sentinel_t<V>, sentinel_t</*Base*/>>; constexpr sentinel_t</*Base*/> base() const { return /*end_*/; } friend constexpr bool operator==(const iterator_t</*Base*/>& x, const /*sentinel*/& y); template<bool OtherConst = !Const> requires sentinel_for<sentinel_t</*Base*/>, iterator_t</*maybe-const*/<OtherConst, V>>> friend constexpr bool operator==(const iterator_t</*maybe-const*/<OtherConst, V>>& x, const /*sentinel*/& y); }; }
クラステンプレート std::ranges::drop_view
namespace std::ranges { template<view V> class drop_view : public view_interface<drop_view<V>> { public: drop_view() requires default_initializable<V> = default; constexpr explicit drop_view(V base, range_difference_t<V> count); constexpr V base() const& requires copy_constructible<V> { return /*base_*/; } constexpr V base() && { return std::move(/*base_*/); } constexpr auto begin() requires(!(/*simple-view*/<V> && random_access_range<const V> && sized_range<const V>)); constexpr auto begin() const requires random_access_range<const V> && sized_range<const V>; constexpr auto end() requires(!/*simple-view*/<V>) { return ranges::end(/*base_*/); } constexpr auto end() const requires range<const V> { return ranges::end(/*base_*/); } constexpr auto size() requires sized_range<V> { const auto s = ranges::size(/*base_*/); const auto c = static_cast<decltype(s)>(/*count_*/); return s < c ? 0 : s - c; } constexpr auto size() const requires sized_range<const V> { const auto s = ranges::size(/*base_*/); const auto c = static_cast<decltype(s)>(/*count_*/); return s < c ? 0 : s - c; } constexpr auto reserve_hint() requires approximately_sized_range<V> { const auto s = static_cast<range_difference_t<V>>(ranges::reserve_hint(/*base_*/)); return /*to-unsigned-like*/(s < /*count_*/ ? 0 : s - /*count_*/); } constexpr auto reserve_hint() const requires approximately_sized_range<const V> { const auto s = static_cast<range_difference_t<const V>>(ranges::reserve_hint(/*base_*/)); return /*to-unsigned-like*/(s < /*count_*/ ? 0 : s - /*count_*/); } private: V /*base_*/ = V(); // 説明専用 range_difference_t<V> /*count_*/ = 0; // 説明専用 }; template<class R> drop_view(R&&, range_difference_t<R>) -> drop_view<views::all_t<R>>; }
クラステンプレート std::ranges::drop_while_view
namespace std::ranges { template<view V, class Pred> requires input_range<V> && is_object_v<Pred> && indirect_unary_predicate<const Pred, iterator_t<V>> class drop_while_view : public view_interface<drop_while_view<V, Pred>> { public: drop_while_view() requires default_initializable<V> && default_initializable<Pred> = default; constexpr explicit drop_while_view(V base, Pred pred); constexpr V base() const& requires copy_constructible<V> { return /*base_*/; } constexpr V base() && { return std::move(/*base_*/); } constexpr const Pred& pred() const; constexpr auto begin(); constexpr auto end() { return ranges::end(/*base_*/); } private: V /*base_*/ = V(); // 説明専用 /*movable-box*/<Pred> /*pred_*/; // 説明専用 }; template<class R, class Pred> drop_while_view(R&&, Pred) -> drop_while_view<views::all_t<R>, Pred>; }
クラステンプレート std::ranges::join_view
namespace std::ranges {
template<input_range V>
requires view<V> && input_range<range_reference_t<V>>
class join_view : public view_interface<join_view<V>>
{
private:
using /*InnerRng*/ = range_reference_t<V>; // 説明専用
// クラステンプレート join_view::iterator
template<bool Const>
struct /*イテレータ*/; // 説明専用
// クラステンプレート join_view::sentinel
template<bool Const>
struct /*sentinel*/; // 説明専用
V /*base_*/ = V(); // 説明専用
/*非伝播キャッシュ*/<iterator_t<V>> /*outer_*/; // 説明専用 表示のみ
// when !forward_range<V>
/*非伝播キャッシュ*/<remove_cv_t</*InnerRng*/>>
/*inner_*/; // 説明専用 表示のみ
// if is_reference_v<InnerRng> is false
public:
join_view()
requires default_initializable<V>
= default;
constexpr explicit join_view(V base);
constexpr V base() const&
requires copy_constructible<V>
{
return /*base_*/;
}
constexpr V base() && { return std::move(/*base_*/); }
constexpr auto begin()
{
if constexpr (forward_range<V>) {
constexpr bool use_const = /*シンプルビュー*/<V> && is_reference_v</*InnerRng*/>;
return /*イテレータ*/<use_const>{ *this, ranges::begin(/*base_*/) };
} else {
/*outer_*/ = ranges::begin(/*base_*/);
return /*イテレータ*/<false>{ *this };
}
}
constexpr auto begin() const
requires forward_range<const V> && is_reference_v<range_reference_t<const V>> &&
input_range<range_reference_t<const V>>
{
return /*イテレータ*/<true>{ *this, ranges::begin(/*base_*/) };
}
constexpr auto end()
{
if constexpr (forward_range<V> && is_reference_v</*InnerRng*/> &&
forward_range</*InnerRng*/> && common_range<V> &&
common_range</*InnerRng*/>)
return /*イテレータ*/</*シンプルビュー*/<V>>{ *this, ranges::end(/*base_*/) };
else
return /*sentinel*/</*シンプルビュー*/<V>>{ *this };
}
constexpr auto end() const
requires forward_range<const V> && is_reference_v<range_reference_t<const V>> &&
input_range<range_reference_t<const V>>
{
if constexpr (forward_range<range_reference_t<const V>> && common_range<const V> &&
common_range<range_reference_t<const V>>)
return /*イテレータ*/<true>{ *this, ranges::end
(注:指定された条件により、HTMLタグ・属性は保持され、タグ内のテキスト(存在しない)は翻訳対象外、C++固有用語は翻訳せず、テキスト部分のみを翻訳しています。表示されるテキストは「ranges::end」のみで、これはC++固有用語のため翻訳対象外となります)(/*base_*/) };
else
return /*sentinel*/<true>{ *this };
}
};
template<class R>
explicit join_view(R&&) -> join_view<views::all_t<R>>;
}
クラステンプレート std::ranges::join_view::iterator
namespace std::ranges { template<input_range V> requires view<V> && input_range<range_reference_t<V>> template<bool Const> struct join_view<V>::/*イテレータ*/ { private: using /*親*/ = /*maybe-const*/<Const, join_view>; // 説明専用 using /*ベース*/ = /*maybe-const*/<Const, V>; // 説明専用 using /*OuterIter*/ = iterator_t</*ベース*/>; // 説明専用 using /*InnerIter*/ = iterator_t<range_reference_t</*ベース*/>>; // 説明専用 static constexpr bool /*参照は左辺値である*/ = // 説明専用 is_reference_v<range_reference_t</*ベース*/>>; /*OuterIter*/ /*outer_*/ = /*OuterIter*/(); // 説明専用 表示のみ // Baseがforward_rangeをモデル化する場合 optional</*InnerIter*/> /*inner_*/; // 説明専用 /*親クラス*/* /*parent_*/ = nullptr; // 説明専用 constexpr void /*満たす*/(); // 説明専用 constexpr /*OuterIter*/& /*外側*/(); // 説明専用 constexpr const /*OuterIter*/& /*外側*/() const; // 説明専用 constexpr /*イテレータ*/(/*親*/& parent, /*OuterIter*/ outer) requires forward_range</*ベース*/>; // 説明専用 constexpr explicit /*イテレータ*/(/*親クラス*/& parent) requires(!forward_range</*ベース*/>); // 説明専用 public: using iterator_concept = /* 説明を参照 */; using iterator_category = /* 詳細は説明を参照 */; // 常に存在するとは限らない using value_type = range_value_t<range_reference_t</*ベース*/>>; using difference_type = /* 説明を参照 */; /*イテレータ*/() = default; constexpr /*イテレータ*/(/*イテレータ*/<!Const> i) requires Const && convertible_to<iterator_t<V>, /*OuterIter*/> && convertible_to<iterator_t</*InnerRng*/>, /*InnerIter*/>; constexpr decltype(auto) operator*() const { return **/*inner_*/; } constexpr /*InnerIter*/ operator->() const requires /*has-arrow*/</*InnerIter*/> && copyable</*InnerIter*/>; constexpr /*イテレータ*/& operator++(); constexpr void operator++(int); constexpr /*イテレータ*/ operator++(int) requires /*参照は左辺値である*/ && forward_range</*ベース*/> && forward_range<range_reference_t</*ベース*/>>; constexpr /*イテレータ*/& operator--() requires /*ref-is-glvalue*/ && bidirectional_range</*ベース*/> && bidirectional_range<range_reference_t</*ベース*/>> && common_range<range_reference_t</*ベース*/>>; constexpr /*イテレータ*/ operator--(int) requires /*ref-is-glvalue*/ && bidirectional_range</*ベース*/> && bidirectional_range<range_reference_t</*ベース*/>> && common_range<range_reference_t</*ベース*/>>; friend constexpr bool operator==(const /*イテレータ*/& x, const /*イテレータ*/& y) requires /*参照はglvalueである*/ && forward_range</*ベース*/> && equality_comparable<iterator_t<range_reference_t</*ベース*/>>>; friend constexpr decltype(auto) iter_move(const /*イテレータ*/& i) noexcept( noexcept(ranges::iter_move(*i./*inner_*/))) { return ranges::iter_move(*i./*inner_*/); } friend constexpr void iter_swap( const /*イテレータ*/& x, const /*イテレータ*/& y) noexcept(noexcept(ranges::iter_swap(*x./*inner_*/, *y./*inner_*/))) requires indirectly_swappable</*InnerIter*/>; }; }
クラステンプレート std::ranges::join_view::sentinel
namespace std::ranges { template<input_range V> requires view<V> && input_range<range_reference_t<V>> template<bool Const> struct join_view<V>::/*sentinel*/ { private: using /*Parent*/ = /*maybe-const*/<Const, join_view>; // 説明専用 using /*Base*/ = /*maybe-const*/<Const, V>; // 説明専用 sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>(); // 説明専用 public: /*sentinel*/() = default; constexpr explicit /*sentinel*/(/*Parent*/& parent); constexpr /*sentinel*/(/*sentinel*/<!Const> s) requires Const && convertible_to<sentinel_t<V>, sentinel_t</*Base*/>>; template<bool OtherConst> requires sentinel_for<sentinel_t</*Base*/>, iterator_t</*maybe-const*/<OtherConst, V>>> friend constexpr bool operator==(const /*iterator*/<OtherConst>& x, const /*sentinel*/& y); }; }
クラステンプレート std::ranges::join_with_view
namespace std::ranges { template<class R> concept /*双方向-共通*/ = bidirectional_range<R> && common_range<R>; // 説明専用 template<input_range V, forward_range Pattern> requires view<V> && input_range<range_reference_t<V>> && view<Pattern> && /*連結可能*/<range_reference_t<V>, Pattern> class join_with_view : public view_interface<join_with_view<V, Pattern>> { using /*InnerRng*/ = range_reference_t<V>; // 説明専用 V /*base_*/ = V(); // 説明専用 /*非伝播キャッシュ*/<iterator_t<V>> /*outer-it_*/; // 説明専用で表示 // only when !forward_range<V> /*非伝播キャッシュ*/<remove_cv_t</*InnerRng*/>> /*inner_*/; // 説明専用 表示のみ // if is_reference_v<InnerRng> が false の場合 Pattern /*パターン_*/ = Pattern(); // 説明専用 // クラステンプレート join_with_view::iterator template<bool Const> struct /*イテレータ*/; // 説明専用 // クラステンプレート join_with_view::sentinel template<bool Const> struct /*sentinel*/; // 説明専用 public: join_with_view() requires default_initializable<V> && default_initializable<Pattern> = default; constexpr explicit join_with_view(V base, Pattern pattern); template<input_range R> requires constructible_from<V, views::all_t<R>> && constructible_from<Pattern, single_view<range_value_t</*InnerRng*/>>> constexpr explicit join_with_view(R&& r, range_value_t</*InnerRng*/> e); constexpr V base() const& requires copy_constructible<V> { return /*base_*/; } constexpr V base() && { return std::move(/*base_*/); } constexpr auto begin() { if constexpr (forward_range<V>) { constexpr bool use_const = /*シンプルビュー*/<V> && is_reference_v</*InnerRng*/> && /*シンプルビュー*/<Pattern>; return /*イテレータ*/<use_const>{ *this, ranges::begin(/*base_*/) }; } else { /*outer-it_*/ = ranges::begin(/*base_*/); return /*イテレータ*/<false>{ *this }; } } constexpr auto begin() const requires forward_range<const V> && forward_range<const Pattern> && is_reference_v<range_reference_t<const V>> && input_range<range_reference_t<const V>> && /*連結可能*/<range_reference_t<const V>, const Pattern> { return /*イテレータ*/<true>{ *this, ranges::begin(/*base_*/) }; } constexpr auto end() { if constexpr (forward_range<V> && is_reference_v</*InnerRng*/> && forward_range</*InnerRng*/> && common_range<V> && common_range</*InnerRng*/>) return /*イテレータ*/ < /*シンプルビュー*/<V> && /*シンプルビュー*/ < Pattern >> { *this, ranges::end(/*base_*/) }; else return /*sentinel*/ < /*シンプルビュー*/<V> && /*シンプルビュー*/ < Pattern >> { *this }; } constexpr auto end() const requires forward_range<const V> && forward_range<const Pattern> && is_reference_v<range_reference_t<const V>> && input_range<range_reference_t<const V>> && /*連結可能*/<range_reference_t<const V>, const Pattern> { using InnerConstRng = range_reference_t<const V>; if constexpr (forward_range<InnerConstRng> && common_range<const V> && common_range<InnerConstRng>) return /*イテレータ*/<true>{ *this, ranges::end(/*base_*/) }; else return /*sentinel*/<true>{ *this }; } }; template<class R, class P> join_with_view(R&&, P&&) -> join_with_view<views::all_t<R>, views::all_t<P>>; template<input_range R> join_with_view(R&&, range_value_t<range_reference_t<R>>) -> join_with_view<views::all_t<R>, single_view<range_value_t<range_reference_t<R>>>>; }
クラステンプレート std::ranges::join_with_view::iterator
namespace std::ranges { template<input_range V, forward_range Pattern> requires view<V> && input_range<range_reference_t<V>> && view<Pattern> && /*連結可能*/<range_reference_t<V>, Pattern> template<bool Const> class join_with_view<V, Pattern>::/*イテレータ*/ { using /*親*/ = /*maybe-const*/<Const, join_with_view>; // 説明専用 using /*ベース*/ = /*maybe-const*/<Const, V>; // 説明専用 using /*InnerBase*/ = range_reference_t</*ベース*/>; // 説明専用 using /*PatternBase*/ = /*maybe-const*/<Const, Pattern>; // 説明専用 using /*OuterIter*/ = iterator_t</*ベース*/>; // 説明専用 using /*InnerIter*/ = iterator_t</*InnerBase*/>; // 説明専用 using /*PatternIter*/ = iterator_t</*PatternBase*/>; // 説明専用 static constexpr bool /*ref-is-glvalue*/ = is_reference_v</*InnerBase*/>; // 説明専用 /*親*/* /*parent_*/ = nullptr; // 説明専用 /*OuterIter*/ /*outer-it_*/ = /*OuterIter*/(); // 説明専用 表示のみ // Base が forward_range をモデル化する場合 variant</*PatternIter*/, /*InnerIter*/> /*inner-it_*/; // 説明専用 constexpr /*イテレータ*/(/*親*/& parent, /*OuterIter*/ outer) requires forward_range</*ベース*/>; // 説明専用 constexpr explicit /*イテレータ*/(/*親*/& parent) requires(!forward_range</*ベース*/>); // 説明専用 constexpr /*OuterIter*/& /*外側*/(); // 説明専用 constexpr const /*OuterIter*/& /*外側*/() const; // 説明専用 constexpr auto& /*内部更新*/(); // 説明専用 constexpr auto& /*get-inner*/(); // 説明専用 constexpr void /*満たす*/(); // 説明専用 public: using iterator_concept = /* 詳細は説明を参照 */; using iterator_category = /* 説明を参照 */; // 常に存在するわけではない using value_type = /* 詳細を参照 */; using difference_type = /* 説明を参照 */; /*イテレータ*/() = default; constexpr /*イテレータ*/(/*イテレータ*/<!Const> i) requires Const && convertible_to<iterator_t<V>, /*OuterIter*/> && convertible_to<iterator_t</*InnerRng*/>, /*InnerIter*/> && convertible_to<iterator_t<Pattern>, /*PatternIter*/>; constexpr decltype(auto) operator*() const; constexpr /*イテレータ*/& operator++(); constexpr void operator++(int); constexpr /*イテレータ*/ operator++(int) requires /*ref-is-glvalue*/ && forward_iterator</*OuterIter*/> && forward_iterator</*InnerIter*/>; constexpr /*イテレータ*/& operator--() requires /*ref-is-glvalue*/ && bidirectional_range</*ベース*/> && /*双方向-共通*/</*InnerBase*/> && /*双方向-共通*/</*PatternBase*/>; constexpr /*イテレータ*/ operator--(int) requires /*ref-is-glvalue*/ && bidirectional_range</*ベース*/> && /*双方向-共通*/</*InnerBase*/> && /*双方向-共通*/</*PatternBase*/>; friend constexpr bool operator==(const /*イテレータ*/& x, const /*イテレータ*/& y) requires /*ref-is-glvalue*/ && forward_range</*ベース*/> && equality_comparable</*InnerIter*/>; friend constexpr decltype(auto) iter_move(const /*イテレータ*/& x) { using rvalue_reference = common_reference_t<iter_rvalue_reference_t</*InnerIter*/>, iter_rvalue_reference_t</*PatternIter*/>>; return visit<rvalue_reference>(ranges::iter_move (注:原文のテキスト「ranges::iter_move」はC++固有の用語であり、HTMLタグと属性は翻訳対象外のため、そのまま保持されています), x./*inner-it_*/); } friend constexpr void iter_swap(const /*イテレータ*/& x, const /*イテレータ*/& y) requires indirectly_swappable</*InnerIter*/, /*PatternIter*/> { visit(ranges::iter_swap, x./*inner-it_*/, y./*inner-it_*/); } }; }
クラステンプレート std::ranges::join_with_view::sentinel
namespace std::ranges { template<input_range V, forward_range Pattern> requires view<V> && input_range<range_reference_t<V>> && view<Pattern> && /*concatable*/<range_reference_t<V>, Pattern> template<bool Const> class join_with_view<V, Pattern>::/*sentinel*/ { using /*Parent*/ = /*maybe-const*/<Const, join_with_view>; // 説明専用 using /*Base*/ = /*maybe-const*/<Const, V>; // 説明専用 sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>(); // 説明専用 constexpr explicit /*sentinel*/(/*Parent*/& parent); // 説明専用 public: /*sentinel*/() = default; constexpr /*sentinel*/(/*sentinel*/<!Const> s) requires Const && convertible_to<sentinel_t<V>, sentinel_t</*Base*/>>; template<bool OtherConst> requires sentinel_for<sentinel_t</*Base*/>, iterator_t</*maybe-const*/<OtherConst, V>>> friend constexpr bool operator==(const /*iterator*/<OtherConst>& x, const /*sentinel*/& y); }; }
クラステンプレート std::ranges::lazy_split_view
namespace std::ranges { template<auto> struct /*require-constant*/; // 説明専用 template<class R> concept /*tiny-range*/ = // 説明専用 sized_range<R> && requires { typename /*require-constant*/<remove_reference_t<R>::size()>; } && (remove_reference_t<R>::size() <= 1); template<input_range V, forward_range Pattern> requires view<V> && view<Pattern> && indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to> && (forward_range<V> || /*tiny-range*/<Pattern>) class lazy_split_view : public view_interface<lazy_split_view<V, Pattern>> { private: V /*base_*/ = V(); // 説明専用 Pattern /*パターン_*/ = Pattern(); // 説明専用 /*非伝播キャッシュ*/<iterator_t<V>> /*current_*/; // 説明専用 表示のみ // forward_range<V> が false の場合 // class template lazy_split_view::outer-iterator template<bool> struct /*outer-iterator*/; // 説明専用 // class template lazy_split_view::inner-iterator template<bool> struct /*内部イテレータ*/; // 説明専用 public: lazy_split_view() requires default_initializable<V> && default_initializable<Pattern> = default; constexpr explicit lazy_split_view(V base, Pattern pattern); template<input_range R> requires constructible_from<V, views::all_t<R>> && constructible_from<Pattern, single_view<range_value_t<R>>> constexpr explicit lazy_split_view(R&& r, range_value_t<R> e); constexpr V base() const& requires copy_constructible<V> { return /*base_*/; } constexpr V base() && { return std::move(/*base_*/); } constexpr auto begin() { if constexpr (forward_range<V>) { return /*outer-iterator*/ < /*シンプルビュー*/<V> && /*シンプルビュー*/ < Pattern >> { *this, ranges::begin(/*base_*/) }; } else { /*current_*/ = ranges::begin(/*base_*/); return /*外側イテレータ*/<false>{ *this }; } } constexpr auto begin() const requires forward_range<V> && forward_range<const V> { return /*外部イテレータ*/<true>{ *this, ranges::begin(/*base_*/) }; } constexpr auto end() requires forward_range<V> && common_range<V> { return /*outer-iterator*/ < /*シンプルビュー*/<V> && /*シンプルビュー*/ < Pattern >> { *this, ranges::end(/*base_*/) }; } constexpr auto end() const { if constexpr (forward_range<V> && forward_range<const V> && common_range<const V>) return /*外部イテレータ*/<true>{ *this, ranges::end(/*base_*/) }; else return default_sentinel; } }; template<class R, class P> lazy_split_view(R&&, P&&) -> lazy_split_view<views::all_t (注:指定された条件により、HTMLタグ・属性はそのまま保持し、C++固有の用語(views::all_t)は翻訳せず、コードタグ内ではないためテキスト部分のみ翻訳対象と判断しましたが、実際のテキスト内容がC++識別子のみであったため、翻訳変更は行っていません)<R>, views::all_t<P>>; template<input_range R> lazy_split_view(R&&, range_value_t<R>) -> lazy_split_view<views::all_t<R>, single_view<range_value_t<R>>>; }
クラステンプレート std::ranges::lazy_split_view::outer_iterator
namespace std::ranges { template<input_range V, forward_range Pattern> requires view<V> && view<Pattern> && indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to> && (forward_range<V> || /*tiny-range*/<Pattern>) template<bool Const> struct lazy_split_view<V, Pattern>::/*outer-iterator*/ { private: using /*Parent*/ = /*maybe-const*/<Const, lazy_split_view>; // 説明専用 using /*Base*/ = /*maybe-const*/<Const, V>; // 説明専用 /*Parent*/* /*parent_*/ = nullptr; // 説明専用 iterator_t</*Base*/> /*current_*/ = iterator_t</*Base*/>(); // 説明専用、Vがforward_rangeをモデルする場合のみ存在 // if V models forward_range bool /*trailing-empty_*/ = false; // 説明専用 public: using iterator_concept = conditional_t<forward_range</*Base*/>, forward_iterator_tag, input_iterator_tag>; using iterator_category = input_iterator_tag; // Baseがforward_rangeをモデルする場合のみ存在 // present only if Base // models forward_range // class lazy_split_view::outer-iterator::value_type struct value_type; using difference_type = range_difference_t</*Base*/>; /*outer-iterator*/() = default; constexpr explicit /*outer-iterator*/(/*Parent*/& parent) requires(!forward_range</*Base*/>); constexpr /*outer-iterator*/(/*Parent*/& parent, iterator_t</*Base*/> current) requires forward_range</*Base*/>; constexpr /*outer-iterator*/(/*outer-iterator*/<!Const> i) requires Const && convertible_to<iterator_t<V>, iterator_t</*Base*/>>; constexpr value_type operator*() const; constexpr /*outer-iterator*/& operator++(); constexpr decltype(auto) operator++(int) { if constexpr (forward_range</*Base*/>) { auto tmp = *this; ++*this; return tmp; } else ++*this; } friend constexpr bool operator==(const /*outer-iterator*/& x, const /*outer-iterator*/& y) requires forward_range</*Base*/>; friend constexpr bool operator==(const /*outer-iterator*/& x, default_sentinel_t); }; }
クラステンプレート std::ranges::lazy_split_view::outer_iterator::value_type
namespace std::ranges { template<input_range V, forward_range Pattern> requires view<V> && view<Pattern> && indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to> && (forward_range<V> || /*tiny-range*/<Pattern>) template<bool Const> struct lazy_split_view<V, Pattern>::/*outer-iterator*/<Const>::value_type : view_interface<value_type> { private: /*outer-iterator*/ /*i_*/ = /*outer-iterator*/(); // 説明専用 constexpr explicit value_type(/*outer-iterator*/ i); // 説明専用 public: constexpr /*inner-iterator*/<Const> begin() const; constexpr default_sentinel_t end() const noexcept; }; }
クラステンプレート std::ranges::lazy_split_view::inner_iterator
namespace std::ranges { template<input_range V, forward_range Pattern> requires view<V> && view<Pattern> && indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to> && (forward_range<V> || /*tiny-range*/<Pattern>) template<bool Const> struct lazy_split_view<V, Pattern>::/*inner-iterator*/ { private: using /*Base*/ = /*maybe-const*/<Const, V>; // 説明専用 /*outer-iterator*/<Const> /*i_*/ = /*outer-iterator*/<Const>(); // 説明専用 bool /*incremented_*/ = false; // 説明専用 public: using iterator_concept = typename /*outer-iterator*/<Const>::iterator_concept; using iterator_category = /* 説明を参照 */; // Baseがforward_rangeをモデル化する場合のみ存在 // Baseがforward_rangeをモデル化する場合のみ存在 using value_type = range_value_t</*Base*/>; using difference_type = range_difference_t</*Base*/>; /*inner-iterator*/() = default; constexpr explicit /*inner-iterator*/(/*outer-iterator*/<Const> i); constexpr const iterator_t</*Base*/>& base() const& noexcept; constexpr iterator_t</*Base*/> base() && requires forward_range<V>; constexpr decltype(auto) operator*() const { return */*i_*/./*current*/; } constexpr /*inner-iterator*/& operator++(); constexpr decltype(auto) operator++(int) { if constexpr (forward_range</*Base*/>) { auto tmp = *this; ++*this; return tmp; } else ++*this; } friend constexpr bool operator==(const /*inner-iterator*/& x, const /*inner-iterator*/& y) requires forward_range</*Base*/>; friend constexpr bool operator==(const /*inner-iterator*/& x, default_sentinel_t); friend constexpr decltype(auto) iter_move(const /*inner-iterator*/& i) noexcept( noexcept(ranges::iter_move(i./*i_*/./*current*/))) { return ranges::iter_move(i./*i_*/./*current*/); } friend constexpr void iter_swap(const /*inner-iterator*/& x, const /*inner-iterator*/& y) noexcept( noexcept(ranges::iter_swap(x./*i_*/./*current*/, y./*i_*/./*current*/))) requires indirectly_swappable<iterator_t</*Base*/>>; }; }
クラステンプレート std::ranges::split_view
namespace std::ranges { template<forward_range V, forward_range Pattern> requires view<V> && view<Pattern> && indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to> class split_view : public view_interface<split_view<V, Pattern>> { private: V /*base_*/ = V(); // 説明専用 Pattern /*pattern_*/ = Pattern(); // 説明専用 // クラス split_view::iterator struct /*iterator*/; // 説明専用 // クラス split_view::sentinel struct /*sentinel*/; // 説明専用 public: split_view() requires default_initializable<V> && default_initializable<Pattern> = default; constexpr explicit split_view(V base, Pattern pattern); template<forward_range R> requires constructible_from<V, views::all_t<R>> && constructible_from<Pattern, single_view<range_value_t<R>>> constexpr explicit split_view(R&& r, range_value_t<R> e); constexpr V base() const& requires copy_constructible<V> { return /*base_*/; } constexpr V base() && { return std::move(/*base_*/); } constexpr /*iterator*/ begin(); constexpr auto end() { if constexpr (common_range<V>) { return /*iterator*/{ *this, ranges::end(/*base_*/), {} }; } else { return /*sentinel*/{ *this }; } } constexpr subrange<iterator_t<V>> /*find-next*/(iterator_t<V>); // 説明専用 }; template<class R, class P> split_view(R&&, P&&) -> split_view<views::all_t<R>, views::all_t<P>>; template<forward_range R> split_view(R&&, range_value_t<R>) -> split_view<views::all_t<R>, single_view<range_value_t<R>>>; }
クラステンプレート std::ranges::split_view::iterator
namespace std::ranges { template<forward_range V, forward_range Pattern> requires view<V> && view<Pattern> && indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to> class split_view<V, Pattern>::/*iterator*/ { private: split_view* /*parent_*/ = nullptr; // 説明専用 iterator_t<V> /*cur_*/ = iterator_t<V>(); // 説明専用 subrange<iterator_t<V>> /*next_*/ = subrange<iterator_t<V>>(); // 説明専用 bool /*trailing-empty_*/ = false; // 説明専用 public: using iterator_concept = forward_iterator_tag; using iterator_category = input_iterator_tag; using value_type = subrange<iterator_t<V>>; using difference_type = range_difference_t<V>; /*iterator*/() = default; constexpr /*iterator*/(split_view& parent, iterator_t<V> current, subrange<iterator_t<V>> next); constexpr iterator_t<V> base() const; constexpr value_type operator*() const; constexpr /*iterator*/& operator++(); constexpr /*iterator*/ operator++(int); friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y); }; }
クラステンプレート std::ranges::split_view::sentinel
namespace std::ranges { template<forward_range V, forward_range Pattern> requires view<V> && view<Pattern> && indirectly_comparable<iterator_t<V>, iterator_t<Pattern>, ranges::equal_to> struct split_view<V, Pattern>::/*sentinel*/ { private: sentinel_t<V> /*end_*/ = sentinel_t<V>(); // 説明専用 public: /*sentinel*/() = default; constexpr explicit /*sentinel*/(split_view& parent); friend constexpr bool operator==(const /*iterator*/& x, const /*sentinel*/& y); }; }
クラステンプレート std::ranges::concat
namespace std::ranges { template<class... Rs> using /*concat-reference-t*/ = common_reference_t<range_reference_t<Rs>...>; // 説明専用 template<class... Rs> using /*concat-value-t*/ = common_type_t<range_value_t<Rs>...>; // 説明専用 template<class... Rs> using /*concat-rvalue-reference-t*/ = // 説明専用 common_reference_t<range_rvalue_reference_t<Rs>...>; template<class... Rs> concept /*concat-indirectly-readable*/ = /* 説明を参照 */; // 説明専用 template<class... Rs> concept /*concatable*/ = /* 説明を参照 */; // 説明専用 template<bool Const, class... Rs> concept /*concat-is-random-access*/ = /* 説明を参照 */; // 説明専用 template<bool Const, class... Rs> concept /*concat-is-bidirectional*/ = /* 説明を参照 */; // 説明専用 template<input_range... Views> requires(view<Views> && ...) && (sizeof...(Views) > 0) && /*concatable*/<Views...> class concat_view : public view_interface<concat_view<Views...>> { tuple<Views...> /*views_*/; // 説明専用 // クラステンプレート concat_view::iterator template<bool> class /*iterator*/; // 説明専用 public: constexpr concat_view() = default; constexpr explicit concat_view(Views... views); constexpr /*iterator*/<false> begin() requires(!(/*simple-view*/<Views> && ...)); constexpr /*iterator*/<true> begin() const requires(range<const Views> && ...) && /*concatable*/<const Views...>; constexpr auto end() requires(!(/*simple-view*/<Views> && ...)); constexpr auto end() const requires(range<const Views> && ...) && /*concatable*/<const Views...>; constexpr auto size() requires(sized_range<Views> && ...); constexpr auto size() const requires(sized_range<const Views> && ...); }; template<class... R> concat_view(R&&...) -> concat_view<views::all_t<R>...>; }
クラステンプレート std::ranges::concat::iterator
namespace std::ranges { template<input_range... ビュー> requires(view<Views> && ...) && (sizeof...(Views) > 0) && /*連結可能*/<Views...> template<bool Const> class concat_view<Views...>::/*イテレータ*/ { public: using iterator_category = /* 詳細は説明を参照 */; // 常に存在するとは限らない using iterator_concept = /* 詳細は説明を参照 */; using value_type = /*concat-value-t*/</*おそらくconst*/<Const, Views>...>; using difference_type = common_type_t<range_difference_t</*maybe-const*/<Const, Views>>...>; private: using /*base-iter*/ = // 説明専用 variant<iterator_t</*maybe-const*/<Const, Views>>...>; /*maybe-const*/<Const, concat_view>* /*親_*/ = nullptr; // 説明専用 /*ベースイテレータ*/ /*it_*/; // 説明専用 template<size_t N> constexpr void /*満たす*/(); // 説明専用 template<size_t N> constexpr void /*前へ*/(); // 説明専用 template<size_t N> constexpr void /*advance-fwd*/(difference_type offset, // 説明専用 difference_type steps); template<size_t N> constexpr void /*advance-bwd*/(difference_type offset, // 説明専用 difference_type steps); template<class... Args> constexpr explicit /*イテレータ*/( /*おそらくconst*/<Const, concat_view>* parent, // 説明専用 Args&&... args) requires constructible_from</*base-iter*/, Args&&...>; public: /*イテレータ*/() = default; constexpr /*イテレータ*/(/*イテレータ*/<!Const> i) requires Const && (convertible_to<iterator_t<Views>, iterator_t<const Views>> && ...); constexpr decltype(auto) operator*() const; constexpr /*イテレータ*/& operator++(); constexpr void operator++(int); constexpr /*イテレータ*/ operator++(int) requires /*全前方*/<Const, Views...>; constexpr /*イテレータ*/& operator--() requires /*concat-is-bidirectional*/<Const, Views...>; constexpr /*イテレータ*/ operator--(int) requires /*concat-is-bidirectional*/<Const, Views...>; constexpr /*イテレータ*/& operator+=(difference_type n) requires /*concat-is-random-access*/<Const, Views...>; constexpr /*イテレータ*/& operator-=(difference_type n) requires /*concat-is-random-access*/<Const, Views...>; constexpr decltype(auto) operator[](difference_type n) const requires /*concat-is-random-access*/<Const, Views...>; friend constexpr bool operator==(const /*イテレータ*/& x, const /*イテレータ*/& y) requires(equality_comparable<iterator_t</*maybe-const*/<Const, Views>>> && ...); friend constexpr bool operator==(const /*イテレータ*/& it, default_sentinel_t); friend constexpr bool operator<(const /*イテレータ*/& x, const /*イテレータ*/& y) requires /*全ランダムアクセス*/<Const, Views...>; friend constexpr bool operator>(const /*イテレータ*/& x, const /*イテレータ*/& y) requires /*全ランダムアクセス*/<Const, Views...>; friend constexpr bool operator<=(const /*イテレータ*/& x, const /*イテレータ*/& y) requires /*全ランダムアクセス*/<Const, Views...>; friend constexpr bool operator>=(const /*イテレータ*/& x, const /*イテレータ*/& y) requires /*全ランダムアクセス*/<Const, Views...>; friend constexpr auto operator<=>(const /*イテレータ*/& x, const /*イテレータ*/& y) requires(/*全ランダムアクセス*/<Const, Views...> && (three_way_comparable<iterator_t</*maybe-const*/<Const, Views>>> && ...)); friend constexpr /*イテレータ*/ operator+(const /*イテレータ*/& it, difference_type n) requires /*concat-is-random-access*/<Const, Views...>; friend constexpr /*イテレータ*/ operator+(difference_type n, const /*イテレータ*/& it) requires /*concat-is-random-access*/<Const, Views...>; friend constexpr /*イテレータ*/ operator-(const /*イテレータ*/& it, difference_type n) requires /*concat-is-random-access*/<Const, Views...>; friend constexpr difference_type operator-(const /*イテレータ*/& x, const /*イテレータ*/& y) requires /*concat-is-random-access*/<Const, Views...>; friend constexpr difference_type operator-(const /*イテレータ*/& x, default_sentinel_t) requires /* 説明を参照 */; friend constexpr difference_type operator-(default_sentinel_t, const /*イテレータ*/& x) requires /* 説明を参照 */; friend constexpr decltype(auto) iter_move(const /*イテレータ*/& it) noexcept( /* 説明を参照 */); friend constexpr void iter_swap(const /*イテレータ*/& x, const /*イテレータ*/& y) noexcept(/* 説明を参照 */) requires /* 説明を参照 */; }; }
クラステンプレート std::ranges::common_view
namespace std::ranges { template<view V> requires(!common_range<V> && copyable<iterator_t<V>>) class common_view : public view_interface<common_view<V>> { private: V /*base_*/ = V(); // 説明専用 public: common_view() requires default_initializable<V> = default; constexpr explicit common_view(V r); constexpr V base() const& requires copy_constructible<V> { return /*base_*/; } constexpr V base() && { return std::move(/*base_*/); } constexpr auto begin() requires(!/*シンプルビュー*/<V>) { if constexpr (random_access_range<V> && sized_range<V>) return ranges::begin(/*base_*/); else return common_iterator<iterator_t<V>, sentinel_t<V>>(ranges::begin(/*base_*/)); } constexpr auto begin() const requires range<const V> { if constexpr (random_access_range<const V> && sized_range<const V>) return ranges::begin(/*base_*/); else return common_iterator<iterator_t<const V>, sentinel_t<const V>>( ranges::begin(/*base_*/)); } constexpr auto end() requires(!/*シンプルビュー*/<V>) { if constexpr (random_access_range<V> && sized_range<V>) return ranges::begin(/*base_*/) + ranges::distance(/*base_*/); else return common_iterator<iterator_t<V>, sentinel_t<V>>(ranges::end(/*base_*/)); } constexpr auto end() const requires range<const V> { if constexpr (random_access_range<const V> && sized_range<const V>) return ranges::begin(/*base_*/) + ranges::distance(/*base_*/); else return common_iterator<iterator_t<const V>, sentinel_t<const V>>( ranges::end(/*base_*/)); } constexpr auto size() requires sized_range<V> { return ranges::size(/*base_*/); } constexpr auto size() const requires sized_range<const V> { return ranges::size(/*base_*/); } constexpr auto reserve_hint() requires approximately_sized_range<V> { return ranges::reserve_hint(/*base_*/); } constexpr auto reserve_hint() const requires approximately_sized_range<const V> { return ranges::reserve_hint(/*base_*/); } }; template<class R> common_view(R&&) -> common_view<views::all_t<R>>; }
クラステンプレート std::ranges::reverse_view
namespace std::ranges { template<view V> requires bidirectional_range<V> class reverse_view : public view_interface<reverse_view<V>> { private: V /*base_*/ = V(); // 説明専用 public: reverse_view() requires default_initializable<V> = default; constexpr explicit reverse_view(V r); constexpr V base() const& requires copy_constructible<V> { return /*base_*/; } constexpr V base() && { return std::move(/*base_*/); } constexpr reverse_iterator<iterator_t<V>> begin(); constexpr reverse_iterator<iterator_t<V>> begin() requires common_range<V>; constexpr auto begin() const requires common_range<const V>; constexpr reverse_iterator<iterator_t<V>> end(); constexpr auto end() const requires common_range<const V>; constexpr auto size() requires sized_range<V> { return ranges::size(/*base_*/); } constexpr auto size() const requires sized_range<const V> { return ranges::size(/*base_*/); } constexpr auto reserve_hint() requires approximately_sized_range<V> { return ranges::reserve_hint(/*base_*/); } constexpr auto reserve_hint() const requires approximately_sized_range<const V> { return ranges::reserve_hint(/*base_*/); } }; template<class R> reverse_view(R&&) -> reverse_view<views::all_t<R>>; }
クラステンプレート std::ranges::as_const_view
namespace std::ranges { template<view V> requires input_range<V> class as_const_view : public view_interface<as_const_view<V>> { V /*base_*/ = V(); // 説明専用 public: as_const_view() requires default_initializable<V> = default; constexpr explicit as_const_view(V base); constexpr V base() const& requires copy_constructible<V> { return /*base_*/; } constexpr V base() && { return std::move(/*base_*/); } constexpr auto begin() requires(!/*simple-view*/<V>) { return ranges::cbegin(/*base_*/); } constexpr auto begin() const requires range<const V> { return ranges::cbegin(/*base_*/); } constexpr auto end() requires(!/*simple-view*/<V>) { return ranges::cend(/*base_*/); } constexpr auto end() const requires range<const V> { return ranges::cend(/*base_*/); } constexpr auto size() requires sized_range<V> { return ranges::size(/*base_*/); } constexpr auto size() const requires sized_range<const V> { return ranges::size(/*base_*/); } constexpr auto reserve_hint() requires approximately_sized_range<V> { return ranges::reserve_hint(/*base_*/); } constexpr auto reserve_hint() const requires approximately_sized_range<const V> { return ranges::reserve_hint(/*base_*/); } }; template<class R> as_const_view(R&&) -> as_const_view<views::all_t<R>>; }
クラステンプレート std::ranges::elements_view
namespace std::ranges { template<class T, size_t N> concept /*has-tuple-element*/ = // 説明専用 /*タプルライク*/<T> && N < tuple_size_v<T>; template<class T, size_t N> concept /*returnable-element*/ = // 説明専用 is_reference_v<T> || move_constructible<tuple_element_t<N, T>>; template<input_range V, size_t N> requires view<V> && /*has-tuple-element*/<range_value_t<V>, N> && /*has-tuple-element*/<remove_reference_t<range_reference_t<V>>, N> && /*returnable-element*/<range_reference_t<V>, N> class elements_view : public view_interface<elements_view<V, N>> { public: elements_view() requires default_initializable<V> = default; constexpr explicit elements_view(V base); constexpr V base() const& requires copy_constructible<V> { return /*base_*/; } constexpr V base() && { return std::move(/*base_*/); } constexpr auto begin() requires(!/*シンプルビュー*/<V>) { return /*イテレータ*/<false>(ranges::begin(/*base_*/)); } constexpr auto begin() const requires range<const V> { return /*イテレータ*/<true>(ranges::begin(/*base_*/)); } constexpr auto end() requires(!/*シンプルビュー*/<V> && !common_range<V>) { return /*sentinel*/<false>{ ranges::end(/*base_*/) }; } constexpr auto end() requires(!/*シンプルビュー*/<V> && common_range<V>) { return /*イテレータ*/<false>{ ranges::end(/*base_*/) }; } constexpr auto end() const requires range<const V> { return /*sentinel*/<true>{ ranges::end(/*base_*/) }; } constexpr auto end() const requires common_range<const V> { return /*イテレータ*/<true>{ ranges::end(/*base_*/) }; } constexpr auto size() requires sized_range<V> { return ranges::size(/*base_*/); } constexpr auto size() const requires sized_range<const V> { return ranges::size(/*base_*/); } constexpr auto reserve_hint() requires approximately_sized_range<V> { return ranges::reserve_hint(/*base_*/); } constexpr auto reserve_hint() const requires approximately_sized_range<const V> { return ranges::reserve_hint(/*base_*/); } private: // クラステンプレート elements_view::iterator template<bool> class /*イテレータ*/; // 説明専用 // クラステンプレート elements_view::sentinel template<bool> class /*sentinel*/; // 説明専用 V /*base_*/ = V(); // 説明専用 }; }
クラステンプレート std::ranges::elements_view::iterator
namespace std::ranges { template<input_range V, size_t N> requires view<V> && /*has-tuple-element*/<range_value_t<V>, N> && /*has-tuple-element*/<remove_reference_t<range_reference_t<V>>, N> && /*returnable-element*/<range_reference_t<V>, N> template<bool Const> class elements_view<V, N>::/*イテレータ*/ { using /*ベース*/ = /*おそらくconst*/<Const, V>; // 説明専用 iterator_t</*ベース*/> /*current_*/ = iterator_t</*ベース*/>(); // 説明専用 static constexpr decltype(auto) /*要素取得*/( const iterator_t</*ベース*/>& i); // 説明専用 public: using iterator_concept = /* 詳細は説明を参照 */; using iterator_category = /* 説明を参照 */; // 常に存在するとは限らない using value_type = remove_cvref_t<tuple_element_t<N, range_value_t</*ベース*/>>>; using difference_type = range_difference_t</*ベース*/>; /*イテレータ*/() requires default_initializable<iterator_t</*ベース*/>> = default; constexpr explicit /*イテレータ*/(iterator_t</*ベース*/> current); constexpr /*イテレータ*/(/*イテレータ*/<!Const> i) requires Const && convertible_to<iterator_t<V>, iterator_t</*ベース*/>>; constexpr const iterator_t</*ベース*/>& base() const& noexcept; constexpr iterator_t</*ベース*/> base() &&; constexpr decltype(auto) operator*() const { return /*要素取得*/(/*current_*/); } constexpr /*イテレータ*/& operator++(); constexpr void operator++(int); constexpr /*イテレータ*/ operator++(int) requires forward_range</*ベース*/>; constexpr /*イテレータ*/& operator--() requires bidirectional_range</*ベース*/>; constexpr /*イテレータ*/ operator--(int) requires bidirectional_range</*ベース*/>; constexpr /*イテレータ*/& operator+=(difference_type x) requires random_access_range</*ベース*/>; constexpr /*イテレータ*/& operator-=(difference_type x) requires random_access_range</*ベース*/>; constexpr decltype(auto) operator[](difference_type n) const requires random_access_range</*ベース*/> { return /*要素取得*/(/*current_*/ + n); } friend constexpr bool operator==(const /*イテレータ*/& x, const /*イテレータ*/& y) requires equality_comparable<iterator_t</*ベース*/>>; friend constexpr bool operator<(const /*イテレータ*/& x, const /*iterator*/& y) requires random_access_range</*ベース*/>; friend constexpr bool operator>(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr bool operator<=(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr bool operator>=(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr auto operator<=>(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/> && three_way_comparable<iterator_t</*ベース*/>> ; friend constexpr /*イテレータ*/ operator+(const /*イテレータ*/& x, difference_type y) requires random_access_range</*ベース*/>; friend constexpr /*イテレータ*/ operator+(difference_type x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr /*イテレータ*/ operator-(const /*イテレータ*/& x, difference_type y) requires random_access_range</*ベース*/>; friend constexpr difference_type operator-(const /*イテレータ*/& x, const /*イテレータ*/& y) requires sized_sentinel_for<iterator_t</*ベース*/>, iterator_t</*ベース*/>>; }; }
クラステンプレート std::ranges::elements_view::sentinel
namespace std::ranges { template<input_range V, size_t N> requires view<V> && /*has-tuple-element*/<range_value_t<V>, N> && /*has-tuple-element*/<remove_reference_t<range_reference_t<V>>, N> && /*returnable-element*/<range_reference_t<V>, N> template<bool Const> class elements_view<V, N>::/*sentinel*/ { private: using /*Base*/ = /*maybe-const*/<Const, V>; // 説明専用 sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>(); // 説明専用 public: /*sentinel*/() = default; constexpr explicit /*sentinel*/(sentinel_t</*Base*/> end); constexpr /*sentinel*/(/*sentinel*/<!Const> other) requires Const && convertible_to<sentinel_t<V>, sentinel_t</*Base*/>>; constexpr sentinel_t</*Base*/> base() const; template<bool OtherConst> requires sentinel_for<sentinel_t</*Base*/>, iterator_t</*maybe-const*/<OtherConst, V>>> friend constexpr bool operator==(const /*iterator*/<OtherConst>& x, const /*sentinel*/& y); template<bool OtherConst> requires sized_sentinel_for<sentinel_t</*Base*/>, iterator_t</*maybe-const*/<OtherConst, V>>> friend constexpr range_difference_t</*maybe-const*/<OtherConst, V>> operator-( const /*iterator*/<OtherConst>& x, const /*sentinel*/& y); template<bool OtherConst> requires sized_sentinel_for<sentinel_t</*Base*/>, iterator_t</*maybe-const*/<OtherConst, V>>> friend constexpr range_difference_t</*maybe-const*/<OtherConst, V>> operator-( const /*sentinel*/& x, const /*iterator*/<OtherConst>& y); }; }
クラステンプレート std::ranges::enumerate_view
namespace std::ranges { template<view V> requires /*range-with-movable-references*/<V> class enumerate_view : public view_interface<enumerate_view<V>> { V /*base_*/ = V(); // 説明専用 // クラステンプレート enumerate_view::iterator template<bool Const> class /*イテレータ*/; // 説明専用 // クラステンプレート enumerate_view::sentinel template<bool Const> class /*sentinel*/; // 説明専用 public: constexpr enumerate_view() requires default_initializable<V> = default; constexpr explicit enumerate_view(V base); constexpr auto begin() requires(!/*シンプルビュー*/<V>) { return /*イテレータ*/<false>(ranges::begin(/*base_*/), 0); } constexpr auto begin() const requires /*範囲と移動可能な参照*/<const V> { return /*イテレータ*/<true>(ranges::begin(/*base_*/), 0); } constexpr auto end() requires(!/*シンプルビュー*/<V>) { if constexpr (forward_range<V> && common_range<V> && sized_range<V>) return /*イテレータ*/<false>(ranges::end(/*base_*/), ranges::distance(/*base_*/)); else return /*sentinel*/<false>(ranges::end(/*base_*/)); } constexpr auto end() const requires /*range-with-movable-references*/<const V> { if constexpr (forward_range<const V> && common_range<const V> && sized_range<const V>) return /*イテレータ*/<true>(ranges::end(/*base_*/), ranges::distance(/*base_*/)); else return /*sentinel*/<true>(ranges::end(/*base_*/)); } constexpr auto size() requires sized_range<V> { return ranges::size(/*base_*/); } constexpr auto size() const requires sized_range<const V> { return ranges::size(/*base_*/); } constexpr auto reserve_hint() requires approximately_sized_range<V> { return ranges::reserve_hint(/*base_*/); } constexpr auto reserve_hint() const requires approximately_sized_range<const V> { return ranges::reserve_hint(/*base_*/); } constexpr V base() const& requires copy_constructible<V> { return /*base_*/; } constexpr V base() && { return std::move(/*base_*/); } }; template<class R> enumerate_view(R&&) -> enumerate_view<views::all_t (注:指定された条件により、HTMLタグ・属性は保持され、C++固有用語は翻訳せず、コードタグ内のテキストも翻訳対象外のため、元のテキストをそのまま保持しています)<R>>; }
クラステンプレート std::ranges::enumerate_view::iterator
namespace std::ranges { template<view V> requires /*範囲と移動可能な参照*/<V> template<bool Const> class enumerate_view<V>::/*イテレータ*/ { using /*ベース*/ = /*maybe-const*/<Const, V>; // 説明専用 public: using iterator_category = input_iterator_tag; using iterator_concept = /* 詳細は説明を参照 */; using difference_type = range_difference_t</*ベース*/>; using value_type = tuple<difference_type, range_value_t</*ベース*/>>; private: using /*参照型*/ = // 説明専用 tuple<difference_type, range_reference_t</*ベース*/>>; iterator_t</*ベース*/> /*current_*/ = iterator_t</*ベース*/>(); // 説明専用 difference_type /*pos_*/ = 0; // 説明専用 constexpr explicit /*イテレータ*/(iterator_t</*ベース*/> current, difference_type pos); // 説明専用 public: /*イテレータ*/() requires default_initializable<iterator_t</*ベース*/>> = default; constexpr /*イテレータ*/(/*イテレータ*/<!Const> i) requires Const && convertible_to<iterator_t<V>, iterator_t</*ベース*/>>; constexpr const iterator_t</*ベース*/>& base() const& noexcept; constexpr iterator_t</*ベース*/> base() &&; constexpr difference_type index() const noexcept; constexpr auto operator*() const { return /*参照型*/(/*位置_*/, */*current_*/); } constexpr /*イテレータ*/& operator++(); constexpr void operator++(int); constexpr /*イテレータ*/ operator++(int) requires forward_range</*ベース*/>; constexpr /*イテレータ*/& operator--() requires bidirectional_range</*ベース*/>; constexpr /*イテレータ*/ operator--(int) requires bidirectional_range</*ベース*/>; constexpr /*イテレータ*/& operator+=(difference_type x) requires random_access_range</*ベース*/>; constexpr /*イテレータ*/& operator-=(difference_type x) requires random_access_range</*ベース*/>; constexpr auto operator[](difference_type n) const requires random_access_range</*ベース*/> { return /*参照型*/(/*pos_*/ + n, /*current_*/[n]); } friend constexpr bool operator==(const /*イテレータ*/& x, const /*イテレータ*/& y) noexcept; friend constexpr strong_ordering operator<=>(const /*イテレータ*/& x, const /*イテレータ*/& y) noexcept; friend constexpr /*イテレータ*/ operator+(const /*イテレータ*/& x, difference_type y) requires random_access_range</*ベース*/>; friend constexpr /*イテレータ*/ operator+(difference_type x, const /*イテレータ*/& y) requires random_access_range</*Base*/>; friend constexpr /*イテレータ*/ operator-(const /*イテレータ*/& x, difference_type y) requires random_access_range</*ベース*/>; friend constexpr difference_type operator-(const /*イテレータ*/& x, const /*イテレータ*/& y) noexcept; friend constexpr auto iter_move(const /*イテレータ*/& i) noexcept( noexcept(ranges::iter_move (注:指定された条件により、HTMLタグ・属性は翻訳せず、C++固有用語も保持されています。表示されるテキスト「ranges::iter_move」はC++標準ライブラリの要素名であるため、日本語訳は行いません)(i./*current_*/)) && is_nothrow_move_constructible_v<range_rvalue_reference_t</*ベース*/>>) { return tuple<difference_type, range_rvalue_reference_t</*ベース*/>>( i./*pos_*/, ranges::iter_move (注:原文のテキスト「ranges::iter_move」はC++固有の用語であり、HTMLタグ・属性も翻訳対象外のため、翻訳を実施していません)(i./*current_*/)); } }; }
クラステンプレート std::ranges::enumerate_view::sentinel
namespace std::ranges { template<view V> requires /*range-with-movable-references*/<V> template<bool Const> class enumerate_view<V>::/*sentinel*/ { using /*Base*/ = /*maybe-const*/<Const, V>; // 説明専用 sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>(); // 説明専用 constexpr explicit /*sentinel*/(sentinel_t</*Base*/> end); // 説明専用 public: /*sentinel*/() = default; constexpr /*sentinel*/(/*sentinel*/<!Const> other) requires Const && convertible_to<sentinel_t<V>, sentinel_t</*Base*/>>; constexpr sentinel_t</*Base*/> base() const; template<bool OtherConst> requires sentinel_for<sentinel_t</*Base*/>, iterator_t</*maybe-const*/<OtherConst, V>>> friend constexpr bool operator==(const /*iterator*/<OtherConst>& x, const /*sentinel*/& y); template<bool OtherConst> requires sized_sentinel_for<sentinel_t</*Base*/>, iterator_t</*maybe-const*/<OtherConst, V>>> friend constexpr range_difference_t</*maybe-const*/<OtherConst, V>> operator-( const /*iterator*/<OtherConst>& x, const /*sentinel*/& y); template<bool OtherConst> requires sized_sentinel_for<sentinel_t</*Base*/>, iterator_t</*maybe-const*/<OtherConst, V>>> friend constexpr range_difference_t</*maybe-const*/<OtherConst, V>> operator-( const /*sentinel*/& x, const /*iterator*/<OtherConst>& y); }; }
クラステンプレート std::ranges::zip_view
namespace std::ranges { template<class... Rs> concept /*zip-is-common*/ = // 説明専用 (sizeof...(Rs) == 1 && (common_range<Rs> && ...)) || (!(bidirectional_range<Rs> && ...) && (common_range<Rs> && ...)) || ((random_access_range<Rs> && ...) && (sized_range<Rs> && ...)); template<input_range... ビュー> requires(view<Views> && ...) && (sizeof...(Views) > 0) class zip_view : public view_interface<zip_view<Views...>> { tuple<Views...> /*views_*/; // 説明専用 // クラステンプレート zip_view::iterator template<bool> class /*イテレータ*/; // 説明専用 // クラステンプレート zip_view::sentinel template<bool> class /*sentinel*/; // 説明専用 public: zip_view() = default; constexpr explicit zip_view(Views... views); constexpr auto begin() requires(!(/*シンプルビュー*/<Views> && ...)) { return /*イテレータ*/<false>(/*タプル変換*/(ranges::begin, /*views_*/)); } constexpr auto begin() const requires(range<const Views> && ...) { return /*イテレータ*/<true>(/*タプル変換*/(ranges::begin, /*views_*/)); } constexpr auto end() requires(!(/*シンプルビュー*/<Views> && ...)) { if constexpr (!/*zip-is-common*/<Views...>) { return /*sentinel*/<false>(/*タプル変換*/(ranges::end, /*ビュー_*/)); } else if constexpr ((random_access_range<Views> && ...)) { return begin() + iter_difference_t</*イテレータ*/<false>>(size()); } else { return /*イテレータ*/<false>(/*タプル変換*/(ranges::end, /*views_*/)); } } constexpr auto end() const requires(range<const Views> && ...) { if constexpr (!/*zip-is-common*/<const Views...>) { return /*sentinel*/<true>(/*タプル変換*/(ranges::end, /*views_*/)); } else if constexpr ((random_access_range<const Views> && ...)) { return begin() + iter_difference_t</*イテレータ*/<true>>(size()); } else { return /*イテレータ*/<true>(/*タプル変換*/(ranges::end, /*views_*/)); } } constexpr auto size() requires(sized_range<Views> && ...); constexpr auto size() const requires(sized_range<const Views> && ...); }; template<class... Rs> zip_view(Rs&&...) -> zip_view<views::all_t<Rs>...>; }
クラステンプレート std::ranges::zip_view::iterator
namespace std::ranges { template<input_range... ビュー> requires(view<Views> && ...) && (sizeof...(Views) > 0) template<bool Const> class zip_view<Views...>::/*イテレータ*/ { tuple<iterator_t</*maybe-const*/<Const, Views>>...> /*current_*/; // 説明専用 constexpr explicit /*イテレータ*/(tuple<iterator_t</*maybe-const*/<Const, Views>>...>); // 説明専用 public: using iterator_category = input_iterator_tag; // 常に存在するとは限らない using iterator_concept = /* 詳細は説明を参照 */; using value_type = tuple<range_value_t</*maybe-const*/<Const, Views>>...>; using difference_type = common_type_t<range_difference_t</*maybe-const*/<Const, Views>>...>; /*イテレータ*/() = default; constexpr /*イテレータ*/(/*イテレータ*/<!Const> i) requires Const && (convertible_to<iterator_t<Views>, iterator_t<const Views>> && ...); constexpr auto operator*() const; constexpr /*イテレータ*/& operator++(); constexpr void operator++(int); constexpr /*イテレータ*/ operator++(int) requires /*全前方*/<Const, Views...>; constexpr /*イテレータ*/& operator--() requires /*双方向すべて*/<Const, Views...>; constexpr /*イテレータ*/ operator--(int) requires /*双方向すべて*/<Const, Views...>; constexpr /*イテレータ*/& operator+=(difference_type x) requires /*全ランダムアクセス*/<Const, Views...>; constexpr /*イテレータ*/& operator-=(difference_type x) requires /*全ランダムアクセス*/<Const, Views...>; constexpr auto operator[](difference_type n) const requires /*全ランダムアクセス*/<Const, Views...>; friend constexpr bool operator==(const /*イテレータ*/& x, const /*イテレータ*/& y) requires(equality_comparable<iterator_t</*maybe-const*/<Const, Views>>> && ...); friend constexpr auto operator<=>(const /*イテレータ*/& x, const /*イテレータ*/& y) requires /*全ランダムアクセス*/<Const, Views...>; friend constexpr /*イテレータ*/ operator+(const /*イテレータ*/& i, difference_type n) requires /*全ランダムアクセス*/<Const, Views...>; friend constexpr /*イテレータ*/ operator+(difference_type n, const /*イテレータ*/& i) requires /*全ランダムアクセス*/<Const, Views...>; friend constexpr /*イテレータ*/ operator-(const /*イテレータ*/& i, difference_type n) requires /*全ランダムアクセス*/<Const, Views...>; friend constexpr difference_type operator-(const /*イテレータ*/& x, const /*イテレータ*/& y) requires(sized_sentinel_for<iterator_t</*maybe-const*/<Const, Views>>, iterator_t</*maybe-const*/<Const, Views>>> && ...); friend constexpr auto iter_move(const /*イテレータ*/& i) noexcept( /* 詳細は説明を参照 */); friend constexpr void iter_swap(const /*イテレータ*/& l, const /*イテレータ*/& r) noexcept(/* 詳細は説明を参照 */) requires(indirectly_swappable<iterator_t</*maybe-const*/<Const, Views>>> && ...); }; }
クラステンプレート std::ranges::zip_view::sentinel
namespace std::ranges { template<input_range... Views> requires(view<Views> && ...) && (sizeof...(Views) > 0) template<bool Const> class zip_view<Views...>::/*sentinel*/ { tuple<sentinel_t</*maybe-const*/<Const, Views>>...> /*end_*/; // 説明専用 constexpr explicit /*sentinel*/( tuple<sentinel_t</*maybe-const*/<Const, Views>>...> end); // 説明専用 public: /*sentinel*/() = default; constexpr /*sentinel*/(/*sentinel*/<!Const> i) requires Const && (convertible_to<sentinel_t<Views>, sentinel_t<const Views>> && ...); template<bool OtherConst> requires(sentinel_for<sentinel_t</*maybe-const*/<Const, Views>>, iterator_t</*maybe-const*/<OtherConst, Views>>> && ...) friend constexpr bool operator==(const /*iterator*/<OtherConst>& x, const /*sentinel*/& y); template<bool OtherConst> requires(sized_sentinel_for<sentinel_t</*maybe-const*/<Const, Views>>, iterator_t</*maybe-const*/<OtherConst, Views>>> && ...) friend constexpr common_type_t< range_difference_t</*maybe-const*/<OtherConst, Views>>...> operator-(const /*iterator*/<OtherConst>& x, const /*sentinel*/& y); template<bool OtherConst> requires(sized_sentinel_for<sentinel_t</*maybe-const*/<Const, Views>>, iterator_t</*maybe-const*/<OtherConst, Views>>> && ...) friend constexpr common_type_t< range_difference_t</*maybe-const*/<OtherConst, Views>>...> operator-(const /*sentinel*/& y, const /*iterator*/<OtherConst>& x); }; }
クラステンプレート std::ranges::zip_transform_view
namespace std::ranges { template<move_constructible F, input_range... ビュー> requires(view<Views> && ...) && (sizeof...(Views) > 0) && is_object_v<F> && regular_invocable<F&, range_reference_t<Views>...> && /*参照可能*/<invoke_result_t<F&, range_reference_t<Views>...>> class zip_transform_view : public view_interface<zip_transform_view<F, Views...>> { /*移動可能ボックス*/<F> /*fun_*/; // 説明専用 zip_view<Views...> /*zip_*/; // 説明専用 using /*InnerView*/ = zip_view<Views...>; // 説明専用 template<bool Const> using /*ziperator*/ = iterator_t</*maybe-const*/<Const, /*内部ビュー*/>>; // 説明専用 template<bool Const> using /*ゼンティネル*/ = sentinel_t</*maybe-const*/<Const, /*InnerView*/>>; // 説明専用 // クラステンプレート zip_transform_view::iterator template<bool> class /*イテレータ*/; // 説明専用 // クラステンプレート zip_transform_view::sentinel template<bool> class /*sentinel*/; // 説明専用 public: zip_transform_view() = default; constexpr explicit zip_transform_view(F fun, Views... views); constexpr auto begin() { return /*イテレータ*/<false>(*this, /*zip_*/.begin()); } constexpr auto begin() const requires range<const /*内部ビュー*/> && regular_invocable<const F&, range_reference_t<const Views>...> { return /*イテレータ*/<true>(*this, /*zip_*/.begin()); } constexpr auto end() { if constexpr (common_range</*InnerView*/>) { return /*イテレータ*/<false>(*this, /*zip_*/.end()); } else { return /*sentinel*/<false>(/*zip_*/.end()); } } constexpr auto end() const requires range<const /*内部ビュー*/> && regular_invocable<const F&, range_reference_t<const Views>...> { if constexpr (common_range<const /*InnerView*/>) { return /*イテレータ*/<true>(*this, /*zip_*/.end()); } else { return /*sentinel*/<true>(/*zip_*/.end()); } } constexpr auto size() requires sized_range</*内部ビュー*/> { return /*zip_*/.size(); } constexpr auto size() const requires sized_range<const /*内部ビュー*/> { return /*zip_*/.size(); } }; template<class F, class... Rs> zip_transform_view(F, Rs&&...) -> zip_transform_view<F, views::all_t<Rs>...>; }
クラステンプレート std::ranges::zip_transform_view::iterator
namespace std::ranges { template<move_constructible F, input_range... ビュー> requires(view<Views> && ...) && (sizeof...(Views) > 0) && is_object_v<F> && regular_invocable<F&, range_reference_t<Views>...> && /*参照可能*/<invoke_result_t<F&, range_reference_t<Views>...>> template<bool Const> class zip_transform_view<F, Views...>::/*イテレータ*/ { using /*親クラス*/ = /*maybe-const*/<Const, zip_transform_view>; // 説明専用 using /*ベース*/ = /*maybe-const*/<Const, /*InnerView*/>; // 説明専用 /*親クラス*/* /*親_*/ = nullptr; // 説明専用 /*ziperator*/<Const> /*inner_*/; // 説明専用 constexpr /*イテレータ*/(/*親*/& parent, /*ziperator*/<Const> inner); // 説明専用 public: using iterator_category = /* 詳細は説明を参照 */; // 常に存在するとは限らない using iterator_concept = typename /*ziperator*/<Const>::iterator_concept; using value_type = remove_cvref_t< invoke_result_t</*maybe-const*/<Const, F>&, range_reference_t</*maybe-const*/<Const, Views>>...>>; using difference_type = range_difference_t</*ベース*/>; /*イテレータ*/() = default; constexpr /*イテレータ*/(/*イテレータ*/<!Const> i) requires Const && convertible_to</*ziperator*/<false>, /*ziperator*/<Const>>; constexpr decltype(auto) operator*() const noexcept(/* 詳細は説明を参照 */); constexpr /*イテレータ*/& operator++(); constexpr void operator++(int); constexpr /*イテレータ*/ operator++(int) requires forward_range</*ベース*/>; constexpr /*イテレータ*/& operator--() requires bidirectional_range</*ベース*/>; constexpr /*イテレータ*/ operator--(int) requires bidirectional_range</*ベース*/>; constexpr /*イテレータ*/& operator+=(difference_type x) requires random_access_range</*ベース*/>; constexpr /*イテレータ*/& operator-=(difference_type x) requires random_access_range</*ベース*/>; constexpr decltype(auto) operator[](difference_type n) const requires random_access_range</*ベース*/>; friend constexpr bool operator==(const /*イテレータ*/& x, const /*イテレータ*/& y) requires equality_comparable</*ziperator*/<Const>>; friend constexpr auto operator<=>(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr /*イテレータ*/ operator+(const /*イテレータ*/& i, difference_type n) requires random_access_range</*ベース*/>; friend constexpr /*イテレータ*/ operator+(difference_type n, const /*イテレータ*/& i) requires random_access_range</*ベース*/>; friend constexpr /*イテレータ*/ operator-(const /*イテレータ*/& i, difference_type n) requires random_access_range</*ベース*/>; friend constexpr difference_type operator-(const /*イテレータ*/& x, const /*イテレータ*/& y) requires sized_sentinel_for</*ziperator*/<Const>, /*ziperator*/<Const>>; }; }
クラステンプレート std::ranges::zip_transform_view::sentinel
namespace std::ranges { template<move_constructible F, input_range... Views> requires(view<Views> && ...) && (sizeof...(Views) > 0) && is_object_v<F> && regular_invocable<F&, range_reference_t<Views>...> && /*can-reference*/<invoke_result_t<F&, range_reference_t<Views>...>> template<bool Const> class zip_transform_view<F, Views...>::/*sentinel*/ { /*zentinel*/<Const> /*inner_*/; // 説明専用 constexpr explicit /*sentinel*/(/*zentinel*/<Const> inner); // 説明専用 public: /*sentinel*/() = default; constexpr /*sentinel*/(/*sentinel*/<!Const> i) requires Const && convertible_to</*zentinel*/<false>, /*zentinel*/<Const>>; template<bool OtherConst> requires sentinel_for</*zentinel*/<Const>, /*ziperator*/<OtherConst>> friend constexpr bool operator==(const /*iterator*/<OtherConst>& x, const /*sentinel*/& y); template<bool OtherConst> requires sized_sentinel_for</*zentinel*/<Const>, /*ziperator*/<OtherConst>> friend constexpr range_difference_t</*maybe-const*/<OtherConst, /*InnerView*/>> operator-(const /*iterator*/<OtherConst>& x, const /*sentinel*/& y); template<bool OtherConst> requires sized_sentinel_for</*zentinel*/<Const>, /*ziperator*/<OtherConst>> friend constexpr range_difference_t</*maybe-const*/<OtherConst, /*InnerView*/>> operator-(const /*sentinel*/& x, const /*iterator*/<OtherConst>& y); }; }
クラステンプレート std::ranges::adjacent_view
namespace std::ranges { template<forward_range V, size_t N> requires view<V> && (N > 0) class adjacent_view : public view_interface<adjacent_view<V, N>> { V /*base_*/ = V(); // 説明専用 // クラステンプレート adjacent_view::iterator template<bool> class /*iterator*/; // 説明専用 // クラステンプレート adjacent_view::sentinel template<bool> class /*sentinel*/; // 説明専用 struct /*as-sentinel*/ {}; // 説明専用 public: adjacent_view() requires default_initializable<V> = default; constexpr explicit adjacent_view(V base); constexpr V base() const& requires copy_constructible<V> { return /*base_*/; } constexpr V base() && { return std::move(/*base_*/); } constexpr auto begin() requires(!/*simple-view*/<V>) { return /*iterator*/<false>(ranges::begin(/*base_*/), ranges::end(/*base_*/)); } constexpr auto begin() const requires range<const V> { return /*iterator*/<true>(ranges::begin(/*base_*/), ranges::end(/*base_*/)); } constexpr auto end() requires(!/*simple-view*/<V>) { if constexpr (common_range<V>) { return /*iterator*/<false>( /*as-sentinel*/{}, ranges::begin(/*base_*/), ranges::end(/*base_*/)); } else { return /*sentinel*/<false>(ranges::end(/*base_*/)); } } constexpr auto end() const requires range<const V> { if constexpr (common_range<const V>) { return /*iterator*/<true>( /*as-sentinel*/{}, ranges::begin(/*base_*/), ranges::end(/*base_*/)); } else { return /*sentinel*/<true>(ranges::end(/*base_*/)); } } constexpr auto size() requires sized_range<V>; constexpr auto size() const requires sized_range<const V>; constexpr auto reserve_hint() requires approximately_sized_range<V>; constexpr auto reserve_hint() const requires approximately_sized_range<const V>; }; }
クラステンプレート std::ranges::adjacent_view::iterator
namespace std::ranges { template<forward_range V, size_t N> requires view<V> && (N > 0) template<bool Const> class adjacent_view<V, N>::/*イテレータ*/ { using /*ベース*/ = /*maybe-const*/<Const, V>; // 説明専用 array<iterator_t</*ベース*/>, N> /*current_*/ = array<iterator_t</*ベース*/>, N>(); // 説明専用 constexpr /*イテレータ*/(iterator_t</*ベース*/> first, sentinel_t</*ベース*/> last); // 説明専用 constexpr /*イテレータ*/(/*as-sentinel*/, iterator_t</*ベース*/> first, iterator_t</*ベース*/> last); // 説明専用 public: using iterator_category = input_iterator_tag; using iterator_concept = /* 詳細は説明を参照 */; using value_type = tuple</*REPEAT*/(range_value_t</*ベース*/>, N)...>; using difference_type = range_difference_t</*ベース*/>; /*イテレータ*/() = default; constexpr /*イテレータ*/(/*イテレータ*/<!Const> i) requires Const && convertible_to<iterator_t<V>, iterator_t</*ベース*/>>; constexpr auto operator*() const; constexpr /*イテレータ*/& operator++(); constexpr /*イテレータ*/ operator++(int); constexpr /*イテレータ*/& operator--() requires bidirectional_range</*ベース*/>; constexpr /*イテレータ*/ operator--(int) requires bidirectional_range</*ベース*/>; constexpr /*イテレータ*/& operator+=(difference_type x) requires random_access_range</*ベース*/>; constexpr /*イテレータ*/& operator-=(difference_type x) requires random_access_range</*ベース*/>; constexpr auto operator[](difference_type n) const requires random_access_range</*ベース*/>; friend constexpr bool operator==(const /*イテレータ*/& x, const /*イテレータ*/& y); friend constexpr bool operator<(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr bool operator>(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr bool operator<=(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr bool operator>=(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr auto operator<=>(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/> && three_way_comparable<iterator_t</*ベース*/>> ; friend constexpr /*イテレータ*/ operator+(const /*イテレータ*/& i, difference_type n) requires random_access_range</*ベース*/>; friend constexpr /*イテレータ*/ operator+(difference_type n, const /*イテレータ*/& i) requires random_access_range</*ベース*/>; friend constexpr /*イテレータ*/ operator-(const /*イテレータ*/& i, difference_type n) requires random_access_range</*ベース*/>; friend constexpr difference_type operator-(const /*イテレータ*/& x, const /*イテレータ*/& y) requires sized_sentinel_for<iterator_t</*ベース*/>, iterator_t</*ベース*/>>; friend constexpr auto iter_move(const /*イテレータ*/& i) noexcept( /* 詳細は説明を参照 */); friend constexpr void iter_swap(const /*イテレータ*/& l, const /*イテレータ*/& r) noexcept(/* 詳細は説明を参照 */) requires indirectly_swappable<iterator_t</*ベース*/>>; }; }
クラステンプレート std::ranges::adjacent_view::sentinel
namespace std::ranges { template<forward_range V, size_t N> requires view<V> && (N > 0) template<bool Const> class adjacent_view<V, N>::/*sentinel*/ { using /*Base*/ = /*maybe-const*/<Const, V>; // 説明専用 sentinel_t</*Base*/> /*end_*/ = sentinel_t</*Base*/>(); // 説明専用 constexpr explicit /*sentinel*/(sentinel_t</*Base*/> end); // 説明専用 public: /*sentinel*/() = default; constexpr /*sentinel*/(/*sentinel*/<!Const> i) requires Const && convertible_to<sentinel_t<V>, sentinel_t</*Base*/>>; template<bool OtherConst> requires sentinel_for<sentinel_t</*Base*/>, iterator_t</*maybe-const*/<OtherConst, V>>> friend constexpr bool operator==(const /*iterator*/<OtherConst>& x, const /*sentinel*/& y); template<bool OtherConst> requires sized_sentinel_for<sentinel_t</*Base*/>, iterator_t</*maybe-const*/<OtherConst, V>>> friend constexpr range_difference_t</*maybe-const*/<OtherConst, V>> operator-( const /*iterator*/<OtherConst>& x, const /*sentinel*/& y); template<bool OtherConst> requires sized_sentinel_for<sentinel_t</*Base*/>, iterator_t</*maybe-const*/<OtherConst, V>>> friend constexpr range_difference_t</*maybe-const*/<OtherConst, V>> operator-( const /*sentinel*/& y, const /*iterator*/<OtherConst>& x); }; }
クラステンプレート std::ranges::adjacent_transform_view
namespace std::ranges { template<forward_range V, move_constructible F, size_t N> requires view<V> && (N > 0) && is_object_v<F> && regular_invocable<F&, /*REPEAT*/(range_reference_t<V>, N)...> && /*参照可能*/< invoke_result_t<F&, /*REPEAT*/(range_reference_t<V>, N)...>> class adjacent_transform_view : public view_interface<adjacent_transform_view<V, F, N>> { /*movable-box*/<F> /*fun_*/; // 説明専用 adjacent_view<V, N> /*inner_*/; // 説明専用 using /*InnerView*/ = adjacent_view<V, N>; // 説明専用 template<bool Const> using /*内部イテレータ*/ = iterator_t</*maybe-const*/<Const, /*InnerView*/>>; // 説明専用 template<bool Const> using /*inner-sentinel*/ = sentinel_t</*maybe-const*/<Const, /*InnerView*/>>; // 説明専用 // クラステンプレート adjacent_transform_view::iterator template<bool> class /*イテレータ*/; // 説明専用 // クラステンプレート adjacent_transform_view::sentinel template<bool> class /*sentinel*/; // 説明専用 public: adjacent_transform_view() = default; constexpr explicit adjacent_transform_view(V base, F fun); constexpr V base() const& requires copy_constructible<V> { return /*inner_*/.base(); } constexpr V base() && { return std::move(/*inner_*/).base(); } constexpr auto begin() { return /*イテレータ*/<false>(*this, /*inner_*/.begin()); } constexpr auto begin() const requires range<const /*InnerView*/> && regular_invocable<const F&, /*REPEAT*/(range_reference_t<const V>, N)...> { return /*イテレータ*/<true>(*this, /*inner_*/.begin()); } constexpr auto end() { if constexpr (common_range</*InnerView*/>) { return /*イテレータ*/<false>(*this, /*inner_*/.end()); } else { return /*sentinel*/<false>(/*inner_*/.end()); } } constexpr auto end() const requires range<const /*InnerView*/> && regular_invocable<const F&, /*REPEAT*/(range_reference_t<const V>, N)...> { if constexpr (common_range<const /*InnerView*/>) { return /*イテレータ*/<true>(*this, /*inner_*/.end()); } else { return /*sentinel*/<true>(/*inner_*/.end()); } } constexpr auto size() requires sized_range</*内部ビュー*/> { return /*inner_*/.size(); } constexpr auto size() const requires sized_range<const /*内部ビュー*/> { return /*inner_*/.size(); } constexpr auto reserve_hint() requires approximately_sized_range</*InnerView*/> { return /*inner_*/.reserve_hint(); } constexpr auto reserve_hint() const requires approximately_sized_range<const /*内部ビュー*/> { return /*inner_*/.reserve_hint(); } }; }
クラステンプレート std::ranges::adjacent_transform_view::iterator
namespace std::ranges { template<forward_range V, move_constructible F, size_t N> requires view<V> && (N > 0) && is_object_v<F> && regular_invocable<F&, /*REPEAT*/(range_reference_t<V>, N)...> && /*参照可能*/< invoke_result_t<F&, /*REPEAT*/(range_reference_t<V>, N)...>> template<bool Const> class adjacent_transform_view<V, F, N>::/*イテレータ*/ { using /*親クラス*/ = /*maybe-const*/<Const, adjacent_transform_view>; // 説明専用 using /*ベース*/ = /*おそらくconst*/<Const, V>; // 説明専用 /*親クラス*/* /*親_*/ = nullptr; // 説明専用 /*内部イテレータ*/<Const> /*inner_*/; // 説明専用 constexpr /*イテレータ*/(/*親クラス*/& parent, /*内部イテレータ*/<Const> inner); // 説明専用 public: using iterator_category = /* 詳細は説明を参照 */; using iterator_concept = typename /*内部イテレータ*/<Const>::iterator_concept; using value_type = remove_cvref_t<invoke_result_t</*maybe-const*/<Const, F>&, /*REPEAT*/(range_reference_t</*ベース*/>, N)...>>; using difference_type = range_difference_t</*ベース*/>; /*イテレータ*/() = default; constexpr /*イテレータ*/(/*イテレータ*/<!Const> i) requires Const && convertible_to</*内部イテレータ*/<false>, /*内部イテレータ*/<Const>>; constexpr decltype(auto) operator*() const noexcept(/* 詳細は説明を参照 */); constexpr /*イテレータ*/& operator++(); constexpr /*イテレータ*/ operator++(int); constexpr /*イテレータ*/& operator--() requires bidirectional_range</*ベース*/>; constexpr /*イテレータ*/ operator--(int) requires bidirectional_range</*ベース*/>; constexpr /*イテレータ*/& operator+=(difference_type x) requires random_access_range</*ベース*/>; constexpr /*イテレータ*/& operator-=(difference_type x) requires random_access_range</*ベース*/>; constexpr decltype(auto) operator[](difference_type n) const requires random_access_range</*ベース*/>; friend constexpr bool operator==(const /*イテレータ*/& x, const /*イテレータ*/& y); friend constexpr bool operator<(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr bool operator>(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr bool operator<=(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr bool operator>=(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr auto operator<=>(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/> && three_way_comparable</*内部イテレータ*/<Const>>; friend constexpr /*イテレータ*/ operator+(const /*イテレータ*/& i, difference_type n) requires random_access_range</*ベース*/>; friend constexpr /*イテレータ*/ operator+(difference_type n, const /*イテレータ*/& i) requires random_access_range</*ベース*/>; friend constexpr /*イテレータ*/ operator-(const /*イテレータ*/& i, difference_type n) requires random_access_range</*ベース*/>; friend constexpr difference_type operator-(const /*イテレータ*/& x, const /*イテレータ*/& y) requires sized_sentinel_for</*内部イテレータ*/<Const>, /*内部イテレータ*/<Const>>; }; }
クラステンプレート std::ranges::adjacent_transform_view::sentinel
namespace std::ranges { template<forward_range V, move_constructible F, size_t N> requires view<V> && (N > 0) && is_object_v<F> && regular_invocable<F&, /*REPEAT*/(range_reference_t<V>, N)...> && /*can-reference*/< invoke_result_t<F&, /*REPEAT*/(range_reference_t<V>, N)...>> template<bool Const> class adjacent_transform_view<V, F, N>::/*sentinel*/ { /*inner-sentinel*/<Const> /*inner_*/; // 説明専用 constexpr explicit /*sentinel*/(/*inner-sentinel*/<Const> inner); // 説明専用 public: /*sentinel*/() = default; constexpr /*sentinel*/(/*sentinel*/<!Const> i) requires Const && convertible_to</*inner-sentinel*/<false>, /*inner-sentinel*/<Const>>; template<bool OtherConst> requires sentinel_for</*inner-sentinel*/<Const>, /*inner-iterator*/<OtherConst>> friend constexpr bool operator==(const /*iterator*/<OtherConst>& x, const /*sentinel*/& y); template<bool OtherConst> requires sized_sentinel_for</*inner-sentinel*/<Const>, /*inner-iterator*/<OtherConst>> friend constexpr range_difference_t</*maybe-const*/<OtherConst, /*InnerView*/>> operator-(const /*iterator*/<OtherConst>& x, const /*sentinel*/& y); template<bool OtherConst> requires sized_sentinel_for</*inner-sentinel*/<Const>, /*inner-iterator*/<OtherConst>> friend constexpr range_difference_t</*maybe-const*/<OtherConst, /*InnerView*/>> operator-(const /*sentinel*/& x, const /*iterator*/<OtherConst>& y); }; }
クラステンプレート
std::ranges::chunk_view
の
input_range
s
向け実装
namespace std::ranges { template<class I> constexpr I /*div-ceil*/(I num, I denom) { // 説明専用 I r = num / denom; if (num % denom) ++r; return r; } template<view V> requires input_range<V> class chunk_view : public view_interface<chunk_view<V>> { V /*base_*/; // 説明専用 range_difference_t<V> /*n_*/; // 説明専用 range_difference_t<V> /*remainder_*/ = 0; // 説明専用 /*non-propagating-cache*/<iterator_t<V>> /*current_*/; // 説明専用 // class chunk_view::outer-iterator class /*outer-iterator*/; // 説明専用 // class chunk_view::inner-iterator class /*inner-iterator*/; // 説明専用 public: constexpr explicit chunk_view(V base, range_difference_t<V> n); constexpr V base() const& requires copy_constructible<V> { return /*base_*/; } constexpr V base() && { return std::move(/*base_*/); } constexpr /*outer-iterator*/ begin(); constexpr default_sentinel_t end() const noexcept; constexpr auto size() requires sized_range<V>; constexpr auto size() const requires sized_range<const V>; constexpr auto reserve_hint() requires approximately_sized_range<V>; constexpr auto reserve_hint() const requires approximately_sized_range<const V>; }; template<class R> chunk_view(R&&, range_difference_t<R>) -> chunk_view<views::all_t<R>>; }
クラステンプレート
std::ranges::chunk_view::outer_iterator
の
input_range
s
向け実装
namespace std::ranges { template<view V> requires input_range<V> class chunk_view<V>::/*outer-iterator*/ { chunk_view* /*parent_*/; // 説明専用 constexpr explicit /*outer-iterator*/(chunk_view& parent); // 説明専用 public: using iterator_concept = input_iterator_tag; using difference_type = range_difference_t<V>; // クラス chunk_view::outer-iterator::value_type struct value_type; /*outer-iterator*/(/*outer-iterator*/&&) = default; /*outer-iterator*/& operator=(/*outer-iterator*/&&) = default; constexpr value_type operator*() const; constexpr /*outer-iterator*/& operator++(); constexpr void operator++(int); friend constexpr bool operator==(const /*outer-iterator*/& x, default_sentinel_t); friend constexpr difference_type operator-(default_sentinel_t y, const /*outer-iterator*/& x) requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>; friend constexpr difference_type operator-(const /*outer-iterator*/& x, default_sentinel_t y) requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>; }; }
クラステンプレート
std::ranges::chunk_view::outer_iterator::value_type
の
input_range
s
向け仕様
namespace std::ranges { template<view V> requires input_range<V> struct chunk_view<V>::/*outer-iterator*/::value_type : view_interface<value_type> { private: chunk_view* /*parent_*/; // 説明専用 constexpr explicit value_type(chunk_view& parent); // 説明専用 public: constexpr /*inner-iterator*/ begin() const noexcept; constexpr default_sentinel_t end() const noexcept; constexpr auto size() const requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>; }; }
クラステンプレート
std::ranges::chunk_view::inner_iterator
の
input_range
s
向け実装
namespace std::ranges { template<view V> requires input_range<V> class chunk_view<V>::/*inner-iterator*/ { chunk_view* /*parent_*/; // 説明専用 constexpr explicit /*inner-iterator*/(chunk_view& parent) noexcept; // 説明専用 public: using iterator_concept = input_iterator_tag; using difference_type = range_difference_t<V>; using value_type = range_value_t<V>; /*inner-iterator*/(/*inner-iterator*/&&) = default; /*inner-iterator*/& operator=(/*inner-iterator*/&&) = default; constexpr const iterator_t<V>& base() const&; constexpr range_reference_t<V> operator*() const; constexpr /*inner-iterator*/& operator++(); constexpr void operator++(int); friend constexpr bool operator==(const /*inner-iterator*/& x, default_sentinel_t); friend constexpr difference_type operator-(default_sentinel_t y, const /*inner-iterator*/& x) requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>; friend constexpr difference_type operator-(const /*inner-iterator*/& x, default_sentinel_t y) requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>; friend constexpr range_rvalue_reference_t<V> iter_move(const /*inner-iterator*/& i) noexcept( noexcept(ranges::iter_move(*i./*parent_*/->/*current_*/))); friend constexpr void iter_swap(const /*inner-iterator*/& x, const /*inner-iterator*/& y) noexcept(noexcept( ranges::iter_swap(*x./*parent_*/->/*current_*/, *y./*parent_*/->/*current_*/))) requires indirectly_swappable<iterator_t<V>>; }; }
クラステンプレート
std::ranges::chunk_view
for
forward_range
s
namespace std::ranges { template<view V> requires forward_range<V> class chunk_view<V> : public view_interface<chunk_view<V>> { V /*base_*/; // 説明専用 range_difference_t<V> /*n_*/; // 説明専用 // クラステンプレート chunk_view::iterator template<bool> class /*iterator*/; // 説明専用 public: constexpr explicit chunk_view(V base, range_difference_t<V> n); constexpr V base() const& requires copy_constructible<V> { return /*base_*/; } constexpr V base() && { return std::move(/*base_*/); } constexpr auto begin() requires(!/*simple-view*/<V>) { return /*iterator*/<false>(this, ranges::begin(/*base_*/)); } constexpr auto begin() const requires forward_range<const V> { return /*iterator*/<true>(this, ranges::begin(/*base_*/)); } constexpr auto end() requires(!/*simple-view*/<V>) { if constexpr (common_range<V> && sized_range<V>) { auto missing = (/*n_*/ - ranges::distance(/*base_*/) % /*n_*/) % /*n_*/; return /*iterator*/<false>(this, ranges::end(/*base_*/), missing); } else if constexpr (common_range<V> && !bidirectional_range<V>) { return /*iterator*/<false>(this, ranges::end(/*base_*/)); } else { return default_sentinel; } } constexpr auto end() const requires forward_range<const V> { if constexpr (common_range<const V> && sized_range<const V>) { auto missing = (/*n_*/ - ranges::distance(/*base_*/) % /*n_*/) % /*n_*/; return /*iterator*/<true>(this, ranges::end(/*base_*/), missing); } else if constexpr (common_range<const V> && !bidirectional_range<const V>) { return /*iterator*/<true>(this, ranges::end(/*base_*/)); } else { return default_sentinel; } } constexpr auto size() requires sized_range<V>; constexpr auto size() const requires sized_range<const V>; constexpr auto reserve_hint() requires approximately_sized_range<V>; constexpr auto reserve_hint() const requires approximately_sized_range<const V>; }; }
クラステンプレート
std::ranges::chunk_view::iterator
for
forward_range
s
namespace std::ranges { template<view V> requires forward_range<V> template<bool Const> class chunk_view<V>::/*イテレータ*/ { using /*親クラス*/ = /*maybe-const*/<Const, chunk_view>; // 説明専用 using /*ベース*/ = /*maybe-const*/<Const, V>; // 説明専用 iterator_t</*ベース*/> /*current_*/ = iterator_t</*ベース*/>(); // 説明専用 sentinel_t</*ベース*/> /*end_*/ = sentinel_t</*ベース*/>(); // 説明専用 range_difference_t</*ベース*/> /*n_*/ = 0; // 説明専用 range_difference_t</*ベース*/> /*missing_*/ = 0; // 説明専用 constexpr /*イテレータ*/(/*親クラス*/* parent, iterator_t</*ベース*/> current, // 説明専用 range_difference_t</*ベース*/> missing = 0); public: using iterator_category = input_iterator_tag; using iterator_concept = /* 詳細は説明を参照 */; using value_type = decltype(views::take(subrange(/*current_*/, /*end_*/), /*n_*/)); using difference_type = range_difference_t</*ベース*/>; /*イテレータ*/() = default; constexpr /*イテレータ*/(/*イテレータ*/<!Const> i) requires Const && convertible_to<iterator_t<V>, iterator_t</*ベース*/>> && convertible_to<sentinel_t<V>, sentinel_t</*ベース*/>>; constexpr iterator_t</*ベース*/> base() const; constexpr value_type operator*() const; constexpr /*イテレータ*/& operator++(); constexpr /*イテレータ*/ operator++(int); constexpr /*イテレータ*/& operator--() requires bidirectional_range</*ベース*/>; constexpr /*イテレータ*/ operator--(int) requires bidirectional_range</*ベース*/>; constexpr /*イテレータ*/& operator+=(difference_type x) requires random_access_range</*ベース*/>; constexpr /*イテレータ*/& operator-=(difference_type x) requires random_access_range</*ベース*/>; constexpr value_type operator[](difference_type n) const requires random_access_range</*ベース*/>; friend constexpr bool operator==(const /*イテレータ*/& x, const /*イテレータ*/& y); friend constexpr bool operator==(const /*イテレータ*/& x, default_sentinel_t); friend constexpr bool operator<(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr bool operator>(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr bool operator<=(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr bool operator>=(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr auto operator<=>(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/> && three_way_comparable<iterator_t</*ベース*/>> ; friend constexpr /*イテレータ*/ operator+(const /*イテレータ*/& i, difference_type n) requires random_access_range</*ベース*/>; friend constexpr /*イテレータ*/ operator+(difference_type n, const /*イテレータ*/& i) requires random_access_range</*ベース*/>; friend constexpr /*イテレータ*/ operator-(const /*イテレータ*/& i, difference_type n) requires random_access_range</*ベース*/>; friend constexpr difference_type operator-(const /*イテレータ*/& x, const /*イテレータ*/& y) requires sized_sentinel_for<iterator_t</*ベース*/>, iterator_t</*ベース*/>>; friend constexpr difference_type operator-(default_sentinel_t y, const /*イテレータ*/& x) requires sized_sentinel_for<sentinel_t</*ベース*/>, iterator_t</*ベース*/>>; friend constexpr difference_type operator-(const /*イテレータ*/& x, default_sentinel_t y) requires sized_sentinel_for<sentinel_t</*ベース*/>, iterator_t</*ベース*/>>; }; }
クラステンプレート std::ranges::slide_view
namespace std::ranges { template<class V> concept /*slide-caches-nothing*/ = random_access_range<V> && sized_range<V>; // 説明専用 template<class V> concept /*slide-caches-last*/ = // 説明専用 !/*slide-caches-nothing*/<V> && bidirectional_range<V> && common_range<V>; template<class V> concept /*slide-caches-first*/ = // 説明専用 !/*slide-caches-nothing*/<V> && !/*slide-caches-last*/<V>; template<forward_range V> requires view<V> class slide_view : public view_interface<slide_view<V>> { V /*base_*/; // 説明専用 range_difference_t<V> /*n_*/; // 説明専用 // クラステンプレート slide_view::iterator template<bool> class /*iterator*/; // 説明専用 // クラス slide_view::sentinel class /*sentinel*/; // 説明専用 public: constexpr explicit slide_view(V base, range_difference_t<V> n); constexpr V base() const& requires copy_constructible<V> { return /*base_*/; } constexpr V base() && { return std::move(/*base_*/); } constexpr auto begin() requires(!(/*simple-view*/<V> && /*slide-caches-nothing*/<const V>)); constexpr auto begin() const requires /*slide-caches-nothing*/<const V>; constexpr auto end() requires(!(/*simple-view*/<V> && /*slide-caches-nothing*/<const V>)); constexpr auto end() const requires /*slide-caches-nothing*/<const V>; constexpr auto size() requires sized_range<V>; constexpr auto size() const requires sized_range<const V>; constexpr auto reserve_hintsize() requires approximately_sized_range<V>; constexpr auto reserve_hintsize() const requires approximately_sized_range<const V>; }; template<class R> slide_view(R&&, range_difference_t<R>) -> slide_view<views::all_t<R>>; }
クラステンプレート std::ranges::slide_view::iterator
namespace std::ranges { template<forward_range V> requires view<V> template<bool Const> class slide_view<V>::/*イテレータ*/ { using /*ベース*/ = /*maybe-const*/<Const, V>; // 説明専用 iterator_t</*ベース*/> /*current_*/ = iterator_t</*ベース*/>(); // 説明専用 iterator_t</*ベース*/> /*last-ele_*/ = iterator_t</*ベース*/>(); // 説明専用 // Baseモデルがスライドキャッシュを最初に行う場合のみ表示 range_difference_t</*ベース*/> /*n_*/ = 0; // 説明専用 constexpr /*イテレータ*/(iterator_t</*ベース*/> current, range_difference_t</*ベース*/> n) // 説明専用 requires(!/*スライドキャッシュファースト*/</*ベース*/>); constexpr /*イテレータ*/(iterator_t</*ベース*/> current, iterator_t</*ベース*/> last_ele, // 説明専用 range_difference_t</*ベース*/> n) requires /*スライドキャッシュファースト*/</*ベース*/>; public: using iterator_category = input_iterator_tag; using iterator_concept = /* 詳細は説明を参照 */; using value_type = decltype(views::counted(/*current_*/, /*n_*/)); using difference_type = range_difference_t</*ベース*/>; /*イテレータ*/() = default; constexpr /*イテレータ*/(/*イテレータ*/<!Const> i) requires Const && convertible_to<iterator_t<V>, iterator_t</*ベース*/>>; constexpr auto operator*() const; constexpr /*イテレータ*/& operator++(); constexpr /*イテレータ*/ operator++(int); constexpr /*イテレータ*/& operator--() requires bidirectional_range</*ベース*/>; constexpr /*イテレータ*/ operator--(int) requires bidirectional_range</*ベース*/>; constexpr /*イテレータ*/& operator+=(difference_type x) requires random_access_range</*ベース*/>; constexpr /*イテレータ*/& operator-=(difference_type x) requires random_access_range</*ベース*/>; constexpr auto operator[](difference_type n) const requires random_access_range</*ベース*/>; friend constexpr bool operator==(const /*イテレータ*/& x, const /*イテレータ*/& y); friend constexpr bool operator<(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr bool operator>(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr bool operator<=(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr bool operator>=(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr auto operator<=>(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/> && three_way_comparable<iterator_t</*ベース*/>> ; friend constexpr /*イテレータ*/ operator+(const /*イテレータ*/& i, difference_type n) requires random_access_range</*ベース*/>; friend constexpr /*イテレータ*/ operator+(difference_type n, const /*イテレータ*/& i) requires random_access_range</*ベース*/>; friend constexpr /*イテレータ*/ operator-(const /*イテレータ*/& i, difference_type n) requires random_access_range</*ベース*/>; friend constexpr difference_type operator-(const /*イテレータ*/& x, const /*イテレータ*/& y) requires sized_sentinel_for<iterator_t</*ベース*/>, iterator_t</*ベース*/>>; }; }
クラステンプレート std::ranges::slide_view::sentinel
namespace std::ranges { template<forward_range V> requires view<V> class slide_view<V>::/*sentinel*/ { sentinel_t<V> /*end_*/ = sentinel_t<V>(); // 説明専用 constexpr explicit /*sentinel*/(sentinel_t<V> end); // 説明専用 public: /*sentinel*/() = default; friend constexpr bool operator==(const /*iterator*/<false>& x, const /*sentinel*/& y); friend constexpr range_difference_t<V> operator-(const /*iterator*/<false>& x, const /*sentinel*/& y) requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>; friend constexpr range_difference_t<V> operator-(const /*sentinel*/& y, const /*iterator*/<false>& x) requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>; }; }
クラステンプレート std::ranges::chunk_by_view
namespace std::ranges { template<forward_range V, indirect_binary_predicate<iterator_t<V>, iterator_t<V>> Pred> requires view<V> && is_object_v<Pred> class chunk_by_view : public view_interface<chunk_by_view<V, Pred>> { V /*base_*/ = V(); // 説明専用 /*movable-box*/<Pred> /*pred_*/; // 説明専用 // chunk_by_view::iterator クラス class /*iterator*/; // 説明専用 public: chunk_by_view() requires default_initializable<V> && default_initializable<Pred> = default; constexpr explicit chunk_by_view(V base, Pred pred); constexpr V base() const& requires copy_constructible<V> { return /*base_*/; } constexpr V base() && { return std::move(/*base_*/); } constexpr const Pred& pred() const; constexpr /*iterator*/ begin(); constexpr auto end(); constexpr iterator_t<V> /*find-next*/(iterator_t<V>); // 説明専用 constexpr iterator_t<V> /*find-prev*/(iterator_t<V>) // 説明専用 requires bidirectional_range<V>; }; template<class R, class Pred> chunk_by_view(R&&, Pred) -> chunk_by_view<views::all_t<R>, Pred>; }
クラステンプレート std::ranges::chunk_by_view::iterator
namespace std::ranges { template<forward_range V, indirect_binary_predicate<iterator_t<V>, iterator_t<V>> Pred> requires view<V> && is_object_v<Pred> class chunk_by_view<V, Pred>::/*iterator*/ { chunk_by_view* /*parent_*/ = nullptr; // 説明専用 iterator_t<V> /*current_*/ = iterator_t<V>(); // 説明専用 iterator_t<V> /*next_*/ = iterator_t<V>(); // 説明専用 constexpr /*iterator*/(chunk_by_view& parent, iterator_t<V> current, // 説明専用 iterator_t<V> next); public: using value_type = subrange<iterator_t<V>>; using difference_type = range_difference_t<V>; using iterator_category = input_iterator_tag; using iterator_concept = /* 説明を参照 */; /*iterator*/() = default; constexpr value_type operator*() const; constexpr /*iterator*/& operator++(); constexpr /*iterator*/ operator++(int); constexpr /*iterator*/& operator--() requires bidirectional_range<V>; constexpr /*iterator*/ operator--(int) requires bidirectional_range<V>; friend constexpr bool operator==(const /*iterator*/& x, const /*iterator*/& y); friend constexpr bool operator==(const /*iterator*/& x, default_sentinel_t); }; }
クラステンプレート std::ranges::stride_view
namespace std::ranges { template<input_range V> requires view<V> class stride_view : public view_interface<stride_view<V>> { V /*base_*/; // 説明専用 range_difference_t<V> /*stride_*/; // 説明専用 // クラステンプレート stride_view::iterator template<bool> class /*イテレータ*/; // 説明専用 public: constexpr explicit stride_view(V base, range_difference_t<V> stride); constexpr V base() const& requires copy_constructible<V> { return /*base_*/; } constexpr V base() && { return std::move(/*base_*/); } constexpr range_difference_t<V> stride() const noexcept; constexpr auto begin() requires(!/*シンプルビュー*/<V>) { return /*イテレータ*/<false>(this, ranges::begin(/*base_*/)); } constexpr auto begin() const requires range<const V> { return /*イテレータ*/<true>(this, ranges::begin(/*base_*/)); } constexpr auto end() requires(!/*シンプルビュー*/<V>) { if constexpr (common_range<V> && sized_range<V> && forward_range<V>) { auto missing = (/*stride_*/ - ranges::distance(/*base_*/) % /*stride_*/) % /*stride_*/; return /*イテレータ*/<false>(this, ranges::end(/*base_*/), missing); } else if constexpr (common_range<V> && !bidirectional_range<V>) { return /*イテレータ*/<false>(this, ranges::end(/*base_*/)); } else { return default_sentinel; } } constexpr auto end() const requires range<const V> { if constexpr (common_range<const V> && sized_range<const V> && forward_range<const V>) { auto missing = (/*stride_*/ - ranges::distance(/*base_*/) % /*stride_*/) % /*stride_*/; return /*イテレータ*/<true>(this, ranges::end(/*base_*/), missing); } else if constexpr (common_range<const V> && !bidirectional_range<const V>) { return /*イテレータ*/<true>(this, ranges::end(/*base_*/)); } else { return default_sentinel; } } constexpr auto size() requires sized_range<V>; constexpr auto size() const requires sized_range<const V>; constexpr auto reserve_hint() requires approximately_sized_range<V>; constexpr auto reserve_hint() const requires approximately_sized_range<const V>; }; template<class R> stride_view(R&&, range_difference_t<R>) -> stride_view<views::all_t<R>>; }
クラステンプレート std::ranges::stride_view::iterator
namespace std::ranges { template<input_range V> requires view<V> template<bool Const> class stride_view<V>::/*イテレータ*/ { using /*親クラス*/ = /*maybe-const*/<Const, stride_view>; // 説明専用 using /*ベース*/ = /*maybe-const*/<Const, V>; // 説明専用 iterator_t</*ベース*/> /*current_*/ = iterator_t</*ベース*/>(); // 説明専用 sentinel_t</*ベース*/> /*end_*/ = sentinel_t</*ベース*/>(); // 説明専用 range_difference_t</*ベース*/> /*stride_*/ = 0; // 説明専用 range_difference_t</*ベース*/> /*missing_*/ = 0; // 説明専用 constexpr /*イテレータ*/(/*親クラス*/* parent, iterator_t</*ベース*/> current, // 説明専用 range_difference_t</*ベース*/> missing = 0); public: using difference_type = range_difference_t</*ベース*/>; using value_type = range_value_t</*ベース*/>; using iterator_concept = /* 詳細は説明を参照 */; using iterator_category = /* 詳細は説明を参照 */; // 常に存在するとは限らない /*イテレータ*/() requires default_initializable<iterator_t</*ベース*/>> = default; constexpr /*イテレータ*/(/*イテレータ*/<!Const> other) requires Const && convertible_to<iterator_t<V>, iterator_t</*ベース*/>> && convertible_to<sentinel_t<V>, sentinel_t</*ベース*/>>; constexpr iterator_t</*ベース*/> base() &&; constexpr const iterator_t</*ベース*/>& base() const& noexcept; constexpr decltype(auto) operator*() const { return */*current_*/; } constexpr /*イテレータ*/& operator++(); constexpr void operator++(int); constexpr /*イテレータ*/ operator++(int) requires forward_range</*ベース*/>; constexpr /*イテレータ*/& operator--() requires bidirectional_range</*ベース*/>; constexpr /*イテレータ*/ operator--(int) requires bidirectional_range</*ベース*/>; constexpr /*イテレータ*/& operator+=(difference_type n) requires random_access_range</*ベース*/>; constexpr /*イテレータ*/& operator-=(difference_type n) requires random_access_range</*ベース*/>; constexpr decltype(auto) operator[](difference_type n) const requires random_access_range</*ベース*/> { return *(*this + n); } friend constexpr bool operator==(const /*イテレータ*/& x, default_sentinel_t); friend constexpr bool operator==(const /*イテレータ*/& x, const /*イテレータ*/& y) requires equality_comparable<iterator_t</*ベース*/>>; friend constexpr bool operator<(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*Base*/>; friend constexpr bool operator>(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr bool operator<=(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr bool operator>=(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/>; friend constexpr auto operator<=>(const /*イテレータ*/& x, const /*イテレータ*/& y) requires random_access_range</*ベース*/> && three_way_comparable<iterator_t</*ベース*/>> ; friend constexpr /*イテレータ*/ operator+(const /*イテレータ*/& x, difference_type n) requires random_access_range</*ベース*/>; friend constexpr /*イテレータ*/ operator+(difference_type n, const /*イテレータ*/& x) requires random_access_range</*ベース*/>; friend constexpr /*イテレータ*/ operator-(const /*イテレータ*/& x, difference_type n) requires random_access_range</*ベース*/>; friend constexpr difference_type operator-(const /*イテレータ*/& x, const /*イテレータ*/& y) requires sized_sentinel_for<iterator_t</*ベース*/>, iterator_t</*ベース*/>>; friend constexpr difference_type operator-(default_sentinel_t y, const /*イテレータ*/& x) requires sized_sentinel_for<sentinel_t</*ベース*/>, iterator_t</*ベース*/>>; friend constexpr difference_type operator-(const /*イテレータ*/& x, default_sentinel_t y) requires sized_sentinel_for<sentinel_t</*ベース*/>, iterator_t</*ベース*/>>; friend constexpr range_rvalue_reference_t</*ベース*/> iter_move( const /*イテレータ*/& i) noexcept(noexcept(ranges::iter_move (注:指定された条件により、HTMLタグ・属性は翻訳せず、C++固有用語も保持されています。表示されるテキスト「ranges::iter_move」はC++標準ライブラリの関数名であるため、翻訳対象外です)(i./*current_*/))); friend constexpr void iter_swap( const /*イテレータ*/& x, const /*イテレータ*/& y) noexcept(noexcept(ranges::iter_swap (注:元のテキストには翻訳対象となる自然言語のテキストが含まれていないため、HTMLタグとC++識別子はそのまま保持されています)(x./*current_*/, y./*current_*/))) requires indirectly_swappable<iterator_t</*ベース*/>>; }; }
クラステンプレート std::ranges::cartesian_product_view
namespace std::ranges { template<bool Const, class First, class... Vs> concept /*cartesian-product-is-random-access*/ = // 説明専用 (random_access_range</*おそらくconst*/<Const, First>> && ... && (random_access_range</*maybe-const*/<Const, Vs>> && sized_range</*maybe-const*/<Const, Vs>>)); template<class R> concept /*cartesian-product-common-arg*/ = // 説明専用 common_range<R> || (sized_range<R> && random_access_range<R>); template<bool Const, class First, class... Vs> concept /*cartesian-product-is-bidirectional*/ = // 説明専用 (bidirectional_range</*maybe-const*/<Const, First>> && ... && (bidirectional_range</*maybe-const*/<Const, Vs>> && /*cartesian-product-common-arg*/</*maybe-const*/<Const, Vs>>)); template<class First, class...> concept /* 直積は一般的 */ = // 説明専用 /*cartesian-product-common-arg*/<First>; template<class... Vs> concept /*cartesian-product-is-sized*/ = // 説明専用 (sized_range<Vs> && ...); template<bool Const, template<class> class FirstSent, class First, class... Vs> concept /*cartesian-is-sized-sentinel*/ = // 説明専用 (sized_sentinel_for<FirstSent</*maybe-const*/<Const, First>>, iterator_t</*おそらくconst*/<Const, First>>> && ... && (sized_range</*maybe-const*/<Const, Vs>> && sized_sentinel_for<iterator_t</*maybe-const*/<Const, Vs>>, iterator_t</*maybe-const*/<Const, Vs>>>)); template</*cartesian-product-common-arg*/ R> constexpr auto /*cartesian-common-arg-end*/ (注:指定されたテキストはC++コード内のコメントであり、HTMLタグ内に含まれていますが、翻訳対象外の要素であるため、原文のまま保持しました)(R& r) { // 説明専用 if constexpr (common_range<R>) { return ranges::end(r); } else { return ranges::begin(r) + ranges::distance(r); } } template<input_range First, forward_range... Vs> requires(view<First> && ... && view<Vs>) class cartesian_product_view : public view_interface<cartesian_product_view<First, Vs...>> { private: tuple<First, Vs...> /*bases_*/; // 説明専用 // クラステンプレート cartesian_product_view::iterator template<bool Const> class /*イテレータ*/; // 説明専用 public: constexpr cartesian_product_view() = default; constexpr explicit cartesian_product_view(First first_base, Vs... bases); constexpr /*イテレータ*/<false> begin() requires(!/*シンプルビュー*/<First> || ... || !/*シンプルビュー*/<Vs>); constexpr /*イテレータ*/<true> begin() const requires(range<const First> && ... && range<const Vs>); constexpr /*イテレータ*/<false> end() requires((!/*シンプルビュー*/<First> || ... || !/*シンプルビュー*/<Vs>) && /* デカルト積は一般的 */<First, Vs...>); constexpr /*イテレータ*/<true> end() const requires /* 直積は一般的 */<const First, const Vs...>; constexpr default_sentinel_t end() const noexcept; constexpr /* 説明を参照 */ size() requires /*cartesian-product-is-sized*/<First, Vs...>; constexpr /* 説明を参照 */ size() const requires /*cartesian-product-is-sized*/<const First, const Vs...>; }; template<class... Vs> cartesian_product_view(Vs&&...) -> cartesian_product_view<views::all_t<Vs>...>; }
クラステンプレート std::ranges::cartesian_product_view::iterator
namespace std::ranges { template<input_range First, forward_range... Vs> requires(view<First> && ... && view<Vs>) template<bool Const> class cartesian_product_view<First, Vs...>::/*イテレータ*/ { public: using iterator_category = input_iterator_tag; using iterator_concept = /* 説明を参照 */; using value_type = tuple<range_value_t</*maybe-const*/<Const, First>>, range_value_t</*maybe-const*/<Const, Vs>>...>; using reference = tuple<range_reference_t</*maybe-const*/<Const, First>>, range_reference_t</*maybe-const*/<Const, Vs>>...>; using difference_type = /* 説明を参照 */; /*イテレータ*/() = default; constexpr /*イテレータ*/(/*イテレータ*/<!Const> i) requires Const && (convertible_to<iterator_t<First>, iterator_t<const First>> && ... && convertible_to<iterator_t<Vs>, iterator_t<const Vs>>); constexpr auto operator*() const; constexpr /*イテレータ*/& operator++(); constexpr void operator++(int); constexpr /*イテレータ*/ operator++(int) requires forward_range</*maybe-const*/<Const, First>>; constexpr /*イテレータ*/& operator--() requires /*cartesian-product-is-bidirectional*/<Const, First, Vs...>; constexpr /*イテレータ*/ operator--(int) requires /*cartesian-product-is-bidirectional*/<Const, First, Vs...>; constexpr /*イテレータ*/& operator+=(difference_type x) requires /*cartesian-product-is-random-access*/<Const, First, Vs...>; constexpr /*イテレータ*/& operator-=(difference_type x) requires /*cartesian-product-is-random-access*/<Const, First, Vs...>; constexpr reference operator[](difference_type n) const requires /*cartesian-product-is-random-access*/<Const, First, Vs...>; friend constexpr bool operator==(const /*イテレータ*/& x, const /*イテレータ*/& y) requires equality_comparable<iterator_t</*maybe-const*/<Const, First>>>; friend constexpr bool operator==(const /*イテレータ*/& x, default_sentinel_t); friend constexpr auto operator<=>(const /*イテレータ*/& x, const /*イテレータ*/& y) requires /*全ランダムアクセス*/<Const, First, Vs...>; friend constexpr /*イテレータ*/ operator+(const /*イテレータ*/& x, difference_type y) requires /*cartesian-product-is-random-access*/<Const, First, Vs...>; friend constexpr /*イテレータ*/ operator+(difference_type x, const /*イテレータ*/& y) requires /*cartesian-product-is-random-access*/<Const, First, Vs...>; friend constexpr /*イテレータ*/ operator-(const /*イテレータ*/& x, difference_type y) requires /*cartesian-product-is-random-access*/<Const, First, Vs...>; friend constexpr difference_type operator-(const /*イテレータ*/& x, const /*イテレータ*/& y) requires /*cartesian-is-sized-sentinel*/<Const, iterator_t, First, Vs...>; friend constexpr difference_type operator-(const /*イテレータ*/& i, default_sentinel_t) requires /*cartesian-is-sized-sentinel*/<Const, sentinel_t, First, Vs...>; friend constexpr difference_type operator-(default_sentinel_t, const /*イテレータ*/& i) requires /*cartesian-is-sized-sentinel*/<Const, sentinel_t, First, Vs...>; friend constexpr auto iter_move(const /*イテレータ*/& i) noexcept( /* 説明を参照 */); friend constexpr void iter_swap(const /*イテレータ*/& l, const /*イテレータ*/& r) noexcept(/* 説明を参照 */) requires(indirectly_swappable<iterator_t</*maybe-const*/<Const, First>>> && ... && indirectly_swappable<iterator_t</*maybe-const*/<Const, Vs>>>); private: using /*親*/ = /*maybe-const*/<Const, cartesian_product_view>; // 説明専用 /*親*/* /*parent_*/ = nullptr; // 説明専用 tuple<iterator_t</*maybe-const*/<Const, First>>, iterator_t</*maybe-const*/<Const, Vs>>...> /*current_*/; // 説明専用 template<size_t N = sizeof...(Vs)> constexpr void /*次へ*/(); // 説明専用 template<size_t N = sizeof...(Vs)> constexpr void /*前へ*/(); // 説明専用 template<class Tuple> constexpr difference_type /*distance-from*/(const Tuple& t) const; // 説明専用 constexpr /*イテレータ*/( /*親*/& parent, tuple<iterator_t</*maybe-const*/<Const, First>>, iterator_t</*maybe-const*/<Const, Vs>>...> current); // 説明専用 }; }
クラステンプレート std::ranges::cache_latest_view
namespace std::ranges { template<input_range V> requires view<V> class cache_latest_view : public view_interface<cache_latest_view<V>> { V /*base_*/ = V(); // 説明専用 using /*cache-t*/ = conditional_t<is_reference_v<range_reference_t<V>>, // 説明専用 add_pointer_t<range_reference_t<V>>, range_reference_t<V>>; /*non-propagating-cache*/</*cache-t*/> /*cache_*/; // 説明専用 // cache_latest_view::iterator クラス class /*iterator*/; // 説明専用 // cache_latest_view::sentinel クラス class /*sentinel*/; // 説明専用 public: cache_latest_view() requires default_initializable<V> = default; constexpr explicit cache_latest_view(V base); constexpr V base() const& requires copy_constructible<V> { return /*base_*/; } constexpr V base() && { return std::move(/*base_*/); } constexpr auto begin(); constexpr auto end(); constexpr auto size() requires sized_range<V>; constexpr auto size() const requires sized_range<const V>; }; template<class R> cache_latest_view(R&&) -> cache_latest_view<views::all_t<R>>; }
クラステンプレート std::ranges::cache_latest_view::iterator
namespace std::ranges { template<input_range V> requires view<V> class cache_latest_view<V>::/*iterator*/ { cache_latest_view* /*parent_*/; // 説明専用 iterator_t<V> /*current_*/; // 説明専用 constexpr explicit /*iterator*/(cache_latest_view& parent); // 説明専用 public: using difference_type = range_difference_t<V>; using value_type = range_value_t<V>; using iterator_concept = input_iterator_tag; /*iterator*/(/*iterator*/&&) = default; /*iterator*/& operator=(/*iterator*/&&) = default; constexpr iterator_t<V> base() &&; constexpr const iterator_t<V>& base() const& noexcept; constexpr range_reference_t<V>& operator*() const; constexpr /*iterator*/& operator++(); constexpr void operator++(int); friend constexpr range_rvalue_reference_t<V> iter_move( const /*iterator*/& i) noexcept(noexcept(ranges::iter_move(i./*current_*/))); friend constexpr void iter_swap( const /*iterator*/& x, const /*iterator*/& y) noexcept(noexcept(ranges::iter_swap(x./*current_*/, y./*current_*/))) requires indirectly_swappable<iterator_t<V>>; }; }
クラステンプレート std::ranges::cache_latest_view::sentinel
namespace std::ranges { template<input_range V> requires view<V> class cache_latest_view<V>::/*sentinel*/ { sentinel_t<V> /*end_*/ = sentinel_t<V>(); // 説明専用 constexpr explicit /*sentinel*/(cache_latest_view& parent); // 説明専用 public: /*sentinel*/() = default; constexpr sentinel_t<V> base() const; friend constexpr bool operator==(const /*iterator*/& x, const /*sentinel*/& y); friend constexpr range_difference_t<V> operator-(const /*iterator*/& x, const /*sentinel*/& y) requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>; friend constexpr range_difference_t<V> operator-(const /*sentinel*/& x, const /*iterator*/& y) requires sized_sentinel_for<sentinel_t<V>, iterator_t<V>>; }; }
クラステンプレート std::ranges::to_input_view
namespace std::ranges { template<input_range V> requires view<V> class to_input_view : public view_interface<to_input_view<V>> { V /*base_*/ = V(); // 説明専用 // クラステンプレート to_input_view::iterator template<bool Const> class /*iterator*/; // 説明専用 public: to_input_view() requires default_initializable<V> = default; constexpr explicit to_input_view(V base); constexpr V base() const& requires copy_constructible<V> { return /*base_*/; } constexpr V base() && { return std::move(/*base_*/); } constexpr auto begin() requires(!/*simple-view*/<V>); constexpr auto begin() const requires range<const V>; constexpr auto end() requires(!/*simple-view*/<V>); constexpr auto end() const requires range<const V>; constexpr auto size() requires sized_range<V>; constexpr auto size() const requires sized_range<const V>; }; template<class R> to_input_view(R&&) -> to_input_view<views::all_t<R>>; }
クラステンプレート std::ranges::to_input_view::iterator
namespace std::ranges { template<input_range V> requires view<V> template<bool Const> class to_input_view<V>::/*iterator*/ { using /*Base*/ = /*maybe-const*/<Const, V>; // 説明専用 iterator_t</*Base*/> /*current_*/ = iterator_t</*Base*/>(); // 説明専用 constexpr explicit /*iterator*/(iterator_t</*Base*/> current); // 説明専用 public: using difference_type = range_difference_t</*Base*/>; using value_type = range_value_t</*Base*/>; using iterator_concept = input_iterator_tag; /*iterator*/() requires default_initializable<iterator_t</*Base*/>> = default; /*iterator*/(/*iterator*/&&) = default; /*iterator*/& operator=(/*iterator*/&&) = default; constexpr /*iterator*/(/*iterator*/<!Const> i) requires Const && convertible_to<iterator_t<V>, iterator_t</*Base*/>>; constexpr iterator_t</*Base*/> base() &&; constexpr const iterator_t</*Base*/>& base() const& noexcept; constexpr decltype(auto) operator*() const { return */*current_*/; } constexpr /*iterator*/& operator++(); constexpr void operator++(int); friend constexpr bool operator==(const /*iterator*/& x, const sentinel_t</*Base*/>& y); friend constexpr difference_type operator-(const sentinel_t</*Base*/>& y, const /*iterator*/& x) requires sized_sentinel_for<sentinel_t</*Base*/>, iterator_t</*Base*/>>; friend constexpr difference_type operator-(const /*iterator*/& x, const sentinel_t</*Base*/>& y) requires sized_sentinel_for<sentinel_t</*Base*/>, iterator_t</*Base*/>>; friend constexpr range_rvalue_reference_t</*Base*/> iter_move( const /*iterator*/& i) noexcept(noexcept(ranges::iter_move(i./*current_*/))); friend constexpr void iter_swap( const /*iterator*/& x, const /*iterator*/& y) noexcept(noexcept(ranges::iter_swap(x./*current_*/, y./*current_*/))) requires indirectly_swappable<iterator_t</*Base*/>>; }; }
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 3914 | C++23 |
std::ranges::enumerate_view
の制約が概要で誤って指定されていた |
修正済み |