carla 0.14.1

Rust client library for Carla simulator
Documentation
//! Internal utilities.

#[cfg(not(carla_version_0100))]
use carla_sys::{
    carla::rpc::WheelPhysicsControl, carla_rust::utils::new_wheel_physics_control_vector,
};
use carla_sys::{
    carla::{geom::Vector2D, rpc::GearPhysicsControl},
    carla_rust::{
        geom::FfiLocation,
        utils::{
            new_ffi_location_vector, new_float_vector, new_gear_physics_control_vector,
            new_uint8_t_vector, new_uint32_t_vector, new_uint64_t_vector, new_vector_2d_vector,
        },
    },
};
use cxx::{CxxVector, ExternType, UniquePtr, kind::Trivial, vector::VectorElement};

pub trait NewCxxVectorElement
where
    Self: VectorElement + ExternType<Kind = Trivial>,
{
    fn new_vector() -> UniquePtr<CxxVector<Self>>;
}

impl NewCxxVectorElement for u8 {
    fn new_vector() -> UniquePtr<CxxVector<Self>> {
        new_uint8_t_vector()
    }
}

impl NewCxxVectorElement for u32 {
    fn new_vector() -> UniquePtr<CxxVector<Self>> {
        new_uint32_t_vector()
    }
}

impl NewCxxVectorElement for u64 {
    fn new_vector() -> UniquePtr<CxxVector<Self>> {
        new_uint64_t_vector()
    }
}

impl NewCxxVectorElement for Vector2D {
    fn new_vector() -> UniquePtr<CxxVector<Self>> {
        new_vector_2d_vector()
    }
}

impl NewCxxVectorElement for GearPhysicsControl {
    fn new_vector() -> UniquePtr<CxxVector<Self>> {
        new_gear_physics_control_vector()
    }
}

#[cfg(not(carla_version_0100))]
impl NewCxxVectorElement for WheelPhysicsControl {
    fn new_vector() -> UniquePtr<CxxVector<Self>> {
        new_wheel_physics_control_vector()
    }
}

impl NewCxxVectorElement for f32 {
    fn new_vector() -> UniquePtr<CxxVector<Self>> {
        new_float_vector()
    }
}

impl NewCxxVectorElement for FfiLocation {
    fn new_vector() -> UniquePtr<CxxVector<Self>> {
        new_ffi_location_vector()
    }
}

// impl NewCxxVectorElement for SharedPtr<FfiActor> {
//     fn new_vector() -> UniquePtr<CxxVector<Self>> {
//         new_ffi_location_vector()
//     }
// }

pub trait CxxVectorExt<T>
where
    T: NewCxxVectorElement,
{
    fn new_typed() -> UniquePtr<CxxVector<T>> {
        T::new_vector()
    }
}

impl<T> CxxVectorExt<T> for CxxVector<T> where T: NewCxxVectorElement {}

pub trait IteratorExt
where
    Self: Iterator,
{
    fn collect_cxx_vector(self) -> UniquePtr<CxxVector<Self::Item>>
    where
        Self::Item: NewCxxVectorElement;
}

impl<I> IteratorExt for I
where
    I: Iterator,
{
    fn collect_cxx_vector(self) -> UniquePtr<CxxVector<Self::Item>>
    where
        Self::Item: NewCxxVectorElement,
    {
        let mut vec = Self::Item::new_vector();
        self.for_each(|item| vec.pin_mut().push(item));
        vec
    }
}