#![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 enum Buffer {
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 {
Self::Arrow(b) => b.len(),
Self::Bytes(b) => b.len(),
}
}
pub fn is_empty(&self) -> bool {
match self {
Self::Arrow(b) => b.is_empty(),
Self::Bytes(b) => b.is_empty(),
}
}
#[allow(clippy::same_name_method)]
pub fn slice(&self, range: Range<usize>) -> Self {
match self {
Self::Arrow(b) => {
Self::Arrow(b.slice_with_length(range.start, range.end - range.start))
}
Self::Bytes(b) => {
if range.is_empty() {
let mut empty_b = b.clone();
empty_b.truncate(0);
Self::Bytes(empty_b)
} else {
Self::Bytes(b.slice(range))
}
}
}
}
#[allow(clippy::same_name_method)]
pub fn as_slice(&self) -> &[u8] {
match self {
Self::Arrow(b) => b.as_ref(),
Self::Bytes(b) => b.as_ref(),
}
}
pub fn into_vec<T: ArrowNativeType>(self) -> Result<Vec<T>, Self> {
match self {
Self::Arrow(buffer) => buffer.into_vec::<T>().map_err(Buffer::Arrow),
Self::Bytes(_) => Err(self),
}
}
pub fn into_arrow(self) -> ArrowBuffer {
match self {
Buffer::Arrow(a) => a,
Buffer::Bytes(b) => ArrowBuffer::from_vec(Vec::<u8>::from(b)),
}
}
}
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 {
Self::Arrow(ArrowBuffer::from(value))
}
}
impl<T: ArrowNativeType> From<Vec<T>> for Buffer {
fn from(value: Vec<T>) -> Self {
Self::Arrow(ArrowBuffer::from_vec(value))
}
}
impl From<bytes::Bytes> for Buffer {
fn from(value: bytes::Bytes) -> Self {
Self::Bytes(value)
}
}
impl From<ArrowBuffer> for Buffer {
fn from(value: ArrowBuffer) -> Self {
Self::Arrow(value)
}
}
impl From<ArrowMutableBuffer> for Buffer {
fn from(value: ArrowMutableBuffer) -> Self {
Self::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())
}
}