Hello.
I'm currently writing a library that generalizes all ranges and adds a "range set".
Core/Std compatibility is a must and I want to make the crate "feel" as if it would already be part of them. This, of course, requires From implementations for all range types for my GenericRange<T>.
All cases, for example Range<T> are trivial:
impl<T> From<Range<T>> for GenericRange<T>
where
T: PartialOrd,
{
fn from(range: Range<T>) -> Self {
Self::closed_open(range.start, range.end)
}
}
(note: this requires PartialOrd, because upon converting I assert, that start <= end to optimize other code that depends on this requirement)
The problem I'm facing now is that I want to keep clones at a minimum, but RangeInclusive<T> forces me to commit this atrocity:
impl<T> From<RangeInclusive<T>> for GenericRange<T>
where
T: Clone + PartialOrd,
{
/// This requires `Clone` because for some reason the internal fields of `RangeInclusive` are
/// only `pub(crate)` even though they could be `pub` and so we're forced to use the results of
/// `RangeBounds`, which only return borrowed values.
fn from(range: RangeInclusive<T>) -> Self {
Self::closed(range.start().clone(), range.end().clone())
}
}
As mentioned in the doc comment and in the title of this issue, RangeInclusive<T> has pub(crate) fields, which prohibits other users, like me, to correctly take the fields without copying.
The crate is forbid(unsafe_code) and #![no_std] and I have thus no other way to implement From other than cloning the RangeBounds trait results.
If there is a reason for this I'm sorry for opening an issue - but I don't see one.
Thanks for taking the time to look at this!
Hello.
I'm currently writing a library that generalizes all ranges and adds a "range set".
Core/Stdcompatibility is a must and I want to make the crate "feel" as if it would already be part of them. This, of course, requiresFromimplementations for all range types for myGenericRange<T>.All cases, for example
Range<T>are trivial:(note: this requires
PartialOrd, because upon converting I assert, thatstart <= endto optimize other code that depends on this requirement)The problem I'm facing now is that I want to keep clones at a minimum, but
RangeInclusive<T>forces me to commit this atrocity:As mentioned in the doc comment and in the title of this issue,
RangeInclusive<T>haspub(crate)fields, which prohibits other users, like me, to correctly take the fields without copying.The crate is
forbid(unsafe_code)and#![no_std]and I have thus no other way to implementFromother than cloning theRangeBoundstrait results.If there is a reason for this I'm sorry for opening an issue - but I don't see one.
Thanks for taking the time to look at this!