Add RefEncode, and make Encode bounds required#14
Merged
Conversation
Arguments as well as return types. This is a breaking change, but the change is for the better since enabling the `verify_message` feature would break crates that weren't tested with that. Also, this opens up for more possibilities in improving how encodings work.
This means you now only have to implement `RefEncode`, and not both `&Encode` and `&mut Encode` (whom should always yield the same results anyway). This setup is much better for generic code, including fixing a bunch of encoding issues in objc_foundation. Also adds a bunch more documentation.
Implements Encode from pointers to pointers to pointers and so on.
- RefEncode (Encode already exist) for [T; LENGTH] - Both for ManuallyDrop<T> - Both for Pin<T> - Both for NonNull<T> - Both for Option<NonNull<T>>
Also moves EncodeArguments to objc_encode crate.
I can't imagine a case where you'd have a type that you can send messages to, but that can't be encoded as an Objective-C type-encoding, and having this a requirement makes downstream usage (e.g. objc_foundation) much nicer!
a4b19de to
b3ecc1e
Compare
Also moves the primary documentation into the README.md
This was referenced Sep 5, 2021
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds
RefEncodewhich represents types whoose pointers has an encoding. This means you now only have to implementRefEncode, and not both&Encodeand&mut Encode(whom should always yield the same results anyway).This setup is much better for generic code like in
Message, which now requires implementations to implementRefEncode(which they should do anyhow).This fixes SSheldon/rust-objc#80 because you're now required to annotate types that can be sent in a message (and then you can avoid
Droptypes), which vastly cuts down on footguns with usingmsg_send.Also fixes SSheldon/rust-objc#26 by using the
Encode/RefEncodesplit (instead of specialization).Note: This design has already been explored in SSheldon/rust-objc#13, but was removed, I think because it didn't seem that nice, but anyhow, that was in 2015. Going through the bounds in
objc_foundationit quickly becomes really, really difficult to do withoutRefEncode, becauseRefEncodeis kinda fundamental.Lastly, this fixes SSheldon/rust-objc-foundation#2 by going back to the original design from above.