com.wallstop-studios.dxmessaging 2.0.0-rc08 → 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.
@@ -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
663
+ foreach (
664
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
665
+ )
633
666
  {
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
645
- {
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
704
+ foreach (
705
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
706
+ )
674
707
  {
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
686
- {
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
955
+ foreach (
956
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
957
+ )
784
958
  {
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
796
- {
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,45 +1063,226 @@
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)
1074
+ switch (handlers.Count)
907
1075
  {
908
- return;
1076
+ case <= 0:
1077
+ {
1078
+ return;
1079
+ }
1080
+ case 1:
1081
+ {
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;
1114
+ }
909
1115
  }
1116
+ }
910
1117
 
911
- List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(_globalSinks.Keys);
912
- try
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)
913
1127
  {
914
- foreach (MessageHandler handler in messageHandlers)
1128
+ case <= 0:
915
1129
  {
916
- handler.HandleGlobalUntargetedMessage(ref message, this);
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;
917
1166
  }
918
1167
  }
919
- finally
1168
+ }
1169
+
1170
+ private void RunBroadcast<TMessage>(
1171
+ ref InstanceId source,
1172
+ ref TMessage typedMessage,
1173
+ int priority,
1174
+ Dictionary<MessageHandler, int> handlers
1175
+ )
1176
+ where TMessage : IBroadcastMessage
1177
+ {
1178
+ switch (handlers.Count)
920
1179
  {
921
- _messageHandlers.Push(messageHandlers);
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
+ }
922
1214
  }
923
1215
  }
924
1216
 
925
- private void BroadcastGlobalTargeted(ref InstanceId target, ref ITargetedMessage message)
1217
+ private void BroadcastGlobalUntargeted(ref IUntargetedMessage message)
926
1218
  {
927
- if (_globalSinks.Count <= 0)
1219
+ switch (_globalSinks.Count)
928
1220
  {
929
- return;
1221
+ case <= 0:
1222
+ {
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;
1249
+ }
930
1250
  }
1251
+ }
931
1252
 
932
- List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(_globalSinks.Keys);
933
- try
1253
+ private void BroadcastGlobalTargeted(ref InstanceId target, ref ITargetedMessage message)
1254
+ {
1255
+ switch (_globalSinks.Count)
934
1256
  {
935
- foreach (MessageHandler handler in messageHandlers)
1257
+ case <= 0:
1258
+ {
1259
+ return;
1260
+ }
1261
+ case 1:
936
1262
  {
1263
+ MessageHandler handler = _globalSinks.Keys.First();
937
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;
938
1285
  }
939
- }
940
- finally
941
- {
942
- _messageHandlers.Push(messageHandlers);
943
1286
  }
944
1287
  }
945
1288
 
@@ -948,22 +1291,41 @@
948
1291
  ref IBroadcastMessage message
949
1292
  )
950
1293
  {
951
- if (_globalSinks.Count <= 0)
1294
+ switch (_globalSinks.Count)
952
1295
  {
953
- return;
954
- }
955
-
956
- List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(_globalSinks.Keys);
957
- try
958
- {
959
- foreach (MessageHandler handler in messageHandlers)
1296
+ case <= 0:
1297
+ {
1298
+ return;
1299
+ }
1300
+ case 1:
960
1301
  {
1302
+ MessageHandler handler = _globalSinks.Keys.First();
961
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;
962
1328
  }
963
- }
964
- finally
965
- {
966
- _messageHandlers.Push(messageHandlers);
967
1329
  }
968
1330
  }
969
1331
 
@@ -1150,15 +1512,53 @@
1150
1512
  return false;
1151
1513
  }
1152
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
+
1153
1522
  List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
1154
1523
  GetOrAddMessageHandlerStack(sortedHandlers);
1155
1524
  try
1156
1525
  {
1157
- 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:
1158
1559
  {
1159
- int priority = handlers.Key;
1160
1560
  List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
1161
- handlers.Value.Keys
1561
+ handlers.Keys
1162
1562
  );
1163
1563
  try
1164
1564
  {
@@ -1171,14 +1571,10 @@
1171
1571
  {
1172
1572
  _messageHandlers.Push(messageHandlers);
1173
1573
  }
1574
+
1575
+ break;
1174
1576
  }
1175
1577
  }
1176
- finally
1177
- {
1178
- _sortedHandlers.Push(handlerList);
1179
- }
1180
-
1181
- return true;
1182
1578
  }
1183
1579
 
1184
1580
  private bool InternalTargetedWithoutTargetingBroadcast<TMessage>(
@@ -1199,15 +1595,54 @@
1199
1595
  return false;
1200
1596
  }
1201
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
+
1202
1605
  List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
1203
1606
  GetOrAddMessageHandlerStack(sortedHandlers);
1204
1607
  try
1205
1608
  {
1206
- 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:
1207
1643
  {
1208
- int priority = handlers.Key;
1209
1644
  List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
1210
- handlers.Value.Keys
1645
+ handlers.Keys
1211
1646
  );
1212
1647
  try
1213
1648
  {
@@ -1225,18 +1660,14 @@
1225
1660
  {
1226
1661
  _messageHandlers.Push(messageHandlers);
1227
1662
  }
1663
+
1664
+ break;
1228
1665
  }
1229
1666
  }
1230
- finally
1231
- {
1232
- _sortedHandlers.Push(handlerList);
1233
- }
1234
-
1235
- return true;
1236
1667
  }
1237
1668
 
1238
1669
  private bool InternalBroadcastWithoutSource<TMessage>(
1239
- ref InstanceId target,
1670
+ ref InstanceId source,
1240
1671
  ref TMessage message,
1241
1672
  Type type
1242
1673
  )
@@ -1253,22 +1684,66 @@
1253
1684
  return false;
1254
1685
  }
1255
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
+
1256
1694
  List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
1257
1695
  GetOrAddMessageHandlerStack(sortedHandlers);
1258
1696
  try
1259
1697
  {
1260
- 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:
1261
1737
  {
1262
- int priority = handlers.Key;
1263
1738
  List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
1264
- handlers.Value.Keys
1739
+ handlers.Keys
1265
1740
  );
1266
1741
  try
1267
1742
  {
1268
1743
  foreach (MessageHandler handler in messageHandlers)
1269
1744
  {
1270
1745
  handler.HandleSourcedBroadcastWithoutSource(
1271
- ref target,
1746
+ ref source,
1272
1747
  ref message,
1273
1748
  this,
1274
1749
  priority
@@ -1279,14 +1754,10 @@
1279
1754
  {
1280
1755
  _messageHandlers.Push(messageHandlers);
1281
1756
  }
1757
+
1758
+ break;
1282
1759
  }
1283
1760
  }
1284
- finally
1285
- {
1286
- _sortedHandlers.Push(handlerList);
1287
- }
1288
-
1289
- return true;
1290
1761
  }
1291
1762
 
1292
1763
  private Action InternalRegisterUntargeted<T>(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "com.wallstop-studios.dxmessaging",
3
- "version": "2.0.0-rc08",
3
+ "version": "2.0.0-rc09",
4
4
  "displayName": "DxMessaging",
5
5
  "description": "Synchronous Event Bus for Unity",
6
6
  "unity": "2021.3",