mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2026-10-07 09:38:11 +08:00
Add in-place group adoption for arena-resident batches
This commit is contained in:
@@ -74,6 +74,10 @@ impl<'a> RecordBatch<'a> {
|
|||||||
self.layout
|
self.layout
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn frames_ptr(&self) -> *const u8 {
|
||||||
|
self.frames
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get(&self, lane: usize) -> RecordLane<'a> {
|
pub fn get(&self, lane: usize) -> RecordLane<'a> {
|
||||||
assert!(lane < self.len, "lane {lane} out of bounds for a batch of {}", self.len);
|
assert!(lane < self.len, "lane {lane} out of bounds for a batch of {}", self.len);
|
||||||
RecordLane {
|
RecordLane {
|
||||||
@@ -214,6 +218,10 @@ impl<'a, T> List<'a, T> {
|
|||||||
self.batch.is_empty()
|
self.batch.is_empty()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn batch(&self) -> RecordBatch<'a> {
|
||||||
|
self.batch
|
||||||
|
}
|
||||||
|
|
||||||
pub fn get(&self, index: usize) -> T
|
pub fn get(&self, index: usize) -> T
|
||||||
where
|
where
|
||||||
T: Copy,
|
T: Copy,
|
||||||
|
|||||||
@@ -1623,9 +1623,28 @@ impl GroupItem {
|
|||||||
&self.layout
|
&self.layout
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A `GroupItem` over the batch's frames, without copying.
|
||||||
|
///
|
||||||
|
/// # Safety
|
||||||
|
/// The frames must stay valid for the evaluation. Arena-resident batches
|
||||||
|
/// qualify, caller stack scratch does not.
|
||||||
|
pub unsafe fn from_resident(batch: crate::node::RecordBatch<'_>) -> Self {
|
||||||
|
let layout = batch.layout().clone();
|
||||||
|
assert!(!layout.element.parked || layout.element.content_hash.is_some(), "a parked element adopts only with content glue");
|
||||||
|
for field in &layout.fields {
|
||||||
|
assert!(field.repark.is_none() || field.content_hash.is_some(), "a parked field adopts only with content glue");
|
||||||
|
}
|
||||||
|
Self {
|
||||||
|
frames: batch.frames_ptr(),
|
||||||
|
len: batch.len(),
|
||||||
|
layout,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// A batch view over the stored records.
|
/// A batch view over the stored records.
|
||||||
pub fn lanes(&self) -> crate::node::RecordBatch<'_> {
|
pub fn lanes(&self) -> crate::node::RecordBatch<'_> {
|
||||||
// SAFETY: `adopt` filled `len` lanes of `layout` at the layout's stride.
|
// SAFETY: the constructors store `len` lanes of `layout` at the
|
||||||
|
// layout's stride.
|
||||||
unsafe { crate::node::RecordBatch::new(self.frames, self.len, &self.layout) }
|
unsafe { crate::node::RecordBatch::new(self.frames, self.len, &self.layout) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user