Skip to content

Commit 442c676

Browse files
committed
Clean up any_buffer implementation
Signed-off-by: Michael X. Grey <[email protected]>
1 parent 9935817 commit 442c676

File tree

4 files changed

+63
-70
lines changed

4 files changed

+63
-70
lines changed

src/buffer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use bevy_ecs::{
2222
system::SystemParam,
2323
};
2424

25-
use std::{ops::RangeBounds, sync::Arc, any::TypeId};
25+
use std::{ops::RangeBounds, sync::Arc};
2626

2727
use crate::{
2828
Builder, Chain, Gate, GateState, InputSlot, NotifyBufferUpdate, OnNewBufferValue, UnusedTarget,

src/buffer/any_buffer.rs

Lines changed: 55 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,14 @@
1818
use std::{
1919
any::{Any, TypeId},
2020
ops::RangeBounds,
21-
sync::Arc,
21+
sync::{Arc, OnceLock},
2222
};
2323

2424
use bevy_ecs::{
2525
prelude::{Component, Entity, EntityRef, EntityWorldMut, Commands, Mut, World},
2626
system::SystemState,
2727
};
2828

29-
use smallvec::SmallVec;
30-
3129
use thiserror::Error as ThisError;
3230

3331
use crate::{
@@ -362,11 +360,11 @@ impl AnyBufferWorldAccess for World {
362360
key: &AnyBufferKey,
363361
f: impl FnOnce(AnyBufferMut) -> U,
364362
) -> Result<U, AnyBufferError> {
365-
let create_state = self.get::<AnyBufferStorageAccess>(key.buffer)
363+
let interface = self.get::<AnyBufferStorageAccess>(key.buffer)
366364
.ok_or(AnyBufferError::BufferMissing)?
367-
.create_any_buffer_access_mut_state;
365+
.interface;
368366

369-
let mut state = create_state(self);
367+
let mut state = interface.create_any_buffer_access_mut_state(self);
370368
let mut access = state.get_buffer_access_mut(self);
371369
let buffer_mut = access.as_any_buffer_mut(key)?;
372370
Ok(f(buffer_mut))
@@ -375,20 +373,17 @@ impl AnyBufferWorldAccess for World {
375373

376374
trait AnyBufferViewing {
377375
fn any_count(&self, session: Entity) -> usize;
378-
fn any_active_sessions(&self) -> SmallVec<[Entity; 16]>;
379376
fn any_oldest<'a>(&'a self, session: Entity) -> Option<AnyMessageRef<'a>>;
380377
fn any_newest<'a>(&'a self, session: Entity) -> Option<AnyMessageRef<'a>>;
381378
fn any_get<'a>(&'a self, session: Entity, index: usize) -> Option<AnyMessageRef<'a>>;
382379
fn any_message_type(&self) -> TypeId;
383380
}
384381

385382
trait AnyBufferManagement: AnyBufferViewing {
386-
fn any_force_push<'a>(&'a mut self, session: Entity, value: AnyMessage) -> AnyMessagePushResult;
387383
fn any_push(&mut self, session: Entity, value: AnyMessage) -> AnyMessagePushResult;
388384
fn any_push_as_oldest(&mut self, session: Entity, value: AnyMessage) -> AnyMessagePushResult;
389385
fn any_pull(&mut self, session: Entity) -> Option<AnyMessage>;
390386
fn any_pull_newest(&mut self, session: Entity) -> Option<AnyMessage>;
391-
fn any_consume(&mut self, session: Entity) -> SmallVec<[AnyMessage; 16]>;
392387
fn any_oldest_mut<'a>(&'a mut self, session: Entity) -> Option<AnyMessageMut<'a>>;
393388
fn any_newest_mut<'a>(&'a mut self, session: Entity) -> Option<AnyMessageMut<'a>>;
394389
fn any_get_mut<'a>(&'a mut self, session: Entity, index: usize) -> Option<AnyMessageMut<'a>>;
@@ -462,10 +457,6 @@ impl<T: 'static + Send + Sync + Any> AnyBufferViewing for Mut<'_, BufferStorage<
462457
self.count(session)
463458
}
464459

