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