...
Tawesoft Logo

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

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