white_space企画の現状 heapモジュール ver 0.1.2.5

white_spaceでheap構造をデータ型の一つにしてるので

頑張って書きました

モジュール変数で要素を管理してるモジュールと

ラップしてモジュール変数決め打ちモジュールの二つを記述しています

stackとheapのスクリプト大体出来たから やっと次に進めそうっすw

サブルーチン

ws_014_subr

ws_bar_heap_014_submdl.hsp:サブモジュール

heapの二つの要素を格納するサブモジュール
別々に格納するよりデバッガで確認しやすい
heap_youso_address:heapのindexを格納するモジュール変数
数値を格納する
heap_youso_value:heapの値を格納するモジュール変数
mdl_one_value型なので数値、実数、文字列等格納できる

#modinit
コンスタラクタ。引数なし

#modfunc local set_address
引数:int __p_int
heap_youso_addressのsetter

#modfunc local set_value
引数:var __p_value
heap_youso_valueのsetter

#modcfunc local get_address
heap_youso_addressのgetter

#modcfunc local get_value
heap_youso_valueのgetter

#modcfunc local ret_vartype_value
heap_youso_valueの型を返す(数値)

#modcfunc local tostr_vartype_value
heap_youso_valueの型を返す(文字列)

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

//struct heap_model {
//	long long* address;
//	long long* value;
//	long elements;
//} heap;
//heapの二つの要素を格納するサブモジュール
//別々に格納するよりデバッガで確認しやすい
//heap_youso_address:heapのindexを格納するモジュール変数
//数値を格納する
//heap_youso_value:heapの値を格納するモジュール変数
//mdl_one_value型なので数値、実数、文字列等格納できる
#module heap_2youso heap_youso_address,heap_youso_value
//コンスタラクタ。引数なし
#modinit
	heap_youso_address=-1
	newmod heap_youso_value,mdl_one_value
	return
//heap_youso_addressのsetter
#modfunc local set_address int __p_int
	heap_youso_address=__p_int
	return 1
//heap_youso_valueのsetter
#modfunc local set_value var __p_value,local loc_tmp_value
	loc_tmp_value=__p_value
	set@mdl_one_value heap_youso_value,loc_tmp_value
	return 1
//heap_youso_addressのgetter
#modcfunc local get_address
	return heap_youso_address
//heap_youso_valueのgetter
#modcfunc local get_value
	return get@mdl_one_value(heap_youso_value)
//heap_youso_valueの型を返す(数値)
#modcfunc local ret_vartype_value
	return ret_vartype@mdl_one_value(heap_youso_value)
//heap_youso_valueの型を返す(文字列)
#modcfunc local tostr_vartype_value
	return tostr_vartype@mdl_one_value(heap_youso_value)
#global
//そういえばこのモジュールテストしてないっすw

サブな本体

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

#module heap_model heap_youso,heap_size,heap_address,heap_value,heap_elements
#modinit int p_size
	heap_size = p_size
	repeat p_size
		newmod heap_youso,heap_2youso
	loop
	heap_elements=0
	return
#modcfunc local get_size
	return heap_size
#modfunc local set_address var p_value,int p_index
	if p_index < 0:return -1
	if p_index >= heap_size:return -1
	set_address@heap_2youso heap_youso.p_index,p_value
	return 1
#modfunc local set_value var p_value,int p_index
	if p_index < 0:return -1
	if p_index >= heap_size:return -1
	set_value@heap_2youso heap_youso.p_index,p_value
	return 1
#modfunc local set_elements int p_int
	heap_elements = p_int
	return
#modcfunc local get_address int p_index
	if p_index < 0:return -1
	if p_index >= heap_size:return -1
	return get_address@heap_2youso(heap_youso.p_index)
#modcfunc local get_value int p_index
	if p_index < 0:return -1
	if p_index >= heap_size:return -1
	return get_value@heap_2youso(heap_youso.p_index)
#modcfunc local get_elements
	return heap_elements
//bool heap_put(long long val, long long addr)
//{
//	// First see if the address is already in use
//	for (int i = 0; i < heap.elements; i++) {
//		if (heap.address[i] == addr) {
//			heap.value[i] = val;
//			return true;
//		}
//	// If not, then it needs to be added if there is room left
//	if (heap.elements < HEAP_MEMBERS) {
//		int i = heap.elements;
//		heap.address[i] = addr;
//		heap.value[i] = val;
//		heap.elements++;
//		return true;
//	}	
//	return false;
//}
#modfunc local put var _p_val,int _p_addr,local loc_e,local loc_e2,local loc_ad,local loc_ad_b
	// First see if the address is already in use
	loc_e=heap_elements
	for i,0,loc_e,1
		loc_ad=get_address@heap_2youso(heap_youso.i)
		if loc_ad == _p_addr {
			set_address@heap_2youso heap_youso.i,_p_addr
			set_value@heap_2youso heap_youso.i,_p_val
			return 1
		}
	next
	// If not, then it needs to be added if there is room left
	if loc_e < heap_size {
		i = loc_e
		loc_ad_b=_p_addr
			set_address@heap_2youso heap_youso.i,loc_ad_b
			set_value@heap_2youso heap_youso.i,_p_val
		loc_e2 = heap_elements
		loc_e2++
		heap_elements=loc_e2
		return 1
	}
	return 0

