...
Tawesoft Logo

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

Documentation: src/tawesoft.co.uk/go/operator/int8.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 int8Unary struct {
     9      Identity        func(int8) int8
    10      Abs             func(int8) int8
    11      Negation        func(int8) int8
    12      Zero            func(int8) bool
    13      NonZero         func(int8) bool
    14      Positive        func(int8) bool
    15      Negative        func(int8) bool
    16  }
    17  
    18  type int8UnaryChecked struct {
    19      Abs             func(int8) (int8, error)
    20      Negation        func(int8) (int8, error)
    21  }
    22  
    23  type int8Binary struct {
    24      Add             func(int8, int8) int8
    25      Sub             func(int8, int8) int8
    26      Mul             func(int8, int8) int8
    27      Div             func(int8, int8) int8
    28      Mod             func(int8, int8) int8
    29      
    30      Eq              func(int8, int8) bool
    31      Neq             func(int8, int8) bool
    32      Lt              func(int8, int8) bool
    33      Lte             func(int8, int8) bool
    34      Gt              func(int8, int8) bool
    35      Gte             func(int8, int8) bool
    36      
    37      And             func(int8, int8) int8
    38      Or              func(int8, int8) int8
    39      Xor             func(int8, int8) int8
    40      AndNot          func(int8, int8) int8
    41      
    42      Shl             func(int8, uint) int8
    43      Shr             func(int8, uint) int8
    44  }
    45  
    46  type int8BinaryChecked struct {
    47      Add             func(int8, int8) (int8, error)
    48      Sub             func(int8, int8) (int8, error)
    49      Mul             func(int8, int8) (int8, error)
    50      Div             func(int8, int8) (int8, error)
    51      
    52      Shl             func(int8, uint) (int8, error)
    53      Shr             func(int8, uint) (int8, error)
    54  }
    55  
    56  type int8Nary struct {
    57      Add             func(... int8) int8
    58      Sub             func(... int8) int8
    59      Mul             func(... int8) int8
    60  }
    61  
    62  type int8NaryChecked struct {
    63      Add             func(... int8) (int8, error)
    64      Sub             func(... int8) (int8, error)
    65      Mul             func(... int8) (int8, error)
    66  }
    67  
    68  // Int8 implements operations on one (unary), two (binary), or many (nary) arguments of type int8.
    69  var Int8 = struct {
    70      Unary           int8Unary
    71      Binary          int8Binary
    72      Nary            int8Nary
    73      Reduce          func(operatorIdentity int8, operator func(int8, int8) int8, elements ... int8) int8
    74  }{
    75      Unary:          int8Unary{
    76          Identity:   func(a int8) int8 { return a },
    77          Abs:        int8UnaryAbs,
    78          Negation:   func(a int8) int8 { return -a },
    79          Zero:       func(a int8) bool { return a == 0 },
    80          NonZero:    func(a int8) bool { return a != 0 },
    81          Positive:   int8UnaryPositive,
    82          Negative:   int8UnaryNegative,
    83      },
    84      
    85      Binary:          int8Binary{
    86          Add:        func(a int8, b int8) int8 { return a + b },
    87          Sub:        func(a int8, b int8) int8 { return a - b },
    88          Mul:        func(a int8, b int8) int8 { return a * b },
    89          Div:        func(a int8, b int8) int8 { return a / b },
    90          
    91          Eq:         func(a int8, b int8) bool { return a == b },
    92          Neq:        func(a int8, b int8) bool { return a != b },
    93          Lt:         func(a int8, b int8) bool { return a <  b },
    94          Lte:        func(a int8, b int8) bool { return a <= b },
    95          Gt:         func(a int8, b int8) bool { return a >  b },
    96          Gte:        func(a int8, b int8) bool { return a >= b },
    97          
    98          And:        func(a int8, b int8) int8 { return a & b },
    99          Or:         func(a int8, b int8) int8 { return a | b },
   100          Xor:        func(a int8, b int8) int8 { return a ^ b },
   101          AndNot:     func(a int8, b int8) int8 { return a &^ b },
   102          Mod:        func(a int8, b int8) int8 { return a % b },
   103          
   104          Shl:        func(a int8, b uint) int8 { return a << b },
   105          Shr:        func(a int8, b uint) int8 { return a >> b },
   106      },
   107      
   108      Nary:           int8Nary{
   109          Add:        int8NaryAdd,
   110          Mul:        int8NaryMul,
   111      },
   112      
   113      Reduce:         int8Reduce,
   114  }
   115  
   116  // Int8Checked implements operations on one (unary), two (binary), or many (nary) arguments of type int8, returning an
   117  // error in cases such as overflow or an undefined operation.
   118  var Int8Checked = struct {
   119      Unary           int8UnaryChecked
   120      Binary          int8BinaryChecked
   121      Nary            int8NaryChecked
   122      Reduce          func(operatorIdentity int8, operator func(int8, int8) (int8, error), elements ... int8) (int8, error)
   123  }{
   124      Unary:          int8UnaryChecked{
   125          Abs:        int8UnaryCheckedAbs,
   126          Negation:   int8UnaryCheckedNegation,
   127      },
   128      
   129      Binary:         int8BinaryChecked{
   130          Add:        int8BinaryCheckedAdd,
   131          Sub:        int8BinaryCheckedSub,
   132          Mul:        int8BinaryCheckedMul,
   133          Div:        int8BinaryCheckedDiv,
   134          Shl:        int8BinaryCheckedShl,
   135      },
   136      
   137      Nary:           int8NaryChecked{
   138          Add:        int8NaryCheckedAdd,
   139          Mul:        int8NaryCheckedMul,
   140      },
   141      
   142      Reduce:         int8CheckedReduce,
   143  }
   144  
   145  func int8UnaryPositive(a int8) bool {
   146      return a > 0
   147  }
   148  
   149  func int8UnaryNegative(a int8) bool {
   150      return a < 0
   151  }
   152  
   153  func int8UnaryAbs(a int8) int8 {
   154      if a < 0 { return -a }
   155      return a
   156  }
   157  
   158  func int8UnaryCheckedAbs(a int8) (v int8, err error) {
   159      if a == minInt8 { return v, ErrorOverflow }
   160      if a < 0 { return -a, nil }
   161      return a, nil
   162  }
   163  
   164  func int8UnaryCheckedNegation(a int8) (v int8, err error) {
   165      if (a == minInt8) { return v, ErrorOverflow }
   166      return -a, nil
   167  }
   168  
   169  func int8BinaryCheckedAdd(a int8, b int8) (v int8, err error) {
   170      if (b > 0) && (a > (maxInt8 - b)) { return v, ErrorOverflow }
   171      if (b < 0) && (a < (minInt8 - b)) { return v, ErrorOverflow }
   172      return a + b, nil
   173  }
   174  
   175  func int8BinaryCheckedSub(a int8, b int8) (v int8, err error) {
   176      if (b < 0) && (a > (maxInt8 + b)) { return v, ErrorOverflow }
   177      if (b > 0) && (a < (minInt8 + b)) { return v, ErrorOverflow }
   178      return a - b, nil
   179  }
   180  
   181  func int8BinaryCheckedMul(a int8, b int8) (v int8, err error) {
   182      if (a == -1) && (b == minInt8) { return v, ErrorOverflow }
   183      if (b == -1) && (a == minInt8) { return v, ErrorOverflow }
   184      if (a > (maxInt8 / b)) { return v, ErrorOverflow }
   185      if (a < (minInt8 / b)) { return v, ErrorOverflow }
   186      
   187      return a * b, nil
   188  }
   189  
   190  func int8BinaryCheckedDiv(a int8, b int8) (v int8, err error) {
   191      if (b == -1) && (a == minInt8) { return v, ErrorOverflow }
   192      if (b == 0) { return v, ErrorUndefined }
   193      
   194      return a / b, nil
   195  }
   196  
   197  func int8BinaryCheckedShl(a int8, b uint) (v int8, err error) {
   198      if a < 0 { return v, ErrorUndefined }
   199      if b > uint(int8MostSignificantBit(maxInt8)) { return v, ErrorOverflow }
   200      return v, err
   201  }
   202  
   203  func int8MostSignificantBit(a int8) (result int) {
   204    for a > 0 {
   205        a >>= 1
   206        result++
   207    }
   208    return result;
   209  }
   210  
   211  func int8NaryAdd(xs ... int8) (result int8) {
   212      for i := 0; i < len(xs); i++ {
   213          result += xs[i]
   214      }
   215      return result
   216  }
   217  
   218  func int8NaryCheckedAdd(xs ... int8) (result int8, err error) {
   219      for i := 0; i < len(xs); i++ {
   220          result, err = int8BinaryCheckedAdd(result, xs[i])
   221          if err != nil { return result, err }
   222      }
   223      return result, nil
   224  }
   225  
   226  func int8NaryMul(xs ... int8) (result int8) {
   227      result = 1
   228      for i := 0; i < len(xs); i++ {
   229          result *= xs[i]
   230      }
   231      return result
   232  }
   233  
   234  func int8NaryCheckedMul(xs ... int8) (result int8, err error) {
   235      result = 1
   236      for i := 0; i < len(xs); i++ {
   237          result, err = int8BinaryCheckedMul(result, xs[i])
   238          if err != nil { return result, err }
   239      }
   240      return result, nil
   241  }
   242  
   243  func int8Reduce(operatorIdentity int8, operator func(int8, int8) int8, elements ... int8) (result int8) {
   244      result = operatorIdentity
   245      for i := 0; i < len(elements); i++ {
   246          result = operator(result, elements[i])
   247      }
   248      return result
   249  }
   250  
   251  func int8CheckedReduce(operatorIdentity int8, operator func(int8, int8) (int8, error), elements ... int8) (result int8, err error) {
   252      result = operatorIdentity
   253      for i := 0; i < len(elements); i++ {
   254          result, err = operator(result, elements[i])
   255          if err != nil { return result, err }
   256      }
   257      return result, err
   258  }
   259  
   260  

View as plain text