@@ -2,6 +2,7 @@ language: rust
|
|||||||
sudo: false
|
sudo: false
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
|
- rust: 1.2.0
|
||||||
- rust: stable
|
- rust: stable
|
||||||
- rust: beta
|
- rust: beta
|
||||||
- rust: nightly
|
- rust: nightly
|
||||||
|
|||||||
+14
-2
@@ -1,7 +1,8 @@
|
|||||||
use std::borrow::Borrow;
|
use std::borrow::Borrow;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::hash::{Hash, Hasher};
|
use std::hash::{Hash, Hasher};
|
||||||
use std::ops::Deref;
|
use std::mem;
|
||||||
|
use std::ops::{Deref, DerefMut};
|
||||||
use std::str;
|
use std::str;
|
||||||
use std::slice;
|
use std::slice;
|
||||||
|
|
||||||
@@ -99,7 +100,7 @@ impl<A: Array<Item=u8>> ArrayString<A> {
|
|||||||
pub fn push_str<'a>(&mut self, s: &'a str) -> Result<(), CapacityError<&'a str>> {
|
pub fn push_str<'a>(&mut self, s: &'a str) -> Result<(), CapacityError<&'a str>> {
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
|
|
||||||
if self.len() + s.len() > self.capacity() {
|
if s.len() > self.capacity() - self.len() {
|
||||||
return Err(CapacityError::new(s));
|
return Err(CapacityError::new(s));
|
||||||
}
|
}
|
||||||
unsafe {
|
unsafe {
|
||||||
@@ -142,6 +143,17 @@ impl<A: Array<Item=u8>> Deref for ArrayString<A> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<A: Array<Item=u8>> DerefMut for ArrayString<A> {
|
||||||
|
#[inline]
|
||||||
|
fn deref_mut(&mut self) -> &mut str {
|
||||||
|
unsafe {
|
||||||
|
let sl = slice::from_raw_parts_mut(self.xs.as_mut_ptr(), self.len.to_usize());
|
||||||
|
// FIXME: Nothing but transmute to do this right now
|
||||||
|
mem::transmute(sl)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<A: Array<Item=u8>> PartialEq for ArrayString<A> {
|
impl<A: Array<Item=u8>> PartialEq for ArrayString<A> {
|
||||||
fn eq(&self, rhs: &Self) -> bool {
|
fn eq(&self, rhs: &Self) -> bool {
|
||||||
**self == **rhs
|
**self == **rhs
|
||||||
|
|||||||
+13
-4
@@ -57,9 +57,7 @@ pub struct ArrayVec<A: Array> {
|
|||||||
|
|
||||||
impl<A: Array> Drop for ArrayVec<A> {
|
impl<A: Array> Drop for ArrayVec<A> {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
// clear all elements
|
self.clear();
|
||||||
while let Some(_) = self.pop() {
|
|
||||||
}
|
|
||||||
|
|
||||||
// NoDrop inhibits array's drop
|
// NoDrop inhibits array's drop
|
||||||
// panic safety: NoDrop::drop will trigger on panic, so the inner
|
// panic safety: NoDrop::drop will trigger on panic, so the inner
|
||||||
@@ -340,6 +338,12 @@ impl<A: Array> ArrayVec<A> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Dispose of `self` without the overwriting that is needed in Drop.
|
||||||
|
pub fn dispose(mut self) {
|
||||||
|
self.clear();
|
||||||
|
mem::forget(self);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<A: Array> Deref for ArrayVec<A> {
|
impl<A: Array> Deref for ArrayVec<A> {
|
||||||
@@ -701,7 +705,7 @@ impl<A: Array<Item=u8>> io::Write for ArrayVec<A> {
|
|||||||
|
|
||||||
/// Error value indicating insufficient capacity
|
/// Error value indicating insufficient capacity
|
||||||
#[derive(Clone, Copy, Eq, Ord, PartialEq, PartialOrd)]
|
#[derive(Clone, Copy, Eq, Ord, PartialEq, PartialOrd)]
|
||||||
pub struct CapacityError<T> {
|
pub struct CapacityError<T = ()> {
|
||||||
element: T,
|
element: T,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -716,6 +720,11 @@ impl<T> CapacityError<T> {
|
|||||||
pub fn element(self) -> T {
|
pub fn element(self) -> T {
|
||||||
self.element
|
self.element
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Convert into a `CapacityError` that does not carry an element.
|
||||||
|
pub fn simplify(self) -> CapacityError {
|
||||||
|
CapacityError { element: () }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const CAPERROR: &'static str = "insufficient capacity";
|
const CAPERROR: &'static str = "insufficient capacity";
|
||||||
|
|||||||
@@ -283,6 +283,12 @@ fn test_string() {
|
|||||||
assert!(t.push_str(text).is_err());
|
assert!(t.push_str(text).is_err());
|
||||||
assert_eq!(&t, "");
|
assert_eq!(&t, "");
|
||||||
|
|
||||||
|
t.push_str("ab").unwrap();
|
||||||
|
// DerefMut
|
||||||
|
let tmut: &mut str = &mut t;
|
||||||
|
assert_eq!(tmut, "ab");
|
||||||
|
|
||||||
|
|
||||||
// Test Error trait / try
|
// Test Error trait / try
|
||||||
let t = || -> Result<(), Box<Error>> {
|
let t = || -> Result<(), Box<Error>> {
|
||||||
let mut t = ArrayString::<[_; 2]>::new();
|
let mut t = ArrayString::<[_; 2]>::new();
|
||||||
|
|||||||
Reference in New Issue
Block a user