com.wallstop-studios.dxmessaging 2.0.0-rc08 → 2.0.0-rc10

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.
@@ -33,42 +33,39 @@
33
33
 
34
34
  public RegistrationLog Log => _log;
35
35
 
36
+ private readonly Dictionary<Type, SortedList<int, Dictionary<MessageHandler, int>>> _sinks =
37
+ new();
36
38
  private readonly Dictionary<
37
39
  Type,
38
- SortedDictionary<int, Dictionary<MessageHandler, int>>
39
- > _sinks = new();
40
- private readonly Dictionary<
41
- Type,
42
- Dictionary<InstanceId, SortedDictionary<int, Dictionary<MessageHandler, int>>>
40
+ Dictionary<InstanceId, SortedList<int, Dictionary<MessageHandler, int>>>
43
41
  > _targetedSinks = new();
44
42
 
45
43
  private readonly Dictionary<
46
44
  Type,
47
- Dictionary<InstanceId, SortedDictionary<int, Dictionary<MessageHandler, int>>>
45
+ Dictionary<InstanceId, SortedList<int, Dictionary<MessageHandler, int>>>
48
46
  > _broadcastSinks = new();
49
47
  private readonly Dictionary<
50
48
  Type,
51
- SortedDictionary<int, Dictionary<MessageHandler, int>>
49
+ SortedList<int, Dictionary<MessageHandler, int>>
52
50
  > _postProcessingSinks = new();
53
51
  private readonly Dictionary<
54
52
  Type,
55
- Dictionary<InstanceId, SortedDictionary<int, Dictionary<MessageHandler, int>>>
53
+ Dictionary<InstanceId, SortedList<int, Dictionary<MessageHandler, int>>>
56
54
  > _postProcessingTargetedSinks = new();
57
55
  private readonly Dictionary<
58
56
  Type,
59
- Dictionary<InstanceId, SortedDictionary<int, Dictionary<MessageHandler, int>>>
57
+ Dictionary<InstanceId, SortedList<int, Dictionary<MessageHandler, int>>>
60
58
  > _postProcessingBroadcastSinks = new();
61
59
  private readonly Dictionary<
62
60
  Type,
63
- SortedDictionary<int, Dictionary<MessageHandler, int>>
61
+ SortedList<int, Dictionary<MessageHandler, int>>
64
62
  > _postProcessingTargetedWithoutTargetingSinks = new();
65
63
  private readonly Dictionary<
66
64
  Type,
67
- SortedDictionary<int, Dictionary<MessageHandler, int>>
65
+ SortedList<int, Dictionary<MessageHandler, int>>
68
66
  > _postProcessingBroadcastWithoutSourceSinks = new();
69
67
  private readonly Dictionary<MessageHandler, int> _globalSinks = new();
70
- private readonly Dictionary<Type, SortedDictionary<int, List<object>>> _interceptsByType =
71
- new();
68
+ private readonly Dictionary<Type, SortedList<int, List<object>>> _interceptsByType = new();
72
69
  private readonly Dictionary<object, Dictionary<int, int>> _uniqueInterceptorsAndPriorities =
73
70
  new();
74
71
 
@@ -309,11 +306,11 @@
309
306
  if (
310
307
  !_interceptsByType.TryGetValue(
311
308
  type,
312
- out SortedDictionary<int, List<object>> prioritizedInterceptors
309
+ out SortedList<int, List<object>> prioritizedInterceptors
313
310
  )
314
311
  )
315
312
  {
316
- prioritizedInterceptors = new SortedDictionary<int, List<object>>();
313
+ prioritizedInterceptors = new SortedList<int, List<object>>();
317
314
  _interceptsByType[type] = prioritizedInterceptors;
318
315
  }
319
316
 
@@ -394,12 +391,12 @@
394
391
  bool complete = false;
395
392
  if (removed)
396
393
  {
397
- if (_interceptsByType.TryGetValue(type, out prioritizedInterceptors))
394
+ if (
395
+ _interceptsByType.TryGetValue(type, out prioritizedInterceptors)
396
+ && prioritizedInterceptors.TryGetValue(priority, out interceptors)
397
+ )
398
398
  {
399
- if (prioritizedInterceptors.TryGetValue(priority, out interceptors))
400
- {
401
- complete = interceptors.Remove(interceptor);
402
- }
399
+ complete = interceptors.Remove(interceptor);
403
400
  }
404
401
 
405
402
  if (!complete)
@@ -461,44 +458,35 @@
461
458
  if (
462
459
  _postProcessingSinks.TryGetValue(
463
460
  type,
464
- out SortedDictionary<int, Dictionary<MessageHandler, int>> sortedHandlers
461
+ out SortedList<int, Dictionary<MessageHandler, int>> sortedHandlers
465
462
  )
466
463
  && 0 < sortedHandlers.Count
467
464
  )
468
465
  {
469
466
  foundAnyHandlers = true;
470
- List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
471
- GetOrAddMessageHandlerStack(sortedHandlers);
472
- try
467
+ if (sortedHandlers.Count == 1)
473
468
  {
474
- foreach (
475
- KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
476
- )
469
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
470
+ sortedHandlers.First();
471
+ RunUntargetedPostProcessing(ref typedMessage, entry.Key, entry.Value);
472
+ }
473
+ else
474
+ {
475
+ List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
476
+ GetOrAddMessageHandlerStack(sortedHandlers);
477
+ try
477
478
  {
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
479
+ foreach (
480
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
481
+ )
494
482
  {
495
- _messageHandlers.Push(messageHandlers);
483
+ RunUntargetedPostProcessing(ref typedMessage, entry.Key, entry.Value);
496
484
  }
497
485
  }
498
- }
499
- finally
500
- {
501
- _sortedHandlers.Push(handlerList);
486
+ finally
487
+ {
488
+ _sortedHandlers.Push(handlerList);
489
+ }
502
490
  }
503
491
  }
504
492
 
@@ -512,6 +500,51 @@
512
500
  }
