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