Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion reference/bitset/bitset/op_ostream.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ os << x.template to_string<CharT, Traits, allocator<CharT>>(
* use_facet[link /reference/locale/use_facet.md]
* ctype[link /reference/locale/ctype.md]
* getloc[link /reference/ios/ios_base/getloc.md]
* widen[link /reference/locale/ctype/widen.md.nolink]
* widen[link /reference/locale/ctype/widen.md]


## 例
Expand Down
2 changes: 1 addition & 1 deletion reference/fstream/basic_filebuf/overflow.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ codecvt_base::result r =
* pbase()[link /reference/streambuf/basic_streambuf/pbase.md]
* pptr()[link /reference/streambuf/basic_streambuf/pptr.md]
* codecvt_base::result[link /reference/locale/codecvt_base.md]
* a_codecvt.out[link /reference/locale/codecvt/out.md.nolink]
* a_codecvt.out[link /reference/locale/codecvt/out.md]

ここで`a_codecvt`は、このストリームバッファに設定されているロケールの[`codecvt`](/reference/locale/codecvt.md)ファセットである。変換結果`r`に応じて、以下のように動作する。

Expand Down
2 changes: 1 addition & 1 deletion reference/fstream/basic_filebuf/underflow.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ codecvt_base::result r =
intern_buf, intern_buf+ISIZE, intern_end);
```
* codecvt_base::result[link /reference/locale/codecvt_base.md]
* a_codecvt.in[link /reference/locale/codecvt/in.md.nolink]
* a_codecvt.in[link /reference/locale/codecvt/in.md]

ここで`a_codecvt`は、このストリームバッファに設定されているロケールの[`codecvt`](/reference/locale/codecvt.md)ファセットである。

Expand Down
2 changes: 1 addition & 1 deletion reference/iomanip/put_time.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ void f(basic_ios<CharT, Traits>& out, const struct tm* tmb, const CharT* fmt)
* out.getloc()[link /reference/ios/ios_base/getloc.md]
* out.rdbuf()[link /reference/ios/basic_ios/rdbuf.md]
* out.fill()[link /reference/ios/basic_ios/fill.md]
* tp.put[link /reference/locale/time_put/put.md.nolink]
* tp.put[link /reference/locale/time_put/put.md]
* end.failed()[link /reference/iterator/ostreambuf_iterator/failed.md]
* out.setstate[link /reference/ios/basic_ios/setstate.md]
* ios_base[link /reference/ios/ios_base.md]
Expand Down
8 changes: 4 additions & 4 deletions reference/ios/basic_ios/narrow.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ char narrow(char_type c, char def) const;


## 戻り値
[`use_facet`](../../locale/use_facet.md)`<`[`ctype`](../../locale/ctype.md)`<char_type>(`[`getloc`](../ios_base/getloc.md)`()).`[`narrow`](../../locale/ctype/narrow.md.nolink)`(c, def)`
[`use_facet`](../../locale/use_facet.md)`<`[`ctype`](../../locale/ctype.md)`<char_type>(`[`getloc`](../ios_base/getloc.md)`()).`[`narrow`](../../locale/ctype/narrow.md)`(c, def)`


## 備考
ストリームに設定されているロケールに従って、`char_type` 型の文字 `c` を対応する `char` 型の文字に変換する。変換できなかった場合には `def` を返す。
詳細は [`ctype`](../../locale/ctype.md)`::`[`narrow`](../../locale/ctype/narrow.md.nolink) を参照。
詳細は [`ctype`](../../locale/ctype.md)`::`[`narrow`](../../locale/ctype/narrow.md) を参照。


## 例
Expand Down Expand Up @@ -49,7 +49,7 @@ int main()
- [`ios_base`](../ios_base.md)`::`[`imbue`](../ios_base/imbue.md)
- [`ios_base`](../ios_base.md)`::`[`getloc`](../ios_base/getloc.md)
- [`ctype`](../../locale/ctype.md)
- [`ctype`](../../locale/ctype.md)`::`[`narrow`](../../locale/ctype/narrow.md.nolink)
- [`ctype`](../../locale/ctype.md)`::`[`widen`](../../locale/ctype/widen.md.nolink)
- [`ctype`](../../locale/ctype.md)`::`[`narrow`](../../locale/ctype/narrow.md)
- [`ctype`](../../locale/ctype.md)`::`[`widen`](../../locale/ctype/widen.md)
- [`use_facet`](../../locale/use_facet.md)
- [`locale`](../../locale/locale.md)
8 changes: 4 additions & 4 deletions reference/ios/basic_ios/widen.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ char_type widen(char c) const;


## 戻り値
[`use_facet`](../../locale/use_facet.md)`<`[`ctype`](../../locale/ctype.md)`<char_type>(`[`getloc`](../ios_base/getloc.md)`()).`[`widen`](../../locale/ctype/widen.md.nolink)`(c)`
[`use_facet`](../../locale/use_facet.md)`<`[`ctype`](../../locale/ctype.md)`<char_type>(`[`getloc`](../ios_base/getloc.md)`()).`[`widen`](../../locale/ctype/widen.md)`(c)`


## 備考
ストリームに設定されているロケールに従って、`char` 型の文字 `c` を対応する `char_type` 型の文字に変換する。
詳細は [`ctype`](../../locale/ctype.md)`::`[`widen`](../../locale/ctype/widen.md.nolink) を参照。
詳細は [`ctype`](../../locale/ctype.md)`::`[`widen`](../../locale/ctype/widen.md) を参照。


## 例
Expand Down Expand Up @@ -49,7 +49,7 @@ int main()
- [`ios_base`](../ios_base.md)`::`[`imbue`](../ios_base/imbue.md)
- [`ios_base`](../ios_base.md)`::`[`getloc`](../ios_base/getloc.md)
- [`ctype`](../../locale/ctype.md)
- [`ctype`](../../locale/ctype.md)`::`[`narrow`](../../locale/ctype/narrow.md.nolink)
- [`ctype`](../../locale/ctype.md)`::`[`widen`](../../locale/ctype/widen.md.nolink)
- [`ctype`](../../locale/ctype.md)`::`[`narrow`](../../locale/ctype/narrow.md)
- [`ctype`](../../locale/ctype.md)`::`[`widen`](../../locale/ctype/widen.md)
- [`use_facet`](../../locale/use_facet.md)
- [`locale`](../../locale/locale.md)
2 changes: 1 addition & 1 deletion reference/ios/ios_base/imbue.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ int main()
```
* imbue[color ff0000]
* std::locale[link ../../locale/locale.md]
* classic[link ../../locale/classic.md.nolink]
* classic[link /reference/locale/locale/classic.md]

