#author("2018-01-20T07:05:24+09:00","","")
#author("2018-02-01T14:53:58+09:00","","")
[[white_space]]
*white_space企画の現状 heapモジュール ver0.1.1[#q2392f6f]
 #ifndef _MY_WS_DEFINE_
 #define _MY_WS_DEFINE_
 #define STACK_MEMBERS 			1024
 #define HEAP_MEMBERS 			1024
 // knowbugが配列インスタンスを800くらいまでしか表示してくれないため
 #define STACK_MEMBERS 			750
 #define HEAP_MEMBERS 			750
 #define MAX_LABELS 			200
 #define MAX_LABEL_LENGTH 		500
 #define MAX_INSTRUCTIONS 		24
 #define MAX_INSTRUCTION_LENGTH 	        5
 #define MAX_NESTED_SUBROUTINES	        20
 #endif
 //struct heap_model {
 //	long long* address;
 //	long long* value;
 //	long elements;
 //} heap;
 #module heap_model heap_address,heap_value,heap_elements
 #modinit
 	dim heap_address,HEAP_MEMBERS@
 	dim heap_value,HEAP_MEMBERS@
 	heap_elements=0
 	return
 #modfunc local set_address int p_value,int p_index
 	heap_address.p_index = p_value
 	return
 #modfunc local set_value int p_value,int p_index
 	heap_value.p_index = p_value
 	return
 #modfunc local set_elements int p_int
 	heap_elements = p_int
 	return
 #modcfunc local get_address int p_index
 	return heap_address.p_index
 #modcfunc local get_value int p_index
 	return heap_value.p_index
 #modcfunc local get_elements
 	return heap_elements
 #global
 newmod heap,heap_model
 #if 1
 repeat 5
 set_address@heap_model heap,cnt*3,cnt
 set_value@heap_model heap,cnt*4,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)
 #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
 	repeat HEAP_MEMBERS
 		set_address@heap_model heap@,0,cnt
 		set_value@heap_model heap@,0,cnt
 	loop
 	return 1
 #global
 #if 1
 create_heap
 #endif
 //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;
 //	}
 #module
 #deffunc heap_put int p_val,int p_addr,local tmp_e,local tmp_e2,local tmp_ad
 	// First see if the address is already in use
 	tmp_e=get_elements@heap_model(heap@)
 	for i,0,tmp_e,1
 		tmp_ad=get_address@heap_model(heap@,i)
 		if tmp_ad == p_addr {
 			set_value@heap_model heap@,p_val,i
 			return 1
 		}
 	next
 	// If not, then it needs to be added if there is room left
 	if tmp_e < HEAP_MEMBERS@ {
 		i = tmp_e
 		set_address@heap_model heap@,p_addr,i
 		set_value@heap_model heap@,p_val,i
 		tmp_e2 = get_elements@heap_model(heap@)
 		tmp_e2++
 		set_elements@heap_model heap@,tmp_e2
 		return 1
 	}	
 	return 0
 #global
 #if 1
 heap_put 10,1
 heap_put 20,2
 heap_put 30,3
 #endif
 // 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;
 //}
 #module
 #defcfunc heap_get int addr,local tmp_ad
 	for i,0,HEAP_MEMBERS@,1
 		tmp_ad=get_address@heap_model(heap@,i)
 		if tmp_ad == addr{
 			return get_value@heap_model(heap@,i)
 		}
 	next
 	return 0
 #global
 #if 1
 heap_put 10,1
 heap_put 20,2
 heap_put 30,3
 logmes "heap get "+heap_get(1)
 logmes "heap get "+heap_get(2)
 logmes "heap get "+heap_get(3)
 #endif
 //void cleanup_heap(void)
 //{
 //	free (heap.address);
 //	free (heap.value);
 //	return;
 //}
 // heapは配列表現にしてあるので何もしなくてもたぶんOKw
 #module
 #deffunc cleanup_heap
 	return
 #global
 #if 1
 cleanup_heap
 #endif