From 93f8051626d94872186b8af3f8458f530de200c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Max=20K=C3=A4nner?= Date: Thu, 6 Apr 2023 22:33:27 +0200 Subject: [PATCH] const Deref and const Neg impl --- Cargo.toml | 1 + src/lib.rs | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index 20d7fd3..271eb7f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,3 +22,4 @@ default = ["std"] defmt = ["dep:defmt"] fixed = ["dep:fixed"] std = ["num-traits/std"] +nightly = [] diff --git a/src/lib.rs b/src/lib.rs index 5376956..59b9028 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,11 @@ #![cfg_attr(not(feature = "std"), no_std)] +#![cfg_attr(feature = "nightly", feature(const_trait_impl))] +#![cfg_attr(feature = "nightly", feature(trait_alias))] mod display; pub mod types; +#[cfg(feature = "nightly")] +use core::marker::Destruct; use core::{ marker::PhantomData, ops::{ @@ -37,6 +41,7 @@ where _cd: PhantomData, } +#[cfg(not(feature = "nightly"))] impl Deref for SiUnit where @@ -54,6 +59,24 @@ where &self.value } } +#[cfg(feature = "nightly")] +impl const Deref + for SiUnit +where + Second: Integer, + Metre: Integer, + Kilogram: Integer, + Ampere: Integer, + Kelvin: Integer, + Mole: Integer, + Candela: Integer, +{ + type Target = T; + + fn deref(&self) -> &Self::Target { + &self.value + } +} impl DerefMut for SiUnit @@ -71,6 +94,7 @@ where } } +#[cfg(not(feature = "nightly"))] impl Neg for SiUnit where @@ -89,6 +113,26 @@ where Self::Output::new(-self.value) } } +#[cfg(feature = "nightly")] +impl const Neg + for SiUnit +where + Second: Integer, + Metre: Integer, + Kilogram: Integer, + Ampere: Integer, + Kelvin: Integer, + Mole: Integer, + Candela: Integer, + T: ~const Neg, + Self: ~const Destruct, +{ + type Output = SiUnit; + + fn neg(self) -> Self::Output { + Self::Output::new(-self.value) + } +} impl Zero for SiUnit