### 出力例
```
Expand Down
2 changes: 1 addition & 1 deletion reference/istream/basic_istream/sentry/op_constructor.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ explicit sentry(basic_istream& is, bool noskipws = false);
- `is.`[`rdbuf`](../../../ios/basic_ios/rdbuf.md)`()->`[`underflow`](../../../streambuf/basic_streambuf/underflow.md)`()`の呼び出しが発生するまで、この処理を遅延させても良い。
- `is.`[`rdbuf`](../../../ios/basic_ios/rdbuf.md)`()->`[`underflow`](../../../streambuf/basic_streambuf/underflow.md)`()`の呼び出しが発生しなかったら、この処理を省略して良い(標準ライブラリ実装内部で、そのような最適化を行っても良い)。
1. `noskipws`が`false`かつ`is.`[`flags`](../../../ios/ios_base/flags.md)`() &` [`ios_base`](../../../ios/ios_base.md)`::skipws`が真なら、ストリームから空白文字を読み捨てる。
- 空白文字の判定は、文字`c`について[`use_facet`](../../../locale/use_facet.md)`<`[`ctype`](../../../locale/ctype.md)`<CharT>>(is.`[`getloc`](../../../ios/ios_base/getloc.md)`()).`[`is`](../../../locale/ctype/is.md.nolink)`(`[`ctype`](../../../locale/ctype.md)`::`[`space`](../../../locale/ctype_base.md)`, c)`と等価な方法で行う。
- 空白文字の判定は、文字`c`について[`use_facet`](../../../locale/use_facet.md)`<`[`ctype`](../../../locale/ctype.md)`<CharT>>(is.`[`getloc`](../../../ios/ios_base/getloc.md)`()).`[`is`](../../../locale/ctype/is.md)`(`[`ctype`](../../../locale/ctype.md)`::`[`space`](../../../locale/ctype_base.md)`, c)`と等価な方法で行う。
- このとき`is.`[`rdbuf`](../../../ios/basic_ios/rdbuf.md)`()->`[`sbumpc`](../../../streambuf/basic_streambuf/sbumpc.md)`()`または`is.`[`rdbuf`](../../../ios/basic_ios/rdbuf.md)`()->`[`sgetc`](../../../streambuf/basic_streambuf/sgetc.md)`()`が`Traits::eof()`を返したら、`is.`[`setstate`](../../../ios/basic_ios/setstate.md)`(failbit | eofbit)`を呼び出す。

ここまでの手順が完了したら、このオブジェクトの`operator bool`関数は`true`を、さもなくば`false`を返すようになる。
88 changes: 66 additions & 22 deletions reference/locale/codecvt.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,55 +13,99 @@ namespace std {
* codecvt_base[link /reference/locale/codecvt_base.md]

## 概要
(ここに、クラスの概要を記載する)
`codecvt`は、内部型`internT`の文字列と外部型`externT`の文字列を相互に変換するためのロケールファセットである。

[`basic_filebuf`](/reference/fstream/basic_filebuf.md)は、ファイル上のバイト列(外部型)とプログラム上の文字列(内部型)の変換にこのファセットを使用する。

`stateT`は変換の状態を保持する型であり、状態依存のエンコーディングを扱うために使用される。

## メンバ関数

### publicメンバ関数

| 名前 | 説明 |
|----------------------------------------------------------------|--------------------------------------------------------------------------------------------|
| `(constructor)` | コンストラクタ |
| `out` | 内部型から外部型に変換 |
| in | 外部型から内部型に変換 |
| `unshift` | 変換が不完全だった場合のために、変換の開始位置をずらす |
| `encoding` | 内部型の1文字への変換に必要な外部型の長さを取得する |
| `always_noconv` | 変換を行う必要がないか判定する |
| `length` | 内部型文字列への変換で消費される外部型文字列の長さを取得する |
| `max_length` | 内部型の1文字への変換に必要な外部型の最大の長さを取得する |
| [`(constructor)`](codecvt/op_constructor.md) | コンストラクタ |
| [`out`](codecvt/out.md) | 内部型から外部型に変換 |
| [`in`](codecvt/in.md) | 外部型から内部型に変換 |
| [`unshift`](codecvt/unshift.md) | 文字列を終端するためのシフト状態を戻す文字列を出力する |
| [`encoding`](codecvt/encoding.md) | 内部型の1文字への変換に必要な外部型の長さを取得する |
| [`always_noconv`](codecvt/always_noconv.md) | 変換を行う必要がないか判定する |
| [`length`](codecvt/length.md) | 内部型文字列への変換で消費される外部型文字列の長さを取得する |
| [`max_length`](codecvt/max_length.md) | 内部型の1文字への変換に必要な外部型の最大の長さを取得する |

### 静的メンバ変数

| 名前 | 説明 |
|---------------------------------------------------------------|------|
| `static` [`locale::id`](/reference/locale/locale/id.md) `id;` | |
| `static` [`locale::id`](/reference/locale/locale/id.md) `id;` | このファセットを識別するためのID |

### protectedメンバ関数

| 名前 | 説明 |
|-------------------------------|--------------------------------------------------------------------------------------------|
| `(destructor)` | デストラクタ |
| `do_out` | 内部型から外部型に変換 |
| `do_in` | 外部型から内部型に変換 |
| `do_unshift` | 変換が不完全だった場合のために、変換の開始位置をずらす |
| `do_encoding` | 内部型の1文字への変換に必要な外部型の長さを取得する |
| `do_always_noconv` | 変換を行う必要がないか判定する |
| `do_length` | 内部型文字列への変換で消費される外部型文字列の長さを取得する |
| `do_max_length` | 内部型の1文字への変換に必要な外部型の最大の長さを取得する |
| [`(destructor)`](codecvt/op_destructor.md) | デストラクタ |
| [`do_out`](codecvt/do_out.md) | 内部型から外部型に変換 |
| [`do_in`](codecvt/do_in.md) | 外部型から内部型に変換 |
| [`do_unshift`](codecvt/do_unshift.md) | 文字列を終端するためのシフト状態を戻す文字列を出力する |
| [`do_encoding`](codecvt/do_encoding.md) | 内部型の1文字への変換に必要な外部型の長さを取得する |
| [`do_always_noconv`](codecvt/do_always_noconv.md) | 変換を行う必要がないか判定する |
| [`do_length`](codecvt/do_length.md) | 内部型文字列への変換で消費される外部型文字列の長さを取得する |
| [`do_max_length`](codecvt/do_max_length.md) | 内部型の1文字への変換に必要な外部型の最大の長さを取得する |

### メンバ型
## メンバ型

| 名前 | 説明 |
|--------------------------|-------------------------------------------------|
| `intern_type` | 内部型 `internT` |
| `extern_type` | 外部型 `externT` |
| `state_type` | 変換の状態を表す型 `stateT` |

### 例
## 例
```cpp example
#include <iostream>
#include <locale>
#include <cwchar>

