...
Tawesoft Logo

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

Documentation: src/tawesoft.co.uk/go/operator/uint32.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 uint32Unary struct {
     9      Identity        func(uint32) uint32
    10      Not             func(uint32) uint32
    11      Zero            func(uint32) bool
    12      NonZero         func(uint32) bool
    13      Positive        func(uint32) bool
    14      Negative        func(uint32) bool
    15  }
    16  
    17  type uint32UnaryChecked struct {
    18  }
    19  
    20  type uint32Binary struct {
    21      Add             func(uint32, uint32) uint32
    22      Sub             func(uint32, uint32) uint32
    23      Mul             func(uint32, uint32) uint32
    24      Div             func(uint32, uint32) uint32
    25      Mod             func(uint32, uint32) uint32
    26      
    27      Eq              func(uint32, uint32) bool
    28      Neq             func(uint32, uint32) bool
    29      Lt              func(uint32, uint32) bool
    30      Lte             func(uint32, uint32) bool
    31      Gt              func(uint32, uint32) bool
    32      Gte             func(uint32, uint32) bool
    33      
    34      And             func(uint32, uint32) uint32
    35      Or              func(uint32, uint32) uint32
    36      Xor             func(uint32, uint32) uint32
    37      AndNot          func(uint32, uint32) uint32
    38      
    39      Shl             func(uint32, uint) uint32
    40      Shr             func(uint32, uint) uint32
    41  }
    42  
    43  type uint32BinaryChecked struct {
    44      Add             func(uint32, uint32) (uint32, error)
    45      Sub             func(uint32, uint32) (uint32, error)
    46      Mul             func(uint32, uint32) (uint32, error)
    47      Div             func(uint32, uint32) (uint32, error)
    48      
    49      Shl             func(uint32, uint) (uint32, error)
    50      Shr             func(uint32, uint) (uint32, error)
    51  }
    52  
    53  type uint32Nary struct {
    54      Add             func(... uint32) uint32
    55      Sub             func(... uint32) uint32
    56      Mul             func(... uint32) uint32
    57  }
    58  
    59  type uint32NaryChecked struct {
    60      Add             func(... uint32) (uint32, error)
    61      Sub             func(... uint32) (uint32, error)
    62      Mul             func(... uint32) (uint32, error)
    63  }
    64  
    65  // Uint32 implements operations on one (unary), two (binary), or many (nary) arguments of type uint32.
    66  var Uint32 = struct {
    67      Unary           uint32Unary
    68      Binary          uint32Binary
    69      Nary            uint32Nary
    70      Reduce          func(operatorIdentity uint32, operator func(uint32, uint32) uint32, elements ... uint32) uint32
    71  }{
    72      Unary:          uint32Unary{
    73          Identity:   func(a uint32) uint32 { return a },
    74          Not:        func(a uint32) uint32 { return ^a },
    75          Zero:       func(a uint32) bool { return a == 0 },
    76          NonZero:    func(a uint32) bool { return a != 0 },
    77          Positive:   uint32UnaryPositive,
    78          Negative:   uint32UnaryNegative,
    79      },
    80      
    81      Binary:          uint32Binary{
    82          Add:        func(a uint32, b uint32) uint32 { return a + b },
    83          Sub:        func(a uint32, b uint32) uint32 { return a - b },
    84          Mul:        func(a uint32, b uint32) uint32 { return a * b },
    85          Div:        func(a uint32, b uint32) uint32 { return a / b },
    86          
    87          Eq:         func(a uint32, b uint32) bool { return a == b },
    88          Neq:        func(a uint32, b uint32) bool { return a != b },
    89          Lt:         func(a uint32, b uint32) bool { return a <  b },
    90          Lte:        func(a uint32, b uint32) bool { return a <= b },
    91          Gt:         func(a uint32, b uint32) bool { return a >  b },
    92          Gte:        func(a uint32, b uint32) bool { return a >= b },
    93          
    94          And:        func(a uint32, b uint32) uint32 { return a & b },
    95          Or:         func(a uint32, b uint32) uint32 { return a | b },
    96          Xor:        func(a uint32, b uint32) uint32 { return a ^ b },
    97          AndNot:     func(a uint32, b uint32) uint32 { return a &^ b },
    98          Mod:        func(a uint32, b uint32) uint32 { return a % b },
    99          
   100          Shl:        func(a uint32, b uint) uint32 { return a << b },
   101          Shr:        func(a uint32, b uint) uint32 { return a >> b },
   102      },
   103      
   104      Nary:           uint32Nary{
   105          Add:        uint32NaryAdd,
   106          Mul:        uint32NaryMul,
   107      },
   108      
   109      Reduce:         uint32Reduce,
   110  }
   111  
   112  // Uint32Checked implements operations on one (unary), two (binary), or many (nary) arguments of type uint32, returning an
   113  // error in cases such as overflow or an undefined operation.
   114  var Uint32Checked = struct {
   115      Unary           uint32UnaryChecked
   116      Binary          uint32BinaryChecked
   117      Nary            uint32NaryChecked
   118      Reduce          func(operatorIdentity uint32, operator func(uint32, uint32) (uint32, error), elements ... uint32) (uint32, error)
   119  }{
   120      Unary:          uint32UnaryChecked{
   121      },
   122      
   123      Binary:         uint32BinaryChecked{
   124          Add:        uint32BinaryCheckedAdd,
   125          Sub:        uint32BinaryCheckedSub,
   126          Mul:        uint32BinaryCheckedMul,
   127          Div:        uint32BinaryCheckedDiv,
   128          Shl:        uint32BinaryCheckedShl,
   129      },
   130      
   131      Nary:           uint32NaryChecked{
   132          Add:        uint32NaryCheckedAdd,
   133          Mul:        uint32NaryCheckedMul,
   134      },
   135      
   136      Reduce:         uint32CheckedReduce,
   137  }
   138  
   139  func uint32UnaryPositive(a uint32) bool {
   140      return a > 0
   141  }
   142  
   143  func uint32UnaryNegative(a uint32) bool {
   144      return a < 0
   145  }
   146  
   147  
   148  
   149  
   150  func uint32BinaryCheckedAdd(a uint32, b uint32) (v uint32, err error) {
   151      if (b > 0) && (a > (maxUint32 - b)) { return v, ErrorOverflow }
   152      if (b < 0) && (a < (minUint32 - b)) { return v, ErrorOverflow }
   153      return a + b, nil
   154  }
   155  
   156  func uint32BinaryCheckedSub(a uint32, b uint32) (v uint32, err error) {
   157      if (b < 0) && (a > (maxUint32 + b)) { return v, ErrorOverflow }
   158      if (b > 0) && (a < (minUint32 + b)) { return v, ErrorOverflow }
   159      return a - b, nil
   160  }
   161  
   162  func uint32BinaryCheckedMul(a uint32, b uint32) (v uint32, err error) {
   163      if (a > (maxUint32 / b)) { return v, ErrorOverflow }
   164      if (a < (minUint32 / b)) { return v, ErrorOverflow }
   165      
   166      return a * b, nil
   167  }
   168  
   169  func uint32BinaryCheckedDiv(a uint32, b uint32) (v uint32, err error) {
   170      if (b == 0) { return v, ErrorUndefined }
   171      
   172      return a / b, nil
   173  }
   174  
   175  func uint32BinaryCheckedShl(a uint32, b uint) (v uint32, err error) {
   176      if b > uint(uint32MostSignificantBit(maxUint32)) { return v, ErrorOverflow }
   177      return v, err
   178  }
   179  
   180  func uint32MostSignificantBit(a uint32) (result int) {
   181    for a > 0 {
   182        a >>= 1
   183        result++
   184    }
   185    return result;
   186  }
   187  
   188  func uint32NaryAdd(xs ... uint32) (result uint32) {
   189      for i := 0; i < len(xs); i++ {
   190          result += xs[i]
   191      }
   192      return result
   193  }
   194  
   195  func uint32NaryCheckedAdd(xs ... uint32) (result uint32, err error) {
   196      for i := 0; i < len(xs); i++ {
   197          result, err = uint32BinaryCheckedAdd(result, xs[i])
   198          if err != nil { return result, err }
   199      }
   200      return result, nil
   201  }
   202  
   203  func uint32NaryMul(xs ... uint32) (result uint32) {
   204      result = 1
   205      for i := 0; i < len(xs); i++ {
   206          result *= xs[i]
   207      }
   208      return result
   209  }
   210  
   211  func uint32NaryCheckedMul(xs ... uint32) (result uint32, err error) {
   212      result = 1
   213      for i := 0; i < len(xs); i++ {
   214          result, err = uint32BinaryCheckedMul(result, xs[i])
   215          if err != nil { return result, err }
   216      }
   217      return result, nil
   218  }
   219  
   220  func uint32Reduce(operatorIdentity uint32, operator func(uint32, uint32) uint32, elements ... uint32) (result uint32) {
   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 uint32CheckedReduce(operatorIdentity uint32, operator func(uint32, uint32) (uint32, error), elements ... uint32) (result uint32, 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