74 else if constexpr (std::same_as<E, std::string>)
return AccessKind::Str;
75 else if constexpr (std::signed_integral<E>) {
94 template <
typename Struct>
96 for (
auto m : std::meta::nonstatic_data_members_of(^^Struct, std::meta::access_context::unchecked()))
97 if (std::meta::identifier_of(m) == name)
return static_cast<std::uint32_t
>(std::meta::offset_of(m).bytes);
103 template <
typename Record>
105 std::vector<ColumnAccess> out;
107 template for (
constexpr auto m : Members) {
108 using M = [:std::meta::type_of(m):];
111 a.
offset =
static_cast<std::uint32_t
>(std::meta::offset_of(m).bytes);
123 return std::define_static_array(out);
135 void (*
reserve)(
void*, std::size_t) =
nullptr;
136 std::size_t (*
add)(
void*) =
nullptr;
137 std::size_t (*
size)(
const void*) =
nullptr;
138 std::byte* (*at)(
void*, std::size_t) =
nullptr;
139 const std::byte* (*cat)(
const void*, std::size_t) =
nullptr;
144 void (*
assignAt)(
void*, std::size_t,
const void*) =
nullptr;
145 void (*
eraseAt)(
void*, std::size_t) =
nullptr;
149 template <
typename Record>
153 if (col.isId)
return i;
160 template <
typename Record>
164 [](
void* v) {
static_cast<std::vector<Record>*
>(v)->clear(); },
165 [](
void* v, std::size_t n) {
166 static_cast<std::vector<Record>*
>(v)->reserve(n);
169 auto& vec = *
static_cast<std::vector<Record>*
>(v);
171 return vec.size() - 1;
174 return static_cast<const std::vector<Record>*
>(v)->size();
176 [](
void* v, std::size_t i) {
177 return reinterpret_cast<std::byte*
>(&(*
static_cast<std::vector<Record>*
>(v))[i]);
179 [](
const void* v, std::size_t i) {
180 return reinterpret_cast<const std::byte*
>(&(*
static_cast<const std::vector<Record>*
>(v))[i]);
182 [](
void* v, std::size_t src) {
183 auto& vec = *
static_cast<std::vector<Record>*
>(v);
184 vec.push_back(vec[src]);
186 [](
void* v,
const void* src) {
187 static_cast<std::vector<Record>*
>(v)->push_back(*
static_cast<const Record*
>(src));
189 [](
void* v, std::size_t i,
const void* src) {
190 (*
static_cast<std::vector<Record>*
>(v))[i] = *
static_cast<const Record*
>(src);
192 [](
void* v, std::size_t i) {
193 auto& vec = *
static_cast<std::vector<Record>*
>(v);
194 vec.erase(vec.begin() +
static_cast<std::ptrdiff_t
>(i));
205 template <
typename Record>
207 : _vec{&records}, _ops{&
detail::RecordOpsFor<Record>} {}
211 : _vec{recordsVec}, _ops{ops} {}
213 void clear()
override;
214 void reserve(std::size_t n)
override;
215 std::size_t add()
override;
216 std::size_t size()
const override;
217 std::uint32_t idOf(std::size_t record)
const override;
219 void setInt(std::size_t record, std::size_t column, std::size_t element, std::int64_t value)
override;
220 void setFloat(std::size_t record, std::size_t column, std::size_t element,
float value)
override;
221 void setString(std::size_t record, std::size_t column, std::size_t element, std::string_view value)
override;
223 void cloneWithId(std::size_t src, std::uint32_t newId)
override;
224 std::size_t findById(std::uint32_t
id)
const override;
235 template <
typename Record>
237 : _vec{&records}, _ops{&
detail::RecordOpsFor<Record>} {}
241 : _vec{recordsVec}, _ops{ops} {}
243 std::size_t size()
const override;
244 std::uint32_t idOf(std::size_t record)
const override;
246 std::int64_t getInt(std::size_t record, std::size_t column, std::size_t element)
const override;
247 std::uint32_t getSlot(std::size_t record, std::size_t column, std::size_t element)
const override;
248 std::string_view getString(std::size_t record, std::size_t column, std::size_t element)
const override;
ErasedRecordSink(void *recordsVec, const detail::RecordOps *ops)
from pre-erased parts (TableCore's path — it holds exactly these).
ErasedRecordSink(std::vector< Record > &records)
ErasedRecordSource(const std::vector< Record > &records)
ErasedRecordSource(const void *recordsVec, const detail::RecordOps *ops)
from pre-erased parts (TableCore's path).
The decode target: the codecs build the record vector through this, one field at a time.
The encode source: the codecs read the record vector through this.
The type-erased boundary between the templated Table<Record> facade (table.hpp) and the per-format co...
consteval std::uint32_t memberOffset(std::string_view name)
The byte offset of Struct's member named name (consteval).
consteval auto columnAccessOf()
The per-column access table of Record: one ColumnAccess per member, declaration order — the same 1:1 ...
consteval AccessKind accessKindOf()
The AccessKind of element type E (consteval; bool is rejected by classifyMember long before this runs...
constexpr RecordOps RecordOpsFor
The RecordOps instance of Record — the entire per-record residue.
consteval auto recordMembers()
The reflected non-static data members of record Record, declaration order.
consteval std::size_t idColumnOf()
The $id$ column index of Record (consteval), or SIZE_MAX.
AccessKind
The storage kind of one record member, as the erased accessors see it: exact width and signedness for...
@ U64
Integer elements, by shape.
@ LocStr
A LocString<N>: strings at offset, flags on the side.
@ Str
A std::string element.
consteval auto schemaOf()
The column schema of record Record, derived by reflection: one Column per member, declaration order,...
Schema reflection over generated client-database record structs: the column list, record stride and f...
Everything the erased core needs to touch one column of a record: where it lives, what it is,...
One column of a record schema, derived from a record member by reflection (typed records) or from the...
Everything the erased core needs to touch one column of a record: where it lives, what it is,...
std::uint16_t elemStride
Bytes between array elements.
std::uint32_t offset
Member byte offset inside Record.
std::uint32_t flagsOffset
LocStr only: byte offset of .flags.
AccessKind kind
The element's storage kind.
static constexpr bool Value
The one thing that stays per-record: a table of thunks over the record VECTOR (only they know sizeof(...
std::size_t(* add)(void *)
emplace_back() → index.
std::size_t(* size)(const void *)
void(* eraseAt)(void *, std::size_t)
vec.erase(begin+i).
void(* clonePush)(void *, std::size_t)
push_back(vec[src]).
std::size_t idColumn
Index of the $id$ column, or SIZE_MAX.
void(* assignAt)(void *, std::size_t, const void *)
vec[i] = *src.
void(* pushCopy)(void *, const void *)
push_back(*src).
std::span< const ColumnAccess > columns
Per-column access facts.
void(* reserve)(void *, std::size_t)