@@ -507,17 +507,28 @@ impl EventArray {
507
507
}
508
508
}
509
509
510
- impl < ' a , E > From < E > for EventArray where E : Into < Event > {
511
- fn from ( event : E ) -> EventArray {
512
- let mut array = empty_event_array ( ) ;
513
- array[ 0 ] = event. into ( ) ;
514
510
515
- EventArray {
516
- array : array,
517
- len : 1 ,
511
+ // Due to a fix to coherence rules
512
+ // (https://github.com/rust-lang/rust/pull/46192) we must manually implement
513
+ // this for each event type.
514
+ macro_rules! from_event_into_event_array(
515
+ ( $e: ty) => (
516
+ impl <' a> From <$e> for EventArray {
517
+ fn from( event: $e) -> EventArray {
518
+ let mut array = empty_event_array( ) ;
519
+ array[ 0 ] = event. into( ) ;
520
+
521
+ EventArray {
522
+ array: array,
523
+ len: 1 ,
524
+ }
525
+ }
518
526
}
519
- }
520
- }
527
+ )
528
+ ) ;
529
+ from_event_into_event_array ! ( EventCore ) ;
530
+ from_event_into_event_array ! ( Event ) ;
531
+
521
532
522
533
impl < ' a , E > From < & ' a E > for EventArray where E : Into < Event > + Clone {
523
534
#[ inline]
@@ -850,12 +861,21 @@ impl EventList {
850
861
}
851
862
}
852
863
853
- impl < ' a , E > From < E > for EventList where E : Into < Event > {
854
- #[ inline]
855
- fn from ( event : E ) -> EventList {
856
- EventList { inner : Inner :: Array ( EventArray :: from ( event) ) }
857
- }
858
- }
864
+ // Due to a fix to coherence rules
865
+ // (https://github.com/rust-lang/rust/pull/46192) we must manually implement
866
+ // this for each event type.
867
+ macro_rules! from_event_into_event_list(
868
+ ( $e: ty) => (
869
+ impl <' a> From <$e> for EventList {
870
+ #[ inline]
871
+ fn from( event: $e) -> EventList {
872
+ EventList { inner: Inner :: Array ( EventArray :: from( event) ) }
873
+ }
874
+ }
875
+ )
876
+ ) ;
877
+ from_event_into_event_list ! ( EventCore ) ;
878
+ from_event_into_event_list ! ( Event ) ;
859
879
860
880
impl < ' a , E > From < & ' a E > for EventList where E : Into < Event > + Clone {
861
881
#[ inline]
@@ -871,13 +891,22 @@ impl<'a> From<Vec<Event>> for EventList {
871
891
}
872
892
}
873
893
874
- impl < ' a , E > From < & ' a Option < E > > for EventList where E : Into < Event > + Clone {
875
- fn from ( event : & Option < E > ) -> EventList {
876
- let mut el = EventList :: new ( ) ;
877
- if let Some ( ref e) = * event { el. push ( e. clone ( ) . into ( ) ) }
878
- el
879
- }
880
- }
894
+ // Due to a fix to coherence rules
895
+ // (https://github.com/rust-lang/rust/pull/46192) we must manually implement
896
+ // this for each event type.
897
+ macro_rules! from_event_option_ref_into_event_list(
898
+ ( $e: ty) => (
899
+ impl <' a> From <& ' a Option <$e>> for EventList {
900
+ fn from( event: & Option <$e>) -> EventList {
901
+ let mut el = EventList :: new( ) ;
902
+ if let Some ( ref e) = * event { el. push:: <Event >( e. clone( ) . into( ) ) }
903
+ el
904
+ }
905
+ }
906
+ )
907
+ ) ;
908
+ from_event_option_ref_into_event_list ! ( EventCore ) ;
909
+ from_event_option_ref_into_event_list ! ( Event ) ;
881
910
882
911
impl < ' a , ' b , E > From < Option < & ' b E > > for EventList where ' b : ' a , E : Into < Event > + Clone {
883
912
fn from ( event : Option < & E > ) -> EventList {
@@ -905,38 +934,53 @@ impl<'a, E> From<&'a [E]> for EventList where E: Into<Event> + Clone {
905
934
}
906
935
}
907
936
908
- impl < ' a , E > From < & ' a [ Option < E > ] > for EventList where E : Into < Event > + Clone {
909
- fn from ( events : & [ Option < E > ] ) -> EventList {
910
- let mut el = EventList :: with_capacity ( events. len ( ) ) ;
911
-
912
- for event in events {
913
- if let Some ( ref e) = * event { el. push ( e. clone ( ) . into ( ) ) }
937
+ // Due to a fix to coherence rules
938
+ // (https://github.com/rust-lang/rust/pull/46192) we must manually implement
939
+ // this for each event type.
940
+ macro_rules! from_event_option_into_event_list(
941
+ ( $e: ty) => (
942
+ impl <' a> From <& ' a [ Option <$e>] > for EventList {
943
+ fn from( events: & [ Option <$e>] ) -> EventList {
944
+ let mut el = EventList :: with_capacity( events. len( ) ) ;
945
+ for event in events {
946
+ if let Some ( ref e) = * event { el. push:: <Event >( e. clone( ) . into( ) ) }
947
+ }
948
+ el
949
+ }
914
950
}
915
- el
916
- }
917
- }
951
+ )
952
+ ) ;
953
+ from_event_option_into_event_list ! ( EventCore ) ;
954
+ from_event_option_into_event_list ! ( Event ) ;
918
955
919
956
impl < ' a , ' b , E > From < & ' a [ Option < & ' b E > ] > for EventList where ' b : ' a , E : Into < Event > + Clone {
920
957
fn from ( events : & [ Option < & E > ] ) -> EventList {
921
958
let mut el = EventList :: with_capacity ( events. len ( ) ) ;
922
-
923
959
for event in events {
924
960
if let Some ( e) = * event { el. push ( e. clone ( ) . into ( ) ) }
925
961
}
926
962
el
927
963
}
928
964
}
929
965
930
- impl < ' a , ' b , E > From < & ' a [ & ' b Option < E > ] > for EventList where ' b : ' a , E : Into < Event > + Clone {
931
- fn from ( events : & [ & Option < E > ] ) -> EventList {
932
- let mut el = EventList :: with_capacity ( events. len ( ) ) ;
933
-
934
- for event in events {
935
- if let Some ( ref e) = * * event { el. push ( e. clone ( ) . into ( ) ) }
966
+ // Due to a fix to coherence rules
967
+ // (https://github.com/rust-lang/rust/pull/46192) we must manually implement
968
+ // this for each event type.
969
+ macro_rules! from_event_option_slice_into_event_list(
970
+ ( $e: ty) => (
971
+ impl <' a, ' b> From <& ' a [ & ' b Option <$e>] > for EventList where ' b: ' a {
972
+ fn from( events: & [ & Option <$e>] ) -> EventList {
973
+ let mut el = EventList :: with_capacity( events. len( ) ) ;
974
+ for event in events {
975
+ if let Some ( ref e) = * * event { el. push:: <Event >( e. clone( ) . into( ) ) }
976
+ }
977
+ el
978
+ }
936
979
}
937
- el
938
- }
939
- }
980
+ )
981
+ ) ;
982
+ from_event_option_slice_into_event_list ! ( EventCore ) ;
983
+ from_event_option_slice_into_event_list ! ( Event ) ;
940
984
941
985
impl < ' a , ' b , ' c , E > From < & ' a [ & ' b Option < & ' c E > ] > for EventList
942
986
where ' c : ' b , ' b : ' a , E : Into < Event > + Clone
@@ -951,59 +995,79 @@ impl<'a, 'b, 'c, E> From<&'a [&'b Option<&'c E>]> for EventList
951
995
}
952
996
}
953
997
954
- macro_rules! impl_event_list_from_arrays {
955
- ( $( $len: expr ) ,* ) => ( $(
956
- impl <' e, E > From <[ E ; $len] > for EventList where E : Into <Event > {
957
- fn from( events: [ E ; $len] ) -> EventList {
998
+ // Due to a fix to coherence rules
999
+ // (https://github.com/rust-lang/rust/pull/46192) we must manually implement
1000
+ // this for each event type.
1001
+ macro_rules! from_event_option_array_into_event_list(
1002
+ ( $e: ty, $len: expr) => (
1003
+ impl <' e> From <[ Option <$e>; $len] > for EventList {
1004
+ fn from( events: [ Option <$e>; $len] ) -> EventList {
958
1005
let mut el = EventList :: with_capacity( events. len( ) ) ;
959
1006
for idx in 0 ..events. len( ) {
960
- let event = unsafe { ptr:: read( events. get_unchecked( idx) ) } ;
961
- el. push( event. into( ) ) ;
1007
+ let event_opt = unsafe { ptr:: read( events. get_unchecked( idx) ) } ;
1008
+ if let Some ( event ) = event_opt { el. push:: < Event > ( event. into( ) ) ; }
962
1009
}
963
- // Ownership has been unsafely transfered to the new event
964
- // list without modifying the event reference count. Not
965
- // forgetting the source array would cause a double drop.
966
1010
mem:: forget( events) ;
967
1011
el
968
1012
}
969
1013
}
970
-
971
- impl <' e, E > From <[ Option <E >; $len] > for EventList where E : Into <Event > {
972
- fn from( events: [ Option <E >; $len] ) -> EventList {
1014
+ )
1015
+ ) ;
1016
+
1017
+ // Due to a fix to coherence rules
1018
+ // (https://github.com/rust-lang/rust/pull/46192) we must manually implement
1019
+ // this for each event type.
1020
+ macro_rules! from_event_option_ref_array_into_event_list(
1021
+ ( $e: ty, $len: expr) => (
1022
+ impl <' e, ' f> From <[ & ' f Option <$e>; $len] > for EventList where ' e: ' f {
1023
+ fn from( events: [ & ' f Option <$e>; $len] ) -> EventList {
973
1024
let mut el = EventList :: with_capacity( events. len( ) ) ;
974
1025
for idx in 0 ..events. len( ) {
975
1026
let event_opt = unsafe { ptr:: read( events. get_unchecked( idx) ) } ;
976
- if let Some ( event) = event_opt { el. push( event. into( ) ) ; }
1027
+ if let Some ( ref event) = * event_opt { el. push:: < Event > ( event. clone ( ) . into( ) ) ; }
977
1028
}
978
1029
mem:: forget( events) ;
979
1030
el
980
1031
}
981
1032
}
1033
+ )
1034
+ ) ;
982
1035
983
- impl <' e, E > From <[ Option <& ' e E >; $len] > for EventList where E : Into <Event > + Clone {
984
- fn from( events: [ Option <& E >; $len] ) -> EventList {
1036
+ macro_rules! impl_event_list_from_arrays {
1037
+ ( $( $len: expr ) ,* ) => ( $(
1038
+ impl <' e, E > From <[ E ; $len] > for EventList where E : Into <Event > {
1039
+ fn from( events: [ E ; $len] ) -> EventList {
985
1040
let mut el = EventList :: with_capacity( events. len( ) ) ;
986
1041
for idx in 0 ..events. len( ) {
987
- let event_opt = unsafe { ptr:: read( events. get_unchecked( idx) ) } ;
988
- if let Some ( event ) = event_opt { el. push( event. clone ( ) . into( ) ) ; }
1042
+ let event = unsafe { ptr:: read( events. get_unchecked( idx) ) } ;
1043
+ el. push( event. into( ) ) ;
989
1044
}
1045
+ // Ownership has been unsafely transfered to the new event
1046
+ // list without modifying the event reference count. Not
1047
+ // forgetting the source array would cause a double drop.
990
1048
mem:: forget( events) ;
991
1049
el
992
1050
}
993
1051
}
994
1052
995
- impl <' e, ' f, E > From <[ & ' f Option <E >; $len] > for EventList where ' e: ' f, E : Into <Event > + Clone {
996
- fn from( events: [ & ' f Option <E >; $len] ) -> EventList {
1053
+ from_event_option_array_into_event_list!( EventCore , $len) ;
1054
+ from_event_option_array_into_event_list!( Event , $len) ;
1055
+
1056
+ impl <' e, E > From <[ Option <& ' e E >; $len] > for EventList where E : Into <Event > + Clone {
1057
+ fn from( events: [ Option <& E >; $len] ) -> EventList {
997
1058
let mut el = EventList :: with_capacity( events. len( ) ) ;
998
1059
for idx in 0 ..events. len( ) {
999
1060
let event_opt = unsafe { ptr:: read( events. get_unchecked( idx) ) } ;
1000
- if let Some ( ref event) = * event_opt { el. push( event. clone( ) . into( ) ) ; }
1061
+ if let Some ( event) = event_opt { el. push( event. clone( ) . into( ) ) ; }
1001
1062
}
1002
1063
mem:: forget( events) ;
1003
1064
el
1004
1065
}
1005
1066
}
1006
1067
1068
+ from_event_option_ref_array_into_event_list!( EventCore , $len) ;
1069
+ from_event_option_ref_array_into_event_list!( Event , $len) ;
1070
+
1007
1071
impl <' e, ' f, E > From <[ & ' f Option <& ' e E >; $len] > for EventList where ' e: ' f, E : Into <Event > + Clone {
1008
1072
fn from( events: [ & ' f Option <& ' e E >; $len] ) -> EventList {
1009
1073
let mut el = EventList :: with_capacity( events. len( ) ) ;
0 commit comments