...
Tawesoft Logo

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

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