VisuTwin Canvas
C++ 3D Engine — Metal Backend
Loading...
Searching...
No Matches
tags.h
Go to the documentation of this file.
1// SPDX-License-Identifier: Apache-2.0
2// Copyright 2025-2026 Arnis Lektauers
3//
4// Created by Arnis Lektauers on 05.10.2025.
5//
6#pragma once
7#include <initializer_list>
8#include <string>
9#include <type_traits>
10#include <unordered_set>
11#include <vector>
12
13#include "eventHandler.h"
14
15namespace visutwin::canvas
16{
26 class Tags : public EventHandler
27 {
28 public:
29 static constexpr const char* EVENT_ADD = "add";
30 static constexpr const char* EVENT_REMOVE = "remove";
31 static constexpr const char* EVENT_CHANGE = "change";
32
33 explicit Tags(void* parent = nullptr): _parent(parent) {}
34
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);
39
40 template<typename... Args>
41 bool add(Args&&... args)
42 {
43 std::vector<std::string> tags;
44 tags.reserve(sizeof...(Args));
45 (appendFlat(tags, std::forward<Args>(args)), ...);
46 return add(tags);
47 }
48
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);
53
54 template<typename... Args>
55 bool remove(Args&&... args)
56 {
57 std::vector<std::string> tags;
58 tags.reserve(sizeof...(Args));
59 (appendFlat(tags, std::forward<Args>(args)), ...);
60 return remove(tags);
61 }
62
63 void clear();
64
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;
70
71 template<typename... Args>
72 [[nodiscard]] bool has(Args&&... args) const
73 {
74 std::vector<std::vector<std::string>> query;
75 query.reserve(sizeof...(Args));
76 (appendQuery(query, std::forward<Args>(args)), ...);
77 return hasInternal(query);
78 }
79
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(); }
83
84 private:
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);
89
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);
94
95 [[nodiscard]] bool hasInternal(const std::vector<std::vector<std::string>>& query) const;
96
97 // Parent object who tags belong to
98 void* _parent = nullptr;
99
100 // Index for fast lookup.
101 std::unordered_set<std::string> _index;
102
103 // Stable order of insertion.
104 std::vector<std::string> _list;
105 };
106}
static constexpr const char * EVENT_ADD
Definition tags.h:29
bool remove(const std::string &tag)
Definition tags.cpp:134
bool add(Args &&... args)
Definition tags.h:41
bool remove(Args &&... args)
Definition tags.h:55
bool has(const std::string &tag) const
Definition tags.cpp:203
size_t size() const
Definition tags.h:81
std::vector< std::string > list() const
Definition tags.h:80
static constexpr const char * EVENT_CHANGE
Definition tags.h:31
bool has(Args &&... args) const
Definition tags.h:72
static constexpr const char * EVENT_REMOVE
Definition tags.h:30
bool add(const std::string &tag)
Definition tags.cpp:81
bool empty() const
Definition tags.h:82
Tags(void *parent=nullptr)
Definition tags.h:33