Interfaceの実装

Interfaceの実装

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

# 構文

  • 構文は明確には定まっている訳ではなく[[anatofuz>/user/anatofuz]]が勝手に考えているものです
    • 2019/12/25までの論文ではInterfaceの定義の記述のみしか存在していない為です
1
2
3
4
5
6
7
8
9
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に継続する必要があります
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy