use crate::prelude::ffi::{self};
use autocxx::prelude::*;
pub struct DracoStatus(pub(crate) UniquePtr<ffi::draco::Status>);
impl std::fmt::Display for DracoStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self.0.as_ref() {
Some(status) => write!(f, "{:?}", status.error_msg_string()),
None => write!(f, "unable to access underlying draco status"),
}
}
}
impl std::fmt::Debug for DracoStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "DracoStatus({})", self)
}
}
impl From<UniquePtr<ffi::draco::Status>> for DracoStatus {
fn from(status: UniquePtr<ffi::draco::Status>) -> Self {
Self(status)
}
}
impl std::error::Error for DracoStatus {}
pub type DracoStatusType<T> = Result<T, DracoStatus>;
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub struct AttrId(pub i32);
impl AttrId {
pub fn as_u32(&self) -> u32 {
self.0 as u32
}
}
impl From<c_int> for AttrId {
fn from(value: c_int) -> Self {
Self(value.0)
}
}
impl From<AttrId> for c_int {
fn from(value: AttrId) -> Self {
c_int::from(value.0)
}
}
impl From<u32> for ffi::draco::PointIndex {
fn from(val: u32) -> Self {
ffi::draco::PointIndex { val }
}
}
impl From<usize> for ffi::draco::PointIndex {
fn from(val: usize) -> Self {
ffi::draco::PointIndex { val: val as u32 }
}
}
impl From<i32> for ffi::draco::PointIndex {
fn from(val: i32) -> Self {
ffi::draco::PointIndex { val: val as u32 }
}
}
pub struct WrappedDracoObject<T>(pub(super) UniquePtr<T>)
where
T: cxx::memory::UniquePtrTarget;
pub trait GetDracoInner {
type Inner;
fn get_inner(&self) -> &UniquePtr<Self::Inner>
where
Self::Inner: cxx::memory::UniquePtrTarget;
fn get_inner_mut(&mut self) -> &mut UniquePtr<Self::Inner>
where
Self::Inner: cxx::memory::UniquePtrTarget;
}
impl<T> GetDracoInner for WrappedDracoObject<T>
where
T: cxx::memory::UniquePtrTarget,
{
type Inner = T;
fn get_inner(&self) -> &UniquePtr<T> {
&self.0
}
fn get_inner_mut(&mut self) -> &mut UniquePtr<T> {
&mut self.0
}
}