513
501
  }
514
502
 
503
+ private void RunUntargetedPostProcessing<TMessage>(
504
+ ref TMessage typedMessage,
505
+ int priority,
506
+ Dictionary<MessageHandler, int> handlers
507
+ )
508
+ where TMessage : IUntargetedMessage
509
+ {
510
+ switch (handlers.Count)
511
+ {
512
+ case <= 0:
513
+ {
514
+ return;
515
+ }
516
+ case 1:
517
+ {
518
+ MessageHandler handler = handlers.Keys.First();
519
+ handler.HandleUntargetedPostProcessing(ref typedMessage, this, priority);
520
+ return;
521
+ }
522
+ default:
523
+ {
524
+ List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
525
+ handlers.Keys
526
+ );
527
+ try
528
+ {
529
+ foreach (MessageHandler handler in messageHandlers)
530
+ {
531
+ handler.HandleUntargetedPostProcessing(
532
+ ref typedMessage,
533
+ this,
534
+ priority
535
+ );
536
+ }
537
+ }
538
+ finally
539
+ {
540
+ _messageHandlers.Push(messageHandlers);
541
+ }
542
+
543
+ break;
544
+ }
545
+ }
546
+ }
547
+
515
548
  public void UntypedTargetedBroadcast(InstanceId target, ITargetedMessage typedMessage)
516
549
  {
517
550
  Type messageType = typedMessage.MessageType;
@@ -561,50 +594,45 @@
561
594
  type,
562
595
  out Dictionary<
563
596
  InstanceId,
564
- SortedDictionary<int, Dictionary<MessageHandler, int>>
597
+ SortedList<int, Dictionary<MessageHandler, int>>
565
598
  > targetedHandlers
566
599
  )
567
600
  && targetedHandlers.TryGetValue(
568
601
  target,
569
- out SortedDictionary<int, Dictionary<MessageHandler, int>> sortedHandlers
602
+ out SortedList<int, Dictionary<MessageHandler, int>> sortedHandlers
570
603
  )
571
604
  && 0 < sortedHandlers.Count
572
605
  )
573
606
  {
574
607
  foundAnyHandlers = true;
575
- List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
576
- GetOrAddMessageHandlerStack(sortedHandlers);
577
- try
608
+ if (sortedHandlers.Count == 1)
578
609
  {
579
- foreach (
580
- KeyValuePair<int, Dictionary<MessageHandler, int>> handlers in handlerList
581
- )
610
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
611
+ sortedHandlers.First();
612
+ RunTargetedBroadcast(ref target, ref typedMessage, entry.Key, entry.Value);
613
+ }
614
+ else
615
+ {
616
+ List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
617
+ GetOrAddMessageHandlerStack(sortedHandlers);
618
+ try
582
619
  {
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
620
+ foreach (
621
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
622
+ )
600
623
  {
601
- _messageHandlers.Push(messageHandlers);
624
+ RunTargetedBroadcast(
625
+ ref target,
626
+ ref typedMessage,
627
+ entry.Key,
628
+ entry.Value
629
+ );
602
630
  }
603
631
  }
604
- }
605
- finally
606
- {
607
- _sortedHandlers.Push(handlerList);
632
+ finally
633
+ {
634
+ _sortedHandlers.Push(handlerList);
635
+ }
608
636
  }
609
637
  }
610
638
 
@@ -617,39 +645,34 @@
617
645
  )
618
646
  {
619
647
  foundAnyHandlers = true;
620
- List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
621
- GetOrAddMessageHandlerStack(sortedHandlers);
622
- try
648
+ if (sortedHandlers.Count == 1)
623
649
  {
624
- foreach (
625
- KeyValuePair<int, Dictionary<MessageHandler, int>> handlers in handlerList
626
- )
650
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
651
+ sortedHandlers.First();
652
+ RunTargetedPostProcessing(ref target, ref typedMessage, entry.Key, entry.Value);
653
+ }
654
+ else
655
+ {
656
+ List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
657
+ GetOrAddMessageHandlerStack(sortedHandlers);
658
+ try
627
659
  {
628
- int priority = handlers.Key;
629
- List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
630
- handlers.Value.Keys
631
- );
632
- try
660
+ foreach (
661
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
662
+ )
633
663
  {
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);
664
+ RunTargetedPostProcessing(
665
+ ref target,
666
+ ref typedMessage,
667
+ entry.Key,
668
+ entry.Value
669
+ );
647
670
  }
648
671
  }
649
- }
650
- finally
651
- {
652
- _sortedHandlers.Push(handlerList);
672
+ finally
673
+ {
674
+ _sortedHandlers.Push(handlerList);
675
+ }
653
676
  }
654
677
  }
655
678
 
