Remove ReverseView and Slice abstractions

This commit is contained in:
David Tolnay 2020-06-05 23:38:41 -07:00
parent b90e1314a6
commit 8d8856dfae
No known key found for this signature in database
GPG Key ID: F9BA143B95FF6D82
3 changed files with 11 additions and 77 deletions

View File

@ -6,7 +6,6 @@
use super::large_powers;
use super::num::*;
use super::slice::*;
use super::small_powers::*;
use crate::lib::{cmp, iter, mem, Vec};
@ -125,7 +124,7 @@ fn u64_to_hi64_2(r0: u64, r1: u64) -> (u64, bool) {
}
/// Trait to export the high 64-bits from a little-endian slice.
trait Hi64<T>: Slice<T> {
trait Hi64<T>: AsRef<[T]> {
/// Get the hi64 bits from a 1-limb slice.
fn hi64_1(&self) -> (u64, bool);
@ -144,7 +143,7 @@ trait Hi64<T>: Slice<T> {
/// High-level exporter to extract the high 64 bits from a little-endian slice.
#[inline]
fn hi64(&self) -> (u64, bool) {
match self.len() {
match self.as_ref().len() {
0 => (0, false),
1 => self.hi64_1(),
2 => self.hi64_2(),
@ -159,27 +158,24 @@ impl Hi64<u32> for [u32] {
#[inline]
fn hi64_1(&self) -> (u64, bool) {
debug_assert!(self.len() == 1);
let rview = self.rview();
let r0 = rview[0].as_u64();
let r0 = self[0].as_u64();
u64_to_hi64_1(r0)
}
#[inline]
fn hi64_2(&self) -> (u64, bool) {
debug_assert!(self.len() == 2);
let rview = self.rview();
let r0 = rview[0].as_u64() << 32;
let r1 = rview[1].as_u64();
let r0 = self[1].as_u64() << 32;
let r1 = self[0].as_u64();
u64_to_hi64_1(r0 | r1)
}
#[inline]
fn hi64_3(&self) -> (u64, bool) {
debug_assert!(self.len() >= 3);
let rview = self.rview();
let r0 = rview[0].as_u64();
let r1 = rview[1].as_u64() << 32;
let r2 = rview[2].as_u64();
let r0 = self[self.len() - 1].as_u64();
let r1 = self[self.len() - 2].as_u64() << 32;
let r2 = self[self.len() - 3].as_u64();
let (v, n) = u64_to_hi64_2(r0, r1 | r2);
(v, n || nonzero(self, 3))
}
@ -199,17 +195,15 @@ impl Hi64<u64> for [u64] {
#[inline]
fn hi64_1(&self) -> (u64, bool) {
debug_assert!(self.len() == 1);
let rview = self.rview();
let r0 = rview[0];
let r0 = self[0];
u64_to_hi64_1(r0)
}
#[inline]
fn hi64_2(&self) -> (u64, bool) {
debug_assert!(self.len() >= 2);
let rview = self.rview();
let r0 = rview[0];
let r1 = rview[1];
let r0 = self[self.len() - 1];
let r1 = self[self.len() - 2];
let (v, n) = u64_to_hi64_2(r0, r1);
(v, n || nonzero(self, 2))
}

View File

@ -26,7 +26,6 @@ mod num;
mod parse;
mod rounding;
mod shift;
mod slice;
mod small_powers;
#[cfg(limb_width_32)]

View File

@ -1,59 +0,0 @@
//! Traits to accept generic slices.
use crate::lib::{ops, Vec};
/// REVERSE VIEW
/// Reverse, immutable view of a sequence.
pub struct ReverseView<'a, T: 'a> {
inner: &'a [T],
}
impl<'a, T> ops::Index<usize> for ReverseView<'a, T> {
type Output = T;
#[inline]
fn index(&self, index: usize) -> &T {
&self.inner[self.inner.len() - index - 1]
}
}
// SLICE
/// Trait for generic slices.
pub trait Slice<T> {
// AS SLICE
/// Get slice of immutable elements.
fn as_slice(&self) -> &[T];
/// Get the length of the collection.
#[inline]
fn len(&self) -> usize {
<[T]>::len(self.as_slice())
}
// RVIEW
/// Create a reverse view of the vector for indexing.
#[inline]
fn rview(&self) -> ReverseView<T> {
ReverseView {
inner: self.as_slice(),
}
}
}
impl<T> Slice<T> for [T] {
#[inline]
fn as_slice(&self) -> &[T] {
self
}
}
impl<T> Slice<T> for Vec<T> {
#[inline]
fn as_slice(&self) -> &[T] {
self
}
}