use crate::{Error, Result};
use opensubdiv_petite_sys as sys;
use std::convert::TryInto;
#[repr(C)]
#[derive(Copy, Clone, Debug, PartialEq)]
pub struct BufferDescriptor(pub(crate) sys::osd::BufferDescriptor);
impl BufferDescriptor {
pub fn new(offset: usize, length: usize, stride: usize) -> Result<Self> {
Ok(Self(sys::osd::BufferDescriptor {
offset: offset.try_into().map_err(|_| Error::InvalidBufferSize {
expected: offset,
actual: i32::MAX as usize,
})?,
length: length.try_into().map_err(|_| Error::InvalidBufferSize {
expected: length,
actual: i32::MAX as usize,
})?,
stride: stride.try_into().map_err(|_| Error::InvalidBufferSize {
expected: stride,
actual: i32::MAX as usize,
})?,
}))
}
pub fn local_offset(&self) -> usize {
if self.0.stride != 0 {
(self.0.offset % self.0.stride) as _
} else {
0
}
}
pub fn is_valid(&self) -> bool {
(self.0.length != 0) && (self.0.length <= self.0.stride - (self.local_offset() as i32))
}
pub fn is_empty(&self) -> bool {
0 == self.0.length
}
}
impl Default for BufferDescriptor {
fn default() -> Self {
Self(sys::osd::BufferDescriptor {
offset: 0,
length: 0,
stride: 0,
})
}
}