【動的型配列コンテナ】VarArrayモジュール

; 【動的型配列コンテナ】VarArrayモジュール ; VarArray.as #ifndef VarArr […]

; 【動的型配列コンテナ】VarArrayモジュール ; VarArray.as #ifndef VarArr […]

  • タグ:
  • タグはありません
; 【動的型配列コンテナ】VarArrayモジュール
; VarArray.as
#ifndef VarArray
#ifndef VarArrayAliasOff
	#define global vaCount count@VarArray
	#define global vaForeach foreach@VarArray
	#define global vaAdd add@VarArray
	#define global vaSet set@VarArray
	#define global vaReSet reSet@VarArray
	#define global vaItem item@VarArray
	#define global vaRefItem refItem@VarArray
	#define global vaRemove remove@VarArray	
#endif
#module @VarArrayItem thisItem
	#modinit var _item
		thisItem=_item: return
	#modfunc local set var _item
		thisItem=_item: return
	#modcfunc local item
		return thisItem
	#modfunc local refItem var _item
		_item=thisItem: return
#global
#module VarArray list,thisCount
	#modcfunc local count
		return thisCount
	#define global foreach@VarArray(%1) repeat count@VarArray(%1)
	#define new(%1) dimtype %1,5: newmod %1,VarArray
	#define news(%1) newmod %1,VarArray
	#modinit
		dimtype list,5
		thisCount=0
	return
	#define add(%1,%2)%tvaAdd %i=%2:__add@VarArray %1,%o
	#modfunc local __add var _item
		newmod list,@VarArrayItem,_item
		thisCount++
	return
	#define set(%1,%2,%3)%tvaSet %i=%3:__set@VarArray %1,%2,%o
	#modfunc local __set int index,var _item
		set@@VarArrayItem list(index),_item
	return 0
	#define reSet(%1,%2,%3,%4) set@VarArray %1,%2,item@VarArray(%1,%2)%3%4
	#modcfunc local item int index
		return item@@VarArrayItem(list(index))
	#modfunc local refItem int index,var _item
		refItem@@VarArrayItem list(index),_item: return
	#modfunc local remove int index
		thisCount–
		dim tmp
		repeat thisCount-index,index
			refItem@@VarArrayItem list(cnt+1),tmp
			set@@VarArrayItem list(cnt),tmp
		loop
		delmod list(thisCount)
	return
#global
#endif

;—-別ファイル—————————————————————-----------------------------------------------
; 動作サンプル
; VarArrayTest.hsp
#runtime "hsp3cl"
#include "VarArray.as"

#module Program
	#deffunc main
		dimtype list1,5
		new@VarArray list1
		mes vaCount(list1)
		vaAdd list1,"ナス"
		mes vaCount(list1)
		vaAdd list1,50
		vaAdd list1,1.586
		
		mes "【list1】"
		vaForeach list1
			mes vaItem(list1,cnt)
		loop
		
		mes "【Index 1 changed】"
		vaSet list1,1,256
		vaReSet list1,2,*,2
		vaForeach list1
			mes vaItem(list1,cnt)
		loop
		
		mes "【list2】"
		new@VarArray list2
		vaAdd list2,"キュウリ"
		vaAdd list2,51
		vaAdd list2,1.1024
		vaAdd list2,*jumping

		new@VarArray inlist
		vaAdd inlist,"【VarArray In VarArray】"
		vaAdd list2,inlist //list2に渡されるのは参照のみ
		vaAdd inlist,"ダイコン"
		vaAdd inlist,1024
		vaAdd inlist,M_PI

		dim item
		vaForeach list2
			vaRefItem list2,cnt,item
			if vartype(item)=vartype("label") {
				gosub item
			}
			else:if vartype(item)=vartype("struct") {
				vaForeach item
					mes vaItem(item,cnt)
				loop
			}
			else {
				mes item
			}
		loop

		mes "【Removed list2】"
		vaRemove list2,1
		vaRemove list2,3
		dim item
		vaForeach list2
			vaRefItem list2,cnt,item
			if vartype(item)=vartype("label") {
				gosub item
			}
			else:if vartype(item)=vartype("struct") {
				vaForeach item
					mes vaItem(item,cnt)
				loop
			}
			else {
				mes item
			}
		loop
	return

	*jumping
		mes "ラベルジャンピング!": return
#global
main