diff options
| author | 2026-04-02 07:09:21 +0000 | |
|---|---|---|
| committer | 2026-04-02 07:09:21 +0000 | |
| commit | 315b3fc5ac42a20ed93fefa3ac858cc2c6c57fc5 (patch) | |
| tree | 97ea96c3cab88bf2f9b81e6c4838b98e489bae1c /internal/intconv | |
| parent | go.mod: Init (diff) | |
| signature | No signature | |
internal/intconv: Add
Diffstat (limited to 'internal/intconv')
| -rw-r--r-- | internal/intconv/doc.go | 2 | ||||
| -rw-r--r-- | internal/intconv/errors.go | 12 | ||||
| -rw-r--r-- | internal/intconv/i64_i32.go | 14 | ||||
| -rw-r--r-- | internal/intconv/i64_u64.go | 10 | ||||
| -rw-r--r-- | internal/intconv/i_u32.go | 14 | ||||
| -rw-r--r-- | internal/intconv/i_u64.go | 10 | ||||
| -rw-r--r-- | internal/intconv/se_u8_u32.go | 10 | ||||
| -rw-r--r-- | internal/intconv/u32_i.go | 14 | ||||
| -rw-r--r-- | internal/intconv/u32_u8.go | 14 | ||||
| -rw-r--r-- | internal/intconv/u64_i.go | 14 | ||||
| -rw-r--r-- | internal/intconv/u64_i64.go | 14 | ||||
| -rw-r--r-- | internal/intconv/uptr_int.go | 14 |
12 files changed, 142 insertions, 0 deletions
diff --git a/internal/intconv/doc.go b/internal/intconv/doc.go new file mode 100644 index 00000000..fc1f7428 --- /dev/null +++ b/internal/intconv/doc.go @@ -0,0 +1,2 @@ +// Package intconv provides checked integer conversion helpers. +package intconv diff --git a/internal/intconv/errors.go b/internal/intconv/errors.go new file mode 100644 index 00000000..fff2b1bc --- /dev/null +++ b/internal/intconv/errors.go @@ -0,0 +1,12 @@ +package intconv + +import "errors" + +// ErrOverflow indicates that +// a requested checked integer conversion +// is impossible due to +// integer overflow, +// integer underflow, +// unexpected negative integers, +// or a similar situation. +var ErrOverflow = errors.New("intconv: overflow") diff --git a/internal/intconv/i64_i32.go b/internal/intconv/i64_i32.go new file mode 100644 index 00000000..bcee9205 --- /dev/null +++ b/internal/intconv/i64_i32.go @@ -0,0 +1,14 @@ +package intconv + +import ( + "math" +) + +// Int64ToInt32 converts v to int32, returning an error if it overflows. +func Int64ToInt32(v int64) (int32, error) { + if v < math.MinInt32 || v > math.MaxInt32 { + return 0, ErrOverflow + } + + return int32(v), nil +} diff --git a/internal/intconv/i64_u64.go b/internal/intconv/i64_u64.go new file mode 100644 index 00000000..c04da3cd --- /dev/null +++ b/internal/intconv/i64_u64.go @@ -0,0 +1,10 @@ +package intconv + +// Int64ToUint64 converts v to uint64, returning an error if v is negative. +func Int64ToUint64(v int64) (uint64, error) { + if v < 0 { + return 0, ErrOverflow + } + + return uint64(v), nil +} diff --git a/internal/intconv/i_u32.go b/internal/intconv/i_u32.go new file mode 100644 index 00000000..b3c602ef --- /dev/null +++ b/internal/intconv/i_u32.go @@ -0,0 +1,14 @@ +package intconv + +import ( + "math" +) + +// IntToUint32 converts v to uint32, returning an error if it overflows. +func IntToUint32(v int) (uint32, error) { + if v < 0 || v > math.MaxUint32 { + return 0, ErrOverflow + } + + return uint32(v), nil +} diff --git a/internal/intconv/i_u64.go b/internal/intconv/i_u64.go new file mode 100644 index 00000000..cf57b677 --- /dev/null +++ b/internal/intconv/i_u64.go @@ -0,0 +1,10 @@ +package intconv + +// IntToUint64 converts v to uint64, returning an error if v is negative. +func IntToUint64(v int) (uint64, error) { + if v < 0 { + return 0, ErrOverflow + } + + return uint64(v), nil +} diff --git a/internal/intconv/se_u8_u32.go b/internal/intconv/se_u8_u32.go new file mode 100644 index 00000000..bef34268 --- /dev/null +++ b/internal/intconv/se_u8_u32.go @@ -0,0 +1,10 @@ +package intconv + +// SignExtendByteToUint32 sign-extends b as a signed 8-bit integer into uint32. +func SignExtendByteToUint32(b byte) uint32 { + if b&0x80 == 0 { + return uint32(b) + } + + return 0xFFFFFF00 | uint32(b) +} diff --git a/internal/intconv/u32_i.go b/internal/intconv/u32_i.go new file mode 100644 index 00000000..24147c8b --- /dev/null +++ b/internal/intconv/u32_i.go @@ -0,0 +1,14 @@ +package intconv + +import ( + "math" +) + +// Uint32ToInt converts v to int, returning an error if it overflows. +func Uint32ToInt(v uint32) (int, error) { + if uint64(v) > uint64(math.MaxInt) { + return 0, ErrOverflow + } + + return int(v), nil +} diff --git a/internal/intconv/u32_u8.go b/internal/intconv/u32_u8.go new file mode 100644 index 00000000..40744051 --- /dev/null +++ b/internal/intconv/u32_u8.go @@ -0,0 +1,14 @@ +package intconv + +import ( + "math" +) + +// Uint32ToUint8 converts v to uint8, returning an error if it overflows. +func Uint32ToUint8(v uint32) (uint8, error) { + if v > math.MaxUint8 { + return 0, ErrOverflow + } + + return uint8(v), nil +} diff --git a/internal/intconv/u64_i.go b/internal/intconv/u64_i.go new file mode 100644 index 00000000..1e9acacd --- /dev/null +++ b/internal/intconv/u64_i.go @@ -0,0 +1,14 @@ +package intconv + +import ( + "math" +) + +// Uint64ToInt converts v to int, returning an error if it overflows. +func Uint64ToInt(v uint64) (int, error) { + if v > uint64(math.MaxInt) { + return 0, ErrOverflow + } + + return int(v), nil +} diff --git a/internal/intconv/u64_i64.go b/internal/intconv/u64_i64.go new file mode 100644 index 00000000..2285142c --- /dev/null +++ b/internal/intconv/u64_i64.go @@ -0,0 +1,14 @@ +package intconv + +import ( + "math" +) + +// Uint64ToInt64 converts v to int64, returning an error if it overflows. +func Uint64ToInt64(v uint64) (int64, error) { + if v > math.MaxInt64 { + return 0, ErrOverflow + } + + return int64(v), nil +} diff --git a/internal/intconv/uptr_int.go b/internal/intconv/uptr_int.go new file mode 100644 index 00000000..1ca4c674 --- /dev/null +++ b/internal/intconv/uptr_int.go @@ -0,0 +1,14 @@ +package intconv + +import ( + "math" +) + +// UintptrToInt converts v to int, returning an error if it overflows. +func UintptrToInt(v uintptr) (int, error) { + if v > uintptr(math.MaxInt) { + return 0, ErrOverflow + } + + return int(v), nil +} |
