Skip to content

Commit 70cec2c

Browse files
committed
Refactoring the use of AnyBufferStorageAccessInterface
Signed-off-by: Michael X. Grey <[email protected]>
1 parent d44e383 commit 70cec2c

File tree

4 files changed

+50
-64
lines changed

4 files changed

+50
-64
lines changed

src/buffer/any_buffer.rs

Lines changed: 44 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use std::{
2222
};
2323

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

@@ -36,17 +36,27 @@ use crate::{
3636

3737
/// A [`Buffer`] whose type has been anonymized. Joining with this buffer type
3838
/// will yield an [`AnyMessage`].
39-
#[derive(Clone, Copy, Debug)]
39+
#[derive(Clone, Copy)]
4040
pub struct AnyBuffer {
4141
pub(crate) scope: Entity,
4242
pub(crate) source: Entity,
43-
pub(crate) type_id: TypeId,
43+
pub(crate) interface: &'static (dyn AnyBufferStorageAccessInterface + Send + Sync)
44+
}
45+
46+
impl std::fmt::Debug for AnyBuffer {
47+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
48+
f.debug_struct("AnyBuffer")
49+
.field("scope", &self.scope)
50+
.field("source", &self.source)
51+
.field("message_type_name", &self.interface.message_type_name())
52+
.finish()
53+
}
4454
}
4555

