#[cfg(no_std)]
use alloc::{
boxed::Box,
vec::IntoIter as VecIntoIter,
vec::Vec
};
#[cfg(no_std)]
use core::{
ops::{Deref, DerefMut},
slice::{Iter, IterMut}
};
#[cfg(not(no_std))]
use std::{
ops::{Deref, DerefMut},
slice::{Iter, IterMut},
vec::IntoIter as VecIntoIter
};
use super::MAX_ARG_COUNT;
use crate::Argument;
#[repr(transparent)]
#[derive(Clone, Debug)]
pub struct Arguments<'a>
{
table: Box<[Argument<'a>]>
}
impl<'a> Deref for Arguments<'a>
{
type Target = [Argument<'a>];
#[inline(always)]
fn deref(&self) -> &[Argument<'a>]
{
&self.table
}
}
impl<'a> DerefMut for Arguments<'a>
{
#[inline(always)]
fn deref_mut(&mut self) -> &mut [Argument<'a>]
{
&mut self.table
}
}
impl<'a> Arguments<'a>
{
#[inline(always)]
pub fn from_boxed_args(args: Box<[Argument<'a>]>) -> Result<Self, Box<[Argument<'a>]>>
{
if args.len() <= MAX_ARG_COUNT
{
Ok
(
Self
{
table: args
}
)
}
else { Err(args) }
}
#[inline(always)]
pub fn from_args(args: Vec<Argument<'a>>) -> Result<Self, Vec<Argument<'a>>>
{
if args.len() <= MAX_ARG_COUNT
{
Ok
(
Self
{
table: args.into_boxed_slice()
}
)
}
else { Err(args) }
}
#[inline(always)]
pub fn create_from_iter<T>(args: T) -> Result<Self, Vec<Argument<'a>>>
where
T: Iterator<Item = Argument<'a>> + ExactSizeIterator
{
if args.len() <= MAX_ARG_COUNT
{
Ok(Self
{
table: args.collect()
}
)
}
else
{
Err(args.collect())
}
}
#[inline(always)]
pub fn iter(&self) -> Iter<'_, Argument<'a>>
{
self.table.iter()
}
#[inline(always)]
pub fn iter_mut(&mut self) -> IterMut<'_, Argument<'a>>
{
self.table.iter_mut()
}
}
impl<'a> IntoIterator for Arguments<'a>
{
type Item = Argument<'a>;
type IntoIter = VecIntoIter<Argument<'a>>;
#[inline(always)]
fn into_iter(self) -> VecIntoIter<Argument<'a>>
{
self.table.into_iter()
}
}