com.wallstop-studios.dxmessaging 2.0.0-rc07 → 2.0.0-rc09

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -81,8 +81,8 @@
81
81
  private readonly Stack<
82
82
  List<KeyValuePair<int, Dictionary<MessageHandler, int>>>
83
83
  > _sortedHandlers = new();
84
- private readonly Stack<List<object>> _interceptors = new();
85
- private readonly Stack<List<int>> _interceptorKeys = new();
84
+ private readonly Stack<List<List<object>>> _interceptors = new();
85
+ private readonly Stack<List<object>> _innerInterceptorsStack = new();
86
86
 
87
87
  public Action RegisterUntargeted<T>(MessageHandler messageHandler, int priority = 0)
88
88
  where T : IUntargetedMessage
@@ -394,12 +394,12 @@
394
394
  bool complete = false;
395
395
  if (removed)
396
396
  {
397
- if (_interceptsByType.TryGetValue(type, out prioritizedInterceptors))
397
+ if (
398
+ _interceptsByType.TryGetValue(type, out prioritizedInterceptors)
399
+ && prioritizedInterceptors.TryGetValue(priority, out interceptors)
400
+ )
398
401
  {
399
- if (prioritizedInterceptors.TryGetValue(priority, out interceptors))
400
- {
401
- complete = interceptors.Remove(interceptor);
402
- }
402
+ complete = interceptors.Remove(interceptor);
403
403
  }
404
404
 
405
405
  if (!complete)
@@ -467,38 +467,29 @@
467
467
  )
468
468
  {
469
469
  foundAnyHandlers = true;
470
- List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
471
- GetOrAddMessageHandlerStack(sortedHandlers);
472
- try
470
+ if (sortedHandlers.Count == 1)
473
471
  {
474
- foreach (
475
- KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
476
- )
472
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
473
+ sortedHandlers.First();
474
+ RunUntargetedPostProcessing(ref typedMessage, entry.Key, entry.Value);
475
+ }
476
+ else
477
+ {
478
+ List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
479
+ GetOrAddMessageHandlerStack(sortedHandlers);
480
+ try
477
481
  {
478
- int priority = entry.Key;
479
- List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
480
- entry.Value.Keys
481
- );
482
- try
483
- {
484
- foreach (MessageHandler handler in messageHandlers)
485
- {
486
- handler.HandleUntargetedPostProcessing(
487
- ref typedMessage,
488
- this,
489
- priority
490
- );
491
- }
492
- }
493
- finally
482
+ foreach (
483
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
484
+ )
494
485
  {
495
- _messageHandlers.Push(messageHandlers);
486
+ RunUntargetedPostProcessing(ref typedMessage, entry.Key, entry.Value);
496
487
  }
497
488
  }
498
- }
499
- finally
500
- {
501
- _sortedHandlers.Push(handlerList);
489
+ finally
490
+ {
491
+ _sortedHandlers.Push(handlerList);
492
+ }
502
493
  }
503
494
  }
504
495
 
@@ -512,6 +503,51 @@
512
503
  }
513
504
  }
514
505
 
506
+ private void RunUntargetedPostProcessing<TMessage>(
507
+ ref TMessage typedMessage,
508
+ int priority,
509
+ Dictionary<MessageHandler, int> handlers
510
+ )
511
+ where TMessage : IUntargetedMessage
512
+ {
513
+ switch (handlers.Count)
514
+ {
515
+ case <= 0:
516
+ {
517
+ return;
518
+ }
519
+ case 1:
520
+ {
521
+ MessageHandler handler = handlers.Keys.First();
522
+ handler.HandleUntargetedPostProcessing(ref typedMessage, this, priority);
523
+ return;
524
+ }
525
+ default:
526
+ {
527
+ List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
528
+ handlers.Keys
529
+ );
530
+ try
531
+ {
532
+ foreach (MessageHandler handler in messageHandlers)
533
+ {
534
+ handler.HandleUntargetedPostProcessing(
535
+ ref typedMessage,
536
+ this,
537
+ priority
538
+ );
539
+ }
540
+ }
541
+ finally
542
+ {
543
+ _messageHandlers.Push(messageHandlers);
544
+ }
545
+
546
+ break;
547
+ }
548
+ }
549
+ }
550
+
515
551
  public void UntypedTargetedBroadcast(InstanceId target, ITargetedMessage typedMessage)
516
552
  {
517
553
  Type messageType = typedMessage.MessageType;
@@ -572,39 +608,34 @@
572
608
  )
573
609
  {
574
610
  foundAnyHandlers = true;
575
- List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
576
- GetOrAddMessageHandlerStack(sortedHandlers);
577
- try
611
+ if (sortedHandlers.Count == 1)
578
612
  {
579
- foreach (
580
- KeyValuePair<int, Dictionary<MessageHandler, int>> handlers in handlerList
581
- )
613
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
614
+ sortedHandlers.First();
615
+ RunTargetedBroadcast(ref target, ref typedMessage, entry.Key, entry.Value);
616
+ }
617
+ else
618
+ {
619
+ List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
620
+ GetOrAddMessageHandlerStack(sortedHandlers);
621
+ try
582
622
  {
583
- int priority = handlers.Key;
584
- List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
585
- handlers.Value.Keys
586
- );
587
- try
588
- {
589
- foreach (MessageHandler handler in messageHandlers)
590
- {
591
- handler.HandleTargeted(
592
- ref target,
593
- ref typedMessage,
594
- this,
595
- priority
596
- );
597
- }
598
- }
599
- finally
623
+ foreach (
624
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
625
+ )
600
626
  {
601
- _messageHandlers.Push(messageHandlers);
627
+ RunTargetedBroadcast(
628
+ ref target,
629
+ ref typedMessage,
630
+ entry.Key,
631
+ entry.Value
632
+ );
602
633
  }
603
634
  }
604
- }
605
- finally
606
- {
607
- _sortedHandlers.Push(handlerList);
635
+ finally
636
+ {
637
+ _sortedHandlers.Push(handlerList);
638
+ }
608
639
  }
