...
Tawesoft Logo

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

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