Skip to content

Commit 2d79ba0

Browse files
Merge pull request #11 from rodrimati1992/1_9
1.9.0 release
2 parents 3195ff8 + e703910 commit 2d79ba0

19 files changed

+285
-171
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "typewit"
3-
version = "1.8.0"
3+
version = "1.9.0"
44
authors = ["rodrimati1992 <rodrimatt1985@gmail.com>"]
55
rust-version = "1.57.0"
66
edition = "2021"

Changelog.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ This is the changelog, summarising changes in each version(some minor changes ma
22

33
# 1.0
44

5+
### 1.9.0
6+
7+
Deprecated `{TypeCmp, TypeNe}::with_any` due to unsoundness: both constructors rely on `TypeId::of::<L>() != TypeId::of::<R>()` implying `L != R`, which is not true in the general case.
8+
59
### 1.8.0
610

711
Added `"rust_1_65"` feature

src/methods/zipping_.rs

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -297,10 +297,14 @@ declare_zip_items!{
297297
/// This example shows all permutations of argument and return types.
298298
///
299299
/// ```rust
300-
/// use typewit::{TypeCmp, TypeEq, TypeNe};
300+
/// use typewit::{TypeCmp, TypeEq, TypeNe, type_ne};
301301
/// use typewit::methods::zip2;
302302
///
303-
/// with::<u8, u8, bool, u16, u32>(TypeEq::NEW, TypeNe::with_any().unwrap(), TypeCmp::with_any());
303+
/// with::<u8, u8, bool, u16, u32>(
304+
/// TypeEq::NEW,
305+
/// type_ne!(u8, bool),
306+
/// TypeCmp::Ne(type_ne!(u16, u32)),
307+
/// );
304308
///
305309
/// const fn with<A, B, C, D, E>(eq: TypeEq<A, B>, ne: TypeNe<B, C>, cmp: TypeCmp<D, E>) {
306310
/// let _: TypeEq<(A, B), (B, A)> = zip2(eq, eq.flip());
@@ -346,10 +350,14 @@ declare_zip_items!{
346350
/// This example shows basic usage.
347351
///
348352
/// ```rust
349-
/// use typewit::{TypeCmp, TypeEq, TypeNe, type_eq};
353+
/// use typewit::{TypeCmp, TypeEq, TypeNe, type_eq, type_ne};
350354
/// use typewit::methods::zip3;
351355
///
352-
/// with::<u8, u8, bool, u16, u32>(TypeEq::NEW, TypeNe::with_any().unwrap(), TypeCmp::with_any());
356+
/// with::<u8, u8, bool, u16, u32>(
357+
/// TypeEq::NEW,
358+
/// type_ne!(u8, bool),
359+
/// TypeCmp::Ne(type_ne!(u16, u32)),
360+
/// );
353361
///
354362
/// const fn with<A, B, C, D, E>(eq: TypeEq<A, B>, ne: TypeNe<B, C>, cmp: TypeCmp<D, E>) {
355363
/// let _: TypeEq<(A, B, i64), (B, A, i64)> = zip3(eq, eq.flip(), type_eq::<i64>());
@@ -391,10 +399,14 @@ declare_zip_items!{
391399
/// This example shows basic usage.
392400
///
393401
/// ```rust
394-
/// use typewit::{TypeCmp, TypeEq, TypeNe, type_eq};
402+
/// use typewit::{TypeCmp, TypeEq, TypeNe, type_eq, type_ne};
395403
/// use typewit::methods::zip4;
396404
///
397-
/// with::<u8, u8, bool, u16, u32>(TypeEq::NEW, TypeNe::with_any().unwrap(), TypeCmp::with_any());
405+
/// with::<u8, u8, bool, u16, u32>(
406+
/// TypeEq::NEW,
407+
/// type_ne!(u8, bool),
408+
/// TypeCmp::Ne(type_ne!(u16, u32)),
409+
/// );
398410
///
399411
/// const fn with<A, B, C, D, E>(eq: TypeEq<A, B>, ne: TypeNe<B, C>, cmp: TypeCmp<D, E>) {
400412
/// let _: TypeEq<(A, u64, B, i64), (B, u64, A, i64)> =
@@ -458,11 +470,12 @@ mod with_const_marker {
458470
/// methods::in_array,
459471
/// const_marker::Usize,
460472
/// TypeCmp, TypeEq, TypeNe,
473+
/// type_ne,
461474
/// };
462475
///
463476
/// let eq_ty: TypeEq<i16, i16> = TypeEq::NEW;
464-
/// let ne_ty: TypeNe<i16, u16> = TypeNe::with_any().unwrap();
465-
/// let cmp_ty: TypeCmp<i16, u16> = TypeCmp::with_any();
477+
/// let ne_ty: TypeNe<i16, u16> = type_ne!(i16, u16);
478+
/// let cmp_ty: TypeCmp<i16, u16> = TypeCmp::Ne(type_ne!(i16, u16));
466479
///
467480
/// let eq_len: TypeEq<Usize<0>, Usize<0>> = TypeEq::NEW;
468481
/// let ne_len: TypeNe<Usize<1>, Usize<2>> = Usize.equals(Usize).unwrap_ne();

src/type_cmp.rs

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,16 @@ impl<L: ?Sized, R: ?Sized> TypeCmp<L, R> {
101101
/// let ne = TypeCmp::<u8, i8>::with_any();
102102
/// assert!(matches!(ne, TypeCmp::Ne(_)));
103103
/// ```
104+
#[deprecated = concat!(
105+
"fallout of `https://github.com/rust-lang/rust/issues/97156`,",
106+
"`TypeId::of::<L>() != TypeId::of::<R>()` does not imply `L != R`"
107+
)]
104108
pub fn with_any() -> Self
105109
where
106110
L: Sized + Any,
107111
R: Sized + Any,
108112
{
113+
#[allow(deprecated)]
109114
if let Some(equal) = TypeEq::with_any() {
110115
TypeCmp::Eq(equal)
111116
} else if let Some(unequal) = TypeNe::with_any() {
@@ -179,12 +184,12 @@ impl<L: ?Sized, R: ?Sized> TypeCmp<L, R> {
179184
/// # Example
180185
///
181186
/// ```rust
182-
/// use typewit::{TypeCmp, TypeEq, TypeNe};
187+
/// use typewit::{TypeCmp, TypeEq, type_ne};
183188
///
184-
/// let eq: TypeCmp<u8, u8> = TypeCmp::with_any();
189+
/// let eq: TypeCmp<u8, u8> = TypeCmp::Eq(TypeEq::NEW);
185190
/// assert!(matches!(eq.eq(), Some(TypeEq::<u8, u8>{..})));
186191
///
187-
/// let ne = TypeCmp::<u8, i8>::with_any();
192+
/// let ne = TypeCmp::Ne(type_ne!(u8, i8));
188193
/// assert!(matches!(ne.eq(), None::<TypeEq<u8, i8>>));
189194
/// ```
190195
pub const fn eq(self) -> Option<TypeEq<L, R>> {
@@ -199,12 +204,12 @@ impl<L: ?Sized, R: ?Sized> TypeCmp<L, R> {
199204
/// # Example
200205
///
201206
/// ```rust
202-
/// use typewit::{TypeCmp, TypeEq, TypeNe};
207+
/// use typewit::{TypeCmp, TypeEq, TypeNe, type_ne};
203208
///
204-
/// let eq: TypeCmp<u8, u8> = TypeCmp::with_any();
209+
/// let eq: TypeCmp<u8, u8> = TypeCmp::Eq(TypeEq::NEW);
205210
/// assert!(matches!(eq.ne(), None::<TypeNe<u8, u8>>));
206211
///
207-
/// let ne = TypeCmp::<u8, i8>::with_any();
212+
/// let ne = TypeCmp::Ne(type_ne!(u8, i8));
208213
/// assert!(matches!(ne.ne(), Some(TypeNe::<u8, i8>{..})));
209214
/// ```
210215
pub const fn ne(self) -> Option<TypeNe<L, R>> {
@@ -259,7 +264,7 @@ impl<L: ?Sized, R: ?Sized> TypeCmp<L, R> {
259264
/// ```rust
260265
/// use typewit::{TypeCmp, TypeEq};
261266
///
262-
/// let eq: TypeCmp<u8, u8> = TypeCmp::with_any();
267+
/// let eq: TypeCmp<u8, u8> = TypeCmp::Eq(TypeEq::NEW);
263268
/// assert!(matches!(eq.unwrap_eq(), TypeEq::<u8, u8>{..}));
264269
/// ```
265270
#[track_caller]
@@ -279,9 +284,9 @@ impl<L: ?Sized, R: ?Sized> TypeCmp<L, R> {
279284
/// # Example
280285
///
281286
/// ```rust
282-
/// use typewit::{TypeCmp, TypeNe};
287+
/// use typewit::{TypeCmp, TypeNe, type_ne};
283288
///
284-
/// let ne = TypeCmp::<u8, i8>::with_any();
289+
/// let ne = TypeCmp::Ne(type_ne!(u8, i8));
285290
/// assert!(matches!(ne.unwrap_ne(), TypeNe::<u8, i8>{..}));
286291
/// ```
287292
#[track_caller]

src/type_cmp/extra_type_cmp_methods.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -280,10 +280,11 @@ impl<L, R> TypeCmp<L, R> {
280280
/// use typewit::{
281281
/// const_marker::Usize,
282282
/// TypeCmp, TypeEq, TypeNe,
283+
/// type_ne,
283284
/// };
284285
///
285-
/// let cmp_eq_ty: TypeCmp<i32, i32> = TypeCmp::with_any();
286-
/// let cmp_ne_ty: TypeCmp<i64, u64> = TypeCmp::with_any();
286+
/// let cmp_eq_ty: TypeCmp<i32, i32> = TypeCmp::Eq(TypeEq::NEW);
287+
/// let cmp_ne_ty: TypeCmp<i64, u64> = TypeCmp::Ne(type_ne!(i64, u64));
287288
///
288289
/// let eq_len: TypeEq<Usize<0>, Usize<0>> = TypeEq::NEW;
289290
/// let ne_len: TypeNe<Usize<1>, Usize<2>> = Usize.equals(Usize).unwrap_ne();

src/type_eq.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -356,11 +356,11 @@ mod type_eq_ {
356356
///
357357
///
358358
/// fn sum_u32s<T: Clone + Any>(foo: &[T]) -> Option<u32> {
359-
/// downcast_slice::<T, u32>(foo)
359+
/// typecast_slice::<T, u32>(foo)
360360
/// .map(|foo: &[u32]| foo.iter().copied().sum())
361361
/// }
362362
///
363-
/// fn downcast_slice<T: Any, U: Any>(foo: &[T]) -> Option<&[U]> {
363+
/// fn typecast_slice<T: Any, U: Any>(foo: &[T]) -> Option<&[U]> {
364364
/// struct SliceFn;
365365
/// impl<T> typewit::TypeFn<T> for SliceFn {
366366
/// type Output = [T];

src/type_ne_.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,13 +160,17 @@ impl<L: ?Sized, R: ?Sized> TypeNe<L, R> {
160160
/// assert!(TypeNe::<u8, u8>::with_any().is_none());
161161
///
162162
/// ```
163+
#[deprecated = concat!(
164+
"fallout of `https://github.com/rust-lang/rust/issues/97156`,",
165+
"`TypeId::of::<L>() != TypeId::of::<R>()` does not imply `L != R`"
166+
)]
163167
pub fn with_any() -> Option<Self>
164168
where
165169
L: Sized + Any,
166170
R: Sized + Any,
167171
{
168172
if TypeId::of::<L>() != TypeId::of::<R>() {
169-
// SAFETY: the two TypeIds compare unequal, so L != R
173+
// SAFETY: unsound for the deprecated reason
170174
unsafe { Some(TypeNe::new_unchecked()) }
171175
} else {
172176
None

tests/misc_tests/generic_fns_tests.rs

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use typewit::{
33
TypeCmp,
44
TypeEq,
55
TypeNe,
6-
type_eq,
6+
type_eq, type_ne,
77
};
88

99
use crate::misc_tests::test_utils::assertm;
@@ -50,9 +50,9 @@ fn zip2_test() {
5050

5151
constness::<u8, u8, bool, u32, u32, u64>(
5252
TypeEq::NEW,
53-
TypeNe::with_any().unwrap(),
54-
TypeCmp::with_any(),
55-
TypeCmp::with_any(),
53+
type_ne!(u8, bool),
54+
TypeCmp::Eq(TypeEq::NEW),
55+
TypeCmp::Ne(type_ne!(u32, u64)),
5656
);
5757
}
5858

@@ -101,9 +101,9 @@ fn zip3_test() {
101101
constness::<u8, u8, u8, bool, u32, u32, u64>(
102102
TypeEq::NEW,
103103
TypeEq::NEW,
104-
TypeNe::with_any().unwrap(),
105-
TypeCmp::with_any(),
106-
TypeCmp::with_any(),
104+
type_ne!(u8, bool),
105+
TypeCmp::Eq(TypeEq::NEW),
106+
TypeCmp::Ne(type_ne!(u32, u64)),
107107
);
108108
}
109109

@@ -117,7 +117,11 @@ fn test_zip4() {
117117
let _: TypeCmp<(D, A, B, A), (E, B, A, B)> = zip4(cmp, eq, eq.flip(), eq);
118118
}
119119

120-
with::<u8, u8, bool, u16, u32>(TypeEq::NEW, TypeNe::with_any().unwrap(), TypeCmp::with_any());
120+
with::<u8, u8, bool, u16, u32>(
121+
TypeEq::NEW,
122+
type_ne!(u8, bool),
123+
TypeCmp::Ne(type_ne!(u16, u32)),
124+
);
121125
}
122126

123127
#[test]
@@ -128,8 +132,8 @@ fn test_in_array() {
128132
};
129133

130134
let eq_ty: TypeEq<i16, i16> = TypeEq::NEW;
131-
let ne_ty: TypeNe<i16, u16> = TypeNe::with_any().unwrap();
132-
let cmp_ty: TypeCmp<i16, u16> = TypeCmp::with_any();
135+
let ne_ty: TypeNe<i16, u16> = type_ne!(i16, u16);
136+
let cmp_ty: TypeCmp<i16, u16> = TypeCmp::Ne(type_ne!(i16, u16));
133137

134138
let eq_len: TypeEq<Usize<0>, Usize<0>> = TypeEq::NEW;
135139
let ne_len: TypeNe<Usize<1>, Usize<2>> = Usize.equals(Usize).unwrap_ne();

0 commit comments

Comments
 (0)