github.com/onflow/atree@v0.6.0/slab.go (about)

     1  /*
     2   * Atree - Scalable Arrays and Ordered Maps
     3   *
     4   * Copyright 2021 Dapper Labs, Inc.
     5   *
     6   * Licensed under the Apache License, Version 2.0 (the "License");
     7   * you may not use this file except in compliance with the License.
     8   * You may obtain a copy of the License at
     9   *
    10   *   http://www.apache.org/licenses/LICENSE-2.0
    11   *
    12   * Unless required by applicable law or agreed to in writing, software
    13   * distributed under the License is distributed on an "AS IS" BASIS,
    14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    15   * See the License for the specific language governing permissions and
    16   * limitations under the License.
    17   */
    18  
    19  package atree
    20  
    21  type Slab interface {
    22  	Storable
    23  
    24  	ID() StorageID
    25  	Split(SlabStorage) (Slab, Slab, error)
    26  	Merge(Slab) error
    27  	// LendToRight rebalances slabs by moving elements from left to right
    28  	LendToRight(Slab) error
    29  	// BorrowFromRight rebalances slabs by moving elements from right to left
    30  	BorrowFromRight(Slab) error
    31  }
    32  
    33  func IsRootOfAnObject(slabData []byte) (bool, error) {
    34  	if len(slabData) < versionAndFlagSize {
    35  		return false, NewDecodingErrorf("data is too short")
    36  	}
    37  
    38  	flag := slabData[1]
    39  
    40  	return isRoot(flag), nil
    41  }
    42  
    43  func HasPointers(slabData []byte) (bool, error) {
    44  	if len(slabData) < versionAndFlagSize {
    45  		return false, NewDecodingErrorf("data is too short")
    46  	}
    47  
    48  	flag := slabData[1]
    49  
    50  	return hasPointers(flag), nil
    51  }
    52  
    53  func HasSizeLimit(slabData []byte) (bool, error) {
    54  	if len(slabData) < versionAndFlagSize {
    55  		return false, NewDecodingErrorf("data is too short")
    56  	}
    57  
    58  	flag := slabData[1]
    59  
    60  	return hasSizeLimit(flag), nil
    61  }