white_space企画の現状 stackモジュール ver 0.1.4.0

white_spaceでstack構造をデータ型の一つにしてるので
頑張って書きました heap構造も使ってるのでそっちも更新せねば
モジュール変数で要素を管理してるモジュールと
ラップしてモジュール変数決め打ちモジュールの二つを記述しています
0.1.2.1 setter と getter のラップ増やしました

#module stack_model
について
後入れ先出し構造のstackのデータ型の
データを扱うモジュールです

モジュール変数メンバ
stack_size
stackのデータのsizeです
int型
stack_current
stackの中の現在地を示す変数です
int型
stack_contents
stack型データを格納する
モジュール変数の配列データです
データ一つは mdl_one_value 型のオブジェクトです

コンストラクタ
引数:int p_size
stack_sizeとstack_curerentにp_sizeを代入し
p_sizeの値だけmdl_one_value型の
stack_contentsを作成します

#modfunc local set_current
引数:int p_int
stack_currentのsetterです。
p_intの値を代入

#modfunc local set_contents
引数1:var p_value
引数2:int p_index
stack_contentsのsetterです。
p_indexの場所にp_valueを代入

#modcfunc local get_size
stack_sizeのgetter
local get_contents
引数:int p_index
stack_contentsのgetterです
p_indexの場所の値を返す

#modcfunc local get_current
stackの現在値のgetter

#modcfunc local get_contents
引数: int p_index
stackのp_index番目の値を返す

#modcfunc local ret_vartype
引数:int p_index
stack_contentsのp_index番目の値の型を
数値で返す

#modcfunc local tostr_vartype
引数:int p_index
stack_contentsのp_index番目の値の型を
文字列で返す


#modfunc local push
引数:var _p_val
stackのデータに_p_valの値をpushする

#modcfunc local pop
stackのデータをpopします
値は返り値として返します

#modcfunc local top
stackのデータを取得します。currentは変化しません
値は返り値として返します

#modcfunc local peak
stackをpeakします
値は返り値として返します

#modfunc local cleanup
stack型のデータを削除します

newmod stack,stack_model,STACK_MEMBERS@
このモジュールでは何種類のstack型データを共存させる
モジュールと(ここより上の動作)
決め打ちで1つのみ作成するモジュールを定義しています
1つのみのデータはオブジェクトを指定しなくていいので
少しは直感的に操作出来ると思います

// 後入れ先出し構造のstackのデータ型の
// データを扱うモジュールです

#include "mdl_value.as"
#include "mdl_value.as" //includeガードが効いてるかのTEST

#include "mdl_ws_define.as"
#include "mdl_ws_define.as" //includeガードが効いてるかのTEST

//	long size;
//	long current;
//	long long* contents;
//} stack;
// モジュール変数メンバ
// stack_size
// stackのデータのsizeです
// int型
// stack_current
// stackの中の現在地を示す変数です
// int型
// stack_contents
// stack型データを格納する
// モジュール変数の配列データです
// データ一つは mdl_one_value 型のオブジェクトです
#module stack_model stack_size,stack_current,stack_contents
// コンストラクタ
// 引数:int p_size
// stack_sizeとstack_curerentにp_sizeを代入し
// p_sizeの値だけmdl_one_value型の
// stack_contentsを作成します
#modinit int p_size
	stack_size = p_size
	stack_current = p_size
	repeat p_size
		newmod stack_contents,mdl_one_value
	loop
;	dim stack_contents,STACK_MEMBERS@
	return
;#modfunc local set_size int p_int
;	stack_size = p_int
;	return
// stack_currentのsetterです。
// p_intの値を代入
#modfunc local set_current int p_int
	stack_current = p_int
	return
// stack_contentsのsetterです。
// p_indexの場所にp_valueを代入
#modfunc local set_contents var p_value,int p_index
	set@mdl_one_value stack_contents.p_index,p_value 
//	stack_contents.p_index = p_value
	return
// stack_contentsのgetterです
// p_indexの場所の値を返す
#modcfunc local get_size
	return stack_size
// stackの現在値のgetter
#modcfunc local get_current
	return stack_current
// stackのp_index番目の値を返す
#modcfunc local get_contents int p_index
	tmp_index=STACK_MEMBERS@
	if p_index >=STACK_MEMBERS@{tmp_index=STACK_MEMBERS@-1}
;	logmes ""+STACK_MEMBERS@+" "+p_index
;	return stack_contents.p_index
	return get@mdl_one_value(stack_contents.p_index)
