You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
paopao-ce/pkg/types/bitmap_roaring.go

158 lines
3.4 KiB

// Copyright 2023 ROC. All rights reserved.
// Use of this source code is governed by a MIT style
// license that can be found in the LICENSE file.
package types
import (
"github.com/RoaringBitmap/roaring"
"github.com/RoaringBitmap/roaring/roaring64"
"github.com/alimy/tryst/types"
)
type roaringBitmap struct {
Map *roaring.Bitmap
}
type roaring64Bitmap struct {
Map *roaring64.Bitmap
}
func (m *roaringBitmap) MarshalBinary() ([]byte, error) {
if m == nil {
return []byte{}, nil
}
return m.Map.MarshalBinary()
}
func (m *roaringBitmap) UnmarshalBinary(data []byte) (res *roaringBitmap, err error) {
res = &roaringBitmap{
Map: roaring.New(),
}
err = res.Map.UnmarshalBinary(data)
return
}
func (m *roaring64Bitmap) MarshalBinary() ([]byte, error) {
if m == nil {
return []byte{}, nil
}
return m.Map.MarshalBinary()
}
func (m *roaring64Bitmap) UnmarshalBinary(data []byte) (res *roaring64Bitmap, err error) {
res = &roaring64Bitmap{
Map: roaring64.New(),
}
err = res.Map.UnmarshalBinary(data)
return
}
// Bitmap alias type of types.Binary[*roaringBitmap]
type Bitmap = types.Binary[*roaringBitmap]
// NullBitmap alias type of types.NullBinary[*roaringBitmap]
type NullBitmap = types.NullBinary[*roaringBitmap]
// Bitmap64 alias type of types.Binary[*roaring64Bitmap]
type Bitmap64 = types.Binary[*roaring64Bitmap]
// NullBitmap64 alias type of types.NullBinary[*roaring64Bitmap]
type NullBitmap64 = types.NullBinary[*roaring64Bitmap]
// NewBitmap create a Bitmap instance
func NewBitmap() (res *Bitmap) {
return &types.Binary[*roaringBitmap]{
Data: &roaringBitmap{
Map: roaring.New(),
},
}
}
// NewNullBitmap create a NullBitmap instance
func NewNullBitmap() *NullBitmap {
return &types.NullBinary[*roaringBitmap]{
Data: &roaringBitmap{
Map: roaring.New(),
},
}
}
// NewBitmap64 create a Bitmap64 instance
func NewBitmap64() *Bitmap64 {
return &types.Binary[*roaring64Bitmap]{
Data: &roaring64Bitmap{
Map: roaring64.New(),
},
}
}
// NewNullBitmap64 create a NullBitmap64 instance
func NewNullBitmap64() *NullBitmap64 {
return &types.NullBinary[*roaring64Bitmap]{
Data: &roaring64Bitmap{
Map: roaring64.New(),
},
}
}
// MustBitmap create a Bitmap instance
func MustBitmap(data ...[]byte) (res *Bitmap) {
res = &types.Binary[*roaringBitmap]{
Data: &roaringBitmap{
Map: roaring.New(),
},
}
if len(data) > 0 && len(data[0]) > 0 {
if err := res.Data.Map.UnmarshalBinary(data[0]); err != nil {
panic(err)
}
}
return
}
// MustNullBitmap create a NullBitmap instance
func MustNullBitmap(data ...[]byte) (res *NullBitmap) {
res = &types.NullBinary[*roaringBitmap]{
Data: &roaringBitmap{
Map: roaring.New(),
},
}
if len(data) > 0 && len(data[0]) > 0 {
if err := res.Data.Map.UnmarshalBinary(data[0]); err != nil {
panic(err)
}
}
return
}
// MustBitmap64 create a Bitmap64 instance
func MustBitmap64(data ...[]byte) (res *Bitmap64) {
res = &types.Binary[*roaring64Bitmap]{
Data: &roaring64Bitmap{
Map: roaring64.New(),
},
}
if len(data) > 0 && len(data[0]) > 0 {
if err := res.Data.Map.UnmarshalBinary(data[0]); err != nil {
panic(err)
}
}
return
}
// MustNullBitmap64 create a NullBitmap64 instance
func MustNullBitmap64(data ...[]byte) (res *NullBitmap64) {
res = &types.NullBinary[*roaring64Bitmap]{
Data: &roaring64Bitmap{
Map: roaring64.New(),
},
}
if len(data) > 0 && len(data[0]) > 0 {
if err := res.Data.Map.UnmarshalBinary(data[0]); err != nil {
panic(err)
}
}
return
}