Stack interface

Stack interface

  • ここではStackのInterfaceについて見てみましょう
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
typedef struct Stack<Type, Impl>{
        union Data* stack;
        union Data* data;
        union Data* data1;
        /* Type* stack; */
        /* Type* data; */
        /* Type* data1; */
        __code whenEmpty(...);
        __code clear(Impl* stack,__code next(...));
        __code push(Impl* stack,Type* data, __code next(...));
        __code pop(Impl* stack, __code next(Type* data, ...));
        __code pop2(Impl* stack, __code next(Type* data, Type* data1, ...));
        __code isEmpty(Impl* stack, __code next(...), __code whenEmpty(...));
        __code get(Impl* stack, __code next(Type* data, ...));
        __code get2(Impl* stack, __code next(Type* data, Type* data1, ...));
        __code next(...);
} Stack;

# stackのAPI

StackのInterfaceでは、StackのAPIとして、幾つかのCodeGear(=メソッド)を提供しています。

  • whenEmpty
    • Stack内部が空だった場合に行われる継続
  • clear
    • Stack内部の初期化
  • push
    • Type* dataを引数として受け取り、Stackにpush(最後に追加)する
  • pop
    • Stackから値を取り出し、次の継続の引数として渡す
  • isEmpty
    • Stackの内部が空でない場合はnextに継続し、空である場合はwehenEmpty に継続する
  • get
    • 入出力のデータはpopと変わらないが、おそらくStackを破壊しない

# next

  • nextは次に継続するCodeGearを指します
    • 具体的にどういう引数が来るかは、継続先によって異なるので...で表現しています
  • pop/getは次の継続にデータを渡す必要があります
    • この場合はnextの第一引数の対象のデータを記述することで生成できます

# union Data

  • Stackのdata1, data2はともに union Data* で表現されています
    • GearsOSのシステムでは、すべてのデータはDataGearとして、Context内で union Dataで管理されています
    • その為、data1, data2は一種の総称型(generics)の役割を果たしています

# union Data* stack

  • interfaceの定義の最初には union Data* stackを書く必要があります
    • これにはInterfaceを実装した実態が入ります
      • 例えばStackの場合はSingleLinkedStack, DoublyLinkedStackなど
    • Interface側ではどのような型が来るのか判断できない為、 genericsである union Data* が入ります

# DataGearへの変換

StackInterfacehは、 generate_context.pl内部で context.h へDataGearに変換されて出力されます。

前述の通りunion Dataの中に定義が生成されます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
    struct Stack {
        union Data* stack;
        union Data* data;
        union Data* data1;
        enum Code whenEmpty;
        enum Code clear;
        enum Code push;
        enum Code pop;
        enum Code pop2;
        enum Code isEmpty;
        enum Code get;
        enum Code get2;
        enum Code next;
    } Stack;
  • 変換された struct StackはCの構造体となります
  • CodeGearは enum Codeにすべて変換されます
    • 構造体がもつenum Codeには、入出力の情報が存在しません
    • 具体的にどんなCodeGearが実行されるかは、 このInterfaceの初期化時に決定します
  • この構造体は、Interfaceの実装側で初期化します
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy