refactor: allocate less in types.Coins.safeAdd and types.DecCoins.safeAdd (#16477)
This commit is contained in:
parent
9769e2404e
commit
207789f705
@ -328,25 +328,25 @@ func (coins Coins) safeAdd(coinsB Coins) (coalesced Coins) {
|
||||
panic("Wrong argument: coins must be sorted")
|
||||
}
|
||||
|
||||
uniqCoins := make(map[string]Coins, len(coins)+len(coinsB))
|
||||
uniqCoins := make(map[string]Coin, len(coins)+len(coinsB))
|
||||
// Traverse all the coins for each of the coins and coinsB.
|
||||
for _, cL := range []Coins{coins, coinsB} {
|
||||
for _, c := range cL {
|
||||
uniqCoins[c.Denom] = append(uniqCoins[c.Denom], c)
|
||||
if uc, ok := uniqCoins[c.Denom]; ok {
|
||||
uniqCoins[c.Denom] = uc.Add(c)
|
||||
} else {
|
||||
uniqCoins[c.Denom] = c
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for denom, cL := range uniqCoins { //#nosec
|
||||
comboCoin := Coin{Denom: denom, Amount: NewInt(0)}
|
||||
for _, c := range cL {
|
||||
comboCoin = comboCoin.Add(c)
|
||||
coalesced = make(Coins, 0, len(uniqCoins))
|
||||
for denom, c := range uniqCoins { //#nosec
|
||||
if c.IsZero() {
|
||||
continue
|
||||
}
|
||||
if !comboCoin.IsZero() {
|
||||
coalesced = append(coalesced, comboCoin)
|
||||
}
|
||||
}
|
||||
if coalesced == nil {
|
||||
return Coins{}
|
||||
c.Denom = denom
|
||||
coalesced = append(coalesced, c)
|
||||
}
|
||||
return coalesced.Sort()
|
||||
}
|
||||
|
||||
@ -242,7 +242,7 @@ func (coins DecCoins) Add(coinsB ...DecCoin) DecCoins {
|
||||
// denomination and addition only occurs when the denominations match, otherwise
|
||||
// the coin is simply added to the sum assuming it's not zero.
|
||||
func (coins DecCoins) safeAdd(coinsB DecCoins) DecCoins {
|
||||
sum := ([]DecCoin)(nil)
|
||||
sum := make(DecCoins, 0, len(coins)+len(coinsB))
|
||||
indexA, indexB := 0, 0
|
||||
lenA, lenB := len(coins), len(coinsB)
|
||||
|
||||
|
||||
@ -98,7 +98,7 @@ func (s *decCoinTestSuite) TestAddDecCoins() {
|
||||
}{
|
||||
{sdk.DecCoins{{testDenom1, one}, {testDenom2, one}}, sdk.DecCoins{{testDenom1, one}, {testDenom2, one}}, sdk.DecCoins{{testDenom1, two}, {testDenom2, two}}},
|
||||
{sdk.DecCoins{{testDenom1, zero}, {testDenom2, one}}, sdk.DecCoins{{testDenom1, zero}, {testDenom2, zero}}, sdk.DecCoins{{testDenom2, one}}},
|
||||
{sdk.DecCoins{{testDenom1, zero}, {testDenom2, zero}}, sdk.DecCoins{{testDenom1, zero}, {testDenom2, zero}}, sdk.DecCoins(nil)},
|
||||
{sdk.DecCoins{{testDenom1, zero}, {testDenom2, zero}}, sdk.DecCoins{{testDenom1, zero}, {testDenom2, zero}}, sdk.DecCoins{}},
|
||||
}
|
||||
|
||||
for tcIndex, tc := range cases {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user