@@ -658,39 +681,39 @@
658
681
  && 0 < sortedHandlers.Count
659
682
  )
660
683
  {
661
- List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
662
- GetOrAddMessageHandlerStack(sortedHandlers);
663
- try
684
+ if (sortedHandlers.Count == 1)
664
685
  {
665
- foreach (
666
- KeyValuePair<int, Dictionary<MessageHandler, int>> handlers in handlerList
667
- )
686
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
687
+ sortedHandlers.First();
688
+ RunTargetedWithoutTargetingPostProcessing(
689
+ ref target,
690
+ ref typedMessage,
691
+ entry.Key,
692
+ entry.Value
693
+ );
694
+ }
695
+ else
696
+ {
697
+ List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
698
+ GetOrAddMessageHandlerStack(sortedHandlers);
699
+ try
668
700
  {
669
- int priority = handlers.Key;
670
- List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
671
- handlers.Value.Keys
672
- );
673
- try
701
+ foreach (
702
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
703
+ )
674
704
  {
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);
705
+ RunTargetedWithoutTargetingPostProcessing(
706
+ ref target,
707
+ ref typedMessage,
708
+ entry.Key,
709
+ entry.Value
710
+ );
688
711
  }
689
712
  }
690
- }
691
- finally
692
- {
693
- _sortedHandlers.Push(handlerList);
713
+ finally
714
+ {
715
+ _sortedHandlers.Push(handlerList);
716
+ }
694
717
  }
695
718
  }
696
719
 
@@ -705,6 +728,152 @@
705
728
  }
706
729
  }
707
730
 
731
+ private void RunTargetedWithoutTargetingPostProcessing<TMessage>(
732
+ ref InstanceId target,
733
+ ref TMessage typedMessage,
734
+ int priority,
735
+ Dictionary<MessageHandler, int> handlers
736
+ )
737
+ where TMessage : ITargetedMessage
738
+ {
739
+ switch (handlers.Count)
740
+ {
741
+ case <= 0:
742
+ {
743
+ return;
744
+ }
745
+ case 1:
746
+ {
747
+ MessageHandler handler = handlers.Keys.First();
748
+ handler.HandleTargetedWithoutTargetingPostProcessing(
749
+ ref target,
750
+ ref typedMessage,
751
+ this,
752
+ priority
753
+ );
754
+ return;
755
+ }
756
+ default:
757
+ {
758
+ List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
759
+ handlers.Keys
760
+ );
761
+ try
762
+ {
763
+ foreach (MessageHandler handler in messageHandlers)
764
+ {
765
+ handler.HandleTargetedWithoutTargetingPostProcessing(
766
+ ref target,
767
+ ref typedMessage,
768
+ this,
769
+ priority
770
+ );
771
+ }
772
+ }
773
+ finally
774
+ {
775
+ _messageHandlers.Push(messageHandlers);
776
+ }
777
+
778
+ break;
779
+ }
780
+ }
781
+ }
782
+
783
+ private void RunTargetedPostProcessing<TMessage>(
784
+ ref InstanceId target,
785
+ ref TMessage typedMessage,
786
+ int priority,
787
+ Dictionary<MessageHandler, int> handlers
788
+ )
789
+ where TMessage : ITargetedMessage
790
+ {
791
+ switch (handlers.Count)
792
+ {
793
+ case <= 0:
794
+ {
795
+ return;
796
+ }
797
+ case 1:
798
+ {
799
+ MessageHandler handler = handlers.Keys.First();
800
+ handler.HandleTargetedPostProcessing(
801
+ ref target,
802
+ ref typedMessage,
803
+ this,
804
+ priority
805
+ );
806
+ return;
807
+ }
808
+ default:
809
+ {
810
+ List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
811
+ handlers.Keys
812
+ );
813
+ try
814
+ {
815
+ foreach (MessageHandler handler in messageHandlers)
816
+ {
817
+ handler.HandleTargetedPostProcessing(
818
+ ref target,
819
+ ref typedMessage,
820
+ this,
821
+ priority
822
+ );
823
+ }
824
+ }
825
+ finally
826
+ {
827
+ _messageHandlers.Push(messageHandlers);
828
+ }
829
+
830
+ break;
831
+ }
832
+ }
833
+ }
834
+
835
+ private void RunTargetedBroadcast<TMessage>(
836
+ ref InstanceId target,
837
+ ref TMessage typedMessage,
838
+ int priority,
839
+ Dictionary<MessageHandler, int> handlers
840
+ )
841
+ where TMessage : ITargetedMessage
842
+ {
843
+ switch (handlers.Count)
844
+ {
845
+ case <= 0:
846
+ {
847
+ return;
848
+ }
849
+ case 1:
850
+ {
851
+ MessageHandler handler = handlers.Keys.First();
852
+ handler.HandleTargeted(ref target, ref typedMessage, this, priority);
853
+ return;
854
+ }
855
+ default:
856
+ {
857
+ List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
858
+ handlers.Keys
859
+ );
860
+ try
861
+ {
862
+ foreach (MessageHandler handler in messageHandlers)
863
+ {
864
+ handler.HandleTargeted(ref target, ref typedMessage, this, priority);
865
+ }
866
+ }
867
+ finally
868
+ {
869
+ _messageHandlers.Push(messageHandlers);
870
+ }
871
+
872
+ break;
873
+ }
874
+ }
875
+ }
876
+
708
877
  public void UntypedSourcedBroadcast(InstanceId source, IBroadcastMessage typedMessage)
