OSDN Git Service

[backup]
[nyartoolkit-and/nyartoolkit-and.git] / trunk / src / jp / nyatla / nyartoolkit / core / types / stack / NyObjectStack.java
1 /* \r
2  * PROJECT: NyARToolkit\r
3  * --------------------------------------------------------------------------------\r
4  * The NyARToolkit is Java edition ARToolKit class library.\r
5  * Copyright (C)2008-2009 Ryo Iizuka\r
6  *\r
7  * This program is free software: you can redistribute it and/or modify\r
8  * it under the terms of the GNU General Public License as published by\r
9  * the Free Software Foundation, either version 3 of the License, or\r
10  * (at your option) any later version.\r
11  * \r
12  * This program is distributed in the hope that it will be useful,\r
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
15  * GNU General Public License for more details.\r
16  *\r
17  * You should have received a copy of the GNU General Public License\r
18  * along with this program.  If not, see <http://www.gnu.org/licenses/>.\r
19  * \r
20  * For further information please contact.\r
21  *      http://nyatla.jp/nyatoolkit/\r
22  *      <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>\r
23  * \r
24  */\r
25 package jp.nyatla.nyartoolkit.core.types.stack;\r
26 import java.lang.reflect.*;\r
27 import jp.nyatla.nyartoolkit.NyARException;\r
28 \r
29 \r
30 \r
31 \r
32 /**\r
33  * スタック型の可変長配列。\r
34  * 配列には実体を格納します。\r
35  */\r
36 public abstract class NyObjectStack<T>\r
37 {\r
38         protected final T[] _items;\r
39         protected int _length;\r
40 \r
41         /**\r
42          * 最大ARRAY_MAX個の動的割り当てバッファを準備する。\r
43          * \r
44          * @param i_array\r
45          * @param i_element_type\r
46          * JavaのGenedicsの制限突破\r
47          */\r
48         @SuppressWarnings("unchecked")\r
49         protected NyObjectStack(int i_length,Class<T> i_element_type) throws NyARException\r
50         {\r
51                 //領域確保\r
52                 this._items = (T[])Array.newInstance(i_element_type, i_length);\r
53                 for (int i =0; i < i_length; i++){\r
54                         this._items[i] =createElement();\r
55                 }\r
56                 //使用中個数をリセット\r
57                 this._length = 0;\r
58                 return;\r
59         }\r
60         protected abstract T createElement();\r
61         \r
62         /**\r
63          * 新しい領域を予約します。\r
64          * @return\r
65          * 失敗するとnull\r
66          * @throws NyARException\r
67          */\r
68         public final T prePush()\r
69         {\r
70                 // 必要に応じてアロケート\r
71                 if (this._length >= this._items.length){\r
72                         return null;\r
73                 }\r
74                 // 使用領域を+1して、予約した領域を返す。\r
75                 T ret = this._items[this._length];\r
76                 this._length++;\r
77                 return ret;\r
78         }\r
79         /**\r
80          * スタックを初期化します。\r
81          * @param i_reserv_length\r
82          * 使用済みにするサイズ\r
83          * @return\r
84          */\r
85         public final void init(int i_reserv_length) throws NyARException\r
86         {\r
87                 // 必要に応じてアロケート\r
88                 if (i_reserv_length >= this._items.length){\r
89                         throw new NyARException();\r
90                 }\r
91                 this._length=i_reserv_length;\r
92         }       \r
93         \r
94         /** \r
95          * 見かけ上の要素数を1減らして、そのオブジェクトを返します。\r
96          * 返却したオブジェクトの内容は、次回のpushまで有効です。\r
97          * @return\r
98          */\r
99         public final T pop()\r
100         {\r
101                 assert(this._length>=1);\r
102                 this._length--;\r
103                 return this._items[this._length];\r
104         }\r
105         /**\r
106          * 見かけ上の要素数をi_count個減らします。\r
107          * @param i_count\r
108          * @return\r
109          */\r
110         public final void pops(int i_count)\r
111         {\r
112                 assert(this._length>=i_count);\r
113                 this._length-=i_count;\r
114                 return;\r
115         }       \r
116         /**\r
117          * 配列を返します。\r
118          * \r
119          * @return\r
120          */\r
121         public final T[] getArray()\r
122         {\r
123                 return this._items;\r
124         }\r
125         public final T getItem(int i_index)\r
126         {\r
127                 return this._items[i_index];\r
128         }\r
129         /**\r
130          * 配列の見かけ上の要素数を返却します。\r
131          * @return\r
132          */\r
133         public final int getLength()\r
134         {\r
135                 return this._length;\r
136         }\r
137         /**\r
138          * 見かけ上の要素数をリセットします。\r
139          */\r
140         public final void clear()\r
141         {\r
142                 this._length = 0;\r
143         }\r
144 }\r