Support linking primitives

This commit is contained in:
2023-06-13 21:21:02 +02:00
parent 04fa09e7e7
commit 50a2fc3128
6 changed files with 65 additions and 26 deletions

View File

@@ -16,7 +16,28 @@ namespace JabyEngine {
constexpr Link(size_t size) : value(SizeRange.as_value(size >> 2) | TerminationValue) {
}
//void add
void set_adr(const void* adr) {
this->value = bit::value::set_normalized(this->value, AdrRange.with(reinterpret_cast<uint32_t>(adr)));
}
void* get_adr() const {
return reinterpret_cast<void*>(bit::value::get_normalized(this->value, AdrRange));
}
template<typename T>
T& insert_after(T& obj) {
const auto adr = Link::get_adr();
Link::set_adr(&obj);
obj.set_adr(adr);
return obj;
}
template<typename T>
const T& concat(const T& obj) {
Link::set_adr(&obj);
return obj;
}
constexpr void terminate() {
this->value |= TerminationValue;
@@ -45,6 +66,8 @@ namespace JabyEngine {
namespace internal {
template<typename T>
struct LinkedElementCreator {
typedef LinkedElement<T> Linked;
constexpr LinkedElement<T> linked() {
return LinkedElement<T>(*static_cast<T*>(this));
}