709
878
  {
710
879
  Type messageType = typedMessage.MessageType;
@@ -757,50 +926,40 @@
757
926
  type,
758
927
  out Dictionary<
759
928
  InstanceId,
760
- SortedDictionary<int, Dictionary<MessageHandler, int>>
929
+ SortedList<int, Dictionary<MessageHandler, int>>
761
930
  > broadcastHandlers
762
931
  )
763
932
  && broadcastHandlers.TryGetValue(
764
933
  source,
765
- out SortedDictionary<int, Dictionary<MessageHandler, int>> sortedHandlers
934
+ out SortedList<int, Dictionary<MessageHandler, int>> sortedHandlers
766
935
  )
767
936
  && 0 < sortedHandlers.Count
768
937
  )
769
938
  {
770
939
  foundAnyHandlers = true;
771
- List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
772
- GetOrAddMessageHandlerStack(sortedHandlers);
773
- try
940
+ if (sortedHandlers.Count == 1)
774
941
  {
775
- foreach (
776
- KeyValuePair<int, Dictionary<MessageHandler, int>> handlers in handlerList
777
- )
942
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
943
+ sortedHandlers.First();
944
+ RunBroadcast(ref source, ref typedMessage, entry.Key, entry.Value);
945
+ }
946
+ else
947
+ {
948
+ List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
949
+ GetOrAddMessageHandlerStack(sortedHandlers);
950
+ try
778
951
  {
779
- int priority = handlers.Key;
780
- List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
781
- handlers.Value.Keys
782
- );
783
- try
952
+ foreach (
953
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
954
+ )
784
955
  {
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);
956
+ RunBroadcast(ref source, ref typedMessage, entry.Key, entry.Value);
798
957
  }
799
958
  }
800
- }
801
- finally
802
- {
803
- _sortedHandlers.Push(handlerList);
959
+ finally
960
+ {
961
+ _sortedHandlers.Push(handlerList);
962
+ }
804
963
  }
805
964
  }
806
965
 
@@ -813,39 +972,39 @@
813
972
  )
814
973
  {
815
974
  foundAnyHandlers = true;
816
- List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
817
- GetOrAddMessageHandlerStack(sortedHandlers);
818
- try
975
+ if (sortedHandlers.Count == 1)
819
976
  {
820
- foreach (
821
- KeyValuePair<int, Dictionary<MessageHandler, int>> handlers in handlerList
822
- )
977
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
978
+ sortedHandlers.First();
979
+ RunBroadcastPostProcessing(
980
+ ref source,
981
+ ref typedMessage,
982
+ entry.Key,
983
+ entry.Value
984
+ );
985
+ }
986
+ else
987
+ {
988
+ List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
989
+ GetOrAddMessageHandlerStack(sortedHandlers);
990
+ try
823
991
  {
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
992
+ foreach (
993
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
994
+ )
841
995
  {
842
- _messageHandlers.Push(messageHandlers);
996
+ RunBroadcastPostProcessing(
997
+ ref source,
998
+ ref typedMessage,
999
+ entry.Key,
1000
+ entry.Value
1001
+ );
843
1002
  }
844
1003
  }
845
- }
846
- finally
847
- {
848
- _sortedHandlers.Push(handlerList);
1004
+ finally
1005
+ {
1006
+ _sortedHandlers.Push(handlerList);
1007
+ }
849
1008
  }
850
1009
  }
851
1010
 
@@ -854,39 +1013,39 @@
854
1013
  && 0 < sortedHandlers.Count
855
1014
  )
856
1015
  {
857
- List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
858
- GetOrAddMessageHandlerStack(sortedHandlers);
859
- try
1016
+ if (sortedHandlers.Count == 1)
860
1017
  {
861
- foreach (
862
- KeyValuePair<int, Dictionary<MessageHandler, int>> handlers in handlerList
863
- )
1018
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry =
1019
+ sortedHandlers.First();
1020
+ RunBroadcastWithoutSourcePostProcessing(
1021
+ ref source,
1022
+ ref typedMessage,
1023
+ entry.Key,
1024
+ entry.Value
1025
+ );
1026
+ }
1027
+ else
1028
+ {
1029
+ List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
1030
+ GetOrAddMessageHandlerStack(sortedHandlers);
1031
+ try
864
1032
  {
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
1033
+ foreach (
1034
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList
1035
+ )
882
1036
  {
883
- _messageHandlers.Push(messageHandlers);
1037
+ RunBroadcastWithoutSourcePostProcessing(
1038
+ ref source,
1039
+ ref typedMessage,
1040
+ entry.Key,
1041
+ entry.Value
1042
+ );
884
1043
  }
885
1044
  }
886
- }
887
- finally
888
- {
889
- _sortedHandlers.Push(handlerList);
1045
+ finally
1046
+ {
1047
+ _sortedHandlers.Push(handlerList);
1048
+ }
890
1049
  }
891
1050
  }
892
1051
 
@@ -901,45 +1060,226 @@
901
1060
  }
902
1061
  }
903
1062
 
