#pragma once #ifndef _MASK_ #define _MASK_(flag) ((LONGLONG)0X01 << (flag)) #endif namespace FvMask { template bool HasAny(const TFlag flag, const TMask mask) { TFlag temp = (TFlag)mask; return ((flag&temp) != 0); } template bool HasAll(const TFlag flag, const TMask mask) { return ((flag&mask) == mask); } template void Add(TFlag& flag, const TMask mask) { flag |= mask; } template void Del(TFlag& flag, const TMask mask) { flag &= ~ mask; } template TFlag Remove(const TFlag flag, const TMask mask) { return (flag & (~ mask)); } template TFlag IsAdd(const TFlag oldFlag, const TFlag newFlag, const TMask mask) { return (((oldFlag&mask) == 0) && ((newFlag&mask) != 0)); } template TFlag IsDel(const TFlag oldFlag, const TFlag newFlag, const TMask mask) { return (((oldFlag&mask) != 0) && ((newFlag&mask) == 0)); } template int ReturnMax(const TFlag flag) { int count = 8*sizeof(TFlag); for (int i = count - 1; i >= 0; --i) { // if (((LONGLONG)flag << (i)) > 0) // { // return count - i - 1; // } if (((flag&_MASK_(i)) != 0)) { return i; } } return -1; } inline bool haveRule(LONGLONG gameRule, int oneRule) { if (oneRule<0||oneRule>=64) { return false; } return (gameRule&((LONGLONG)0X01 << (oneRule)))!=0; } }