#![warn(
clippy::all,
clippy::restriction,
clippy::pedantic,
clippy::nursery,
clippy::cargo
)]
#![allow(clippy::integer_arithmetic)]
#![allow(clippy::indexing_slicing)]
#![allow(clippy::cast_possible_truncation)]
#![allow(clippy::implicit_return)]
#![allow(clippy::else_if_without_else)]
#![allow(clippy::module_name_repetitions)]
#![allow(clippy::mod_module_files)]
#![allow(clippy::separated_literal_suffix)]
#![allow(clippy::blanket_clippy_restriction_lints)]
#![forbid(unsafe_code)]
#[cfg(feature = "serde")]
use serde::de::{Error, Visitor};
#[cfg(feature = "serde")]
use serde::ser::SerializeSeq;
#[cfg(feature = "serde")]
use serde::{Deserialize, Deserializer};
#[cfg(feature = "serde")]
use serde::{Serialize, Serializer};
#[cfg(feature = "serde")]
use std::array::IntoIter;
#[cfg(feature = "serde")]
use std::cmp::min;
#[cfg(feature = "serde")]
use std::fmt::Formatter;
#[cfg(feature = "serde")]
use std::ops::{Deref, DerefMut, Index, IndexMut};
#[cfg(feature = "serde")]
use std::slice::{Iter, SliceIndex};
pub mod constants;
pub mod hash_tree;
pub mod merkle_bit;
pub mod traits;
pub mod tree;
pub mod tree_db;
pub mod tree_hasher;
pub mod utils;
#[cfg(feature = "rocksdb")]
pub mod rocks_tree;
#[cfg(not(any(feature = "serde")))]
pub type Array<const N: usize> = [u8; N];
#[cfg(feature = "serde")]
#[derive(Debug, Copy, Clone, PartialOrd, Ord, PartialEq, Eq, Hash)]
pub struct Array<const N: usize>([u8; N]);
#[cfg(feature = "serde")]
impl<const N: usize> Array<N> {
#[inline]
pub fn iter(&self) -> Iter<u8> {
self.0.iter()
}
}
#[cfg(feature = "serde")]
impl<const N: usize> Default for Array<N> {
#[inline]
fn default() -> Self {
Self([0; N])
}
}
#[cfg(feature = "serde")]
impl<const N: usize> From<[u8; N]> for Array<N> {
#[inline]
fn from(array: [u8; N]) -> Self {
Self(array)
}
}
#[cfg(feature = "serde")]
impl<const N: usize> From<Array<N>> for [u8; N] {
#[inline]
fn from(array: Array<N>) -> Self {
array.0
}
}
#[cfg(feature = "serde")]
impl<const N: usize> IntoIterator for Array<N> {
type Item = u8;
type IntoIter = IntoIter<u8, N>;
#[inline]
fn into_iter(self) -> Self::IntoIter {
self.0.into_iter()
}
}
#[cfg(feature = "serde")]
impl<const N: usize> AsRef<[u8]> for Array<N> {
#[inline]
fn as_ref(&self) -> &[u8] {
&self.0
}
}
#[cfg(feature = "serde")]
impl<const N: usize> Deref for Array<N> {
type Target = [u8; N];
#[inline]
fn deref(&self) -> &Self::Target {
&self.0
}
}
#[cfg(feature = "serde")]
impl<const N: usize> DerefMut for Array<N> {
#[inline]
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
#[cfg(feature = "serde")]
impl<const N: usize, Idx: SliceIndex<[u8]>> Index<Idx> for Array<N> {
type Output = Idx::Output;
#[inline]
fn index(&self, index: Idx) -> &Self::Output {
&self.0[index]
}
}
#[cfg(feature = "serde")]
impl<const N: usize, Idx: SliceIndex<[u8]>> IndexMut<Idx> for Array<N> {
#[inline]
fn index_mut(&mut self, index: Idx) -> &mut Self::Output {
&mut self.0[index]
}
}
#[cfg(feature = "serde")]
impl<const N: usize> Serialize for Array<N> {
#[inline]
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut seq = serializer.serialize_seq(Some(N))?;
for e in self.iter() {
seq.serialize_element(e)?;
}
seq.end()
}
}
#[cfg(feature = "serde")]
struct ArrayVisitor<const N: usize>;
#[cfg(feature = "serde")]
impl<'de, const N: usize> Visitor<'de> for ArrayVisitor<N> {
type Value = Array<N>;
#[inline]
fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result {
formatter.write_str("an unsigned integer from 0 to 255")
}
#[inline]
fn visit_bytes<E: Error>(self, v: &[u8]) -> Result<Self::Value, E> {
let mut value = Array::default();
for i in 0..(min(N, v.len())) {
value[i] = v[i];
}
Ok(value)
}
}
#[cfg(feature = "serde")]
impl<'de, const N: usize> Deserialize<'de> for Array<N> {
#[inline]
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
deserializer.deserialize_bytes(ArrayVisitor)
}
}