using System;
using System.Collections.Generic;
using System.Text;
namespace Game
{
///
/// ただのbool配列だけどEnumでフラグっぽく加工
///
/// IConvertible実装(特にToInt32必須)クラス。enum推奨。intで可。
[Serializable()]
public class Flags where T: IConvertible
{
private bool[] flags = null;
private int flagCount = 0;
///
/// デフォルトのコンストラクタ。256個のフラグを持つ。
///
public Flags()
{
//Tの最大値を求められれば一番なんだけど・・・
flags = new bool[256];
flagCount = 256;
}
///
/// 個数指定つきコンストラクタ。
/// Tがenumの時は最後の要素+1かなぁ。endmarkつけても良いけど。
///
///
public Flags(int FlagCount)
{
flags = new bool[FlagCount];
flagCount = FlagCount;
}
private void init()
{
for (int i = 0; i < flagCount; i++)
{
flags[i] = false;
}
}
///
/// 本来のインデクサ
///
///
///
public bool this[int Index]
{
set { setFlag(Index, value); }
get { return getFlag(Index); }
}
///
/// Tによってアクセス可能にするインデクサ
///
///
///
public bool this[T Index]
{
set { setFlag(Index.ToInt32(null), value); }
get { return getFlag(Index.ToInt32(null)); }
}
///
/// 内部で使うアクセサ
///
///
///
private bool getFlag(int Index)
{
if (Index < 0) return false;
if (Index >= flagCount) return false;
return flags[Index];
}
///
/// 内部で使うアクセサ
///
///
///
///
private bool setFlag(int Index, bool Value)
{
if (Index < 0) return false;
if (Index >= flagCount) return false;
flags[Index] = Value;
return true;
}
///
/// 引数に渡したすべてのフラグが立っているか調べる
///
///
///
public bool IsOn(params T[] indexs)
{
bool res = true;
foreach (T index in indexs)
{
res &= getFlag(index.ToInt32(null));
if (!res) break;
}
return res;
}
///
/// 引数に渡したすべてのフラグが寝ているか調べる。
/// これのnotが「引数に渡したフラグのうち一つでも立っているか」になるよね?
///
///
///
public bool IsOff(params T[] indexs)
{
bool res = true;
foreach (T index in indexs)
{
res &= (!getFlag(index.ToInt32(null)));
if (!res) break;
}
return res;
}
///
/// いくつかまとめてONしたりOFFしたり。
///
///
///
public void Set(bool Value, params T[] indexs)
{
foreach (T index in indexs)
{
setFlag(index.ToInt32(null), Value);
}
}
}
}