fast image operations
Diffstat (limited to 'src/span.rs')
-rw-r--r--src/span.rs34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/span.rs b/src/span.rs
new file mode 100644
index 0000000..7ac76c9
--- /dev/null
+++ b/src/span.rs
@@ -0,0 +1,34 @@
+use crate::At;
+use std::ops::Range;
+
+mod sealer {
+ #[doc(hidden)]
+ pub trait Sealed {}
+}
+use sealer::Sealed;
+
+/// Trait for that which can be used to index a image.
+pub trait Span: Sealed {
+ #[doc(hidden)]
+ fn range<const C: usize>(self, i: (u32, u32)) -> Range<usize>;
+}
+
+impl Sealed for Range<usize> {}
+impl Span for Range<usize> {
+ #[inline(always)]
+ fn range<const C: usize>(self, _: (u32, u32)) -> Range<usize> {
+ self
+ }
+}
+
+impl Sealed for Range<(u32, u32)> {}
+impl Span for Range<(u32, u32)> {
+ #[inline(always)]
+ fn range<const C: usize>(self, i: (u32, u32)) -> Range<usize> {
+ let Self {
+ start: (sx, sy),
+ end: (ex, ey),
+ } = self;
+ i.at::<C>(sx, sy)..i.at::<C>(ex, ey)
+ }
+}