フラグ管理

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);
            }
        }

    }
}