609
640
  }
610
641
 
@@ -617,39 +648,34 @@
617
648
  )
618
649
  {
619
650
  foundAnyHandlers = true;
620
- List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
621
- GetOrAddMessageHandlerStack(sortedHandlers);
622
- try
651
+ if (sortedHandlers.Count == 1)
623
652
  {
624
- foreach (
625
- KeyValuePair<int, Dictionary<MessageHandler, int>> handlers in handlerList
626
- )
653
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
654
+ sortedHandlers.First();
655
+ RunTargetedPostProcessing(ref target, ref typedMessage, entry.Key, entry.Value);
656
+ }
657
+ else
658
+ {
659
+ List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
660
+ GetOrAddMessageHandlerStack(sortedHandlers);
661
+ try
627
662
  {
628
- int priority = handlers.Key;
629
- List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
630
- handlers.Value.Keys
631
- );
632
- try
633
- {
634
- foreach (MessageHandler handler in messageHandlers)
635
- {
636
- handler.HandleTargetedPostProcessing(
637
- ref target,
638
- ref typedMessage,
639
- this,
640
- priority
641
- );
642
- }
643
- }
644
- finally
663
+ foreach (
664
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
665
+ )
645
666
  {
646
- _messageHandlers.Push(messageHandlers);
667
+ RunTargetedPostProcessing(
668
+ ref target,
669
+ ref typedMessage,
670
+ entry.Key,
671
+ entry.Value
672
+ );
647
673
  }
648
674
  }
649
- }
650
- finally
651
- {
652
- _sortedHandlers.Push(handlerList);
675
+ finally
676
+ {
677
+ _sortedHandlers.Push(handlerList);
678
+ }
653
679
  }
654
680
  }
655
681
 
@@ -658,39 +684,39 @@
658
684
  && 0 < sortedHandlers.Count
659
685
  )
660
686
  {
661
- List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
662
- GetOrAddMessageHandlerStack(sortedHandlers);
663
- try
687
+ if (sortedHandlers.Count == 1)
664
688
  {
665
- foreach (
666
- KeyValuePair<int, Dictionary<MessageHandler, int>> handlers in handlerList
667
- )
689
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
690
+ sortedHandlers.First();
691
+ RunTargetedWithoutTargetingPostProcessing(
692
+ ref target,
693
+ ref typedMessage,
694
+ entry.Key,
695
+ entry.Value
696
+ );
697
+ }
698
+ else
699
+ {
700
+ List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
701
+ GetOrAddMessageHandlerStack(sortedHandlers);
702
+ try
668
703
  {
669
- int priority = handlers.Key;
670
- List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
671
- handlers.Value.Keys
672
- );
673
- try
674
- {
675
- foreach (MessageHandler handler in messageHandlers)
676
- {
677
- handler.HandleTargetedWithoutTargetingPostProcessing(
678
- ref target,
679
- ref typedMessage,
680
- this,
681
- priority
682
- );
683
- }
684
- }
685
- finally
704
+ foreach (
705
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
706
+ )
686
707
  {
687
- _messageHandlers.Push(messageHandlers);
708
+ RunTargetedWithoutTargetingPostProcessing(
709
+ ref target,
710
+ ref typedMessage,
711
+ entry.Key,
712
+ entry.Value
713
+ );
688
714
  }
689
715
  }
690
- }
691
- finally
692
- {
693
- _sortedHandlers.Push(handlerList);
716
+ finally
717
+ {
718
+ _sortedHandlers.Push(handlerList);
719
+ }
694
720
  }
695
721
  }
696
722
 
@@ -705,6 +731,152 @@
705
731
  }
706
732
  }
707
733
 
