OSDN Git Service

[NyARToolKit for java]update document
[nyartoolkit-and/nyartoolkit-and.git] / lib / src / jp / nyatla / nyartoolkit / core / types / stack / NyARPointerStack.java
1 package jp.nyatla.nyartoolkit.core.types.stack;\r
2 \r
3 import java.lang.reflect.Array;\r
4 \r
5 import jp.nyatla.nyartoolkit.NyARException;\r
6 \r
7 /**\r
8  * このクラスは、オブジェクトの参照値を格納する可変長配列です。\r
9  * このクラスの実体化は禁止しています。継承して使ってください。\r
10  * @param <T>\r
11  * 配列型を指定します。\r
12  */\r
13 public class NyARPointerStack<T>\r
14 {\r
15         /** オブジェクトの参照値を格納するバッファ*/\r
16         protected T[] _items;\r
17         /** 配列の有効な長さ。({@link #_items}の配列長とは異なることに注意してください。*/\r
18         protected int _length;\r
19         \r
20         /**\r
21          * コンストラクタです。\r
22          * クラスの実体化を禁止するために宣言しています。\r
23          * 継承クラスから呼び出してください。\r
24          * @throws NyARException\r
25          */\r
26         protected NyARPointerStack() throws NyARException\r
27         {\r
28         }\r
29 \r
30         /**\r
31          * この関数は、インスタンスを初期化します。\r
32          * この関数は、このクラスを継承したクラスのコンストラクタから呼び出します。\r
33          * @param i_length\r
34          * 配列の最大長さ\r
35          * @param i_element_type\r
36          * 配列型を示すクラスタイプ\r
37          * @throws NyARException\r
38          */\r
39         @SuppressWarnings("unchecked")\r
40         protected void initInstance(int i_length,Class<T> i_element_type) throws NyARException\r
41         {\r
42                 //領域確保\r
43                 this._items = (T[])Array.newInstance(i_element_type, i_length);\r
44                 //使用中個数をリセット\r
45                 this._length = 0;\r
46                 return;         \r
47         }\r
48 \r
49         /**\r
50          * この関数は、配列の最後尾にオブジェクトを追加します。\r
51          * @param i_object\r
52          * 追加するオブジェクト\r
53          * @return\r
54          * 追加したオブジェクト。失敗するとnullを返します。\r
55          */\r
56         public T push(T i_object)\r
57         {\r
58                 // 必要に応じてアロケート\r
59                 if (this._length >= this._items.length){\r
60                         return null;\r
61                 }\r
62                 // 使用領域を+1して、予約した領域を返す。\r
63                 this._items[this._length]=i_object;\r
64                 this._length++;\r
65                 return i_object;\r
66         }\r
67         /**\r
68          * この関数は、配列の最後尾にオブジェクトを追加します。\r
69          * {@link #push}との違いは、失敗したときにASSERT、または例外を発生することです。\r
70          * 確実に成功することがわっかっていない場合は、{@link #push}を使ってください。\r
71          * @param i_object\r
72          * 追加するオブジェクト\r
73          * @return\r
74          * 追加したオブジェクト。\r
75          */\r
76         public T pushAssert(T i_object)\r
77         {\r
78                 // 必要に応じてアロケート\r
79                 assert(this._length < this._items.length);\r
80                 // 使用領域を+1して、予約した領域を返す。\r
81                 this._items[this._length]=i_object;\r
82                 this._length++;\r
83                 return i_object;\r
84         }\r
85         \r
86         /** \r
87          * この関数は、配列の最後尾の要素を取り除いて返します。\r
88          * @return\r
89          * 最後尾のオブジェクト。\r
90          */\r
91         public T pop()\r
92         {\r
93                 assert(this._length>=1);\r
94                 this._length--;\r
95                 return this._items[this._length];\r
96         }\r
97         /**\r
98          * この関数は、配列の最後尾から指定個数の要素を取り除きます。\r
99          * @param i_count\r
100          * 取り除く個数\r
101          */\r
102         public final void pops(int i_count)\r
103         {\r
104                 assert(this._length>=i_count);\r
105                 this._length-=i_count;\r
106                 return;\r
107         }       \r
108         /**\r
109          * この関数は、配列全体を返します。\r
110          * 有効な要素の数は、先頭から{@link #getLength}個です。\r
111          * @return\r
112          * 配列の参照ポインタ\r
113          */\r
114         public final T[] getArray()\r
115         {\r
116                 return this._items;\r
117         }\r
118         /**\r
119          * この関数は、指定したインデクスの配列要素を返します。\r
120          * @param i_index\r
121          * 要素のインデクス番号。\r
122          * 有効な値は、0から{@link #getLength}-1です。\r
123          * @return\r
124          * 配列要素の参照値\r
125          */\r
126         public final T getItem(int i_index)\r
127         {\r
128                 return this._items[i_index];\r
129         }\r
130         /**\r
131          * この関数は、配列の有効な要素数返します。\r
132          * @return\r
133          * 有効な要素数\r
134          */\r
135         public final int getLength()\r
136         {\r
137                 return this._length;\r
138         }\r
139         /**\r
140          * この関数は、指定したインデクスの要素を配列から取り除きます。\r
141          * 要素は、前方詰めで詰められます。\r
142          * @param i_index\r
143          * 削除する要素のインデクス\r
144          */\r
145         public void remove(int i_index)\r
146         {\r
147                 assert(this._length>i_index && i_index>=0);\r
148                 \r
149                 if(i_index!=this._length-1){\r
150                         int i;\r
151                         final int len=this._length-1;\r
152                         T[] items=this._items;\r
153                         for(i=i_index;i<len;i++)\r
154                         {\r
155                                 items[i]=items[i+1];\r
156                         }\r
157                 }\r
158                 this._length--;\r
159         }\r
160         /**\r
161          * この関数は、指定したインデクスの要素を配列から取り除きます。\r
162          * 要素の順番は、削除したインデクス以降が不定になります。\r
163          * このAPIは、最後尾の有効要素と、削除対象の要素を交換することで、削除を実現します。\r
164          * {@link #remove}より高速ですが、要素の順序が重要な処理では注意して使ってください。\r
165          * @param i_index\r
166          * 削除する要素のインデクス\r
167          */\r
168         public void removeIgnoreOrder(int i_index)\r
169         {\r
170                 assert(this._length>i_index && i_index>=0);\r
171                 //値の交換\r
172                 if(i_index!=this._length-1){\r
173                         this._items[i_index]=this._items[this._length-1];\r
174                 }\r
175                 this._length--;\r
176         }\r
177         /**\r
178          * この関数は、配列の長さを0にリセットします。\r
179          */\r
180         public void clear()\r
181         {\r
182                 this._length = 0;\r
183         }\r
184 }