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  }