# 機能設計書 27-リクエストサイズ取得

## 概要

本ドキュメントは、libuv の `uv_req_size()` API によるリクエスト型ごとのメモリサイズ取得機能について、その設計仕様を記述する。

### 本機能の処理概要

`uv_req_size()` は、指定されたリクエスト型（`uv_req_type`）に対応する構造体のメモリサイズ（バイト数）を返却する関数である。

**業務上の目的・背景**：libuv のリクエスト構造体はプラットフォームごとに内部フィールドが異なるため、コンパイル時にサイズが確定しない場合がある。FFI バインディングや動的メモリ確保を行う言語ランタイムが、正確なリクエスト構造体サイズを実行時に取得するために本関数が必要となる。`uv_handle_size()`（No.21）のリクエスト版である。

**機能の利用シーン**：他言語バインディングでリクエスト構造体を動的確保する際、カスタムメモリプールでリクエスト用領域を事前確保する際に使用される。

**主要な処理内容**：
1. 引数の `uv_req_type` 列挙値を switch 文で分岐
2. `UV_REQ_TYPE_MAP` マクロにより各リクエスト型に対応する `sizeof(uv_xxx_t)` を返却
3. 未知のリクエスト型が渡された場合は `(size_t) -1` を返却

**関連システム・外部連携**：特になし。

**権限による制御**：権限による制御は存在しない。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 8 | リクエスト基底 | 主機能 | uv_req_size()によるリクエスト型メモリサイズ取得のAPI定義 |

## 機能種別

データ参照（メモリサイズ情報の取得）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| type | uv_req_type | Yes | サイズを取得したいリクエストの型を示す列挙値 | UV_REQ_TYPE_MAP に含まれる型であること |

### 入力データソース

関数の引数として直接指定される。

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 戻り値 | size_t | 指定されたリクエスト型に対応する構造体のバイトサイズ。不正な型の場合は `(size_t) -1` |

### 出力先

関数の戻り値として呼び出し元に返却される。

## 処理フロー

### 処理シーケンス

```
1. uv_req_size(type) が呼び出される
2. UV_REQ_TYPE_MAP マクロで展開された switch 文により分岐
   └─ UV_REQ → sizeof(uv_req_t)
   └─ UV_CONNECT → sizeof(uv_connect_t)
   └─ UV_WRITE → sizeof(uv_write_t)
   └─ ... （全10リクエスト型）
3. 一致する型がない場合は default 分岐
   └─ (size_t) -1 を返却
```

### フローチャート

```mermaid
flowchart TD
    A[uv_req_size 呼び出し] --> B{type が有効なリクエスト型か?}
    B -->|Yes| C["sizeof(uv_xxx_t) を返却"]
    B -->|No| D["(size_t) -1 を返却"]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-27-01 | 型マップ網羅 | UV_REQ_TYPE_MAP に登録された全リクエスト型のサイズを返却可能であること | 常時 |
| BR-27-02 | 不正型ハンドリング | 無効な型が渡された場合は (size_t) -1 を返却すること | 型が UV_REQ_TYPE_MAP に含まれない場合 |

### 計算ロジック

`sizeof` 演算子によるコンパイル時定数の返却。

## データベース操作仕様

該当なし。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| (size_t) -1 | 不正引数 | 無効な uv_req_type 値が渡された場合 | 呼び出し元で戻り値を検証する |

### リトライ仕様

リトライは不要。

## トランザクション仕様

該当なし。

## パフォーマンス要件

O(1) で即座に完了する。

## セキュリティ考慮事項

特になし。

## 備考

- `UV_REQ_TYPE_MAP` マクロに含まれるリクエスト型: REQ, CONNECT, WRITE, SHUTDOWN, UDP_SEND, FS, WORK, GETADDRINFO, GETNAMEINFO, RANDOM
- `uv_handle_size()`（No.21）と同じ XX マクロパターンを使用しており、同じファイル内で連続して定義されている。

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | uv.h | `include/uv.h` | **179-190行目**: UV_REQ_TYPE_MAP マクロの定義。全リクエスト型を列挙 |
| 1-2 | uv.h | `include/uv.h` | **207-214行目**: uv_req_type 列挙型の定義 |

**読解のコツ**: `UV_REQ_TYPE_MAP(XX)` は `UV_HANDLE_TYPE_MAP` と同じ X マクロパターンである。`XX(uc, lc)` の形式で展開され、`XX(CONNECT, connect)` は `UV_CONNECT` と `uv_connect_t` を生成する。

#### Step 2: エントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | uv.h | `include/uv.h` | **490行目**: uv_req_size() の宣言 |

#### Step 3: 実装を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | uv-common.c | `src/uv-common.c` | **164行目**: XX マクロ定義（uv_handle_size と共有）|
| 3-2 | uv-common.c | `src/uv-common.c` | **174-180行目**: uv_req_size() の実装 |

**主要処理フロー**:
- **174行目**: uv_req_size 関数開始
- **175行目**: switch(type) 分岐開始
- **176行目**: UV_REQ_TYPE_MAP(XX) で全リクエスト型の case 文を展開
- **177-178行目**: default で -1 を返却
- **182行目**: `#undef XX` でマクロを解除

### プログラム呼び出し階層図

```
uv_req_size(type)
    └─ switch(type)
           ├─ case UV_REQ:        return sizeof(uv_req_t)
           ├─ case UV_CONNECT:    return sizeof(uv_connect_t)
           ├─ case UV_WRITE:      return sizeof(uv_write_t)
           ├─ case UV_SHUTDOWN:   return sizeof(uv_shutdown_t)
           ├─ ... (他のリクエスト型)
           └─ default:            return (size_t) -1
```

### データフロー図

```
[入力]               [処理]                    [出力]

uv_req_type ─────▶ switch + sizeof演算 ───▶ size_t (バイトサイズ)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| uv.h | `include/uv.h` | ヘッダ | API宣言、UV_REQ_TYPE_MAP マクロ定義、uv_req_type 列挙型定義 |
| uv-common.c | `src/uv-common.c` | ソース | uv_req_size() の実装 |
