/*
* This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see .
*/
#ifndef FlagsArray_h__
#define FlagsArray_h__
#include "Define.h"
#include
template
class FlagsArray
{
public:
constexpr FlagsArray operator&(FlagsArray const& right) const
{
FlagsArray temp = *this;
temp &= right;
return temp;
}
constexpr FlagsArray& operator&=(FlagsArray const& right)
{
for (size_t i = 0; i < N; ++i)
_storage[i] &= right[i];
return *this;
}
constexpr FlagsArray operator|(FlagsArray const& right) const
{
FlagsArray temp = *this;
temp |= right;
return temp;
}
constexpr FlagsArray& operator|=(FlagsArray const& right)
{
for (size_t i = 0; i < N; ++i)
_storage[i] |= right[i];
return *this;
}
constexpr FlagsArray operator~() const
{
FlagsArray temp = *this;
for (size_t i = 0; i < N; ++i)
temp._storage[i] = ~_storage[i];
return temp;
}
constexpr FlagsArray operator^(FlagsArray const& right) const
{
FlagsArray temp = *this;
temp ^= right;
return temp;
}
constexpr FlagsArray& operator^=(FlagsArray const& right)
{
for (size_t i = 0; i < N; ++i)
_storage[i] ^= right[i];
return *this;
}
constexpr explicit operator bool() const
{
for (size_t i = 0; i < N; ++i)
if (_storage[i])
return true;
return false;
}
constexpr bool operator !() const
{
return !(bool(*this));
}
constexpr T& operator[](size_t i)
{
return _storage[i];
}
constexpr T const& operator [](size_t i) const
{
return _storage[i];
}
constexpr FlagsArray& operator=(std::array const& right)
{
_storage = right;
return *this;
}
protected:
std::array _storage = { };
};
class flag128 : public FlagsArray
{
public:
constexpr flag128(uint32 p1 = 0, uint32 p2 = 0, uint32 p3 = 0, uint32 p4 = 0)
{
_storage[0] = p1;
_storage[1] = p2;
_storage[2] = p3;
_storage[3] = p4;
}
constexpr bool IsEqual(uint32 p1 = 0, uint32 p2 = 0, uint32 p3 = 0, uint32 p4 = 0) const
{
return (_storage[0] == p1 && _storage[1] == p2 && _storage[2] == p3 && _storage[3] == p4);
}
constexpr bool HasFlag(uint32 p1 = 0, uint32 p2 = 0, uint32 p3 = 0, uint32 p4 = 0) const
{
return (_storage[0] & p1 || _storage[1] & p2 || _storage[2] & p3 || _storage[3] & p4);
}
constexpr void Set(uint32 p1 = 0, uint32 p2 = 0, uint32 p3 = 0, uint32 p4 = 0)
{
_storage[0] = p1;
_storage[1] = p2;
_storage[2] = p3;
_storage[3] = p4;
}
};
#endif // FlagsArray_h__