I've submitted the pull request to remove the '@' boxes from json here: https://github.com/mozilla/rust/pull/10727.
On Fri, Nov 29, 2013 at 5:06 AM, Huon Wilson <[email protected]> wrote: > Yes; wait for Erick to submit the PR that fixes extra::json to use &mut > Writer rather than @mut Writer, so that one can write something like > > > pub fn buffer_encode<T:Encodable<Encoder>>(to_encode_object: &T) -> > ~[u8] { > let mut m = MemWriter::new(); > { // I think this scope is necessary to restrict the borrows > let mut encoder = Encoder(&mut m as &mut Writer); > to_encode_object.encode(&mut encoder); > } > m.inner() > } > > One is then just moving the `~[u8]` around without copying all the > elements. > > Also, `str_encode` shouldn't need to do any additional copies, even right > now, since the `std::str::from_utf8_owned` function exists. (`from_utf8` is > bad with its implicit and normally unnecessary copy, I've got > https://github.com/mozilla/rust/pull/10701 open that removes that > function for that reason.) > > > (Tangentially (and a genuine question), do we really need these functions > in extra::json (assuming this is part of the plan)? How often does one need > to encode to a buffer or string, rather than to stdout, a file or network > socket, which can be done by writing directly to the corresponding writers.) > > Huon > > > > On 29/11/13 23:57, Philippe Delrieu wrote: > > I try to implement the two methods and I have a problem with the copy of > memory. > The first attempt : > > pub fn buffer_encode<T:Encodable<Encoder>>(to_encode_object: &T) -> > ~[u8] { > //Serialize the object in a string using a writer > let m = @mut MemWriter::new(); > let mut encoder = Encoder(m as @mut Writer); > to_encode_object.encode(&mut encoder); > let buff:&~[u8] = m.inner_ref(); > (buff.clone()) > } > > pub fn str_encode<T:Encodable<Encoder>>(to_encode_object: &T) -> ~str { > let buff:~[u8] = buffer_encode(to_encode_object); > str::from_utf8(*buff) > } > > When I call str_encode I copy at least two times the content of the > MemWriter buffer (one inside clone and one inside from_utf8). > If I implements str_encode like that > > pub fn str_encode<T:Encodable<Encoder>>(to_encode_object: &T) -> ~str { > let m = @mut MemWriter::new(); > let mut encoder = Encoder(m as @mut Writer); > to_encode_object.encode(&mut encoder); > let buff:&~[u8] = m.inner_ref(); > str::from_utf8(*buff) > } > > I'll do at least one copy (one less than the other impl) but the code is > copied. > > Is there a better way to manage pointer of memory across function calls? > > Philippe > > Le 29/11/2013 12:55, Philippe Delrieu a écrit : > > I made a remark about that on the GitHub pull request where the idea was > proposed. I'm agree with you. It's simplier to return a str or perhaps a > [u8] if it's use in a stream purpose. > I'm not very fan of creating a MemWriter and return it. > > I'll modify to add two functions: > pub fn str_encode<T:Encodable<Encoder>>(to_encode_object: &T) -> ~str > pub fn buffer_encode<T:Encodable<Encoder>>(to_encode_object: &T) -> ~[u8] > > and remove the other. > > Any remaqs? > > Philippe > > > Le 29/11/2013 10:44, Gaetan a écrit : > > I would prefere this function returns a str. > Le 29 nov. 2013 09:27, "Philippe Delrieu" <[email protected]> a > écrit : > >> Thank you for the help. I've try this signature and I had an compile >> error. I thought it came from the signature but the problem when from the >> call. >> It works now. >> >> For the return type @mut MemWriter I work on the json doc and some >> example of use. I can make the change. I didn't find the issue about it. >> Did you create it? >> >> Philippe >> >> Le 28/11/2013 22:27, Erick Tryzelaar a écrit : >> >> Good afternoon Phillippe, >> >> Here's how to do it, assuming you're using rust 0.8 and the json library: >> >> ``` >> #[feature(managed_boxes)]; >> >> extern mod extra; >> >> use std::io::mem::MemWriter; >> use extra::serialize::{Encoder, Encodable}; >> use extra::json; >> >> pub fn memory_encode< >> T: Encodable<json::Encoder> >> >(to_encode_object: &T) -> @mut MemWriter { >> //Serialize the object in a string using a writer >> let m = @mut MemWriter::new(); >> let mut encoder = json::Encoder(m as @mut Writer); >> to_encode_object.encode(&mut encoder); >> m >> } >> >> fn main() { >> } >> ``` >> >> Regarding the trouble returning a `MemWriter` instead of a `@mut >> MemWriter`, the easiest thing would be to fix library to use `&mut ...` >> instead of `@mut ...`. I'll put in a PR to do that. >> >> >> >> On Thu, Nov 28, 2013 at 3:55 AM, Philippe Delrieu < >> [email protected]> wrote: >> >>> I try to develop a function that take a Encodable parameter but I have >>> the error wrong number of type arguments: expected 1 but found 0 >>> >>> pub fn memory_encode(to_encode_object: &serialize::Encodable) -> @mut >>> MemWriter { >>> //Serialize the object in a string using a writer >>> let m = @mut MemWriter::new(); >>> let mut encoder = Encoder(m as @mut Writer); >>> to_encode_object.encode(&mut encoder); >>> m >>> } >>> >>> The encodable trait is : >>> pub trait Encodable<S:Encoder> { >>> fn encode(&self, s: &mut S); >>> } >>> >>> I try this definition >>> memory_encode<T:serialize::Encodable<Encoder>>(to_encode_object: &T) -> >>> @mut MemWriter >>> >>> But I can't use the method with a struct that implement Encodable. The >>> error : mismatched types: expected `&<V31>` but found .. >>> >>> I have another question : >>> I would like to return a MemWriter and not a @mut MemWriter . I didn't >>> find a way to convert the @mut to ~ >>> >>> Philippe Delrieu >>> _______________________________________________ >>> Rust-dev mailing list >>> [email protected] >>> https://mail.mozilla.org/listinfo/rust-dev >>> >> >> >> >> _______________________________________________ >> Rust-dev mailing list >> [email protected] >> https://mail.mozilla.org/listinfo/rust-dev >> >> > > > _______________________________________________ > Rust-dev mailing > [email protected]https://mail.mozilla.org/listinfo/rust-dev > > > > > _______________________________________________ > Rust-dev mailing > [email protected]https://mail.mozilla.org/listinfo/rust-dev > > > > _______________________________________________ > Rust-dev mailing list > [email protected] > https://mail.mozilla.org/listinfo/rust-dev > >
_______________________________________________ Rust-dev mailing list [email protected] https://mail.mozilla.org/listinfo/rust-dev
