#![deny(missing_docs)]
use core::cmp::Ordering;
use core::ops::{Deref, Range};
use arrow_buffer::{ArrowNativeType, Buffer as ArrowBuffer, MutableBuffer as ArrowMutableBuffer};
pub use string::*;
mod flexbuffers;
pub mod io_buf;
mod string;
#[derive(Debug, Clone)]
pub struct Buffer(Inner);
#[derive(Debug, Clone)]
enum Inner {
Arrow(ArrowBuffer),
Bytes(bytes::Bytes),
}
unsafe impl Send for Buffer {}
unsafe impl Sync for Buffer {}
impl Buffer {
pub fn from_len_zeroed(len: usize) -> Self {
Self::from(ArrowMutableBuffer::from_len_zeroed(len))
}
pub fn len(&self) -> usize {
match &self.0 {
Inner::Arrow(b) => b.len(),
Inner::Bytes(b) => b.len(),
}
}
pub fn is_empty(&self) -> bool {
match &self.0 {
Inner::Arrow(b) => b.is_empty(),
Inner::Bytes(b) => b.is_empty(),
}
}
#[allow(clippy::same_name_method)]
pub fn slice(&self, range: Range<usize>) -> Self {
match &self.0 {
Inner::Arrow(b) => Buffer(Inner::Arrow(
b.slice_with_length(range.start, range.end - range.start),
)),
Inner::Bytes(b) => {
if range.is_empty() {
let mut empty_b = b.clone();
empty_b.truncate(0);
Buffer(Inner::Bytes(empty_b))
} else {
Buffer(Inner::Bytes(b.slice(range)))
}
}
}
}
#[allow(clippy::same_name_method)]
pub fn as_slice(&self) -> &[u8] {
match &self.0 {
Inner::Arrow(b) => b.as_ref(),
Inner::Bytes(b) => b.as_ref(),
}
}
pub fn into_vec<T: ArrowNativeType>(self) -> Result<Vec<T>, Self> {
match self.0 {
Inner::Arrow(buffer) => buffer.into_vec::<T>().map_err(|b| Buffer(Inner::Arrow(b))),
Inner::Bytes(_) => Err(self),
}
}
pub fn into_arrow(self) -> ArrowBuffer {
match self.0 {
Inner::Arrow(a) => a,
Inner::Bytes(b) => ArrowBuffer::from_bytes(b.into()),
}
}
}
impl Deref for Buffer {
type Target = [u8];
fn deref(&self) -> &Self::Target {
self.as_slice()
}
}
impl AsRef<[u8]> for Buffer {
fn as_ref(&self) -> &[u8] {
self.as_slice()
}
}
impl From<&[u8]> for Buffer {
fn from(value: &[u8]) -> Self {
Buffer(Inner::Arrow(ArrowBuffer::from(value)))
}
}
impl<T: ArrowNativeType> From<Vec<T>> for Buffer {
fn from(value: Vec<T>) -> Self {
Buffer(Inner::Arrow(ArrowBuffer::from_vec(value)))
}
}
impl From<bytes::Bytes> for Buffer {
fn from(value: bytes::Bytes) -> Self {
Buffer(Inner::Bytes(value))
}
}
impl From<ArrowBuffer> for Buffer {
fn from(value: ArrowBuffer) -> Self {
Buffer(Inner::Arrow(value))
}
}
impl From<ArrowMutableBuffer> for Buffer {
fn from(value: ArrowMutableBuffer) -> Self {
Buffer(Inner::Arrow(ArrowBuffer::from(value)))
}
}
impl PartialEq for Buffer {
fn eq(&self, other: &Self) -> bool {
self.as_ref().eq(other.as_ref())
}
}
impl Eq for Buffer {}
impl PartialOrd for Buffer {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
self.as_ref().partial_cmp(other.as_ref())
}
}