From 00d636ad1d19bf7aed1e7cac7de663cfebd08de1 Mon Sep 17 00:00:00 2001 From: Tim Henderson Date: Thu, 1 Sep 2016 13:35:48 -0400 Subject: [PATCH] Added float types Signed-off-by: Tim Henderson --- types/float.go | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 types/float.go diff --git a/types/float.go b/types/float.go new file mode 100644 index 0000000..aeeee2a --- /dev/null +++ b/types/float.go @@ -0,0 +1,78 @@ +package types + +import ( + "fmt" + "hash/fnv" + "reflect" + "unsafe" +) + +type Float64 float64 +type Float32 float32 + +func (self Float32) Equals(other Equatable) bool { + if o, ok := other.(Float32); ok { + return self == o + } else { + return false + } +} + +func (self Float32) Less(other Sortable) bool { + if o, ok := other.(Float32); ok { + return self < o + } else { + return false + } +} + +func (self Float32) Hash() int { + f := float32(self) + s := &reflect.SliceHeader{ + Data: uintptr(unsafe.Pointer(&f)), + Len: 4, + Cap: 4, + } + b := (*[]byte)(unsafe.Pointer(s)) + h := fnv.New64a() + _, err := h.Write(*b) + if err != nil { + // should never happen... + panic(fmt.Errorf("could not write to hash %v", err)) + } + return int(h.Sum64()) +} + +func (self Float64) Equals(other Equatable) bool { + if o, ok := other.(Float64); ok { + return self == o + } else { + return false + } +} + +func (self Float64) Less(other Sortable) bool { + if o, ok := other.(Float64); ok { + return self < o + } else { + return false + } +} + +func (self Float64) Hash() int { + f := float64(self) + s := &reflect.SliceHeader{ + Data: uintptr(unsafe.Pointer(&f)), + Len: 8, + Cap: 8, + } + b := (*[]byte)(unsafe.Pointer(s)) + h := fnv.New64a() + _, err := h.Write(*b) + if err != nil { + // should never happen... + panic(fmt.Errorf("could not write to hash %v", err)) + } + return int(h.Sum64()) +} +