...
Tawesoft Logo

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

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