1 // Copyright 2014 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
12 use std::default::Default;
14 use std::{mem, raw, ptr, slice, vec};
15 use std::rt::heap::EMPTY;
16 use serialize::{Encodable, Decodable, Encoder, Decoder};
18 /// A non-growable owned slice. This would preferably become `~[T]`
20 #[unsafe_no_drop_flag] // data is set to null on destruction
21 pub struct OwnedSlice<T> {
27 impl<T:fmt::Show> fmt::Show for OwnedSlice<T> {
28 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
29 try!("OwnedSlice {{".fmt(fmt));
30 for i in self.iter() {
39 impl<T> Drop for OwnedSlice<T> {
41 if self.data.is_null() { return }
44 let v = mem::replace(self, OwnedSlice::empty());
45 // free via the Vec destructor
50 impl<T> OwnedSlice<T> {
51 pub fn empty() -> OwnedSlice<T> {
52 OwnedSlice { data: ptr::null_mut(), len: 0 }
56 pub fn from_vec(mut v: Vec<T>) -> OwnedSlice<T> {
62 // drop excess capacity to avoid breaking sized deallocation
65 let p = v.as_mut_ptr();
66 // we own the allocation now
67 unsafe { mem::forget(v) }
69 OwnedSlice { data: p, len: len }
74 pub fn into_vec(self) -> Vec<T> {
75 // null is ok, because len == 0 in that case, as required by Vec.
77 let ret = Vec::from_raw_parts(self.data, self.len, self.len);
78 // the vector owns the allocation now
84 pub fn as_slice<'a>(&'a self) -> &'a [T] {
85 let ptr = if self.data.is_null() {
86 // length zero, i.e. this will never be read as a T.
92 let slice: &[T] = unsafe {mem::transmute(raw::Slice {
100 pub fn get<'a>(&'a self, i: uint) -> &'a T {
101 self.as_slice().get(i).expect("OwnedSlice: index out of bounds")
104 pub fn iter<'r>(&'r self) -> slice::Items<'r, T> {
105 self.as_slice().iter()
108 pub fn move_iter(self) -> vec::MoveItems<T> {
109 self.into_vec().into_iter()
112 pub fn map<U>(&self, f: |&T| -> U) -> OwnedSlice<U> {
113 self.iter().map(f).collect()
117 impl<T> Default for OwnedSlice<T> {
118 fn default() -> OwnedSlice<T> {
123 impl<T: Clone> Clone for OwnedSlice<T> {
124 fn clone(&self) -> OwnedSlice<T> {
125 OwnedSlice::from_vec(self.as_slice().to_vec())
129 impl<S: hash::Writer, T: hash::Hash<S>> hash::Hash<S> for OwnedSlice<T> {
130 fn hash(&self, state: &mut S) {
131 self.as_slice().hash(state)
135 impl<T: PartialEq> PartialEq for OwnedSlice<T> {
136 fn eq(&self, other: &OwnedSlice<T>) -> bool {
137 self.as_slice() == other.as_slice()
141 impl<T: Eq> Eq for OwnedSlice<T> {}
143 impl<T> Collection for OwnedSlice<T> {
144 fn len(&self) -> uint { self.len }
147 impl<T> FromIterator<T> for OwnedSlice<T> {
148 fn from_iter<I: Iterator<T>>(mut iter: I) -> OwnedSlice<T> {
149 OwnedSlice::from_vec(iter.collect())
153 impl<S: Encoder<E>, T: Encodable<S, E>, E> Encodable<S, E> for OwnedSlice<T> {
154 fn encode(&self, s: &mut S) -> Result<(), E> {
155 self.as_slice().encode(s)
159 impl<D: Decoder<E>, T: Decodable<D, E>, E> Decodable<D, E> for OwnedSlice<T> {
160 fn decode(d: &mut D) -> Result<OwnedSlice<T>, E> {
161 Ok(OwnedSlice::from_vec(match Decodable::decode(d) {
163 Err(e) => return Err(e)