1 package jp.nyatla.nyartoolkit.core.types.stack;
\r
3 import java.lang.reflect.Array;
\r
5 import jp.nyatla.nyartoolkit.NyARException;
\r
8 * このクラスは、オブジェクトの参照値を格納する可変長配列です。
\r
9 * このクラスの実体化は禁止しています。継承して使ってください。
\r
13 public class NyARPointerStack<T>
\r
15 /** オブジェクトの参照値を格納するバッファ*/
\r
16 protected T[] _items;
\r
17 /** 配列の有効な長さ。({@link #_items}の配列長とは異なることに注意してください。*/
\r
18 protected int _length;
\r
22 * クラスの実体化を禁止するために宣言しています。
\r
24 * @throws NyARException
\r
26 protected NyARPointerStack() throws NyARException
\r
31 * この関数は、インスタンスを初期化します。
\r
32 * この関数は、このクラスを継承したクラスのコンストラクタから呼び出します。
\r
35 * @param i_element_type
\r
37 * @throws NyARException
\r
39 @SuppressWarnings("unchecked")
\r
40 protected void initInstance(int i_length,Class<T> i_element_type) throws NyARException
\r
43 this._items = (T[])Array.newInstance(i_element_type, i_length);
\r
50 * この関数は、配列の最後尾にオブジェクトを追加します。
\r
54 * 追加したオブジェクト。失敗するとnullを返します。
\r
56 public T push(T i_object)
\r
59 if (this._length >= this._items.length){
\r
62 // 使用領域を+1して、予約した領域を返す。
\r
63 this._items[this._length]=i_object;
\r
68 * この関数は、配列の最後尾にオブジェクトを追加します。
\r
69 * {@link #push}との違いは、失敗したときにASSERT、または例外を発生することです。
\r
70 * 確実に成功することがわっかっていない場合は、{@link #push}を使ってください。
\r
76 public T pushAssert(T i_object)
\r
79 assert(this._length < this._items.length);
\r
80 // 使用領域を+1して、予約した領域を返す。
\r
81 this._items[this._length]=i_object;
\r
87 * この関数は、配列の最後尾の要素を取り除いて返します。
\r
93 assert(this._length>=1);
\r
95 return this._items[this._length];
\r
98 * この関数は、配列の最後尾から指定個数の要素を取り除きます。
\r
102 public final void pops(int i_count)
\r
104 assert(this._length>=i_count);
\r
105 this._length-=i_count;
\r
110 * 有効な要素の数は、先頭から{@link #getLength}個です。
\r
114 public final T[] getArray()
\r
116 return this._items;
\r
119 * この関数は、指定したインデクスの配列要素を返します。
\r
122 * 有効な値は、0から{@link #getLength}-1です。
\r
126 public final T getItem(int i_index)
\r
128 return this._items[i_index];
\r
131 * この関数は、配列の有効な要素数返します。
\r
135 public final int getLength()
\r
137 return this._length;
\r
140 * この関数は、指定したインデクスの要素を配列から取り除きます。
\r
145 public void remove(int i_index)
\r
147 assert(this._length>i_index && i_index>=0);
\r
149 if(i_index!=this._length-1){
\r
151 final int len=this._length-1;
\r
152 T[] items=this._items;
\r
153 for(i=i_index;i<len;i++)
\r
155 items[i]=items[i+1];
\r
161 * この関数は、指定したインデクスの要素を配列から取り除きます。
\r
162 * 要素の順番は、削除したインデクス以降が不定になります。
\r
163 * このAPIは、最後尾の有効要素と、削除対象の要素を交換することで、削除を実現します。
\r
164 * {@link #remove}より高速ですが、要素の順序が重要な処理では注意して使ってください。
\r
168 public void removeIgnoreOrder(int i_index)
\r
170 assert(this._length>i_index && i_index>=0);
\r
172 if(i_index!=this._length-1){
\r
173 this._items[i_index]=this._items[this._length-1];
\r
178 * この関数は、配列の長さを0にリセットします。
\r
180 public void clear()
\r