CYD-UI
A C++ library for building native graphic user interfaces
Loading...
Searching...
No Matches
fragment.cppm
Go to the documentation of this file.
1// Copyright (c) 2024, Víctor Castillo Agüero.
2// SPDX-License-Identifier: GPL-3.0-or-later
3
4module;
5#include <cairomm-1.16/cairomm/cairomm.h>
6#include <tracy/Tracy.hpp>
7
9
10import std;
11
12import fabric.memory.multidim_data;
13import fabric.type_aliases;
14
15export import cydui.dimensions;
17
18export namespace vg {
19 struct fragment_t {
20 std::vector<std::shared_ptr<element_t>> elements{};
21
22 void clear() {
23 elements.clear();
24 }
25
26 bool empty() const {
27 return elements.empty();
28 }
29
30 template<typename... T>
31 void append(T &&... _elements) {
32 static_assert(
33 (std::derived_from<std::remove_reference_t<T>, element_t> && ...),
34 "Elements must derive from vg_element_t."
35 );
36 (elements.push_back(make_element<std::remove_reference_t<T>>(std::forward<std::remove_reference_t<T>>(_elements))), ...);
37 }
38
39 template<typename T, typename... Args>
40 T& draw(Args&&... args) {
41 static_assert(
42 std::derived_from<std::remove_reference_t<T>, element_t>,
43 "Elements must derive from vg_element_t."
44 );
45 elements.emplace_back(new std::remove_reference_t<T>{std::forward<Args &&>(args)...});
46 return *static_cast<T*>(elements.back().get());
47 }
48
49 private:
50 template<typename T>
51 static std::shared_ptr<element_t> make_element(T&& element) {
52 T* ptr = new T{std::forward<T>(element)};
53 return std::shared_ptr<element_t>(ptr);
54 }
55 };
56}
void append(T &&... _elements)
Definition fragment.cppm:31
bool empty() const
Definition fragment.cppm:26
std::vector< std::shared_ptr< element_t > > elements
Definition fragment.cppm:20
T & draw(Args &&... args)
Definition fragment.cppm:40