multiversx_sc/types/managed/wrapped/managed_decimal/
managed_decimal_op_add_signed.rs

1use crate::{
2    api::ManagedTypeApi,
3    typenum::Unsigned,
4    types::{ConstDecimals, Decimals, ManagedDecimalSigned, NumDecimals},
5};
6
7use core::ops::{Add, AddAssign};
8
9impl<M: ManagedTypeApi, D1: Decimals, D2: Decimals> AddAssign<&ManagedDecimalSigned<M, D2>>
10    for ManagedDecimalSigned<M, D1>
11{
12    fn add_assign(&mut self, rhs: &ManagedDecimalSigned<M, D2>) {
13        let scaled_data = rhs.rescale_data(self.scale().num_decimals());
14        self.data += scaled_data;
15    }
16}
17
18impl<M: ManagedTypeApi, D1: Decimals, D2: Decimals> AddAssign<ManagedDecimalSigned<M, D2>>
19    for ManagedDecimalSigned<M, D1>
20{
21    #[inline]
22    fn add_assign(&mut self, rhs: ManagedDecimalSigned<M, D2>) {
23        self.add_assign(&rhs);
24    }
25}
26
27// const + const
28impl<M: ManagedTypeApi, DECIMALS: Unsigned> Add<ManagedDecimalSigned<M, ConstDecimals<DECIMALS>>>
29    for ManagedDecimalSigned<M, ConstDecimals<DECIMALS>>
30{
31    type Output = Self;
32
33    fn add(mut self, rhs: ManagedDecimalSigned<M, ConstDecimals<DECIMALS>>) -> Self::Output {
34        self.data += rhs.data;
35        self
36    }
37}
38
39// var + var
40impl<M: ManagedTypeApi> Add<ManagedDecimalSigned<M, NumDecimals>>
41    for ManagedDecimalSigned<M, NumDecimals>
42{
43    type Output = Self;
44
45    fn add(mut self, rhs: ManagedDecimalSigned<M, NumDecimals>) -> Self::Output {
46        match self.decimals.cmp(&rhs.decimals) {
47            core::cmp::Ordering::Less => {
48                self = self.rescale(rhs.decimals);
49                self.data += rhs.data;
50            }
51            core::cmp::Ordering::Equal => self.data += rhs.data,
52            core::cmp::Ordering::Greater => {
53                let rhs_data = rhs.rescale_data(self.decimals);
54                self.data += rhs_data;
55            }
56        }
57        self
58    }
59}
60
61// var + const
62impl<DECIMALS: Unsigned, M: ManagedTypeApi> Add<ManagedDecimalSigned<M, ConstDecimals<DECIMALS>>>
63    for ManagedDecimalSigned<M, NumDecimals>
64{
65    type Output = ManagedDecimalSigned<M, NumDecimals>;
66
67    fn add(self, rhs: ManagedDecimalSigned<M, ConstDecimals<DECIMALS>>) -> Self::Output {
68        self + rhs.into_var_decimals()
69    }
70}
71
72// const + var
73impl<DECIMALS: Unsigned, M: ManagedTypeApi> Add<ManagedDecimalSigned<M, NumDecimals>>
74    for ManagedDecimalSigned<M, ConstDecimals<DECIMALS>>
75{
76    type Output = ManagedDecimalSigned<M, NumDecimals>;
77
78    fn add(self, rhs: ManagedDecimalSigned<M, NumDecimals>) -> Self::Output {
79        self.into_var_decimals() + rhs
80    }
81}