465-
fn any_active_sessions(&self) -> SmallVec<[Entity; 16]> {
466-
self.active_sessions()
467-
}
468-
469460
fn any_oldest<'a>(&'a self, session: Entity) -> Option<AnyMessageRef<'a>> {
470461
self.oldest(session).map(to_any_ref)
471462
}
@@ -500,18 +491,13 @@ pub struct AnyMessageError {
500491
pub type AnyMessagePushResult = Result<Option<AnyMessage>, AnyMessageError>;
501492

502493
impl<T: 'static + Send + Sync + Any> AnyBufferManagement for Mut<'_, BufferStorage<T>> {
503-
fn any_force_push(&mut self, session: Entity, value: AnyMessage) -> Result<Option<AnyMessage>, AnyMessageError> {
504-
let value = from_boxed_message::<T>(value)?;
505-
Ok(self.force_push(session, value).map(to_any_message))
506-
}
507-
508494
fn any_push(&mut self, session: Entity, value: AnyMessage) -> Result<Option<AnyMessage>, AnyMessageError> {
509-
let value = from_boxed_message::<T>(value)?;
495+
let value = from_any_message::<T>(value)?;
510496
Ok(self.push(session, value).map(to_any_message))
511497
}
512498

513499
fn any_push_as_oldest(&mut self, session: Entity, value: AnyMessage) -> Result<Option<AnyMessage>, AnyMessageError> {
514-
let value = from_boxed_message::<T>(value)?;
500+
let value = from_any_message::<T>(value)?;
515501
Ok(self.push_as_oldest(session, value).map(to_any_message))
516502
}
517503

@@ -523,10 +509,6 @@ impl<T: 'static + Send + Sync + Any> AnyBufferManagement for Mut<'_, BufferStora
523509
self.pull_newest(session).map(to_any_message)
524510
}
525511

526-
fn any_consume(&mut self, session: Entity) -> SmallVec<[AnyMessage; 16]> {
527-
self.consume(session).into_iter().map(to_any_message).collect()
528-
}
529-
530512
fn any_oldest_mut<'a>(&'a mut self, session: Entity) -> Option<AnyMessageMut<'a>> {
531513
self.oldest_mut(session).map(to_any_mut)
532514
}
@@ -556,7 +538,7 @@ fn to_any_message<T: 'static + Send + Sync + Any>(x: T) -> AnyMessage {
556538
Box::new(x)
557539
}
558540

559-
fn from_boxed_message<T: 'static + Send + Sync + Any>(value: AnyMessage) -> Result<T, AnyMessageError>
541+
fn from_any_message<T: 'static + Send + Sync + Any>(value: AnyMessage) -> Result<T, AnyMessageError>
560542
where
561543
T: 'static,
562544
{
@@ -604,40 +586,64 @@ impl<'w, 's, T: 'static + Send + Sync + Any> AnyBufferAccessMut<'w, 's> for Buff
604586
/// message type of the buffer.
605587
#[derive(Component, Clone, Copy)]
606588
pub(crate) struct AnyBufferStorageAccess {
607-
pub(crate) buffered_count: fn(&EntityRef, Entity) -> Result<usize, OperationError>,
608-
pub(crate) ensure_session: fn(&mut EntityWorldMut, Entity) -> OperationResult,
609-
pub(crate) create_any_buffer_access_mut_state: fn(&mut World) -> Box<dyn AnyBufferAccessMutState>,
589+
pub(crate) interface: &'static (dyn AnyBufferStorageAccessInterface + Send + Sync),
610590
}
611591

612592
impl AnyBufferStorageAccess {
613-
pub(crate) fn new<T: 'static + Send + Sync>() -> Self {
614-
Self {
615-
buffered_count: buffered_count::<T>,
616-
ensure_session: ensure_session::<T>,
617-
create_any_buffer_access_mut_state: create_any_buffer_access_mut_state::<T>,
593+
pub(crate) fn new<T: 'static + Send + Sync + Any>() -> Self {
594+
let once: OnceLock<&'static AnyBufferStorageAccessImpl<T>> = OnceLock::new();
595+
let interface = *once.get_or_init(|| {
596+
Box::leak(Box::new(AnyBufferStorageAccessImpl(Default::default())))
597+
});
618598

619-
}
599+
Self { interface }
620600
}
621601
}
622602

