1use std::pin::Pin;
2
3#[cxx::bridge]
4mod ffi {
5 #[namespace = "rust::cel_cxx"]
6 unsafe extern "C++" {
7 include!(<cel-cxx-ffi/include/cxx.h>);
8 fn CxxString_size_of() -> usize;
9 }
10}
11
12impl crate::SizedExternType for cxx::CxxString {
13 fn size_of() -> usize {
14 ffi::CxxString_size_of()
15 }
16}
17
18impl crate::absl::SpanElement for cxx::CxxString {
19 type TypeId = cxx::type_id!("rust::cel_cxx::Span_CxxString");
20}
21
22
23pub trait CxxVectorExt<T: cxx::memory::UniquePtrTarget>: private::Sealed {
24 fn push_unique(self: Pin<&mut Self>, value: cxx::UniquePtr<T>);
25 fn pop_unique(self: Pin<&mut Self>) -> Option<cxx::UniquePtr<T>>;
26}
27
28impl<T: UniquePtrVectorElement> CxxVectorExt<T> for cxx::CxxVector<T> {
29 fn push_unique(self: Pin<&mut Self>, value: cxx::UniquePtr<T>) {
30 T::push_unique(self, value);
31 }
32
33 fn pop_unique(self: Pin<&mut Self>) -> Option<cxx::UniquePtr<T>> {
34 if self.is_empty() {
35 return None;
36 }
37 Some(T::pop_unique(self))
38 }
39}
40impl<T: cxx::memory::UniquePtrTarget> private::Sealed for cxx::CxxVector<T> {}
41
42pub unsafe trait UniquePtrVectorElement: cxx::vector::VectorElement + cxx::memory::UniquePtrTarget {
43 fn push_unique(v: Pin<&mut cxx::CxxVector<Self>>, value: cxx::UniquePtr<Self>);
44 fn pop_unique(v: Pin<&mut cxx::CxxVector<Self>>) -> cxx::UniquePtr<Self>;
45}
46
47mod private {
48 pub trait Sealed {}
49}