cel_cxx_ffi/
cxx.rs

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}