// stack_contentsのp_index番目の値の型を
// 数値で返す
#modcfunc local ret_vartype int p_index
	return ret_vartype@mdl_one_value(stack_contents.p_index)
;	return tmp;@mdl_one_value(stack_contents.0)
// stack_contentsのp_index番目の値の型を
// 文字列で返す
#modcfunc local tostr_vartype int p_index
	return tostr_vartype@mdl_one_value(stack_contents.p_index)
;	return tmp;@mdl_one_value(stack_contents.0)
//bool stack_push(long long val)
//{
//	if (stack.current >= 1) {
//		stack.current--;
//		stack.contents[stack.current] = val;
//		return true;
//	}
//	return false;
//}
// stackのデータに_p_valの値をpushする
#modfunc local push var _p_val
	if stack_current >= 1{
		stack_current--
		set@mdl_one_value stack_contents.stack_current,_p_val
		return 1
	}
	return 0
//long long stack_pop(void)
//{
//	if (stack.current < stack.size) {
//		stack.current++;
//		return stack.contents[stack.current - 1];
//	}
//	return 0;
//}
// stackのデータをpopします
// 値は返り値として返します
#modcfunc local pop local loc_pop
	if stack_current < stack_size {
		stack_current++
		loc_pop=stack_current-1
		return get@mdl_one_value(stack_contents.loc_pop)
	}
	return 0
// stackのデータを取得します。currentは変化しません
// 値は返り値として返します
#modcfunc local top
	if stack_current < stack_size {
		return get@mdl_one_value(stack_contents.stack_current)
	}
	return 0
//long long stack_peak(int depth)
//{
//	if ((stack.current + depth) < stack.size) {
//		return stack.contents[stack.current + depth];
//	}
//	return 0;
//}
// stackをpeakします
// 値は返り値として返します
#modcfunc local peak int p_depth, local loc_depth
	if stack_current + p_depth < stack_size {
		loc_depth=stack_current + p_depth
		return get@mdl_one_value(stack_contents.loc_depth)
	}
	return 0
//void cleanup_stack(void)
//{
//	free (stack.contents);
//	return;
//}
// stack型のデータを削除します
#modfunc local cleanup
	i=0
	for i,stack_size-1,-1,-1
		delmod stack_contents.i
	next
	return
#global
// このモジュールでは何種類のstack型データを共存させる
// モジュールと(ここより上の動作)
// 決め打ちで1つのみ作成するモジュールを定義しています
// 1つのみのデータはオブジェクトを指定しなくていいので
// 少しは直感的に操作出来ると思います
//↓重要w
newmod stack,stack_model,STACK_MEMBERS@
#if 1
;set_size@stack_model stack,20
set_current@stack_model stack,5
repeat 5
nn=cnt*2
set_contents@stack_model stack,nn,cnt
loop
repeat 5,5
nn=12.3+cnt
set_contents@stack_model stack,nn,cnt
loop
repeat 5,10
nn="abc"+cnt
set_contents@stack_model stack,nn,cnt
loop

logmes "stack size:"+get_size@stack_model(stack)
logmes "stack current:"+get_current@stack_model(stack)
repeat 15
logmes "stack contents "+cnt+":"+get_contents@stack_model(stack,cnt)
logmes "type "+cnt+":"+ret_vartype@stack_model(stack,cnt)+" "+tostr_vartype@stack_model(stack,cnt)
loop

newmod test_st,stack_model,20
tmp_test=555
push@stack_model test_st,tmp_test
tmp_test=777
push@stack_model test_st,tmp_test
tmp_test=5
push@stack_model test_st,tmp_test
tmp_test=12.3
push@stack_model test_st,tmp_test
tmp_test="abc"
push@stack_model test_st,tmp_test
tmp_test=246
push@stack_model test_st,tmp_test
logmes "top:"+top@stack_model(test_st)
logmes "peak 1:"+peak@stack_model(test_st,1)
logmes "peak 2:"+peak@stack_model(test_st,2)
logmes "pop:"+pop@stack_model(test_st)
logmes "pop:"+pop@stack_model(test_st)
logmes "top:"+top@stack_model(test_st)
logmes "pop:"+pop@stack_model(test_st)
logmes "pop:"+pop@stack_model(test_st)
#endif

#if 0
cleanup@stack_model(test_st)
delmod test_st
#endif
// つづく

#deffunc create_stack
stackのデータを初期化

#deffunc stack_set_current
引数:int _p_int
stackの現在値を_p_intにする

