summaryrefslogtreecommitdiffstats
path: root/vendor/typenum/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/typenum/src/lib.rs')
-rw-r--r--vendor/typenum/src/lib.rs187
1 files changed, 187 insertions, 0 deletions
diff --git a/vendor/typenum/src/lib.rs b/vendor/typenum/src/lib.rs
new file mode 100644
index 000000000..98367c802
--- /dev/null
+++ b/vendor/typenum/src/lib.rs
@@ -0,0 +1,187 @@
+//! This crate provides type-level numbers evaluated at compile time. It depends only on libcore.
+//!
+//! The traits defined or used in this crate are used in a typical manner. They can be divided into
+//! two categories: **marker traits** and **type operators**.
+//!
+//! Many of the marker traits have functions defined, but they all do essentially the same thing:
+//! convert a type into its runtime counterpart, and are really just there for debugging. For
+//! example,
+//!
+//! ```rust
+//! use typenum::{Integer, N4};
+//!
+//! assert_eq!(N4::to_i32(), -4);
+//! ```
+//!
+//! **Type operators** are traits that behave as functions at the type level. These are the meat of
+//! this library. Where possible, traits defined in libcore have been used, but their attached
+//! functions have not been implemented.
+//!
+//! For example, the `Add` trait is implemented for both unsigned and signed integers, but the
+//! `add` function is not. As there are never any objects of the types defined here, it wouldn't
+//! make sense to implement it. What is important is its associated type `Output`, which is where
+//! the addition happens.
+//!
+//! ```rust
+//! use std::ops::Add;
+//! use typenum::{Integer, P3, P4};
+//!
+//! type X = <P3 as Add<P4>>::Output;
+//! assert_eq!(<X as Integer>::to_i32(), 7);
+//! ```
+//!
+//! In addition, helper aliases are defined for type operators. For example, the above snippet
+//! could be replaced with
+//!
+//! ```rust
+//! use typenum::{Integer, Sum, P3, P4};
+//!
+//! type X = Sum<P3, P4>;
+//! assert_eq!(<X as Integer>::to_i32(), 7);
+//! ```
+//!
+//! Documented in each module is the full list of type operators implemented.
+
+#![no_std]
+#![forbid(unsafe_code)]
+#![warn(missing_docs)]
+#![cfg_attr(feature = "strict", deny(missing_docs))]
+#![cfg_attr(feature = "strict", deny(warnings))]
+#![cfg_attr(
+ feature = "cargo-clippy",
+ allow(
+ clippy::len_without_is_empty,
+ clippy::many_single_char_names,
+ clippy::new_without_default,
+ clippy::suspicious_arithmetic_impl,
+ clippy::type_complexity,
+ clippy::wrong_self_convention,
+ )
+)]
+#![cfg_attr(feature = "cargo-clippy", deny(clippy::missing_inline_in_public_items))]
+#![doc(html_root_url = "https://docs.rs/typenum/1.15.0")]
+
+// For debugging macros:
+// #![feature(trace_macros)]
+// trace_macros!(true);
+
+use core::cmp::Ordering;
+
+#[cfg(feature = "force_unix_path_separator")]
+mod generated {
+ include!(concat!(env!("OUT_DIR"), "/op.rs"));
+ include!(concat!(env!("OUT_DIR"), "/consts.rs"));
+}
+
+#[cfg(not(feature = "force_unix_path_separator"))]
+mod generated {
+ include!(env!("TYPENUM_BUILD_OP"));
+ include!(env!("TYPENUM_BUILD_CONSTS"));
+}
+
+pub mod bit;
+pub mod int;
+pub mod marker_traits;
+pub mod operator_aliases;
+pub mod private;
+pub mod type_operators;
+pub mod uint;
+
+pub mod array;
+
+pub use crate::{
+ array::{ATerm, TArr},
+ consts::*,
+ generated::consts,
+ int::{NInt, PInt},
+ marker_traits::*,
+ operator_aliases::*,
+ type_operators::*,
+ uint::{UInt, UTerm},
+};
+
+/// A potential output from `Cmp`, this is the type equivalent to the enum variant
+/// `core::cmp::Ordering::Greater`.
+#[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Hash, Debug, Default)]
+#[cfg_attr(feature = "scale_info", derive(scale_info::TypeInfo))]
+pub struct Greater;
+
+/// A potential output from `Cmp`, this is the type equivalent to the enum variant
+/// `core::cmp::Ordering::Less`.
+#[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Hash, Debug, Default)]
+#[cfg_attr(feature = "scale_info", derive(scale_info::TypeInfo))]
+pub struct Less;
+
+/// A potential output from `Cmp`, this is the type equivalent to the enum variant
+/// `core::cmp::Ordering::Equal`.
+#[derive(Eq, PartialEq, Ord, PartialOrd, Clone, Copy, Hash, Debug, Default)]
+#[cfg_attr(feature = "scale_info", derive(scale_info::TypeInfo))]
+pub struct Equal;
+
+/// Returns `core::cmp::Ordering::Greater`
+impl Ord for Greater {
+ #[inline]
+ fn to_ordering() -> Ordering {
+ Ordering::Greater
+ }
+}
+
+/// Returns `core::cmp::Ordering::Less`
+impl Ord for Less {
+ #[inline]
+ fn to_ordering() -> Ordering {
+ Ordering::Less
+ }
+}
+
+/// Returns `core::cmp::Ordering::Equal`
+impl Ord for Equal {
+ #[inline]
+ fn to_ordering() -> Ordering {
+ Ordering::Equal
+ }
+}
+
+/// Asserts that two types are the same.
+#[macro_export]
+macro_rules! assert_type_eq {
+ ($a:ty, $b:ty) => {
+ const _: core::marker::PhantomData<<$a as $crate::Same<$b>>::Output> =
+ core::marker::PhantomData;
+ };
+}
+
+/// Asserts that a type is `True`, aka `B1`.
+#[macro_export]
+macro_rules! assert_type {
+ ($a:ty) => {
+ const _: core::marker::PhantomData<<$a as $crate::Same<True>>::Output> =
+ core::marker::PhantomData;
+ };
+}
+
+mod sealed {
+ use crate::{
+ ATerm, Bit, Equal, Greater, Less, NInt, NonZero, PInt, TArr, UInt, UTerm, Unsigned, B0, B1,
+ Z0,
+ };
+
+ pub trait Sealed {}
+
+ impl Sealed for B0 {}
+ impl Sealed for B1 {}
+
+ impl Sealed for UTerm {}
+ impl<U: Unsigned, B: Bit> Sealed for UInt<U, B> {}
+
+ impl Sealed for Z0 {}
+ impl<U: Unsigned + NonZero> Sealed for PInt<U> {}
+ impl<U: Unsigned + NonZero> Sealed for NInt<U> {}
+
+ impl Sealed for Less {}
+ impl Sealed for Equal {}
+ impl Sealed for Greater {}
+
+ impl Sealed for ATerm {}
+ impl<V, A> Sealed for TArr<V, A> {}
+}