De-~[] array

This commit is contained in:
Steven Fackler 2014-03-18 23:07:12 -07:00
parent 2a822eb8c0
commit 0aec726b69
3 changed files with 34 additions and 33 deletions

View File

@ -519,13 +519,13 @@ fn test_tstzrange_params() {
macro_rules! test_array_params( macro_rules! test_array_params(
($name:expr, $v1:expr, $s1:expr, $v2:expr, $s2:expr, $v3:expr, $s3:expr) => ({ ($name:expr, $v1:expr, $s1:expr, $v2:expr, $s2:expr, $v3:expr, $s3:expr) => ({
let tests = [(Some(ArrayBase::from_vec(~[Some($v1), Some($v2), None], 1)), let tests = [(Some(ArrayBase::from_vec(vec!(Some($v1), Some($v2), None), 1)),
"'{" + $s1 + "," + $s2 + ",NULL}'"), "'{" + $s1 + "," + $s2 + ",NULL}'"),
(None, ~"NULL")]; (None, ~"NULL")];
test_type($name + "[]", tests); test_type($name + "[]", tests);
let mut a = ArrayBase::from_vec(~[Some($v1), Some($v2)], 0); let mut a = ArrayBase::from_vec(vec!(Some($v1), Some($v2)), 0);
a.wrap(-1); a.wrap(-1);
a.push_move(ArrayBase::from_vec(~[None, Some($v3)], 0)); a.push_move(ArrayBase::from_vec(vec!(None, Some($v3)), 0));
let tests = [(Some(a), "'[-1:0][0:1]={{" + $s1 + "," + $s2 + "},{NULL," + $s3 + "}}'")]; let tests = [(Some(a), "'[-1:0][0:1]={{" + $s1 + "," + $s2 + "},{NULL," + $s3 + "}}'")];
test_type($name + "[][]", tests); test_type($name + "[][]", tests);
}) })

View File

@ -2,6 +2,7 @@
use std::cast; use std::cast;
use std::vec; use std::vec;
use std::vec_ng::Vec;
/// Information about a dimension of an array /// Information about a dimension of an array
#[deriving(Eq, Clone, Show)] #[deriving(Eq, Clone, Show)]
@ -71,8 +72,8 @@ trait InternalArray<T> : Array<T> {
/// A multi-dimensional array /// A multi-dimensional array
#[deriving(Eq, Clone)] #[deriving(Eq, Clone)]
pub struct ArrayBase<T> { pub struct ArrayBase<T> {
priv info: ~[DimensionInfo], priv info: Vec<DimensionInfo>,
priv data: ~[T], priv data: Vec<T>,
} }
impl<T> ArrayBase<T> { impl<T> ArrayBase<T> {
@ -85,7 +86,7 @@ impl<T> ArrayBase<T> {
/// ///
/// Fails if there are 0 dimensions or the number of elements provided does /// Fails if there are 0 dimensions or the number of elements provided does
/// not match the number of elements specified. /// not match the number of elements specified.
pub fn from_raw(data: ~[T], info: ~[DimensionInfo]) pub fn from_raw(data: Vec<T>, info: Vec<DimensionInfo>)
-> ArrayBase<T> { -> ArrayBase<T> {
assert!(!info.is_empty(), "Cannot create a 0x0 array"); assert!(!info.is_empty(), "Cannot create a 0x0 array");
assert!(data.len() == info.iter().fold(1, |acc, i| acc * i.len), assert!(data.len() == info.iter().fold(1, |acc, i| acc * i.len),
@ -97,12 +98,12 @@ impl<T> ArrayBase<T> {
} }
/// Creates a new one-dimensional array from a vector. /// Creates a new one-dimensional array from a vector.
pub fn from_vec(data: ~[T], lower_bound: int) -> ArrayBase<T> { pub fn from_vec(data: Vec<T>, lower_bound: int) -> ArrayBase<T> {
ArrayBase { ArrayBase {
info: ~[DimensionInfo { info: vec!(DimensionInfo {
len: data.len(), len: data.len(),
lower_bound: lower_bound lower_bound: lower_bound
}], }),
data: data data: data
} }
} }
@ -138,7 +139,7 @@ impl<T> ArrayBase<T> {
for (info1, info2) in self.info.iter().skip(1).zip(other.info.iter()) { for (info1, info2) in self.info.iter().skip(1).zip(other.info.iter()) {
assert!(info1 == info2, "Cannot join differently shaped arrays"); assert!(info1 == info2, "Cannot join differently shaped arrays");
} }
self.info[0].len += 1; self.info.get_mut(0).len += 1;
self.data.push_all_move(other.data); self.data.push_all_move(other.data);
} }
@ -174,7 +175,7 @@ impl<T> MutableArray<T> for ArrayBase<T> {}
impl<T> InternalArray<T> for ArrayBase<T> { impl<T> InternalArray<T> for ArrayBase<T> {
fn raw_get<'a>(&'a self, idx: uint, _size: uint) -> &'a T { fn raw_get<'a>(&'a self, idx: uint, _size: uint) -> &'a T {
&self.data[idx] self.data.get(idx)
} }
} }
@ -252,7 +253,7 @@ mod tests {
#[test] #[test]
fn test_from_vec() { fn test_from_vec() {
let a = ArrayBase::from_vec(~[0, 1, 2], -1); let a = ArrayBase::from_vec(vec!(0, 1, 2), -1);
assert!([DimensionInfo { len: 3, lower_bound: -1 }] == assert!([DimensionInfo { len: 3, lower_bound: -1 }] ==
a.dimension_info()); a.dimension_info());
assert_eq!(&0, a.get(-1)); assert_eq!(&0, a.get(-1));
@ -263,7 +264,7 @@ mod tests {
#[test] #[test]
#[should_fail] #[should_fail]
fn test_get_2d_fail() { fn test_get_2d_fail() {
let mut a = ArrayBase::from_vec(~[0, 1, 2], -1); let mut a = ArrayBase::from_vec(vec!(0, 1, 2), -1);
a.wrap(1); a.wrap(1);
a.get(1); a.get(1);
} }
@ -271,7 +272,7 @@ mod tests {
#[test] #[test]
#[should_fail] #[should_fail]
fn test_2d_slice_range_fail_low() { fn test_2d_slice_range_fail_low() {
let mut a = ArrayBase::from_vec(~[0, 1, 2], -1); let mut a = ArrayBase::from_vec(vec!(0, 1, 2), -1);
a.wrap(1); a.wrap(1);
a.slice(0); a.slice(0);
} }
@ -279,14 +280,14 @@ mod tests {
#[test] #[test]
#[should_fail] #[should_fail]
fn test_2d_slice_range_fail_high() { fn test_2d_slice_range_fail_high() {
let mut a = ArrayBase::from_vec(~[0, 1, 2], -1); let mut a = ArrayBase::from_vec(vec!(0, 1, 2), -1);
a.wrap(1); a.wrap(1);
a.slice(2); a.slice(2);
} }
#[test] #[test]
fn test_2d_slice_get() { fn test_2d_slice_get() {
let mut a = ArrayBase::from_vec(~[0, 1, 2], -1); let mut a = ArrayBase::from_vec(vec!(0, 1, 2), -1);
a.wrap(1); a.wrap(1);
let s = a.slice(1); let s = a.slice(1);
assert_eq!(&0, s.get(-1)); assert_eq!(&0, s.get(-1));
@ -297,33 +298,33 @@ mod tests {
#[test] #[test]
#[should_fail] #[should_fail]
fn test_push_move_wrong_lower_bound() { fn test_push_move_wrong_lower_bound() {
let mut a = ArrayBase::from_vec(~[1], -1); let mut a = ArrayBase::from_vec(vec!(1), -1);
a.push_move(ArrayBase::from_vec(~[2], 0)); a.push_move(ArrayBase::from_vec(vec!(2), 0));
} }
#[test] #[test]
#[should_fail] #[should_fail]
fn test_push_move_wrong_dims() { fn test_push_move_wrong_dims() {
let mut a = ArrayBase::from_vec(~[1], -1); let mut a = ArrayBase::from_vec(vec!(1), -1);
a.wrap(1); a.wrap(1);
a.push_move(ArrayBase::from_vec(~[1, 2], -1)); a.push_move(ArrayBase::from_vec(vec!(1, 2), -1));
} }
#[test] #[test]
#[should_fail] #[should_fail]
fn test_push_move_wrong_dim_count() { fn test_push_move_wrong_dim_count() {
let mut a = ArrayBase::from_vec(~[1], -1); let mut a = ArrayBase::from_vec(vec!(1), -1);
a.wrap(1); a.wrap(1);
let mut b = ArrayBase::from_vec(~[2], -1); let mut b = ArrayBase::from_vec(vec!(2), -1);
b.wrap(1); b.wrap(1);
a.push_move(b); a.push_move(b);
} }
#[test] #[test]
fn test_push_move_ok() { fn test_push_move_ok() {
let mut a = ArrayBase::from_vec(~[1, 2], 0); let mut a = ArrayBase::from_vec(vec!(1, 2), 0);
a.wrap(0); a.wrap(0);
a.push_move(ArrayBase::from_vec(~[3, 4], 0)); a.push_move(ArrayBase::from_vec(vec!(3, 4), 0));
let s = a.slice(0); let s = a.slice(0);
assert_eq!(&1, s.get(0)); assert_eq!(&1, s.get(0));
assert_eq!(&2, s.get(1)); assert_eq!(&2, s.get(1));
@ -334,13 +335,13 @@ mod tests {
#[test] #[test]
fn test_3d() { fn test_3d() {
let mut a = ArrayBase::from_vec(~[0, 1], 0); let mut a = ArrayBase::from_vec(vec!(0, 1), 0);
a.wrap(0); a.wrap(0);
a.push_move(ArrayBase::from_vec(~[2, 3], 0)); a.push_move(ArrayBase::from_vec(vec!(2, 3), 0));
a.wrap(0); a.wrap(0);
let mut b = ArrayBase::from_vec(~[4, 5], 0); let mut b = ArrayBase::from_vec(vec!(4, 5), 0);
b.wrap(0); b.wrap(0);
b.push_move(ArrayBase::from_vec(~[6, 7], 0)); b.push_move(ArrayBase::from_vec(vec!(6, 7), 0));
a.push_move(b); a.push_move(b);
let s1 = a.slice(0); let s1 = a.slice(0);
let s2 = s1.slice(0); let s2 = s1.slice(0);
@ -360,7 +361,7 @@ mod tests {
#[test] #[test]
fn test_mut() { fn test_mut() {
let mut a = ArrayBase::from_vec(~[1, 2], 0); let mut a = ArrayBase::from_vec(vec!(1, 2), 0);
a.wrap(0); a.wrap(0);
{ {
let mut s = a.slice_mut(0); let mut s = a.slice_mut(0);
@ -373,14 +374,14 @@ mod tests {
#[test] #[test]
#[should_fail] #[should_fail]
fn test_base_overslice() { fn test_base_overslice() {
let a = ArrayBase::from_vec(~[1], 0); let a = ArrayBase::from_vec(vec!(1), 0);
a.slice(0); a.slice(0);
} }
#[test] #[test]
#[should_fail] #[should_fail]
fn test_slice_overslice() { fn test_slice_overslice() {
let mut a = ArrayBase::from_vec(~[1], 0); let mut a = ArrayBase::from_vec(vec!(1), 0);
a.wrap(0); a.wrap(0);
let s = a.slice(0); let s = a.slice(0);
s.slice(0); s.slice(0);

View File

@ -419,7 +419,7 @@ macro_rules! from_array_impl(
let _has_null = or_fail!(rdr.read_be_i32()) == 1; let _has_null = or_fail!(rdr.read_be_i32()) == 1;
let _element_type: Oid = or_fail!(rdr.read_be_u32()); let _element_type: Oid = or_fail!(rdr.read_be_u32());
let mut dim_info = vec::with_capacity(ndim); let mut dim_info = Vec::with_capacity(ndim);
for _ in range(0, ndim) { for _ in range(0, ndim) {
dim_info.push(DimensionInfo { dim_info.push(DimensionInfo {
len: or_fail!(rdr.read_be_i32()) as uint, len: or_fail!(rdr.read_be_i32()) as uint,
@ -428,7 +428,7 @@ macro_rules! from_array_impl(
} }
let nele = dim_info.iter().fold(1, |acc, info| acc * info.len); let nele = dim_info.iter().fold(1, |acc, info| acc * info.len);
let mut elements = vec::with_capacity(nele); let mut elements = Vec::with_capacity(nele);
for _ in range(0, nele) { for _ in range(0, nele) {
let len = or_fail!(rdr.read_be_i32()); let len = or_fail!(rdr.read_be_i32());
if len < 0 { if len < 0 {