Skip to content

Commit 6bd29d5

Browse files
authored
Merge pull request #453 from dtolnay/sliceconst
Rename rust::Slice<T> to rust::Slice<const T>
2 parents 8685745 + ce29823 commit 6bd29d5

File tree

6 files changed

+27
-22
lines changed

6 files changed

+27
-22
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ returns of functions.
315315
<tr><th>name in Rust</th><th>name in C++</th><th>restrictions</th></tr>
316316
<tr><td>String</td><td>rust::String</td><td></td></tr>
317317
<tr><td>&amp;str</td><td>rust::Str</td><td></td></tr>
318-
<tr><td>&amp;[u8]</td><td>rust::Slice&lt;uint8_t&gt;</td><td><sup><i>arbitrary &amp;[T] not implemented yet</i></sup></td></tr>
318+
<tr><td>&amp;[u8]</td><td>rust::Slice&lt;const uint8_t&gt;</td><td><sup><i>arbitrary &amp;[T] not implemented yet</i></sup></td></tr>
319319
<tr><td><a href="https://docs.rs/cxx/0.5/cxx/struct.CxxString.html">CxxString</a></td><td>std::string</td><td><sup><i>cannot be passed by value</i></sup></td></tr>
320320
<tr><td>Box&lt;T&gt;</td><td>rust::Box&lt;T&gt;</td><td><sup><i>cannot hold opaque C++ type</i></sup></td></tr>
321321
<tr><td><a href="https://docs.rs/cxx/0.5/cxx/struct.UniquePtr.html">UniquePtr&lt;T&gt;</a></td><td>std::unique_ptr&lt;T&gt;</td><td><sup><i>cannot hold opaque Rust type</i></sup></td></tr>