```cpp
int main()
{
using codecvt_t = std::codecvt<wchar_t, char, std::mbstate_t>;
const auto& cv = std::use_facet<codecvt_t>(std::locale::classic());

const char from[] = "abc";
wchar_t to[4] = {};

std::mbstate_t state{};
const char* from_next = nullptr;
wchar_t* to_next = nullptr;

// 外部型(char)から内部型(wchar_t)へ変換する
codecvt_t::result r = cv.in(state, from, from + 3, from_next, to, to + 3, to_next);

*to_next = L'\0';
std::cout << std::boolalpha << (r == codecvt_t::ok) << std::endl;
std::wcout << to << std::endl;
}
```
* std::codecvt[color ff0000]
* cv.in[link codecvt/in.md]
* std::use_facet[link use_facet.md]
* std::locale::classic()[link locale/classic.md]

### 出力
```
true
abc
```

### 参照

## バージョン
### 言語
- C++98


## 関連項目
- [`codecvt_byname`](codecvt_byname.md)
- [`codecvt_base`](codecvt_base.md)
- [`basic_filebuf`](/reference/fstream/basic_filebuf.md)
- [`locale`](locale.md)
51 changes: 51 additions & 0 deletions reference/locale/codecvt/always_noconv.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
# always_noconv
* locale[meta header]
* std[meta namespace]
* codecvt[meta class]
* function[meta id-type]

