use core::ops::Deref;
use core::ops::DerefMut;
use crate::alloc::Vec;
use crate::ctor;
use crate::ctor::Handler;
use crate::ctx::Match;
use crate::debug_ctor_beg;
use crate::debug_ctor_reval;
use crate::debug_regex_beg;
use crate::debug_regex_reval;
use crate::err::Error;
use crate::regex;
use crate::regex::Regex;
use crate::regex::impl_not_for_regex;
use crate::span::Span;
use super::Ctor;
use super::r2r;
use super::r2r_kv;
use super::sel;
use super::sel_kv;
#[derive(Debug, Clone)]
pub struct Vector<T> {
inner: Vec<T>,
longest: bool,
}
impl_not_for_regex!(Vector<T>);
impl<T> Vector<T> {
pub const fn new(inner: Vec<T>, longest: bool) -> Self {
Self { inner, longest }
}
pub const fn longest(&self) -> bool {
self.longest
}
pub fn set_longest(&mut self, longest: bool) -> &mut Self {
self.longest = longest;
self
}
pub fn with_longest(mut self, longest: bool) -> Self {
self.set_longest(longest);
self
}
}
impl<T> Deref for Vector<T> {
type Target = Vec<T>;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl<T> DerefMut for Vector<T> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.inner
}
}
impl<'a, C, T, O, H> Ctor<C, O, H> for Vector<T>
where
T: Ctor<C, O, H>,
C: Match<'a>,
H: Handler<C>,
{
#[inline(always)]
fn construct(&self, ctx: &mut C, func: &mut H) -> Result<O, Error> {
let beg = ctx.offset();
debug_ctor_beg!("Vector", beg);
let ret = if self.longest {
let handler = ctor::handler_ltm(Error::Vector, sel, r2r);
handler(&self.inner, ctx, func)
} else {
let handler = ctor::handler(Error::Vector, sel, r2r);
handler(&self.inner, ctx, func)
};
debug_ctor_reval!("Vector", beg, ctx.offset(), ret.is_ok());
ret
}
}
impl<'a, C, T> Regex<C> for Vector<T>
where
T: Regex<C>,
C: Match<'a>,
{
#[inline(always)]
fn try_parse(&self, ctx: &mut C) -> Result<Span, Error> {
debug_regex_beg!("Vector", ctx.offset());
let ret = if self.longest {
let handler = regex::handler_ltm(Error::Vector, sel);
handler(&self.inner, ctx)
} else {
let handler = regex::handler(Error::Vector, sel);
handler(&self.inner, ctx)
};
debug_regex_reval!("Vector", ret)
}
}
#[derive(Debug, Clone)]
pub struct PairVector<T, V> {
inner: Vec<(T, V)>,
longest: bool,
}
impl_not_for_regex!(PairVector<T, V>);
impl<T, V> PairVector<T, V> {
pub const fn new(inner: Vec<(T, V)>, longest: bool) -> Self {
Self { inner, longest }
}
pub const fn longest(&self) -> bool {
self.longest
}
pub fn set_longest(&mut self, longest: bool) -> &mut Self {
self.longest = longest;
self
}
pub fn with_longest(mut self, longest: bool) -> Self {
self.set_longest(longest);
self
}
}
impl<T, V> Deref for PairVector<T, V> {
type Target = Vec<(T, V)>;
fn deref(&self) -> &Self::Target {
&self.inner
}
}
impl<T, V> DerefMut for PairVector<T, V> {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.inner
}
}
impl<'a, C, T, O, V, H> Ctor<C, (O, V), H> for PairVector<T, V>
where
V: Clone,
T: Ctor<C, O, H>,
C: Match<'a>,
H: Handler<C>,
{
#[inline(always)]
fn construct(&self, ctx: &mut C, func: &mut H) -> Result<(O, V), Error> {
let beg = ctx.offset();
debug_ctor_beg!("PairVector", beg);
let ret = if self.longest {
let handler = ctor::handler_ltm(Error::PairVector, sel_kv, r2r_kv);
handler(&self.inner, ctx, func)
} else {
let handler = ctor::handler(Error::PairVector, sel_kv, r2r_kv);
handler(&self.inner, ctx, func)
};
debug_ctor_reval!("PairVector", beg, ctx.offset(), ret.is_ok());
ret
}
}
impl<'a, C, T, V> Regex<C> for PairVector<T, V>
where
T: Regex<C>,
C: Match<'a>,
{
#[inline(always)]
fn try_parse(&self, ctx: &mut C) -> Result<Span, Error> {
debug_regex_beg!("PairVector", ctx.offset());
let ret = if self.longest {
let handler = regex::handler_ltm(Error::PairVector, sel_kv);
handler(&self.inner, ctx)
} else {
let handler = regex::handler(Error::PairVector, sel_kv);
handler(&self.inner, ctx)
};
debug_regex_reval!("PairVector", ret)
}
}