github.com/dgraph-io/sroar@v0.0.0-20220527172339-b92b7eaaf6e0/utils.go (about)

     1  /*
     2   * Copyright 2021 Dgraph Labs, Inc. and Contributors
     3   *
     4   * Licensed under the Apache License, Version 2.0 (the "License");
     5   * you may not use this file except in compliance with the License.
     6   * You may obtain a copy of the License at
     7   *
     8   *     http://www.apache.org/licenses/LICENSE-2.0
     9   *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  
    17  package sroar
    18  
    19  import (
    20  	"log"
    21  	"math"
    22  	"reflect"
    23  	"unsafe"
    24  
    25  	"github.com/pkg/errors"
    26  )
    27  
    28  func assert(b bool) {
    29  	if !b {
    30  		log.Fatalf("%+v", errors.Errorf("Assertion failure"))
    31  	}
    32  }
    33  func check(err error) {
    34  	if err != nil {
    35  		log.Fatalf("%+v", err)
    36  	}
    37  }
    38  func check2(_ interface{}, err error) {
    39  	check(err)
    40  }
    41  
    42  func min16(a, b uint16) uint16 {
    43  	if a < b {
    44  		return a
    45  	}
    46  	return b
    47  }
    48  func max16(a, b uint16) uint16 {
    49  	if a > b {
    50  		return a
    51  	}
    52  	return b
    53  }
    54  
    55  // Returns sum of a and b. If the result overflows uint64, it returns math.MaxUint64.
    56  func addUint64(a, b uint64) uint64 {
    57  	if a > math.MaxUint64-b {
    58  		return math.MaxUint64
    59  	}
    60  	return a + b
    61  }
    62  
    63  func toByteSlice(b []uint16) []byte {
    64  	// reference: https://go101.org/article/unsafe.html
    65  	var bs []byte
    66  	hdr := (*reflect.SliceHeader)(unsafe.Pointer(&bs))
    67  	hdr.Len = len(b) * 2
    68  	hdr.Cap = hdr.Len
    69  	hdr.Data = uintptr(unsafe.Pointer(&b[0]))
    70  	return bs
    71  }
    72  
    73  // These methods (byteSliceAsUint16Slice,...) do not make copies,
    74  // they are pointer-based (unsafe). The caller is responsible to
    75  // ensure that the input slice does not get garbage collected, deleted
    76  // or modified while you hold the returned slince.
    77  ////
    78  func toUint16Slice(b []byte) (result []uint16) {
    79  	var u16s []uint16
    80  	hdr := (*reflect.SliceHeader)(unsafe.Pointer(&u16s))
    81  	hdr.Len = len(b) / 2
    82  	hdr.Cap = hdr.Len
    83  	hdr.Data = uintptr(unsafe.Pointer(&b[0]))
    84  	return u16s
    85  }
    86  
    87  // BytesToU32Slice converts the given byte slice to uint32 slice
    88  func toUint64Slice(b []uint16) []uint64 {
    89  	var u64s []uint64
    90  	hdr := (*reflect.SliceHeader)(unsafe.Pointer(&u64s))
    91  	hdr.Len = len(b) / 4
    92  	hdr.Cap = hdr.Len
    93  	hdr.Data = uintptr(unsafe.Pointer(&b[0]))
    94  	return u64s
    95  }
    96  
    97  //go:linkname memclrNoHeapPointers runtime.memclrNoHeapPointers
    98  func memclrNoHeapPointers(p unsafe.Pointer, n uintptr)
    99  
   100  func Memclr(b []uint16) {
   101  	if len(b) == 0 {
   102  		return
   103  	}
   104  	p := unsafe.Pointer(&b[0])
   105  	memclrNoHeapPointers(p, uintptr(len(b)))
   106  }