summaryrefslogtreecommitdiffstats
path: root/third_party/rust/image/src/traits.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/image/src/traits.rs')
-rw-r--r--third_party/rust/image/src/traits.rs75
1 files changed, 75 insertions, 0 deletions
diff --git a/third_party/rust/image/src/traits.rs b/third_party/rust/image/src/traits.rs
new file mode 100644
index 0000000000..6e558d4a13
--- /dev/null
+++ b/third_party/rust/image/src/traits.rs
@@ -0,0 +1,75 @@
+//! This module provides useful traits that were deprecated in rust
+
+// Note copied from the stdlib under MIT license
+
+use num_traits::{Bounded, Num, NumCast};
+use std::ops::AddAssign;
+
+/// Types which are safe to treat as an immutable byte slice in a pixel layout
+/// for image encoding.
+pub trait EncodableLayout: seals::EncodableLayout {
+ /// Get the bytes of this value.
+ fn as_bytes(&self) -> &[u8];
+}
+
+impl EncodableLayout for [u8] {
+ fn as_bytes(&self) -> &[u8] {
+ bytemuck::cast_slice(self)
+ }
+}
+
+impl EncodableLayout for [u16] {
+ fn as_bytes(&self) -> &[u8] {
+ bytemuck::cast_slice(self)
+ }
+}
+
+/// Primitive trait from old stdlib
+pub trait Primitive: Copy + NumCast + Num + PartialOrd<Self> + Clone + Bounded {}
+
+impl Primitive for usize {}
+impl Primitive for u8 {}
+impl Primitive for u16 {}
+impl Primitive for u32 {}
+impl Primitive for u64 {}
+impl Primitive for isize {}
+impl Primitive for i8 {}
+impl Primitive for i16 {}
+impl Primitive for i32 {}
+impl Primitive for i64 {}
+impl Primitive for f32 {}
+impl Primitive for f64 {}
+
+/// An Enlargable::Larger value should be enough to calculate
+/// the sum (average) of a few hundred or thousand Enlargeable values.
+pub trait Enlargeable: Sized + Bounded + NumCast {
+ type Larger: Primitive + AddAssign + 'static;
+
+ fn clamp_from(n: Self::Larger) -> Self {
+ // Note: Only unsigned value types supported.
+ if n > NumCast::from(Self::max_value()).unwrap() {
+ Self::max_value()
+ } else {
+ NumCast::from(n).unwrap()
+ }
+ }
+}
+
+impl Enlargeable for u8 {
+ type Larger = u32;
+}
+impl Enlargeable for u16 {
+ type Larger = u32;
+}
+impl Enlargeable for u32 {
+ type Larger = u64;
+}
+
+
+/// Private module for supertraits of sealed traits.
+mod seals {
+ pub trait EncodableLayout {}
+
+ impl EncodableLayout for [u8] {}
+ impl EncodableLayout for [u16] {}
+}