904
- private void BroadcastGlobalUntargeted(ref IUntargetedMessage message)
1063
+ private void RunBroadcastWithoutSourcePostProcessing<TMessage>(
1064
+ ref InstanceId source,
1065
+ ref TMessage typedMessage,
1066
+ int priority,
1067
+ Dictionary<MessageHandler, int> handlers
1068
+ )
1069
+ where TMessage : IBroadcastMessage
905
1070
  {
906
- if (_globalSinks.Count <= 0)
907
- {
908
- return;
909
- }
910
-
911
- List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(_globalSinks.Keys);
912
- try
1071
+ switch (handlers.Count)
913
1072
  {
914
- foreach (MessageHandler handler in messageHandlers)
1073
+ case <= 0:
915
1074
  {
916
- handler.HandleGlobalUntargetedMessage(ref message, this);
1075
+ return;
917
1076
  }
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)
1077
+ case 1:
1078
+ {
1079
+ MessageHandler handler = handlers.Keys.First();
1080
+ handler.HandleSourcedBroadcastWithoutSourcePostProcessing(
1081
+ ref source,
1082
+ ref typedMessage,
1083
+ this,
1084
+ priority
1085
+ );
1086
+ return;
1087
+ }
1088
+ default:
1089
+ {
1090
+ List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
1091
+ handlers.Keys
1092
+ );
1093
+ try
1094
+ {
1095
+ foreach (MessageHandler handler in messageHandlers)
1096
+ {
1097
+ handler.HandleSourcedBroadcastWithoutSourcePostProcessing(
1098
+ ref source,
1099
+ ref typedMessage,
1100
+ this,
1101
+ priority
1102
+ );
1103
+ }
1104
+ }
1105
+ finally
1106
+ {
1107
+ _messageHandlers.Push(messageHandlers);
1108
+ }
1109
+
1110
+ break;
1111
+ }
1112
+ }
1113
+ }
1114
+
1115
+ private void RunBroadcastPostProcessing<TMessage>(
1116
+ ref InstanceId source,
1117
+ ref TMessage typedMessage,
1118
+ int priority,
1119
+ Dictionary<MessageHandler, int> handlers
1120
+ )
1121
+ where TMessage : IBroadcastMessage
1122
+ {
1123
+ switch (handlers.Count)
928
1124
  {
929
- return;
1125
+ case <= 0:
1126
+ {
1127
+ return;
1128
+ }
1129
+ case 1:
1130
+ {
1131
+ MessageHandler handler = handlers.Keys.First();
1132
+ handler.HandleSourcedBroadcastPostProcessing(
1133
+ ref source,
1134
+ ref typedMessage,
1135
+ this,
1136
+ priority
1137
+ );
1138
+ return;
1139
+ }
1140
+ default:
1141
+ {
1142
+ List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
1143
+ handlers.Keys
1144
+ );
1145
+ try
1146
+ {
1147
+ foreach (MessageHandler handler in messageHandlers)
1148
+ {
1149
+ handler.HandleSourcedBroadcastPostProcessing(
1150
+ ref source,
1151
+ ref typedMessage,
1152
+ this,
1153
+ priority
1154
+ );
1155
+ }
1156
+ }
1157
+ finally
1158
+ {
1159
+ _messageHandlers.Push(messageHandlers);
1160
+ }
1161
+
1162
+ break;
1163
+ }
930
1164
  }
1165
+ }
931
1166
 
932
- List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(_globalSinks.Keys);
933
- try
1167
+ private void RunBroadcast<TMessage>(
1168
+ ref InstanceId source,
1169
+ ref TMessage typedMessage,
1170
+ int priority,
1171
+ Dictionary<MessageHandler, int> handlers
1172
+ )
1173
+ where TMessage : IBroadcastMessage
1174
+ {
1175
+ switch (handlers.Count)
934
1176
  {
935
- foreach (MessageHandler handler in messageHandlers)
1177
+ case <= 0:
936
1178
  {
937
- handler.HandleGlobalTargetedMessage(ref target, ref message, this);
1179
+ return;
1180
+ }
1181
+ case 1:
1182
+ {
1183
+ MessageHandler handler = handlers.Keys.First();
1184
+ handler.HandleSourcedBroadcast(ref source, ref typedMessage, this, priority);
1185
+ return;
1186
+ }
1187
+ default:
1188
+ {
1189
+ List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
1190
+ handlers.Keys
1191
+ );
1192
+ try
1193
+ {
1194
+ foreach (MessageHandler handler in messageHandlers)
1195
+ {
1196
+ handler.HandleSourcedBroadcast(
1197
+ ref source,
1198
+ ref typedMessage,
1199
+ this,
1200
+ priority
1201
+ );
1202
+ }
1203
+ }
1204
+ finally
1205
+ {
1206
+ _messageHandlers.Push(messageHandlers);
1207
+ }
1208
+
1209
+ break;
938
1210
  }
939
1211
  }
