16855e09eSopenharmony_ci//! Parsers recognizing numbers, streaming version
26855e09eSopenharmony_ci
36855e09eSopenharmony_ciuse crate::branch::alt;
46855e09eSopenharmony_ciuse crate::bytes::streaming::tag;
56855e09eSopenharmony_ciuse crate::character::streaming::{char, digit1, sign};
66855e09eSopenharmony_ciuse crate::combinator::{cut, map, opt, recognize};
76855e09eSopenharmony_ciuse crate::error::{ErrorKind, ParseError};
86855e09eSopenharmony_ciuse crate::internal::*;
96855e09eSopenharmony_ciuse crate::lib::std::ops::{RangeFrom, RangeTo};
106855e09eSopenharmony_ciuse crate::sequence::{pair, tuple};
116855e09eSopenharmony_ciuse crate::traits::{
126855e09eSopenharmony_ci  AsBytes, AsChar, Compare, InputIter, InputLength, InputTake, InputTakeAtPosition, Offset, Slice,
136855e09eSopenharmony_ci};
146855e09eSopenharmony_ci
156855e09eSopenharmony_ci/// Recognizes an unsigned 1 byte integer.
166855e09eSopenharmony_ci///
176855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
186855e09eSopenharmony_ci/// ```rust
196855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
206855e09eSopenharmony_ci/// use nom::number::streaming::be_u8;
216855e09eSopenharmony_ci///
226855e09eSopenharmony_ci/// let parser = |s| {
236855e09eSopenharmony_ci///   be_u8::<_, (_, ErrorKind)>(s)
246855e09eSopenharmony_ci/// };
256855e09eSopenharmony_ci///
266855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"\x01abcd"[..], 0x00)));
276855e09eSopenharmony_ci/// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(1))));
286855e09eSopenharmony_ci/// ```
296855e09eSopenharmony_ci#[inline]
306855e09eSopenharmony_cipub fn be_u8<I, E: ParseError<I>>(input: I) -> IResult<I, u8, E>
316855e09eSopenharmony_ciwhere
326855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
336855e09eSopenharmony_ci{
346855e09eSopenharmony_ci  let bound: usize = 1;
356855e09eSopenharmony_ci  if input.input_len() < bound {
366855e09eSopenharmony_ci    Err(Err::Incomplete(Needed::new(1)))
376855e09eSopenharmony_ci  } else {
386855e09eSopenharmony_ci    let res = input.iter_elements().next().unwrap();
396855e09eSopenharmony_ci
406855e09eSopenharmony_ci    Ok((input.slice(bound..), res))
416855e09eSopenharmony_ci  }
426855e09eSopenharmony_ci}
436855e09eSopenharmony_ci
446855e09eSopenharmony_ci/// Recognizes a big endian unsigned 2 bytes integer.
456855e09eSopenharmony_ci///
466855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
476855e09eSopenharmony_ci///
486855e09eSopenharmony_ci/// ```rust
496855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
506855e09eSopenharmony_ci/// use nom::number::streaming::be_u16;
516855e09eSopenharmony_ci///
526855e09eSopenharmony_ci/// let parser = |s| {
536855e09eSopenharmony_ci///   be_u16::<_, (_, ErrorKind)>(s)
546855e09eSopenharmony_ci/// };
556855e09eSopenharmony_ci///
566855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"abcd"[..], 0x0001)));
576855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1))));
586855e09eSopenharmony_ci/// ```
596855e09eSopenharmony_ci#[inline]
606855e09eSopenharmony_cipub fn be_u16<I, E: ParseError<I>>(input: I) -> IResult<I, u16, E>
616855e09eSopenharmony_ciwhere
626855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
636855e09eSopenharmony_ci{
646855e09eSopenharmony_ci  let bound: usize = 2;
656855e09eSopenharmony_ci  if input.input_len() < bound {
666855e09eSopenharmony_ci    Err(Err::Incomplete(Needed::new(bound - input.input_len())))
676855e09eSopenharmony_ci  } else {
686855e09eSopenharmony_ci    let mut res = 0u16;
696855e09eSopenharmony_ci    for byte in input.iter_elements().take(bound) {
706855e09eSopenharmony_ci      res = (res << 8) + byte as u16;
716855e09eSopenharmony_ci    }
726855e09eSopenharmony_ci
736855e09eSopenharmony_ci    Ok((input.slice(bound..), res))
746855e09eSopenharmony_ci  }
756855e09eSopenharmony_ci}
766855e09eSopenharmony_ci
776855e09eSopenharmony_ci/// Recognizes a big endian unsigned 3 byte integer.
786855e09eSopenharmony_ci///
796855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
806855e09eSopenharmony_ci///
816855e09eSopenharmony_ci/// ```rust
826855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
836855e09eSopenharmony_ci/// use nom::number::streaming::be_u24;
846855e09eSopenharmony_ci///
856855e09eSopenharmony_ci/// let parser = |s| {
866855e09eSopenharmony_ci///   be_u24::<_, (_, ErrorKind)>(s)
876855e09eSopenharmony_ci/// };
886855e09eSopenharmony_ci///
896855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02abcd"[..]), Ok((&b"abcd"[..], 0x000102)));
906855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2))));
916855e09eSopenharmony_ci/// ```
926855e09eSopenharmony_ci#[inline]
936855e09eSopenharmony_cipub fn be_u24<I, E: ParseError<I>>(input: I) -> IResult<I, u32, E>
946855e09eSopenharmony_ciwhere
956855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
966855e09eSopenharmony_ci{
976855e09eSopenharmony_ci  let bound: usize = 3;
986855e09eSopenharmony_ci  if input.input_len() < bound {
996855e09eSopenharmony_ci    Err(Err::Incomplete(Needed::new(bound - input.input_len())))
1006855e09eSopenharmony_ci  } else {
1016855e09eSopenharmony_ci    let mut res = 0u32;
1026855e09eSopenharmony_ci    for byte in input.iter_elements().take(bound) {
1036855e09eSopenharmony_ci      res = (res << 8) + byte as u32;
1046855e09eSopenharmony_ci    }
1056855e09eSopenharmony_ci
1066855e09eSopenharmony_ci    Ok((input.slice(bound..), res))
1076855e09eSopenharmony_ci  }
1086855e09eSopenharmony_ci}
1096855e09eSopenharmony_ci
1106855e09eSopenharmony_ci/// Recognizes a big endian unsigned 4 bytes integer.
1116855e09eSopenharmony_ci///
1126855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
1136855e09eSopenharmony_ci///
1146855e09eSopenharmony_ci/// ```rust
1156855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
1166855e09eSopenharmony_ci/// use nom::number::streaming::be_u32;
1176855e09eSopenharmony_ci///
1186855e09eSopenharmony_ci/// let parser = |s| {
1196855e09eSopenharmony_ci///   be_u32::<_, (_, ErrorKind)>(s)
1206855e09eSopenharmony_ci/// };
1216855e09eSopenharmony_ci///
1226855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02\x03abcd"[..]), Ok((&b"abcd"[..], 0x00010203)));
1236855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3))));
1246855e09eSopenharmony_ci/// ```
1256855e09eSopenharmony_ci#[inline]
1266855e09eSopenharmony_cipub fn be_u32<I, E: ParseError<I>>(input: I) -> IResult<I, u32, E>
1276855e09eSopenharmony_ciwhere
1286855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
1296855e09eSopenharmony_ci{
1306855e09eSopenharmony_ci  let bound: usize = 4;
1316855e09eSopenharmony_ci  if input.input_len() < bound {
1326855e09eSopenharmony_ci    Err(Err::Incomplete(Needed::new(bound - input.input_len())))
1336855e09eSopenharmony_ci  } else {
1346855e09eSopenharmony_ci    let mut res = 0u32;
1356855e09eSopenharmony_ci    for byte in input.iter_elements().take(bound) {
1366855e09eSopenharmony_ci      res = (res << 8) + byte as u32;
1376855e09eSopenharmony_ci    }
1386855e09eSopenharmony_ci
1396855e09eSopenharmony_ci    Ok((input.slice(bound..), res))
1406855e09eSopenharmony_ci  }
1416855e09eSopenharmony_ci}
1426855e09eSopenharmony_ci
1436855e09eSopenharmony_ci/// Recognizes a big endian unsigned 8 bytes integer.
1446855e09eSopenharmony_ci///
1456855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
1466855e09eSopenharmony_ci///
1476855e09eSopenharmony_ci/// ```rust
1486855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
1496855e09eSopenharmony_ci/// use nom::number::streaming::be_u64;
1506855e09eSopenharmony_ci///
1516855e09eSopenharmony_ci/// let parser = |s| {
1526855e09eSopenharmony_ci///   be_u64::<_, (_, ErrorKind)>(s)
1536855e09eSopenharmony_ci/// };
1546855e09eSopenharmony_ci///
1556855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcd"[..]), Ok((&b"abcd"[..], 0x0001020304050607)));
1566855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7))));
1576855e09eSopenharmony_ci/// ```
1586855e09eSopenharmony_ci#[inline]
1596855e09eSopenharmony_cipub fn be_u64<I, E: ParseError<I>>(input: I) -> IResult<I, u64, E>
1606855e09eSopenharmony_ciwhere
1616855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
1626855e09eSopenharmony_ci{
1636855e09eSopenharmony_ci  let bound: usize = 8;
1646855e09eSopenharmony_ci  if input.input_len() < bound {
1656855e09eSopenharmony_ci    Err(Err::Incomplete(Needed::new(bound - input.input_len())))
1666855e09eSopenharmony_ci  } else {
1676855e09eSopenharmony_ci    let mut res = 0u64;
1686855e09eSopenharmony_ci    for byte in input.iter_elements().take(bound) {
1696855e09eSopenharmony_ci      res = (res << 8) + byte as u64;
1706855e09eSopenharmony_ci    }
1716855e09eSopenharmony_ci
1726855e09eSopenharmony_ci    Ok((input.slice(bound..), res))
1736855e09eSopenharmony_ci  }
1746855e09eSopenharmony_ci}
1756855e09eSopenharmony_ci
1766855e09eSopenharmony_ci/// Recognizes a big endian unsigned 16 bytes integer.
1776855e09eSopenharmony_ci///
1786855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
1796855e09eSopenharmony_ci/// ```rust
1806855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
1816855e09eSopenharmony_ci/// use nom::number::streaming::be_u128;
1826855e09eSopenharmony_ci///
1836855e09eSopenharmony_ci/// let parser = |s| {
1846855e09eSopenharmony_ci///   be_u128::<_, (_, ErrorKind)>(s)
1856855e09eSopenharmony_ci/// };
1866855e09eSopenharmony_ci///
1876855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15abcd"[..]), Ok((&b"abcd"[..], 0x00010203040506070809101112131415)));
1886855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15))));
1896855e09eSopenharmony_ci/// ```
1906855e09eSopenharmony_ci#[inline]
1916855e09eSopenharmony_cipub fn be_u128<I, E: ParseError<I>>(input: I) -> IResult<I, u128, E>
1926855e09eSopenharmony_ciwhere
1936855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
1946855e09eSopenharmony_ci{
1956855e09eSopenharmony_ci  let bound: usize = 16;
1966855e09eSopenharmony_ci  if input.input_len() < bound {
1976855e09eSopenharmony_ci    Err(Err::Incomplete(Needed::new(bound - input.input_len())))
1986855e09eSopenharmony_ci  } else {
1996855e09eSopenharmony_ci    let mut res = 0u128;
2006855e09eSopenharmony_ci    for byte in input.iter_elements().take(bound) {
2016855e09eSopenharmony_ci      res = (res << 8) + byte as u128;
2026855e09eSopenharmony_ci    }
2036855e09eSopenharmony_ci
2046855e09eSopenharmony_ci    Ok((input.slice(bound..), res))
2056855e09eSopenharmony_ci  }
2066855e09eSopenharmony_ci}
2076855e09eSopenharmony_ci
2086855e09eSopenharmony_ci/// Recognizes a signed 1 byte integer.
2096855e09eSopenharmony_ci///
2106855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
2116855e09eSopenharmony_ci/// ```rust
2126855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
2136855e09eSopenharmony_ci/// use nom::number::streaming::be_i8;
2146855e09eSopenharmony_ci///
2156855e09eSopenharmony_ci/// let parser = be_i8::<_, (_, ErrorKind)>;
2166855e09eSopenharmony_ci///
2176855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"\x01abcd"[..], 0x00)));
2186855e09eSopenharmony_ci/// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(1))));
2196855e09eSopenharmony_ci/// ```
2206855e09eSopenharmony_ci#[inline]
2216855e09eSopenharmony_cipub fn be_i8<I, E: ParseError<I>>(input: I) -> IResult<I, i8, E>
2226855e09eSopenharmony_ciwhere
2236855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
2246855e09eSopenharmony_ci{
2256855e09eSopenharmony_ci  be_u8.map(|x| x as i8).parse(input)
2266855e09eSopenharmony_ci}
2276855e09eSopenharmony_ci
2286855e09eSopenharmony_ci/// Recognizes a big endian signed 2 bytes integer.
2296855e09eSopenharmony_ci///
2306855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
2316855e09eSopenharmony_ci/// ```rust
2326855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
2336855e09eSopenharmony_ci/// use nom::number::streaming::be_i16;
2346855e09eSopenharmony_ci///
2356855e09eSopenharmony_ci/// let parser = be_i16::<_, (_, ErrorKind)>;
2366855e09eSopenharmony_ci///
2376855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"abcd"[..], 0x0001)));
2386855e09eSopenharmony_ci/// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(2))));
2396855e09eSopenharmony_ci/// ```
2406855e09eSopenharmony_ci#[inline]
2416855e09eSopenharmony_cipub fn be_i16<I, E: ParseError<I>>(input: I) -> IResult<I, i16, E>
2426855e09eSopenharmony_ciwhere
2436855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
2446855e09eSopenharmony_ci{
2456855e09eSopenharmony_ci  be_u16.map(|x| x as i16).parse(input)
2466855e09eSopenharmony_ci}
2476855e09eSopenharmony_ci
2486855e09eSopenharmony_ci/// Recognizes a big endian signed 3 bytes integer.
2496855e09eSopenharmony_ci///
2506855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
2516855e09eSopenharmony_ci/// ```rust
2526855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
2536855e09eSopenharmony_ci/// use nom::number::streaming::be_i24;
2546855e09eSopenharmony_ci///
2556855e09eSopenharmony_ci/// let parser = be_i24::<_, (_, ErrorKind)>;
2566855e09eSopenharmony_ci///
2576855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02abcd"[..]), Ok((&b"abcd"[..], 0x000102)));
2586855e09eSopenharmony_ci/// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(3))));
2596855e09eSopenharmony_ci/// ```
2606855e09eSopenharmony_ci#[inline]
2616855e09eSopenharmony_cipub fn be_i24<I, E: ParseError<I>>(input: I) -> IResult<I, i32, E>
2626855e09eSopenharmony_ciwhere
2636855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
2646855e09eSopenharmony_ci{
2656855e09eSopenharmony_ci  // Same as the unsigned version but we need to sign-extend manually here
2666855e09eSopenharmony_ci  be_u24
2676855e09eSopenharmony_ci    .map(|x| {
2686855e09eSopenharmony_ci      if x & 0x80_00_00 != 0 {
2696855e09eSopenharmony_ci        (x | 0xff_00_00_00) as i32
2706855e09eSopenharmony_ci      } else {
2716855e09eSopenharmony_ci        x as i32
2726855e09eSopenharmony_ci      }
2736855e09eSopenharmony_ci    })
2746855e09eSopenharmony_ci    .parse(input)
2756855e09eSopenharmony_ci}
2766855e09eSopenharmony_ci
2776855e09eSopenharmony_ci/// Recognizes a big endian signed 4 bytes integer.
2786855e09eSopenharmony_ci///
2796855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
2806855e09eSopenharmony_ci/// ```rust
2816855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
2826855e09eSopenharmony_ci/// use nom::number::streaming::be_i32;
2836855e09eSopenharmony_ci///
2846855e09eSopenharmony_ci/// let parser = be_i32::<_, (_, ErrorKind)>;
2856855e09eSopenharmony_ci///
2866855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02\x03abcd"[..]), Ok((&b"abcd"[..], 0x00010203)));
2876855e09eSopenharmony_ci/// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(4))));
2886855e09eSopenharmony_ci/// ```
2896855e09eSopenharmony_ci#[inline]
2906855e09eSopenharmony_cipub fn be_i32<I, E: ParseError<I>>(input: I) -> IResult<I, i32, E>
2916855e09eSopenharmony_ciwhere
2926855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
2936855e09eSopenharmony_ci{
2946855e09eSopenharmony_ci  be_u32.map(|x| x as i32).parse(input)
2956855e09eSopenharmony_ci}
2966855e09eSopenharmony_ci
2976855e09eSopenharmony_ci/// Recognizes a big endian signed 8 bytes integer.
2986855e09eSopenharmony_ci///
2996855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
3006855e09eSopenharmony_ci///
3016855e09eSopenharmony_ci/// ```rust
3026855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
3036855e09eSopenharmony_ci/// use nom::number::streaming::be_i64;
3046855e09eSopenharmony_ci///
3056855e09eSopenharmony_ci/// let parser = be_i64::<_, (_, ErrorKind)>;
3066855e09eSopenharmony_ci///
3076855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcd"[..]), Ok((&b"abcd"[..], 0x0001020304050607)));
3086855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7))));
3096855e09eSopenharmony_ci/// ```
3106855e09eSopenharmony_ci#[inline]
3116855e09eSopenharmony_cipub fn be_i64<I, E: ParseError<I>>(input: I) -> IResult<I, i64, E>
3126855e09eSopenharmony_ciwhere
3136855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
3146855e09eSopenharmony_ci{
3156855e09eSopenharmony_ci  be_u64.map(|x| x as i64).parse(input)
3166855e09eSopenharmony_ci}
3176855e09eSopenharmony_ci
3186855e09eSopenharmony_ci/// Recognizes a big endian signed 16 bytes integer.
3196855e09eSopenharmony_ci///
3206855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
3216855e09eSopenharmony_ci/// ```rust
3226855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
3236855e09eSopenharmony_ci/// use nom::number::streaming::be_i128;
3246855e09eSopenharmony_ci///
3256855e09eSopenharmony_ci/// let parser = be_i128::<_, (_, ErrorKind)>;
3266855e09eSopenharmony_ci///
3276855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15abcd"[..]), Ok((&b"abcd"[..], 0x00010203040506070809101112131415)));
3286855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15))));
3296855e09eSopenharmony_ci/// ```
3306855e09eSopenharmony_ci#[inline]
3316855e09eSopenharmony_cipub fn be_i128<I, E: ParseError<I>>(input: I) -> IResult<I, i128, E>
3326855e09eSopenharmony_ciwhere
3336855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
3346855e09eSopenharmony_ci{
3356855e09eSopenharmony_ci  be_u128.map(|x| x as i128).parse(input)
3366855e09eSopenharmony_ci}
3376855e09eSopenharmony_ci
3386855e09eSopenharmony_ci/// Recognizes an unsigned 1 byte integer.
3396855e09eSopenharmony_ci///
3406855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
3416855e09eSopenharmony_ci/// ```rust
3426855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
3436855e09eSopenharmony_ci/// use nom::number::streaming::le_u8;
3446855e09eSopenharmony_ci///
3456855e09eSopenharmony_ci/// let parser = le_u8::<_, (_, ErrorKind)>;
3466855e09eSopenharmony_ci///
3476855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"\x01abcd"[..], 0x00)));
3486855e09eSopenharmony_ci/// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(1))));
3496855e09eSopenharmony_ci/// ```
3506855e09eSopenharmony_ci#[inline]
3516855e09eSopenharmony_cipub fn le_u8<I, E: ParseError<I>>(input: I) -> IResult<I, u8, E>
3526855e09eSopenharmony_ciwhere
3536855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
3546855e09eSopenharmony_ci{
3556855e09eSopenharmony_ci  let bound: usize = 1;
3566855e09eSopenharmony_ci  if input.input_len() < bound {
3576855e09eSopenharmony_ci    Err(Err::Incomplete(Needed::new(1)))
3586855e09eSopenharmony_ci  } else {
3596855e09eSopenharmony_ci    let res = input.iter_elements().next().unwrap();
3606855e09eSopenharmony_ci
3616855e09eSopenharmony_ci    Ok((input.slice(bound..), res))
3626855e09eSopenharmony_ci  }
3636855e09eSopenharmony_ci}
3646855e09eSopenharmony_ci
3656855e09eSopenharmony_ci/// Recognizes a little endian unsigned 2 bytes integer.
3666855e09eSopenharmony_ci///
3676855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
3686855e09eSopenharmony_ci///
3696855e09eSopenharmony_ci/// ```rust
3706855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
3716855e09eSopenharmony_ci/// use nom::number::streaming::le_u16;
3726855e09eSopenharmony_ci///
3736855e09eSopenharmony_ci/// let parser = |s| {
3746855e09eSopenharmony_ci///   le_u16::<_, (_, ErrorKind)>(s)
3756855e09eSopenharmony_ci/// };
3766855e09eSopenharmony_ci///
3776855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"abcd"[..], 0x0100)));
3786855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1))));
3796855e09eSopenharmony_ci/// ```
3806855e09eSopenharmony_ci#[inline]
3816855e09eSopenharmony_cipub fn le_u16<I, E: ParseError<I>>(input: I) -> IResult<I, u16, E>
3826855e09eSopenharmony_ciwhere
3836855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
3846855e09eSopenharmony_ci{
3856855e09eSopenharmony_ci  let bound: usize = 2;
3866855e09eSopenharmony_ci  if input.input_len() < bound {
3876855e09eSopenharmony_ci    Err(Err::Incomplete(Needed::new(bound - input.input_len())))
3886855e09eSopenharmony_ci  } else {
3896855e09eSopenharmony_ci    let mut res = 0u16;
3906855e09eSopenharmony_ci    for (index, byte) in input.iter_indices().take(bound) {
3916855e09eSopenharmony_ci      res += (byte as u16) << (8 * index);
3926855e09eSopenharmony_ci    }
3936855e09eSopenharmony_ci
3946855e09eSopenharmony_ci    Ok((input.slice(bound..), res))
3956855e09eSopenharmony_ci  }
3966855e09eSopenharmony_ci}
3976855e09eSopenharmony_ci
3986855e09eSopenharmony_ci/// Recognizes a little endian unsigned 3 bytes integer.
3996855e09eSopenharmony_ci///
4006855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
4016855e09eSopenharmony_ci///
4026855e09eSopenharmony_ci/// ```rust
4036855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
4046855e09eSopenharmony_ci/// use nom::number::streaming::le_u24;
4056855e09eSopenharmony_ci///
4066855e09eSopenharmony_ci/// let parser = |s| {
4076855e09eSopenharmony_ci///   le_u24::<_, (_, ErrorKind)>(s)
4086855e09eSopenharmony_ci/// };
4096855e09eSopenharmony_ci///
4106855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02abcd"[..]), Ok((&b"abcd"[..], 0x020100)));
4116855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2))));
4126855e09eSopenharmony_ci/// ```
4136855e09eSopenharmony_ci#[inline]
4146855e09eSopenharmony_cipub fn le_u24<I, E: ParseError<I>>(input: I) -> IResult<I, u32, E>
4156855e09eSopenharmony_ciwhere
4166855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
4176855e09eSopenharmony_ci{
4186855e09eSopenharmony_ci  let bound: usize = 3;
4196855e09eSopenharmony_ci  if input.input_len() < bound {
4206855e09eSopenharmony_ci    Err(Err::Incomplete(Needed::new(bound - input.input_len())))
4216855e09eSopenharmony_ci  } else {
4226855e09eSopenharmony_ci    let mut res = 0u32;
4236855e09eSopenharmony_ci    for (index, byte) in input.iter_indices().take(bound) {
4246855e09eSopenharmony_ci      res += (byte as u32) << (8 * index);
4256855e09eSopenharmony_ci    }
4266855e09eSopenharmony_ci
4276855e09eSopenharmony_ci    Ok((input.slice(bound..), res))
4286855e09eSopenharmony_ci  }
4296855e09eSopenharmony_ci}
4306855e09eSopenharmony_ci
4316855e09eSopenharmony_ci/// Recognizes a little endian unsigned 4 bytes integer.
4326855e09eSopenharmony_ci///
4336855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
4346855e09eSopenharmony_ci///
4356855e09eSopenharmony_ci/// ```rust
4366855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
4376855e09eSopenharmony_ci/// use nom::number::streaming::le_u32;
4386855e09eSopenharmony_ci///
4396855e09eSopenharmony_ci/// let parser = |s| {
4406855e09eSopenharmony_ci///   le_u32::<_, (_, ErrorKind)>(s)
4416855e09eSopenharmony_ci/// };
4426855e09eSopenharmony_ci///
4436855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02\x03abcd"[..]), Ok((&b"abcd"[..], 0x03020100)));
4446855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3))));
4456855e09eSopenharmony_ci/// ```
4466855e09eSopenharmony_ci#[inline]
4476855e09eSopenharmony_cipub fn le_u32<I, E: ParseError<I>>(input: I) -> IResult<I, u32, E>
4486855e09eSopenharmony_ciwhere
4496855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
4506855e09eSopenharmony_ci{
4516855e09eSopenharmony_ci  let bound: usize = 4;
4526855e09eSopenharmony_ci  if input.input_len() < bound {
4536855e09eSopenharmony_ci    Err(Err::Incomplete(Needed::new(bound - input.input_len())))
4546855e09eSopenharmony_ci  } else {
4556855e09eSopenharmony_ci    let mut res = 0u32;
4566855e09eSopenharmony_ci    for (index, byte) in input.iter_indices().take(bound) {
4576855e09eSopenharmony_ci      res += (byte as u32) << (8 * index);
4586855e09eSopenharmony_ci    }
4596855e09eSopenharmony_ci
4606855e09eSopenharmony_ci    Ok((input.slice(bound..), res))
4616855e09eSopenharmony_ci  }
4626855e09eSopenharmony_ci}
4636855e09eSopenharmony_ci
4646855e09eSopenharmony_ci/// Recognizes a little endian unsigned 8 bytes integer.
4656855e09eSopenharmony_ci///
4666855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
4676855e09eSopenharmony_ci///
4686855e09eSopenharmony_ci/// ```rust
4696855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
4706855e09eSopenharmony_ci/// use nom::number::streaming::le_u64;
4716855e09eSopenharmony_ci///
4726855e09eSopenharmony_ci/// let parser = |s| {
4736855e09eSopenharmony_ci///   le_u64::<_, (_, ErrorKind)>(s)
4746855e09eSopenharmony_ci/// };
4756855e09eSopenharmony_ci///
4766855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcd"[..]), Ok((&b"abcd"[..], 0x0706050403020100)));
4776855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7))));
4786855e09eSopenharmony_ci/// ```
4796855e09eSopenharmony_ci#[inline]
4806855e09eSopenharmony_cipub fn le_u64<I, E: ParseError<I>>(input: I) -> IResult<I, u64, E>
4816855e09eSopenharmony_ciwhere
4826855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
4836855e09eSopenharmony_ci{
4846855e09eSopenharmony_ci  let bound: usize = 8;
4856855e09eSopenharmony_ci  if input.input_len() < bound {
4866855e09eSopenharmony_ci    Err(Err::Incomplete(Needed::new(bound - input.input_len())))
4876855e09eSopenharmony_ci  } else {
4886855e09eSopenharmony_ci    let mut res = 0u64;
4896855e09eSopenharmony_ci    for (index, byte) in input.iter_indices().take(bound) {
4906855e09eSopenharmony_ci      res += (byte as u64) << (8 * index);
4916855e09eSopenharmony_ci    }
4926855e09eSopenharmony_ci
4936855e09eSopenharmony_ci    Ok((input.slice(bound..), res))
4946855e09eSopenharmony_ci  }
4956855e09eSopenharmony_ci}
4966855e09eSopenharmony_ci
4976855e09eSopenharmony_ci/// Recognizes a little endian unsigned 16 bytes integer.
4986855e09eSopenharmony_ci///
4996855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
5006855e09eSopenharmony_ci///
5016855e09eSopenharmony_ci/// ```rust
5026855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
5036855e09eSopenharmony_ci/// use nom::number::streaming::le_u128;
5046855e09eSopenharmony_ci///
5056855e09eSopenharmony_ci/// let parser = |s| {
5066855e09eSopenharmony_ci///   le_u128::<_, (_, ErrorKind)>(s)
5076855e09eSopenharmony_ci/// };
5086855e09eSopenharmony_ci///
5096855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15abcd"[..]), Ok((&b"abcd"[..], 0x15141312111009080706050403020100)));
5106855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15))));
5116855e09eSopenharmony_ci/// ```
5126855e09eSopenharmony_ci#[inline]
5136855e09eSopenharmony_cipub fn le_u128<I, E: ParseError<I>>(input: I) -> IResult<I, u128, E>
5146855e09eSopenharmony_ciwhere
5156855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
5166855e09eSopenharmony_ci{
5176855e09eSopenharmony_ci  let bound: usize = 16;
5186855e09eSopenharmony_ci  if input.input_len() < bound {
5196855e09eSopenharmony_ci    Err(Err::Incomplete(Needed::new(bound - input.input_len())))
5206855e09eSopenharmony_ci  } else {
5216855e09eSopenharmony_ci    let mut res = 0u128;
5226855e09eSopenharmony_ci    for (index, byte) in input.iter_indices().take(bound) {
5236855e09eSopenharmony_ci      res += (byte as u128) << (8 * index);
5246855e09eSopenharmony_ci    }
5256855e09eSopenharmony_ci
5266855e09eSopenharmony_ci    Ok((input.slice(bound..), res))
5276855e09eSopenharmony_ci  }
5286855e09eSopenharmony_ci}
5296855e09eSopenharmony_ci
5306855e09eSopenharmony_ci/// Recognizes a signed 1 byte integer.
5316855e09eSopenharmony_ci///
5326855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
5336855e09eSopenharmony_ci/// ```rust
5346855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
5356855e09eSopenharmony_ci/// use nom::number::streaming::le_i8;
5366855e09eSopenharmony_ci///
5376855e09eSopenharmony_ci/// let parser = le_i8::<_, (_, ErrorKind)>;
5386855e09eSopenharmony_ci///
5396855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"\x01abcd"[..], 0x00)));
5406855e09eSopenharmony_ci/// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(1))));
5416855e09eSopenharmony_ci/// ```
5426855e09eSopenharmony_ci#[inline]
5436855e09eSopenharmony_cipub fn le_i8<I, E: ParseError<I>>(input: I) -> IResult<I, i8, E>
5446855e09eSopenharmony_ciwhere
5456855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
5466855e09eSopenharmony_ci{
5476855e09eSopenharmony_ci  le_u8.map(|x| x as i8).parse(input)
5486855e09eSopenharmony_ci}
5496855e09eSopenharmony_ci
5506855e09eSopenharmony_ci/// Recognizes a little endian signed 2 bytes integer.
5516855e09eSopenharmony_ci///
5526855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
5536855e09eSopenharmony_ci///
5546855e09eSopenharmony_ci/// ```rust
5556855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
5566855e09eSopenharmony_ci/// use nom::number::streaming::le_i16;
5576855e09eSopenharmony_ci///
5586855e09eSopenharmony_ci/// let parser = |s| {
5596855e09eSopenharmony_ci///   le_i16::<_, (_, ErrorKind)>(s)
5606855e09eSopenharmony_ci/// };
5616855e09eSopenharmony_ci///
5626855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01abcd"[..]), Ok((&b"abcd"[..], 0x0100)));
5636855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1))));
5646855e09eSopenharmony_ci/// ```
5656855e09eSopenharmony_ci#[inline]
5666855e09eSopenharmony_cipub fn le_i16<I, E: ParseError<I>>(input: I) -> IResult<I, i16, E>
5676855e09eSopenharmony_ciwhere
5686855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
5696855e09eSopenharmony_ci{
5706855e09eSopenharmony_ci  le_u16.map(|x| x as i16).parse(input)
5716855e09eSopenharmony_ci}
5726855e09eSopenharmony_ci
5736855e09eSopenharmony_ci/// Recognizes a little endian signed 3 bytes integer.
5746855e09eSopenharmony_ci///
5756855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
5766855e09eSopenharmony_ci///
5776855e09eSopenharmony_ci/// ```rust
5786855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
5796855e09eSopenharmony_ci/// use nom::number::streaming::le_i24;
5806855e09eSopenharmony_ci///
5816855e09eSopenharmony_ci/// let parser = |s| {
5826855e09eSopenharmony_ci///   le_i24::<_, (_, ErrorKind)>(s)
5836855e09eSopenharmony_ci/// };
5846855e09eSopenharmony_ci///
5856855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02abcd"[..]), Ok((&b"abcd"[..], 0x020100)));
5866855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2))));
5876855e09eSopenharmony_ci/// ```
5886855e09eSopenharmony_ci#[inline]
5896855e09eSopenharmony_cipub fn le_i24<I, E: ParseError<I>>(input: I) -> IResult<I, i32, E>
5906855e09eSopenharmony_ciwhere
5916855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
5926855e09eSopenharmony_ci{
5936855e09eSopenharmony_ci  // Same as the unsigned version but we need to sign-extend manually here
5946855e09eSopenharmony_ci  le_u24
5956855e09eSopenharmony_ci    .map(|x| {
5966855e09eSopenharmony_ci      if x & 0x80_00_00 != 0 {
5976855e09eSopenharmony_ci        (x | 0xff_00_00_00) as i32
5986855e09eSopenharmony_ci      } else {
5996855e09eSopenharmony_ci        x as i32
6006855e09eSopenharmony_ci      }
6016855e09eSopenharmony_ci    })
6026855e09eSopenharmony_ci    .parse(input)
6036855e09eSopenharmony_ci}
6046855e09eSopenharmony_ci
6056855e09eSopenharmony_ci/// Recognizes a little endian signed 4 bytes integer.
6066855e09eSopenharmony_ci///
6076855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
6086855e09eSopenharmony_ci///
6096855e09eSopenharmony_ci/// ```rust
6106855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
6116855e09eSopenharmony_ci/// use nom::number::streaming::le_i32;
6126855e09eSopenharmony_ci///
6136855e09eSopenharmony_ci/// let parser = |s| {
6146855e09eSopenharmony_ci///   le_i32::<_, (_, ErrorKind)>(s)
6156855e09eSopenharmony_ci/// };
6166855e09eSopenharmony_ci///
6176855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02\x03abcd"[..]), Ok((&b"abcd"[..], 0x03020100)));
6186855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3))));
6196855e09eSopenharmony_ci/// ```
6206855e09eSopenharmony_ci#[inline]
6216855e09eSopenharmony_cipub fn le_i32<I, E: ParseError<I>>(input: I) -> IResult<I, i32, E>
6226855e09eSopenharmony_ciwhere
6236855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
6246855e09eSopenharmony_ci{
6256855e09eSopenharmony_ci  le_u32.map(|x| x as i32).parse(input)
6266855e09eSopenharmony_ci}
6276855e09eSopenharmony_ci
6286855e09eSopenharmony_ci/// Recognizes a little endian signed 8 bytes integer.
6296855e09eSopenharmony_ci///
6306855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
6316855e09eSopenharmony_ci///
6326855e09eSopenharmony_ci/// ```rust
6336855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
6346855e09eSopenharmony_ci/// use nom::number::streaming::le_i64;
6356855e09eSopenharmony_ci///
6366855e09eSopenharmony_ci/// let parser = |s| {
6376855e09eSopenharmony_ci///   le_i64::<_, (_, ErrorKind)>(s)
6386855e09eSopenharmony_ci/// };
6396855e09eSopenharmony_ci///
6406855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcd"[..]), Ok((&b"abcd"[..], 0x0706050403020100)));
6416855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7))));
6426855e09eSopenharmony_ci/// ```
6436855e09eSopenharmony_ci#[inline]
6446855e09eSopenharmony_cipub fn le_i64<I, E: ParseError<I>>(input: I) -> IResult<I, i64, E>
6456855e09eSopenharmony_ciwhere
6466855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
6476855e09eSopenharmony_ci{
6486855e09eSopenharmony_ci  le_u64.map(|x| x as i64).parse(input)
6496855e09eSopenharmony_ci}
6506855e09eSopenharmony_ci
6516855e09eSopenharmony_ci/// Recognizes a little endian signed 16 bytes integer.
6526855e09eSopenharmony_ci///
6536855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
6546855e09eSopenharmony_ci///
6556855e09eSopenharmony_ci/// ```rust
6566855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
6576855e09eSopenharmony_ci/// use nom::number::streaming::le_i128;
6586855e09eSopenharmony_ci///
6596855e09eSopenharmony_ci/// let parser = |s| {
6606855e09eSopenharmony_ci///   le_i128::<_, (_, ErrorKind)>(s)
6616855e09eSopenharmony_ci/// };
6626855e09eSopenharmony_ci///
6636855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x10\x11\x12\x13\x14\x15abcd"[..]), Ok((&b"abcd"[..], 0x15141312111009080706050403020100)));
6646855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15))));
6656855e09eSopenharmony_ci/// ```
6666855e09eSopenharmony_ci#[inline]
6676855e09eSopenharmony_cipub fn le_i128<I, E: ParseError<I>>(input: I) -> IResult<I, i128, E>
6686855e09eSopenharmony_ciwhere
6696855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
6706855e09eSopenharmony_ci{
6716855e09eSopenharmony_ci  le_u128.map(|x| x as i128).parse(input)
6726855e09eSopenharmony_ci}
6736855e09eSopenharmony_ci
6746855e09eSopenharmony_ci/// Recognizes an unsigned 1 byte integer
6756855e09eSopenharmony_ci///
6766855e09eSopenharmony_ci/// Note that endianness does not apply to 1 byte numbers.
6776855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
6786855e09eSopenharmony_ci/// ```rust
6796855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
6806855e09eSopenharmony_ci/// # use nom::Needed::Size;
6816855e09eSopenharmony_ci/// use nom::number::streaming::u8;
6826855e09eSopenharmony_ci///
6836855e09eSopenharmony_ci/// let parser = |s| {
6846855e09eSopenharmony_ci///   u8::<_, (_, ErrorKind)>(s)
6856855e09eSopenharmony_ci/// };
6866855e09eSopenharmony_ci///
6876855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x03abcefg"[..]), Ok((&b"\x03abcefg"[..], 0x00)));
6886855e09eSopenharmony_ci/// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(1))));
6896855e09eSopenharmony_ci/// ```
6906855e09eSopenharmony_ci#[inline]
6916855e09eSopenharmony_cipub fn u8<I, E: ParseError<I>>(input: I) -> IResult<I, u8, E>
6926855e09eSopenharmony_ciwhere
6936855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
6946855e09eSopenharmony_ci{
6956855e09eSopenharmony_ci  let bound: usize = 1;
6966855e09eSopenharmony_ci  if input.input_len() < bound {
6976855e09eSopenharmony_ci    Err(Err::Incomplete(Needed::new(1)))
6986855e09eSopenharmony_ci  } else {
6996855e09eSopenharmony_ci    let res = input.iter_elements().next().unwrap();
7006855e09eSopenharmony_ci
7016855e09eSopenharmony_ci    Ok((input.slice(bound..), res))
7026855e09eSopenharmony_ci  }
7036855e09eSopenharmony_ci}
7046855e09eSopenharmony_ci
7056855e09eSopenharmony_ci/// Recognizes an unsigned 2 bytes integer
7066855e09eSopenharmony_ci///
7076855e09eSopenharmony_ci/// If the parameter is `nom::number::Endianness::Big`, parse a big endian u16 integer,
7086855e09eSopenharmony_ci/// otherwise if `nom::number::Endianness::Little` parse a little endian u16 integer.
7096855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
7106855e09eSopenharmony_ci///
7116855e09eSopenharmony_ci/// ```rust
7126855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
7136855e09eSopenharmony_ci/// # use nom::Needed::Size;
7146855e09eSopenharmony_ci/// use nom::number::streaming::u16;
7156855e09eSopenharmony_ci///
7166855e09eSopenharmony_ci/// let be_u16 = |s| {
7176855e09eSopenharmony_ci///   u16::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s)
7186855e09eSopenharmony_ci/// };
7196855e09eSopenharmony_ci///
7206855e09eSopenharmony_ci/// assert_eq!(be_u16(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0003)));
7216855e09eSopenharmony_ci/// assert_eq!(be_u16(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1))));
7226855e09eSopenharmony_ci///
7236855e09eSopenharmony_ci/// let le_u16 = |s| {
7246855e09eSopenharmony_ci///   u16::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s)
7256855e09eSopenharmony_ci/// };
7266855e09eSopenharmony_ci///
7276855e09eSopenharmony_ci/// assert_eq!(le_u16(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0300)));
7286855e09eSopenharmony_ci/// assert_eq!(le_u16(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1))));
7296855e09eSopenharmony_ci/// ```
7306855e09eSopenharmony_ci#[inline]
7316855e09eSopenharmony_cipub fn u16<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, u16, E>
7326855e09eSopenharmony_ciwhere
7336855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
7346855e09eSopenharmony_ci{
7356855e09eSopenharmony_ci  match endian {
7366855e09eSopenharmony_ci    crate::number::Endianness::Big => be_u16,
7376855e09eSopenharmony_ci    crate::number::Endianness::Little => le_u16,
7386855e09eSopenharmony_ci    #[cfg(target_endian = "big")]
7396855e09eSopenharmony_ci    crate::number::Endianness::Native => be_u16,
7406855e09eSopenharmony_ci    #[cfg(target_endian = "little")]
7416855e09eSopenharmony_ci    crate::number::Endianness::Native => le_u16,
7426855e09eSopenharmony_ci  }
7436855e09eSopenharmony_ci}
7446855e09eSopenharmony_ci
7456855e09eSopenharmony_ci/// Recognizes an unsigned 3 byte integer
7466855e09eSopenharmony_ci///
7476855e09eSopenharmony_ci/// If the parameter is `nom::number::Endianness::Big`, parse a big endian u24 integer,
7486855e09eSopenharmony_ci/// otherwise if `nom::number::Endianness::Little` parse a little endian u24 integer.
7496855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
7506855e09eSopenharmony_ci/// ```rust
7516855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
7526855e09eSopenharmony_ci/// # use nom::Needed::Size;
7536855e09eSopenharmony_ci/// use nom::number::streaming::u24;
7546855e09eSopenharmony_ci///
7556855e09eSopenharmony_ci/// let be_u24 = |s| {
7566855e09eSopenharmony_ci///   u24::<_,(_, ErrorKind)>(nom::number::Endianness::Big)(s)
7576855e09eSopenharmony_ci/// };
7586855e09eSopenharmony_ci///
7596855e09eSopenharmony_ci/// assert_eq!(be_u24(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x000305)));
7606855e09eSopenharmony_ci/// assert_eq!(be_u24(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2))));
7616855e09eSopenharmony_ci///
7626855e09eSopenharmony_ci/// let le_u24 = |s| {
7636855e09eSopenharmony_ci///   u24::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s)
7646855e09eSopenharmony_ci/// };
7656855e09eSopenharmony_ci///
7666855e09eSopenharmony_ci/// assert_eq!(le_u24(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x050300)));
7676855e09eSopenharmony_ci/// assert_eq!(le_u24(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2))));
7686855e09eSopenharmony_ci/// ```
7696855e09eSopenharmony_ci#[inline]
7706855e09eSopenharmony_cipub fn u24<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, u32, E>
7716855e09eSopenharmony_ciwhere
7726855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
7736855e09eSopenharmony_ci{
7746855e09eSopenharmony_ci  match endian {
7756855e09eSopenharmony_ci    crate::number::Endianness::Big => be_u24,
7766855e09eSopenharmony_ci    crate::number::Endianness::Little => le_u24,
7776855e09eSopenharmony_ci    #[cfg(target_endian = "big")]
7786855e09eSopenharmony_ci    crate::number::Endianness::Native => be_u24,
7796855e09eSopenharmony_ci    #[cfg(target_endian = "little")]
7806855e09eSopenharmony_ci    crate::number::Endianness::Native => le_u24,
7816855e09eSopenharmony_ci  }
7826855e09eSopenharmony_ci}
7836855e09eSopenharmony_ci
7846855e09eSopenharmony_ci/// Recognizes an unsigned 4 byte integer
7856855e09eSopenharmony_ci///
7866855e09eSopenharmony_ci/// If the parameter is `nom::number::Endianness::Big`, parse a big endian u32 integer,
7876855e09eSopenharmony_ci/// otherwise if `nom::number::Endianness::Little` parse a little endian u32 integer.
7886855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
7896855e09eSopenharmony_ci/// ```rust
7906855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
7916855e09eSopenharmony_ci/// # use nom::Needed::Size;
7926855e09eSopenharmony_ci/// use nom::number::streaming::u32;
7936855e09eSopenharmony_ci///
7946855e09eSopenharmony_ci/// let be_u32 = |s| {
7956855e09eSopenharmony_ci///   u32::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s)
7966855e09eSopenharmony_ci/// };
7976855e09eSopenharmony_ci///
7986855e09eSopenharmony_ci/// assert_eq!(be_u32(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x00030507)));
7996855e09eSopenharmony_ci/// assert_eq!(be_u32(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3))));
8006855e09eSopenharmony_ci///
8016855e09eSopenharmony_ci/// let le_u32 = |s| {
8026855e09eSopenharmony_ci///   u32::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s)
8036855e09eSopenharmony_ci/// };
8046855e09eSopenharmony_ci///
8056855e09eSopenharmony_ci/// assert_eq!(le_u32(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x07050300)));
8066855e09eSopenharmony_ci/// assert_eq!(le_u32(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3))));
8076855e09eSopenharmony_ci/// ```
8086855e09eSopenharmony_ci#[inline]
8096855e09eSopenharmony_cipub fn u32<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, u32, E>
8106855e09eSopenharmony_ciwhere
8116855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
8126855e09eSopenharmony_ci{
8136855e09eSopenharmony_ci  match endian {
8146855e09eSopenharmony_ci    crate::number::Endianness::Big => be_u32,
8156855e09eSopenharmony_ci    crate::number::Endianness::Little => le_u32,
8166855e09eSopenharmony_ci    #[cfg(target_endian = "big")]
8176855e09eSopenharmony_ci    crate::number::Endianness::Native => be_u32,
8186855e09eSopenharmony_ci    #[cfg(target_endian = "little")]
8196855e09eSopenharmony_ci    crate::number::Endianness::Native => le_u32,
8206855e09eSopenharmony_ci  }
8216855e09eSopenharmony_ci}
8226855e09eSopenharmony_ci
8236855e09eSopenharmony_ci/// Recognizes an unsigned 8 byte integer
8246855e09eSopenharmony_ci///
8256855e09eSopenharmony_ci/// If the parameter is `nom::number::Endianness::Big`, parse a big endian u64 integer,
8266855e09eSopenharmony_ci/// otherwise if `nom::number::Endianness::Little` parse a little endian u64 integer.
8276855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
8286855e09eSopenharmony_ci/// ```rust
8296855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
8306855e09eSopenharmony_ci/// # use nom::Needed::Size;
8316855e09eSopenharmony_ci/// use nom::number::streaming::u64;
8326855e09eSopenharmony_ci///
8336855e09eSopenharmony_ci/// let be_u64 = |s| {
8346855e09eSopenharmony_ci///   u64::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s)
8356855e09eSopenharmony_ci/// };
8366855e09eSopenharmony_ci///
8376855e09eSopenharmony_ci/// assert_eq!(be_u64(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0001020304050607)));
8386855e09eSopenharmony_ci/// assert_eq!(be_u64(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7))));
8396855e09eSopenharmony_ci///
8406855e09eSopenharmony_ci/// let le_u64 = |s| {
8416855e09eSopenharmony_ci///   u64::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s)
8426855e09eSopenharmony_ci/// };
8436855e09eSopenharmony_ci///
8446855e09eSopenharmony_ci/// assert_eq!(le_u64(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0706050403020100)));
8456855e09eSopenharmony_ci/// assert_eq!(le_u64(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7))));
8466855e09eSopenharmony_ci/// ```
8476855e09eSopenharmony_ci#[inline]
8486855e09eSopenharmony_cipub fn u64<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, u64, E>
8496855e09eSopenharmony_ciwhere
8506855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
8516855e09eSopenharmony_ci{
8526855e09eSopenharmony_ci  match endian {
8536855e09eSopenharmony_ci    crate::number::Endianness::Big => be_u64,
8546855e09eSopenharmony_ci    crate::number::Endianness::Little => le_u64,
8556855e09eSopenharmony_ci    #[cfg(target_endian = "big")]
8566855e09eSopenharmony_ci    crate::number::Endianness::Native => be_u64,
8576855e09eSopenharmony_ci    #[cfg(target_endian = "little")]
8586855e09eSopenharmony_ci    crate::number::Endianness::Native => le_u64,
8596855e09eSopenharmony_ci  }
8606855e09eSopenharmony_ci}
8616855e09eSopenharmony_ci
8626855e09eSopenharmony_ci/// Recognizes an unsigned 16 byte integer
8636855e09eSopenharmony_ci///
8646855e09eSopenharmony_ci/// If the parameter is `nom::number::Endianness::Big`, parse a big endian u128 integer,
8656855e09eSopenharmony_ci/// otherwise if `nom::number::Endianness::Little` parse a little endian u128 integer.
8666855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
8676855e09eSopenharmony_ci/// ```rust
8686855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
8696855e09eSopenharmony_ci/// # use nom::Needed::Size;
8706855e09eSopenharmony_ci/// use nom::number::streaming::u128;
8716855e09eSopenharmony_ci///
8726855e09eSopenharmony_ci/// let be_u128 = |s| {
8736855e09eSopenharmony_ci///   u128::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s)
8746855e09eSopenharmony_ci/// };
8756855e09eSopenharmony_ci///
8766855e09eSopenharmony_ci/// assert_eq!(be_u128(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x00010203040506070001020304050607)));
8776855e09eSopenharmony_ci/// assert_eq!(be_u128(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15))));
8786855e09eSopenharmony_ci///
8796855e09eSopenharmony_ci/// let le_u128 = |s| {
8806855e09eSopenharmony_ci///   u128::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s)
8816855e09eSopenharmony_ci/// };
8826855e09eSopenharmony_ci///
8836855e09eSopenharmony_ci/// assert_eq!(le_u128(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x07060504030201000706050403020100)));
8846855e09eSopenharmony_ci/// assert_eq!(le_u128(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15))));
8856855e09eSopenharmony_ci/// ```
8866855e09eSopenharmony_ci#[inline]
8876855e09eSopenharmony_cipub fn u128<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, u128, E>
8886855e09eSopenharmony_ciwhere
8896855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
8906855e09eSopenharmony_ci{
8916855e09eSopenharmony_ci  match endian {
8926855e09eSopenharmony_ci    crate::number::Endianness::Big => be_u128,
8936855e09eSopenharmony_ci    crate::number::Endianness::Little => le_u128,
8946855e09eSopenharmony_ci    #[cfg(target_endian = "big")]
8956855e09eSopenharmony_ci    crate::number::Endianness::Native => be_u128,
8966855e09eSopenharmony_ci    #[cfg(target_endian = "little")]
8976855e09eSopenharmony_ci    crate::number::Endianness::Native => le_u128,
8986855e09eSopenharmony_ci  }
8996855e09eSopenharmony_ci}
9006855e09eSopenharmony_ci
9016855e09eSopenharmony_ci/// Recognizes a signed 1 byte integer
9026855e09eSopenharmony_ci///
9036855e09eSopenharmony_ci/// Note that endianness does not apply to 1 byte numbers.
9046855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
9056855e09eSopenharmony_ci/// ```rust
9066855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
9076855e09eSopenharmony_ci/// # use nom::Needed::Size;
9086855e09eSopenharmony_ci/// use nom::number::streaming::i8;
9096855e09eSopenharmony_ci///
9106855e09eSopenharmony_ci/// let parser = |s| {
9116855e09eSopenharmony_ci///   i8::<_, (_, ErrorKind)>(s)
9126855e09eSopenharmony_ci/// };
9136855e09eSopenharmony_ci///
9146855e09eSopenharmony_ci/// assert_eq!(parser(&b"\x00\x03abcefg"[..]), Ok((&b"\x03abcefg"[..], 0x00)));
9156855e09eSopenharmony_ci/// assert_eq!(parser(&b""[..]), Err(Err::Incomplete(Needed::new(1))));
9166855e09eSopenharmony_ci/// ```
9176855e09eSopenharmony_ci#[inline]
9186855e09eSopenharmony_cipub fn i8<I, E: ParseError<I>>(i: I) -> IResult<I, i8, E>
9196855e09eSopenharmony_ciwhere
9206855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
9216855e09eSopenharmony_ci{
9226855e09eSopenharmony_ci  u8.map(|x| x as i8).parse(i)
9236855e09eSopenharmony_ci}
9246855e09eSopenharmony_ci
9256855e09eSopenharmony_ci/// Recognizes a signed 2 byte integer
9266855e09eSopenharmony_ci///
9276855e09eSopenharmony_ci/// If the parameter is `nom::number::Endianness::Big`, parse a big endian i16 integer,
9286855e09eSopenharmony_ci/// otherwise if `nom::number::Endianness::Little` parse a little endian i16 integer.
9296855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
9306855e09eSopenharmony_ci/// ```rust
9316855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
9326855e09eSopenharmony_ci/// # use nom::Needed::Size;
9336855e09eSopenharmony_ci/// use nom::number::streaming::i16;
9346855e09eSopenharmony_ci///
9356855e09eSopenharmony_ci/// let be_i16 = |s| {
9366855e09eSopenharmony_ci///   i16::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s)
9376855e09eSopenharmony_ci/// };
9386855e09eSopenharmony_ci///
9396855e09eSopenharmony_ci/// assert_eq!(be_i16(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0003)));
9406855e09eSopenharmony_ci/// assert_eq!(be_i16(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1))));
9416855e09eSopenharmony_ci///
9426855e09eSopenharmony_ci/// let le_i16 = |s| {
9436855e09eSopenharmony_ci///   i16::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s)
9446855e09eSopenharmony_ci/// };
9456855e09eSopenharmony_ci///
9466855e09eSopenharmony_ci/// assert_eq!(le_i16(&b"\x00\x03abcefg"[..]), Ok((&b"abcefg"[..], 0x0300)));
9476855e09eSopenharmony_ci/// assert_eq!(le_i16(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(1))));
9486855e09eSopenharmony_ci/// ```
9496855e09eSopenharmony_ci#[inline]
9506855e09eSopenharmony_cipub fn i16<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, i16, E>
9516855e09eSopenharmony_ciwhere
9526855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
9536855e09eSopenharmony_ci{
9546855e09eSopenharmony_ci  match endian {
9556855e09eSopenharmony_ci    crate::number::Endianness::Big => be_i16,
9566855e09eSopenharmony_ci    crate::number::Endianness::Little => le_i16,
9576855e09eSopenharmony_ci    #[cfg(target_endian = "big")]
9586855e09eSopenharmony_ci    crate::number::Endianness::Native => be_i16,
9596855e09eSopenharmony_ci    #[cfg(target_endian = "little")]
9606855e09eSopenharmony_ci    crate::number::Endianness::Native => le_i16,
9616855e09eSopenharmony_ci  }
9626855e09eSopenharmony_ci}
9636855e09eSopenharmony_ci
9646855e09eSopenharmony_ci/// Recognizes a signed 3 byte integer
9656855e09eSopenharmony_ci///
9666855e09eSopenharmony_ci/// If the parameter is `nom::number::Endianness::Big`, parse a big endian i24 integer,
9676855e09eSopenharmony_ci/// otherwise if `nom::number::Endianness::Little` parse a little endian i24 integer.
9686855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
9696855e09eSopenharmony_ci/// ```rust
9706855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
9716855e09eSopenharmony_ci/// # use nom::Needed::Size;
9726855e09eSopenharmony_ci/// use nom::number::streaming::i24;
9736855e09eSopenharmony_ci///
9746855e09eSopenharmony_ci/// let be_i24 = |s| {
9756855e09eSopenharmony_ci///   i24::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s)
9766855e09eSopenharmony_ci/// };
9776855e09eSopenharmony_ci///
9786855e09eSopenharmony_ci/// assert_eq!(be_i24(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x000305)));
9796855e09eSopenharmony_ci/// assert_eq!(be_i24(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2))));
9806855e09eSopenharmony_ci///
9816855e09eSopenharmony_ci/// let le_i24 = |s| {
9826855e09eSopenharmony_ci///   i24::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s)
9836855e09eSopenharmony_ci/// };
9846855e09eSopenharmony_ci///
9856855e09eSopenharmony_ci/// assert_eq!(le_i24(&b"\x00\x03\x05abcefg"[..]), Ok((&b"abcefg"[..], 0x050300)));
9866855e09eSopenharmony_ci/// assert_eq!(le_i24(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(2))));
9876855e09eSopenharmony_ci/// ```
9886855e09eSopenharmony_ci#[inline]
9896855e09eSopenharmony_cipub fn i24<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, i32, E>
9906855e09eSopenharmony_ciwhere
9916855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
9926855e09eSopenharmony_ci{
9936855e09eSopenharmony_ci  match endian {
9946855e09eSopenharmony_ci    crate::number::Endianness::Big => be_i24,
9956855e09eSopenharmony_ci    crate::number::Endianness::Little => le_i24,
9966855e09eSopenharmony_ci    #[cfg(target_endian = "big")]
9976855e09eSopenharmony_ci    crate::number::Endianness::Native => be_i24,
9986855e09eSopenharmony_ci    #[cfg(target_endian = "little")]
9996855e09eSopenharmony_ci    crate::number::Endianness::Native => le_i24,
10006855e09eSopenharmony_ci  }
10016855e09eSopenharmony_ci}
10026855e09eSopenharmony_ci
10036855e09eSopenharmony_ci/// Recognizes a signed 4 byte integer
10046855e09eSopenharmony_ci///
10056855e09eSopenharmony_ci/// If the parameter is `nom::number::Endianness::Big`, parse a big endian i32 integer,
10066855e09eSopenharmony_ci/// otherwise if `nom::number::Endianness::Little` parse a little endian i32 integer.
10076855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
10086855e09eSopenharmony_ci/// ```rust
10096855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
10106855e09eSopenharmony_ci/// # use nom::Needed::Size;
10116855e09eSopenharmony_ci/// use nom::number::streaming::i32;
10126855e09eSopenharmony_ci///
10136855e09eSopenharmony_ci/// let be_i32 = |s| {
10146855e09eSopenharmony_ci///   i32::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s)
10156855e09eSopenharmony_ci/// };
10166855e09eSopenharmony_ci///
10176855e09eSopenharmony_ci/// assert_eq!(be_i32(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x00030507)));
10186855e09eSopenharmony_ci/// assert_eq!(be_i32(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3))));
10196855e09eSopenharmony_ci///
10206855e09eSopenharmony_ci/// let le_i32 = |s| {
10216855e09eSopenharmony_ci///   i32::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s)
10226855e09eSopenharmony_ci/// };
10236855e09eSopenharmony_ci///
10246855e09eSopenharmony_ci/// assert_eq!(le_i32(&b"\x00\x03\x05\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x07050300)));
10256855e09eSopenharmony_ci/// assert_eq!(le_i32(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(3))));
10266855e09eSopenharmony_ci/// ```
10276855e09eSopenharmony_ci#[inline]
10286855e09eSopenharmony_cipub fn i32<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, i32, E>
10296855e09eSopenharmony_ciwhere
10306855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
10316855e09eSopenharmony_ci{
10326855e09eSopenharmony_ci  match endian {
10336855e09eSopenharmony_ci    crate::number::Endianness::Big => be_i32,
10346855e09eSopenharmony_ci    crate::number::Endianness::Little => le_i32,
10356855e09eSopenharmony_ci    #[cfg(target_endian = "big")]
10366855e09eSopenharmony_ci    crate::number::Endianness::Native => be_i32,
10376855e09eSopenharmony_ci    #[cfg(target_endian = "little")]
10386855e09eSopenharmony_ci    crate::number::Endianness::Native => le_i32,
10396855e09eSopenharmony_ci  }
10406855e09eSopenharmony_ci}
10416855e09eSopenharmony_ci
10426855e09eSopenharmony_ci/// Recognizes a signed 8 byte integer
10436855e09eSopenharmony_ci///
10446855e09eSopenharmony_ci/// If the parameter is `nom::number::Endianness::Big`, parse a big endian i64 integer,
10456855e09eSopenharmony_ci/// otherwise if `nom::number::Endianness::Little` parse a little endian i64 integer.
10466855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
10476855e09eSopenharmony_ci/// ```rust
10486855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
10496855e09eSopenharmony_ci/// # use nom::Needed::Size;
10506855e09eSopenharmony_ci/// use nom::number::streaming::i64;
10516855e09eSopenharmony_ci///
10526855e09eSopenharmony_ci/// let be_i64 = |s| {
10536855e09eSopenharmony_ci///   i64::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s)
10546855e09eSopenharmony_ci/// };
10556855e09eSopenharmony_ci///
10566855e09eSopenharmony_ci/// assert_eq!(be_i64(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0001020304050607)));
10576855e09eSopenharmony_ci/// assert_eq!(be_i64(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7))));
10586855e09eSopenharmony_ci///
10596855e09eSopenharmony_ci/// let le_i64 = |s| {
10606855e09eSopenharmony_ci///   i64::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s)
10616855e09eSopenharmony_ci/// };
10626855e09eSopenharmony_ci///
10636855e09eSopenharmony_ci/// assert_eq!(le_i64(&b"\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x0706050403020100)));
10646855e09eSopenharmony_ci/// assert_eq!(le_i64(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(7))));
10656855e09eSopenharmony_ci/// ```
10666855e09eSopenharmony_ci#[inline]
10676855e09eSopenharmony_cipub fn i64<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, i64, E>
10686855e09eSopenharmony_ciwhere
10696855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
10706855e09eSopenharmony_ci{
10716855e09eSopenharmony_ci  match endian {
10726855e09eSopenharmony_ci    crate::number::Endianness::Big => be_i64,
10736855e09eSopenharmony_ci    crate::number::Endianness::Little => le_i64,
10746855e09eSopenharmony_ci    #[cfg(target_endian = "big")]
10756855e09eSopenharmony_ci    crate::number::Endianness::Native => be_i64,
10766855e09eSopenharmony_ci    #[cfg(target_endian = "little")]
10776855e09eSopenharmony_ci    crate::number::Endianness::Native => le_i64,
10786855e09eSopenharmony_ci  }
10796855e09eSopenharmony_ci}
10806855e09eSopenharmony_ci
10816855e09eSopenharmony_ci/// Recognizes a signed 16 byte integer
10826855e09eSopenharmony_ci///
10836855e09eSopenharmony_ci/// If the parameter is `nom::number::Endianness::Big`, parse a big endian i128 integer,
10846855e09eSopenharmony_ci/// otherwise if `nom::number::Endianness::Little` parse a little endian i128 integer.
10856855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
10866855e09eSopenharmony_ci/// ```rust
10876855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
10886855e09eSopenharmony_ci/// # use nom::Needed::Size;
10896855e09eSopenharmony_ci/// use nom::number::streaming::i128;
10906855e09eSopenharmony_ci///
10916855e09eSopenharmony_ci/// let be_i128 = |s| {
10926855e09eSopenharmony_ci///   i128::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s)
10936855e09eSopenharmony_ci/// };
10946855e09eSopenharmony_ci///
10956855e09eSopenharmony_ci/// assert_eq!(be_i128(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x00010203040506070001020304050607)));
10966855e09eSopenharmony_ci/// assert_eq!(be_i128(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15))));
10976855e09eSopenharmony_ci///
10986855e09eSopenharmony_ci/// let le_i128 = |s| {
10996855e09eSopenharmony_ci///   i128::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s)
11006855e09eSopenharmony_ci/// };
11016855e09eSopenharmony_ci///
11026855e09eSopenharmony_ci/// assert_eq!(le_i128(&b"\x00\x01\x02\x03\x04\x05\x06\x07\x00\x01\x02\x03\x04\x05\x06\x07abcefg"[..]), Ok((&b"abcefg"[..], 0x07060504030201000706050403020100)));
11036855e09eSopenharmony_ci/// assert_eq!(le_i128(&b"\x01"[..]), Err(Err::Incomplete(Needed::new(15))));
11046855e09eSopenharmony_ci/// ```
11056855e09eSopenharmony_ci#[inline]
11066855e09eSopenharmony_cipub fn i128<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, i128, E>
11076855e09eSopenharmony_ciwhere
11086855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
11096855e09eSopenharmony_ci{
11106855e09eSopenharmony_ci  match endian {
11116855e09eSopenharmony_ci    crate::number::Endianness::Big => be_i128,
11126855e09eSopenharmony_ci    crate::number::Endianness::Little => le_i128,
11136855e09eSopenharmony_ci    #[cfg(target_endian = "big")]
11146855e09eSopenharmony_ci    crate::number::Endianness::Native => be_i128,
11156855e09eSopenharmony_ci    #[cfg(target_endian = "little")]
11166855e09eSopenharmony_ci    crate::number::Endianness::Native => le_i128,
11176855e09eSopenharmony_ci  }
11186855e09eSopenharmony_ci}
11196855e09eSopenharmony_ci
11206855e09eSopenharmony_ci/// Recognizes a big endian 4 bytes floating point number.
11216855e09eSopenharmony_ci///
11226855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
11236855e09eSopenharmony_ci/// ```rust
11246855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
11256855e09eSopenharmony_ci/// use nom::number::streaming::be_f32;
11266855e09eSopenharmony_ci///
11276855e09eSopenharmony_ci/// let parser = |s| {
11286855e09eSopenharmony_ci///   be_f32::<_, (_, ErrorKind)>(s)
11296855e09eSopenharmony_ci/// };
11306855e09eSopenharmony_ci///
11316855e09eSopenharmony_ci/// assert_eq!(parser(&[0x40, 0x29, 0x00, 0x00][..]), Ok((&b""[..], 2.640625)));
11326855e09eSopenharmony_ci/// assert_eq!(parser(&[0x01][..]), Err(Err::Incomplete(Needed::new(3))));
11336855e09eSopenharmony_ci/// ```
11346855e09eSopenharmony_ci#[inline]
11356855e09eSopenharmony_cipub fn be_f32<I, E: ParseError<I>>(input: I) -> IResult<I, f32, E>
11366855e09eSopenharmony_ciwhere
11376855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
11386855e09eSopenharmony_ci{
11396855e09eSopenharmony_ci  match be_u32(input) {
11406855e09eSopenharmony_ci    Err(e) => Err(e),
11416855e09eSopenharmony_ci    Ok((i, o)) => Ok((i, f32::from_bits(o))),
11426855e09eSopenharmony_ci  }
11436855e09eSopenharmony_ci}
11446855e09eSopenharmony_ci
11456855e09eSopenharmony_ci/// Recognizes a big endian 8 bytes floating point number.
11466855e09eSopenharmony_ci///
11476855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
11486855e09eSopenharmony_ci/// ```rust
11496855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
11506855e09eSopenharmony_ci/// use nom::number::streaming::be_f64;
11516855e09eSopenharmony_ci///
11526855e09eSopenharmony_ci/// let parser = |s| {
11536855e09eSopenharmony_ci///   be_f64::<_, (_, ErrorKind)>(s)
11546855e09eSopenharmony_ci/// };
11556855e09eSopenharmony_ci///
11566855e09eSopenharmony_ci/// assert_eq!(parser(&[0x40, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), Ok((&b""[..], 12.5)));
11576855e09eSopenharmony_ci/// assert_eq!(parser(&[0x01][..]), Err(Err::Incomplete(Needed::new(7))));
11586855e09eSopenharmony_ci/// ```
11596855e09eSopenharmony_ci#[inline]
11606855e09eSopenharmony_cipub fn be_f64<I, E: ParseError<I>>(input: I) -> IResult<I, f64, E>
11616855e09eSopenharmony_ciwhere
11626855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
11636855e09eSopenharmony_ci{
11646855e09eSopenharmony_ci  match be_u64(input) {
11656855e09eSopenharmony_ci    Err(e) => Err(e),
11666855e09eSopenharmony_ci    Ok((i, o)) => Ok((i, f64::from_bits(o))),
11676855e09eSopenharmony_ci  }
11686855e09eSopenharmony_ci}
11696855e09eSopenharmony_ci
11706855e09eSopenharmony_ci/// Recognizes a little endian 4 bytes floating point number.
11716855e09eSopenharmony_ci///
11726855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
11736855e09eSopenharmony_ci/// ```rust
11746855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
11756855e09eSopenharmony_ci/// use nom::number::streaming::le_f32;
11766855e09eSopenharmony_ci///
11776855e09eSopenharmony_ci/// let parser = |s| {
11786855e09eSopenharmony_ci///   le_f32::<_, (_, ErrorKind)>(s)
11796855e09eSopenharmony_ci/// };
11806855e09eSopenharmony_ci///
11816855e09eSopenharmony_ci/// assert_eq!(parser(&[0x00, 0x00, 0x48, 0x41][..]), Ok((&b""[..], 12.5)));
11826855e09eSopenharmony_ci/// assert_eq!(parser(&[0x01][..]), Err(Err::Incomplete(Needed::new(3))));
11836855e09eSopenharmony_ci/// ```
11846855e09eSopenharmony_ci#[inline]
11856855e09eSopenharmony_cipub fn le_f32<I, E: ParseError<I>>(input: I) -> IResult<I, f32, E>
11866855e09eSopenharmony_ciwhere
11876855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
11886855e09eSopenharmony_ci{
11896855e09eSopenharmony_ci  match le_u32(input) {
11906855e09eSopenharmony_ci    Err(e) => Err(e),
11916855e09eSopenharmony_ci    Ok((i, o)) => Ok((i, f32::from_bits(o))),
11926855e09eSopenharmony_ci  }
11936855e09eSopenharmony_ci}
11946855e09eSopenharmony_ci
11956855e09eSopenharmony_ci/// Recognizes a little endian 8 bytes floating point number.
11966855e09eSopenharmony_ci///
11976855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
11986855e09eSopenharmony_ci/// ```rust
11996855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
12006855e09eSopenharmony_ci/// use nom::number::streaming::le_f64;
12016855e09eSopenharmony_ci///
12026855e09eSopenharmony_ci/// let parser = |s| {
12036855e09eSopenharmony_ci///   le_f64::<_, (_, ErrorKind)>(s)
12046855e09eSopenharmony_ci/// };
12056855e09eSopenharmony_ci///
12066855e09eSopenharmony_ci/// assert_eq!(parser(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x41][..]), Ok((&b""[..], 3145728.0)));
12076855e09eSopenharmony_ci/// assert_eq!(parser(&[0x01][..]), Err(Err::Incomplete(Needed::new(7))));
12086855e09eSopenharmony_ci/// ```
12096855e09eSopenharmony_ci#[inline]
12106855e09eSopenharmony_cipub fn le_f64<I, E: ParseError<I>>(input: I) -> IResult<I, f64, E>
12116855e09eSopenharmony_ciwhere
12126855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
12136855e09eSopenharmony_ci{
12146855e09eSopenharmony_ci  match le_u64(input) {
12156855e09eSopenharmony_ci    Err(e) => Err(e),
12166855e09eSopenharmony_ci    Ok((i, o)) => Ok((i, f64::from_bits(o))),
12176855e09eSopenharmony_ci  }
12186855e09eSopenharmony_ci}
12196855e09eSopenharmony_ci
12206855e09eSopenharmony_ci/// Recognizes a 4 byte floating point number
12216855e09eSopenharmony_ci///
12226855e09eSopenharmony_ci/// If the parameter is `nom::number::Endianness::Big`, parse a big endian f32 float,
12236855e09eSopenharmony_ci/// otherwise if `nom::number::Endianness::Little` parse a little endian f32 float.
12246855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
12256855e09eSopenharmony_ci/// ```rust
12266855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
12276855e09eSopenharmony_ci/// # use nom::Needed::Size;
12286855e09eSopenharmony_ci/// use nom::number::streaming::f32;
12296855e09eSopenharmony_ci///
12306855e09eSopenharmony_ci/// let be_f32 = |s| {
12316855e09eSopenharmony_ci///   f32::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s)
12326855e09eSopenharmony_ci/// };
12336855e09eSopenharmony_ci///
12346855e09eSopenharmony_ci/// assert_eq!(be_f32(&[0x41, 0x48, 0x00, 0x00][..]), Ok((&b""[..], 12.5)));
12356855e09eSopenharmony_ci/// assert_eq!(be_f32(&b"abc"[..]), Err(Err::Incomplete(Needed::new(1))));
12366855e09eSopenharmony_ci///
12376855e09eSopenharmony_ci/// let le_f32 = |s| {
12386855e09eSopenharmony_ci///   f32::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s)
12396855e09eSopenharmony_ci/// };
12406855e09eSopenharmony_ci///
12416855e09eSopenharmony_ci/// assert_eq!(le_f32(&[0x00, 0x00, 0x48, 0x41][..]), Ok((&b""[..], 12.5)));
12426855e09eSopenharmony_ci/// assert_eq!(le_f32(&b"abc"[..]), Err(Err::Incomplete(Needed::new(1))));
12436855e09eSopenharmony_ci/// ```
12446855e09eSopenharmony_ci#[inline]
12456855e09eSopenharmony_cipub fn f32<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, f32, E>
12466855e09eSopenharmony_ciwhere
12476855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
12486855e09eSopenharmony_ci{
12496855e09eSopenharmony_ci  match endian {
12506855e09eSopenharmony_ci    crate::number::Endianness::Big => be_f32,
12516855e09eSopenharmony_ci    crate::number::Endianness::Little => le_f32,
12526855e09eSopenharmony_ci    #[cfg(target_endian = "big")]
12536855e09eSopenharmony_ci    crate::number::Endianness::Native => be_f32,
12546855e09eSopenharmony_ci    #[cfg(target_endian = "little")]
12556855e09eSopenharmony_ci    crate::number::Endianness::Native => le_f32,
12566855e09eSopenharmony_ci  }
12576855e09eSopenharmony_ci}
12586855e09eSopenharmony_ci
12596855e09eSopenharmony_ci/// Recognizes an 8 byte floating point number
12606855e09eSopenharmony_ci///
12616855e09eSopenharmony_ci/// If the parameter is `nom::number::Endianness::Big`, parse a big endian f64 float,
12626855e09eSopenharmony_ci/// otherwise if `nom::number::Endianness::Little` parse a little endian f64 float.
12636855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
12646855e09eSopenharmony_ci/// ```rust
12656855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
12666855e09eSopenharmony_ci/// # use nom::Needed::Size;
12676855e09eSopenharmony_ci/// use nom::number::streaming::f64;
12686855e09eSopenharmony_ci///
12696855e09eSopenharmony_ci/// let be_f64 = |s| {
12706855e09eSopenharmony_ci///   f64::<_, (_, ErrorKind)>(nom::number::Endianness::Big)(s)
12716855e09eSopenharmony_ci/// };
12726855e09eSopenharmony_ci///
12736855e09eSopenharmony_ci/// assert_eq!(be_f64(&[0x40, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]), Ok((&b""[..], 12.5)));
12746855e09eSopenharmony_ci/// assert_eq!(be_f64(&b"abc"[..]), Err(Err::Incomplete(Needed::new(5))));
12756855e09eSopenharmony_ci///
12766855e09eSopenharmony_ci/// let le_f64 = |s| {
12776855e09eSopenharmony_ci///   f64::<_, (_, ErrorKind)>(nom::number::Endianness::Little)(s)
12786855e09eSopenharmony_ci/// };
12796855e09eSopenharmony_ci///
12806855e09eSopenharmony_ci/// assert_eq!(le_f64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x40][..]), Ok((&b""[..], 12.5)));
12816855e09eSopenharmony_ci/// assert_eq!(le_f64(&b"abc"[..]), Err(Err::Incomplete(Needed::new(5))));
12826855e09eSopenharmony_ci/// ```
12836855e09eSopenharmony_ci#[inline]
12846855e09eSopenharmony_cipub fn f64<I, E: ParseError<I>>(endian: crate::number::Endianness) -> fn(I) -> IResult<I, f64, E>
12856855e09eSopenharmony_ciwhere
12866855e09eSopenharmony_ci  I: Slice<RangeFrom<usize>> + InputIter<Item = u8> + InputLength,
12876855e09eSopenharmony_ci{
12886855e09eSopenharmony_ci  match endian {
12896855e09eSopenharmony_ci    crate::number::Endianness::Big => be_f64,
12906855e09eSopenharmony_ci    crate::number::Endianness::Little => le_f64,
12916855e09eSopenharmony_ci    #[cfg(target_endian = "big")]
12926855e09eSopenharmony_ci    crate::number::Endianness::Native => be_f64,
12936855e09eSopenharmony_ci    #[cfg(target_endian = "little")]
12946855e09eSopenharmony_ci    crate::number::Endianness::Native => le_f64,
12956855e09eSopenharmony_ci  }
12966855e09eSopenharmony_ci}
12976855e09eSopenharmony_ci
12986855e09eSopenharmony_ci/// Recognizes a hex-encoded integer.
12996855e09eSopenharmony_ci///
13006855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
13016855e09eSopenharmony_ci/// ```rust
13026855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
13036855e09eSopenharmony_ci/// use nom::number::streaming::hex_u32;
13046855e09eSopenharmony_ci///
13056855e09eSopenharmony_ci/// let parser = |s| {
13066855e09eSopenharmony_ci///   hex_u32(s)
13076855e09eSopenharmony_ci/// };
13086855e09eSopenharmony_ci///
13096855e09eSopenharmony_ci/// assert_eq!(parser(b"01AE;"), Ok((&b";"[..], 0x01AE)));
13106855e09eSopenharmony_ci/// assert_eq!(parser(b"abc"), Err(Err::Incomplete(Needed::new(1))));
13116855e09eSopenharmony_ci/// assert_eq!(parser(b"ggg"), Err(Err::Error((&b"ggg"[..], ErrorKind::IsA))));
13126855e09eSopenharmony_ci/// ```
13136855e09eSopenharmony_ci#[inline]
13146855e09eSopenharmony_cipub fn hex_u32<'a, E: ParseError<&'a [u8]>>(input: &'a [u8]) -> IResult<&'a [u8], u32, E> {
13156855e09eSopenharmony_ci  let (i, o) = crate::bytes::streaming::is_a(&b"0123456789abcdefABCDEF"[..])(input)?;
13166855e09eSopenharmony_ci
13176855e09eSopenharmony_ci  // Do not parse more than 8 characters for a u32
13186855e09eSopenharmony_ci  let (parsed, remaining) = if o.len() <= 8 {
13196855e09eSopenharmony_ci    (o, i)
13206855e09eSopenharmony_ci  } else {
13216855e09eSopenharmony_ci    (&input[..8], &input[8..])
13226855e09eSopenharmony_ci  };
13236855e09eSopenharmony_ci
13246855e09eSopenharmony_ci  let res = parsed
13256855e09eSopenharmony_ci    .iter()
13266855e09eSopenharmony_ci    .rev()
13276855e09eSopenharmony_ci    .enumerate()
13286855e09eSopenharmony_ci    .map(|(k, &v)| {
13296855e09eSopenharmony_ci      let digit = v as char;
13306855e09eSopenharmony_ci      digit.to_digit(16).unwrap_or(0) << (k * 4)
13316855e09eSopenharmony_ci    })
13326855e09eSopenharmony_ci    .sum();
13336855e09eSopenharmony_ci
13346855e09eSopenharmony_ci  Ok((remaining, res))
13356855e09eSopenharmony_ci}
13366855e09eSopenharmony_ci
13376855e09eSopenharmony_ci/// Recognizes a floating point number in text format and returns the corresponding part of the input.
13386855e09eSopenharmony_ci///
13396855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if it reaches the end of input.
13406855e09eSopenharmony_ci///
13416855e09eSopenharmony_ci/// ```rust
13426855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
13436855e09eSopenharmony_ci/// use nom::number::streaming::recognize_float;
13446855e09eSopenharmony_ci///
13456855e09eSopenharmony_ci/// let parser = |s| {
13466855e09eSopenharmony_ci///   recognize_float(s)
13476855e09eSopenharmony_ci/// };
13486855e09eSopenharmony_ci///
13496855e09eSopenharmony_ci/// assert_eq!(parser("11e-1;"), Ok((";", "11e-1")));
13506855e09eSopenharmony_ci/// assert_eq!(parser("123E-02;"), Ok((";", "123E-02")));
13516855e09eSopenharmony_ci/// assert_eq!(parser("123K-01"), Ok(("K-01", "123")));
13526855e09eSopenharmony_ci/// assert_eq!(parser("abc"), Err(Err::Error(("abc", ErrorKind::Char))));
13536855e09eSopenharmony_ci/// ```
13546855e09eSopenharmony_ci#[rustfmt::skip]
13556855e09eSopenharmony_cipub fn recognize_float<T, E:ParseError<T>>(input: T) -> IResult<T, T, E>
13566855e09eSopenharmony_ciwhere
13576855e09eSopenharmony_ci  T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>>,
13586855e09eSopenharmony_ci  T: Clone + Offset,
13596855e09eSopenharmony_ci  T: InputIter,
13606855e09eSopenharmony_ci  <T as InputIter>::Item: AsChar,
13616855e09eSopenharmony_ci  T: InputTakeAtPosition + InputLength,
13626855e09eSopenharmony_ci  <T as InputTakeAtPosition>::Item: AsChar
13636855e09eSopenharmony_ci{
13646855e09eSopenharmony_ci  recognize(
13656855e09eSopenharmony_ci    tuple((
13666855e09eSopenharmony_ci      opt(alt((char('+'), char('-')))),
13676855e09eSopenharmony_ci      alt((
13686855e09eSopenharmony_ci        map(tuple((digit1, opt(pair(char('.'), opt(digit1))))), |_| ()),
13696855e09eSopenharmony_ci        map(tuple((char('.'), digit1)), |_| ())
13706855e09eSopenharmony_ci      )),
13716855e09eSopenharmony_ci      opt(tuple((
13726855e09eSopenharmony_ci        alt((char('e'), char('E'))),
13736855e09eSopenharmony_ci        opt(alt((char('+'), char('-')))),
13746855e09eSopenharmony_ci        cut(digit1)
13756855e09eSopenharmony_ci      )))
13766855e09eSopenharmony_ci    ))
13776855e09eSopenharmony_ci  )(input)
13786855e09eSopenharmony_ci}
13796855e09eSopenharmony_ci
13806855e09eSopenharmony_ci// workaround until issues with minimal-lexical are fixed
13816855e09eSopenharmony_ci#[doc(hidden)]
13826855e09eSopenharmony_cipub fn recognize_float_or_exceptions<T, E: ParseError<T>>(input: T) -> IResult<T, T, E>
13836855e09eSopenharmony_ciwhere
13846855e09eSopenharmony_ci  T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>>,
13856855e09eSopenharmony_ci  T: Clone + Offset,
13866855e09eSopenharmony_ci  T: InputIter + InputTake + InputLength + Compare<&'static str>,
13876855e09eSopenharmony_ci  <T as InputIter>::Item: AsChar,
13886855e09eSopenharmony_ci  T: InputTakeAtPosition,
13896855e09eSopenharmony_ci  <T as InputTakeAtPosition>::Item: AsChar,
13906855e09eSopenharmony_ci{
13916855e09eSopenharmony_ci  alt((
13926855e09eSopenharmony_ci    |i: T| {
13936855e09eSopenharmony_ci      recognize_float::<_, E>(i.clone()).map_err(|e| match e {
13946855e09eSopenharmony_ci        crate::Err::Error(_) => crate::Err::Error(E::from_error_kind(i, ErrorKind::Float)),
13956855e09eSopenharmony_ci        crate::Err::Failure(_) => crate::Err::Failure(E::from_error_kind(i, ErrorKind::Float)),
13966855e09eSopenharmony_ci        crate::Err::Incomplete(needed) => crate::Err::Incomplete(needed),
13976855e09eSopenharmony_ci      })
13986855e09eSopenharmony_ci    },
13996855e09eSopenharmony_ci    |i: T| {
14006855e09eSopenharmony_ci      crate::bytes::streaming::tag_no_case::<_, _, E>("nan")(i.clone())
14016855e09eSopenharmony_ci        .map_err(|_| crate::Err::Error(E::from_error_kind(i, ErrorKind::Float)))
14026855e09eSopenharmony_ci    },
14036855e09eSopenharmony_ci    |i: T| {
14046855e09eSopenharmony_ci      crate::bytes::streaming::tag_no_case::<_, _, E>("inf")(i.clone())
14056855e09eSopenharmony_ci        .map_err(|_| crate::Err::Error(E::from_error_kind(i, ErrorKind::Float)))
14066855e09eSopenharmony_ci    },
14076855e09eSopenharmony_ci    |i: T| {
14086855e09eSopenharmony_ci      crate::bytes::streaming::tag_no_case::<_, _, E>("infinity")(i.clone())
14096855e09eSopenharmony_ci        .map_err(|_| crate::Err::Error(E::from_error_kind(i, ErrorKind::Float)))
14106855e09eSopenharmony_ci    },
14116855e09eSopenharmony_ci  ))(input)
14126855e09eSopenharmony_ci}
14136855e09eSopenharmony_ci
14146855e09eSopenharmony_ci/// Recognizes a floating point number in text format
14156855e09eSopenharmony_ci///
14166855e09eSopenharmony_ci/// It returns a tuple of (`sign`, `integer part`, `fraction part` and `exponent`) of the input
14176855e09eSopenharmony_ci/// data.
14186855e09eSopenharmony_ci///
14196855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
14206855e09eSopenharmony_ci///
14216855e09eSopenharmony_cipub fn recognize_float_parts<T, E: ParseError<T>>(input: T) -> IResult<T, (bool, T, T, i32), E>
14226855e09eSopenharmony_ciwhere
14236855e09eSopenharmony_ci  T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>>,
14246855e09eSopenharmony_ci  T: Clone + Offset,
14256855e09eSopenharmony_ci  T: InputIter + crate::traits::ParseTo<i32>,
14266855e09eSopenharmony_ci  <T as InputIter>::Item: AsChar,
14276855e09eSopenharmony_ci  T: InputTakeAtPosition + InputTake + InputLength,
14286855e09eSopenharmony_ci  <T as InputTakeAtPosition>::Item: AsChar,
14296855e09eSopenharmony_ci  T: for<'a> Compare<&'a [u8]>,
14306855e09eSopenharmony_ci  T: AsBytes,
14316855e09eSopenharmony_ci{
14326855e09eSopenharmony_ci  let (i, sign) = sign(input.clone())?;
14336855e09eSopenharmony_ci
14346855e09eSopenharmony_ci  //let (i, zeroes) = take_while(|c: <T as InputTakeAtPosition>::Item| c.as_char() == '0')(i)?;
14356855e09eSopenharmony_ci  let (i, zeroes) = match i.as_bytes().iter().position(|c| *c != b'0') {
14366855e09eSopenharmony_ci    Some(index) => i.take_split(index),
14376855e09eSopenharmony_ci    None => i.take_split(i.input_len()),
14386855e09eSopenharmony_ci  };
14396855e09eSopenharmony_ci
14406855e09eSopenharmony_ci  //let (i, mut integer) = digit0(i)?;
14416855e09eSopenharmony_ci  let (i, mut integer) = match i
14426855e09eSopenharmony_ci    .as_bytes()
14436855e09eSopenharmony_ci    .iter()
14446855e09eSopenharmony_ci    .position(|c| !(*c >= b'0' && *c <= b'9'))
14456855e09eSopenharmony_ci  {
14466855e09eSopenharmony_ci    Some(index) => i.take_split(index),
14476855e09eSopenharmony_ci    None => i.take_split(i.input_len()),
14486855e09eSopenharmony_ci  };
14496855e09eSopenharmony_ci
14506855e09eSopenharmony_ci  if integer.input_len() == 0 && zeroes.input_len() > 0 {
14516855e09eSopenharmony_ci    // keep the last zero if integer is empty
14526855e09eSopenharmony_ci    integer = zeroes.slice(zeroes.input_len() - 1..);
14536855e09eSopenharmony_ci  }
14546855e09eSopenharmony_ci
14556855e09eSopenharmony_ci  let (i, opt_dot) = opt(tag(&b"."[..]))(i)?;
14566855e09eSopenharmony_ci  let (i, fraction) = if opt_dot.is_none() {
14576855e09eSopenharmony_ci    let i2 = i.clone();
14586855e09eSopenharmony_ci    (i2, i.slice(..0))
14596855e09eSopenharmony_ci  } else {
14606855e09eSopenharmony_ci    // match number, trim right zeroes
14616855e09eSopenharmony_ci    let mut zero_count = 0usize;
14626855e09eSopenharmony_ci    let mut position = None;
14636855e09eSopenharmony_ci    for (pos, c) in i.as_bytes().iter().enumerate() {
14646855e09eSopenharmony_ci      if *c >= b'0' && *c <= b'9' {
14656855e09eSopenharmony_ci        if *c == b'0' {
14666855e09eSopenharmony_ci          zero_count += 1;
14676855e09eSopenharmony_ci        } else {
14686855e09eSopenharmony_ci          zero_count = 0;
14696855e09eSopenharmony_ci        }
14706855e09eSopenharmony_ci      } else {
14716855e09eSopenharmony_ci        position = Some(pos);
14726855e09eSopenharmony_ci        break;
14736855e09eSopenharmony_ci      }
14746855e09eSopenharmony_ci    }
14756855e09eSopenharmony_ci
14766855e09eSopenharmony_ci    let position = match position {
14776855e09eSopenharmony_ci      Some(p) => p,
14786855e09eSopenharmony_ci      None => return Err(Err::Incomplete(Needed::new(1))),
14796855e09eSopenharmony_ci    };
14806855e09eSopenharmony_ci
14816855e09eSopenharmony_ci    let index = if zero_count == 0 {
14826855e09eSopenharmony_ci      position
14836855e09eSopenharmony_ci    } else if zero_count == position {
14846855e09eSopenharmony_ci      position - zero_count + 1
14856855e09eSopenharmony_ci    } else {
14866855e09eSopenharmony_ci      position - zero_count
14876855e09eSopenharmony_ci    };
14886855e09eSopenharmony_ci
14896855e09eSopenharmony_ci    (i.slice(position..), i.slice(..index))
14906855e09eSopenharmony_ci  };
14916855e09eSopenharmony_ci
14926855e09eSopenharmony_ci  if integer.input_len() == 0 && fraction.input_len() == 0 {
14936855e09eSopenharmony_ci    return Err(Err::Error(E::from_error_kind(input, ErrorKind::Float)));
14946855e09eSopenharmony_ci  }
14956855e09eSopenharmony_ci
14966855e09eSopenharmony_ci  let i2 = i.clone();
14976855e09eSopenharmony_ci  let (i, e) = match i.as_bytes().iter().next() {
14986855e09eSopenharmony_ci    Some(b'e') => (i.slice(1..), true),
14996855e09eSopenharmony_ci    Some(b'E') => (i.slice(1..), true),
15006855e09eSopenharmony_ci    _ => (i, false),
15016855e09eSopenharmony_ci  };
15026855e09eSopenharmony_ci
15036855e09eSopenharmony_ci  let (i, exp) = if e {
15046855e09eSopenharmony_ci    cut(crate::character::streaming::i32)(i)?
15056855e09eSopenharmony_ci  } else {
15066855e09eSopenharmony_ci    (i2, 0)
15076855e09eSopenharmony_ci  };
15086855e09eSopenharmony_ci
15096855e09eSopenharmony_ci  Ok((i, (sign, integer, fraction, exp)))
15106855e09eSopenharmony_ci}
15116855e09eSopenharmony_ci
15126855e09eSopenharmony_ci/// Recognizes floating point number in text format and returns a f32.
15136855e09eSopenharmony_ci///
15146855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
15156855e09eSopenharmony_ci///
15166855e09eSopenharmony_ci/// ```rust
15176855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
15186855e09eSopenharmony_ci/// # use nom::Needed::Size;
15196855e09eSopenharmony_ci/// use nom::number::complete::float;
15206855e09eSopenharmony_ci///
15216855e09eSopenharmony_ci/// let parser = |s| {
15226855e09eSopenharmony_ci///   float(s)
15236855e09eSopenharmony_ci/// };
15246855e09eSopenharmony_ci///
15256855e09eSopenharmony_ci/// assert_eq!(parser("11e-1"), Ok(("", 1.1)));
15266855e09eSopenharmony_ci/// assert_eq!(parser("123E-02"), Ok(("", 1.23)));
15276855e09eSopenharmony_ci/// assert_eq!(parser("123K-01"), Ok(("K-01", 123.0)));
15286855e09eSopenharmony_ci/// assert_eq!(parser("abc"), Err(Err::Error(("abc", ErrorKind::Float))));
15296855e09eSopenharmony_ci/// ```
15306855e09eSopenharmony_cipub fn float<T, E: ParseError<T>>(input: T) -> IResult<T, f32, E>
15316855e09eSopenharmony_ciwhere
15326855e09eSopenharmony_ci  T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>>,
15336855e09eSopenharmony_ci  T: Clone + Offset,
15346855e09eSopenharmony_ci  T: InputIter + InputLength + InputTake + crate::traits::ParseTo<f32> + Compare<&'static str>,
15356855e09eSopenharmony_ci  <T as InputIter>::Item: AsChar,
15366855e09eSopenharmony_ci  <T as InputIter>::IterElem: Clone,
15376855e09eSopenharmony_ci  T: InputTakeAtPosition,
15386855e09eSopenharmony_ci  <T as InputTakeAtPosition>::Item: AsChar,
15396855e09eSopenharmony_ci  T: AsBytes,
15406855e09eSopenharmony_ci  T: for<'a> Compare<&'a [u8]>,
15416855e09eSopenharmony_ci{
15426855e09eSopenharmony_ci  /*
15436855e09eSopenharmony_ci  let (i, (sign, integer, fraction, exponent)) = recognize_float_parts(input)?;
15446855e09eSopenharmony_ci
15456855e09eSopenharmony_ci  let mut float: f32 = minimal_lexical::parse_float(
15466855e09eSopenharmony_ci    integer.as_bytes().iter(),
15476855e09eSopenharmony_ci    fraction.as_bytes().iter(),
15486855e09eSopenharmony_ci    exponent,
15496855e09eSopenharmony_ci  );
15506855e09eSopenharmony_ci  if !sign {
15516855e09eSopenharmony_ci    float = -float;
15526855e09eSopenharmony_ci  }
15536855e09eSopenharmony_ci
15546855e09eSopenharmony_ci  Ok((i, float))
15556855e09eSopenharmony_ci  */
15566855e09eSopenharmony_ci  let (i, s) = recognize_float_or_exceptions(input)?;
15576855e09eSopenharmony_ci  match s.parse_to() {
15586855e09eSopenharmony_ci    Some(f) => Ok((i, f)),
15596855e09eSopenharmony_ci    None => Err(crate::Err::Error(E::from_error_kind(
15606855e09eSopenharmony_ci      i,
15616855e09eSopenharmony_ci      crate::error::ErrorKind::Float,
15626855e09eSopenharmony_ci    ))),
15636855e09eSopenharmony_ci  }
15646855e09eSopenharmony_ci}
15656855e09eSopenharmony_ci
15666855e09eSopenharmony_ci/// Recognizes floating point number in text format and returns a f64.
15676855e09eSopenharmony_ci///
15686855e09eSopenharmony_ci/// *Streaming version*: Will return `Err(nom::Err::Incomplete(_))` if there is not enough data.
15696855e09eSopenharmony_ci///
15706855e09eSopenharmony_ci/// ```rust
15716855e09eSopenharmony_ci/// # use nom::{Err, error::ErrorKind, Needed};
15726855e09eSopenharmony_ci/// # use nom::Needed::Size;
15736855e09eSopenharmony_ci/// use nom::number::complete::double;
15746855e09eSopenharmony_ci///
15756855e09eSopenharmony_ci/// let parser = |s| {
15766855e09eSopenharmony_ci///   double(s)
15776855e09eSopenharmony_ci/// };
15786855e09eSopenharmony_ci///
15796855e09eSopenharmony_ci/// assert_eq!(parser("11e-1"), Ok(("", 1.1)));
15806855e09eSopenharmony_ci/// assert_eq!(parser("123E-02"), Ok(("", 1.23)));
15816855e09eSopenharmony_ci/// assert_eq!(parser("123K-01"), Ok(("K-01", 123.0)));
15826855e09eSopenharmony_ci/// assert_eq!(parser("abc"), Err(Err::Error(("abc", ErrorKind::Float))));
15836855e09eSopenharmony_ci/// ```
15846855e09eSopenharmony_cipub fn double<T, E: ParseError<T>>(input: T) -> IResult<T, f64, E>
15856855e09eSopenharmony_ciwhere
15866855e09eSopenharmony_ci  T: Slice<RangeFrom<usize>> + Slice<RangeTo<usize>>,
15876855e09eSopenharmony_ci  T: Clone + Offset,
15886855e09eSopenharmony_ci  T: InputIter + InputLength + InputTake + crate::traits::ParseTo<f64> + Compare<&'static str>,
15896855e09eSopenharmony_ci  <T as InputIter>::Item: AsChar,
15906855e09eSopenharmony_ci  <T as InputIter>::IterElem: Clone,
15916855e09eSopenharmony_ci  T: InputTakeAtPosition,
15926855e09eSopenharmony_ci  <T as InputTakeAtPosition>::Item: AsChar,
15936855e09eSopenharmony_ci  T: AsBytes,
15946855e09eSopenharmony_ci  T: for<'a> Compare<&'a [u8]>,
15956855e09eSopenharmony_ci{
15966855e09eSopenharmony_ci  /*
15976855e09eSopenharmony_ci  let (i, (sign, integer, fraction, exponent)) = recognize_float_parts(input)?;
15986855e09eSopenharmony_ci
15996855e09eSopenharmony_ci  let mut float: f64 = minimal_lexical::parse_float(
16006855e09eSopenharmony_ci    integer.as_bytes().iter(),
16016855e09eSopenharmony_ci    fraction.as_bytes().iter(),
16026855e09eSopenharmony_ci    exponent,
16036855e09eSopenharmony_ci  );
16046855e09eSopenharmony_ci  if !sign {
16056855e09eSopenharmony_ci    float = -float;
16066855e09eSopenharmony_ci  }
16076855e09eSopenharmony_ci
16086855e09eSopenharmony_ci  Ok((i, float))
16096855e09eSopenharmony_ci  */
16106855e09eSopenharmony_ci  let (i, s) = recognize_float_or_exceptions(input)?;
16116855e09eSopenharmony_ci  match s.parse_to() {
16126855e09eSopenharmony_ci    Some(f) => Ok((i, f)),
16136855e09eSopenharmony_ci    None => Err(crate::Err::Error(E::from_error_kind(
16146855e09eSopenharmony_ci      i,
16156855e09eSopenharmony_ci      crate::error::ErrorKind::Float,
16166855e09eSopenharmony_ci    ))),
16176855e09eSopenharmony_ci  }
16186855e09eSopenharmony_ci}
16196855e09eSopenharmony_ci
16206855e09eSopenharmony_ci#[cfg(test)]
16216855e09eSopenharmony_cimod tests {
16226855e09eSopenharmony_ci  use super::*;
16236855e09eSopenharmony_ci  use crate::error::ErrorKind;
16246855e09eSopenharmony_ci  use crate::internal::{Err, Needed};
16256855e09eSopenharmony_ci  use proptest::prelude::*;
16266855e09eSopenharmony_ci
16276855e09eSopenharmony_ci  macro_rules! assert_parse(
16286855e09eSopenharmony_ci    ($left: expr, $right: expr) => {
16296855e09eSopenharmony_ci      let res: $crate::IResult<_, _, (_, ErrorKind)> = $left;
16306855e09eSopenharmony_ci      assert_eq!(res, $right);
16316855e09eSopenharmony_ci    };
16326855e09eSopenharmony_ci  );
16336855e09eSopenharmony_ci
16346855e09eSopenharmony_ci  #[test]
16356855e09eSopenharmony_ci  fn i8_tests() {
16366855e09eSopenharmony_ci    assert_parse!(be_i8(&[0x00][..]), Ok((&b""[..], 0)));
16376855e09eSopenharmony_ci    assert_parse!(be_i8(&[0x7f][..]), Ok((&b""[..], 127)));
16386855e09eSopenharmony_ci    assert_parse!(be_i8(&[0xff][..]), Ok((&b""[..], -1)));
16396855e09eSopenharmony_ci    assert_parse!(be_i8(&[0x80][..]), Ok((&b""[..], -128)));
16406855e09eSopenharmony_ci    assert_parse!(be_i8(&[][..]), Err(Err::Incomplete(Needed::new(1))));
16416855e09eSopenharmony_ci  }
16426855e09eSopenharmony_ci
16436855e09eSopenharmony_ci  #[test]
16446855e09eSopenharmony_ci  fn i16_tests() {
16456855e09eSopenharmony_ci    assert_parse!(be_i16(&[0x00, 0x00][..]), Ok((&b""[..], 0)));
16466855e09eSopenharmony_ci    assert_parse!(be_i16(&[0x7f, 0xff][..]), Ok((&b""[..], 32_767_i16)));
16476855e09eSopenharmony_ci    assert_parse!(be_i16(&[0xff, 0xff][..]), Ok((&b""[..], -1)));
16486855e09eSopenharmony_ci    assert_parse!(be_i16(&[0x80, 0x00][..]), Ok((&b""[..], -32_768_i16)));
16496855e09eSopenharmony_ci    assert_parse!(be_i16(&[][..]), Err(Err::Incomplete(Needed::new(2))));
16506855e09eSopenharmony_ci    assert_parse!(be_i16(&[0x00][..]), Err(Err::Incomplete(Needed::new(1))));
16516855e09eSopenharmony_ci  }
16526855e09eSopenharmony_ci
16536855e09eSopenharmony_ci  #[test]
16546855e09eSopenharmony_ci  fn u24_tests() {
16556855e09eSopenharmony_ci    assert_parse!(be_u24(&[0x00, 0x00, 0x00][..]), Ok((&b""[..], 0)));
16566855e09eSopenharmony_ci    assert_parse!(be_u24(&[0x00, 0xFF, 0xFF][..]), Ok((&b""[..], 65_535_u32)));
16576855e09eSopenharmony_ci    assert_parse!(
16586855e09eSopenharmony_ci      be_u24(&[0x12, 0x34, 0x56][..]),
16596855e09eSopenharmony_ci      Ok((&b""[..], 1_193_046_u32))
16606855e09eSopenharmony_ci    );
16616855e09eSopenharmony_ci    assert_parse!(be_u24(&[][..]), Err(Err::Incomplete(Needed::new(3))));
16626855e09eSopenharmony_ci    assert_parse!(be_u24(&[0x00][..]), Err(Err::Incomplete(Needed::new(2))));
16636855e09eSopenharmony_ci    assert_parse!(
16646855e09eSopenharmony_ci      be_u24(&[0x00, 0x00][..]),
16656855e09eSopenharmony_ci      Err(Err::Incomplete(Needed::new(1)))
16666855e09eSopenharmony_ci    );
16676855e09eSopenharmony_ci  }
16686855e09eSopenharmony_ci
16696855e09eSopenharmony_ci  #[test]
16706855e09eSopenharmony_ci  fn i24_tests() {
16716855e09eSopenharmony_ci    assert_parse!(be_i24(&[0xFF, 0xFF, 0xFF][..]), Ok((&b""[..], -1_i32)));
16726855e09eSopenharmony_ci    assert_parse!(be_i24(&[0xFF, 0x00, 0x00][..]), Ok((&b""[..], -65_536_i32)));
16736855e09eSopenharmony_ci    assert_parse!(
16746855e09eSopenharmony_ci      be_i24(&[0xED, 0xCB, 0xAA][..]),
16756855e09eSopenharmony_ci      Ok((&b""[..], -1_193_046_i32))
16766855e09eSopenharmony_ci    );
16776855e09eSopenharmony_ci    assert_parse!(be_i24(&[][..]), Err(Err::Incomplete(Needed::new(3))));
16786855e09eSopenharmony_ci    assert_parse!(be_i24(&[0x00][..]), Err(Err::Incomplete(Needed::new(2))));
16796855e09eSopenharmony_ci    assert_parse!(
16806855e09eSopenharmony_ci      be_i24(&[0x00, 0x00][..]),
16816855e09eSopenharmony_ci      Err(Err::Incomplete(Needed::new(1)))
16826855e09eSopenharmony_ci    );
16836855e09eSopenharmony_ci  }
16846855e09eSopenharmony_ci
16856855e09eSopenharmony_ci  #[test]
16866855e09eSopenharmony_ci  fn i32_tests() {
16876855e09eSopenharmony_ci    assert_parse!(be_i32(&[0x00, 0x00, 0x00, 0x00][..]), Ok((&b""[..], 0)));
16886855e09eSopenharmony_ci    assert_parse!(
16896855e09eSopenharmony_ci      be_i32(&[0x7f, 0xff, 0xff, 0xff][..]),
16906855e09eSopenharmony_ci      Ok((&b""[..], 2_147_483_647_i32))
16916855e09eSopenharmony_ci    );
16926855e09eSopenharmony_ci    assert_parse!(be_i32(&[0xff, 0xff, 0xff, 0xff][..]), Ok((&b""[..], -1)));
16936855e09eSopenharmony_ci    assert_parse!(
16946855e09eSopenharmony_ci      be_i32(&[0x80, 0x00, 0x00, 0x00][..]),
16956855e09eSopenharmony_ci      Ok((&b""[..], -2_147_483_648_i32))
16966855e09eSopenharmony_ci    );
16976855e09eSopenharmony_ci    assert_parse!(be_i32(&[][..]), Err(Err::Incomplete(Needed::new(4))));
16986855e09eSopenharmony_ci    assert_parse!(be_i32(&[0x00][..]), Err(Err::Incomplete(Needed::new(3))));
16996855e09eSopenharmony_ci    assert_parse!(
17006855e09eSopenharmony_ci      be_i32(&[0x00, 0x00][..]),
17016855e09eSopenharmony_ci      Err(Err::Incomplete(Needed::new(2)))
17026855e09eSopenharmony_ci    );
17036855e09eSopenharmony_ci    assert_parse!(
17046855e09eSopenharmony_ci      be_i32(&[0x00, 0x00, 0x00][..]),
17056855e09eSopenharmony_ci      Err(Err::Incomplete(Needed::new(1)))
17066855e09eSopenharmony_ci    );
17076855e09eSopenharmony_ci  }
17086855e09eSopenharmony_ci
17096855e09eSopenharmony_ci  #[test]
17106855e09eSopenharmony_ci  fn i64_tests() {
17116855e09eSopenharmony_ci    assert_parse!(
17126855e09eSopenharmony_ci      be_i64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]),
17136855e09eSopenharmony_ci      Ok((&b""[..], 0))
17146855e09eSopenharmony_ci    );
17156855e09eSopenharmony_ci    assert_parse!(
17166855e09eSopenharmony_ci      be_i64(&[0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff][..]),
17176855e09eSopenharmony_ci      Ok((&b""[..], 9_223_372_036_854_775_807_i64))
17186855e09eSopenharmony_ci    );
17196855e09eSopenharmony_ci    assert_parse!(
17206855e09eSopenharmony_ci      be_i64(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff][..]),
17216855e09eSopenharmony_ci      Ok((&b""[..], -1))
17226855e09eSopenharmony_ci    );
17236855e09eSopenharmony_ci    assert_parse!(
17246855e09eSopenharmony_ci      be_i64(&[0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]),
17256855e09eSopenharmony_ci      Ok((&b""[..], -9_223_372_036_854_775_808_i64))
17266855e09eSopenharmony_ci    );
17276855e09eSopenharmony_ci    assert_parse!(be_i64(&[][..]), Err(Err::Incomplete(Needed::new(8))));
17286855e09eSopenharmony_ci    assert_parse!(be_i64(&[0x00][..]), Err(Err::Incomplete(Needed::new(7))));
17296855e09eSopenharmony_ci    assert_parse!(
17306855e09eSopenharmony_ci      be_i64(&[0x00, 0x00][..]),
17316855e09eSopenharmony_ci      Err(Err::Incomplete(Needed::new(6)))
17326855e09eSopenharmony_ci    );
17336855e09eSopenharmony_ci    assert_parse!(
17346855e09eSopenharmony_ci      be_i64(&[0x00, 0x00, 0x00][..]),
17356855e09eSopenharmony_ci      Err(Err::Incomplete(Needed::new(5)))
17366855e09eSopenharmony_ci    );
17376855e09eSopenharmony_ci    assert_parse!(
17386855e09eSopenharmony_ci      be_i64(&[0x00, 0x00, 0x00, 0x00][..]),
17396855e09eSopenharmony_ci      Err(Err::Incomplete(Needed::new(4)))
17406855e09eSopenharmony_ci    );
17416855e09eSopenharmony_ci    assert_parse!(
17426855e09eSopenharmony_ci      be_i64(&[0x00, 0x00, 0x00, 0x00, 0x00][..]),
17436855e09eSopenharmony_ci      Err(Err::Incomplete(Needed::new(3)))
17446855e09eSopenharmony_ci    );
17456855e09eSopenharmony_ci    assert_parse!(
17466855e09eSopenharmony_ci      be_i64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]),
17476855e09eSopenharmony_ci      Err(Err::Incomplete(Needed::new(2)))
17486855e09eSopenharmony_ci    );
17496855e09eSopenharmony_ci    assert_parse!(
17506855e09eSopenharmony_ci      be_i64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]),
17516855e09eSopenharmony_ci      Err(Err::Incomplete(Needed::new(1)))
17526855e09eSopenharmony_ci    );
17536855e09eSopenharmony_ci  }
17546855e09eSopenharmony_ci
17556855e09eSopenharmony_ci  #[test]
17566855e09eSopenharmony_ci  fn i128_tests() {
17576855e09eSopenharmony_ci    assert_parse!(
17586855e09eSopenharmony_ci      be_i128(
17596855e09eSopenharmony_ci        &[
17606855e09eSopenharmony_ci          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
17616855e09eSopenharmony_ci          0x00
17626855e09eSopenharmony_ci        ][..]
17636855e09eSopenharmony_ci      ),
17646855e09eSopenharmony_ci      Ok((&b""[..], 0))
17656855e09eSopenharmony_ci    );
17666855e09eSopenharmony_ci    assert_parse!(
17676855e09eSopenharmony_ci      be_i128(
17686855e09eSopenharmony_ci        &[
17696855e09eSopenharmony_ci          0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
17706855e09eSopenharmony_ci          0xff
17716855e09eSopenharmony_ci        ][..]
17726855e09eSopenharmony_ci      ),
17736855e09eSopenharmony_ci      Ok((
17746855e09eSopenharmony_ci        &b""[..],
17756855e09eSopenharmony_ci        170_141_183_460_469_231_731_687_303_715_884_105_727_i128
17766855e09eSopenharmony_ci      ))
17776855e09eSopenharmony_ci    );
17786855e09eSopenharmony_ci    assert_parse!(
17796855e09eSopenharmony_ci      be_i128(
17806855e09eSopenharmony_ci        &[
17816855e09eSopenharmony_ci          0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
17826855e09eSopenharmony_ci          0xff
17836855e09eSopenharmony_ci        ][..]
17846855e09eSopenharmony_ci      ),
17856855e09eSopenharmony_ci      Ok((&b""[..], -1))
17866855e09eSopenharmony_ci    );
17876855e09eSopenharmony_ci    assert_parse!(
17886855e09eSopenharmony_ci      be_i128(
17896855e09eSopenharmony_ci        &[
17906855e09eSopenharmony_ci          0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
17916855e09eSopenharmony_ci          0x00
17926855e09eSopenharmony_ci        ][..]
17936855e09eSopenharmony_ci      ),
17946855e09eSopenharmony_ci      Ok((
17956855e09eSopenharmony_ci        &b""[..],
17966855e09eSopenharmony_ci        -170_141_183_460_469_231_731_687_303_715_884_105_728_i128
17976855e09eSopenharmony_ci      ))
17986855e09eSopenharmony_ci    );
17996855e09eSopenharmony_ci    assert_parse!(be_i128(&[][..]), Err(Err::Incomplete(Needed::new(16))));
18006855e09eSopenharmony_ci    assert_parse!(be_i128(&[0x00][..]), Err(Err::Incomplete(Needed::new(15))));
18016855e09eSopenharmony_ci    assert_parse!(
18026855e09eSopenharmony_ci      be_i128(&[0x00, 0x00][..]),
18036855e09eSopenharmony_ci      Err(Err::Incomplete(Needed::new(14)))
18046855e09eSopenharmony_ci    );
18056855e09eSopenharmony_ci    assert_parse!(
18066855e09eSopenharmony_ci      be_i128(&[0x00, 0x00, 0x00][..]),
18076855e09eSopenharmony_ci      Err(Err::Incomplete(Needed::new(13)))
18086855e09eSopenharmony_ci    );
18096855e09eSopenharmony_ci    assert_parse!(
18106855e09eSopenharmony_ci      be_i128(&[0x00, 0x00, 0x00, 0x00][..]),
18116855e09eSopenharmony_ci      Err(Err::Incomplete(Needed::new(12)))
18126855e09eSopenharmony_ci    );
18136855e09eSopenharmony_ci    assert_parse!(
18146855e09eSopenharmony_ci      be_i128(&[0x00, 0x00, 0x00, 0x00, 0x00][..]),
18156855e09eSopenharmony_ci      Err(Err::Incomplete(Needed::new(11)))
18166855e09eSopenharmony_ci    );
18176855e09eSopenharmony_ci    assert_parse!(
18186855e09eSopenharmony_ci      be_i128(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]),
18196855e09eSopenharmony_ci      Err(Err::Incomplete(Needed::new(10)))
18206855e09eSopenharmony_ci    );
18216855e09eSopenharmony_ci    assert_parse!(
18226855e09eSopenharmony_ci      be_i128(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]),
18236855e09eSopenharmony_ci      Err(Err::Incomplete(Needed::new(9)))
18246855e09eSopenharmony_ci    );
18256855e09eSopenharmony_ci    assert_parse!(
18266855e09eSopenharmony_ci      be_i128(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]),
18276855e09eSopenharmony_ci      Err(Err::Incomplete(Needed::new(8)))
18286855e09eSopenharmony_ci    );
18296855e09eSopenharmony_ci    assert_parse!(
18306855e09eSopenharmony_ci      be_i128(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]),
18316855e09eSopenharmony_ci      Err(Err::Incomplete(Needed::new(7)))
18326855e09eSopenharmony_ci    );
18336855e09eSopenharmony_ci    assert_parse!(
18346855e09eSopenharmony_ci      be_i128(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]),
18356855e09eSopenharmony_ci      Err(Err::Incomplete(Needed::new(6)))
18366855e09eSopenharmony_ci    );
18376855e09eSopenharmony_ci    assert_parse!(
18386855e09eSopenharmony_ci      be_i128(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]),
18396855e09eSopenharmony_ci      Err(Err::Incomplete(Needed::new(5)))
18406855e09eSopenharmony_ci    );
18416855e09eSopenharmony_ci    assert_parse!(
18426855e09eSopenharmony_ci      be_i128(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]),
18436855e09eSopenharmony_ci      Err(Err::Incomplete(Needed::new(4)))
18446855e09eSopenharmony_ci    );
18456855e09eSopenharmony_ci    assert_parse!(
18466855e09eSopenharmony_ci      be_i128(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]),
18476855e09eSopenharmony_ci      Err(Err::Incomplete(Needed::new(3)))
18486855e09eSopenharmony_ci    );
18496855e09eSopenharmony_ci    assert_parse!(
18506855e09eSopenharmony_ci      be_i128(
18516855e09eSopenharmony_ci        &[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]
18526855e09eSopenharmony_ci      ),
18536855e09eSopenharmony_ci      Err(Err::Incomplete(Needed::new(2)))
18546855e09eSopenharmony_ci    );
18556855e09eSopenharmony_ci    assert_parse!(
18566855e09eSopenharmony_ci      be_i128(
18576855e09eSopenharmony_ci        &[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
18586855e09eSopenharmony_ci          [..]
18596855e09eSopenharmony_ci      ),
18606855e09eSopenharmony_ci      Err(Err::Incomplete(Needed::new(1)))
18616855e09eSopenharmony_ci    );
18626855e09eSopenharmony_ci  }
18636855e09eSopenharmony_ci
18646855e09eSopenharmony_ci  #[test]
18656855e09eSopenharmony_ci  fn le_i8_tests() {
18666855e09eSopenharmony_ci    assert_parse!(le_i8(&[0x00][..]), Ok((&b""[..], 0)));
18676855e09eSopenharmony_ci    assert_parse!(le_i8(&[0x7f][..]), Ok((&b""[..], 127)));
18686855e09eSopenharmony_ci    assert_parse!(le_i8(&[0xff][..]), Ok((&b""[..], -1)));
18696855e09eSopenharmony_ci    assert_parse!(le_i8(&[0x80][..]), Ok((&b""[..], -128)));
18706855e09eSopenharmony_ci  }
18716855e09eSopenharmony_ci
18726855e09eSopenharmony_ci  #[test]
18736855e09eSopenharmony_ci  fn le_i16_tests() {
18746855e09eSopenharmony_ci    assert_parse!(le_i16(&[0x00, 0x00][..]), Ok((&b""[..], 0)));
18756855e09eSopenharmony_ci    assert_parse!(le_i16(&[0xff, 0x7f][..]), Ok((&b""[..], 32_767_i16)));
18766855e09eSopenharmony_ci    assert_parse!(le_i16(&[0xff, 0xff][..]), Ok((&b""[..], -1)));
18776855e09eSopenharmony_ci    assert_parse!(le_i16(&[0x00, 0x80][..]), Ok((&b""[..], -32_768_i16)));
18786855e09eSopenharmony_ci  }
18796855e09eSopenharmony_ci
18806855e09eSopenharmony_ci  #[test]
18816855e09eSopenharmony_ci  fn le_u24_tests() {
18826855e09eSopenharmony_ci    assert_parse!(le_u24(&[0x00, 0x00, 0x00][..]), Ok((&b""[..], 0)));
18836855e09eSopenharmony_ci    assert_parse!(le_u24(&[0xFF, 0xFF, 0x00][..]), Ok((&b""[..], 65_535_u32)));
18846855e09eSopenharmony_ci    assert_parse!(
18856855e09eSopenharmony_ci      le_u24(&[0x56, 0x34, 0x12][..]),
18866855e09eSopenharmony_ci      Ok((&b""[..], 1_193_046_u32))
18876855e09eSopenharmony_ci    );
18886855e09eSopenharmony_ci  }
18896855e09eSopenharmony_ci
18906855e09eSopenharmony_ci  #[test]
18916855e09eSopenharmony_ci  fn le_i24_tests() {
18926855e09eSopenharmony_ci    assert_parse!(le_i24(&[0xFF, 0xFF, 0xFF][..]), Ok((&b""[..], -1_i32)));
18936855e09eSopenharmony_ci    assert_parse!(le_i24(&[0x00, 0x00, 0xFF][..]), Ok((&b""[..], -65_536_i32)));
18946855e09eSopenharmony_ci    assert_parse!(
18956855e09eSopenharmony_ci      le_i24(&[0xAA, 0xCB, 0xED][..]),
18966855e09eSopenharmony_ci      Ok((&b""[..], -1_193_046_i32))
18976855e09eSopenharmony_ci    );
18986855e09eSopenharmony_ci  }
18996855e09eSopenharmony_ci
19006855e09eSopenharmony_ci  #[test]
19016855e09eSopenharmony_ci  fn le_i32_tests() {
19026855e09eSopenharmony_ci    assert_parse!(le_i32(&[0x00, 0x00, 0x00, 0x00][..]), Ok((&b""[..], 0)));
19036855e09eSopenharmony_ci    assert_parse!(
19046855e09eSopenharmony_ci      le_i32(&[0xff, 0xff, 0xff, 0x7f][..]),
19056855e09eSopenharmony_ci      Ok((&b""[..], 2_147_483_647_i32))
19066855e09eSopenharmony_ci    );
19076855e09eSopenharmony_ci    assert_parse!(le_i32(&[0xff, 0xff, 0xff, 0xff][..]), Ok((&b""[..], -1)));
19086855e09eSopenharmony_ci    assert_parse!(
19096855e09eSopenharmony_ci      le_i32(&[0x00, 0x00, 0x00, 0x80][..]),
19106855e09eSopenharmony_ci      Ok((&b""[..], -2_147_483_648_i32))
19116855e09eSopenharmony_ci    );
19126855e09eSopenharmony_ci  }
19136855e09eSopenharmony_ci
19146855e09eSopenharmony_ci  #[test]
19156855e09eSopenharmony_ci  fn le_i64_tests() {
19166855e09eSopenharmony_ci    assert_parse!(
19176855e09eSopenharmony_ci      le_i64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]),
19186855e09eSopenharmony_ci      Ok((&b""[..], 0))
19196855e09eSopenharmony_ci    );
19206855e09eSopenharmony_ci    assert_parse!(
19216855e09eSopenharmony_ci      le_i64(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f][..]),
19226855e09eSopenharmony_ci      Ok((&b""[..], 9_223_372_036_854_775_807_i64))
19236855e09eSopenharmony_ci    );
19246855e09eSopenharmony_ci    assert_parse!(
19256855e09eSopenharmony_ci      le_i64(&[0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff][..]),
19266855e09eSopenharmony_ci      Ok((&b""[..], -1))
19276855e09eSopenharmony_ci    );
19286855e09eSopenharmony_ci    assert_parse!(
19296855e09eSopenharmony_ci      le_i64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80][..]),
19306855e09eSopenharmony_ci      Ok((&b""[..], -9_223_372_036_854_775_808_i64))
19316855e09eSopenharmony_ci    );
19326855e09eSopenharmony_ci  }
19336855e09eSopenharmony_ci
19346855e09eSopenharmony_ci  #[test]
19356855e09eSopenharmony_ci  fn le_i128_tests() {
19366855e09eSopenharmony_ci    assert_parse!(
19376855e09eSopenharmony_ci      le_i128(
19386855e09eSopenharmony_ci        &[
19396855e09eSopenharmony_ci          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
19406855e09eSopenharmony_ci          0x00
19416855e09eSopenharmony_ci        ][..]
19426855e09eSopenharmony_ci      ),
19436855e09eSopenharmony_ci      Ok((&b""[..], 0))
19446855e09eSopenharmony_ci    );
19456855e09eSopenharmony_ci    assert_parse!(
19466855e09eSopenharmony_ci      le_i128(
19476855e09eSopenharmony_ci        &[
19486855e09eSopenharmony_ci          0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
19496855e09eSopenharmony_ci          0x7f
19506855e09eSopenharmony_ci        ][..]
19516855e09eSopenharmony_ci      ),
19526855e09eSopenharmony_ci      Ok((
19536855e09eSopenharmony_ci        &b""[..],
19546855e09eSopenharmony_ci        170_141_183_460_469_231_731_687_303_715_884_105_727_i128
19556855e09eSopenharmony_ci      ))
19566855e09eSopenharmony_ci    );
19576855e09eSopenharmony_ci    assert_parse!(
19586855e09eSopenharmony_ci      le_i128(
19596855e09eSopenharmony_ci        &[
19606855e09eSopenharmony_ci          0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
19616855e09eSopenharmony_ci          0xff
19626855e09eSopenharmony_ci        ][..]
19636855e09eSopenharmony_ci      ),
19646855e09eSopenharmony_ci      Ok((&b""[..], -1))
19656855e09eSopenharmony_ci    );
19666855e09eSopenharmony_ci    assert_parse!(
19676855e09eSopenharmony_ci      le_i128(
19686855e09eSopenharmony_ci        &[
19696855e09eSopenharmony_ci          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
19706855e09eSopenharmony_ci          0x80
19716855e09eSopenharmony_ci        ][..]
19726855e09eSopenharmony_ci      ),
19736855e09eSopenharmony_ci      Ok((
19746855e09eSopenharmony_ci        &b""[..],
19756855e09eSopenharmony_ci        -170_141_183_460_469_231_731_687_303_715_884_105_728_i128
19766855e09eSopenharmony_ci      ))
19776855e09eSopenharmony_ci    );
19786855e09eSopenharmony_ci  }
19796855e09eSopenharmony_ci
19806855e09eSopenharmony_ci  #[test]
19816855e09eSopenharmony_ci  fn be_f32_tests() {
19826855e09eSopenharmony_ci    assert_parse!(be_f32(&[0x00, 0x00, 0x00, 0x00][..]), Ok((&b""[..], 0_f32)));
19836855e09eSopenharmony_ci    assert_parse!(
19846855e09eSopenharmony_ci      be_f32(&[0x4d, 0x31, 0x1f, 0xd8][..]),
19856855e09eSopenharmony_ci      Ok((&b""[..], 185_728_392_f32))
19866855e09eSopenharmony_ci    );
19876855e09eSopenharmony_ci  }
19886855e09eSopenharmony_ci
19896855e09eSopenharmony_ci  #[test]
19906855e09eSopenharmony_ci  fn be_f64_tests() {
19916855e09eSopenharmony_ci    assert_parse!(
19926855e09eSopenharmony_ci      be_f64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]),
19936855e09eSopenharmony_ci      Ok((&b""[..], 0_f64))
19946855e09eSopenharmony_ci    );
19956855e09eSopenharmony_ci    assert_parse!(
19966855e09eSopenharmony_ci      be_f64(&[0x41, 0xa6, 0x23, 0xfb, 0x10, 0x00, 0x00, 0x00][..]),
19976855e09eSopenharmony_ci      Ok((&b""[..], 185_728_392_f64))
19986855e09eSopenharmony_ci    );
19996855e09eSopenharmony_ci  }
20006855e09eSopenharmony_ci
20016855e09eSopenharmony_ci  #[test]
20026855e09eSopenharmony_ci  fn le_f32_tests() {
20036855e09eSopenharmony_ci    assert_parse!(le_f32(&[0x00, 0x00, 0x00, 0x00][..]), Ok((&b""[..], 0_f32)));
20046855e09eSopenharmony_ci    assert_parse!(
20056855e09eSopenharmony_ci      le_f32(&[0xd8, 0x1f, 0x31, 0x4d][..]),
20066855e09eSopenharmony_ci      Ok((&b""[..], 185_728_392_f32))
20076855e09eSopenharmony_ci    );
20086855e09eSopenharmony_ci  }
20096855e09eSopenharmony_ci
20106855e09eSopenharmony_ci  #[test]
20116855e09eSopenharmony_ci  fn le_f64_tests() {
20126855e09eSopenharmony_ci    assert_parse!(
20136855e09eSopenharmony_ci      le_f64(&[0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00][..]),
20146855e09eSopenharmony_ci      Ok((&b""[..], 0_f64))
20156855e09eSopenharmony_ci    );
20166855e09eSopenharmony_ci    assert_parse!(
20176855e09eSopenharmony_ci      le_f64(&[0x00, 0x00, 0x00, 0x10, 0xfb, 0x23, 0xa6, 0x41][..]),
20186855e09eSopenharmony_ci      Ok((&b""[..], 185_728_392_f64))
20196855e09eSopenharmony_ci    );
20206855e09eSopenharmony_ci  }
20216855e09eSopenharmony_ci
20226855e09eSopenharmony_ci  #[test]
20236855e09eSopenharmony_ci  fn hex_u32_tests() {
20246855e09eSopenharmony_ci    assert_parse!(
20256855e09eSopenharmony_ci      hex_u32(&b";"[..]),
20266855e09eSopenharmony_ci      Err(Err::Error(error_position!(&b";"[..], ErrorKind::IsA)))
20276855e09eSopenharmony_ci    );
20286855e09eSopenharmony_ci    assert_parse!(hex_u32(&b"ff;"[..]), Ok((&b";"[..], 255)));
20296855e09eSopenharmony_ci    assert_parse!(hex_u32(&b"1be2;"[..]), Ok((&b";"[..], 7138)));
20306855e09eSopenharmony_ci    assert_parse!(hex_u32(&b"c5a31be2;"[..]), Ok((&b";"[..], 3_315_801_058)));
20316855e09eSopenharmony_ci    assert_parse!(hex_u32(&b"C5A31be2;"[..]), Ok((&b";"[..], 3_315_801_058)));
20326855e09eSopenharmony_ci    assert_parse!(hex_u32(&b"00c5a31be2;"[..]), Ok((&b"e2;"[..], 12_952_347)));
20336855e09eSopenharmony_ci    assert_parse!(
20346855e09eSopenharmony_ci      hex_u32(&b"c5a31be201;"[..]),
20356855e09eSopenharmony_ci      Ok((&b"01;"[..], 3_315_801_058))
20366855e09eSopenharmony_ci    );
20376855e09eSopenharmony_ci    assert_parse!(hex_u32(&b"ffffffff;"[..]), Ok((&b";"[..], 4_294_967_295)));
20386855e09eSopenharmony_ci    assert_parse!(hex_u32(&b"0x1be2;"[..]), Ok((&b"x1be2;"[..], 0)));
20396855e09eSopenharmony_ci    assert_parse!(hex_u32(&b"12af"[..]), Err(Err::Incomplete(Needed::new(1))));
20406855e09eSopenharmony_ci  }
20416855e09eSopenharmony_ci
20426855e09eSopenharmony_ci  #[test]
20436855e09eSopenharmony_ci  #[cfg(feature = "std")]
20446855e09eSopenharmony_ci  fn float_test() {
20456855e09eSopenharmony_ci    let mut test_cases = vec![
20466855e09eSopenharmony_ci      "+3.14",
20476855e09eSopenharmony_ci      "3.14",
20486855e09eSopenharmony_ci      "-3.14",
20496855e09eSopenharmony_ci      "0",
20506855e09eSopenharmony_ci      "0.0",
20516855e09eSopenharmony_ci      "1.",
20526855e09eSopenharmony_ci      ".789",
20536855e09eSopenharmony_ci      "-.5",
20546855e09eSopenharmony_ci      "1e7",
20556855e09eSopenharmony_ci      "-1E-7",
20566855e09eSopenharmony_ci      ".3e-2",
20576855e09eSopenharmony_ci      "1.e4",
20586855e09eSopenharmony_ci      "1.2e4",
20596855e09eSopenharmony_ci      "12.34",
20606855e09eSopenharmony_ci      "-1.234E-12",
20616855e09eSopenharmony_ci      "-1.234e-12",
20626855e09eSopenharmony_ci      "0.00000000000000000087",
20636855e09eSopenharmony_ci    ];
20646855e09eSopenharmony_ci
20656855e09eSopenharmony_ci    for test in test_cases.drain(..) {
20666855e09eSopenharmony_ci      let expected32 = str::parse::<f32>(test).unwrap();
20676855e09eSopenharmony_ci      let expected64 = str::parse::<f64>(test).unwrap();
20686855e09eSopenharmony_ci
20696855e09eSopenharmony_ci      println!("now parsing: {} -> {}", test, expected32);
20706855e09eSopenharmony_ci
20716855e09eSopenharmony_ci      let larger = format!("{};", test);
20726855e09eSopenharmony_ci      assert_parse!(recognize_float(&larger[..]), Ok((";", test)));
20736855e09eSopenharmony_ci
20746855e09eSopenharmony_ci      assert_parse!(float(larger.as_bytes()), Ok((&b";"[..], expected32)));
20756855e09eSopenharmony_ci      assert_parse!(float(&larger[..]), Ok((";", expected32)));
20766855e09eSopenharmony_ci
20776855e09eSopenharmony_ci      assert_parse!(double(larger.as_bytes()), Ok((&b";"[..], expected64)));
20786855e09eSopenharmony_ci      assert_parse!(double(&larger[..]), Ok((";", expected64)));
20796855e09eSopenharmony_ci    }
20806855e09eSopenharmony_ci
20816855e09eSopenharmony_ci    let remaining_exponent = "-1.234E-";
20826855e09eSopenharmony_ci    assert_parse!(
20836855e09eSopenharmony_ci      recognize_float(remaining_exponent),
20846855e09eSopenharmony_ci      Err(Err::Incomplete(Needed::new(1)))
20856855e09eSopenharmony_ci    );
20866855e09eSopenharmony_ci
20876855e09eSopenharmony_ci    let (_i, nan) = float::<_, ()>("NaN").unwrap();
20886855e09eSopenharmony_ci    assert!(nan.is_nan());
20896855e09eSopenharmony_ci
20906855e09eSopenharmony_ci    let (_i, inf) = float::<_, ()>("inf").unwrap();
20916855e09eSopenharmony_ci    assert!(inf.is_infinite());
20926855e09eSopenharmony_ci    let (_i, inf) = float::<_, ()>("infinite").unwrap();
20936855e09eSopenharmony_ci    assert!(inf.is_infinite());
20946855e09eSopenharmony_ci  }
20956855e09eSopenharmony_ci
20966855e09eSopenharmony_ci  #[test]
20976855e09eSopenharmony_ci  fn configurable_endianness() {
20986855e09eSopenharmony_ci    use crate::number::Endianness;
20996855e09eSopenharmony_ci
21006855e09eSopenharmony_ci    fn be_tst16(i: &[u8]) -> IResult<&[u8], u16> {
21016855e09eSopenharmony_ci      u16(Endianness::Big)(i)
21026855e09eSopenharmony_ci    }
21036855e09eSopenharmony_ci    fn le_tst16(i: &[u8]) -> IResult<&[u8], u16> {
21046855e09eSopenharmony_ci      u16(Endianness::Little)(i)
21056855e09eSopenharmony_ci    }
21066855e09eSopenharmony_ci    assert_eq!(be_tst16(&[0x80, 0x00]), Ok((&b""[..], 32_768_u16)));
21076855e09eSopenharmony_ci    assert_eq!(le_tst16(&[0x80, 0x00]), Ok((&b""[..], 128_u16)));
21086855e09eSopenharmony_ci
21096855e09eSopenharmony_ci    fn be_tst32(i: &[u8]) -> IResult<&[u8], u32> {
21106855e09eSopenharmony_ci      u32(Endianness::Big)(i)
21116855e09eSopenharmony_ci    }
21126855e09eSopenharmony_ci    fn le_tst32(i: &[u8]) -> IResult<&[u8], u32> {
21136855e09eSopenharmony_ci      u32(Endianness::Little)(i)
21146855e09eSopenharmony_ci    }
21156855e09eSopenharmony_ci    assert_eq!(
21166855e09eSopenharmony_ci      be_tst32(&[0x12, 0x00, 0x60, 0x00]),
21176855e09eSopenharmony_ci      Ok((&b""[..], 302_014_464_u32))
21186855e09eSopenharmony_ci    );
21196855e09eSopenharmony_ci    assert_eq!(
21206855e09eSopenharmony_ci      le_tst32(&[0x12, 0x00, 0x60, 0x00]),
21216855e09eSopenharmony_ci      Ok((&b""[..], 6_291_474_u32))
21226855e09eSopenharmony_ci    );
21236855e09eSopenharmony_ci
21246855e09eSopenharmony_ci    fn be_tst64(i: &[u8]) -> IResult<&[u8], u64> {
21256855e09eSopenharmony_ci      u64(Endianness::Big)(i)
21266855e09eSopenharmony_ci    }
21276855e09eSopenharmony_ci    fn le_tst64(i: &[u8]) -> IResult<&[u8], u64> {
21286855e09eSopenharmony_ci      u64(Endianness::Little)(i)
21296855e09eSopenharmony_ci    }
21306855e09eSopenharmony_ci    assert_eq!(
21316855e09eSopenharmony_ci      be_tst64(&[0x12, 0x00, 0x60, 0x00, 0x12, 0x00, 0x80, 0x00]),
21326855e09eSopenharmony_ci      Ok((&b""[..], 1_297_142_246_100_992_000_u64))
21336855e09eSopenharmony_ci    );
21346855e09eSopenharmony_ci    assert_eq!(
21356855e09eSopenharmony_ci      le_tst64(&[0x12, 0x00, 0x60, 0x00, 0x12, 0x00, 0x80, 0x00]),
21366855e09eSopenharmony_ci      Ok((&b""[..], 36_028_874_334_666_770_u64))
21376855e09eSopenharmony_ci    );
21386855e09eSopenharmony_ci
21396855e09eSopenharmony_ci    fn be_tsti16(i: &[u8]) -> IResult<&[u8], i16> {
21406855e09eSopenharmony_ci      i16(Endianness::Big)(i)
21416855e09eSopenharmony_ci    }
21426855e09eSopenharmony_ci    fn le_tsti16(i: &[u8]) -> IResult<&[u8], i16> {
21436855e09eSopenharmony_ci      i16(Endianness::Little)(i)
21446855e09eSopenharmony_ci    }
21456855e09eSopenharmony_ci    assert_eq!(be_tsti16(&[0x00, 0x80]), Ok((&b""[..], 128_i16)));
21466855e09eSopenharmony_ci    assert_eq!(le_tsti16(&[0x00, 0x80]), Ok((&b""[..], -32_768_i16)));
21476855e09eSopenharmony_ci
21486855e09eSopenharmony_ci    fn be_tsti32(i: &[u8]) -> IResult<&[u8], i32> {
21496855e09eSopenharmony_ci      i32(Endianness::Big)(i)
21506855e09eSopenharmony_ci    }
21516855e09eSopenharmony_ci    fn le_tsti32(i: &[u8]) -> IResult<&[u8], i32> {
21526855e09eSopenharmony_ci      i32(Endianness::Little)(i)
21536855e09eSopenharmony_ci    }
21546855e09eSopenharmony_ci    assert_eq!(
21556855e09eSopenharmony_ci      be_tsti32(&[0x00, 0x12, 0x60, 0x00]),
21566855e09eSopenharmony_ci      Ok((&b""[..], 1_204_224_i32))
21576855e09eSopenharmony_ci    );
21586855e09eSopenharmony_ci    assert_eq!(
21596855e09eSopenharmony_ci      le_tsti32(&[0x00, 0x12, 0x60, 0x00]),
21606855e09eSopenharmony_ci      Ok((&b""[..], 6_296_064_i32))
21616855e09eSopenharmony_ci    );
21626855e09eSopenharmony_ci
21636855e09eSopenharmony_ci    fn be_tsti64(i: &[u8]) -> IResult<&[u8], i64> {
21646855e09eSopenharmony_ci      i64(Endianness::Big)(i)
21656855e09eSopenharmony_ci    }
21666855e09eSopenharmony_ci    fn le_tsti64(i: &[u8]) -> IResult<&[u8], i64> {
21676855e09eSopenharmony_ci      i64(Endianness::Little)(i)
21686855e09eSopenharmony_ci    }
21696855e09eSopenharmony_ci    assert_eq!(
21706855e09eSopenharmony_ci      be_tsti64(&[0x00, 0xFF, 0x60, 0x00, 0x12, 0x00, 0x80, 0x00]),
21716855e09eSopenharmony_ci      Ok((&b""[..], 71_881_672_479_506_432_i64))
21726855e09eSopenharmony_ci    );
21736855e09eSopenharmony_ci    assert_eq!(
21746855e09eSopenharmony_ci      le_tsti64(&[0x00, 0xFF, 0x60, 0x00, 0x12, 0x00, 0x80, 0x00]),
21756855e09eSopenharmony_ci      Ok((&b""[..], 36_028_874_334_732_032_i64))
21766855e09eSopenharmony_ci    );
21776855e09eSopenharmony_ci  }
21786855e09eSopenharmony_ci
21796855e09eSopenharmony_ci  #[cfg(feature = "std")]
21806855e09eSopenharmony_ci  fn parse_f64(i: &str) -> IResult<&str, f64, ()> {
21816855e09eSopenharmony_ci    use crate::traits::ParseTo;
21826855e09eSopenharmony_ci    match recognize_float_or_exceptions(i) {
21836855e09eSopenharmony_ci      Err(e) => Err(e),
21846855e09eSopenharmony_ci      Ok((i, s)) => {
21856855e09eSopenharmony_ci        if s.is_empty() {
21866855e09eSopenharmony_ci          return Err(Err::Error(()));
21876855e09eSopenharmony_ci        }
21886855e09eSopenharmony_ci        match s.parse_to() {
21896855e09eSopenharmony_ci          Some(n) => Ok((i, n)),
21906855e09eSopenharmony_ci          None => Err(Err::Error(())),
21916855e09eSopenharmony_ci        }
21926855e09eSopenharmony_ci      }
21936855e09eSopenharmony_ci    }
21946855e09eSopenharmony_ci  }
21956855e09eSopenharmony_ci
21966855e09eSopenharmony_ci  proptest! {
21976855e09eSopenharmony_ci    #[test]
21986855e09eSopenharmony_ci    #[cfg(feature = "std")]
21996855e09eSopenharmony_ci    fn floats(s in "\\PC*") {
22006855e09eSopenharmony_ci        println!("testing {}", s);
22016855e09eSopenharmony_ci        let res1 = parse_f64(&s);
22026855e09eSopenharmony_ci        let res2 = double::<_, ()>(s.as_str());
22036855e09eSopenharmony_ci        assert_eq!(res1, res2);
22046855e09eSopenharmony_ci    }
22056855e09eSopenharmony_ci  }
22066855e09eSopenharmony_ci}
2207