topical media & game development

talk show tell print

student-ar-org-libspark-flartoolkit-utils-NyObjectStack.ax

student-ar-org-libspark-flartoolkit-utils-NyObjectStack.ax [swf] flex


  /* 
   * PROJECT: FLARToolKit
   * --------------------------------------------------------------------------------
   * This work is based on the NyARToolKit developed by
   *   R.Iizuka (nyatla)
   * http://nyatla.jp/nyatoolkit/
   *
   * The FLARToolKit is ActionScript 3.0 version ARToolkit class library.
   * Copyright (C)2008 Saqoosha
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License
   * as published by the Free Software Foundation; either version 2
   * of the License, or (at your option) any later version.
   * 
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   * 
   * You should have received a copy of the GNU General Public License
   * along with this framework; if not, write to the Free Software
   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   * 
   * For further information please contact.
   *        http://www.libspark.org/wiki/saqoosha/FLARToolKit
   *        <saq(at)saqoosha.net>
   * 
   */
  
  package org.libspark.flartoolkit.utils {
          import org.libspark.flartoolkit.FLARException;                        
  
          
オンデマンド割り当てをするオブジェクト配列。 配列には実体を格納します。

  
          public  class @ax-student-ar-org-libspark-flartoolkit-utils-NyObjectStack {
  
                  private static const ARRAY_APPEND_STEP:int = 64;
                  private var _dataClass:Class;
                  protected var  _items:Array; 
                  private var _allocated_size:int;
                  protected var _length:int;
  
                  
最大ARRAY_MAX個の動的割り当てバッファを準備する。
parameter: i_array

  
                  public function @ax-student-ar-org-libspark-flartoolkit-utils-NyObjectStack(klass:Class, i_max_array_size:int) {
                          this._dataClass = klass;
                          // ポインタだけははじめに確保しておく
                          this._items = new Array(i_max_array_size)
                          var n:int = i_max_array_size;
                          while (n--) {
                                  this._items[n] = new this._dataClass();
                          }
                          // アロケート済サイズと、使用中個数をリセット
                          this._allocated_size = 0;
                          this._length = 0;
                  }
  
                  
ポインタを1進めて、その要素を予約し、その要素へのポインタを返します。 特定型に依存させるときには、継承したクラスでこの関数をオーバーライドしてください。

  
                  public function prePush():Object {
                          // 必要に応じてアロケート
                          if (this._length >= this._allocated_size) {
                                  // 要求されたインデクスは範囲外
                                  if (this._length >= this._items.length) {
                                          throw new FLARException();
                                  }
                                  // 追加アロケート範囲を計算
                                  var range:int = this._length + ARRAY_APPEND_STEP;
                                  if (range >= this._items.length) {
                                          range = this._items.length;
                                  }
                                  // アロケート
                                  this.onReservRequest(this._allocated_size, range, this._items);
                                  this._allocated_size = range;
                          }
                          // 使用領域を+1して、予約した領域を返す。
                          var ret:Object = this._items[this._length];
                          this._length++;
                          return ret;
                  }
  
                  
見かけ上の要素数を1減らして、最後尾のアイテムを返します。 @return

  
                  public function pop():Object {
                          if(this._length < 1) {
                                  throw new FLARException();
                          }
                          this._length--;
                          return this.getItem(this._length);
                  }
  
                  
0~i_number_of_item-1までの領域を予約します。 予約すると、見かけ上の要素数は0にリセットされます。
parameter: i_number_of_reserv

  
                  public function reserv(i_number_of_item:int):void {
                          // 必要に応じてアロケート
                          if (i_number_of_item >= this._allocated_size) {
                                  // 要求されたインデクスは範囲外
                                  if (i_number_of_item >= this._items.length) {
                                          throw new FLARException();
                                  }
                                  // 追加アロケート範囲を計算
                                  var range:int = i_number_of_item + ARRAY_APPEND_STEP;
                                  if (range >= this._items.length) {
                                          range = this._items.length;
                                  }
                                  // アロケート
                                  this.onReservRequest(this._allocated_size, range, this._items);
                                  this._allocated_size = range;
                          }
                          //見かけ上の配列サイズを指定
                          this._length = i_number_of_item;
                          return;
                  }
  
                  
この関数を継承先クラスで実装して下さい。 i_bufferの配列の、i_start番目からi_end-1番目までの要素に、オブジェクトを割り当てて下さい。
parameter: i_start
parameter: i_end
parameter: i_buffer

  
                  protected virtual function onReservRequest(i_start:int, i_end:int, i_buffer:Array):void {
                          for (var i:int = i_start; i < i_end; i++) {
                                  i_buffer[i] = new this._dataClass();
                          }
                  }
  
                  
配列を返します。 @return

  
                  public function getArray():Array {
                          return this._items;
                  }
  
                  public function getItem(i_index:int):Object {
                          return this._items[i_index];
                  }
  
                  
配列の見かけ上の要素数を返却します。 @return

  
                  public function getLength():int {
                          return this._length;
                  }
  
                  
見かけ上の要素数をリセットします。

  
                  public function clear():void {
                          this._length = 0;
                  }
          }
  }


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.