@@ -12,6 +12,60 @@ use crate::fmt::Debug;
12
12
use crate :: hash:: Hash ;
13
13
use crate :: hash:: Hasher ;
14
14
15
+ /// Implements a given marker trait for multiple types at the same time.
16
+ ///
17
+ /// The basic syntax looks like this:
18
+ /// ```ignore private macro
19
+ /// marker_impls! { MarkerTrait for u8, i8 }
20
+ /// ```
21
+ /// You can also implement `unsafe` traits
22
+ /// ```ignore private macro
23
+ /// marker_impls! { unsafe MarkerTrait for u8, i8 }
24
+ /// ```
25
+ /// Add attributes to all impls:
26
+ /// ```ignore private macro
27
+ /// marker_impls! {
28
+ /// #[allow(lint)]
29
+ /// #[unstable(feature = "marker_trait", issue = "none")]
30
+ /// MarkerTrait for u8, i8
31
+ /// }
32
+ /// ```
33
+ /// And use generics:
34
+ /// ```ignore private macro
35
+ /// marker_impls! {
36
+ /// MarkerTrait for
37
+ /// u8, i8,
38
+ /// {T: ?Sized} *const T,
39
+ /// {T: ?Sized} *mut T,
40
+ /// {T: MarkerTrait} PhantomData<T>,
41
+ /// u32,
42
+ /// }
43
+ /// ```
44
+ #[ unstable( feature = "internal_impls_macro" , issue = "none" ) ]
45
+ macro marker_impls {
46
+ ( $( #[ $( $meta: tt) * ] ) * $Trait: ident for $( $( { $( $bounds: tt) * } ) ? $T: ty ) , + $( , ) ?) => {
47
+ // This inner macro is needed because... idk macros are weird.
48
+ // It allows repeating `meta` on all impls.
49
+ #[ unstable( feature = "internal_impls_macro" , issue = "none" ) ]
50
+ macro _impl {
51
+ ( $$( { $$( $$bounds_: tt) * } ) ? $$T_: ty ) => {
52
+ $( #[ $( $meta) * ] ) * impl<$$( $$( $$bounds_) * ) ?> $Trait for $$T_ { }
53
+ }
54
+ }
55
+ $( _impl ! { $( { $( $bounds) * } ) ? $T } ) +
56
+ } ,
57
+ ( $( #[ $( $meta: tt) * ] ) * unsafe $Trait: ident for $( $( { $( $bounds: tt) * } ) ? $T: ty ) , + $( , ) ?) => {
58
+ #[ unstable( feature = "internal_impls_macro" , issue = "none" ) ]
59
+ macro _impl {
60
+ ( $$( { $$( $$bounds_: tt) * } ) ? $$T_: ty ) => {
61
+ $( #[ $( $meta) * ] ) * unsafe impl <$$( $$( $$bounds_) * ) ?> $Trait for $$T_ { }
62
+ }
63
+ }
64
+
65
+ $( _impl ! { $( { $( $bounds) * } ) ? $T } ) +
66
+ } ,
67
+ }
68
+
15
69
/// Types that can be transferred across thread boundaries.
16
70
///
17
71
/// This trait is automatically implemented when the compiler determines it's
@@ -214,34 +268,14 @@ pub trait StructuralEq {
214
268
// Empty.
215
269
}
216
270
217
- #[ unstable( feature = "structural_match" , issue = "31434" ) ]
218
- impl StructuralEq for usize { }
219
- #[ unstable( feature = "structural_match" , issue = "31434" ) ]
220
- impl StructuralEq for u8 { }
221
- #[ unstable( feature = "structural_match" , issue = "31434" ) ]
222
- impl StructuralEq for u16 { }
223
- #[ unstable( feature = "structural_match" , issue = "31434" ) ]
224
- impl StructuralEq for u32 { }
225
- #[ unstable( feature = "structural_match" , issue = "31434" ) ]
226
- impl StructuralEq for u64 { }
227
- #[ unstable( feature = "structural_match" , issue = "31434" ) ]
228
- impl StructuralEq for u128 { }
229
- #[ unstable( feature = "structural_match" , issue = "31434" ) ]
230
- impl StructuralEq for isize { }
231
- #[ unstable( feature = "structural_match" , issue = "31434" ) ]
232
- impl StructuralEq for i8 { }
233
- #[ unstable( feature = "structural_match" , issue = "31434" ) ]
234
- impl StructuralEq for i16 { }
235
- #[ unstable( feature = "structural_match" , issue = "31434" ) ]
236
- impl StructuralEq for i32 { }
237
- #[ unstable( feature = "structural_match" , issue = "31434" ) ]
238
- impl StructuralEq for i64 { }
239
- #[ unstable( feature = "structural_match" , issue = "31434" ) ]
240
- impl StructuralEq for i128 { }
241
- #[ unstable( feature = "structural_match" , issue = "31434" ) ]
242
- impl StructuralEq for bool { }
243
- #[ unstable( feature = "structural_match" , issue = "31434" ) ]
244
- impl StructuralEq for char { }
271
+ marker_impls ! {
272
+ #[ unstable( feature = "structural_match" , issue = "31434" ) ]
273
+ StructuralEq for
274
+ usize , u8 , u16 , u32 , u64 , u128 ,
275
+ isize , i8 , i16 , i32 , i64 , i128 ,
276
+ bool ,
277
+ char ,
278
+ }
245
279
246
280
/// Types whose values can be duplicated simply by copying bits.
247
281
///
@@ -430,6 +464,30 @@ pub macro Copy($item:item) {
430
464
/* compiler built-in */
431
465
}
432
466
467
+ // Implementations of `Copy` for primitive types.
468
+ //
469
+ // Implementations that cannot be described in Rust
470
+ // are implemented in `traits::SelectionContext::copy_clone_conditions()`
471
+ // in `rustc_trait_selection`.
472
+ marker_impls ! {
473
+ #[ stable( feature = "rust1" , since = "1.0.0" ) ]
474
+ Copy for
475
+ usize , u8 , u16 , u32 , u64 , u128 ,
476
+ isize , i8 , i16 , i32 , i64 , i128 ,
477
+ f32 , f64 ,
478
+ bool , char ,
479
+ { T : ?Sized } * const T ,
480
+ { T : ?Sized } * mut T ,
481
+
482
+ }
483
+
484
+ #[ unstable( feature = "never_type" , issue = "35121" ) ]
485
+ impl Copy for ! { }
486
+
487
+ /// Shared references can be copied, but mutable references *cannot*!
488
+ #[ stable( feature = "rust1" , since = "1.0.0" ) ]
489
+ impl < T : ?Sized > Copy for & T { }
490
+
433
491
/// Types for which it is safe to share references between threads.
434
492
///
435
493
/// This trait is automatically implemented when the compiler determines
@@ -802,11 +860,14 @@ pub trait DiscriminantKind {
802
860
pub ( crate ) unsafe auto trait Freeze { }
803
861
804
862
impl < T : ?Sized > !Freeze for UnsafeCell < T > { }
805
- unsafe impl < T : ?Sized > Freeze for PhantomData < T > { }
806
- unsafe impl < T : ?Sized > Freeze for * const T { }
807
- unsafe impl < T : ?Sized > Freeze for * mut T { }
808
- unsafe impl < T : ?Sized > Freeze for & T { }
809
- unsafe impl < T : ?Sized > Freeze for & mut T { }
863
+ marker_impls ! {
864
+ unsafe Freeze for
865
+ { T : ?Sized } PhantomData <T >,
866
+ { T : ?Sized } * const T ,
867
+ { T : ?Sized } * mut T ,
868
+ { T : ?Sized } & T ,
869
+ { T : ?Sized } & mut T ,
870
+ }
810
871
811
872
/// Types that can be safely moved after being pinned.
812
873
///
@@ -867,17 +928,19 @@ pub struct PhantomPinned;
867
928
#[ stable( feature = "pin" , since = "1.33.0" ) ]
868
929
impl !Unpin for PhantomPinned { }
869
930
870
- #[ stable( feature = "pin" , since = "1.33.0" ) ]
871
- impl < ' a , T : ?Sized + ' a > Unpin for & ' a T { }
872
-
873
- #[ stable( feature = "pin" , since = "1.33.0" ) ]
874
- impl < ' a , T : ?Sized + ' a > Unpin for & ' a mut T { }
875
-
876
- #[ stable( feature = "pin_raw" , since = "1.38.0" ) ]
877
- impl < T : ?Sized > Unpin for * const T { }
931
+ marker_impls ! {
932
+ #[ stable( feature = "pin" , since = "1.33.0" ) ]
933
+ Unpin for
934
+ { T : ?Sized } & T ,
935
+ { T : ?Sized } & mut T ,
936
+ }
878
937
879
- #[ stable( feature = "pin_raw" , since = "1.38.0" ) ]
880
- impl < T : ?Sized > Unpin for * mut T { }
938
+ marker_impls ! {
939
+ #[ stable( feature = "pin_raw" , since = "1.38.0" ) ]
940
+ Unpin for
941
+ { T : ?Sized } * const T ,
942
+ { T : ?Sized } * mut T ,
943
+ }
881
944
882
945
/// A marker for types that can be dropped.
883
946
///
@@ -917,72 +980,14 @@ pub trait PointerLike {}
917
980
#[ unstable( feature = "adt_const_params" , issue = "95174" ) ]
918
981
#[ rustc_on_unimplemented( message = "`{Self}` can't be used as a const parameter type" ) ]
919
982
pub trait ConstParamTy : StructuralEq { }
920
- #[ unstable( feature = "adt_const_params" , issue = "95174" ) ]
921
- impl ConstParamTy for usize { }
922
- #[ unstable( feature = "adt_const_params" , issue = "95174" ) ]
923
- impl ConstParamTy for u8 { }
924
- #[ unstable( feature = "adt_const_params" , issue = "95174" ) ]
925
- impl ConstParamTy for u16 { }
926
- #[ unstable( feature = "adt_const_params" , issue = "95174" ) ]
927
- impl ConstParamTy for u32 { }
928
- #[ unstable( feature = "adt_const_params" , issue = "95174" ) ]
929
- impl ConstParamTy for u64 { }
930
- #[ unstable( feature = "adt_const_params" , issue = "95174" ) ]
931
- impl ConstParamTy for u128 { }
932
- #[ unstable( feature = "adt_const_params" , issue = "95174" ) ]
933
- impl ConstParamTy for isize { }
934
- #[ unstable( feature = "adt_const_params" , issue = "95174" ) ]
935
- impl ConstParamTy for i8 { }
936
- #[ unstable( feature = "adt_const_params" , issue = "95174" ) ]
937
- impl ConstParamTy for i16 { }
938
- #[ unstable( feature = "adt_const_params" , issue = "95174" ) ]
939
- impl ConstParamTy for i32 { }
940
- #[ unstable( feature = "adt_const_params" , issue = "95174" ) ]
941
- impl ConstParamTy for i64 { }
942
- #[ unstable( feature = "adt_const_params" , issue = "95174" ) ]
943
- impl ConstParamTy for i128 { }
944
- #[ unstable( feature = "adt_const_params" , issue = "95174" ) ]
945
- impl ConstParamTy for bool { }
946
- #[ unstable( feature = "adt_const_params" , issue = "95174" ) ]
947
- impl ConstParamTy for char { }
948
-
949
- /// Implementations of `Copy` for primitive types.
950
- ///
951
- /// Implementations that cannot be described in Rust
952
- /// are implemented in `traits::SelectionContext::copy_clone_conditions()`
953
- /// in `rustc_trait_selection`.
954
- mod copy_impls {
955
-
956
- use super :: Copy ;
957
-
958
- macro_rules! impl_copy {
959
- ( $( $t: ty) * ) => {
960
- $(
961
- #[ stable( feature = "rust1" , since = "1.0.0" ) ]
962
- impl Copy for $t { }
963
- ) *
964
- }
965
- }
966
983
967
- impl_copy ! {
968
- usize u8 u16 u32 u64 u128
969
- isize i8 i16 i32 i64 i128
970
- f32 f64
971
- bool char
972
- }
973
-
974
- #[ unstable( feature = "never_type" , issue = "35121" ) ]
975
- impl Copy for ! { }
976
-
977
- #[ stable( feature = "rust1" , since = "1.0.0" ) ]
978
- impl < T : ?Sized > Copy for * const T { }
979
-
980
- #[ stable( feature = "rust1" , since = "1.0.0" ) ]
981
- impl < T : ?Sized > Copy for * mut T { }
982
-
983
- /// Shared references can be copied, but mutable references *cannot*!
984
- #[ stable( feature = "rust1" , since = "1.0.0" ) ]
985
- impl < T : ?Sized > Copy for & T { }
984
+ marker_impls ! {
985
+ #[ unstable( feature = "adt_const_params" , issue = "95174" ) ]
986
+ ConstParamTy for
987
+ usize , u8 , u16 , u32 , u64 , u128 ,
988
+ isize , i8 , i16 , i32 , i64 , i128 ,
989
+ bool ,
990
+ char ,
986
991
}
987
992
988
993
/// A common trait implemented by all function pointers.
0 commit comments