commit
dd21dc38a7
45
src/rlp.rs
45
src/rlp.rs
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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(); }
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user