view Gears/introduction/interface/impl.md @ 2:b6c284fd5ae4

backup 2020-12-16
author autobackup
date Wed, 16 Dec 2020 15:11:16 +0900
parents e12992dca4a0
children
line wrap: on
line source

# Interfaceの実装

- [[Interfaceの定義については確認しました>../about]]
- 続いては定義したInterfaceに具体的な実装を書いていきます

# 構文

- 構文は明確には定まっている訳ではなく[[anatofuz>/user/anatofuz]]が勝手に考えているものです
    - 2019/12/25までの論文ではInterfaceの定義の記述のみしか存在していない為です
    
```c
typedef struct ImplName<Type, Isa> impl <InterfaceName> {
  struct pipe* p;
  int i;
  int n;
  __code cbc_piperead1(Type* sys_read, struct pipe* p, __code next(...));
  __code cbc_piperead2(Type* sys_read, int i, int n, struct pipe* p, __code next(...));
  __code cbc_piperead3(Type* sys_read, int i, struct pipe* p, __code next(...));
  __code next(...);
} ImplName;
```

- 構文はInterfaceの構文と似ています

## 解説

### 1行目(実装名の定義)

- 先頭に「実装の構造体の名前」「実装するInterfaceの名前」を書きます
- `typedef struct ImplName<Type, Isa> impl <InterfaceName>`
    - `typedef struct`の直後の実装名を書きます
    - `impl`の後の `<>` の中にInterface名をいれます
        - 現時点では実装できるInterfaceは1つだけになっています
- `<Type, Isa>`については後ほど解説します        

### DataGear部分

- Interfaceと同じ様にImpl内で使う引数を列挙します
    - Interfaceで定義したAPIの引数ではありません

### CodeGear部分
- `__code name()`で記述します
- `Type`が「自分自身の型」であり Isaが「Interfaceの型」のエイリアスです
- これらのCodeGearはInterfaceが提供するものではないので、一種のprivate methodです
    - Interfaceの使用側からは意識しないCodeGearになります
    - Interfaceで登録された`next`に継続する必要があります