#defcfunc stack_get_size
stackのsizeを返す

#defcfunc stack_get_current
stackの現在値を返す

#defcfunc stack_ret_vartype
引数:int _p_int
stackの_p_int番目の値の型を返す(数値)

#defcfunc stack_tostr_vartype
引数:int _p_int
stackの_p_int番目の値の型を返す(文字列)


#defcfunc stack_push
引数: var p_val
stackにp_valの値をpushする

#defcfunc stack_pop
stackからpopする(返り値として返す)

#defcfunc stack_top
stackのtopの値を返す

#defcfunc stack_peak
引数:int _p_peak
stackからpeakする

#deffunc stack_cleanup
stackを破棄する

// つづきここから
/*
bool create_stack(void)
{
	if (stack.contents = (long long*)calloc(STACK_MEMBERS, sizeof(long long))) {
		stack.size = STACK_MEMBERS;
		stack.current = STACK_MEMBERS;
		return true;
	} 
	return false;
}*/
#module
//stackのデータを初期化
#deffunc create_stack
// stackのsizeは途中から変えれなくなったw
	repeat STACK_MEMBERS
		set_contents@stack_model stack@,0,cnt
	loop
;	set_size@stack_model stack@,STACK_MEMBERS@
	set_current@stack_model stack@,STACK_MEMBERS@
	return 1
//stackの現在値を_p_intにする
#deffunc stack_set_current int _p_int
	set_current@stack_model stack@,_p_int
	return
//stackのsizeを返す
#defcfunc stack_get_size
	return get_size@stack_model(stack@)
//stackの現在値を返す
#defcfunc stack_get_current
	return get_current@stack_model(stack@)
//stackの_p_int番目の値の型を返す(数値)
#defcfunc stack_ret_vartype int _p_int
	return ret_vartype@stack_model(stack@,_p_int)
//stackの_p_int番目の値の型を返す(文字列)
#defcfunc stack_tostr_vartype int _p_int
	return tostr_vartype@stack_model(stack@,_p_int)
//stackにp_valの値をpushする
#defcfunc stack_push var p_val,local loc_spush
	loc_spush=p_val
	push@stack_model stack@,loc_spush
	return stat
//stackからpopする(返り値として返す)
#defcfunc stack_pop
	return pop@stack_model(stack@)
//stackのtopの値を返す
#defcfunc stack_top
	return top@stack_model(stack@)
//stackからpeakする
#defcfunc stack_peak int _p_peak
	return peak@stack_model(stack@,_p_peak)
//stackを破棄する
#deffunc stack_cleanup
	cleanup@stack_model(stack@)
	delmod stack@
	return
#global
#if 1
create_stack
logmes "size "+stack_get_size()
tmp4log=10
logmes "push "+stack_push(tmp4log)+" "+tmp4log
tmp4log=23.4
logmes "push "+stack_push(tmp4log)+" "+tmp4log
tmp4log=30
logmes "push "+stack_push(tmp4log)+" "+tmp4log
tmp4log="abc"
logmes "push "+stack_push(tmp4log)+" "+tmp4log
tmp4log=20
logmes "push "+stack_push(tmp4log)+" "+tmp4log
tmp4log=34.5
logmes "push "+stack_push(tmp4log)+" "+tmp4log
tmp_cur=stack_get_current()
logmes "cur "+tmp_cur
logmes "type "+stack_ret_vartype(tmp_cur)
logmes "type "+stack_tostr_vartype(tmp_cur)
logmes "type "+stack_ret_vartype(tmp_cur-1)
logmes "type "+stack_tostr_vartype(tmp_cur-1)
logmes "top "+stack_top()
tmp4log=40
logmes "push "+stack_push(tmp4log)+" "+tmp4log
tmp4log="top"
logmes "push "+stack_push(tmp4log)+" "+tmp4log
logmes "top "+stack_top()
logmes "peak 1 "+stack_peak(1)
logmes "peak 2 "+stack_peak(2)
logmes "pop "+stack_pop()
logmes "pop "+stack_pop()
logmes "top "+stack_top()
logmes "peak 1 "+stack_peak(1)
logmes "pop "+stack_pop()
logmes "pop "+stack_pop()
logmes "cur "+stack_get_current()
stack_set_current 700
logmes "cur "+stack_get_current()
tmp4log=12.3456
logmes "push "+stack_push(tmp4log)+" "+tmp4log
#endif
#if 0
stack_cleanup
#endif