From 79ccdcd910cfc835655f55e732ff1a7ce4793237 Mon Sep 17 00:00:00 2001 From: bluss Date: Sun, 30 Jul 2017 13:00:53 +0200 Subject: [PATCH] FEAT: Copy RangeArgument from crate odds This means odds is no longer a public dependency, which simplifies the version story for arrayvec --- src/lib.rs | 3 ++- src/range.rs | 42 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 src/range.rs 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) } +} +