uint一つで32個のフラグを管理する

by bangflash_sub forked from 関数呼び出しは重く、入れ子の関数は更に重い (diff: 341)
♥0 | Line 143 | Modified 2010-01-10 21:11:17 | MIT License
play

ActionScript3 source code

/**
 * Copyright bangflash_sub ( http://wonderfl.net/user/bangflash_sub )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/dORI
 */

// forked from kaikoga's 関数呼び出しは重く、入れ子の関数は更に重い
// forked from tail_y's forked from: [最適化 Tips] Number, int, uint の計算による処理速度の違い
// forked from muta244's [最適化 Tips] Number, int, uint の計算による処理速度の違い

package {

import flash.display.*;
import flash.geom.*;
import flash.events.*;
import flash.text.*;
import flash.utils.*;

public class Main extends Sprite
{
    
    private var i:int = 0;
    private function get _getter():int
    {
        return this.i;
    }
    
   
    
    private function _init():void
    {
      _debug("FlagCheckerクラスを使えばuint一個で32個のFlagを管理できるよ。たぶん。");
      _debug("");
      
      _debug("[使用例](コードを直接見ないと分らない。29行目以降。)");
      
       var flags:FlagChecker = new FlagChecker();
       //フラグを新しく作成(falseで初期化される)
       flags.makeFlag("test");
       flags.setFlag("test",true);
       
       _debug("test" + " : " + String(flags.getFlag("test")));
       
       flags.makeFlag("bangflash");
       _debug("bangflash" + " : " +String(flags.getFlag("bangflash")));
       
       _debug("");
       
    		//flagsの中身
    		_debug("Flagの中身" + " : " + String(flags.getFlags())); 
    		_debug("↑誰かuintを16進数のままの表記でStringに直す方法教えてー!")
    		
    		_debug("");
    		
    		//
    		_debug("getFlags()をSharedObjectにそのままぶち込めば32個使えるし32byteしか容量食わんし便利よ。");
    		_debug("");

    		_debug("ちなみにコンストラクタにSharedObjectで保存したuint入れればそのまま読み込めます。")
    }
    
    private var _field:TextField;
    private var _time:uint;
    
    public function Main():void
    {
        _setup();
        _init();
    }
    
    //TextFieldに文字を追加(?)
    private function _debug(log:String):void
    {
        _field.appendText(log + "\n");
    }
    
    private function _setup():void
    {
        _field = new TextField();
        _field.width = stage.stageWidth - 40;
        _field.height = stage.stageHeight - 50;
        _field.x = 20;
        _field.y = 20;
        _field.multiline = true;
        _field.wordWrap = true;
        
        var format:TextFormat = _field.defaultTextFormat;
        format.font = "_sans";
        _field.defaultTextFormat = format;
        
        addChild(_field);
        
       // var button:Sprite = new Sprite();
       // button.graphics.lineStyle(1, 0xBBBBBB);
      //  button.graphics.beginFill(0xEEEEEE);
       // button.graphics.drawRoundRect(0, 0, 100, 20, 5, 5);
      //  button.graphics.endFill();
        
        //addChild(button);
        
       // button.x = 20;
       // button.y = 20;
       // button.mouseChildren = false;
        //button.buttonMode = true;
        
        
        var field:TextField = new TextField();
        field.width = 100;
        field.height = 20;
        field.htmlText = "<p align='center'><font face='_sans'>再計算</span></p>";
        
        //button.addChild(field);
        
        //button.addEventListener(MouseEvent.CLICK, function ():void
        //{
          //  _field.text = "";
            //_init();
        //});
        
    }
}

}

/*package  net.bangflash.utils{*/
	
	/**
	 * 最大32個のフラグを管理できる。
	 */
	/*public*/ class FlagChecker {
		private var count:uint = 0;
		
		//16進数のリスト
		private static var flagList:Vector.<uint>;
		
		//
		private var keyList:Vector.<String>;
		
		//フラグ32個分
		private var flg:uint = 0;
		
		/**
		 * コンストラクタ
		 */
		public function FlagChecker(flg:uint=0) {
			this.flg = flg;
			keyList = new Vector.<String>();
			initFlagList();
		}
		
		/**
		 * 新しくフラグを作る
		 * 
		 * @param key 作ったFlagを呼び出すときの名前
		 * @return 何個目のFlagか
		 */
		public function makeFlag(key:String):uint{
			//32個以上は作れない
			if(count==32){
				trace("Flagをこれ以上作ることはできません。");
				return count;
			}
			count++;
			if(keyList.indexOf(key)==-1){
				keyList.push(key);
			}
			else trace(key + "はすでに使われています。");
			
			return count;
		}
		
		/**
		 * Flagを立てるorつぶす
		 *
		 * @param key makeFlagで指定したFlagの名前
		 * @param bool Flagに代入したい値
		 */
		public function setFlag(key:String,bool:Boolean):void{
			if(bool){
				//Flagを立てる
				flg |= keyToFlag(key);
			}
			else{
				//Flagをつぶす
				flg &= ~keyToFlag(key);
			}
		}
		
		/**
		 * keyで指定したFlagが立っているかどうか
		 *
		 * @param key 調べたいFlagの名前
		 * @return 立っているかどうか
		 *
		 */
		public function getFlag(key:String):Boolean{
			if(flg & keyToFlag(key)){
				return true;
			}
			else{
				return false;
			}
		}
		
		/**
		 * flg自身を返す
		 *
		 * @return flgの中身
		 */
		public function getFlags():uint{
			return flg;
		}
		
		//keyを元に16進数を返す
		private function keyToFlag(key:String):uint{
			return flagList[keyList.indexOf(key)];
		}
		
		//初期化
		private function initFlagList():void{
			flagList = new Vector.<uint>();
			
			flagList.push(0x00000001);
			flagList.push(0x00000002);
			flagList.push(0x00000004);
			flagList.push(0x00000008);
			
			flagList.push(0x00000010);
			flagList.push(0x00000020);
			flagList.push(0x00000040);
			flagList.push(0x00000080);
			
			flagList.push(0x00000100);
			flagList.push(0x00000200);
			flagList.push(0x00000400);
			flagList.push(0x00000800);
			
			flagList.push(0x00001000);
			flagList.push(0x00002000);
			flagList.push(0x00004000);
			flagList.push(0x00008000);
			
			flagList.push(0x00010000);
			flagList.push(0x00020000);
			flagList.push(0x00040000);
			flagList.push(0x00080000);
			
			flagList.push(0x00100000);
			flagList.push(0x00200000);
			flagList.push(0x00400000);
			flagList.push(0x00800000);
			
			flagList.push(0x01000000);
			flagList.push(0x02000000);
			flagList.push(0x04000000);
			flagList.push(0x08000000);
			
			flagList.push(0x10000000);
			flagList.push(0x20000000);
			flagList.push(0x40000000);
			flagList.push(0x80000000);
			
		}
		
		
	}
	

//}