623-
fn buffered_count<T: 'static + Send + Sync>(
624-
entity: &EntityRef,
625-
session: Entity,
626-
) -> Result<usize, OperationError> {
627-
entity.buffered_count::<T>(session)
628-
}
603+
pub(crate) trait AnyBufferStorageAccessInterface {
604+
fn buffered_count(
605+
&self,
606+
entity: &EntityRef,
607+
session: Entity,
608+
) -> Result<usize, OperationError>;
629609

630-
fn ensure_session<T: 'static + Send + Sync>(
631-
entity_mut: &mut EntityWorldMut,
632-
session: Entity,
633-
) -> OperationResult {
634-
entity_mut.ensure_session::<T>(session)
610+
fn ensure_session(
611+
&self,
612+
entity_mut: &mut EntityWorldMut,
613+
session: Entity,
614+
) -> OperationResult;
615+
616+
fn create_any_buffer_access_mut_state(
617+
&self,
618+
world: &mut World,
619+
) -> Box<dyn AnyBufferAccessMutState>;
635620
}
636621

637-
fn create_any_buffer_access_mut_state<T: 'static + Send + Sync + Any>(
638-
world: &mut World,
639-
) -> Box<dyn AnyBufferAccessMutState> {
640-
Box::new(SystemState::<BufferAccessMut<T>>::new(world))
622+
struct AnyBufferStorageAccessImpl<T>(std::marker::PhantomData<T>);
623+
624+
impl<T: 'static + Send + Sync + Any> AnyBufferStorageAccessInterface for AnyBufferStorageAccessImpl<T> {
625+
fn buffered_count(
626+
&self,
627+
entity: &EntityRef,
628+
session: Entity,
629+
) -> Result<usize, OperationError> {
630+
entity.buffered_count::<T>(session)
631+
}
632+
633+
fn ensure_session(
634+
&self,
635+
entity_mut: &mut EntityWorldMut,
636+
session: Entity,
637+
) -> OperationResult {
638+
entity_mut.ensure_session::<T>(session)
639+
}
640+
641+
fn create_any_buffer_access_mut_state(
642+
&self,
643+
world: &mut World,
644+
) -> Box<dyn AnyBufferAccessMutState> {
645+
Box::new(SystemState::<BufferAccessMut<T>>::new(world))
646+
}
641647
}
642648

643649
pub struct DrainAnyBuffer<'a> {

src/buffer/buffer_storage.rs

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,32 +15,19 @@
1515
*
1616
*/
1717

18-
use bevy_ecs::{
19-
prelude::{Component, Entity, EntityRef, EntityWorldMut, World, Mut},
20-
system::SystemState,
21-
};
18+
use bevy_ecs::prelude::{Component, Entity};
2219

2320
use smallvec::{Drain, SmallVec};
2421

2522
use std::collections::HashMap;
2623

2724
use std::{
28-
any::{Any, TypeId},
2925
iter::Rev,
3026
ops::RangeBounds,
3127
slice::{Iter, IterMut},
3228
};
3329

34-
use crate::{
35-
AnyBufferAccessMutState, BufferAccessMut, BufferSettings,
36-
InspectBuffer, ManageBuffer, RetentionPolicy, OperationError, OperationResult,
37-
};
38-
39-
40-
pub(crate) trait BufferSessionManagement {
41-
fn clear_session(&mut self, session: Entity);
42-
fn ensure_session(&mut self, session: Entity);
43-
}
30+
use crate::{BufferSettings, RetentionPolicy};
4431

4532
#[derive(Component)]
4633
pub(crate) struct BufferStorage<T> {

src/buffer/manage_buffer.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@ impl<'w> InspectBuffer for EntityRef<'w> {
5454
}
5555

5656
fn dyn_buffered_count(&self, session: Entity) -> Result<usize, OperationError> {
57-
let count = self.get::<AnyBufferStorageAccess>().or_broken()?.buffered_count;
58-
count(self, session)
57+
let interface = self.get::<AnyBufferStorageAccess>().or_broken()?.interface;
58+
interface.buffered_count(self, session)
5959
}
6060

6161
fn try_clone_from_buffer<T: 'static + Send + Sync + Clone>(
@@ -137,11 +137,11 @@ impl<'w> ManageBuffer for EntityWorldMut<'w> {
137137
}
138138

139139
fn dyn_ensure_session(&mut self, session: Entity) -> OperationResult {
140-
let ensure_session = self
140+
let interface = self
141141
.get_mut::<AnyBufferStorageAccess>()
142142
.or_broken()?
143-
.ensure_session;
143+
.interface;
144144

145-
ensure_session(self, session)
145+
interface.ensure_session(self, session)
146146
}
147147
}

0 commit comments

Comments
 (0)