GithubHelp home page GithubHelp logo

Implement ToOwned on Bytes about bytes HOT 13 CLOSED

serde-rs avatar serde-rs commented on September 14, 2024
Implement ToOwned on Bytes

from bytes.

Comments (13)

dtolnay avatar dtolnay commented on September 14, 2024

Seems reasonable! I would be prepared to consider a PR for this.

from bytes.

RReverser avatar RReverser commented on September 14, 2024

sigh looks like this won't work due to coherence (as usual in Rust) :(

ToOwned can't be implemented on types that have Clone, and Bytes without Clone can't be Copyable either, and losing these two seems bad.

Standard library doesn't have this issue with &[u8] / &str / etc. because these live in the same crate as ToOwned and so can be specialised, even though these types implement Clone and Copy too.

from bytes.

dtolnay avatar dtolnay commented on September 14, 2024

We probably want to change Bytes to a dst for this and other reasons.

pub struct Bytes {
    bytes: [u8],
}

from bytes.

RReverser avatar RReverser commented on September 14, 2024

That would work (although would be a breaking change). If you're open to a PR, I can do both together.

from bytes.

RReverser avatar RReverser commented on September 14, 2024

What is the target Rust version for serde_bytes though? I believe the above can be technically safe only with #[repr(transparent)] which is stable in Rust 1.28+, but I remember from other discussion that you're supporting older versions of Rust too?

from bytes.

dtolnay avatar dtolnay commented on September 14, 2024

repr(C) is sufficient in this case because we don't need FFI guarantees. But major versions are allowed to raise the rustc requirement.

from bytes.

RReverser avatar RReverser commented on September 14, 2024

To make sure we're on the same page - we're both talking about safety of transmute::<&[u8], &Bytes> right?

If so, I'm not sure repr(C) is enough. It would be enough for thin pointers, because then we only care that start address of the first field == address of the struct itself, but fat pointers have own internal representation that is AFAIK not guaranteed to be compatible without repr(transparent).

from bytes.

dtolnay avatar dtolnay commented on September 14, 2024

transmute::<&[u8], &Bytes> only requires repr(C). The guarantees of repr(transparent) are the same as repr(C) plus one extra guarantee about how the struct is seen by calling conventions of extern functions, particularly in calling conventions that treat all struct types differently from primitive types.

Transmuting is not the same as FFI so repr(transparent) vs repr(C) has no bearing on transmute (except when transmuting FFI function pointers).

from bytes.

RReverser avatar RReverser commented on September 14, 2024

Huh, I thought they can be different in regards to memory layout too (especially around padding after last field), but apparently not. I stand corrected.

Do you want to perform this rewrite to DST yourself or would you rather prefer a PR?

from bytes.

dtolnay avatar dtolnay commented on September 14, 2024

I won't get to it soon so a PR would be better. Thanks!

from bytes.

RReverser avatar RReverser commented on September 14, 2024

This is somewhat bigger change, so it will take me some time to get around to it too, but I'll try to revisit this in a week or so.

from bytes.

RReverser avatar RReverser commented on September 14, 2024

Should ByteBuf in that case be changed to deref to Bytes instead of [u8]?

from bytes.

dtolnay avatar dtolnay commented on September 14, 2024

Fixed in 0.11.0.

from bytes.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.