```cpp
bool always_noconv() const throw(); // (1) C++98
bool always_noconv() const noexcept; // (1) C++11
```

## 概要
変換を行う必要がないか判定する。


## 戻り値
[`do_always_noconv()`](do_always_noconv.md)


## 例
```cpp example
#include <iostream>
#include <locale>
#include <cwchar>

int main()
{
using codecvt_t = std::codecvt<wchar_t, char, std::mbstate_t>;
const auto& cv = std::use_facet<codecvt_t>(std::locale::classic());

// wchar_tとcharの間では変換が必要
std::cout << std::boolalpha << cv.always_noconv() << std::endl;
}
```
* always_noconv[color ff0000]
* std::codecvt[link /reference/locale/codecvt.md]
* std::use_facet[link /reference/locale/use_facet.md]
* std::locale::classic()[link /reference/locale/locale/classic.md]

### 出力
```
false
```

## バージョン
### 言語
- C++98


## 関連項目
- [`codecvt::do_always_noconv`](do_always_noconv.md)
28 changes: 28 additions & 0 deletions reference/locale/codecvt/do_always_noconv.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# do_always_noconv
* locale[meta header]
* std[meta namespace]
* codecvt[meta class]
* function[meta id-type]

```cpp
protected:
virtual bool do_always_noconv() const throw(); // (1) C++98
virtual bool do_always_noconv() const noexcept; // (1) C++11
```

