use alloc::vec::Vec;
use core::ops::{Deref, DerefMut, RangeBounds};
#[repr(transparent)]
pub struct Column<T> {
inner: Vec<T>,
}
impl<T> Column<T> {
#[inline]
pub fn with_capacity(capacity: usize) -> Self {
Column {
inner: Vec::with_capacity(capacity),
}
}
#[inline]
pub fn from_vec(inner: Vec<T>) -> Self {
Column { inner }
}
#[inline]
pub unsafe fn from_raw_parts(
ptr: *mut T,
length: usize,
capacity: usize,
) -> Self {
Column {
inner: unsafe { Vec::from_raw_parts(ptr, length, capacity) },
}
}
#[inline]
pub fn capacity(&self) -> usize {
self.inner.capacity()
}
#[inline]
pub fn reserve(&mut self, additional: usize) {
self.inner.reserve(additional);
}
#[inline]
pub fn reserve_exact(&mut self, additional: usize) {
self.inner.reserve_exact(additional);
}
#[inline]
pub fn shrink_to_fit(&mut self) {
self.inner.shrink_to_fit();
}
#[inline]
pub fn as_slice(&self) -> &[T] {
self.inner.as_slice()
}
#[inline]
pub fn as_mut_slice(&mut self) -> &mut [T] {
self.inner.as_mut_slice()
}
#[inline]
pub fn as_ptr(&self) -> *const T {
self.inner.as_ptr()
}
#[inline]
pub fn as_mut_ptr(&mut self) -> *mut T {
self.inner.as_mut_ptr()
}
#[inline]
pub unsafe fn push(&mut self, value: T) {
self.inner.push(value);
}
#[inline]
pub unsafe fn pop(&mut self) -> Option<T> {
self.inner.pop()
}
#[inline]
pub unsafe fn insert(&mut self, index: usize, element: T) {
self.inner.insert(index, element);
}
#[inline]
pub unsafe fn remove(&mut self, index: usize) -> T {
self.inner.remove(index)
}
#[inline]
pub unsafe fn swap_remove(&mut self, index: usize) -> T {
self.inner.swap_remove(index)
}
#[inline]
pub unsafe fn truncate(&mut self, len: usize) {
self.inner.truncate(len);
}
#[inline]
pub unsafe fn resize(&mut self, new_len: usize, value: T)
where
T: Clone,
{
self.inner.resize(new_len, value);
}
#[inline]
pub unsafe fn clear(&mut self) {
self.inner.clear();
}
#[inline]
pub unsafe fn split_off(&mut self, at: usize) -> Column<T> {
Column {
inner: self.inner.split_off(at),
}
}
#[inline]
pub unsafe fn drain<R>(&mut self, range: R) -> alloc::vec::Drain<'_, T>
where
R: RangeBounds<usize>,
{
self.inner.drain(range)
}
#[inline]
pub unsafe fn extend_from_slice(&mut self, other: &[T])
where
T: Clone,
{
self.inner.extend_from_slice(other);
}
#[inline]
pub unsafe fn append(&mut self, other: &mut Column<T>) {
self.inner.append(&mut other.inner);
}
}
impl<T> Deref for Column<T> {
type Target = [T];
#[inline]
fn deref(&self) -> &[T] {
&self.inner
}
}
impl<T> DerefMut for Column<T> {
#[inline]
fn deref_mut(&mut self) -> &mut [T] {
&mut self.inner
}
}
impl<'a, T> IntoIterator for &'a Column<T> {
type Item = &'a T;
type IntoIter = core::slice::Iter<'a, T>;
#[inline]
fn into_iter(self) -> Self::IntoIter {
self.inner.iter()
}
}
impl<'a, T> IntoIterator for &'a mut Column<T> {
type Item = &'a mut T;
type IntoIter = core::slice::IterMut<'a, T>;
#[inline]
fn into_iter(self) -> Self::IntoIter {
self.inner.iter_mut()
}
}
impl<T> Default for Column<T> {
#[inline]
fn default() -> Self {
Column { inner: Vec::new() }
}
}
impl<T: Clone> Clone for Column<T> {
#[inline]
fn clone(&self) -> Self {
Column {
inner: self.inner.clone(),
}
}
}
impl<T: core::fmt::Debug> core::fmt::Debug for Column<T> {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
core::fmt::Debug::fmt(&self.inner, f)
}
}
impl<T: PartialEq> PartialEq for Column<T> {
#[inline]
fn eq(&self, other: &Self) -> bool {
self.inner == other.inner
}
}
impl<T: Eq> Eq for Column<T> {}
impl<T: PartialOrd> PartialOrd for Column<T> {
#[inline]
fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
self.inner.partial_cmp(&other.inner)
}
}
impl<T: Ord> Ord for Column<T> {
#[inline]
fn cmp(&self, other: &Self) -> core::cmp::Ordering {
self.inner.cmp(&other.inner)
}
}
impl<T: core::hash::Hash> core::hash::Hash for Column<T> {
fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
self.inner.hash(state);
}
}
#[cfg(feature = "serde")]
impl<T: serde::Serialize> serde::Serialize for Column<T> {
fn serialize<S: serde::Serializer>(
&self,
serializer: S,
) -> Result<S::Ok, S::Error> {
self.inner.serialize(serializer)
}
}
#[cfg(feature = "serde")]
impl<'de, T: serde::Deserialize<'de>> serde::Deserialize<'de> for Column<T> {
fn deserialize<D: serde::Deserializer<'de>>(
deserializer: D,
) -> Result<Self, D::Error> {
Vec::deserialize(deserializer).map(|inner| Column { inner })
}
}