33 explicit Tags(
void* parent =
nullptr): _parent(parent) {}
35 bool add(
const std::string& tag);
36 bool add(
const std::vector<std::string>& tags);
37 bool add(std::initializer_list<std::string> tags);
38 bool add(
const char* tag);
40 template<
typename... Args>
41 bool add(Args&&... args)
43 std::vector<std::string> tags;
44 tags.reserve(
sizeof...(Args));
45 (appendFlat(tags, std::forward<Args>(args)), ...);
49 bool remove(
const std::string& tag);
50 bool remove(
const std::vector<std::string>& tags);
51 bool remove(std::initializer_list<std::string> tags);
52 bool remove(
const char* tag);
54 template<
typename... Args>
57 std::vector<std::string> tags;
58 tags.reserve(
sizeof...(Args));
59 (appendFlat(tags, std::forward<Args>(args)), ...);
65 [[nodiscard]]
bool has(
const std::string& tag)
const;
66 [[nodiscard]]
bool has(
const std::vector<std::string>& tags)
const;
67 [[nodiscard]]
bool has(std::initializer_list<std::string> tags)
const;
68 [[nodiscard]]
bool has(
const char* tag)
const;
69 [[nodiscard]]
bool has(
const std::vector<std::vector<std::string>>& query)
const;
71 template<
typename... Args>
72 [[nodiscard]]
bool has(Args&&... args)
const
74 std::vector<std::vector<std::string>> query;
75 query.reserve(
sizeof...(Args));
76 (appendQuery(query, std::forward<Args>(args)), ...);
77 return hasInternal(query);
80 [[nodiscard]] std::vector<std::string>
list()
const {
return _list; }
81 [[nodiscard]]
size_t size()
const {
return _list.size(); }
82 [[nodiscard]]
bool empty()
const {
return _list.empty(); }
85 static void appendFlat(std::vector<std::string>& out,
const std::string& tag);
86 static void appendFlat(std::vector<std::string>& out,
const char* tag);
87 static void appendFlat(std::vector<std::string>& out,
const std::vector<std::string>& tags);
88 static void appendFlat(std::vector<std::string>& out, std::initializer_list<std::string> tags);
90 static void appendQuery(std::vector<std::vector<std::string>>& out,
const std::string& tag);
91 static void appendQuery(std::vector<std::vector<std::string>>& out,
const char* tag);
92 static void appendQuery(std::vector<std::vector<std::string>>& out,
const std::vector<std::string>& tags);
93 static void appendQuery(std::vector<std::vector<std::string>>& out, std::initializer_list<std::string> tags);
95 [[nodiscard]]
bool hasInternal(
const std::vector<std::vector<std::string>>& query)
const;
98 void* _parent =
nullptr;
101 std::unordered_set<std::string> _index;
104 std::vector<std::string> _list;