## 概要
変換を行う必要がないか判定する。[`always_noconv()`](always_noconv.md)から呼び出される仮想関数である。


## 戻り値
すべての妥当な実引数について[`do_in()`](do_in.md)と[`do_out()`](do_out.md)が`noconv`を返す場合は`true`、そうでない場合は`false`。

特殊化`codecvt<char, char, mbstate_t>`は`true`を返す。

## バージョン
### 言語
- C++98


## 関連項目
- [`codecvt::always_noconv`](always_noconv.md)
32 changes: 32 additions & 0 deletions reference/locale/codecvt/do_encoding.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# do_encoding
* locale[meta header]
* std[meta namespace]
* codecvt[meta class]
* function[meta id-type]

```cpp
protected:
virtual int do_encoding() const throw(); // (1) C++98
virtual int do_encoding() const noexcept; // (1) C++11
```

## 概要
内部型の1文字への変換に必要な外部型の長さを取得する。[`encoding()`](encoding.md)から呼び出される仮想関数である。


## 戻り値
- `externT`のエンコーディングが状態依存である場合、`-1`
- そうでない場合、内部型の1文字を生成するために必要な`externT`の文字数(一定である場合)
- その文字数が一定でない場合、`0`


## 備考
`encoding()`が`-1`を返す場合、内部型の1文字を生成するために[`max_length()`](max_length.md)より多くの`externT`要素が消費されることがある。また、最後の内部型文字を生成した要素の後ろに、追加の`externT`要素が現れることがある。

## バージョン
### 言語
- C++98


## 関連項目
- [`codecvt::encoding`](encoding.md)
52 changes: 52 additions & 0 deletions reference/locale/codecvt/do_in.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
# do_in
* locale[meta header]
* std[meta namespace]
* codecvt[meta class]
* function[meta id-type]

```cpp
protected:
virtual result
do_in(stateT& state,
const externT* from,
const externT* from_end,
const externT*& from_next,
internT* to,
internT* to_end,
internT*& to_next) const; // (1) C++98
```

## 概要
外部型の文字列を内部型の文字列へ変換する。[`in()`](in.md)から呼び出される仮想関数である。


## 事前条件
`from <= from_end && to <= to_end`が妥当な式であり、定義された動作をすること。またその結果が`true`であること。

`state`は、シーケンスの先頭であれば初期化されていること。そうでなければ、シーケンス内の先行する文字を変換した結果と等しいこと。


## 効果
範囲`[from, from_end)`の文字を変換し、結果を`to`から順に格納する。変換する要素数は`(from_end - from)`以下、格納する要素数は`(to_end - to)`以下である。

変換できない文字に遭遇した場合は、そこで変換を停止する。`from_next`と`to_next`は、常に変換に成功した最後の要素の1つ次を指す。


## 戻り値
[`codecvt_base::result`](/reference/locale/codecvt_base.md)の列挙値。意味は[`do_out()`](do_out.md)と同じである。


## 備考
`state`に対する操作は未規定である。

[`basic_filebuf`](/reference/fstream/basic_filebuf.md)が使用する`codecvt`ファセットは、`to != to_end`で`do_in(state, from, from_end, from_next, to, to_end, to_next)`が`ok`を返すならば、`do_in(state, from, from_end, from_next, to, to + 1, to_next)`も`ok`を返す、という性質を持つ必要がある。

## バージョン
### 言語
- C++98


## 関連項目
- [`codecvt::in`](in.md)
- [`codecvt::do_out`](do_out.md)
- [`codecvt_base`](/reference/locale/codecvt_base.md)
Loading
Loading