...
Tawesoft Logo

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

Documentation: src/tawesoft.co.uk/go/operator/int64.go

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

View as plain text