734
+ private void RunTargetedWithoutTargetingPostProcessing<TMessage>(
735
+ ref InstanceId target,
736
+ ref TMessage typedMessage,
737
+ int priority,
738
+ Dictionary<MessageHandler, int> handlers
739
+ )
740
+ where TMessage : ITargetedMessage
741
+ {
742
+ switch (handlers.Count)
743
+ {
744
+ case <= 0:
745
+ {
746
+ return;
747
+ }
748
+ case 1:
749
+ {
750
+ MessageHandler handler = handlers.Keys.First();
751
+ handler.HandleTargetedWithoutTargetingPostProcessing(
752
+ ref target,
753
+ ref typedMessage,
754
+ this,
755
+ priority
756
+ );
757
+ return;
758
+ }
759
+ default:
760
+ {
761
+ List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
762
+ handlers.Keys
763
+ );
764
+ try
765
+ {
766
+ foreach (MessageHandler handler in messageHandlers)
767
+ {
768
+ handler.HandleTargetedWithoutTargetingPostProcessing(
769
+ ref target,
770
+ ref typedMessage,
771
+ this,
772
+ priority
773
+ );
774
+ }
775
+ }
776
+ finally
777
+ {
778
+ _messageHandlers.Push(messageHandlers);
779
+ }
780
+
781
+ break;
782
+ }
783
+ }
784
+ }
785
+
786
+ private void RunTargetedPostProcessing<TMessage>(
787
+ ref InstanceId target,
788
+ ref TMessage typedMessage,
789
+ int priority,
790
+ Dictionary<MessageHandler, int> handlers
791
+ )
792
+ where TMessage : ITargetedMessage
793
+ {
794
+ switch (handlers.Count)
795
+ {
796
+ case <= 0:
797
+ {
798
+ return;
799
+ }
800
+ case 1:
801
+ {
802
+ MessageHandler handler = handlers.Keys.First();
803
+ handler.HandleTargetedPostProcessing(
804
+ ref target,
805
+ ref typedMessage,
806
+ this,
807
+ priority
808
+ );
809
+ return;
810
+ }
811
+ default:
812
+ {
813
+ List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
814
+ handlers.Keys
815
+ );
816
+ try
817
+ {
818
+ foreach (MessageHandler handler in messageHandlers)
819
+ {
820
+ handler.HandleTargetedPostProcessing(
821
+ ref target,
822
+ ref typedMessage,
823
+ this,
824
+ priority
825
+ );
826
+ }
827
+ }
828
+ finally
829
+ {
830
+ _messageHandlers.Push(messageHandlers);
831
+ }
832
+
833
+ break;
834
+ }
835
+ }
836
+ }
837
+
838
+ private void RunTargetedBroadcast<TMessage>(
839
+ ref InstanceId target,
840
+ ref TMessage typedMessage,
841
+ int priority,
842
+ Dictionary<MessageHandler, int> handlers
843
+ )
844
+ where TMessage : ITargetedMessage
845
+ {
846
+ switch (handlers.Count)
847
+ {
848
+ case <= 0:
849
+ {
850
+ return;
851
+ }
852
+ case 1:
853
+ {
854
+ MessageHandler handler = handlers.Keys.First();
855
+ handler.HandleTargeted(ref target, ref typedMessage, this, priority);
856
+ return;
857
+ }
858
+ default:
859
+ {
860
+ List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
861
+ handlers.Keys
862
+ );
863
+ try
864
+ {
865
+ foreach (MessageHandler handler in messageHandlers)
866
+ {
867
+ handler.HandleTargeted(ref target, ref typedMessage, this, priority);
868
+ }
869
+ }
870
+ finally
871
+ {
872
+ _messageHandlers.Push(messageHandlers);
873
+ }
874
+
875
+ break;
876
+ }
877
+ }
878
+ }
879
+
708
880
  public void UntypedSourcedBroadcast(InstanceId source, IBroadcastMessage typedMessage)
709
881
  {
710
882
  Type messageType = typedMessage.MessageType;
@@ -768,39 +940,29 @@
768
940
  )
769
941
  {
770
942
  foundAnyHandlers = true;
771
- List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
772
- GetOrAddMessageHandlerStack(sortedHandlers);
773
- try
943
+ if (sortedHandlers.Count == 1)
774
944
  {
775
- foreach (
776
- KeyValuePair<int, Dictionary<MessageHandler, int>> handlers in handlerList
777
- )
945
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
946
+ sortedHandlers.First();
947
+ RunBroadcast(ref source, ref typedMessage, entry.Key, entry.Value);
948
+ }
949
+ else
950
+ {
951
+ List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
952
+ GetOrAddMessageHandlerStack(sortedHandlers);
953
+ try
778
954
  {
779
- int priority = handlers.Key;
780
- List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
781
- handlers.Value.Keys
782
- );
783
- try
784
- {
785
- foreach (MessageHandler handler in messageHandlers)
786
- {
787
- handler.HandleSourcedBroadcast(
788
- ref source,
789
- ref typedMessage,
790
- this,
791
- priority
792
- );
793
- }
794
- }
795
- finally
955
+ foreach (
956
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
957
+ )
796
958
  {
797
- _messageHandlers.Push(messageHandlers);
959
+ RunBroadcast(ref source, ref typedMessage, entry.Key, entry.Value);
798
960
  }
799
961
  }
800
- }
801
- finally
802
- {
803
- _sortedHandlers.Push(handlerList);
962
+ finally
963
+ {
964
+ _sortedHandlers.Push(handlerList);
965
+ }
804
966
  }
805
967
  }
806
968
 
@@ -813,39 +975,39 @@
813
975
  )
814
976
  {
815
977
  foundAnyHandlers = true;
816
- List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
817
- GetOrAddMessageHandlerStack(sortedHandlers);
818
- try
978
+ if (sortedHandlers.Count == 1)
819
979
  {
820
- foreach (
821
- KeyValuePair<int, Dictionary<MessageHandler, int>> handlers in handlerList
822
- )
980
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
981
+ sortedHandlers.First();
982
+ RunBroadcastPostProcessing(
983
+ ref source,
984
+ ref typedMessage,
985
+ entry.Key,
986
+ entry.Value
987
+ );
988
+ }
989
+ else
990
+ {
991
+ List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
992
+ GetOrAddMessageHandlerStack(sortedHandlers);
993
+ try
823
994
  {
824
- int priority = handlers.Key;
825
- List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
826
- handlers.Value.Keys
827
- );
828
- try
829
- {
830
- foreach (MessageHandler handler in messageHandlers)
831
- {
832
- handler.HandleSourcedBroadcastPostProcessing(
833
- ref source,
834
- ref typedMessage,
835
- this,
836
- priority
837
- );
838
- }
839
- }
840
- finally
995
+ foreach (
996
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
997
+ )
841
998
  {
842
- _messageHandlers.Push(messageHandlers);
999
+ RunBroadcastPostProcessing(
1000
+ ref source,
1001
+ ref typedMessage,
1002
+ entry.Key,
1003
+ entry.Value
1004
+ );
843
1005
  }
844
1006
  }
845
- }
846
- finally
847
- {
848
- _sortedHandlers.Push(handlerList);
1007
+ finally
1008
+ {
1009
+ _sortedHandlers.Push(handlerList);
1010
+ }
849
1011
  }
