Merge pull request #8 from gavofyork/rlp_lifetimes

rlp lifetimes
This commit is contained in:
Marek Kotewicz 2015-11-30 17:40:40 +01:00
commit dd21dc38a7
2 changed files with 39 additions and 14 deletions

View File

@ -132,7 +132,7 @@ pub enum Prototype {
List(usize), List(usize),
} }
impl<'a> Rlp<'a> { impl<'a, 'view> Rlp<'a> where 'a: 'view {
/// Create a new instance of `Rlp` /// Create a new instance of `Rlp`
pub fn new(bytes: &'a [u8]) -> Rlp<'a> { pub fn new(bytes: &'a [u8]) -> Rlp<'a> {
Rlp { Rlp {
@ -162,12 +162,11 @@ impl<'a> Rlp<'a> {
/// fn main () { /// fn main () {
/// let data = vec![0xc8, 0x83, b'c', b'a', b't', 0x83, b'd', b'o', b'g']; /// let data = vec![0xc8, 0x83, b'c', b'a', b't', 0x83, b'd', b'o', b'g'];
/// let rlp = Rlp::new(&data); /// let rlp = Rlp::new(&data);
/// let view = rlp.at(1); /// let dog = rlp.at(1).data();
/// let dog = view.data();
/// assert_eq!(dog, &[0x83, b'd', b'o', b'g']); /// assert_eq!(dog, &[0x83, b'd', b'o', b'g']);
/// } /// }
/// ``` /// ```
pub fn data(&self) -> &[u8] { pub fn data(&'view self) -> &'a [u8] {
self.rlp.data() self.rlp.data()
} }
@ -223,7 +222,7 @@ impl<'a> Rlp<'a> {
/// assert_eq!(dog, "dog".to_string()); /// assert_eq!(dog, "dog".to_string());
/// } /// }
/// ``` /// ```
pub fn at(&self, index: usize) -> Rlp<'a> { pub fn at(&'view self, index: usize) -> Rlp<'a> {
From::from(self.rlp.at(index).unwrap()) From::from(self.rlp.at(index).unwrap())
} }
@ -325,7 +324,7 @@ impl<'a> Rlp<'a> {
} }
} }
impl<'a> UntrustedRlp<'a> { impl<'a, 'view> UntrustedRlp<'a> where 'a: 'view {
/// returns new instance of `UntrustedRlp` /// returns new instance of `UntrustedRlp`
pub fn new(bytes: &'a [u8]) -> UntrustedRlp<'a> { pub fn new(bytes: &'a [u8]) -> UntrustedRlp<'a> {
UntrustedRlp { UntrustedRlp {
@ -343,12 +342,11 @@ impl<'a> UntrustedRlp<'a> {
/// fn main () { /// fn main () {
/// let data = vec![0xc8, 0x83, b'c', b'a', b't', 0x83, b'd', b'o', b'g']; /// let data = vec![0xc8, 0x83, b'c', b'a', b't', 0x83, b'd', b'o', b'g'];
/// let rlp = UntrustedRlp::new(&data); /// let rlp = UntrustedRlp::new(&data);
/// let view = rlp.at(1).unwrap(); /// let dog = rlp.at(1).unwrap().data();
/// let dog = view.data();
/// assert_eq!(dog, &[0x83, b'd', b'o', b'g']); /// assert_eq!(dog, &[0x83, b'd', b'o', b'g']);
/// } /// }
/// ``` /// ```
pub fn data(&self) -> &[u8] { pub fn data(&'view self) -> &'a [u8] {
self.bytes self.bytes
} }
@ -410,7 +408,7 @@ impl<'a> UntrustedRlp<'a> {
/// assert_eq!(dog, "dog".to_string()); /// assert_eq!(dog, "dog".to_string());
/// } /// }
/// ``` /// ```
pub fn at(&self, index: usize) -> Result<UntrustedRlp<'a>, DecoderError> { pub fn at(&'view self, index: usize) -> Result<UntrustedRlp<'a>, DecoderError> {
if !self.is_list() { if !self.is_list() {
return Err(DecoderError::RlpExpectedToBeList); return Err(DecoderError::RlpExpectedToBeList);
} }
@ -1452,4 +1450,31 @@ mod tests {
vec![0xc5, 0xc4, 0x83, b'c', b'a', b't'])]; vec![0xc5, 0xc4, 0x83, b'c', b'a', b't'])];
run_decode_tests(tests); run_decode_tests(tests);
} }
#[test]
fn test_view() {
struct View<'a> {
bytes: &'a [u8]
}
impl <'a, 'view> View<'a> where 'a: 'view {
fn new(bytes: &'a [u8]) -> View<'a> {
View {
bytes: bytes
}
}
fn offset(&'view self, len: usize) -> View<'a> {
View::new(&self.bytes[len..])
}
fn data(&'view self) -> &'a [u8] {
self.bytes
}
}
let data = vec![0, 1, 2, 3];
let view = View::new(&data);
let _data_slice = view.offset(1).data();
}
} }

View File

@ -138,9 +138,9 @@ fn as_nibbles(bytes: &[u8]) -> Vec<u8> {
fn hash256rlp(input: &[(Vec<u8>, Vec<u8>)], pre_len: usize, stream: &mut RlpStream) { fn hash256rlp(input: &[(Vec<u8>, Vec<u8>)], pre_len: usize, stream: &mut RlpStream) {
let inlen = input.len(); let inlen = input.len();
// in case of empty slice, just append null // in case of empty slice, just append empty data
if inlen == 0 { if inlen == 0 {
stream.append(&""); stream.append_empty_data();
return; return;
} }
@ -196,7 +196,7 @@ fn hash256rlp(input: &[(Vec<u8>, Vec<u8>)], pre_len: usize, stream: &mut RlpStre
// if at least 1 successive element has the same nibble // if at least 1 successive element has the same nibble
// append their suffixes // append their suffixes
match len { match len {
0 => { stream.append(&""); }, 0 => { stream.append_empty_data(); },
_ => hash256aux(&input[begin..(begin + len)], pre_len + 1, stream) _ => hash256aux(&input[begin..(begin + len)], pre_len + 1, stream)
} }
begin += len; begin += len;
@ -205,7 +205,7 @@ fn hash256rlp(input: &[(Vec<u8>, Vec<u8>)], pre_len: usize, stream: &mut RlpStre
// if fist key len is equal prefix, append it's value // if fist key len is equal prefix, append it's value
match pre_len == key.len() { match pre_len == key.len() {
true => { stream.append(&value); }, true => { stream.append(&value); },
false => { stream.append(&""); } false => { stream.append_empty_data(); }
}; };
} }