github.com/ava-labs/avalanchego@v1.11.11/vms/components/gas/dimensions.go (about) 1 // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package gas 5 6 import "github.com/ava-labs/avalanchego/utils/math" 7 8 const ( 9 Bandwidth Dimension = iota 10 DBRead 11 DBWrite // includes deletes 12 Compute 13 14 NumDimensions = iota 15 ) 16 17 type ( 18 Dimension uint 19 Dimensions [NumDimensions]uint64 20 ) 21 22 // Add returns d + sum(os...). 23 // 24 // If overflow occurs, an error is returned. 25 func (d Dimensions) Add(os ...*Dimensions) (Dimensions, error) { 26 var err error 27 for _, o := range os { 28 for i := range o { 29 d[i], err = math.Add(d[i], o[i]) 30 if err != nil { 31 return d, err 32 } 33 } 34 } 35 return d, nil 36 } 37 38 // Sub returns d - sum(os...). 39 // 40 // If underflow occurs, an error is returned. 41 func (d Dimensions) Sub(os ...*Dimensions) (Dimensions, error) { 42 var err error 43 for _, o := range os { 44 for i := range o { 45 d[i], err = math.Sub(d[i], o[i]) 46 if err != nil { 47 return d, err 48 } 49 } 50 } 51 return d, nil 52 } 53 54 // ToGas returns d ยท weights. 55 // 56 // If overflow occurs, an error is returned. 57 func (d Dimensions) ToGas(weights Dimensions) (Gas, error) { 58 var res uint64 59 for i := range d { 60 v, err := math.Mul(d[i], weights[i]) 61 if err != nil { 62 return 0, err 63 } 64 res, err = math.Add(res, v) 65 if err != nil { 66 return 0, err 67 } 68 } 69 return Gas(res), nil 70 }