850
1012
  }
851
1013
 
@@ -854,39 +1016,39 @@
854
1016
  && 0 < sortedHandlers.Count
855
1017
  )
856
1018
  {
857
- List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
858
- GetOrAddMessageHandlerStack(sortedHandlers);
859
- try
1019
+ if (sortedHandlers.Count == 1)
860
1020
  {
861
- foreach (
862
- KeyValuePair<int, Dictionary<MessageHandler, int>> handlers in handlerList
863
- )
1021
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
1022
+ sortedHandlers.First();
1023
+ RunBroadcastWithoutSourcePostProcessing(
1024
+ ref source,
1025
+ ref typedMessage,
1026
+ entry.Key,
1027
+ entry.Value
1028
+ );
1029
+ }
1030
+ else
1031
+ {
1032
+ List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
1033
+ GetOrAddMessageHandlerStack(sortedHandlers);
1034
+ try
864
1035
  {
865
- int priority = handlers.Key;
866
- List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
867
- handlers.Value.Keys
868
- );
869
- try
870
- {
871
- foreach (MessageHandler handler in messageHandlers)
872
- {
873
- handler.HandleSourcedBroadcastWithoutSourcePostProcessing(
874
- ref source,
875
- ref typedMessage,
876
- this,
877
- priority
878
- );
879
- }
880
- }
881
- finally
1036
+ foreach (
1037
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
1038
+ )
882
1039
  {
883
- _messageHandlers.Push(messageHandlers);
1040
+ RunBroadcastWithoutSourcePostProcessing(
1041
+ ref source,
1042
+ ref typedMessage,
1043
+ entry.Key,
1044
+ entry.Value
1045
+ );
884
1046
  }
885
1047
  }
886
- }
887
- finally
888
- {
889
- _sortedHandlers.Push(handlerList);
1048
+ finally
1049
+ {
1050
+ _sortedHandlers.Push(handlerList);
1051
+ }
890
1052
  }
891
1053
  }
892
1054
 
@@ -901,94 +1063,304 @@
901
1063
  }
902
1064
  }
903
1065
 
904
- private void BroadcastGlobalUntargeted(ref IUntargetedMessage message)
1066
+ private void RunBroadcastWithoutSourcePostProcessing<TMessage>(
1067
+ ref InstanceId source,
1068
+ ref TMessage typedMessage,
1069
+ int priority,
1070
+ Dictionary<MessageHandler, int> handlers
1071
+ )
1072
+ where TMessage : IBroadcastMessage
905
1073
  {
906
- if (_globalSinks.Count <= 0)
907
- {
908
- return;
909
- }
910
-
911
- List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(_globalSinks.Keys);
912
- try
1074
+ switch (handlers.Count)
913
1075
  {
914
- foreach (MessageHandler handler in messageHandlers)
1076
+ case <= 0:
915
1077
  {
916
- handler.HandleGlobalUntargetedMessage(ref message, this);
1078
+ return;
917
1079
  }
918
- }
919
- finally
920
- {
921
- _messageHandlers.Push(messageHandlers);
922
- }
923
- }
924
-
925
- private void BroadcastGlobalTargeted(ref InstanceId target, ref ITargetedMessage message)
926
- {
927
- if (_globalSinks.Count <= 0)
928
- {
929
- return;
930
- }
931
-
932
- List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(_globalSinks.Keys);
933
- try
934
- {
935
- foreach (MessageHandler handler in messageHandlers)
1080
+ case 1:
936
1081
  {
937
- handler.HandleGlobalTargetedMessage(ref target, ref message, this);
1082
+ MessageHandler handler = handlers.Keys.First();
1083
+ handler.HandleSourcedBroadcastWithoutSourcePostProcessing(
1084
+ ref source,
1085
+ ref typedMessage,
1086
+ this,
1087
+ priority
1088
+ );
1089
+ return;
1090
+ }
1091
+ default:
1092
+ {
1093
+ List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
1094
+ handlers.Keys
1095
+ );
1096
+ try
1097
+ {
1098
+ foreach (MessageHandler handler in messageHandlers)
1099
+ {
1100
+ handler.HandleSourcedBroadcastWithoutSourcePostProcessing(
1101
+ ref source,
1102
+ ref typedMessage,
1103
+ this,
1104
+ priority
1105
+ );
1106
+ }
1107
+ }
1108
+ finally
1109
+ {
1110
+ _messageHandlers.Push(messageHandlers);
1111
+ }
1112
+
1113
+ break;
938
1114
  }
939
1115
  }