// Trying to get data from an address that doesn't exist results in 0 being returned
//long long heap_get(long long addr)
//{
//	for (int i = 0; i < HEAP_MEMBERS; i++) {
//		if (heap.address[i] == addr) return heap.value[i];
//	}
//	return 0;
//}
#modcfunc local get_youso int _p_addr,local loc_ad
	for i,0,heap_size,1
		
		loc_ad=get_address@heap_2youso(heap_youso.i)
		if loc_ad == _p_addr{
			return get_value@heap_2youso(heap_youso.i)
		}
	next
	return 0
;#modcfunc local ret_vartype_address int p_index
;	if p_index < 0:return -1
;	if p_index >= heap_size:return -1
;	return ret_vartype@mdl_one_value(heap_address.p_index)
;#modcfunc local tostr_vartype_address int p_index
;	return tostr_vartype@mdl_one_value(heap_address.p_index)
#modcfunc local ret_vartype_value int p_index
	if p_index < 0:return -1
	if p_index >= heap_size:return -1
	return ret_vartype_value@heap_2youso(heap_youso.p_index)
#modcfunc local tostr_vartype_value int p_index
	return tostr_vartype_value@heap_2youso(heap_youso.p_index)
#modfunc local cleanup
	i=0
	for i,heap_size-1,-1,-1
		delmod heap_address.i
		delmod heap_value.i
	next
	return
#global
//↓重要w
newmod heap,heap_model,HEAP_MEMBERS@
#if 1
repeat 5
tmp=cnt*3
set_address@heap_model heap,tmp,cnt
tmp=cnt*4
set_value@heap_model heap,tmp,cnt
loop
set_elements@heap_model heap,7

repeat 10
logmes "heap address "+cnt+":"+get_address@heap_model(heap,cnt)
loop
repeat 10
logmes "heap value "+cnt+":"+get_value@heap_model(heap,cnt)
loop
logmes "heap elements:"+get_elements@heap_model(heap)
repeat 10
logmes "heap type "+ret_vartype_value@heap_model(heap,cnt)
logmes "heap type "+tostr_vartype_value@heap_model(heap,cnt)
loop
#endif
//bool create_heap(void)
//{
//	if (heap.address = (long long*)calloc(HEAP_MEMBERS, sizeof(long long))) {
//		if (heap.value = (long long*)calloc(HEAP_MEMBERS, sizeof(long long))) {
//			heap.elements = 0;
//			return true;
//		}
//		free (heap.address);
//	}
//	return false;
//}
#module
#deffunc create_heap local loc_tmp
// stackのsizeは途中から変えれなくなったw
	loc_tmp=0
	repeat HEAP_MEMBERS
		set_address@heap_model heap@,loc_tmp,cnt
		set_value@heap_model heap@,loc_tmp,cnt
	loop
	set_elements@heap_model heap@,0
	return 1
#deffunc heap_set_elements int _p_int
	set_elements@heap_model heap@,_p_int
	return
#defcfunc heap_get_elements
	return set_elements@heap_model(heap@)
#defcfunc heap_get_size int _p_int
	get_size@heap_model(heap@)
	return
#deffunc heap_put var p_val,int p_addr
	put@heap_model heap@,p_val,p_addr
	return stat
#defcfunc heap_get int p_addr
	return get_youso@heap_model(heap@,p_addr)
;#defcfunc heap_ret_vartype_address int _p_int
;	return ret_vartype_address@heap_model(heap@,_p_int)
;#defcfunc heap_tostr_vartype_address int _p_int
;	return tostr_vartype_address@heap_model(heap@,_p_int)
#defcfunc heap_ret_vartype_value int _p_int
	return ret_vartype_value@heap_model(heap@,_p_int)
#defcfunc heap_tostr_vartype_value int _p_int
	return tostr_vartype_value@heap_model(heap@,_p_int)
#deffunc heap_cleanup
	cleanup@heap_model(heap@)
	delmod heap@
	return
#global
#if 1
create_heap
baz=10.23
put@heap_model heap@,baz,1
baz=123.456
put@heap_model heap@,baz,2
baz="abcde"
put@heap_model heap@,baz,3
foo=30
heap_put foo,4
foo=345.678
heap_put foo,5
foo="fghij"
heap_put foo,6
foo=1
logmes "heap get "+get_youso@heap_model(heap@,foo)
foo=2
logmes "heap get "+get_youso@heap_model(heap@,foo)
foo=3
logmes "heap get "+get_youso@heap_model(heap@,foo)
foo=4
logmes "heap get "+heap_get(foo)
foo=5
logmes "heap get "+heap_get(foo)
foo=6
logmes "heap get "+heap_get(foo)

foo=1
logmes "heap type "+heap_ret_vartype_value(foo)
logmes "heap type "+heap_tostr_vartype_value(foo)
;logmes "heap type "+heap_ret_vartype_address(foo)
;logmes "heap type "+heap_tostr_vartype_address(foo)
logmes "heap type "+tostr_vartype_value@heap_model(heap@,foo)
logmes "heap type "+ret_vartype_value@heap_model(heap@,foo)
;logmes "heap type "+tostr_vartype_address@heap_model(heap@,foo)
;logmes "heap type "+ret_vartype_address@heap_model(heap@,foo)
#endif
#if 0
heap_cleanup
#endif