github.com/wzzhu/tensor@v0.9.24/internal/execution/eng_reduce.go (about)

     1  // Code generated by genlib2. DO NOT EDIT.
     2  
     3  package execution
     4  
     5  import (
     6  	"reflect"
     7  	"unsafe"
     8  
     9  	"github.com/pkg/errors"
    10  	"github.com/wzzhu/tensor/internal/storage"
    11  )
    12  
    13  func (e E) ReduceFirst(t reflect.Type, data *storage.Header, retVal *storage.Header, split int, size int, fn interface{}) (err error) {
    14  	switch t {
    15  	case Bool:
    16  		dt := data.Bools()
    17  		rt := retVal.Bools()
    18  		switch f := fn.(type) {
    19  		case func([]bool, []bool):
    20  			reduceFirstB(dt, rt, split, size, f)
    21  		case func(bool, bool) bool:
    22  			genericReduceFirstB(dt, rt, split, size, f)
    23  		default:
    24  			return errors.Errorf(reductionErrMsg, fn)
    25  		}
    26  		return nil
    27  	case Int:
    28  		dt := data.Ints()
    29  		rt := retVal.Ints()
    30  		switch f := fn.(type) {
    31  		case func([]int, []int):
    32  			reduceFirstI(dt, rt, split, size, f)
    33  		case func(int, int) int:
    34  			genericReduceFirstI(dt, rt, split, size, f)
    35  		default:
    36  			return errors.Errorf(reductionErrMsg, fn)
    37  		}
    38  		return nil
    39  	case Int8:
    40  		dt := data.Int8s()
    41  		rt := retVal.Int8s()
    42  		switch f := fn.(type) {
    43  		case func([]int8, []int8):
    44  			reduceFirstI8(dt, rt, split, size, f)
    45  		case func(int8, int8) int8:
    46  			genericReduceFirstI8(dt, rt, split, size, f)
    47  		default:
    48  			return errors.Errorf(reductionErrMsg, fn)
    49  		}
    50  		return nil
    51  	case Int16:
    52  		dt := data.Int16s()
    53  		rt := retVal.Int16s()
    54  		switch f := fn.(type) {
    55  		case func([]int16, []int16):
    56  			reduceFirstI16(dt, rt, split, size, f)
    57  		case func(int16, int16) int16:
    58  			genericReduceFirstI16(dt, rt, split, size, f)
    59  		default:
    60  			return errors.Errorf(reductionErrMsg, fn)
    61  		}
    62  		return nil
    63  	case Int32:
    64  		dt := data.Int32s()
    65  		rt := retVal.Int32s()
    66  		switch f := fn.(type) {
    67  		case func([]int32, []int32):
    68  			reduceFirstI32(dt, rt, split, size, f)
    69  		case func(int32, int32) int32:
    70  			genericReduceFirstI32(dt, rt, split, size, f)
    71  		default:
    72  			return errors.Errorf(reductionErrMsg, fn)
    73  		}
    74  		return nil
    75  	case Int64:
    76  		dt := data.Int64s()
    77  		rt := retVal.Int64s()
    78  		switch f := fn.(type) {
    79  		case func([]int64, []int64):
    80  			reduceFirstI64(dt, rt, split, size, f)
    81  		case func(int64, int64) int64:
    82  			genericReduceFirstI64(dt, rt, split, size, f)
    83  		default:
    84  			return errors.Errorf(reductionErrMsg, fn)
    85  		}
    86  		return nil
    87  	case Uint:
    88  		dt := data.Uints()
    89  		rt := retVal.Uints()
    90  		switch f := fn.(type) {
    91  		case func([]uint, []uint):
    92  			reduceFirstU(dt, rt, split, size, f)
    93  		case func(uint, uint) uint:
    94  			genericReduceFirstU(dt, rt, split, size, f)
    95  		default:
    96  			return errors.Errorf(reductionErrMsg, fn)
    97  		}
    98  		return nil
    99  	case Uint8:
   100  		dt := data.Uint8s()
   101  		rt := retVal.Uint8s()
   102  		switch f := fn.(type) {
   103  		case func([]uint8, []uint8):
   104  			reduceFirstU8(dt, rt, split, size, f)
   105  		case func(uint8, uint8) uint8:
   106  			genericReduceFirstU8(dt, rt, split, size, f)
   107  		default:
   108  			return errors.Errorf(reductionErrMsg, fn)
   109  		}
   110  		return nil
   111  	case Uint16:
   112  		dt := data.Uint16s()
   113  		rt := retVal.Uint16s()
   114  		switch f := fn.(type) {
   115  		case func([]uint16, []uint16):
   116  			reduceFirstU16(dt, rt, split, size, f)
   117  		case func(uint16, uint16) uint16:
   118  			genericReduceFirstU16(dt, rt, split, size, f)
   119  		default:
   120  			return errors.Errorf(reductionErrMsg, fn)
   121  		}
   122  		return nil
   123  	case Uint32:
   124  		dt := data.Uint32s()
   125  		rt := retVal.Uint32s()
   126  		switch f := fn.(type) {
   127  		case func([]uint32, []uint32):
   128  			reduceFirstU32(dt, rt, split, size, f)
   129  		case func(uint32, uint32) uint32:
   130  			genericReduceFirstU32(dt, rt, split, size, f)
   131  		default:
   132  			return errors.Errorf(reductionErrMsg, fn)
   133  		}
   134  		return nil
   135  	case Uint64:
   136  		dt := data.Uint64s()
   137  		rt := retVal.Uint64s()
   138  		switch f := fn.(type) {
   139  		case func([]uint64, []uint64):
   140  			reduceFirstU64(dt, rt, split, size, f)
   141  		case func(uint64, uint64) uint64:
   142  			genericReduceFirstU64(dt, rt, split, size, f)
   143  		default:
   144  			return errors.Errorf(reductionErrMsg, fn)
   145  		}
   146  		return nil
   147  	case Uintptr:
   148  		dt := data.Uintptrs()
   149  		rt := retVal.Uintptrs()
   150  		switch f := fn.(type) {
   151  		case func([]uintptr, []uintptr):
   152  			reduceFirstUintptr(dt, rt, split, size, f)
   153  		case func(uintptr, uintptr) uintptr:
   154  			genericReduceFirstUintptr(dt, rt, split, size, f)
   155  		default:
   156  			return errors.Errorf(reductionErrMsg, fn)
   157  		}
   158  		return nil
   159  	case Float32:
   160  		dt := data.Float32s()
   161  		rt := retVal.Float32s()
   162  		switch f := fn.(type) {
   163  		case func([]float32, []float32):
   164  			reduceFirstF32(dt, rt, split, size, f)
   165  		case func(float32, float32) float32:
   166  			genericReduceFirstF32(dt, rt, split, size, f)
   167  		default:
   168  			return errors.Errorf(reductionErrMsg, fn)
   169  		}
   170  		return nil
   171  	case Float64:
   172  		dt := data.Float64s()
   173  		rt := retVal.Float64s()
   174  		switch f := fn.(type) {
   175  		case func([]float64, []float64):
   176  			reduceFirstF64(dt, rt, split, size, f)
   177  		case func(float64, float64) float64:
   178  			genericReduceFirstF64(dt, rt, split, size, f)
   179  		default:
   180  			return errors.Errorf(reductionErrMsg, fn)
   181  		}
   182  		return nil
   183  	case Complex64:
   184  		dt := data.Complex64s()
   185  		rt := retVal.Complex64s()
   186  		switch f := fn.(type) {
   187  		case func([]complex64, []complex64):
   188  			reduceFirstC64(dt, rt, split, size, f)
   189  		case func(complex64, complex64) complex64:
   190  			genericReduceFirstC64(dt, rt, split, size, f)
   191  		default:
   192  			return errors.Errorf(reductionErrMsg, fn)
   193  		}
   194  		return nil
   195  	case Complex128:
   196  		dt := data.Complex128s()
   197  		rt := retVal.Complex128s()
   198  		switch f := fn.(type) {
   199  		case func([]complex128, []complex128):
   200  			reduceFirstC128(dt, rt, split, size, f)
   201  		case func(complex128, complex128) complex128:
   202  			genericReduceFirstC128(dt, rt, split, size, f)
   203  		default:
   204  			return errors.Errorf(reductionErrMsg, fn)
   205  		}
   206  		return nil
   207  	case String:
   208  		dt := data.Strings()
   209  		rt := retVal.Strings()
   210  		switch f := fn.(type) {
   211  		case func([]string, []string):
   212  			reduceFirstStr(dt, rt, split, size, f)
   213  		case func(string, string) string:
   214  			genericReduceFirstStr(dt, rt, split, size, f)
   215  		default:
   216  			return errors.Errorf(reductionErrMsg, fn)
   217  		}
   218  		return nil
   219  	case UnsafePointer:
   220  		dt := data.UnsafePointers()
   221  		rt := retVal.UnsafePointers()
   222  		switch f := fn.(type) {
   223  		case func([]unsafe.Pointer, []unsafe.Pointer):
   224  			reduceFirstUnsafePointer(dt, rt, split, size, f)
   225  		case func(unsafe.Pointer, unsafe.Pointer) unsafe.Pointer:
   226  			genericReduceFirstUnsafePointer(dt, rt, split, size, f)
   227  		default:
   228  			return errors.Errorf(reductionErrMsg, fn)
   229  		}
   230  		return nil
   231  	default:
   232  		return errors.Errorf("Unsupported type %v for ReduceFirst", t)
   233  	}
   234  }
   235  
   236  func (e E) ReduceLast(t reflect.Type, data *storage.Header, retVal *storage.Header, dimSize int, defaultValue interface{}, fn interface{}) (err error) {
   237  	var ok bool
   238  	switch t {
   239  	case Bool:
   240  		var def bool
   241  
   242  		if def, ok = defaultValue.(bool); !ok {
   243  			return errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   244  		}
   245  		dt := data.Bools()
   246  		rt := retVal.Bools()
   247  		switch f := fn.(type) {
   248  		case func([]bool) bool:
   249  			reduceLastB(dt, rt, dimSize, def, f)
   250  		case func(bool, bool) bool:
   251  			genericReduceLastB(dt, rt, dimSize, def, f)
   252  		default:
   253  			return errors.Errorf(reductionErrMsg, fn)
   254  		}
   255  		return nil
   256  	case Int:
   257  		var def int
   258  
   259  		if def, ok = defaultValue.(int); !ok {
   260  			return errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   261  		}
   262  		dt := data.Ints()
   263  		rt := retVal.Ints()
   264  		switch f := fn.(type) {
   265  		case func([]int) int:
   266  			reduceLastI(dt, rt, dimSize, def, f)
   267  		case func(int, int) int:
   268  			genericReduceLastI(dt, rt, dimSize, def, f)
   269  		default:
   270  			return errors.Errorf(reductionErrMsg, fn)
   271  		}
   272  		return nil
   273  	case Int8:
   274  		var def int8
   275  
   276  		if def, ok = defaultValue.(int8); !ok {
   277  			return errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   278  		}
   279  		dt := data.Int8s()
   280  		rt := retVal.Int8s()
   281  		switch f := fn.(type) {
   282  		case func([]int8) int8:
   283  			reduceLastI8(dt, rt, dimSize, def, f)
   284  		case func(int8, int8) int8:
   285  			genericReduceLastI8(dt, rt, dimSize, def, f)
   286  		default:
   287  			return errors.Errorf(reductionErrMsg, fn)
   288  		}
   289  		return nil
   290  	case Int16:
   291  		var def int16
   292  
   293  		if def, ok = defaultValue.(int16); !ok {
   294  			return errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   295  		}
   296  		dt := data.Int16s()
   297  		rt := retVal.Int16s()
   298  		switch f := fn.(type) {
   299  		case func([]int16) int16:
   300  			reduceLastI16(dt, rt, dimSize, def, f)
   301  		case func(int16, int16) int16:
   302  			genericReduceLastI16(dt, rt, dimSize, def, f)
   303  		default:
   304  			return errors.Errorf(reductionErrMsg, fn)
   305  		}
   306  		return nil
   307  	case Int32:
   308  		var def int32
   309  
   310  		if def, ok = defaultValue.(int32); !ok {
   311  			return errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   312  		}
   313  		dt := data.Int32s()
   314  		rt := retVal.Int32s()
   315  		switch f := fn.(type) {
   316  		case func([]int32) int32:
   317  			reduceLastI32(dt, rt, dimSize, def, f)
   318  		case func(int32, int32) int32:
   319  			genericReduceLastI32(dt, rt, dimSize, def, f)
   320  		default:
   321  			return errors.Errorf(reductionErrMsg, fn)
   322  		}
   323  		return nil
   324  	case Int64:
   325  		var def int64
   326  
   327  		if def, ok = defaultValue.(int64); !ok {
   328  			return errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   329  		}
   330  		dt := data.Int64s()
   331  		rt := retVal.Int64s()
   332  		switch f := fn.(type) {
   333  		case func([]int64) int64:
   334  			reduceLastI64(dt, rt, dimSize, def, f)
   335  		case func(int64, int64) int64:
   336  			genericReduceLastI64(dt, rt, dimSize, def, f)
   337  		default:
   338  			return errors.Errorf(reductionErrMsg, fn)
   339  		}
   340  		return nil
   341  	case Uint:
   342  		var def uint
   343  
   344  		if def, ok = defaultValue.(uint); !ok {
   345  			return errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   346  		}
   347  		dt := data.Uints()
   348  		rt := retVal.Uints()
   349  		switch f := fn.(type) {
   350  		case func([]uint) uint:
   351  			reduceLastU(dt, rt, dimSize, def, f)
   352  		case func(uint, uint) uint:
   353  			genericReduceLastU(dt, rt, dimSize, def, f)
   354  		default:
   355  			return errors.Errorf(reductionErrMsg, fn)
   356  		}
   357  		return nil
   358  	case Uint8:
   359  		var def uint8
   360  
   361  		if def, ok = defaultValue.(uint8); !ok {
   362  			return errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   363  		}
   364  		dt := data.Uint8s()
   365  		rt := retVal.Uint8s()
   366  		switch f := fn.(type) {
   367  		case func([]uint8) uint8:
   368  			reduceLastU8(dt, rt, dimSize, def, f)
   369  		case func(uint8, uint8) uint8:
   370  			genericReduceLastU8(dt, rt, dimSize, def, f)
   371  		default:
   372  			return errors.Errorf(reductionErrMsg, fn)
   373  		}
   374  		return nil
   375  	case Uint16:
   376  		var def uint16
   377  
   378  		if def, ok = defaultValue.(uint16); !ok {
   379  			return errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   380  		}
   381  		dt := data.Uint16s()
   382  		rt := retVal.Uint16s()
   383  		switch f := fn.(type) {
   384  		case func([]uint16) uint16:
   385  			reduceLastU16(dt, rt, dimSize, def, f)
   386  		case func(uint16, uint16) uint16:
   387  			genericReduceLastU16(dt, rt, dimSize, def, f)
   388  		default:
   389  			return errors.Errorf(reductionErrMsg, fn)
   390  		}
   391  		return nil
   392  	case Uint32:
   393  		var def uint32
   394  
   395  		if def, ok = defaultValue.(uint32); !ok {
   396  			return errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   397  		}
   398  		dt := data.Uint32s()
   399  		rt := retVal.Uint32s()
   400  		switch f := fn.(type) {
   401  		case func([]uint32) uint32:
   402  			reduceLastU32(dt, rt, dimSize, def, f)
   403  		case func(uint32, uint32) uint32:
   404  			genericReduceLastU32(dt, rt, dimSize, def, f)
   405  		default:
   406  			return errors.Errorf(reductionErrMsg, fn)
   407  		}
   408  		return nil
   409  	case Uint64:
   410  		var def uint64
   411  
   412  		if def, ok = defaultValue.(uint64); !ok {
   413  			return errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   414  		}
   415  		dt := data.Uint64s()
   416  		rt := retVal.Uint64s()
   417  		switch f := fn.(type) {
   418  		case func([]uint64) uint64:
   419  			reduceLastU64(dt, rt, dimSize, def, f)
   420  		case func(uint64, uint64) uint64:
   421  			genericReduceLastU64(dt, rt, dimSize, def, f)
   422  		default:
   423  			return errors.Errorf(reductionErrMsg, fn)
   424  		}
   425  		return nil
   426  	case Uintptr:
   427  		var def uintptr
   428  
   429  		if def, ok = defaultValue.(uintptr); !ok {
   430  			return errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   431  		}
   432  		dt := data.Uintptrs()
   433  		rt := retVal.Uintptrs()
   434  		switch f := fn.(type) {
   435  		case func([]uintptr) uintptr:
   436  			reduceLastUintptr(dt, rt, dimSize, def, f)
   437  		case func(uintptr, uintptr) uintptr:
   438  			genericReduceLastUintptr(dt, rt, dimSize, def, f)
   439  		default:
   440  			return errors.Errorf(reductionErrMsg, fn)
   441  		}
   442  		return nil
   443  	case Float32:
   444  		var def float32
   445  
   446  		if def, ok = defaultValue.(float32); !ok {
   447  			return errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   448  		}
   449  		dt := data.Float32s()
   450  		rt := retVal.Float32s()
   451  		switch f := fn.(type) {
   452  		case func([]float32) float32:
   453  			reduceLastF32(dt, rt, dimSize, def, f)
   454  		case func(float32, float32) float32:
   455  			genericReduceLastF32(dt, rt, dimSize, def, f)
   456  		default:
   457  			return errors.Errorf(reductionErrMsg, fn)
   458  		}
   459  		return nil
   460  	case Float64:
   461  		var def float64
   462  
   463  		if def, ok = defaultValue.(float64); !ok {
   464  			return errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   465  		}
   466  		dt := data.Float64s()
   467  		rt := retVal.Float64s()
   468  		switch f := fn.(type) {
   469  		case func([]float64) float64:
   470  			reduceLastF64(dt, rt, dimSize, def, f)
   471  		case func(float64, float64) float64:
   472  			genericReduceLastF64(dt, rt, dimSize, def, f)
   473  		default:
   474  			return errors.Errorf(reductionErrMsg, fn)
   475  		}
   476  		return nil
   477  	case Complex64:
   478  		var def complex64
   479  
   480  		if def, ok = defaultValue.(complex64); !ok {
   481  			return errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   482  		}
   483  		dt := data.Complex64s()
   484  		rt := retVal.Complex64s()
   485  		switch f := fn.(type) {
   486  		case func([]complex64) complex64:
   487  			reduceLastC64(dt, rt, dimSize, def, f)
   488  		case func(complex64, complex64) complex64:
   489  			genericReduceLastC64(dt, rt, dimSize, def, f)
   490  		default:
   491  			return errors.Errorf(reductionErrMsg, fn)
   492  		}
   493  		return nil
   494  	case Complex128:
   495  		var def complex128
   496  
   497  		if def, ok = defaultValue.(complex128); !ok {
   498  			return errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   499  		}
   500  		dt := data.Complex128s()
   501  		rt := retVal.Complex128s()
   502  		switch f := fn.(type) {
   503  		case func([]complex128) complex128:
   504  			reduceLastC128(dt, rt, dimSize, def, f)
   505  		case func(complex128, complex128) complex128:
   506  			genericReduceLastC128(dt, rt, dimSize, def, f)
   507  		default:
   508  			return errors.Errorf(reductionErrMsg, fn)
   509  		}
   510  		return nil
   511  	case String:
   512  		var def string
   513  
   514  		if def, ok = defaultValue.(string); !ok {
   515  			return errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   516  		}
   517  		dt := data.Strings()
   518  		rt := retVal.Strings()
   519  		switch f := fn.(type) {
   520  		case func([]string) string:
   521  			reduceLastStr(dt, rt, dimSize, def, f)
   522  		case func(string, string) string:
   523  			genericReduceLastStr(dt, rt, dimSize, def, f)
   524  		default:
   525  			return errors.Errorf(reductionErrMsg, fn)
   526  		}
   527  		return nil
   528  	case UnsafePointer:
   529  		var def unsafe.Pointer
   530  
   531  		if def, ok = defaultValue.(unsafe.Pointer); !ok {
   532  			return errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   533  		}
   534  		dt := data.UnsafePointers()
   535  		rt := retVal.UnsafePointers()
   536  		switch f := fn.(type) {
   537  		case func([]unsafe.Pointer) unsafe.Pointer:
   538  			reduceLastUnsafePointer(dt, rt, dimSize, def, f)
   539  		case func(unsafe.Pointer, unsafe.Pointer) unsafe.Pointer:
   540  			genericReduceLastUnsafePointer(dt, rt, dimSize, def, f)
   541  		default:
   542  			return errors.Errorf(reductionErrMsg, fn)
   543  		}
   544  		return nil
   545  	default:
   546  		return errors.Errorf("Unsupported type %v for ReduceLast", t)
   547  	}
   548  }
   549  
   550  func (e E) ReduceDefault(t reflect.Type, data *storage.Header, retVal *storage.Header, dim0 int, dimSize int, outerStride int, stride int, expected int, fn interface{}) (err error) {
   551  	var ok bool
   552  	switch t {
   553  	case Bool:
   554  		var f func(bool, bool) bool
   555  		if f, ok = fn.(func(bool, bool) bool); !ok {
   556  			return errors.Errorf(reductionErrMsg, fn)
   557  		}
   558  		dt := data.Bools()
   559  		rt := retVal.Bools()
   560  		reduceDefaultB(dt, rt, dim0, dimSize, outerStride, stride, expected, f)
   561  		return nil
   562  	case Int:
   563  		var f func(int, int) int
   564  		if f, ok = fn.(func(int, int) int); !ok {
   565  			return errors.Errorf(reductionErrMsg, fn)
   566  		}
   567  		dt := data.Ints()
   568  		rt := retVal.Ints()
   569  		reduceDefaultI(dt, rt, dim0, dimSize, outerStride, stride, expected, f)
   570  		return nil
   571  	case Int8:
   572  		var f func(int8, int8) int8
   573  		if f, ok = fn.(func(int8, int8) int8); !ok {
   574  			return errors.Errorf(reductionErrMsg, fn)
   575  		}
   576  		dt := data.Int8s()
   577  		rt := retVal.Int8s()
   578  		reduceDefaultI8(dt, rt, dim0, dimSize, outerStride, stride, expected, f)
   579  		return nil
   580  	case Int16:
   581  		var f func(int16, int16) int16
   582  		if f, ok = fn.(func(int16, int16) int16); !ok {
   583  			return errors.Errorf(reductionErrMsg, fn)
   584  		}
   585  		dt := data.Int16s()
   586  		rt := retVal.Int16s()
   587  		reduceDefaultI16(dt, rt, dim0, dimSize, outerStride, stride, expected, f)
   588  		return nil
   589  	case Int32:
   590  		var f func(int32, int32) int32
   591  		if f, ok = fn.(func(int32, int32) int32); !ok {
   592  			return errors.Errorf(reductionErrMsg, fn)
   593  		}
   594  		dt := data.Int32s()
   595  		rt := retVal.Int32s()
   596  		reduceDefaultI32(dt, rt, dim0, dimSize, outerStride, stride, expected, f)
   597  		return nil
   598  	case Int64:
   599  		var f func(int64, int64) int64
   600  		if f, ok = fn.(func(int64, int64) int64); !ok {
   601  			return errors.Errorf(reductionErrMsg, fn)
   602  		}
   603  		dt := data.Int64s()
   604  		rt := retVal.Int64s()
   605  		reduceDefaultI64(dt, rt, dim0, dimSize, outerStride, stride, expected, f)
   606  		return nil
   607  	case Uint:
   608  		var f func(uint, uint) uint
   609  		if f, ok = fn.(func(uint, uint) uint); !ok {
   610  			return errors.Errorf(reductionErrMsg, fn)
   611  		}
   612  		dt := data.Uints()
   613  		rt := retVal.Uints()
   614  		reduceDefaultU(dt, rt, dim0, dimSize, outerStride, stride, expected, f)
   615  		return nil
   616  	case Uint8:
   617  		var f func(uint8, uint8) uint8
   618  		if f, ok = fn.(func(uint8, uint8) uint8); !ok {
   619  			return errors.Errorf(reductionErrMsg, fn)
   620  		}
   621  		dt := data.Uint8s()
   622  		rt := retVal.Uint8s()
   623  		reduceDefaultU8(dt, rt, dim0, dimSize, outerStride, stride, expected, f)
   624  		return nil
   625  	case Uint16:
   626  		var f func(uint16, uint16) uint16
   627  		if f, ok = fn.(func(uint16, uint16) uint16); !ok {
   628  			return errors.Errorf(reductionErrMsg, fn)
   629  		}
   630  		dt := data.Uint16s()
   631  		rt := retVal.Uint16s()
   632  		reduceDefaultU16(dt, rt, dim0, dimSize, outerStride, stride, expected, f)
   633  		return nil
   634  	case Uint32:
   635  		var f func(uint32, uint32) uint32
   636  		if f, ok = fn.(func(uint32, uint32) uint32); !ok {
   637  			return errors.Errorf(reductionErrMsg, fn)
   638  		}
   639  		dt := data.Uint32s()
   640  		rt := retVal.Uint32s()
   641  		reduceDefaultU32(dt, rt, dim0, dimSize, outerStride, stride, expected, f)
   642  		return nil
   643  	case Uint64:
   644  		var f func(uint64, uint64) uint64
   645  		if f, ok = fn.(func(uint64, uint64) uint64); !ok {
   646  			return errors.Errorf(reductionErrMsg, fn)
   647  		}
   648  		dt := data.Uint64s()
   649  		rt := retVal.Uint64s()
   650  		reduceDefaultU64(dt, rt, dim0, dimSize, outerStride, stride, expected, f)
   651  		return nil
   652  	case Uintptr:
   653  		var f func(uintptr, uintptr) uintptr
   654  		if f, ok = fn.(func(uintptr, uintptr) uintptr); !ok {
   655  			return errors.Errorf(reductionErrMsg, fn)
   656  		}
   657  		dt := data.Uintptrs()
   658  		rt := retVal.Uintptrs()
   659  		reduceDefaultUintptr(dt, rt, dim0, dimSize, outerStride, stride, expected, f)
   660  		return nil
   661  	case Float32:
   662  		var f func(float32, float32) float32
   663  		if f, ok = fn.(func(float32, float32) float32); !ok {
   664  			return errors.Errorf(reductionErrMsg, fn)
   665  		}
   666  		dt := data.Float32s()
   667  		rt := retVal.Float32s()
   668  		reduceDefaultF32(dt, rt, dim0, dimSize, outerStride, stride, expected, f)
   669  		return nil
   670  	case Float64:
   671  		var f func(float64, float64) float64
   672  		if f, ok = fn.(func(float64, float64) float64); !ok {
   673  			return errors.Errorf(reductionErrMsg, fn)
   674  		}
   675  		dt := data.Float64s()
   676  		rt := retVal.Float64s()
   677  		reduceDefaultF64(dt, rt, dim0, dimSize, outerStride, stride, expected, f)
   678  		return nil
   679  	case Complex64:
   680  		var f func(complex64, complex64) complex64
   681  		if f, ok = fn.(func(complex64, complex64) complex64); !ok {
   682  			return errors.Errorf(reductionErrMsg, fn)
   683  		}
   684  		dt := data.Complex64s()
   685  		rt := retVal.Complex64s()
   686  		reduceDefaultC64(dt, rt, dim0, dimSize, outerStride, stride, expected, f)
   687  		return nil
   688  	case Complex128:
   689  		var f func(complex128, complex128) complex128
   690  		if f, ok = fn.(func(complex128, complex128) complex128); !ok {
   691  			return errors.Errorf(reductionErrMsg, fn)
   692  		}
   693  		dt := data.Complex128s()
   694  		rt := retVal.Complex128s()
   695  		reduceDefaultC128(dt, rt, dim0, dimSize, outerStride, stride, expected, f)
   696  		return nil
   697  	case String:
   698  		var f func(string, string) string
   699  		if f, ok = fn.(func(string, string) string); !ok {
   700  			return errors.Errorf(reductionErrMsg, fn)
   701  		}
   702  		dt := data.Strings()
   703  		rt := retVal.Strings()
   704  		reduceDefaultStr(dt, rt, dim0, dimSize, outerStride, stride, expected, f)
   705  		return nil
   706  	case UnsafePointer:
   707  		var f func(unsafe.Pointer, unsafe.Pointer) unsafe.Pointer
   708  		if f, ok = fn.(func(unsafe.Pointer, unsafe.Pointer) unsafe.Pointer); !ok {
   709  			return errors.Errorf(reductionErrMsg, fn)
   710  		}
   711  		dt := data.UnsafePointers()
   712  		rt := retVal.UnsafePointers()
   713  		reduceDefaultUnsafePointer(dt, rt, dim0, dimSize, outerStride, stride, expected, f)
   714  		return nil
   715  	default:
   716  		return errors.Errorf("Unsupported type %v for ReduceDefault", t)
   717  	}
   718  }
   719  
   720  func (e E) Reduce(t reflect.Type, a *storage.Header, defaultValue interface{}, fn interface{}) (retVal interface{}, err error) {
   721  	var ok bool
   722  	switch t {
   723  	case Bool:
   724  		var f func(bool, bool) bool
   725  		var def bool
   726  		if f, ok = fn.(func(bool, bool) bool); !ok {
   727  			return nil, errors.Errorf(reductionErrMsg, fn)
   728  		}
   729  		if def, ok = defaultValue.(bool); !ok {
   730  			return nil, errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   731  		}
   732  		retVal = ReduceB(f, def, a.Bools()...)
   733  		return
   734  	case Int:
   735  		var f func(int, int) int
   736  		var def int
   737  		if f, ok = fn.(func(int, int) int); !ok {
   738  			return nil, errors.Errorf(reductionErrMsg, fn)
   739  		}
   740  		if def, ok = defaultValue.(int); !ok {
   741  			return nil, errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   742  		}
   743  		retVal = ReduceI(f, def, a.Ints()...)
   744  		return
   745  	case Int8:
   746  		var f func(int8, int8) int8
   747  		var def int8
   748  		if f, ok = fn.(func(int8, int8) int8); !ok {
   749  			return nil, errors.Errorf(reductionErrMsg, fn)
   750  		}
   751  		if def, ok = defaultValue.(int8); !ok {
   752  			return nil, errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   753  		}
   754  		retVal = ReduceI8(f, def, a.Int8s()...)
   755  		return
   756  	case Int16:
   757  		var f func(int16, int16) int16
   758  		var def int16
   759  		if f, ok = fn.(func(int16, int16) int16); !ok {
   760  			return nil, errors.Errorf(reductionErrMsg, fn)
   761  		}
   762  		if def, ok = defaultValue.(int16); !ok {
   763  			return nil, errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   764  		}
   765  		retVal = ReduceI16(f, def, a.Int16s()...)
   766  		return
   767  	case Int32:
   768  		var f func(int32, int32) int32
   769  		var def int32
   770  		if f, ok = fn.(func(int32, int32) int32); !ok {
   771  			return nil, errors.Errorf(reductionErrMsg, fn)
   772  		}
   773  		if def, ok = defaultValue.(int32); !ok {
   774  			return nil, errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   775  		}
   776  		retVal = ReduceI32(f, def, a.Int32s()...)
   777  		return
   778  	case Int64:
   779  		var f func(int64, int64) int64
   780  		var def int64
   781  		if f, ok = fn.(func(int64, int64) int64); !ok {
   782  			return nil, errors.Errorf(reductionErrMsg, fn)
   783  		}
   784  		if def, ok = defaultValue.(int64); !ok {
   785  			return nil, errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   786  		}
   787  		retVal = ReduceI64(f, def, a.Int64s()...)
   788  		return
   789  	case Uint:
   790  		var f func(uint, uint) uint
   791  		var def uint
   792  		if f, ok = fn.(func(uint, uint) uint); !ok {
   793  			return nil, errors.Errorf(reductionErrMsg, fn)
   794  		}
   795  		if def, ok = defaultValue.(uint); !ok {
   796  			return nil, errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   797  		}
   798  		retVal = ReduceU(f, def, a.Uints()...)
   799  		return
   800  	case Uint8:
   801  		var f func(uint8, uint8) uint8
   802  		var def uint8
   803  		if f, ok = fn.(func(uint8, uint8) uint8); !ok {
   804  			return nil, errors.Errorf(reductionErrMsg, fn)
   805  		}
   806  		if def, ok = defaultValue.(uint8); !ok {
   807  			return nil, errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   808  		}
   809  		retVal = ReduceU8(f, def, a.Uint8s()...)
   810  		return
   811  	case Uint16:
   812  		var f func(uint16, uint16) uint16
   813  		var def uint16
   814  		if f, ok = fn.(func(uint16, uint16) uint16); !ok {
   815  			return nil, errors.Errorf(reductionErrMsg, fn)
   816  		}
   817  		if def, ok = defaultValue.(uint16); !ok {
   818  			return nil, errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   819  		}
   820  		retVal = ReduceU16(f, def, a.Uint16s()...)
   821  		return
   822  	case Uint32:
   823  		var f func(uint32, uint32) uint32
   824  		var def uint32
   825  		if f, ok = fn.(func(uint32, uint32) uint32); !ok {
   826  			return nil, errors.Errorf(reductionErrMsg, fn)
   827  		}
   828  		if def, ok = defaultValue.(uint32); !ok {
   829  			return nil, errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   830  		}
   831  		retVal = ReduceU32(f, def, a.Uint32s()...)
   832  		return
   833  	case Uint64:
   834  		var f func(uint64, uint64) uint64
   835  		var def uint64
   836  		if f, ok = fn.(func(uint64, uint64) uint64); !ok {
   837  			return nil, errors.Errorf(reductionErrMsg, fn)
   838  		}
   839  		if def, ok = defaultValue.(uint64); !ok {
   840  			return nil, errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   841  		}
   842  		retVal = ReduceU64(f, def, a.Uint64s()...)
   843  		return
   844  	case Uintptr:
   845  		var f func(uintptr, uintptr) uintptr
   846  		var def uintptr
   847  		if f, ok = fn.(func(uintptr, uintptr) uintptr); !ok {
   848  			return nil, errors.Errorf(reductionErrMsg, fn)
   849  		}
   850  		if def, ok = defaultValue.(uintptr); !ok {
   851  			return nil, errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   852  		}
   853  		retVal = ReduceUintptr(f, def, a.Uintptrs()...)
   854  		return
   855  	case Float32:
   856  		var f func(float32, float32) float32
   857  		var def float32
   858  		if f, ok = fn.(func(float32, float32) float32); !ok {
   859  			return nil, errors.Errorf(reductionErrMsg, fn)
   860  		}
   861  		if def, ok = defaultValue.(float32); !ok {
   862  			return nil, errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   863  		}
   864  		retVal = ReduceF32(f, def, a.Float32s()...)
   865  		return
   866  	case Float64:
   867  		var f func(float64, float64) float64
   868  		var def float64
   869  		if f, ok = fn.(func(float64, float64) float64); !ok {
   870  			return nil, errors.Errorf(reductionErrMsg, fn)
   871  		}
   872  		if def, ok = defaultValue.(float64); !ok {
   873  			return nil, errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   874  		}
   875  		retVal = ReduceF64(f, def, a.Float64s()...)
   876  		return
   877  	case Complex64:
   878  		var f func(complex64, complex64) complex64
   879  		var def complex64
   880  		if f, ok = fn.(func(complex64, complex64) complex64); !ok {
   881  			return nil, errors.Errorf(reductionErrMsg, fn)
   882  		}
   883  		if def, ok = defaultValue.(complex64); !ok {
   884  			return nil, errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   885  		}
   886  		retVal = ReduceC64(f, def, a.Complex64s()...)
   887  		return
   888  	case Complex128:
   889  		var f func(complex128, complex128) complex128
   890  		var def complex128
   891  		if f, ok = fn.(func(complex128, complex128) complex128); !ok {
   892  			return nil, errors.Errorf(reductionErrMsg, fn)
   893  		}
   894  		if def, ok = defaultValue.(complex128); !ok {
   895  			return nil, errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   896  		}
   897  		retVal = ReduceC128(f, def, a.Complex128s()...)
   898  		return
   899  	case String:
   900  		var f func(string, string) string
   901  		var def string
   902  		if f, ok = fn.(func(string, string) string); !ok {
   903  			return nil, errors.Errorf(reductionErrMsg, fn)
   904  		}
   905  		if def, ok = defaultValue.(string); !ok {
   906  			return nil, errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   907  		}
   908  		retVal = ReduceStr(f, def, a.Strings()...)
   909  		return
   910  	case UnsafePointer:
   911  		var f func(unsafe.Pointer, unsafe.Pointer) unsafe.Pointer
   912  		var def unsafe.Pointer
   913  		if f, ok = fn.(func(unsafe.Pointer, unsafe.Pointer) unsafe.Pointer); !ok {
   914  			return nil, errors.Errorf(reductionErrMsg, fn)
   915  		}
   916  		if def, ok = defaultValue.(unsafe.Pointer); !ok {
   917  			return nil, errors.Errorf(defaultValueErrMsg, def, defaultValue, defaultValue)
   918  		}
   919  		retVal = ReduceUnsafePointer(f, def, a.UnsafePointers()...)
   920  		return
   921  	default:
   922  		return nil, errors.Errorf("Unsupported type %v for Reduce", t)
   923  	}
   924  }