use core::ops::Deref;
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::span::Span;
use super::Ctor;
use super::r2r;
use super::r2r_kv;
use super::sel;
use super::sel_kv;
#[derive(Debug, Clone, Copy)]
pub struct Slice<'a, T> {
inner: &'a [T],
longest: bool,
}
impl<T> core::ops::Not for Slice<'_, T> {
type Output = crate::regex::Assert<Self>;
fn not(self) -> Self::Output {
crate::regex::not(self)
}
}
impl<'a, T> Slice<'a, T> {
pub const fn new(inner: &'a [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 Slice<'_, T> {
type Target = [T];
fn deref(&self) -> &Self::Target {
self.inner
}
}
impl<'a, C, T, O, H> Ctor<C, O, H> for Slice<'_, 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!("Slice", beg);
let ret = if self.longest {
let handler = ctor::handler_ltm(Error::Slice, sel, r2r);
handler(self.inner, ctx, func)
} else {
let handler = ctor::handler(Error::Slice, sel, r2r);
handler(self.inner, ctx, func)
};
debug_ctor_reval!("Slice", beg, ctx.offset(), ret.is_ok());
ret
}
}
impl<'a, C, T> Regex<C> for Slice<'_, T>
where
T: Regex<C>,
C: Match<'a>,
{
#[inline(always)]
fn try_parse(&self, ctx: &mut C) -> Result<Span, Error> {
debug_regex_beg!("Slice", ctx.offset());
let ret = if self.longest {
let handler = regex::handler_ltm(Error::Slice, sel);
handler(self.inner, ctx)
} else {
let handler = regex::handler(Error::Slice, sel);
handler(self.inner, ctx)
};
debug_regex_reval!("Slice", ret)
}
}
#[derive(Debug, Clone, Copy)]
pub struct PairSlice<'a, K, V> {
inner: &'a [(K, V)],
longest: bool,
}
impl<K, V> core::ops::Not for PairSlice<'_, K, V> {
type Output = crate::regex::Assert<Self>;
fn not(self) -> Self::Output {
crate::regex::not(self)
}
}
impl<'a, K, V> PairSlice<'a, K, V> {
pub const fn new(inner: &'a [(K, 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<K, V> Deref for PairSlice<'_, K, V> {
type Target = [(K, V)];
fn deref(&self) -> &Self::Target {
self.inner
}
}
impl<'a, C, K, O, V, H> Ctor<C, (O, V), H> for PairSlice<'_, K, V>
where
V: Clone,
K: 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 bwg = ctx.offset();
debug_ctor_beg!("PairSlice", bwg);
let ret = if self.longest {
let handler = ctor::handler_ltm(Error::PairSlice, sel_kv, r2r_kv);
handler(self.inner, ctx, func)
} else {
let handler = ctor::handler(Error::PairSlice, sel_kv, r2r_kv);
handler(self.inner, ctx, func)
};
debug_ctor_reval!("PairSlice", bwg, ctx.offset(), ret.is_ok());
ret
}
}
impl<'a, C, K, V> Regex<C> for PairSlice<'_, K, V>
where
K: Regex<C>,
C: Match<'a>,
{
#[inline(always)]
fn try_parse(&self, ctx: &mut C) -> Result<Span, Error> {
debug_regex_beg!("PairSlice", ctx.offset());
let ret = if self.longest {
let handler = regex::handler_ltm(Error::PairSlice, sel_kv);
handler(self.inner, ctx)
} else {
let handler = regex::handler(Error::PairSlice, sel_kv);
handler(self.inner, ctx)
};
debug_regex_reval!("PairSlice", ret)
}
}