vermeer/apps/serialize/slice.go (657 lines of code) (raw):
/*
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with this
work for additional information regarding copyright ownership. The ASF
licenses this file to You under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations
under the License.
*/
package serialize
import (
"encoding/binary"
"encoding/json"
"fmt"
)
// Deserialization of slice
type SliceInt32 []SInt32
type SliceInt64 []SInt64
type SliceFloat32 []SFloat32
type SliceUint32 []SUint32
type TwoDimSliceUint32 []SliceUint32
func (su *SliceUint32) Marshal(buffer []byte) (int, error) {
offset := 0
binary.BigEndian.PutUint32(buffer, uint32(len(*su)))
offset += 4
for _, v := range *su {
n, err := v.Marshal(buffer[offset:])
if err != nil {
return 0, err
}
offset += n
}
return offset, nil
}
func (su *SliceUint32) Unmarshal(buffer []byte) (int, error) {
offset := 0
length := binary.BigEndian.Uint32(buffer)
offset += 4
*su = make([]SUint32, length)
for i := uint32(0); i < length; i++ {
n, err := (*su)[i].Unmarshal(buffer[offset:])
if err != nil {
return 0, err
}
offset += n
}
return offset, nil
}
func (su *SliceUint32) ToString() string {
return fmt.Sprintf("%v", *su)
}
func (su *SliceUint32) PredictSize() int {
return 4 + 4*len(*su)
}
func (su *SliceUint32) Partition(limit int) []SlicePartition {
p := make([]SlicePartition, 0)
length := len(*su)
index := 0
size := 4
for i, v := range *su {
size += v.PredictSize()
if size >= limit {
var one SlicePartition
one.Start = index
one.Size = size
one.End = i + 1
p = append(p, one)
index = i + 1
size = 4
}
if i == length-1 && index < length {
var lastOne SlicePartition
lastOne.Size = size
lastOne.Start = index
lastOne.End = length
p = append(p, lastOne)
}
}
return p
}
func (tsu *TwoDimSliceUint32) Marshal(buffer []byte) (int, error) {
offset := 0
binary.BigEndian.PutUint32(buffer, uint32(len(*tsu)))
offset += 4
for _, v := range *tsu {
n, err := v.Marshal(buffer[offset:])
if err != nil {
return 0, err
}
offset += n
}
return offset, nil
}
func (tsu *TwoDimSliceUint32) Unmarshal(buffer []byte) (int, error) {
offset := 0
length := binary.BigEndian.Uint32(buffer)
offset += 4
*tsu = make([]SliceUint32, length)
for i := range *tsu {
var v SliceUint32
n, err := v.Unmarshal(buffer[offset:])
if err != nil {
return 0, err
}
(*tsu)[i] = v
offset += n
}
return offset, nil
}
func (tsu *TwoDimSliceUint32) ToString() string {
return fmt.Sprintf("%v", *tsu)
}
func (tsu *TwoDimSliceUint32) PredictSize() int {
size := 4
for i := range *tsu {
size += 4 + 4*len((*tsu)[i])
}
return size
}
func (tsu *TwoDimSliceUint32) Partition(limit int) []SlicePartition {
p := make([]SlicePartition, 0)
length := len(*tsu)
index := 0
size := 4
for i, v := range *tsu {
size += v.PredictSize()
if size >= limit {
var one SlicePartition
one.Start = index
one.Size = size
one.End = i + 1
p = append(p, one)
index = i + 1
size = 4
}
if i == length-1 && index < length {
var lastOne SlicePartition
lastOne.Size = size
lastOne.Start = index
lastOne.End = length
p = append(p, lastOne)
}
}
return p
}
func (tsu *TwoDimSliceUint32) MarshalJSON() ([]byte, error) {
value := []byte("value")
return json.Marshal(string(value))
}
func (tsu *TwoDimSliceUint32) UnmarshalJSON(buffer []byte) error {
v := ""
return json.Unmarshal(buffer, &v)
}
func (si *SliceInt32) Marshal(buffer []byte) (int, error) {
offset := 0
binary.BigEndian.PutUint32(buffer, uint32(len(*si)))
offset += 4
for _, v := range *si {
n, err := v.Marshal(buffer[offset:])
if err != nil {
return 0, err
}
offset += n
}
return offset, nil
}
func (si *SliceInt32) Unmarshal(buffer []byte) (int, error) {
offset := 0
length := binary.BigEndian.Uint32(buffer)
offset += 4
*si = make([]SInt32, length)
for i := uint32(0); i < length; i++ {
n, err := (*si)[i].Unmarshal(buffer[offset:])
if err != nil {
return 0, err
}
offset += n
}
return offset, nil
}
func (si *SliceInt32) ToString() string {
return ""
}
func (si *SliceInt32) PredictSize() int {
return 4 + 4*len(*si)
}
func (si *SliceInt32) Partition(limit int) []SlicePartition {
p := make([]SlicePartition, 0)
length := len(*si)
index := 0
size := 4
for i, v := range *si {
size += v.PredictSize()
if size >= limit {
var one SlicePartition
one.Start = index
one.Size = size
one.End = i + 1
p = append(p, one)
index = i + 1
size = 4
}
if i == length-1 && index < length {
var lastOne SlicePartition
lastOne.Size = size
lastOne.Start = index
lastOne.End = length
p = append(p, lastOne)
}
}
return p
}
type TwoDimSliceInt32 [][]SInt32
func (tsi *TwoDimSliceInt32) Marshal(buffer []byte) (int, error) {
offset := 0
binary.BigEndian.PutUint32(buffer, uint32(len(*tsi)))
offset += 4
for _, v := range *tsi {
vv := SliceInt32(v)
n, err := vv.Marshal(buffer[offset:])
if err != nil {
return 0, err
}
offset += n
}
return offset, nil
}
func (tsi *TwoDimSliceInt32) Unmarshal(buffer []byte) (int, error) {
offset := 0
length := binary.BigEndian.Uint32(buffer)
offset += 4
*tsi = make([][]SInt32, length)
for i := range *tsi {
var v SliceInt32
n, err := v.Unmarshal(buffer[offset:])
if err != nil {
return 0, err
}
(*tsi)[i] = v
offset += n
}
return offset, nil
}
func (tsi *TwoDimSliceInt32) ToString() string {
return ""
}
func (tsi *TwoDimSliceInt32) PredictSize() int {
size := 4
for i := range *tsi {
size += 4 + 4*len((*tsi)[i])
}
return size
}
func (tsi *TwoDimSliceInt32) Partition(limit int) []SlicePartition {
p := make([]SlicePartition, 0)
length := len(*tsi)
index := 0
size := 4
for i, v := range *tsi {
vv := SliceInt32(v)
size += vv.PredictSize()
if size >= limit {
var one SlicePartition
one.Start = index
one.Size = size
one.End = i + 1
p = append(p, one)
index = i + 1
size = 4
}
if i == length-1 && index < length {
var lastOne SlicePartition
lastOne.Size = size
lastOne.Start = index
lastOne.End = length
p = append(p, lastOne)
}
}
return p
}
func (sf *SliceFloat32) Marshal(buffer []byte) (int, error) {
offset := 0
binary.BigEndian.PutUint32(buffer, uint32(len(*sf)))
offset += 4
for _, v := range *sf {
n, err := v.Marshal(buffer[offset:])
if err != nil {
return 0, err
}
offset += n
}
return offset, nil
}
func (sf *SliceFloat32) Unmarshal(buffer []byte) (int, error) {
offset := 0
length := binary.BigEndian.Uint32(buffer)
offset += 4
*sf = make([]SFloat32, length)
for i := uint32(0); i < length; i++ {
n, err := (*sf)[i].Unmarshal(buffer[offset:])
if err != nil {
return 0, err
}
offset += n
}
return offset, nil
}
func (sf *SliceFloat32) ToString() string {
return ""
}
func (sf *SliceFloat32) PredictSize() int {
return 4 + 4*len(*sf)
}
func (sf *SliceFloat32) Partition(limit int) []SlicePartition {
p := make([]SlicePartition, 0)
length := len(*sf)
index := 0
size := 4
for i, v := range *sf {
size += v.PredictSize()
if size >= limit {
var one SlicePartition
one.Start = index
one.Size = size
one.End = i + 1
p = append(p, one)
index = i + 1
size = 4
}
if i == length-1 && index < length {
var lastOne SlicePartition
lastOne.Size = size
lastOne.Start = index
lastOne.End = length
p = append(p, lastOne)
}
}
return p
}
type TwoDimSliceFloat32 [][]SFloat32
func (tsf *TwoDimSliceFloat32) Marshal(buffer []byte) (int, error) {
offset := 0
binary.BigEndian.PutUint32(buffer, uint32(len(*tsf)))
offset += 4
for _, v := range *tsf {
vv := SliceFloat32(v)
n, err := vv.Marshal(buffer[offset:])
if err != nil {
return 0, err
}
offset += n
}
return offset, nil
}
func (tsf *TwoDimSliceFloat32) Unmarshal(buffer []byte) (int, error) {
offset := 0
length := binary.BigEndian.Uint32(buffer)
offset += 4
*tsf = make([][]SFloat32, length)
for i := range *tsf {
var v SliceFloat32
n, err := v.Unmarshal(buffer[offset:])
if err != nil {
return 0, err
}
(*tsf)[i] = v
offset += n
}
return offset, nil
}
func (tsf *TwoDimSliceFloat32) ToString() string {
return ""
}
func (tsf *TwoDimSliceFloat32) PredictSize() int {
size := 4
for i := range *tsf {
size += 4 + 4*len((*tsf)[i])
}
return size
}
func (tsf *TwoDimSliceFloat32) Partition(limit int) []SlicePartition {
p := make([]SlicePartition, 0)
length := len(*tsf)
index := 0
size := 4
for i, v := range *tsf {
vv := SliceFloat32(v)
size += vv.PredictSize()
if size >= limit {
var one SlicePartition
one.Start = index
one.Size = size
one.End = i + 1
p = append(p, one)
index = i + 1
size = 4
}
if i == length-1 && index < length {
var lastOne SlicePartition
lastOne.Size = size
lastOne.Start = index
lastOne.End = length
p = append(p, lastOne)
}
}
return p
}
type SliceString []SString
func (ss *SliceString) Marshal(buffer []byte) (int, error) {
offset := 0
binary.BigEndian.PutUint32(buffer, uint32(len(*ss)))
offset += 4
for _, v := range *ss {
n, err := v.Marshal(buffer[offset:])
if err != nil {
return 0, err
}
offset += n
}
return offset, nil
}
func (ss *SliceString) Unmarshal(buffer []byte) (int, error) {
offset := 0
length := binary.BigEndian.Uint32(buffer)
offset += 4
*ss = make([]SString, length)
for i := uint32(0); i < length; i++ {
n, err := (*ss)[i].Unmarshal(buffer[offset:])
if err != nil {
return 0, err
}
offset += n
}
return offset, nil
}
func (ss *SliceString) ToString() string {
return ""
}
func (ss *SliceString) PredictSize() int {
size := 4
for _, v := range *ss {
size += v.PredictSize()
}
return size
}
func (ss *SliceString) Partition(limit int) []SlicePartition {
p := make([]SlicePartition, 0)
length := len(*ss)
index := 0
size := 4
for i, v := range *ss {
size += v.PredictSize()
if size >= limit {
var one SlicePartition
one.Start = index
one.Size = size
one.End = i + 1
p = append(p, one)
index = i + 1
size = 4
}
if i == length-1 && index < length {
var lastOne SlicePartition
lastOne.Size = size
lastOne.Start = index
lastOne.End = length
p = append(p, lastOne)
}
}
return p
}
type TwoDimSliceString [][]SString
func (tss *TwoDimSliceString) Marshal(buffer []byte) (int, error) {
offset := 0
binary.BigEndian.PutUint32(buffer, uint32(len(*tss)))
offset += 4
for _, v := range *tss {
vv := SliceString(v)
n, err := vv.Marshal(buffer[offset:])
if err != nil {
return 0, err
}
offset += n
}
return offset, nil
}
func (tss *TwoDimSliceString) Unmarshal(buffer []byte) (int, error) {
offset := 0
length := binary.BigEndian.Uint32(buffer)
offset += 4
*tss = make([][]SString, length)
for i := range *tss {
var v SliceString
n, err := v.Unmarshal(buffer[offset:])
if err != nil {
return 0, err
}
(*tss)[i] = v
offset += n
}
return offset, nil
}
func (tss *TwoDimSliceString) ToString() string {
return fmt.Sprintf("%v", *tss)
}
func (tss *TwoDimSliceString) PredictSize() int {
size := 4
for _, v := range *tss {
vv := SliceString(v)
size += vv.PredictSize()
}
return size
}
func (tss *TwoDimSliceString) Partition(limit int) []SlicePartition {
p := make([]SlicePartition, 0)
length := len(*tss)
index := 0
size := 4
for i, v := range *tss {
vv := SliceString(v)
size += vv.PredictSize()
if size >= limit {
var one SlicePartition
one.Start = index
one.Size = size
one.End = i + 1
p = append(p, one)
index = i + 1
size = 4
}
if i == length-1 && index < length {
var lastOne SlicePartition
lastOne.Size = size
lastOne.Start = index
lastOne.End = length
p = append(p, lastOne)
}
}
return p
}
func (si *SliceInt64) Marshal(buffer []byte) (int, error) {
offset := 0
binary.BigEndian.PutUint32(buffer, uint32(len(*si)))
offset += 4
for _, v := range *si {
n, err := v.Marshal(buffer[offset:])
if err != nil {
return 0, err
}
offset += n
}
return offset, nil
}
func (si *SliceInt64) Unmarshal(buffer []byte) (int, error) {
offset := 0
length := binary.BigEndian.Uint32(buffer)
offset += 4
*si = make([]SInt64, length)
for i := uint32(0); i < length; i++ {
n, err := (*si)[i].Unmarshal(buffer[offset:])
if err != nil {
return 0, err
}
offset += n
}
return offset, nil
}
func (si *SliceInt64) ToString() string {
return ""
}
func (si *SliceInt64) PredictSize() int {
return 4 + 8*len(*si)
}
type SlicePartition struct {
Start int
End int
Size int
}
type PartsMeta struct {
FilePrefix string `json:"file_prefix,omitempty"`
PartNum int `json:"part_num,omitempty"`
ValueType uint16 `json:"value_type,omitempty"`
}
type KVpair struct {
K string
V uint32
}
type SliceKVpair []KVpair
func (sp *SliceKVpair) ToString() string {
return ""
}
func (sp *SliceKVpair) Marshal(buffer []byte) (int, error) {
offset := 0
binary.BigEndian.PutUint32(buffer[offset:], uint32(len(*sp)))
offset += 4
for _, pair := range *sp {
k := SString(pair.K)
v := SUint32(pair.V)
n, err := k.Marshal(buffer[offset:])
if err != nil {
return 0, err
}
offset += n
n, err = v.Marshal(buffer[offset:])
if err != nil {
return 0, err
}
offset += n
}
return offset, nil
}
func (sp *SliceKVpair) Unmarshal(buffer []byte) (int, error) {
offset := 0
length := binary.BigEndian.Uint32(buffer[offset:])
offset += 4
*sp = make([]KVpair, length)
for i := range *sp {
var k SString
n, err := k.Unmarshal(buffer[offset:])
if err != nil {
return 0, err
}
offset += n
var v SUint32
n, err = v.Unmarshal(buffer[offset:])
offset += n
pair := KVpair{
K: string(k),
V: uint32(v),
}
(*sp)[i] = pair
}
return offset, nil
}
func (sp *SliceKVpair) Partition(limit int) []SlicePartition {
p := make([]SlicePartition, 0)
length := len(*sp)
index := 0
size := 4
for i, v := range *sp {
size += 4 + 2 + len(v.K)
if size >= limit {
var one SlicePartition
one.Start = index
one.Size = size
one.End = i + 1
p = append(p, one)
index = i + 1
size = 4
}
if i == length-1 && index < length {
var lastOne SlicePartition
lastOne.Size = size
lastOne.Start = index
lastOne.End = length
p = append(p, lastOne)
}
}
return p
}
func (sp *SliceKVpair) PredictSize() int {
size := 4
for _, pair := range *sp {
size += 4 + len(pair.K)
}
return size
}