SwitchGame/source/Tool/TagGed.h

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