mirror of
https://github.com/duanhf2012/origin.git
synced 2026-02-03 22:45:13 +08:00
1.新增yml文件支持
2.优化网络模块日志 3.新增类型转换函数
This commit is contained in:
@@ -2,10 +2,10 @@ package smath
|
||||
|
||||
import (
|
||||
"github.com/duanhf2012/origin/v2/log"
|
||||
"github.com/duanhf2012/origin/v2/util/typedef"
|
||||
"github.com/duanhf2012/origin/v2/util/typ"
|
||||
)
|
||||
|
||||
func Max[NumType typedef.Number](number1 NumType, number2 NumType) NumType {
|
||||
func Max[NumType typ.Number](number1 NumType, number2 NumType) NumType {
|
||||
if number1 > number2 {
|
||||
return number1
|
||||
}
|
||||
@@ -13,7 +13,7 @@ func Max[NumType typedef.Number](number1 NumType, number2 NumType) NumType {
|
||||
return number2
|
||||
}
|
||||
|
||||
func Min[NumType typedef.Number](number1 NumType, number2 NumType) NumType {
|
||||
func Min[NumType typ.Number](number1 NumType, number2 NumType) NumType {
|
||||
if number1 < number2 {
|
||||
return number1
|
||||
}
|
||||
@@ -21,7 +21,7 @@ func Min[NumType typedef.Number](number1 NumType, number2 NumType) NumType {
|
||||
return number2
|
||||
}
|
||||
|
||||
func Abs[NumType typedef.Signed|typedef.Float](Num NumType) NumType {
|
||||
func Abs[NumType typ.Signed | typ.Float](Num NumType) NumType {
|
||||
if Num < 0 {
|
||||
return -1 * Num
|
||||
}
|
||||
@@ -29,7 +29,7 @@ func Abs[NumType typedef.Signed|typedef.Float](Num NumType) NumType {
|
||||
return Num
|
||||
}
|
||||
|
||||
func AddSafe[NumType typedef.Number](number1 NumType, number2 NumType) (NumType, bool) {
|
||||
func AddSafe[NumType typ.Number](number1 NumType, number2 NumType) (NumType, bool) {
|
||||
ret := number1 + number2
|
||||
if number2 > 0 && ret < number1 {
|
||||
log.Stack("Calculation overflow", log.Any("number1", number1), log.Any("number2", number2))
|
||||
@@ -42,7 +42,7 @@ func AddSafe[NumType typedef.Number](number1 NumType, number2 NumType) (NumType,
|
||||
return ret, true
|
||||
}
|
||||
|
||||
func SubSafe[NumType typedef.Number](number1 NumType, number2 NumType) (NumType, bool) {
|
||||
func SubSafe[NumType typ.Number](number1 NumType, number2 NumType) (NumType, bool) {
|
||||
ret := number1 - number2
|
||||
if number2 > 0 && ret > number1 {
|
||||
log.Stack("Calculation overflow", log.Any("number1", number1), log.Any("number2", number2))
|
||||
@@ -55,7 +55,7 @@ func SubSafe[NumType typedef.Number](number1 NumType, number2 NumType) (NumType,
|
||||
return ret, true
|
||||
}
|
||||
|
||||
func MulSafe[NumType typedef.Number](number1 NumType, number2 NumType) (NumType, bool) {
|
||||
func MulSafe[NumType typ.Number](number1 NumType, number2 NumType) (NumType, bool) {
|
||||
ret := number1 * number2
|
||||
if number1 == 0 || number2 == 0 {
|
||||
return ret, true
|
||||
@@ -69,18 +69,17 @@ func MulSafe[NumType typedef.Number](number1 NumType, number2 NumType) (NumType,
|
||||
return ret, true
|
||||
}
|
||||
|
||||
func Add[NumType typedef.Number](number1 NumType, number2 NumType) NumType {
|
||||
func Add[NumType typ.Number](number1 NumType, number2 NumType) NumType {
|
||||
ret, _ := AddSafe(number1, number2)
|
||||
return ret
|
||||
}
|
||||
|
||||
func Sub[NumType typedef.Number](number1 NumType, number2 NumType) NumType {
|
||||
func Sub[NumType typ.Number](number1 NumType, number2 NumType) NumType {
|
||||
ret, _ := SubSafe(number1, number2)
|
||||
return ret
|
||||
}
|
||||
|
||||
func Mul[NumType typedef.Number](number1 NumType, number2 NumType) NumType {
|
||||
func Mul[NumType typ.Number](number1 NumType, number2 NumType) NumType {
|
||||
ret, _ := MulSafe(number1, number2)
|
||||
return ret
|
||||
}
|
||||
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
package srand
|
||||
|
||||
import (
|
||||
"github.com/duanhf2012/origin/v2/util/typedef"
|
||||
"github.com/duanhf2012/origin/v2/util/typ"
|
||||
"math/rand"
|
||||
"slices"
|
||||
)
|
||||
|
||||
func Sum[E ~[]T, T typedef.Number](arr E) T {
|
||||
func Sum[E ~[]T, T typ.Number](arr E) T {
|
||||
var sum T
|
||||
for i := range arr {
|
||||
sum += arr[i]
|
||||
@@ -14,7 +14,7 @@ func Sum[E ~[]T, T typedef.Number](arr E) T {
|
||||
return sum
|
||||
}
|
||||
|
||||
func SumFunc[E ~[]V, V any, T typedef.Number](arr E, getValue func(i int) T) T {
|
||||
func SumFunc[E ~[]V, V any, T typ.Number](arr E, getValue func(i int) T) T {
|
||||
var sum T
|
||||
for i := range arr {
|
||||
sum += getValue(i)
|
||||
@@ -45,11 +45,11 @@ func RandN[E ~[]T, T any](arr E, num int) []T {
|
||||
for i := range index {
|
||||
ret = append(ret, arr[index[i]])
|
||||
}
|
||||
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
func RandWeight[E ~[]T, T typedef.Integer](weights E) int {
|
||||
func RandWeight[E ~[]T, T typ.Integer](weights E) int {
|
||||
totalWeight := Sum(weights)
|
||||
if totalWeight <= 0 {
|
||||
return -1
|
||||
@@ -65,7 +65,7 @@ func RandWeight[E ~[]T, T typedef.Integer](weights E) int {
|
||||
return -1
|
||||
}
|
||||
|
||||
func RandWeightFunc[E ~[]U, U any, T typedef.Integer](arr E, getWeight func(i int) T) int {
|
||||
func RandWeightFunc[E ~[]U, U any, T typ.Integer](arr E, getWeight func(i int) T) int {
|
||||
weights := make([]T, 0, len(arr))
|
||||
for i := range arr {
|
||||
weights = append(weights, getWeight(i))
|
||||
@@ -73,7 +73,7 @@ func RandWeightFunc[E ~[]U, U any, T typedef.Integer](arr E, getWeight func(i in
|
||||
return RandWeight(weights)
|
||||
}
|
||||
|
||||
func Get[E ~[]T, T any, U typedef.Integer](arr E, index U) (ret T, ok bool) {
|
||||
func Get[E ~[]T, T any, U typ.Integer](arr E, index U) (ret T, ok bool) {
|
||||
if index < 0 || int(index) >= len(arr) {
|
||||
return
|
||||
}
|
||||
@@ -82,7 +82,7 @@ func Get[E ~[]T, T any, U typedef.Integer](arr E, index U) (ret T, ok bool) {
|
||||
return
|
||||
}
|
||||
|
||||
func GetPointer[E ~[]T, T any, U typedef.Integer](arr E, index U) *T {
|
||||
func GetPointer[E ~[]T, T any, U typ.Integer](arr E, index U) *T {
|
||||
if index < 0 || int(index) >= len(arr) {
|
||||
return nil
|
||||
}
|
||||
|
||||
54
util/typ/type.go
Normal file
54
util/typ/type.go
Normal file
@@ -0,0 +1,54 @@
|
||||
package typ
|
||||
|
||||
import "errors"
|
||||
|
||||
type Signed interface {
|
||||
~int | ~int8 | ~int16 | ~int32 | ~int64
|
||||
}
|
||||
|
||||
type Unsigned interface {
|
||||
~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64
|
||||
}
|
||||
|
||||
type Float interface {
|
||||
~float32 | ~float64
|
||||
}
|
||||
|
||||
type Integer interface {
|
||||
Signed | Unsigned
|
||||
}
|
||||
|
||||
type Number interface {
|
||||
Signed | Unsigned | Float
|
||||
}
|
||||
|
||||
type Ordered interface {
|
||||
Number | Float | ~string
|
||||
}
|
||||
|
||||
func ConvertToNumber[DType Number](val interface{}) (DType, error) {
|
||||
switch val.(type) {
|
||||
case int64:
|
||||
return DType(val.(int64)), nil
|
||||
case int:
|
||||
return DType(val.(int)), nil
|
||||
case uint:
|
||||
return DType(val.(uint)), nil
|
||||
case uint64:
|
||||
return DType(val.(uint64)), nil
|
||||
case float32:
|
||||
return DType(val.(float32)), nil
|
||||
case float64:
|
||||
return DType(val.(float64)), nil
|
||||
case int32:
|
||||
return DType(val.(int32)), nil
|
||||
case uint32:
|
||||
return DType(val.(uint32)), nil
|
||||
case int16:
|
||||
return DType(val.(int16)), nil
|
||||
case uint16:
|
||||
return DType(val.(uint16)), nil
|
||||
}
|
||||
|
||||
return 0, errors.New("unsupported type")
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
package typedef
|
||||
|
||||
type Signed interface {
|
||||
~int | ~int8 | ~int16 | ~int32 | ~int64
|
||||
}
|
||||
|
||||
type Unsigned interface {
|
||||
~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64
|
||||
}
|
||||
|
||||
type Float interface {
|
||||
~float32 | ~float64
|
||||
}
|
||||
|
||||
type Integer interface {
|
||||
Signed|Unsigned
|
||||
}
|
||||
|
||||
type Number interface {
|
||||
Signed|Unsigned|Float
|
||||
}
|
||||
|
||||
type Ordered interface {
|
||||
Number|Float|~string
|
||||
}
|
||||
Reference in New Issue
Block a user