940
- finally
1116
+ }
1117
+
1118
+ private void RunBroadcastPostProcessing<TMessage>(
1119
+ ref InstanceId source,
1120
+ ref TMessage typedMessage,
1121
+ int priority,
1122
+ Dictionary<MessageHandler, int> handlers
1123
+ )
1124
+ where TMessage : IBroadcastMessage
1125
+ {
1126
+ switch (handlers.Count)
941
1127
  {
942
- _messageHandlers.Push(messageHandlers);
1128
+ case <= 0:
1129
+ {
1130
+ return;
1131
+ }
1132
+ case 1:
1133
+ {
1134
+ MessageHandler handler = handlers.Keys.First();
1135
+ handler.HandleSourcedBroadcastPostProcessing(
1136
+ ref source,
1137
+ ref typedMessage,
1138
+ this,
1139
+ priority
1140
+ );
1141
+ return;
1142
+ }
1143
+ default:
1144
+ {
1145
+ List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
1146
+ handlers.Keys
1147
+ );
1148
+ try
1149
+ {
1150
+ foreach (MessageHandler handler in messageHandlers)
1151
+ {
1152
+ handler.HandleSourcedBroadcastPostProcessing(
1153
+ ref source,
1154
+ ref typedMessage,
1155
+ this,
1156
+ priority
1157
+ );
1158
+ }
1159
+ }
1160
+ finally
1161
+ {
1162
+ _messageHandlers.Push(messageHandlers);
1163
+ }
1164
+
1165
+ break;
1166
+ }
943
1167
  }
944
1168
  }
945
1169
 
946
- private void BroadcastGlobalSourcedBroadcast(
1170
+ private void RunBroadcast<TMessage>(
947
1171
  ref InstanceId source,
948
- ref IBroadcastMessage message
1172
+ ref TMessage typedMessage,
1173
+ int priority,
1174
+ Dictionary<MessageHandler, int> handlers
949
1175
  )
1176
+ where TMessage : IBroadcastMessage
950
1177
  {
951
- if (_globalSinks.Count <= 0)
1178
+ switch (handlers.Count)
952
1179
  {
953
- return;
1180
+ case <= 0:
1181
+ {
1182
+ return;
1183
+ }
1184
+ case 1:
1185
+ {
1186
+ MessageHandler handler = handlers.Keys.First();
1187
+ handler.HandleSourcedBroadcast(ref source, ref typedMessage, this, priority);
1188
+ return;
1189
+ }
1190
+ default:
1191
+ {
1192
+ List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
1193
+ handlers.Keys
1194
+ );
1195
+ try
1196
+ {
1197
+ foreach (MessageHandler handler in messageHandlers)
1198
+ {
1199
+ handler.HandleSourcedBroadcast(
1200
+ ref source,
1201
+ ref typedMessage,
1202
+ this,
1203
+ priority
1204
+ );
1205
+ }
1206
+ }
1207
+ finally
1208
+ {
1209
+ _messageHandlers.Push(messageHandlers);
1210
+ }
1211
+
1212
+ break;
1213
+ }
954
1214
  }
1215
+ }
955
1216
 
956
- List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(_globalSinks.Keys);
957
- try
1217
+ private void BroadcastGlobalUntargeted(ref IUntargetedMessage message)
1218
+ {
1219
+ switch (_globalSinks.Count)
958
1220
  {
959
- foreach (MessageHandler handler in messageHandlers)
1221
+ case <= 0:
960
1222
  {
961
- handler.HandleGlobalSourcedBroadcastMessage(ref source, ref message, this);
1223
+ return;
1224
+ }
1225
+ case 1:
1226
+ {
1227
+ MessageHandler handler = _globalSinks.Keys.First();
1228
+ handler.HandleGlobalUntargetedMessage(ref message, this);
1229
+ return;
1230
+ }
1231
+ default:
1232
+ {
1233
+ List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
1234
+ _globalSinks.Keys
1235
+ );
1236
+ try
1237
+ {
1238
+ foreach (MessageHandler handler in messageHandlers)
1239
+ {
1240
+ handler.HandleGlobalUntargetedMessage(ref message, this);
1241
+ }
1242
+ }
1243
+ finally
1244
+ {
1245
+ _messageHandlers.Push(messageHandlers);
1246
+ }
1247
+
1248
+ break;
962
1249
  }
963
1250
  }
964
- finally
1251
+ }
1252
+
1253
+ private void BroadcastGlobalTargeted(ref InstanceId target, ref ITargetedMessage message)
1254
+ {
1255
+ switch (_globalSinks.Count)
965
1256
  {
966
- _messageHandlers.Push(messageHandlers);
1257
+ case <= 0:
1258
+ {
1259
+ return;
1260
+ }
1261
+ case 1:
1262
+ {
1263
+ MessageHandler handler = _globalSinks.Keys.First();
1264
+ handler.HandleGlobalTargetedMessage(ref target, ref message, this);
1265
+ return;
1266
+ }
1267
+ default:
1268
+ {
1269
+ List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
1270
+ _globalSinks.Keys
1271
+ );
1272
+ try
1273
+ {
1274
+ foreach (MessageHandler handler in messageHandlers)
1275
+ {
1276
+ handler.HandleGlobalTargetedMessage(ref target, ref message, this);
1277
+ }
1278
+ }
1279
+ finally
1280
+ {
1281
+ _messageHandlers.Push(messageHandlers);
1282
+ }
1283
+
1284
+ break;
1285
+ }
1286
+ }
1287
+ }
1288
+
1289
+ private void BroadcastGlobalSourcedBroadcast(
1290
+ ref InstanceId source,
1291
+ ref IBroadcastMessage message
1292
+ )
1293
+ {
1294
+ switch (_globalSinks.Count)
1295
+ {
1296
+ case <= 0:
1297
+ {
1298
+ return;
1299
+ }
1300
+ case 1:
1301
+ {
1302
+ MessageHandler handler = _globalSinks.Keys.First();
1303
+ handler.HandleGlobalSourcedBroadcastMessage(ref source, ref message, this);
1304
+ return;
1305
+ }
1306
+ default:
1307
+ {
1308
+ List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
1309
+ _globalSinks.Keys
1310
+ );
1311
+ try
1312
+ {
1313
+ foreach (MessageHandler handler in messageHandlers)
1314
+ {
1315
+ handler.HandleGlobalSourcedBroadcastMessage(
1316
+ ref source,
1317
+ ref message,
1318
+ this
1319
+ );
1320
+ }
1321
+ }
1322
+ finally
1323
+ {
1324
+ _messageHandlers.Push(messageHandlers);
1325
+ }
1326
+
1327
+ break;
1328
+ }
967
1329
  }