gen/src/write.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -432,7 +432,7 @@ fn write_cxx_function_shim<'a>(out: &mut OutFile<'a>, efn: &'a ExternFn) {
432432
}
433433
Some(Type::SliceRefU8(_)) if !indirect_return => {
434434
out.builtin.rust_slice_repr = true;
435-
write!(out, "::rust::impl<::rust::Slice<uint8_t>>::repr(")
435+
write!(out, "::rust::impl<::rust::Slice<const uint8_t>>::repr(")
436436
}
437437
_ => {}
438438
}
@@ -471,7 +471,7 @@ fn write_cxx_function_shim<'a>(out: &mut OutFile<'a>, efn: &'a ExternFn) {
471471
} else if let Type::SliceRefU8(_) = arg.ty {
472472
write!(
473473
out,
474-
"::rust::Slice<uint8_t>(static_cast<const uint8_t *>({0}.ptr), {0}.len)",
474+
"::rust::Slice<const uint8_t>(static_cast<const uint8_t *>({0}.ptr), {0}.len)",
475475
arg.ident,
476476
);
477477
} else if out.types.needs_indirect_abi(&arg.ty) {
@@ -688,7 +688,7 @@ fn write_rust_function_shim_impl(
688688
}
689689
Type::SliceRefU8(_) => {
690690
out.builtin.rust_slice_new = true;
691-
write!(out, "::rust::impl<::rust::Slice<uint8_t>>::slice(");
691+
write!(out, "::rust::impl<::rust::Slice<const uint8_t>>::slice(");
692692
}
693693
_ => {}
694694
}
@@ -714,7 +714,7 @@ fn write_rust_function_shim_impl(
714714
}
715715
Type::SliceRefU8(_) => {
716716
out.builtin.rust_slice_repr = true;
717-
write!(out, "::rust::impl<::rust::Slice<uint8_t>>::repr(");
717+
write!(out, "::rust::impl<::rust::Slice<const uint8_t>>::repr(");
718718
}
719719
ty if out.types.needs_indirect_abi(ty) => write!(out, "&"),
720720
_ => {}
@@ -885,7 +885,7 @@ fn write_type(out: &mut OutFile, ty: &Type) {
885885
write!(out, "::rust::Str");
886886
}
887887
Type::SliceRefU8(_) => {
888-
write!(out, "::rust::Slice<uint8_t>");
888+
write!(out, "::rust::Slice<const uint8_t>");
889889
}
890890
Type::Fn(f) => {
891891
write!(out, "::rust::{}<", if f.throws { "TryFn" } else { "Fn" });

include/cxx.h

+9-6
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,16 @@ class Str final {
9090
#ifndef CXXBRIDGE05_RUST_SLICE
9191
template <typename T>
9292
class Slice final {
93+
static_assert(std::is_const<T>::value,
94+
"&[T] needs to be written as rust::Slice<const T> in C++");
95+
9396
public:
9497
Slice() noexcept;
95-
Slice(const T *, size_t count) noexcept;
98+
Slice(T *, size_t count) noexcept;
9699

97100
Slice &operator=(const Slice<T> &) noexcept = default;
98101

99-
const T *data() const noexcept;
102+
T *data() const noexcept;
100103
size_t size() const noexcept;
101104
size_t length() const noexcept;
102105

@@ -108,7 +111,7 @@ class Slice final {
108111
friend impl<Slice>;
109112
// Not necessarily ABI compatible with &[T]. Codegen will translate to
110113
// cxx::rust_sliceu8::RustSliceU8 which matches this layout.
111-
const T *ptr;
114+
T *ptr;
112115
size_t len;
113116
};
114117
#endif // CXXBRIDGE05_RUST_SLICE
@@ -358,13 +361,13 @@ inline size_t Str::length() const noexcept { return this->len; }
358361
#ifndef CXXBRIDGE05_RUST_SLICE
359362
#define CXXBRIDGE05_RUST_SLICE
360363
template <typename T>
361-
Slice<T>::Slice() noexcept : ptr(reinterpret_cast<const T *>(this)), len(0) {}
364+
Slice<T>::Slice() noexcept : ptr(reinterpret_cast<T *>(this)), len(0) {}
362365

363366
template <typename T>
364-
Slice<T>::Slice(const T *s, size_t count) noexcept : ptr(s), len(count) {}
367+
Slice<T>::Slice(T *s, size_t count) noexcept : ptr(s), len(count) {}
365368

366369
template <typename T>
367-
const T *Slice<T>::data() const noexcept {
370+
T *Slice<T>::data() const noexcept {
368371
return this->ptr;
369372
}
370373

src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -324,7 +324,7 @@
324324
//! <tr><th>name in Rust</th><th>name in C++</th><th>restrictions</th></tr>
325325
//! <tr><td>String</td><td>rust::String</td><td></td></tr>
326326
//! <tr><td>&amp;str</td><td>rust::Str</td><td></td></tr>
327-
//! <tr><td>&amp;[u8]</td><td>rust::Slice&lt;uint8_t&gt;</td><td><sup><i>arbitrary &amp;[T] not implemented yet</i></sup></td></tr>
327+
//! <tr><td>&amp;[u8]</td><td>rust::Slice&lt;const uint8_t&gt;</td><td><sup><i>arbitrary &amp;[T] not implemented yet</i></sup></td></tr>
328328
//! <tr><td><a href="struct.CxxString.html">CxxString</a></td><td>std::string</td><td><sup><i>cannot be passed by value</i></sup></td></tr>
329329
//! <tr><td>Box&lt;T&gt;</td><td>rust::Box&lt;T&gt;</td><td><sup><i>cannot hold opaque C++ type</i></sup></td></tr>
330330
//! <tr><td><a href="struct.UniquePtr.html">UniquePtr&lt;T&gt;</a></td><td>std::unique_ptr&lt;T&gt;</td><td><sup><i>cannot hold opaque Rust type</i></sup></td></tr>

tests/ffi/tests.cc

+8-6
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,10 @@ rust::Str c_return_str(const Shared &shared) {
7676
return "2020";
7777
}
7878

79-
rust::Slice<uint8_t> c_return_sliceu8(const Shared &shared) {
79+
rust::Slice<const uint8_t> c_return_sliceu8(const Shared &shared) {
8080
(void)shared;
81-
return rust::Slice<uint8_t>(reinterpret_cast<const uint8_t *>(SLICE_DATA),
82-
sizeof(SLICE_DATA));
81+
return rust::Slice<const uint8_t>(
82+
reinterpret_cast<const uint8_t *>(SLICE_DATA), sizeof(SLICE_DATA));
8383
}
8484

8585
rust::String c_return_rust_string() { return "2020"; }
@@ -240,7 +240,7 @@ void c_take_str(rust::Str s) {
240240
}
241241
}
242242

243-
void c_take_sliceu8(rust::Slice<uint8_t> s) {
243+
void c_take_sliceu8(rust::Slice<const uint8_t> s) {
244244
if (std::string(reinterpret_cast<const char *>(s.data()), s.size()) ==
245245
"2020") {
246246
cxx_test_suite_set_correct();
@@ -436,7 +436,9 @@ const rust::String &c_try_return_ref(const rust::String &s) { return s; }
436436

437437
rust::Str c_try_return_str(rust::Str s) { return s; }
438438

439-
rust::Slice<uint8_t> c_try_return_sliceu8(rust::Slice<uint8_t> s) { return s; }
439+
rust::Slice<const uint8_t> c_try_return_sliceu8(rust::Slice<const uint8_t> s) {
440+
return s;
441+
}
440442

441443
rust::String c_try_return_rust_string() { return c_return_rust_string(); }
442444

@@ -608,7 +610,7 @@ extern "C" const char *cxx_run_test() noexcept {
608610
r_take_unique_ptr(std::unique_ptr<C>(new C{2020}));
609611
r_take_ref_c(C{2020});
610612
r_take_str(rust::Str("2020"));
611-
r_take_sliceu8(rust::Slice<uint8_t>(
613+
r_take_sliceu8(rust::Slice<const uint8_t>(
612614
reinterpret_cast<const uint8_t *>(SLICE_DATA), sizeof(SLICE_DATA)));
613615
r_take_rust_string(rust::String("2020"));
614616
r_take_unique_ptr_string(

tests/ffi/tests.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ const size_t &c_return_ns_ref(const ::A::AShared &shared);
8484
const size_t &c_return_nested_ns_ref(const ::A::B::ABShared &shared);
8585
size_t &c_return_mut(Shared &shared);
8686
rust::Str c_return_str(const Shared &shared);
87-
rust::Slice<uint8_t> c_return_sliceu8(const Shared &shared);
87+
rust::Slice<const uint8_t> c_return_sliceu8(const Shared &shared);
8888
rust::String c_return_rust_string();
8989
std::unique_ptr<std::string> c_return_unique_ptr_string();
9090
std::unique_ptr<std::vector<uint8_t>> c_return_unique_ptr_vector_u8();
@@ -114,7 +114,7 @@ void c_take_ref_r(const R &r);
114114
void c_take_ref_c(const C &c);
115115
void c_take_ref_ns_c(const ::H::H &h);
116116
void c_take_str(rust::Str s);
117-
void c_take_sliceu8(rust::Slice<uint8_t> s);
117+
void c_take_sliceu8(rust::Slice<const uint8_t> s);
118118
void c_take_rust_string(rust::String s);
119119
void c_take_unique_ptr_string(std::unique_ptr<std::string> s);
120120
void c_take_unique_ptr_vector_u8(std::unique_ptr<std::vector<uint8_t>> v);
@@ -148,7 +148,7 @@ size_t c_fail_return_primitive();
148148
rust::Box<R> c_try_return_box();
149149
const rust::String &c_try_return_ref(const rust::String &);
150150
rust::Str c_try_return_str(rust::Str);
151-
rust::Slice<uint8_t> c_try_return_sliceu8(rust::Slice<uint8_t>);
151+
rust::Slice<const uint8_t> c_try_return_sliceu8(rust::Slice<const uint8_t>);
152152
rust::String c_try_return_rust_string();
153153
std::unique_ptr<std::string> c_try_return_unique_ptr_string();
154154
rust::Vec<uint8_t> c_try_return_rust_vec();

0 commit comments

Comments
 (0)