Skip to content

Commit a64d669

Browse files
authored
Merge pull request capnproto#82 from bspeice/master
Add the OwnedReader as proposed in capnproto#50
2 parents 4fdc5be + 0df8f2a commit a64d669

File tree

1 file changed

+25
-1
lines changed

1 file changed

+25
-1
lines changed

src/message.rs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use any_pointer;
2525
use private::arena::{BuilderArenaImpl, ReaderArenaImpl, BuilderArena, ReaderArena};
2626
use private::layout;
2727
use private::units::BYTES_PER_WORD;
28-
use traits::{FromPointerReader, FromPointerBuilder, SetPointerBuilder};
28+
use traits::{FromPointerReader, FromPointerBuilder, SetPointerBuilder, Owned};
2929
use {OutputSegments, Result, Word};
3030

3131
/// Options controlling how data is read.
@@ -177,6 +177,30 @@ impl <S> Reader<S> where S: ReaderSegments {
177177
}
178178
}
179179

180+
/// A reader object that owns the underlying data in the message
181+
pub struct OwnedReader<S, T>
182+
where S: ReaderSegments,
183+
T: for<'a> Owned<'a> {
184+
marker: ::std::marker::PhantomData<T>,
185+
message: Reader<S>,
186+
}
187+
188+
impl <S, T> OwnedReader<S, T>
189+
where S: ReaderSegments,
190+
T : for<'a> Owned<'a> {
191+
192+
pub fn new(message: Reader<S>) -> Self {
193+
OwnedReader {
194+
marker: ::std::marker::PhantomData,
195+
message: message,
196+
}
197+
}
198+
199+
pub fn get<'a> (&'a self) -> Result<<T as Owned<'a>>::Reader> {
200+
self.message.get_root()
201+
}
202+
}
203+
180204
/// An object that allocates memory for a Cap'n Proto message as it is being built.
181205
pub unsafe trait Allocator {
182206
/// Allocates memory for a new segment, returning a pointer to the start of the segment

0 commit comments

Comments
 (0)