968
1330
  }
969
1331
 
970
1332
  private bool TryGetInterceptorCaches(
971
1333
  Type type,
972
- out SortedDictionary<int, List<object>> interceptors,
973
- out List<int> interceptorKeys,
974
- out List<object> interceptorStack
1334
+ out List<List<object>> interceptorStack,
1335
+ out List<object> interceptorObjects
975
1336
  )
976
1337
  {
977
- if (!_interceptsByType.TryGetValue(type, out interceptors) || interceptors.Count <= 0)
1338
+ if (
1339
+ !_interceptsByType.TryGetValue(
1340
+ type,
1341
+ out SortedDictionary<int, List<object>> interceptors
1342
+ )
1343
+ || interceptors.Count <= 0
1344
+ )
978
1345
  {
979
- interceptorKeys = default;
980
1346
  interceptorStack = default;
1347
+ interceptorObjects = default;
981
1348
  return false;
982
1349
  }
983
1350
 
984
1351
  if (!_interceptors.TryPop(out interceptorStack))
985
1352
  {
986
- interceptorStack = new List<object>();
1353
+ interceptorStack = new List<List<object>>(interceptors.Values);
1354
+ }
1355
+ else
1356
+ {
1357
+ interceptorStack.Clear();
1358
+ interceptorStack.AddRange(interceptors.Values);
987
1359
  }
988
1360
 
989
- if (!_interceptorKeys.TryPop(out interceptorKeys))
1361
+ if (!_innerInterceptorsStack.TryPop(out interceptorObjects))
990
1362
  {
991
- interceptorKeys = new List<int>();
1363
+ interceptorObjects = new List<object>();
992
1364
  }
993
1365
 
994
1366
  return true;
@@ -1000,9 +1372,8 @@
1000
1372
  if (
1001
1373
  !TryGetInterceptorCaches(
1002
1374
  type,
1003
- out SortedDictionary<int, List<object>> interceptors,
1004
- out List<int> interceptorKeys,
1005
- out List<object> interceptorStack
1375
+ out List<List<object>> interceptorStack,
1376
+ out List<object> interceptorObjects
1006
1377
  )
1007
1378
  )
1008
1379
  {
@@ -1011,22 +1382,12 @@
1011
1382
 
1012
1383
  try
1013
1384
  {
1014
- interceptorKeys.Clear();
1015
- interceptorKeys.AddRange(interceptors.Keys);
1016
- foreach (int priority in interceptorKeys)
1385
+ foreach (List<object> stack in interceptorStack)
1017
1386
  {
1018
- if (
1019
- !interceptors.TryGetValue(priority, out List<object> untypedInterceptors)
1020
- || untypedInterceptors.Count <= 0
1021
- )
1022
- {
1023
- continue;
1024
- }
1025
-
1026
- interceptorStack.Clear();
1027
- interceptorStack.AddRange(untypedInterceptors);
1387
+ interceptorObjects.Clear();
1388
+ interceptorObjects.AddRange(stack);
1028
1389
 
1029
- foreach (object transformer in interceptorStack)
1390
+ foreach (object transformer in interceptorObjects)
1030
1391
  {
1031
1392
  if (transformer is not UntargetedInterceptor<T> typedTransformer)
1032
1393
  {
@@ -1043,7 +1404,7 @@
1043
1404
  finally
1044
1405
  {
1045
1406
  _interceptors.Push(interceptorStack);
1046
- _interceptorKeys.Push(interceptorKeys);
1407
+ _innerInterceptorsStack.Push(interceptorObjects);
1047
1408
  }
1048
1409
 
1049
1410
  return true;
@@ -1055,9 +1416,8 @@
1055
1416
  if (
1056
1417
  !TryGetInterceptorCaches(
1057
1418
  type,
1058
- out SortedDictionary<int, List<object>> interceptors,
1059
- out List<int> interceptorKeys,
1060
- out List<object> interceptorStack
1419
+ out List<List<object>> interceptorStack,
1420
+ out List<object> interceptorObjects
1061
1421
  )
1062
1422
  )
1063
1423
  {
@@ -1066,22 +1426,12 @@
1066
1426
 
1067
1427
  try
1068
1428
  {
1069
- interceptorKeys.Clear();
1070
- interceptorKeys.AddRange(interceptors.Keys);
1071
- foreach (int priority in interceptorKeys)
1429
+ foreach (List<object> stack in interceptorStack)
1072
1430
  {
1073
- if (
1074
- !interceptors.TryGetValue(priority, out List<object> untypedInterceptors)
1075
- || untypedInterceptors.Count <= 0
1076
- )
1077
- {
1078
- continue;
1079
- }
1431
+ interceptorObjects.Clear();
1432
+ interceptorObjects.AddRange(stack);
1080
1433
 
1081
- interceptorStack.Clear();
1082
- interceptorStack.AddRange(untypedInterceptors);
1083
-
1084
- foreach (object transformer in interceptorStack)
1434
+ foreach (object transformer in interceptorObjects)
1085
1435
  {
1086
1436
  if (transformer is not TargetedInterceptor<T> typedTransformer)
1087
1437
  {
@@ -1098,7 +1448,7 @@
1098
1448
  finally
1099
1449
  {
1100
1450
  _interceptors.Push(interceptorStack);
1101
- _interceptorKeys.Push(interceptorKeys);
1451
+ _innerInterceptorsStack.Push(interceptorObjects);
1102
1452
  }
1103
1453
 
1104
1454
  return true;
@@ -1110,9 +1460,8 @@
1110
1460
  if (
1111
1461
  !TryGetInterceptorCaches(
1112
1462
  type,
1113
- out SortedDictionary<int, List<object>> interceptors,
1114
- out List<int> interceptorKeys,
1115
- out List<object> interceptorStack
1463
+ out List<List<object>> interceptorStack,
1464
+ out List<object> interceptorObjects
1116
1465
  )
1117
1466
  )
1118
1467
  {
@@ -1121,22 +1470,12 @@
1121
1470
 
1122
1471
  try
1123
1472
  {
1124
- interceptorKeys.Clear();
1125
- interceptorKeys.AddRange(interceptors.Keys);
1126
- foreach (int priority in interceptorKeys)
1473
+ foreach (List<object> stack in interceptorStack)
1127
1474
  {
1128
- if (
1129
- !interceptors.TryGetValue(priority, out List<object> untypedInterceptors)
1130
- || untypedInterceptors.Count <= 0
1131
- )
1132
- {
1133
- continue;
1134
- }
1475
+ interceptorObjects.Clear();
1476
+ interceptorObjects.AddRange(stack);
1135
1477
 
1136
- interceptorStack.Clear();
1137
- interceptorStack.AddRange(untypedInterceptors);
1138
-
1139
- foreach (object transformer in interceptorStack)
1478
+ foreach (object transformer in interceptorObjects)
1140
1479
  {
1141
1480
  if (transformer is not BroadcastInterceptor<T> typedTransformer)
1142
1481
  {
@@ -1153,7 +1492,7 @@
1153
1492
  finally
1154
1493
  {
1155
1494
  _interceptors.Push(interceptorStack);
1156
- _interceptorKeys.Push(interceptorKeys);
1495
+ _innerInterceptorsStack.Push(interceptorObjects);
1157
1496
  }
1158
1497
 
1159
1498
  return true;
@@ -1173,15 +1512,53 @@
1173
1512
  return false;
1174
1513
  }
1175
1514
 
1515
+ if (sortedHandlers.Count == 1)
1516
+ {
1517
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry = sortedHandlers.First();
1518
+ RunUntargetedBroadcast(ref message, entry.Key, entry.Value);
1519
+ return true;
1520
+ }
1521
+
1176
1522
  List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
1177
1523
  GetOrAddMessageHandlerStack(sortedHandlers);
1178
1524
  try
1179
1525
  {
1180
- foreach (KeyValuePair<int, Dictionary<MessageHandler, int>> handlers in handlerList)
1526
+ foreach (KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList)
1527
+ {
1528
+ RunUntargetedBroadcast(ref message, entry.Key, entry.Value);
1529
+ }
1530
+ }
1531
+ finally
1532
+ {
1533
+ _sortedHandlers.Push(handlerList);
1534
+ }
1535
+
1536
+ return true;
1537
+ }
1538
+
1539
+ private void RunUntargetedBroadcast<TMessage>(
1540
+ ref TMessage message,
1541
+ int priority,
1542
+ Dictionary<MessageHandler, int> handlers
1543
+ )
1544
+ where TMessage : IMessage
1545
+ {
1546
+ switch (handlers.Count)
1547
+ {
1548
+ case <= 0:
1549
+ {
1550
+ return;
1551
+ }
1552
+ case 1:
1553
+ {
1554
+ MessageHandler handler = handlers.Keys.First();
1555
+ handler.HandleUntargetedMessage(ref message, this, priority);
1556
+ return;
1557
+ }
1558
+ default:
1181
1559
  {
1182
- int priority = handlers.Key;
1183
1560
  List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
1184
- handlers.Value.Keys
1561
+ handlers.Keys
1185
1562
  );
1186
1563
  try
1187
1564
  {
@@ -1194,14 +1571,10 @@
1194
1571
  {
1195
1572
  _messageHandlers.Push(messageHandlers);
1196
1573
  }
1574
+
1575
+ break;
1197
1576
  }
1198
1577
  }
1199
- finally
1200
- {
1201
- _sortedHandlers.Push(handlerList);
1202
- }
1203
-
1204
- return true;
1205
1578
  }
1206
1579
 
1207
1580
  private bool InternalTargetedWithoutTargetingBroadcast<TMessage>(
@@ -1222,15 +1595,54 @@
1222
1595
  return false;
1223
1596
  }
1224
1597
 
1598
+ if (sortedHandlers.Count == 1)
1599
+ {
1600
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry = sortedHandlers.First();
1601
+ RunTargetedWithoutTargeting(ref target, ref message, entry.Key, entry.Value);
1602
+ return true;
1603
+ }
1604
+
1225
1605
  List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
1226
1606
  GetOrAddMessageHandlerStack(sortedHandlers);
1227
1607
  try
1228
1608
  {
1229
- foreach (KeyValuePair<int, Dictionary<MessageHandler, int>> handlers in handlerList)
1609
+ foreach (KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList)
1610
+ {
1611
+ RunTargetedWithoutTargeting(ref target, ref message, entry.Key, entry.Value);
1612
+ }
1613
+ }
1614
+ finally
1615
+ {
1616
+ _sortedHandlers.Push(handlerList);
1617
+ }
1618
+
1619
+ return true;
1620
+ }
1621
+
1622
+ private void RunTargetedWithoutTargeting<TMessage>(
1623
+ ref InstanceId target,
1624
+ ref TMessage message,
1625
+ int priority,
1626
+ Dictionary<MessageHandler, int> handlers
1627
+ )
1628
+ where TMessage : ITargetedMessage
1629
+ {
1630
+ switch (handlers.Count)
1631
+ {
1632
+ case <= 0:
1633
+ {
1634
+ return;
1635
+ }
1636
+ case 1:
1637
+ {
1638
+ MessageHandler handler = handlers.Keys.First();
1639
+ handler.HandleTargetedWithoutTargeting(ref target, ref message, this, priority);
1640
+ return;
1641
+ }
1642
+ default:
1230
1643
  {
1231
- int priority = handlers.Key;
1232
1644
  List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
1233
- handlers.Value.Keys
1645
+ handlers.Keys
1234
1646
  );
1235
1647
  try
1236
1648
  {
@@ -1248,18 +1660,14 @@
1248
1660
  {
1249
1661
  _messageHandlers.Push(messageHandlers);
1250
1662
  }
1663
+
1664
+ break;
1251
1665
  }
1252
1666
  }
1253
- finally
1254
- {
1255
- _sortedHandlers.Push(handlerList);
1256
- }
1257
-
1258
- return true;
1259
1667
  }
1260
1668
 
1261
1669
  private bool InternalBroadcastWithoutSource<TMessage>(
1262
- ref InstanceId target,
1670
+ ref InstanceId source,
1263
1671
  ref TMessage message,
1264
1672
  Type type
1265
1673
  )
@@ -1276,22 +1684,66 @@
1276
1684
  return false;
1277
1685
  }
1278
1686
 
1687
+ if (sortedHandlers.Count == 1)
1688
+ {
1689
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry = sortedHandlers.First();
1690
+ RunBroadcastWithoutSource(ref source, ref message, entry.Key, entry.Value);
1691
+ return true;
1692
+ }
1693
+
1279
1694
  List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
1280
1695
  GetOrAddMessageHandlerStack(sortedHandlers);
1281
1696
  try
1282
1697
  {
1283
- foreach (KeyValuePair<int, Dictionary<MessageHandler, int>> handlers in handlerList)
1698
+ foreach (KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList)
1699
+ {
1700
+ RunBroadcastWithoutSource(ref source, ref message, entry.Key, entry.Value);
1701
+ }
1702
+ }
1703
+ finally
1704
+ {
1705
+ _sortedHandlers.Push(handlerList);
1706
+ }
1707
+
1708
+ return true;
1709
+ }
1710
+
1711
+ private void RunBroadcastWithoutSource<TMessage>(
1712
+ ref InstanceId source,
1713
+ ref TMessage message,
1714
+ int priority,
1715
+ Dictionary<MessageHandler, int> handlers
1716
+ )
1717
+ where TMessage : IBroadcastMessage
1718
+ {
1719
+ switch (handlers.Count)
1720
+ {
1721
+ case <= 0:
1722
+ {
1723
+ return;
1724
+ }
1725
+ case 1:
1726
+ {
1727
+ MessageHandler handler = handlers.Keys.First();
1728
+ handler.HandleSourcedBroadcastWithoutSource(
1729
+ ref source,
1730
+ ref message,
1731
+ this,
1732
+ priority
1733
+ );
1734
+ return;
1735
+ }
1736
+ default:
1284
1737
  {
1285
- int priority = handlers.Key;
1286
1738
  List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
1287
- handlers.Value.Keys
1739
+ handlers.Keys
1288
1740
  );
1289
1741
  try
1290
1742
  {
1291
1743
  foreach (MessageHandler handler in messageHandlers)
1292
1744
  {
1293
1745
  handler.HandleSourcedBroadcastWithoutSource(
1294
- ref target,
1746
+ ref source,
1295
1747
  ref message,
1296
1748
  this,
1297
1749
  priority
@@ -1302,14 +1754,10 @@
1302
1754
  {
1303
1755
  _messageHandlers.Push(messageHandlers);
1304
1756
  }
1757
+
1758
+ break;
1305
1759
  }
1306
1760
  }
1307
- finally
1308
- {
1309
- _sortedHandlers.Push(handlerList);
1310
- }
1311
-
1312
- return true;
1313
1761
  }
1314
1762
 
1315
1763
  private Action InternalRegisterUntargeted<T>(