@@ -887,226 +887,161 @@ impl<const N: usize> Clone for String<N> {
887
887
}
888
888
}
889
889
890
- impl < const N : usize > fmt:: Debug for String < N > {
891
- fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
892
- self . as_view ( ) . fmt ( f)
893
- }
894
- }
895
-
896
- impl fmt:: Debug for StringView {
897
- fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
898
- <str as fmt:: Debug >:: fmt ( self , f)
899
- }
900
- }
901
-
902
- impl < const N : usize > fmt:: Display for String < N > {
903
- fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
904
- self . as_view ( ) . fmt ( f)
905
- }
906
- }
907
-
908
- impl fmt:: Display for StringView {
909
- fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
910
- <str as fmt:: Display >:: fmt ( self , f)
911
- }
912
- }
913
-
914
- impl < const N : usize > hash:: Hash for String < N > {
915
- #[ inline]
916
- fn hash < H : hash:: Hasher > ( & self , hasher : & mut H ) {
917
- self . as_view ( ) . hash ( hasher)
918
- }
919
- }
920
-
921
- impl hash:: Hash for StringView {
922
- #[ inline]
923
- fn hash < H : hash:: Hasher > ( & self , hasher : & mut H ) {
924
- <str as hash:: Hash >:: hash ( self , hasher)
925
- }
926
- }
927
-
928
- impl < const N : usize > fmt:: Write for String < N > {
929
- fn write_str ( & mut self , s : & str ) -> Result < ( ) , fmt:: Error > {
930
- self . as_mut_view ( ) . write_str ( s)
931
- }
932
-
933
- fn write_char ( & mut self , c : char ) -> Result < ( ) , fmt:: Error > {
934
- self . as_mut_view ( ) . write_char ( c)
935
- }
936
- }
937
-
938
- impl fmt:: Write for StringView {
939
- fn write_str ( & mut self , s : & str ) -> Result < ( ) , fmt:: Error > {
940
- self . push_str ( s) . map_err ( |_| fmt:: Error )
941
- }
942
-
943
- fn write_char ( & mut self , c : char ) -> Result < ( ) , fmt:: Error > {
944
- self . push ( c) . map_err ( |_| fmt:: Error )
945
- }
946
- }
947
-
948
- impl < const N : usize > ops:: Deref for String < N > {
949
- type Target = str ;
950
-
951
- fn deref ( & self ) -> & str {
952
- self . as_view ( ) . deref ( )
953
- }
954
- }
955
-
956
- impl ops:: Deref for StringView {
957
- type Target = str ;
958
-
959
- fn deref ( & self ) -> & str {
960
- self . as_str ( )
961
- }
962
- }
963
-
964
- impl < const N : usize > ops:: DerefMut for String < N > {
965
- fn deref_mut ( & mut self ) -> & mut str {
966
- self . as_mut_view ( ) . deref_mut ( )
967
- }
968
- }
890
+ macro_rules! imp_traits {
891
+ ( $Ty: ident$( <const $N: ident : usize , const $M: ident : usize >) ?) => {
892
+ // String<N>/StringView == String<N>
893
+ impl <const N : usize , $( const $M: usize ) * > PartialEq <String <N >> for $Ty<$( $M) * >
894
+ {
895
+ #[ inline]
896
+ fn eq( & self , other: & String <N >) -> bool {
897
+ self . as_str( ) . eq( other. as_str( ) )
898
+ }
899
+ }
969
900
970
- impl ops:: DerefMut for StringView {
971
- fn deref_mut ( & mut self ) -> & mut str {
972
- self . as_mut_str ( )
973
- }
974
- }
901
+ // String<N>/StringView == StringView
902
+ impl <$( const $M: usize ) * > PartialEq <StringView > for $Ty<$( $M) * >
903
+ {
904
+ #[ inline]
905
+ fn eq( & self , other: & StringView ) -> bool {
906
+ self . as_str( ) . eq( other. as_str( ) )
907
+ }
908
+ }
975
909
976
- impl < const N : usize > AsRef < str > for String < N > {
977
- #[ inline]
978
- fn as_ref ( & self ) -> & str {
979
- self
980
- }
981
- }
910
+ // String<N>/StringView == str
911
+ impl <$( const $M: usize ) * > PartialEq <str > for $Ty<$( $M) * >
912
+ {
913
+ #[ inline]
914
+ fn eq( & self , other: & str ) -> bool {
915
+ self . as_str( ) . eq( other)
916
+ }
917
+ }
982
918
983
- impl AsRef < str > for StringView {
984
- #[ inline]
985
- fn as_ref ( & self ) -> & str {
986
- self
987
- }
988
- }
919
+ // str == String<N>/StringView
920
+ impl <$( const $M: usize ) * > PartialEq <$Ty<$( $M) * >> for str
921
+ {
922
+ #[ inline]
923
+ fn eq( & self , other: & $Ty<$( $M) * >) -> bool {
924
+ self . eq( other. as_str( ) )
925
+ }
926
+ }
989
927
990
- impl < const N : usize > AsRef < [ u8 ] > for String < N > {
991
- #[ inline]
992
- fn as_ref ( & self ) -> & [ u8 ] {
993
- self . as_view ( ) . as_bytes ( )
994
- }
995
- }
928
+ // &str == String<N>/StringView
929
+ impl <$( const $M: usize ) * > PartialEq <& str > for $Ty<$( $M) * >
930
+ {
931
+ #[ inline]
932
+ fn eq( & self , other: &&str ) -> bool {
933
+ ( * self ) . as_str( ) . eq( * other)
934
+ }
935
+ }
996
936
997
- impl AsRef < [ u8 ] > for StringView {
998
- #[ inline]
999
- fn as_ref ( & self ) -> & [ u8 ] {
1000
- self . as_bytes ( )
1001
- }
1002
- }
937
+ // String<N>/StringView == str
938
+ impl <$( const $M: usize ) * > PartialEq <$Ty<$( $M) * >> for & str
939
+ {
940
+ #[ inline]
941
+ fn eq( & self , other: & $Ty<$( $M) * >) -> bool {
942
+ ( * self ) . eq( other. as_str( ) )
943
+ }
944
+ }
1003
945
1004
- impl < const N1 : usize , const N2 : usize > PartialEq < String < N2 > > for String < N1 > {
1005
- fn eq ( & self , rhs : & String < N2 > ) -> bool {
1006
- str:: eq ( & * * self , & * * rhs)
1007
- }
1008
- }
946
+ impl <$( const $M: usize ) * > Eq for $Ty<$( $M) * > { }
1009
947
1010
- impl PartialEq < StringView > for StringView {
1011
- fn eq ( & self , rhs : & StringView ) -> bool {
1012
- str:: eq ( & * * self , & * * rhs)
1013
- }
1014
- }
948
+ impl <const N : usize , $( const $M: usize ) * > PartialOrd <String <N >> for $Ty<$( $M) * >
949
+ {
950
+ #[ inline]
951
+ fn partial_cmp( & self , other: & String <N >) -> Option <Ordering > {
952
+ Some ( <str as Ord >:: cmp( self , other) )
953
+ }
954
+ }
1015
955
1016
- // String<N> == str
1017
- impl < const N : usize > PartialEq < str > for String < N > {
1018
- #[ inline]
1019
- fn eq ( & self , other : & str ) -> bool {
1020
- str:: eq ( self , other)
1021
- }
1022
- }
956
+ impl <$ ( const $M : usize ) * > PartialOrd < StringView > for $Ty<$ ( $M ) * >
957
+ {
958
+ #[ inline]
959
+ fn partial_cmp ( & self , other: & StringView ) -> Option < Ordering > {
960
+ Some ( < str as Ord > :: cmp ( self , other) )
961
+ }
962
+ }
1023
963
1024
- // StringView == str
1025
- impl PartialEq < str > for StringView {
1026
- #[ inline]
1027
- fn eq ( & self , other : & str ) -> bool {
1028
- str:: eq ( self , other)
1029
- }
1030
- }
964
+ impl <$( const $M: usize ) * > Ord for $Ty<$( $M) * > {
965
+ fn cmp( & self , other: & $Ty<$( $M) * >) -> Ordering {
966
+ <str as Ord >:: cmp( self , other)
967
+ }
968
+ }
1031
969
1032
- // String<N> == &'str
1033
- impl < const N : usize > PartialEq < & str > for String < N > {
1034
- #[ inline]
1035
- fn eq ( & self , other : & & str ) -> bool {
1036
- str:: eq ( self , & other [ .. ] )
1037
- }
1038
- }
970
+ impl <$ ( const $M : usize ) * > fmt :: Debug for $Ty<$ ( $M ) * >
971
+ {
972
+ #[ inline]
973
+ fn fmt ( & self , f : & mut fmt :: Formatter < ' _> ) -> fmt :: Result {
974
+ < str as fmt :: Debug > :: fmt ( self , f )
975
+ }
976
+ }
1039
977
1040
- // StringView == &'str
1041
- impl PartialEq < & str > for StringView {
1042
- #[ inline]
1043
- fn eq ( & self , other : & & str ) -> bool {
1044
- str:: eq ( self , & other [ .. ] )
1045
- }
1046
- }
978
+ impl <$ ( const $M : usize ) * > fmt :: Display for $Ty<$ ( $M ) * >
979
+ {
980
+ #[ inline]
981
+ fn fmt ( & self , f : & mut fmt :: Formatter < ' _> ) -> fmt :: Result {
982
+ < str as fmt :: Display > :: fmt ( self , f )
983
+ }
984
+ }
1047
985
1048
- // str == String<N >
1049
- impl < const N : usize > PartialEq < String < N > > for str {
1050
- #[ inline]
1051
- fn eq ( & self , other : & String < N > ) -> bool {
1052
- str:: eq ( self , & other [ .. ] )
1053
- }
1054
- }
986
+ impl <$ ( const $M : usize ) * > hash :: Hash for $Ty<$ ( $M ) * >
987
+ {
988
+ #[ inline]
989
+ fn hash< H : hash :: Hasher > ( & self , hasher : & mut H ) {
990
+ < str as hash :: Hash > :: hash ( self , hasher )
991
+ }
992
+ }
1055
993
1056
- // str == StringView
1057
- impl PartialEq < StringView > for str {
1058
- #[ inline]
1059
- fn eq ( & self , other : & StringView ) -> bool {
1060
- str:: eq ( self , & other[ ..] )
1061
- }
1062
- }
994
+ impl <$( const $M: usize ) * > fmt:: Write for $Ty<$( $M) * >
995
+ {
996
+ #[ inline]
997
+ fn write_str( & mut self , s: & str ) -> Result <( ) , fmt:: Error > {
998
+ self . push_str( s) . map_err( |_| fmt:: Error )
999
+ }
1063
1000
1064
- // &'str == String<N>
1065
- impl < const N : usize > PartialEq < String < N > > for & str {
1066
- #[ inline]
1067
- fn eq ( & self , other : & String < N > ) -> bool {
1068
- str:: eq ( self , & other[ ..] )
1069
- }
1070
- }
1001
+ #[ inline]
1002
+ fn write_char( & mut self , c: char ) -> Result <( ) , fmt:: Error > {
1003
+ self . push( c) . map_err( |_| fmt:: Error )
1004
+ }
1005
+ }
1071
1006
1072
- // &'str == StringView
1073
- impl PartialEq < StringView > for & str {
1074
- #[ inline]
1075
- fn eq ( & self , other : & StringView ) -> bool {
1076
- str:: eq ( self , & other[ ..] )
1077
- }
1078
- }
1007
+ impl <$( const $M: usize ) * > ops:: Deref for $Ty<$( $M) * >
1008
+ {
1009
+ type Target = str ;
1079
1010
1080
- impl < const N : usize > Eq for String < N > { }
1081
- impl Eq for StringView { }
1011
+ #[ inline]
1012
+ fn deref( & self ) -> & str {
1013
+ self . as_str( )
1014
+ }
1015
+ }
1082
1016
1083
- impl < const N1 : usize , const N2 : usize > PartialOrd < String < N2 > > for String < N1 > {
1084
- #[ inline]
1085
- fn partial_cmp ( & self , other : & String < N2 > ) -> Option < Ordering > {
1086
- Some ( Ord :: cmp ( & * * self , & * * other) )
1087
- }
1088
- }
1017
+ impl <$( const $M: usize ) * > ops:: DerefMut for $Ty<$( $M) * >
1018
+ {
1019
+ #[ inline]
1020
+ fn deref_mut( & mut self ) -> & mut str {
1021
+ self . as_mut_str( )
1022
+ }
1023
+ }
1089
1024
1090
- impl PartialOrd < StringView > for StringView {
1091
- #[ inline]
1092
- fn partial_cmp ( & self , other : & StringView ) -> Option < Ordering > {
1093
- Some ( Ord :: cmp ( & * * self , & * * other) )
1094
- }
1095
- }
1025
+ impl <$( const $M: usize ) * > AsRef <str > for $Ty<$( $M) * >
1026
+ {
1027
+ #[ inline]
1028
+ fn as_ref( & self ) -> & str {
1029
+ self
1030
+ }
1031
+ }
1096
1032
1097
- impl < const N : usize > Ord for String < N > {
1098
- #[ inline]
1099
- fn cmp ( & self , other : & Self ) -> Ordering {
1100
- Ord :: cmp ( & * * self , & * * other)
1101
- }
1033
+ impl <$( const $M: usize ) * > AsRef <[ u8 ] > for $Ty<$( $M) * >
1034
+ {
1035
+ #[ inline]
1036
+ fn as_ref( & self ) -> & [ u8 ] {
1037
+ self . as_bytes( )
1038
+ }
1039
+ }
1040
+ } ;
1102
1041
}
1103
1042
1104
- impl Ord for StringView {
1105
- #[ inline]
1106
- fn cmp ( & self , other : & Self ) -> Ordering {
1107
- Ord :: cmp ( & * * self , & * * other)
1108
- }
1109
- }
1043
+ imp_traits ! ( String <const N : usize , const M : usize >) ;
1044
+ imp_traits ! ( StringView ) ;
1110
1045
1111
1046
/// Equivalent to [`format`](https://doc.rust-lang.org/std/fmt/fn.format.html).
1112
1047
///
0 commit comments