- ここではStackのInterfaceについて見てみましょう
|
|
# stackのAPI
StackのInterfaceでは、StackのAPIとして、幾つかのCodeGear(=メソッド)を提供しています。
- whenEmpty
- Stack内部が空だった場合に行われる継続
- clear
- Stack内部の初期化
- push
Type* data
を引数として受け取り、Stackにpush(最後に追加)する
- pop
- Stackから値を取り出し、次の継続の引数として渡す
- isEmpty
- Stackの内部が空でない場合は
next
に継続し、空である場合はwehenEmpty
に継続する
- Stackの内部が空でない場合は
- get
- 入出力のデータはpopと変わらないが、おそらくStackを破壊しない
# next
- nextは次に継続するCodeGearを指します
- 具体的にどういう引数が来るかは、継続先によって異なるので
...
で表現しています
- 具体的にどういう引数が来るかは、継続先によって異なるので
- pop/getは次の継続にデータを渡す必要があります
- この場合は
next
の第一引数の対象のデータを記述することで生成できます
- この場合は
# union Data
- Stackのdata1, data2はともに
union Data*
で表現されています- GearsOSのシステムでは、すべてのデータはDataGearとして、Context内で
union Data
で管理されています - その為、data1, data2は一種の総称型(generics)の役割を果たしています
- GearsOSのシステムでは、すべてのデータはDataGearとして、Context内で
# union Data* stack
- interfaceの定義の最初には
union Data* stack
を書く必要があります- これにはInterfaceを実装した実態が入ります
- 例えばStackの場合はSingleLinkedStack, DoublyLinkedStackなど
- Interface側ではどのような型が来るのか判断できない為、 genericsである
union Data*
が入ります
- これにはInterfaceを実装した実態が入ります
# DataGearへの変換
StackInterfacehは、 generate_context.pl
内部で context.h へDataGearに変換されて出力されます。
前述の通りunion Data
の中に定義が生成されます。
|
|
- 変換された
struct Stack
はCの構造体となります - CodeGearは
enum Code
にすべて変換されます- 構造体がもつ
enum Code
には、入出力の情報が存在しません - 具体的にどんなCodeGearが実行されるかは、 このInterfaceの初期化時に決定します
- 構造体がもつ
- この構造体は、Interfaceの実装側で初期化します