Skip to content

Commit

Permalink
basic_format_parse_context: begin, end, advance_toを追加
Browse files Browse the repository at this point in the history
  • Loading branch information
faithandbrave committed Jan 23, 2023
1 parent 96e93fc commit ad99718
Show file tree
Hide file tree
Showing 7 changed files with 227 additions and 11 deletions.
2 changes: 0 additions & 2 deletions reference/format/basic_format_context/advance_to.md
Expand Up @@ -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]
## 概要
出力イテレータを指定したイテレータに設定する。
Expand Down
2 changes: 0 additions & 2 deletions reference/format/basic_format_context/out.md
Expand Up @@ -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]

## 概要
出力イテレータを取得する。
Expand Down
12 changes: 6 additions & 6 deletions reference/format/basic_format_parse_context.md
Expand Up @@ -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<charT>::const_iterator`と等しい) (type-alias) | C++20 |
| `iterator` | 書式文字列のイテレータの型(`basic_string_view<charT>::iterator`と等しい) (type-alias) | C++20 |
Expand Down
48 changes: 48 additions & 0 deletions 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)
86 changes: 86 additions & 0 deletions 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 <iostream>
#include <format>

enum color { red, green, blue };

const char* color_names[] = { "red", "green", "blue" };

template<>
class std::formatter<color> {
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)
86 changes: 86 additions & 0 deletions 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 <iostream>
#include <format>

enum color { red, green, blue };

const char* color_names[] = { "red", "green", "blue" };

template<>
class std::formatter<color> {
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)
2 changes: 1 addition & 1 deletion reference/format/formatter.md
Expand Up @@ -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]
Expand Down

0 comments on commit ad99718

Please sign in to comment.