940
- finally
1212
+ }
1213
+
1214
+ private void BroadcastGlobalUntargeted(ref IUntargetedMessage message)
1215
+ {
1216
+ switch (_globalSinks.Count)
941
1217
  {
942
- _messageHandlers.Push(messageHandlers);
1218
+ case <= 0:
1219
+ {
1220
+ return;
1221
+ }
1222
+ case 1:
1223
+ {
1224
+ MessageHandler handler = _globalSinks.Keys.First();
1225
+ handler.HandleGlobalUntargetedMessage(ref message, this);
1226
+ return;
1227
+ }
1228
+ default:
1229
+ {
1230
+ List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
1231
+ _globalSinks.Keys
1232
+ );
1233
+ try
1234
+ {
1235
+ foreach (MessageHandler handler in messageHandlers)
1236
+ {
1237
+ handler.HandleGlobalUntargetedMessage(ref message, this);
1238
+ }
1239
+ }
1240
+ finally
1241
+ {
1242
+ _messageHandlers.Push(messageHandlers);
1243
+ }
1244
+
1245
+ break;
1246
+ }
1247
+ }
1248
+ }
1249
+
1250
+ private void BroadcastGlobalTargeted(ref InstanceId target, ref ITargetedMessage message)
1251
+ {
1252
+ switch (_globalSinks.Count)
1253
+ {
1254
+ case <= 0:
1255
+ {
1256
+ return;
1257
+ }
1258
+ case 1:
1259
+ {
1260
+ MessageHandler handler = _globalSinks.Keys.First();
1261
+ handler.HandleGlobalTargetedMessage(ref target, ref message, this);
1262
+ return;
1263
+ }
1264
+ default:
1265
+ {
1266
+ List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
1267
+ _globalSinks.Keys
1268
+ );
1269
+ try
1270
+ {
1271
+ foreach (MessageHandler handler in messageHandlers)
1272
+ {
1273
+ handler.HandleGlobalTargetedMessage(ref target, ref message, this);
1274
+ }
1275
+ }
1276
+ finally
1277
+ {
1278
+ _messageHandlers.Push(messageHandlers);
1279
+ }
1280
+
1281
+ break;
1282
+ }
943
1283
  }
944
1284
  }
945
1285
 
@@ -948,22 +1288,41 @@
948
1288
  ref IBroadcastMessage message
949
1289
  )
950
1290
  {
951
- if (_globalSinks.Count <= 0)
1291
+ switch (_globalSinks.Count)
952
1292
  {
953
- return;
954
- }
955
-
956
- List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(_globalSinks.Keys);
957
- try
958
- {
959
- foreach (MessageHandler handler in messageHandlers)
1293
+ case <= 0:
960
1294
  {
1295
+ return;
1296
+ }
1297
+ case 1:
1298
+ {
1299
+ MessageHandler handler = _globalSinks.Keys.First();
961
1300
  handler.HandleGlobalSourcedBroadcastMessage(ref source, ref message, this);
1301
+ return;
1302
+ }
1303
+ default:
1304
+ {
1305
+ List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
1306
+ _globalSinks.Keys
1307
+ );
1308
+ try
1309
+ {
1310
+ foreach (MessageHandler handler in messageHandlers)
1311
+ {
1312
+ handler.HandleGlobalSourcedBroadcastMessage(
1313
+ ref source,
1314
+ ref message,
1315
+ this
1316
+ );
1317
+ }
1318
+ }
1319
+ finally
1320
+ {
1321
+ _messageHandlers.Push(messageHandlers);
1322
+ }
1323
+
1324
+ break;
962
1325
  }
963
- }
964
- finally
965
- {
966
- _messageHandlers.Push(messageHandlers);
967
1326
  }
968
1327
  }
969
1328
 
@@ -974,10 +1333,7 @@
974
1333
  )
975
1334
  {
976
1335
  if (
977
- !_interceptsByType.TryGetValue(
978
- type,
979
- out SortedDictionary<int, List<object>> interceptors
980
- )
1336
+ !_interceptsByType.TryGetValue(type, out SortedList<int, List<object>> interceptors)
981
1337
  || interceptors.Count <= 0
982
1338
  )
983
1339
  {
@@ -1142,7 +1498,7 @@
1142
1498
  if (
1143
1499
  !_sinks.TryGetValue(
1144
1500
  type,
1145
- out SortedDictionary<int, Dictionary<MessageHandler, int>> sortedHandlers
1501
+ out SortedList<int, Dictionary<MessageHandler, int>> sortedHandlers
1146
1502
  )
1147
1503
  || sortedHandlers.Count <= 0
1148
1504
  )
@@ -1150,15 +1506,53 @@
1150
1506
  return false;
1151
1507
  }
1152
1508
 
1509
+ if (sortedHandlers.Count == 1)
1510
+ {
1511
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry = sortedHandlers.First();
1512
+ RunUntargetedBroadcast(ref message, entry.Key, entry.Value);
1513
+ return true;
1514
+ }
1515
+
1153
1516
  List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
1154
1517
  GetOrAddMessageHandlerStack(sortedHandlers);
1155
1518
  try
1156
1519
  {
1157
- foreach (KeyValuePair<int, Dictionary<MessageHandler, int>> handlers in handlerList)
1520
+ foreach (KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList)
1521
+ {
1522
+ RunUntargetedBroadcast(ref message, entry.Key, entry.Value);
1523
+ }
1524
+ }
1525
+ finally
1526
+ {
1527
+ _sortedHandlers.Push(handlerList);
1528
+ }
1529
+
1530
+ return true;
1531
+ }
1532
+
1533
+ private void RunUntargetedBroadcast<TMessage>(
1534
+ ref TMessage message,
1535
+ int priority,
1536
+ Dictionary<MessageHandler, int> handlers
1537
+ )
1538
+ where TMessage : IMessage
1539
+ {
1540
+ switch (handlers.Count)
1541
+ {
1542
+ case <= 0:
1543
+ {
1544
+ return;
1545
+ }
1546
+ case 1:
1547
+ {
1548
+ MessageHandler handler = handlers.Keys.First();
1549
+ handler.HandleUntargetedMessage(ref message, this, priority);
1550
+ return;
1551
+ }
1552
+ default:
1158
1553
  {
1159
- int priority = handlers.Key;
1160
1554
  List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
1161
- handlers.Value.Keys
1555
+ handlers.Keys
1162
1556
  );
1163
1557
  try
1164
1558
  {
@@ -1171,14 +1565,10 @@
1171
1565
  {
1172
1566
  _messageHandlers.Push(messageHandlers);
1173
1567
  }
1568
+
1569
+ break;
1174
1570
  }
1175
1571
  }
1176
- finally
1177
- {
1178
- _sortedHandlers.Push(handlerList);
1179
- }
1180
-
1181
- return true;
1182
1572
  }
