Mercurial > hg > Papers > 2017 > mitsuki-thesis
comparison final_main/chapter5.tex @ 7:10c4d21cc7f4
update
author | mir3636 |
---|---|
date | Tue, 14 Feb 2017 22:02:53 +0900 |
parents | 5b368e14bb64 |
children | b35c8fcff7d5 |
comparison
equal
deleted
inserted
replaced
6:5b368e14bb64 | 7:10c4d21cc7f4 |
---|---|
68 else | 68 else |
69 goto whenEmpty(...); | 69 goto whenEmpty(...); |
70 } | 70 } |
71 \end{lstlisting} | 71 \end{lstlisting} |
72 | 72 |
73 \begin{lstlisting}[frame=lrbt,label=stack_c,caption={\footnotesize SingleLinkedStack.c}] | 73 \begin{lstlisting}[frame=lrbt,label=stack_c,caption={\footnotesize 生成される stub}] |
74 #include "../context.h" | |
75 | |
76 Stack* createSingleLinkedStack(struct Context* context) { | |
77 struct Stack* stack = &ALLOCATE(context, Stack)->Stack; | |
78 struct SingleLinkedStack* singleLinkedStack = &ALLOCATE(context, SingleLinkedStack)->SingleLinkedStack; | |
79 stack->stack = (union Data*)singleLinkedStack; | |
80 singleLinkedStack->top = NULL; | |
81 stack->push = C_pushSingleLinkedStack; | |
82 stack->pop = C_popSingleLinkedStack; | |
83 stack->pop2 = C_pop2SingleLinkedStack; | |
84 stack->get = C_getSingleLinkedStack; | |
85 stack->get2 = C_get2SingleLinkedStack; | |
86 stack->isEmpty = C_isEmptySingleLinkedStack; | |
87 stack->clear = C_clearSingleLinkedStack; | |
88 return stack; | |
89 } | |
90 | |
91 __code clearSingleLinkedStack(struct Context *context,struct SingleLinkedStack* stack,enum Code next) { | 74 __code clearSingleLinkedStack(struct Context *context,struct SingleLinkedStack* stack,enum Code next) { |
92 stack->top = NULL; | 75 stack->top = NULL; |
93 goto meta(context, next); | 76 goto meta(context, next); |
94 } | 77 } |
95 | 78 |
96 __code clearSingleLinkedStack_stub(struct Context* context) { | 79 __code clearSingleLinkedStack_stub(struct Context* context) { |
97 SingleLinkedStack* stack = (SingleLinkedStack*)GearImpl(context, Stack, stack); | 80 SingleLinkedStack* stack = (SingleLinkedStack*)GearImpl(context, Stack, stack); |
98 enum Code next = Gearef(context, Stack)->next; | 81 enum Code next = Gearef(context, Stack)->next; |
99 goto clearSingleLinkedStack(context, stack, next); | 82 goto clearSingleLinkedStack(context, stack, next); |
100 } | 83 } |
101 | |
102 __code pushSingleLinkedStack(struct Context *context,struct SingleLinkedStack* stack,union Data* data, enum Code next) { | |
103 Element* element = &ALLOCATE(context, Element)->Element; | |
104 element->next = stack->top; | |
105 element->data = data; | |
106 stack->top = element; | |
107 goto meta(context, next); | |
108 } | |
109 | |
110 __code pushSingleLinkedStack_stub(struct Context* context) { | |
111 SingleLinkedStack* stack = (SingleLinkedStack*)GearImpl(context, Stack, stack); | |
112 Data* data = Gearef(context, Stack)->data; | |
113 enum Code next = Gearef(context, Stack)->next; | |
114 goto pushSingleLinkedStack(context, stack, data, next); | |
115 } | |
116 | |
117 __code popSingleLinkedStack(struct Context *context,struct SingleLinkedStack* stack, enum Code next,union Data **O_data) { | |
118 Data* data; | |
119 if (stack->top) { | |
120 data = stack->top->data; | |
121 stack->top = stack->top->next; | |
122 } else { | |
123 data = NULL; | |
124 } | |
125 *O_data = data; | |
126 goto meta(context, next); | |
127 } | |
128 | |
129 __code popSingleLinkedStack_stub(struct Context* context) { | |
130 SingleLinkedStack* stack = (SingleLinkedStack*)GearImpl(context, Stack, stack); | |
131 enum Code next = Gearef(context, Stack)->next; | |
132 Data** O_data = &Gearef(context, Stack)->data; | |
133 goto popSingleLinkedStack(context, stack, next, O_data); | |
134 } | |
135 | |
136 __code getSingleLinkedStack(struct Context *context,struct SingleLinkedStack* stack, enum Code next,union Data **O_data) { | |
137 Data* data; | |
138 if (stack->top) | |
139 data = stack->top->data; | |
140 else | |
141 data = NULL; | |
142 *O_data = data; | |
143 goto meta(context, next); | |
144 } | |
145 | |
146 __code getSingleLinkedStack_stub(struct Context* context) { | |
147 SingleLinkedStack* stack = (SingleLinkedStack*)GearImpl(context, Stack, stack); | |
148 enum Code next = Gearef(context, Stack)->next; | |
149 Data** O_data = &Gearef(context, Stack)->data; | |
150 goto getSingleLinkedStack(context, stack, next, O_data); | |
151 } | |
152 | |
153 __code isEmptySingleLinkedStack(struct Context *context,struct SingleLinkedStack* stack, enum Code next, enum Code whenEmpty) { | |
154 if (stack->top) | |
155 goto meta(context, next); | |
156 else | |
157 goto meta(context, whenEmpty); | |
158 } | |
159 | |
160 | |
161 __code isEmptySingleLinkedStack_stub(struct Context* context) { | |
162 SingleLinkedStack* stack = (SingleLinkedStack*)GearImpl(context, Stack, stack); | |
163 enum Code next = Gearef(context, Stack)->next; | |
164 enum Code whenEmpty = Gearef(context, Stack)->whenEmpty; | |
165 goto isEmptySingleLinkedStack(context, stack, next, whenEmpty); | |
166 } | |
167 | |
168 \end{lstlisting} | 84 \end{lstlisting} |
169 | 85 |
170 \section{Context の生成} | 86 \section{Context の生成} |
171 Context は Meta Data Gear に相当し、Code Gear や Data Gear を管理している。 | 87 Context は Meta Data Gear に相当し、Code Gear や Data Gear を管理している。 |
172 Data Gear を取得するために perl スクリプトは context の定義 (リスト\ref{context}) を読み宣言された Data Gear を取得する。 | 88 Data Gear を取得するために perl スクリプトは context の定義 (リスト\ref{context}) を読み宣言された Data Gear を取得する。 |