4656
impl AnyBuffer {
4757
/// Downcast this into a concrete [`Buffer`] type.
4858
pub fn into_buffer<T: 'static>(&self) -> Option<Buffer<T>> {
49-
if TypeId::of::<T>() == self.type_id {
59+
if TypeId::of::<T>() == self.interface.message_type_id() {
5060
Some(Buffer {
5161
scope: self.scope,
5262
source: self.source,
@@ -58,13 +68,13 @@ impl AnyBuffer {
5868
}
5969
}
6070

61-
impl<T: 'static> From<Buffer<T>> for AnyBuffer {
71+
impl<T: 'static + Send + Sync + Any> From<Buffer<T>> for AnyBuffer {
6272
fn from(value: Buffer<T>) -> Self {
63-
let type_id = TypeId::of::<T>();
73+
let interface = AnyBufferStorageAccessImpl::<T>::get_interface();
6474
AnyBuffer {
6575
scope: value.scope,
6676
source: value.source,
67-
type_id,
77+
interface,
6878
}
6979
}
7080
}
@@ -80,7 +90,7 @@ pub struct AnyBufferKey {
8090
session: Entity,
8191
accessor: Entity,
8292
lifecycle: Option<Arc<BufferAccessLifecycle>>,
83-
type_id: TypeId,
93+
interface: &'static (dyn AnyBufferStorageAccessInterface + Send + Sync),
8494
}
8595

8696
impl std::fmt::Debug for AnyBufferKey {
@@ -91,15 +101,15 @@ impl std::fmt::Debug for AnyBufferKey {
91101
.field("session", &self.session)
92102
.field("accessor", &self.accessor)
93103
.field("in_use", &self.lifecycle.as_ref().is_some_and(|l| l.is_in_use()))
94-
.field("type_id", &self.type_id)
104+
.field("message_type_name", &self.interface.message_type_name())
95105
.finish()
96106
}
97107
}
98108

99109
impl AnyBufferKey {
100110
/// Downcast this into a concrete [`BufferKey`] type.
101111
pub fn into_buffer_key<T: 'static>(&self) -> Option<BufferKey<T>> {
102-
if TypeId::of::<T>() == self.type_id {
112+
if TypeId::of::<T>() == self.interface.message_type_id() {
103113
Some(BufferKey {
104114
buffer: self.buffer,
105115
session: self.session,
@@ -113,15 +123,15 @@ impl AnyBufferKey {
113123
}
114124
}
115125

116-
impl<T: 'static> From<BufferKey<T>> for AnyBufferKey {
126+
impl<T: 'static + Send + Sync + Any> From<BufferKey<T>> for AnyBufferKey {
117127
fn from(value: BufferKey<T>) -> Self {
118-
let type_id = TypeId::of::<T>();
128+
let interface = AnyBufferStorageAccessImpl::<T>::get_interface();
119129
AnyBufferKey {
120130
buffer: value.buffer,
121131
session: value.session,
122132
accessor: value.accessor,
123133
lifecycle: value.lifecycle.clone(),
124-
type_id,
134+
interface,
125135
}
126136
}
127137
}
@@ -360,10 +370,7 @@ impl AnyBufferWorldAccess for World {
360370
key: &AnyBufferKey,
361371
f: impl FnOnce(AnyBufferMut) -> U,
362372
) -> Result<U, AnyBufferError> {
363-
let interface = self.get::<AnyBufferStorageAccess>(key.buffer)
364-
.ok_or(AnyBufferError::BufferMissing)?
365-
.interface;
366-
373+
let interface = key.interface;
367374
let mut state = interface.create_any_buffer_access_mut_state(self);
368375
let mut access = state.get_buffer_access_mut(self);
369376
let buffer_mut = access.as_any_buffer_mut(key)?;
@@ -582,25 +589,11 @@ impl<'w, 's, T: 'static + Send + Sync + Any> AnyBufferAccessMut<'w, 's> for Buff
582589
}
583590
}
584591

585-
/// A component that lets us inspect buffer properties without knowing the
586-
/// message type of the buffer.
587-
#[derive(Component, Clone, Copy)]
588-
pub(crate) struct AnyBufferStorageAccess {
589-
pub(crate) interface: &'static (dyn AnyBufferStorageAccessInterface + Send + Sync),
590-
}
591-
592-
impl AnyBufferStorageAccess {
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-
});
592+
pub(crate) trait AnyBufferStorageAccessInterface {
593+
fn message_type_id(&self) -> TypeId;
598594

599-
Self { interface }
600-
}
601-
}
595+
fn message_type_name(&self) -> &'static str;
602596

603-
pub(crate) trait AnyBufferStorageAccessInterface {
604597
fn buffered_count(
605598
&self,
606599
entity: &EntityRef,
@@ -621,7 +614,24 @@ pub(crate) trait AnyBufferStorageAccessInterface {
621614

622615
struct AnyBufferStorageAccessImpl<T>(std::marker::PhantomData<T>);
623616

617+
impl<T: 'static + Send + Sync + Any> AnyBufferStorageAccessImpl<T> {
618+
fn get_interface() -> &'static (dyn AnyBufferStorageAccessInterface + Send + Sync) {
619+
let once: OnceLock<&'static AnyBufferStorageAccessImpl<T>> = OnceLock::new();
620+
*once.get_or_init(|| {
621+
Box::leak(Box::new(AnyBufferStorageAccessImpl(Default::default())))
622+
})
623+
}
624+
}
625+
624626
impl<T: 'static + Send + Sync + Any> AnyBufferStorageAccessInterface for AnyBufferStorageAccessImpl<T> {
627+
fn message_type_id(&self) -> TypeId {
628+
TypeId::of::<T>()
629+
}
630+
631+
fn message_type_name(&self) -> &'static str {
632+
std::any::type_name::<T>()
633+
}
634+
625635
fn buffered_count(
626636
&self,
627637
entity: &EntityRef,

src/buffer/buffered.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -211,10 +211,8 @@ impl Buffered for AnyBuffer {
211211
}
212212

213213
fn buffered_count(&self, session: Entity, world: &World) -> Result<usize, OperationError> {
214-
world
215-
.get_entity(self.source)
216-
.or_broken()?
217-
.dyn_buffered_count(session)
214+
let entity_ref = world.get_entity(self.source).or_broken()?;
215+
self.interface.buffered_count(&entity_ref, session)
218216
}
219217

220218
fn add_listener(&self, listener: Entity, world: &mut World) -> OperationResult {
@@ -236,10 +234,8 @@ impl Buffered for AnyBuffer {
236234
}
237235

238236
fn ensure_active_session(&self, session: Entity, world: &mut World) -> OperationResult {
239-
world
240-
.get_entity_mut(self.source)
241-
.or_broken()?
242-
.dyn_ensure_session(session)
237+
let mut entity_mut = world.get_entity_mut(self.source).or_broken()?;
238+
self.interface.ensure_session(&mut entity_mut, session)
243239
}
244240
}
245241

src/buffer/manage_buffer.rs

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use bevy_ecs::{
2323
use smallvec::SmallVec;
2424

2525
use crate::{
26-
BufferStorage, AnyBufferStorageAccess, OperationError, OperationResult, OrBroken,
26+
BufferStorage, OperationError, OperationResult, OrBroken,
2727
};
2828

2929
pub trait InspectBuffer {
@@ -32,8 +32,6 @@ pub trait InspectBuffer {
3232
session: Entity,
3333
) -> Result<usize, OperationError>;
3434

35-
fn dyn_buffered_count(&self, session: Entity) -> Result<usize, OperationError>;
36-
3735
fn try_clone_from_buffer<T: 'static + Send + Sync + Clone>(
3836
&self,
3937
session: Entity,
@@ -53,11 +51,6 @@ impl<'w> InspectBuffer for EntityRef<'w> {
5351
Ok(buffer.count(session))
5452
}
5553

56-
fn dyn_buffered_count(&self, session: Entity) -> Result<usize, OperationError> {
57-
let interface = self.get::<AnyBufferStorageAccess>().or_broken()?.interface;
58-
interface.buffered_count(self, session)
59-
}
60-
6154
fn try_clone_from_buffer<T: 'static + Send + Sync + Clone>(
6255
&self,
6356
session: Entity,
@@ -100,8 +93,6 @@ pub trait ManageBuffer {
10093
fn clear_buffer<T: 'static + Send + Sync>(&mut self, session: Entity) -> OperationResult;
10194

10295
fn ensure_session<T: 'static + Send + Sync>(&mut self, session: Entity) -> OperationResult;
103-
104-
fn dyn_ensure_session(&mut self, session: Entity) -> OperationResult;
10596
}
10697

10798
impl<'w> ManageBuffer for EntityWorldMut<'w> {
@@ -135,13 +126,4 @@ impl<'w> ManageBuffer for EntityWorldMut<'w> {
135126
.ensure_session(session);
136127
Ok(())
137128
}
138-
139-
fn dyn_ensure_session(&mut self, session: Entity) -> OperationResult {
140-
let interface = self
141-
.get_mut::<AnyBufferStorageAccess>()
142-
.or_broken()?
143-
.interface;
144-
145-
interface.ensure_session(self, session)
146-
}
147129
}

src/operation/operate_buffer.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ use backtrace::Backtrace;
2929
use smallvec::SmallVec;
3030

3131
use crate::{
32-
Broken, BufferAccessors, BufferSettings, BufferStorage, AnyBufferStorageAccess, DeferredRoster, ForkTargetStorage,
32+
Broken, BufferAccessors, BufferSettings, BufferStorage, DeferredRoster, ForkTargetStorage,
3333
Gate, GateActionStorage, Input, InputBundle, InspectBuffer, ManageBuffer, ManageInput,
3434
MiscellaneousFailure, Operation, OperationCleanup, OperationError, OperationReachability,
3535
OperationRequest, OperationResult, OperationRoster, OperationSetup, OrBroken,
@@ -39,14 +39,12 @@ use crate::{
3939
#[derive(Bundle)]
4040
pub(crate) struct OperateBuffer<T: 'static + Send + Sync> {
4141
storage: BufferStorage<T>,
42-
inspector: AnyBufferStorageAccess,
4342
}
4443

4544
impl<T: 'static + Send + Sync> OperateBuffer<T> {
4645
pub(crate) fn new(settings: BufferSettings) -> Self {
4746
Self {
4847
storage: BufferStorage::new(settings),
49-
inspector: AnyBufferStorageAccess::new::<T>(),
5048
}
5149
}
5250
}

0 commit comments

Comments
 (0)