Skip to content

Commit 7621a77

Browse files
authored
Merge pull request #386 from AdExNetwork/issue-384-unified-precision
AdEx v5: Issue #384 Unified precision - primitives::UnifiedNum
2 parents 9c76970 + 5903527 commit 7621a77

File tree

4 files changed

+398
-19
lines changed

4 files changed

+398
-19
lines changed

primitives/src/big_num.rs

Lines changed: 70 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
1-
use std::convert::TryFrom;
2-
use std::fmt;
3-
use std::iter::Sum;
4-
use std::ops::{Add, AddAssign, Div, Mul, Sub};
5-
use std::str::FromStr;
6-
7-
use num::rational::Ratio;
8-
use num::{BigUint, CheckedSub, Integer};
1+
use std::{
2+
convert::TryFrom,
3+
fmt,
4+
iter::Sum,
5+
ops::{Add, AddAssign, Div, Mul, Sub},
6+
str::FromStr,
7+
};
8+
9+
use num::{pow::Pow, rational::Ratio, BigUint, CheckedSub, Integer};
910
use num_derive::{Num, NumOps, One, Zero};
1011
use serde::{Deserialize, Deserializer, Serialize, Serializer};
1112

13+
use crate::UnifiedNum;
14+
1215
#[derive(
1316
Serialize, Deserialize, Clone, PartialEq, Eq, PartialOrd, Ord, NumOps, One, Zero, Num, Default,
1417
)]
@@ -58,6 +61,12 @@ impl fmt::Debug for BigNum {
5861
}
5962
}
6063

64+
impl fmt::Display for BigNum {
65+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
66+
self.0.fmt(f)
67+
}
68+
}
69+
6170
impl Integer for BigNum {
6271
fn div_floor(&self, other: &Self) -> Self {
6372
self.0.div_floor(&other.0).into()
@@ -98,6 +107,46 @@ impl Integer for BigNum {
98107
}
99108
}
100109

110+
impl Pow<BigNum> for BigNum {
111+
type Output = BigNum;
112+
113+
fn pow(self, rhs: BigNum) -> Self::Output {
114+
Self(self.0.pow(rhs.0))
115+
}
116+
}
117+
118+
impl Pow<&BigNum> for BigNum {
119+
type Output = BigNum;
120+
121+
fn pow(self, rhs: &BigNum) -> Self::Output {
122+
BigNum(self.0.pow(&rhs.0))
123+
}
124+
}
125+
126+
impl Pow<BigNum> for &BigNum {
127+
type Output = BigNum;
128+
129+
fn pow(self, rhs: BigNum) -> Self::Output {
130+
BigNum(Pow::pow(&self.0, rhs.0))
131+
}
132+
}
133+
134+
impl Pow<&BigNum> for &BigNum {
135+
type Output = BigNum;
136+
137+
fn pow(self, rhs: &BigNum) -> Self::Output {
138+
BigNum(Pow::pow(&self.0, &rhs.0))
139+
}
140+
}
141+
142+
impl Pow<u8> for BigNum {
143+
type Output = BigNum;
144+
145+
fn pow(self, rhs: u8) -> Self::Output {
146+
BigNum(self.0.pow(rhs))
147+
}
148+
}
149+
101150
impl Add<&BigNum> for &BigNum {
102151
type Output = BigNum;
103152

@@ -209,12 +258,6 @@ impl FromStr for BigNum {
209258
}
210259
}
211260

212-
impl ToString for BigNum {
213-
fn to_string(&self) -> String {
214-
self.0.to_str_radix(10)
215-
}
216-
}
217-
218261
impl From<u64> for BigNum {
219262
fn from(value: u64) -> Self {
220263
Self(BigUint::from(value))
@@ -227,6 +270,12 @@ impl From<BigUint> for BigNum {
227270
}
228271
}
229272

273+
impl<'a> Sum<&'a UnifiedNum> for BigNum {
274+
fn sum<I: Iterator<Item = &'a UnifiedNum>>(iter: I) -> BigNum {
275+
BigNum(iter.map(|unified| BigUint::from(unified.to_u64())).sum())
276+
}
277+
}
278+
230279
fn biguint_from_str<'de, D>(deserializer: D) -> Result<BigUint, D::Error>
231280
where
232281
D: Deserializer<'de>,
@@ -297,4 +346,11 @@ mod test {
297346
let expected: BigNum = 11.into();
298347
assert_eq!(expected, &big_num * &ratio);
299348
}
349+
#[test]
350+
fn bignum_formatting() {
351+
let bignum: BigNum = 5000.into();
352+
353+
assert_eq!("5000", &bignum.to_string());
354+
assert_eq!("BigNum(radix: 10; 5000)", &format!("{:?}", &bignum));
355+
}
300356
}

primitives/src/lib.rs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#![deny(rust_2018_idioms)]
22
#![deny(clippy::all)]
3+
use std::{error, fmt};
4+
35
pub use self::{
46
ad_slot::AdSlot,
57
ad_unit::AdUnit,
@@ -10,28 +12,32 @@ pub use self::{
1012
config::Config,
1113
event_submission::EventSubmission,
1214
ipfs::IPFS,
15+
unified_num::UnifiedNum,
1316
validator::{ValidatorDesc, ValidatorId},
1417
};
15-
use std::{error, fmt};
1618

1719
mod ad_slot;
1820
mod ad_unit;
1921
pub mod adapter;
2022
pub mod address;
23+
pub mod analytics;
2124
pub mod balances_map;
2225
pub mod big_num;
2326
pub mod campaign;
2427
pub mod channel;
2528
pub mod channel_v5;
2629
pub mod channel_validator;
2730
pub mod config;
31+
mod eth_checksum;
2832
pub mod event_submission;
2933
pub mod ipfs;
3034
pub mod market;
3135
pub mod merkle_tree;
3236
pub mod sentry;
3337
pub mod supermarket;
3438
pub mod targeting;
39+
mod unified_num;
40+
pub mod validator;
3541

3642
pub mod util {
3743
pub use api::ApiUrl;
@@ -52,9 +58,6 @@ pub mod util {
5258

5359
pub mod logging;
5460
}
55-
pub mod analytics;
56-
mod eth_checksum;
57-
pub mod validator;
5861

5962
#[derive(Debug, PartialEq, Eq)]
6063
pub enum DomainError {

0 commit comments

Comments
 (0)