Skip to content

Commit 920e504

Browse files
committed
Derive Zero and One for newtypes
1 parent af4618b commit 920e504

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

src/lib.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -463,3 +463,39 @@ pub fn num_cast(input: TokenStream) -> TokenStream {
463463
}
464464
}).into()
465465
}
466+
467+
#[proc_macro_derive(Zero)]
468+
pub fn zero(input: TokenStream) -> TokenStream {
469+
let ast: syn::DeriveInput = syn::parse(input).unwrap();
470+
let name = &ast.ident;
471+
let inner_ty = newtype_inner(&ast.data).expect(NEWTYPE_ONLY);
472+
dummy_const_trick("Zero", &name, quote! {
473+
extern crate num_traits as _num_traits;
474+
impl _num_traits::Zero for #name {
475+
fn zero() -> Self {
476+
#name(<#inner_ty as _num_traits::Zero>::zero())
477+
}
478+
fn is_zero(&self) -> bool {
479+
<#inner_ty as _num_traits::Zero>::is_zero(&self.0)
480+
}
481+
}
482+
}).into()
483+
}
484+
485+
#[proc_macro_derive(One)]
486+
pub fn one(input: TokenStream) -> TokenStream {
487+
let ast: syn::DeriveInput = syn::parse(input).unwrap();
488+
let name = &ast.ident;
489+
let inner_ty = newtype_inner(&ast.data).expect(NEWTYPE_ONLY);
490+
dummy_const_trick("One", &name, quote! {
491+
extern crate num_traits as _num_traits;
492+
impl _num_traits::One for #name {
493+
fn one() -> Self {
494+
#name(<#inner_ty as _num_traits::One>::one())
495+
}
496+
fn is_one(&self) -> bool {
497+
<#inner_ty as _num_traits::One>::is_one(&self.0)
498+
}
499+
}
500+
}).into()
501+
}

tests/newtype.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ extern crate num as num_renamed;
22
#[macro_use]
33
extern crate num_derive;
44

5-
use num_renamed::{FromPrimitive, ToPrimitive, NumCast};
5+
use num_renamed::{FromPrimitive, ToPrimitive, NumCast, One, Zero};
66

77
#[derive(
88
Debug,
@@ -14,6 +14,8 @@ use num_renamed::{FromPrimitive, ToPrimitive, NumCast};
1414
FromPrimitive,
1515
NumOps,
1616
NumCast,
17+
One,
18+
Zero,
1719
)]
1820
struct MyFloat(f64);
1921

@@ -40,3 +42,13 @@ fn test_num_ops() {
4042
fn test_num_cast() {
4143
assert_eq!(<MyFloat as NumCast>::from(25u8), Some(MyFloat(25.0)));
4244
}
45+
46+
#[test]
47+
fn test_zero() {
48+
assert_eq!(MyFloat::zero(), MyFloat(0.0));
49+
}
50+
51+
#[test]
52+
fn test_one() {
53+
assert_eq!(MyFloat::one(), MyFloat(1.0));
54+
}

0 commit comments

Comments
 (0)