トップ 最新 追記

吉里吉里日記


2006-12-27

TJS2 で Array に length, pop(), push(), shift(), unshift() を追加してみる

String と (正確には String じゃないんですが) 同じ length が使えると ポリモルフィックに扱えていいよねということで。

pop() その他は便利そうなので。

Index: tjsArray.cpp
===================================================================
--- tjsArray.cpp	(リビジョン 2157)
+++ tjsArray.cpp	(作業コピー)
@@ -807,6 +807,82 @@
 }
 TJS_END_NATIVE_METHOD_DECL(/* func.name */add)
 //----------------------------------------------------------------------
+TJS_BEGIN_NATIVE_METHOD_DECL(/* func.name */push)
+{
+	// add item(s) at last
+
+	TJS_GET_NATIVE_INSTANCE(/* var. name */ni, /* var. type */tTJSArrayNI);
+
+	for(tjs_int i = 0; i < numparams; ++i)
+	{
+		((tTJSArrayObject*)objthis)->Add(ni, *param[i]);
+	}
+
+	if(result) *result = (tTVInteger)(ni->Items.size());
+
+	return TJS_S_OK;
+}
+TJS_END_NATIVE_METHOD_DECL(/* func.name */push)
+//----------------------------------------------------------------------
+TJS_BEGIN_NATIVE_METHOD_DECL(/* func.name */pop)
+{
+	// pop item from last
+
+	TJS_GET_NATIVE_INSTANCE(/* var. name */ni, /* var. type */tTJSArrayNI);
+
+	if(ni->Items.empty())
+	{
+		tTJSVariant voidValue;
+		if(result) *result = voidValue;
+	}
+	else
+	{
+		if(result) *result = ni->Items[ni->Items.size() - 1];
+		((tTJSArrayObject*)objthis)->Erase(ni, ni->Items.size() - 1);
+	}
+
+	return TJS_S_OK;
+}
+TJS_END_NATIVE_METHOD_DECL(/* func.name */pop)
+//----------------------------------------------------------------------
+TJS_BEGIN_NATIVE_METHOD_DECL(/* func.name */shift)
+{
+	// shift item at head
+
+	TJS_GET_NATIVE_INSTANCE(/* var. name */ni, /* var. type */tTJSArrayNI);
+
+	if(ni->Items.empty())
+	{
+		tTJSVariant voidValue;
+		if(result) *result = voidValue;
+	}
+	else
+	{
+		if(result) *result = ni->Items[0];
+		((tTJSArrayObject*)objthis)->Erase(ni, 0);
+	}
+
+	return TJS_S_OK;
+}
+TJS_END_NATIVE_METHOD_DECL(/* func.name */shift)
+//----------------------------------------------------------------------
+TJS_BEGIN_NATIVE_METHOD_DECL(/* func.name */unshift)
+{
+	// add item(s) at head
+
+	TJS_GET_NATIVE_INSTANCE(/* var. name */ni, /* var. type */tTJSArrayNI);
+
+	for(tjs_int i = 0; i < numparams; ++i)
+	{
+		((tTJSArrayObject*)objthis)->Insert(ni, *param[i], i);        
+	}
+
+	if(result) *result = (tTVInteger)(ni->Items.size());
+
+	return TJS_S_OK;
+}
+TJS_END_NATIVE_METHOD_DECL(/* func.name */unshift)
+//----------------------------------------------------------------------
 TJS_BEGIN_NATIVE_METHOD_DECL(/* func.name */find)
 {
 	// find item in the array,
@@ -862,7 +938,28 @@
 }
 TJS_END_NATIVE_PROP_DECL(count)
 //----------------------------------------------------------------------
+// same as count
+TJS_BEGIN_NATIVE_PROP_DECL(length)
+{
+	TJS_BEGIN_NATIVE_PROP_GETTER
+	{
+		TJS_GET_NATIVE_INSTANCE(/* var. name */ni, /* var. type */tTJSArrayNI);
+		if(result) *result = (tTVInteger)(ni->Items.size());
+		return TJS_S_OK;
+	}
+	TJS_END_NATIVE_PROP_GETTER
 
+	TJS_BEGIN_NATIVE_PROP_SETTER
+	{
+		TJS_GET_NATIVE_INSTANCE(/* var. name */ni, /* var. type */tTJSArrayNI);
+		ni->Items.resize((tjs_uint)(tTVInteger)*param);
+		return TJS_S_OK;
+	}
+	TJS_END_NATIVE_PROP_SETTER
+}
+TJS_END_NATIVE_PROP_DECL(length)
+//----------------------------------------------------------------------
+
 	ClassID_Array = TJS_NCM_CLASSID;
 	TJS_END_NATIVE_MEMBERS
 }
[]

2005|02|03|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|04|05|07|08|