16855e09eSopenharmony_ci#[global_allocator]
26855e09eSopenharmony_cistatic ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc;
36855e09eSopenharmony_ci
46855e09eSopenharmony_ciuse criterion::*;
56855e09eSopenharmony_ci
66855e09eSopenharmony_ciuse nom::{
76855e09eSopenharmony_ci  bytes::complete::{is_a, tag, take_till, take_while},
86855e09eSopenharmony_ci  character::complete::{alphanumeric1 as alphanumeric, char, not_line_ending, space0 as space},
96855e09eSopenharmony_ci  combinator::opt,
106855e09eSopenharmony_ci  multi::many0,
116855e09eSopenharmony_ci  sequence::{delimited, pair, terminated, tuple},
126855e09eSopenharmony_ci  IResult,
136855e09eSopenharmony_ci};
146855e09eSopenharmony_ci
156855e09eSopenharmony_ciuse std::collections::HashMap;
166855e09eSopenharmony_ci
176855e09eSopenharmony_cifn is_line_ending_or_comment(chr: char) -> bool {
186855e09eSopenharmony_ci  chr == ';' || chr == '\n'
196855e09eSopenharmony_ci}
206855e09eSopenharmony_ci
216855e09eSopenharmony_cifn space_or_line_ending(i: &str) -> IResult<&str, &str> {
226855e09eSopenharmony_ci  is_a(" \r\n")(i)
236855e09eSopenharmony_ci}
246855e09eSopenharmony_ci
256855e09eSopenharmony_cifn category(i: &str) -> IResult<&str, &str> {
266855e09eSopenharmony_ci  terminated(
276855e09eSopenharmony_ci    delimited(char('['), take_while(|c| c != ']'), char(']')),
286855e09eSopenharmony_ci    opt(is_a(" \r\n")),
296855e09eSopenharmony_ci  )(i)
306855e09eSopenharmony_ci}
316855e09eSopenharmony_ci
326855e09eSopenharmony_cifn key_value(i: &str) -> IResult<&str, (&str, &str)> {
336855e09eSopenharmony_ci  let (i, key) = alphanumeric(i)?;
346855e09eSopenharmony_ci  let (i, _) = tuple((opt(space), tag("="), opt(space)))(i)?;
356855e09eSopenharmony_ci  let (i, val) = take_till(is_line_ending_or_comment)(i)?;
366855e09eSopenharmony_ci  let (i, _) = opt(space)(i)?;
376855e09eSopenharmony_ci  let (i, _) = opt(pair(tag(";"), not_line_ending))(i)?;
386855e09eSopenharmony_ci  let (i, _) = opt(space_or_line_ending)(i)?;
396855e09eSopenharmony_ci  Ok((i, (key, val)))
406855e09eSopenharmony_ci}
416855e09eSopenharmony_ci
426855e09eSopenharmony_cifn keys_and_values_aggregator(i: &str) -> IResult<&str, Vec<(&str, &str)>> {
436855e09eSopenharmony_ci  many0(key_value)(i)
446855e09eSopenharmony_ci}
456855e09eSopenharmony_ci
466855e09eSopenharmony_cifn keys_and_values(input: &str) -> IResult<&str, HashMap<&str, &str>> {
476855e09eSopenharmony_ci  match keys_and_values_aggregator(input) {
486855e09eSopenharmony_ci    Ok((i, tuple_vec)) => Ok((i, tuple_vec.into_iter().collect())),
496855e09eSopenharmony_ci    Err(e) => Err(e),
506855e09eSopenharmony_ci  }
516855e09eSopenharmony_ci}
526855e09eSopenharmony_ci
536855e09eSopenharmony_cifn category_and_keys(i: &str) -> IResult<&str, (&str, HashMap<&str, &str>)> {
546855e09eSopenharmony_ci  pair(category, keys_and_values)(i)
556855e09eSopenharmony_ci}
566855e09eSopenharmony_ci
576855e09eSopenharmony_cifn categories_aggregator(i: &str) -> IResult<&str, Vec<(&str, HashMap<&str, &str>)>> {
586855e09eSopenharmony_ci  many0(category_and_keys)(i)
596855e09eSopenharmony_ci}
606855e09eSopenharmony_ci
616855e09eSopenharmony_cifn categories(input: &str) -> IResult<&str, HashMap<&str, HashMap<&str, &str>>> {
626855e09eSopenharmony_ci  match categories_aggregator(input) {
636855e09eSopenharmony_ci    Ok((i, tuple_vec)) => Ok((i, tuple_vec.into_iter().collect())),
646855e09eSopenharmony_ci    Err(e) => Err(e),
656855e09eSopenharmony_ci  }
666855e09eSopenharmony_ci}
676855e09eSopenharmony_ci
686855e09eSopenharmony_cifn bench_ini_str(c: &mut Criterion) {
696855e09eSopenharmony_ci  let s = "[owner]
706855e09eSopenharmony_ciname=John Doe
716855e09eSopenharmony_ciorganization=Acme Widgets Inc.
726855e09eSopenharmony_ci
736855e09eSopenharmony_ci[database]
746855e09eSopenharmony_ciserver=192.0.2.62
756855e09eSopenharmony_ciport=143
766855e09eSopenharmony_cifile=payroll.dat
776855e09eSopenharmony_ci";
786855e09eSopenharmony_ci
796855e09eSopenharmony_ci  let mut group = c.benchmark_group("ini str");
806855e09eSopenharmony_ci  group.throughput(Throughput::Bytes(s.len() as u64));
816855e09eSopenharmony_ci  group.bench_function(BenchmarkId::new("parse", s.len()), |b| {
826855e09eSopenharmony_ci    b.iter(|| categories(s).unwrap())
836855e09eSopenharmony_ci  });
846855e09eSopenharmony_ci}
856855e09eSopenharmony_ci
866855e09eSopenharmony_cicriterion_group!(benches, bench_ini_str);
876855e09eSopenharmony_cicriterion_main!(benches);
88