6#include "TTauri/Foundation/required.hpp"
10#include <unordered_map>
14template<
typename T,
typename U>
15tt_force_inline
void memswap(T &dst, U &src) {
16 static_assert(
sizeof(T) ==
sizeof(U),
"memswap requires both objects of equal size");
17 std::byte tmp[
sizeof(T)];
18 memcpy(tmp, &src,
sizeof(T));
19 memcpy(&src, &dst,
sizeof(U));
20 memcpy(&dst, tmp,
sizeof(T));
24tt_force_inline
bool is_aligned(T* p){
28template<
typename R,
typename T>
29gsl_suppress3(type.1,26487,lifetime.4)
30 inline R align(T ptr,
size_t alignment) noexcept
32 ttlet byteOffset =
reinterpret_cast<ptrdiff_t
>(ptr);
33 ttlet alignedByteOffset = ((byteOffset + alignment - 1) / alignment) * alignment;
35 return reinterpret_cast<R
>(alignedByteOffset);
41template<
typename R,
typename T>
42gsl_suppress5(f.23,bounds.3,type.1,26487,lifetime.4)
43 inline R align_end(T ptr,
size_t alignment) noexcept
45 ttlet byteOffset =
reinterpret_cast<ptrdiff_t
>(ptr);
46 ttlet alignedByteOffset = (byteOffset / alignment) * alignment;
48 return reinterpret_cast<R
>(alignedByteOffset);
52template<
typename To,
typename From>
53std::enable_if_t<(
sizeof(To) ==
sizeof(From)) && std::is_trivially_copyable_v<From> && std::is_trivial_v<To>,To>
54bit_cast(From
const &src)
noexcept
65 while (i != v.end()) {
74template<
typename K,
typename T>
78 while (i != v.end()) {
79 if (i->second.expired()) {
87template<
typename K,
typename T>
91 while (i != v.end()) {
92 cleanupWeakPointers(i->second);
93 if (i->second.size() == 0) {
101template<
typename Value,
typename Map,
typename Key,
typename... Args>
105 ttlet i = map.find(key);
106 if (i == map.end()) {
107 value = std::make_shared<Value>(std::forward<Args>(args)...);
108 map.insert_or_assign(key, value);