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.
14 use container::Container;
16 use finally::try_finally;
18 use iter::{range, Iterator, FromIterator};
20 use num::{CheckedMul, CheckedAdd};
21 use option::{Some, None};
25 use slice::ImmutableVector;
28 #[cfg(not(test))] use ops::Add;
33 fn rust_malloc(size: uint) -> *u8;
35 fn rust_malloc(size: uint, align: uint) -> *u8;
36 fn rust_free(ptr: *u8);
40 unsafe fn alloc(cap: uint) -> *mut Vec<()> {
41 let cap = cap.checked_add(&mem::size_of::<Vec<()>>()).unwrap();
42 let ret = rust_malloc(cap) as *mut Vec<()>;
52 unsafe fn alloc(cap: uint) -> *mut Vec<()> {
53 let cap = cap.checked_add(&mem::size_of::<Vec<()>>()).unwrap();
54 let ret = rust_malloc(cap, 8) as *mut Vec<()>;
65 impl Default for ~str {
66 fn default() -> ~str {
71 // Initialize the memory
81 fn clone(&self) -> ~str {
82 // Don't use the clone() implementation above because it'll start
83 // requiring the eh_personality lang item (no fun)
85 let bytes = self.as_bytes().as_ptr();
88 let ptr = alloc(len) as *mut Vec<u8>;
89 ptr::copy_nonoverlapping_memory(&mut (*ptr).data, bytes, len);
98 impl FromIterator<char> for ~str {
100 fn from_iter<T: Iterator<char>>(mut iterator: T) -> ~str {
101 let (lower, _) = iterator.size_hint();
102 let mut cap = if lower == 0 {16} else {lower};
104 let mut tmp = [0u8, ..4];
107 let mut ptr = alloc(cap) as *mut Vec<u8>;
108 let mut ret = cast::transmute(ptr);
110 let amt = ch.encode_utf8(tmp);
113 cap = cap.checked_mul(&2).unwrap();
117 let ptr2 = alloc(cap) as *mut Vec<u8>;
118 ptr::copy_nonoverlapping_memory(&mut (*ptr2).data,
121 rust_free(ptr as *u8);
123 ret = cast::transmute(ptr2);
127 let base = &mut (*ptr).data as *mut u8;
128 for byte in tmp.slice_to(amt).iter() {
129 *base.offset(len as int) = *byte;
140 impl<'a> Add<&'a str,~str> for &'a str {
142 fn add(&self, rhs: & &'a str) -> ~str {
143 let amt = self.len().checked_add(&rhs.len()).unwrap();
145 let ptr = alloc(amt) as *mut Vec<u8>;
146 let base = &mut (*ptr).data as *mut _;
147 ptr::copy_nonoverlapping_memory(base,
148 self.as_bytes().as_ptr(),
150 let base = base.offset(self.len() as int);
151 ptr::copy_nonoverlapping_memory(base,
152 rhs.as_bytes().as_ptr(),
163 impl<A: Clone> Clone for ~[A] {
165 fn clone(&self) -> ~[A] {
166 let len = self.len();
167 let data_size = len.checked_mul(&mem::size_of::<A>()).unwrap();
168 let size = mem::size_of::<Vec<()>>().checked_add(&data_size).unwrap();
171 let ret = alloc(size) as *mut Vec<A>;
173 (*ret).fill = len * mem::nonzero_size_of::<A>();
174 (*ret).alloc = len * mem::nonzero_size_of::<A>();
177 let p = &mut (*ret).data as *mut _ as *mut A;
180 |i, ()| while *i < len {
182 &mut(*p.offset(*i as int)),
183 self.unsafe_ref(*i).clone());
187 // we must be failing, clean up after ourselves
188 for j in range(0, *i as int) {
189 ptr::read(&*p.offset(j));
191 rust_free(ret as *u8);