1183
1573
 
1184
1574
  private bool InternalTargetedWithoutTargetingBroadcast<TMessage>(
@@ -1191,7 +1581,7 @@
1191
1581
  if (
1192
1582
  !_sinks.TryGetValue(
1193
1583
  type,
1194
- out SortedDictionary<int, Dictionary<MessageHandler, int>> sortedHandlers
1584
+ out SortedList<int, Dictionary<MessageHandler, int>> sortedHandlers
1195
1585
  )
1196
1586
  || sortedHandlers.Count <= 0
1197
1587
  )
@@ -1199,15 +1589,54 @@
1199
1589
  return false;
1200
1590
  }
1201
1591
 
1592
+ if (sortedHandlers.Count == 1)
1593
+ {
1594
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry = sortedHandlers.First();
1595
+ RunTargetedWithoutTargeting(ref target, ref message, entry.Key, entry.Value);
1596
+ return true;
1597
+ }
1598
+
1202
1599
  List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
1203
1600
  GetOrAddMessageHandlerStack(sortedHandlers);
1204
1601
  try
1205
1602
  {
1206
- foreach (KeyValuePair<int, Dictionary<MessageHandler, int>> handlers in handlerList)
1603
+ foreach (KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList)
1604
+ {
1605
+ RunTargetedWithoutTargeting(ref target, ref message, entry.Key, entry.Value);
1606
+ }
1607
+ }
1608
+ finally
1609
+ {
1610
+ _sortedHandlers.Push(handlerList);
1611
+ }
1612
+
1613
+ return true;
1614
+ }
1615
+
1616
+ private void RunTargetedWithoutTargeting<TMessage>(
1617
+ ref InstanceId target,
1618
+ ref TMessage message,
1619
+ int priority,
1620
+ Dictionary<MessageHandler, int> handlers
1621
+ )
1622
+ where TMessage : ITargetedMessage
1623
+ {
1624
+ switch (handlers.Count)
1625
+ {
1626
+ case <= 0:
1627
+ {
1628
+ return;
1629
+ }
1630
+ case 1:
1631
+ {
1632
+ MessageHandler handler = handlers.Keys.First();
1633
+ handler.HandleTargetedWithoutTargeting(ref target, ref message, this, priority);
1634
+ return;
1635
+ }
1636
+ default:
1207
1637
  {
1208
- int priority = handlers.Key;
1209
1638
  List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
1210
- handlers.Value.Keys
1639
+ handlers.Keys
1211
1640
  );
1212
1641
  try
1213
1642
  {
@@ -1225,18 +1654,14 @@
1225
1654
  {
1226
1655
  _messageHandlers.Push(messageHandlers);
1227
1656
  }
1657
+
1658
+ break;
1228
1659
  }
1229
1660
  }
1230
- finally
1231
- {
1232
- _sortedHandlers.Push(handlerList);
1233
- }
1234
-
1235
- return true;
1236
1661
  }
1237
1662
 
1238
1663
  private bool InternalBroadcastWithoutSource<TMessage>(
1239
- ref InstanceId target,
1664
+ ref InstanceId source,
1240
1665
  ref TMessage message,
1241
1666
  Type type
1242
1667
  )
@@ -1245,7 +1670,7 @@
1245
1670
  if (
1246
1671
  !_sinks.TryGetValue(
1247
1672
  type,
1248
- out SortedDictionary<int, Dictionary<MessageHandler, int>> sortedHandlers
1673
+ out SortedList<int, Dictionary<MessageHandler, int>> sortedHandlers
1249
1674
  )
1250
1675
  || sortedHandlers.Count <= 0
1251
1676
  )
@@ -1253,22 +1678,66 @@
1253
1678
  return false;
1254
1679
  }
1255
1680
 
1681
+ if (sortedHandlers.Count == 1)
1682
+ {
1683
+ KeyValuePair<int, Dictionary<MessageHandler, int>> entry = sortedHandlers.First();
1684
+ RunBroadcastWithoutSource(ref source, ref message, entry.Key, entry.Value);
1685
+ return true;
1686
+ }
1687
+
1256
1688
  List<KeyValuePair<int, Dictionary<MessageHandler, int>>> handlerList =
1257
1689
  GetOrAddMessageHandlerStack(sortedHandlers);
1258
1690
  try
