62 lines
1.3 KiB
C++
62 lines
1.3 KiB
C++
#pragma once
|
|
#include <type_traits>
|
|
#include <cstdint>
|
|
enum class Tag
|
|
{
|
|
NONE = 0, // 无标签
|
|
UPDATE = 1 << 0, // 更新标签
|
|
RENDER = 1 << 1, // 渲染标签
|
|
};
|
|
|
|
constexpr Tag operator|(Tag a, Tag b)
|
|
{
|
|
using Underlying = std::underlying_type_t<Tag>;
|
|
return static_cast<Tag>(static_cast<Underlying>(a) | static_cast<Underlying>(b));
|
|
}
|
|
|
|
constexpr Tag operator&(Tag a, Tag b)
|
|
{
|
|
using Underlying = std::underlying_type_t<Tag>;
|
|
return static_cast<Tag>(static_cast<Underlying>(a) & static_cast<Underlying>(b));
|
|
}
|
|
class TagGed
|
|
{
|
|
private:
|
|
uint64_t m_tags;
|
|
|
|
public:
|
|
TagGed(Tag initialTag = Tag::NONE)
|
|
: m_tags(static_cast<uint64_t>(initialTag)) {}
|
|
|
|
// 添加标签
|
|
void addTag(Tag tag)
|
|
{
|
|
m_tags |= static_cast<uint64_t>(tag);
|
|
}
|
|
|
|
// 移除标签
|
|
void removeTag(Tag tag)
|
|
{
|
|
m_tags &= ~static_cast<uint64_t>(tag);
|
|
}
|
|
|
|
// 判断是否包含指定标签
|
|
bool hasTag(Tag tag) const
|
|
{
|
|
return (m_tags & static_cast<uint64_t>(tag)) != 0;
|
|
}
|
|
|
|
// 判断是否包含所有指定标签
|
|
bool hasAllTags(Tag tags) const
|
|
{
|
|
return (m_tags & static_cast<uint64_t>(tags)) == static_cast<uint64_t>(tags);
|
|
}
|
|
|
|
// 清除所有标签
|
|
void clearTags()
|
|
{
|
|
m_tags = 0;
|
|
}
|
|
};
|
|
|