From ad997184e5177e545acd5a3b7410cc48451fc5cb Mon Sep 17 00:00:00 2001 From: Akira Takahashi Date: Mon, 23 Jan 2023 22:33:13 +0900 Subject: [PATCH] =?UTF-8?q?basic=5Fformat=5Fparse=5Fcontext:=20begin,=20en?= =?UTF-8?q?d,=20advance=5Fto=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../format/basic_format_context/advance_to.md | 2 - reference/format/basic_format_context/out.md | 2 - .../format/basic_format_parse_context.md | 12 +-- .../basic_format_parse_context/advance_to.md | 48 +++++++++++ .../basic_format_parse_context/begin.md | 86 +++++++++++++++++++ .../format/basic_format_parse_context/end.md | 86 +++++++++++++++++++ reference/format/formatter.md | 2 +- 7 files changed, 227 insertions(+), 11 deletions(-) create mode 100644 reference/format/basic_format_parse_context/advance_to.md create mode 100644 reference/format/basic_format_parse_context/begin.md create mode 100644 reference/format/basic_format_parse_context/end.md diff --git a/reference/format/basic_format_context/advance_to.md b/reference/format/basic_format_context/advance_to.md index 5aff44b4a7..dac5edc89d 100644 --- a/reference/format/basic_format_context/advance_to.md +++ b/reference/format/basic_format_context/advance_to.md @@ -8,8 +8,6 @@ ```cpp void advance_to(iterator it); ``` -* basic_format_arg[link /reference/format/basic_format_arg.md] -* basic_format_context[link /reference/format/basic_format_context.md] ## 概要 出力イテレータを指定したイテレータに設定する。 diff --git a/reference/format/basic_format_context/out.md b/reference/format/basic_format_context/out.md index 4c8569f053..d6e5676539 100644 --- a/reference/format/basic_format_context/out.md +++ b/reference/format/basic_format_context/out.md @@ -8,8 +8,6 @@ ```cpp iterator out(); ``` -* basic_format_arg[link /reference/format/basic_format_arg.md] -* basic_format_context[link /reference/format/basic_format_context.md] ## 概要 出力イテレータを取得する。 diff --git a/reference/format/basic_format_parse_context.md b/reference/format/basic_format_parse_context.md index 2d0db6d8a8..f02a306339 100644 --- a/reference/format/basic_format_parse_context.md +++ b/reference/format/basic_format_parse_context.md @@ -28,17 +28,17 @@ namespace std { | 名前 | 説明 | 対応バージョン | |-----------------|----------------------------------------------------|----------------| | `(constructor)` | コンストラクタ | C++20 | -| `begin` | 書式文字列の先頭のイテレータを得る | C++20 | -| `end` | 書式文字列の末尾のイテレータを得る | C++20 | -| `advance_to` | 先頭のイテレータを指定したイテレータに設定する | C++20 | +| [`begin`](basic_format_parse_context/begin.md) | 書式文字列の先頭を指すイテレータを取得する | C++20 | +| [`end`](basic_format_parse_context/end.md) | 書式文字列の末尾を指すイテレータを取得する | C++20 | +| [`advance_to`](basic_format_parse_context/advance_to.md) | 指定したイテレータを先頭イテレータとして設定する | C++20 | | `next_arg_id` | フォーマット引数の番号を次に進める | C++20 | | `check_arg_id` | フォーマット引数の番号指定が有効か確かめる | C++20 | ## メンバ型 -| 名前 | 説明 | 対応バージョン | -|------------------|-----------------------------------------------------------------------------------------------|----------------| -| `char_type` | 文字の型(`charT`と等しい) (type-alias) | C++20 | +| 名前 | 説明 | 対応バージョン | +|------------------|---------------------------------------------------------------------------------------------|----------------| +| `char_type` | 文字の型(`charT`と等しい) (type-alias) | C++20 | | `const_iterator` | 書式文字列のイテレータの型(`basic_string_view::const_iterator`と等しい) (type-alias) | C++20 | | `iterator` | 書式文字列のイテレータの型(`basic_string_view::iterator`と等しい) (type-alias) | C++20 | diff --git a/reference/format/basic_format_parse_context/advance_to.md b/reference/format/basic_format_parse_context/advance_to.md new file mode 100644 index 0000000000..5f490afd7f --- /dev/null +++ b/reference/format/basic_format_parse_context/advance_to.md @@ -0,0 +1,48 @@ +# advance_to +* format[meta header] +* function[meta id-type] +* std[meta namespace] +* basic_format_parse_context[meta class] +* cpp20[meta cpp] + +```cpp +constexpr void advance_to(const_iterator it); +``` + +## 概要 +指定したイテレータを先頭イテレータとして設定する。 + +この関数は、書式文字列の全体を解析する処理において、[`formatter`](/reference/format/formatter.md)`::`[`parse()`](/reference/format/formatter/parse.md)の戻り値を、次の解析の初期位置として設定するために使用する。 + +```cpp +while (…) { + next_parse_ctx.advance_to(f.parse(parse_ctx)); +} +``` +* parse[link /reference/format/formatter/parse.md] + + +## 事前条件 +- `it`は[`end()`](end.md)に到達可能であること + + +## 効果 +メンバ変数として保持している、書式文字列の先頭を指すイテレータ`begin_`があるとして、以下と等価: + +```cpp +begin_ = it; +``` + + +## バージョン +### 言語 +- C++20 + +### 処理系 +- [Clang](/implementation.md#clang): ?? +- [GCC](/implementation.md#gcc): 13 +- [Visual C++](/implementation.md#visual_cpp): ?? + +## 参照 + +- [P0645R10 Text Formatting](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0645r10.html) diff --git a/reference/format/basic_format_parse_context/begin.md b/reference/format/basic_format_parse_context/begin.md new file mode 100644 index 0000000000..be15eeaedf --- /dev/null +++ b/reference/format/basic_format_parse_context/begin.md @@ -0,0 +1,86 @@ +# begin +* format[meta header] +* function[meta id-type] +* std[meta namespace] +* basic_format_parse_context[meta class] +* cpp20[meta cpp] + +```cpp +constexpr const_iterator begin() const noexcept; +``` + +## 概要 +書式文字列の先頭を指すイテレータを取得する。 + + +## 効果 +メンバ変数として保持している、書式文字列の先頭を指すイテレータを返す。 + + +## 例 +### 基本的な使い方 +```cpp example +#include +#include + +enum color { red, green, blue }; + +const char* color_names[] = { "red", "green", "blue" }; + +template<> +class std::formatter { + bool enable_quote = false; +public: + constexpr auto parse(std::format_parse_context& ctx) { + auto it = ctx.begin(); + if (it == ctx.end()) { + return it; + } + + if (*it == '%') { + enable_quote = true; + ++it; + } + return it; + } + + auto format(color c, std::format_context& ctx) const { + if (enable_quote) { + return std::format_to(ctx.out(), "\"{}\"", color_names[c]); + } + else { + return std::format_to(ctx.out(), "{}", color_names[c]); + } + } +}; + +int main() +{ + std::cout << std::format("{:%}", red) << std::endl; +} +``` +* ctx.begin()[color ff0000] +* ctx.end()[link end.md] +* std::format[link /reference/format/format.md] +* std::format_to[link /reference/format/format_to.md] +* std::format_context[link /reference/format/basic_format_context.md] +* ctx.out()[link /reference/format/basic_format_context/out.md] + +#### 出力 +``` +"red" +``` + + +## バージョン +### 言語 +- C++20 + +### 処理系 +- [Clang](/implementation.md#clang): ?? +- [GCC](/implementation.md#gcc): 13 +- [Visual C++](/implementation.md#visual_cpp): ?? + +## 参照 + +- [P0645R10 Text Formatting](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0645r10.html) diff --git a/reference/format/basic_format_parse_context/end.md b/reference/format/basic_format_parse_context/end.md new file mode 100644 index 0000000000..b71998a6df --- /dev/null +++ b/reference/format/basic_format_parse_context/end.md @@ -0,0 +1,86 @@ +# end +* format[meta header] +* function[meta id-type] +* std[meta namespace] +* basic_format_parse_context[meta class] +* cpp20[meta cpp] + +```cpp +constexpr const_iterator end() const noexcept; +``` + +## 概要 +書式文字列の末尾を指すイテレータを取得する。 + + +## 効果 +メンバ変数として保持している、書式文字列の末尾を指すイテレータを返す。 + + +## 例 +### 基本的な使い方 +```cpp example +#include +#include + +enum color { red, green, blue }; + +const char* color_names[] = { "red", "green", "blue" }; + +template<> +class std::formatter { + bool enable_quote = false; +public: + constexpr auto parse(std::format_parse_context& ctx) { + auto it = ctx.begin(); + if (it == ctx.end()) { + return it; + } + + if (*it == '%') { + enable_quote = true; + ++it; + } + return it; + } + + auto format(color c, std::format_context& ctx) const { + if (enable_quote) { + return std::format_to(ctx.out(), "\"{}\"", color_names[c]); + } + else { + return std::format_to(ctx.out(), "{}", color_names[c]); + } + } +}; + +int main() +{ + std::cout << std::format("{:%}", red) << std::endl; +} +``` +* ctx.end()[color ff0000] +* ctx.begin()[link begin.md] +* std::format[link /reference/format/format.md] +* std::format_to[link /reference/format/format_to.md] +* std::format_context[link /reference/format/basic_format_context.md] +* ctx.out()[link /reference/format/basic_format_context/out.md] + +#### 出力 +``` +"red" +``` + + +## バージョン +### 言語 +- C++20 + +### 処理系 +- [Clang](/implementation.md#clang): ?? +- [GCC](/implementation.md#gcc): 13 +- [Visual C++](/implementation.md#visual_cpp): ?? + +## 参照 + +- [P0645R10 Text Formatting](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0645r10.html) diff --git a/reference/format/formatter.md b/reference/format/formatter.md index f815402b90..4f87612a8b 100644 --- a/reference/format/formatter.md +++ b/reference/format/formatter.md @@ -208,7 +208,7 @@ int main() } ``` * std::format_parse_context[link basic_format_parse_context.md] -* ctx.begin()[link basic_format_parse_context/begin.md.nolink] +* ctx.begin()[link basic_format_parse_context/begin.md] * std::format_context[link basic_format_context.md] * ctx.out()[link basic_format_context/out.md] * std::format_to[link format_to.md]