OSDN Git Service

[tag]NyARToolkit/2.5.1
[nyartoolkit-and/nyartoolkit-and.git] / tags / 2.5.1 / src / jp / nyatla / nyartoolkit / core / types / stack / NyARObjectStack.java
diff --git a/tags/2.5.1/src/jp/nyatla/nyartoolkit/core/types/stack/NyARObjectStack.java b/tags/2.5.1/src/jp/nyatla/nyartoolkit/core/types/stack/NyARObjectStack.java
new file mode 100644 (file)
index 0000000..a3e285b
--- /dev/null
@@ -0,0 +1,144 @@
+/* \r
+ * PROJECT: NyARToolkit\r
+ * --------------------------------------------------------------------------------\r
+ * The NyARToolkit is Java edition ARToolKit class library.\r
+ * Copyright (C)2008-2009 Ryo Iizuka\r
+ *\r
+ * This program is free software: you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation, either version 3 of the License, or\r
+ * (at your option) any later version.\r
+ * \r
+ * This program is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r
+ * \r
+ * For further information please contact.\r
+ *     http://nyatla.jp/nyatoolkit/\r
+ *     <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
+ * \r
+ */\r
+package jp.nyatla.nyartoolkit.core.types.stack;\r
+import java.lang.reflect.*;\r
+import jp.nyatla.nyartoolkit.NyARException;\r
+\r
+\r
+\r
+\r
+/**\r
+ * スタック型の可変長配列。\r
+ * 配列には実体を格納します。\r
+ */\r
+public abstract class NyARObjectStack<T>\r
+{\r
+       protected final T[] _items;\r
+       protected int _length;\r
+\r
+       /**\r
+        * 最大ARRAY_MAX個の動的割り当てバッファを準備する。\r
+        * \r
+        * @param i_array\r
+        * @param i_element_type\r
+        * JavaのGenedicsの制限突破\r
+        */\r
+       @SuppressWarnings("unchecked")\r
+       protected NyARObjectStack(int i_length,Class<T> i_element_type) throws NyARException\r
+       {\r
+               //領域確保\r
+               this._items = (T[])Array.newInstance(i_element_type, i_length);\r
+               for (int i =0; i < i_length; i++){\r
+                       this._items[i] =createElement();\r
+               }\r
+               //使用中個数をリセット\r
+               this._length = 0;\r
+               return;\r
+       }\r
+       protected abstract T createElement();\r
+       \r
+       /**\r
+        * 新しい領域を予約します。\r
+        * @return\r
+        * 失敗するとnull\r
+        * @throws NyARException\r
+        */\r
+       public final T prePush()\r
+       {\r
+               // 必要に応じてアロケート\r
+               if (this._length >= this._items.length){\r
+                       return null;\r
+               }\r
+               // 使用領域を+1して、予約した領域を返す。\r
+               T ret = this._items[this._length];\r
+               this._length++;\r
+               return ret;\r
+       }\r
+       /**\r
+        * スタックを初期化します。\r
+        * @param i_reserv_length\r
+        * 使用済みにするサイズ\r
+        * @return\r
+        */\r
+       public final void init(int i_reserv_length) throws NyARException\r
+       {\r
+               // 必要に応じてアロケート\r
+               if (i_reserv_length >= this._items.length){\r
+                       throw new NyARException();\r
+               }\r
+               this._length=i_reserv_length;\r
+       }       \r
+       \r
+       /** \r
+        * 見かけ上の要素数を1減らして、そのオブジェクトを返します。\r
+        * 返却したオブジェクトの内容は、次回のpushまで有効です。\r
+        * @return\r
+        */\r
+       public final T pop()\r
+       {\r
+               assert(this._length>=1);\r
+               this._length--;\r
+               return this._items[this._length];\r
+       }\r
+       /**\r
+        * 見かけ上の要素数をi_count個減らします。\r
+        * @param i_count\r
+        * @return\r
+        */\r
+       public final void pops(int i_count)\r
+       {\r
+               assert(this._length>=i_count);\r
+               this._length-=i_count;\r
+               return;\r
+       }       \r
+       /**\r
+        * 配列を返します。\r
+        * \r
+        * @return\r
+        */\r
+       public final T[] getArray()\r
+       {\r
+               return this._items;\r
+       }\r
+       public final T getItem(int i_index)\r
+       {\r
+               return this._items[i_index];\r
+       }\r
+       /**\r
+        * 配列の見かけ上の要素数を返却します。\r
+        * @return\r
+        */\r
+       public final int getLength()\r
+       {\r
+               return this._length;\r
+       }\r
+       /**\r
+        * 見かけ上の要素数をリセットします。\r
+        */\r
+       public final void clear()\r
+       {\r
+               this._length = 0;\r
+       }\r
+}\r