diff --git a/src/lib.rs b/src/lib.rs index 4758e11..e7fe863 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -53,9 +53,10 @@ use serde::{Serialize, Deserialize, Serializer, Deserializer}; mod array; mod array_string; +mod range; pub use array::Array; -pub use odds::IndexRange as RangeArgument; +pub use range::RangeArgument; use array::Index; pub use array_string::ArrayString; diff --git a/src/range.rs b/src/range.rs new file mode 100644 index 0000000..f90f5af --- /dev/null +++ b/src/range.rs @@ -0,0 +1,42 @@ + +use std::ops::{ + RangeFull, + RangeFrom, + RangeTo, + Range, +}; + +/// `RangeArgument` is implemented by Rust's built-in range types, produced +/// by range syntax like `..`, `a..`, `..b` or `c..d`. +/// +/// Note: This is arrayvec's provisional trait, waiting for stable Rust to +/// provide an equivalent. +pub trait RangeArgument { + #[inline] + /// Start index (inclusive) + fn start(&self) -> Option { None } + #[inline] + /// End index (exclusive) + fn end(&self) -> Option { None } +} + + +impl RangeArgument for RangeFull {} + +impl RangeArgument for RangeFrom { + #[inline] + fn start(&self) -> Option { Some(self.start) } +} + +impl RangeArgument for RangeTo { + #[inline] + fn end(&self) -> Option { Some(self.end) } +} + +impl RangeArgument for Range { + #[inline] + fn start(&self) -> Option { Some(self.start) } + #[inline] + fn end(&self) -> Option { Some(self.end) } +} +