uint一つで32個のフラグを管理する
forked from 関数呼び出しは重く、入れ子の関数は更に重い (diff: 341)
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);
}
}
//}
