use std::ops::Deref;
use vortex_buffer::Buffer;
use vortex_error::VortexResult;
use vortex_error::vortex_bail;
#[derive(Clone, Debug)]
pub struct StrictSortedBuffer<T> {
buffer: Buffer<T>,
}
impl<T> StrictSortedBuffer<T> {
pub unsafe fn new_unchecked(buffer: Buffer<T>) -> Self {
Self { buffer }
}
pub fn into_inner(self) -> Buffer<T> {
self.buffer
}
}
impl<T: Ord> StrictSortedBuffer<T> {
pub fn try_new(buffer: Buffer<T>) -> VortexResult<Self> {
for (idx, window) in buffer.windows(2).enumerate() {
if window[0] >= window[1] {
vortex_bail!(
"buffer values must be strictly increasing at positions {} and {}",
idx,
idx + 1
);
}
}
Ok(Self { buffer })
}
}
impl<T> Default for StrictSortedBuffer<T> {
fn default() -> Self {
Self {
buffer: Buffer::default(),
}
}
}
impl<T> Deref for StrictSortedBuffer<T> {
type Target = Buffer<T>;
fn deref(&self) -> &Self::Target {
&self.buffer
}
}
#[cfg(test)]
mod tests {
use vortex_buffer::Buffer;
use super::StrictSortedBuffer;
#[test]
fn rejects_unsorted_values() {
let err = StrictSortedBuffer::try_new(Buffer::from_iter([3, 1])).unwrap_err();
assert!(err.to_string().contains("strictly increasing"));
}
#[test]
fn rejects_duplicate_values() {
let err = StrictSortedBuffer::try_new(Buffer::from_iter([1, 1])).unwrap_err();
assert!(err.to_string().contains("strictly increasing"));
}
}