cxx icon indicating copy to clipboard operation
cxx copied to clipboard

CxxVector<*mut Thing>

Open adetaylor opened this issue 4 years ago • 4 comments

I had a crack at implementing CxxVector<*mut T> and CxxVector<*const T> here:

https://github.com/dtolnay/cxx/compare/master...adetaylor:ptr-vecs-wip

It didn't work out too well, (I think) because we try to impl ::cxx::private::VectorElement for *const BlobstoreClient and the orphan rule doesn't appear to allow us to do this.

error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
  --> demo/src/main.rs:26:33
   |
1  | #[cxx::bridge(namespace = "org::blobstore")]
   | -------------------------------------------- `*const BlobstoreClient` is not defined in the current crate
...
26 |                 fn foo(n: u64) -> UniquePtr<CxxVector<*const BlobstoreClient>>;
   |                                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl doesn't use only types from inside the current crate
   |
   = note: define and implement a trait or new type instead

error: aborting due to previous error

For more information about this error, try `rustc --explain E0117`.

I may have the wrong idea for what went wrong here, but it looks like RFC1023 does indeed mention references but not pointers.

I'm unlikely to come back to this any time soon but thought I'd report my findings.

adetaylor avatar Mar 29 '21 05:03 adetaylor

I have not looked at your branch but naively I would expect to see:

// cxx crate
unsafe impl<T: MutPtrVectorElement> VectorElement for *mut T {}

// downstream crate
unsafe impl MutPtrVectorElement for Thing {}

Alternatively it's probably fine to assume std::vector<T*> has a consistent layout independent of T, and have just one impl instead of a generic one.

dtolnay avatar Mar 29 '21 06:03 dtolnay

Thanks, that points me in the right direction.

adetaylor avatar Mar 29 '21 15:03 adetaylor

@adetaylor Is there something holding up that pull request (1375) beyond some merge conflicts? I'm working on a project where this would reduce an incredible amount of boilerplate and I'm not opposed to helping push it over the finish line.

Perhaps @dtolnay knows (sorry I'm sure you're incredibly busy)?

ulchie avatar Mar 11 '25 16:03 ulchie

@adetaylor Is there something holding up that pull request (1375) beyond some merge conflicts? I'm working on a project where this would reduce an incredible amount of boilerplate and I'm not opposed to helping push it over the finish line.

Perhaps @dtolnay knows (sorry I'm sure you're incredibly busy)?

Idk but I guess that cxx just wants to update some patches in its early stages. You can see that almost all big PRs that require bumping the minor version haven't yet been merged.

makai410 avatar Apr 10 '25 13:04 makai410