- ここでは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の実装側で初期化します