18
18
use std:: {
19
19
any:: { Any , TypeId } ,
20
20
ops:: RangeBounds ,
21
- sync:: Arc ,
21
+ sync:: { Arc , OnceLock } ,
22
22
} ;
23
23
24
24
use bevy_ecs:: {
25
25
prelude:: { Component , Entity , EntityRef , EntityWorldMut , Commands , Mut , World } ,
26
26
system:: SystemState ,
27
27
} ;
28
28
29
- use smallvec:: SmallVec ;
30
-
31
29
use thiserror:: Error as ThisError ;
32
30
33
31
use crate :: {
@@ -362,11 +360,11 @@ impl AnyBufferWorldAccess for World {
362
360
key : & AnyBufferKey ,
363
361
f : impl FnOnce ( AnyBufferMut ) -> U ,
364
362
) -> Result < U , AnyBufferError > {
365
- let create_state = self . get :: < AnyBufferStorageAccess > ( key. buffer )
363
+ let interface = self . get :: < AnyBufferStorageAccess > ( key. buffer )
366
364
. ok_or ( AnyBufferError :: BufferMissing ) ?
367
- . create_any_buffer_access_mut_state ;
365
+ . interface ;
368
366
369
- let mut state = create_state ( self ) ;
367
+ let mut state = interface . create_any_buffer_access_mut_state ( self ) ;
370
368
let mut access = state. get_buffer_access_mut ( self ) ;
371
369
let buffer_mut = access. as_any_buffer_mut ( key) ?;
372
370
Ok ( f ( buffer_mut) )
@@ -375,20 +373,17 @@ impl AnyBufferWorldAccess for World {
375
373
376
374
trait AnyBufferViewing {
377
375
fn any_count ( & self , session : Entity ) -> usize ;
378
- fn any_active_sessions ( & self ) -> SmallVec < [ Entity ; 16 ] > ;
379
376
fn any_oldest < ' a > ( & ' a self , session : Entity ) -> Option < AnyMessageRef < ' a > > ;
380
377
fn any_newest < ' a > ( & ' a self , session : Entity ) -> Option < AnyMessageRef < ' a > > ;
381
378
fn any_get < ' a > ( & ' a self , session : Entity , index : usize ) -> Option < AnyMessageRef < ' a > > ;
382
379
fn any_message_type ( & self ) -> TypeId ;
383
380
}
384
381
385
382
trait AnyBufferManagement : AnyBufferViewing {
386
- fn any_force_push < ' a > ( & ' a mut self , session : Entity , value : AnyMessage ) -> AnyMessagePushResult ;
387
383
fn any_push ( & mut self , session : Entity , value : AnyMessage ) -> AnyMessagePushResult ;
388
384
fn any_push_as_oldest ( & mut self , session : Entity , value : AnyMessage ) -> AnyMessagePushResult ;
389
385
fn any_pull ( & mut self , session : Entity ) -> Option < AnyMessage > ;
390
386
fn any_pull_newest ( & mut self , session : Entity ) -> Option < AnyMessage > ;
391
- fn any_consume ( & mut self , session : Entity ) -> SmallVec < [ AnyMessage ; 16 ] > ;
392
387
fn any_oldest_mut < ' a > ( & ' a mut self , session : Entity ) -> Option < AnyMessageMut < ' a > > ;
393
388
fn any_newest_mut < ' a > ( & ' a mut self , session : Entity ) -> Option < AnyMessageMut < ' a > > ;
394
389
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<
462
457
self . count ( session)
463
458
}
464
459
465
- fn any_active_sessions ( & self ) -> SmallVec < [ Entity ; 16 ] > {
466
- self . active_sessions ( )
467
- }
468
-
469
460
fn any_oldest < ' a > ( & ' a self , session : Entity ) -> Option < AnyMessageRef < ' a > > {
470
461
self . oldest ( session) . map ( to_any_ref)
471
462
}
@@ -500,18 +491,13 @@ pub struct AnyMessageError {
500
491
pub type AnyMessagePushResult = Result < Option < AnyMessage > , AnyMessageError > ;
501
492
502
493
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
-
508
494
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) ?;
510
496
Ok ( self . push ( session, value) . map ( to_any_message) )
511
497
}
512
498
513
499
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) ?;
515
501
Ok ( self . push_as_oldest ( session, value) . map ( to_any_message) )
516
502
}
517
503
@@ -523,10 +509,6 @@ impl<T: 'static + Send + Sync + Any> AnyBufferManagement for Mut<'_, BufferStora
523
509
self . pull_newest ( session) . map ( to_any_message)
524
510
}
525
511
526
- fn any_consume ( & mut self , session : Entity ) -> SmallVec < [ AnyMessage ; 16 ] > {
527
- self . consume ( session) . into_iter ( ) . map ( to_any_message) . collect ( )
528
- }
529
-
530
512
fn any_oldest_mut < ' a > ( & ' a mut self , session : Entity ) -> Option < AnyMessageMut < ' a > > {
531
513
self . oldest_mut ( session) . map ( to_any_mut)
532
514
}
@@ -556,7 +538,7 @@ fn to_any_message<T: 'static + Send + Sync + Any>(x: T) -> AnyMessage {
556
538
Box :: new ( x)
557
539
}
558
540
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 >
560
542
where
561
543
T : ' static ,
562
544
{
@@ -604,40 +586,64 @@ impl<'w, 's, T: 'static + Send + Sync + Any> AnyBufferAccessMut<'w, 's> for Buff
604
586
/// message type of the buffer.
605
587
#[ derive( Component , Clone , Copy ) ]
606
588
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 ) ,
610
590
}
611
591
612
592
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
+ } ) ;
618
598
619
- }
599
+ Self { interface }
620
600
}
621
601
}
622
602
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 > ;
629
609
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 > ;
635
620
}
636
621
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
+ }
641
647
}
642
648
643
649
pub struct DrainAnyBuffer < ' a > {
0 commit comments