1259
1691
  {
1260
- foreach (KeyValuePair<int, Dictionary<MessageHandler, int>> handlers in handlerList)
1692
+ foreach (KeyValuePair<int, Dictionary<MessageHandler, int>> entry in handlerList)
1693
+ {
1694
+ RunBroadcastWithoutSource(ref source, ref message, entry.Key, entry.Value);
1695
+ }
1696
+ }
1697
+ finally
1698
+ {
1699
+ _sortedHandlers.Push(handlerList);
1700
+ }
1701
+
1702
+ return true;
1703
+ }
1704
+
1705
+ private void RunBroadcastWithoutSource<TMessage>(
1706
+ ref InstanceId source,
1707
+ ref TMessage message,
1708
+ int priority,
1709
+ Dictionary<MessageHandler, int> handlers
1710
+ )
1711
+ where TMessage : IBroadcastMessage
1712
+ {
1713
+ switch (handlers.Count)
1714
+ {
1715
+ case <= 0:
1716
+ {
1717
+ return;
1718
+ }
1719
+ case 1:
1720
+ {
1721
+ MessageHandler handler = handlers.Keys.First();
1722
+ handler.HandleSourcedBroadcastWithoutSource(
1723
+ ref source,
1724
+ ref message,
1725
+ this,
1726
+ priority
1727
+ );
1728
+ return;
1729
+ }
1730
+ default:
1261
1731
  {
1262
- int priority = handlers.Key;
1263
1732
  List<MessageHandler> messageHandlers = GetOrAddMessageHandlerStack(
1264
- handlers.Value.Keys
1733
+ handlers.Keys
1265
1734
  );
1266
1735
  try
1267
1736
  {
1268
1737
  foreach (MessageHandler handler in messageHandlers)
1269
1738
  {
1270
1739
  handler.HandleSourcedBroadcastWithoutSource(
1271
- ref target,
1740
+ ref source,
1272
1741
  ref message,
1273
1742
  this,
1274
1743
  priority
@@ -1279,19 +1748,15 @@
1279
1748
  {
1280
1749
  _messageHandlers.Push(messageHandlers);
1281
1750
  }
1751
+
1752
+ break;
1282
1753
  }
1283
1754
  }
1284
- finally
1285
- {
1286
- _sortedHandlers.Push(handlerList);
1287
- }
1288
-
1289
- return true;
1290
1755
  }
1291
1756
 
1292
1757
  private Action InternalRegisterUntargeted<T>(
1293
1758
  MessageHandler messageHandler,
1294
- Dictionary<Type, SortedDictionary<int, Dictionary<MessageHandler, int>>> sinks,
1759
+ Dictionary<Type, SortedList<int, Dictionary<MessageHandler, int>>> sinks,
1295
1760
  RegistrationMethod registrationMethod,
1296
1761
  int priority
1297
1762
  )
@@ -1308,11 +1773,11 @@
1308
1773
  if (
1309
1774
  !sinks.TryGetValue(
1310
1775
  type,
1311
- out SortedDictionary<int, Dictionary<MessageHandler, int>> handlers
1776
+ out SortedList<int, Dictionary<MessageHandler, int>> handlers
1312
1777
  )
1313
1778
  )
1314
1779
  {
1315
- handlers = new SortedDictionary<int, Dictionary<MessageHandler, int>>();
1780
+ handlers = new SortedList<int, Dictionary<MessageHandler, int>>();
1316
1781
  sinks[type] = handlers;
1317
1782
  }
1318
1783
 
@@ -1395,7 +1860,7 @@
1395
1860
  MessageHandler messageHandler,
1396
1861
  Dictionary<
1397
1862
  Type,
1398
- Dictionary<InstanceId, SortedDictionary<int, Dictionary<MessageHandler, int>>>
1863
+ Dictionary<InstanceId, SortedList<int, Dictionary<MessageHandler, int>>>
1399
1864
  > sinks,
1400
1865
  RegistrationMethod registrationMethod,
1401
1866
  int priority
@@ -1412,27 +1877,24 @@
1412
1877
  type,
1413
1878
  out Dictionary<
1414
1879
  InstanceId,
1415
- SortedDictionary<int, Dictionary<MessageHandler, int>>
1880
+ SortedList<int, Dictionary<MessageHandler, int>>
1416
1881
  > broadcastHandlers
1417
1882
  )
1418
1883
  )
1419
1884
  {
1420
1885
  broadcastHandlers =
1421
- new Dictionary<
1422
- InstanceId,
1423
- SortedDictionary<int, Dictionary<MessageHandler, int>>
1424
- >();
1886
+ new Dictionary<InstanceId, SortedList<int, Dictionary<MessageHandler, int>>>();
1425
1887
  sinks[type] = broadcastHandlers;
1426
1888
  }
1427
1889
 
1428
1890
  if (
1429
1891
  !broadcastHandlers.TryGetValue(
1430
1892
  context,
1431
- out SortedDictionary<int, Dictionary<MessageHandler, int>> handlers
1893
+ out SortedList<int, Dictionary<MessageHandler, int>> handlers
1432
1894
  )
1433
1895
  )
1434
1896
  {
1435
- handlers = new SortedDictionary<int, Dictionary<MessageHandler, int>>();
1897
+ handlers = new SortedList<int, Dictionary<MessageHandler, int>>();
1436
1898
  broadcastHandlers[context] = handlers;
1437
1899
  }
1438
1900