...
Tawesoft Logo

Source file src/tawesoft.co.uk/go/operator/uint.go

Documentation: src/tawesoft.co.uk/go/operator/uint.go

     1  package operator
     2  
     3  // Code generated by (tawesoft.co.uk/go/operator) template-numbers.py: DO NOT EDIT.
     4  
     5  
     6  // Some overflow checks with reference to stackoverflow.com/a/1514309/5654201
     7  
     8  type uintUnary struct {
     9      Identity        func(uint) uint
    10      Not             func(uint) uint
    11      Zero            func(uint) bool
    12      NonZero         func(uint) bool
    13      Positive        func(uint) bool
    14      Negative        func(uint) bool
    15  }
    16  
    17  type uintUnaryChecked struct {
    18  }
    19  
    20  type uintBinary struct {
    21      Add             func(uint, uint) uint
    22      Sub             func(uint, uint) uint
    23      Mul             func(uint, uint) uint
    24      Div             func(uint, uint) uint
    25      Mod             func(uint, uint) uint
    26      
    27      Eq              func(uint, uint) bool
    28      Neq             func(uint, uint) bool
    29      Lt              func(uint, uint) bool
    30      Lte             func(uint, uint) bool
    31      Gt              func(uint, uint) bool
    32      Gte             func(uint, uint) bool
    33      
    34      And             func(uint, uint) uint
    35      Or              func(uint, uint) uint
    36      Xor             func(uint, uint) uint
    37      AndNot          func(uint, uint) uint
    38      
    39      Shl             func(uint, uint) uint
    40      Shr             func(uint, uint) uint
    41  }
    42  
    43  type uintBinaryChecked struct {
    44      Add             func(uint, uint) (uint, error)
    45      Sub             func(uint, uint) (uint, error)
    46      Mul             func(uint, uint) (uint, error)
    47      Div             func(uint, uint) (uint, error)
    48      
    49      Shl             func(uint, uint) (uint, error)
    50      Shr             func(uint, uint) (uint, error)
    51  }
    52  
    53  type uintNary struct {
    54      Add             func(... uint) uint
    55      Sub             func(... uint) uint
    56      Mul             func(... uint) uint
    57  }
    58  
    59  type uintNaryChecked struct {
    60      Add             func(... uint) (uint, error)
    61      Sub             func(... uint) (uint, error)
    62      Mul             func(... uint) (uint, error)
    63  }
    64  
    65  // Uint implements operations on one (unary), two (binary), or many (nary) arguments of type uint.
    66  var Uint = struct {
    67      Unary           uintUnary
    68      Binary          uintBinary
    69      Nary            uintNary
    70      Reduce          func(operatorIdentity uint, operator func(uint, uint) uint, elements ... uint) uint
    71  }{
    72      Unary:          uintUnary{
    73          Identity:   func(a uint) uint { return a },
    74          Not:        func(a uint) uint { return ^a },
    75          Zero:       func(a uint) bool { return a == 0 },
    76          NonZero:    func(a uint) bool { return a != 0 },
    77          Positive:   uintUnaryPositive,
    78          Negative:   uintUnaryNegative,
    79      },
    80      
    81      Binary:          uintBinary{
    82          Add:        func(a uint, b uint) uint { return a + b },
    83          Sub:        func(a uint, b uint) uint { return a - b },
    84          Mul:        func(a uint, b uint) uint { return a * b },
    85          Div:        func(a uint, b uint) uint { return a / b },
    86          
    87          Eq:         func(a uint, b uint) bool { return a == b },
    88          Neq:        func(a uint, b uint) bool { return a != b },
    89          Lt:         func(a uint, b uint) bool { return a <  b },
    90          Lte:        func(a uint, b uint) bool { return a <= b },
    91          Gt:         func(a uint, b uint) bool { return a >  b },
    92          Gte:        func(a uint, b uint) bool { return a >= b },
    93          
    94          And:        func(a uint, b uint) uint { return a & b },
    95          Or:         func(a uint, b uint) uint { return a | b },
    96          Xor:        func(a uint, b uint) uint { return a ^ b },
    97          AndNot:     func(a uint, b uint) uint { return a &^ b },
    98          Mod:        func(a uint, b uint) uint { return a % b },
    99          
   100          Shl:        func(a uint, b uint) uint { return a << b },
   101          Shr:        func(a uint, b uint) uint { return a >> b },
   102      },
   103      
   104      Nary:           uintNary{
   105          Add:        uintNaryAdd,
   106          Mul:        uintNaryMul,
   107      },
   108      
   109      Reduce:         uintReduce,
   110  }
   111  
   112  // UintChecked implements operations on one (unary), two (binary), or many (nary) arguments of type uint, returning an
   113  // error in cases such as overflow or an undefined operation.
   114  var UintChecked = struct {
   115      Unary           uintUnaryChecked
   116      Binary          uintBinaryChecked
   117      Nary            uintNaryChecked
   118      Reduce          func(operatorIdentity uint, operator func(uint, uint) (uint, error), elements ... uint) (uint, error)
   119  }{
   120      Unary:          uintUnaryChecked{
   121      },
   122      
   123      Binary:         uintBinaryChecked{
   124          Add:        uintBinaryCheckedAdd,
   125          Sub:        uintBinaryCheckedSub,
   126          Mul:        uintBinaryCheckedMul,
   127          Div:        uintBinaryCheckedDiv,
   128          Shl:        uintBinaryCheckedShl,
   129      },
   130      
   131      Nary:           uintNaryChecked{
   132          Add:        uintNaryCheckedAdd,
   133          Mul:        uintNaryCheckedMul,
   134      },
   135      
   136      Reduce:         uintCheckedReduce,
   137  }
   138  
   139  func uintUnaryPositive(a uint) bool {
   140      return a > 0
   141  }
   142  
   143  func uintUnaryNegative(a uint) bool {
   144      return a < 0
   145  }
   146  
   147  
   148  
   149  
   150  func uintBinaryCheckedAdd(a uint, b uint) (v uint, err error) {
   151      if (b > 0) && (a > (maxUint - b)) { return v, ErrorOverflow }
   152      if (b < 0) && (a < (minUint - b)) { return v, ErrorOverflow }
   153      return a + b, nil
   154  }
   155  
   156  func uintBinaryCheckedSub(a uint, b uint) (v uint, err error) {
   157      if (b < 0) && (a > (maxUint + b)) { return v, ErrorOverflow }
   158      if (b > 0) && (a < (minUint + b)) { return v, ErrorOverflow }
   159      return a - b, nil
   160  }
   161  
   162  func uintBinaryCheckedMul(a uint, b uint) (v uint, err error) {
   163      if (a > (maxUint / b)) { return v, ErrorOverflow }
   164      if (a < (minUint / b)) { return v, ErrorOverflow }
   165      
   166      return a * b, nil
   167  }
   168  
   169  func uintBinaryCheckedDiv(a uint, b uint) (v uint, err error) {
   170      if (b == 0) { return v, ErrorUndefined }
   171      
   172      return a / b, nil
   173  }
   174  
   175  func uintBinaryCheckedShl(a uint, b uint) (v uint, err error) {
   176      if b > uint(uintMostSignificantBit(maxUint)) { return v, ErrorOverflow }
   177      return v, err
   178  }
   179  
   180  func uintMostSignificantBit(a uint) (result int) {
   181    for a > 0 {
   182        a >>= 1
   183        result++
   184    }
   185    return result;
   186  }
   187  
   188  func uintNaryAdd(xs ... uint) (result uint) {
   189      for i := 0; i < len(xs); i++ {
   190          result += xs[i]
   191      }
   192      return result
   193  }
   194  
   195  func uintNaryCheckedAdd(xs ... uint) (result uint, err error) {
   196      for i := 0; i < len(xs); i++ {
   197          result, err = uintBinaryCheckedAdd(result, xs[i])
   198          if err != nil { return result, err }
   199      }
   200      return result, nil
   201  }
   202  
   203  func uintNaryMul(xs ... uint) (result uint) {
   204      result = 1
   205      for i := 0; i < len(xs); i++ {
   206          result *= xs[i]
   207      }
   208      return result
   209  }
   210  
   211  func uintNaryCheckedMul(xs ... uint) (result uint, err error) {
   212      result = 1
   213      for i := 0; i < len(xs); i++ {
   214          result, err = uintBinaryCheckedMul(result, xs[i])
   215          if err != nil { return result, err }
   216      }
   217      return result, nil
   218  }
   219  
   220  func uintReduce(operatorIdentity uint, operator func(uint, uint) uint, elements ... uint) (result uint) {
   221      result = operatorIdentity
   222      for i := 0; i < len(elements); i++ {
   223          result = operator(result, elements[i])
   224      }
   225      return result
   226  }
   227  
   228  func uintCheckedReduce(operatorIdentity uint, operator func(uint, uint) (uint, error), elements ... uint) (result uint, err error) {
   229      result = operatorIdentity
   230      for i := 0; i < len(elements); i++ {
   231          result, err = operator(result, elements[i])
   232          if err != nil { return result, err }
   233      }
   234      return result, err
   235  }
   236  
   237  

View as plain text