// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
// This source code is licensed under both the GPLv2 (found in the
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
#pragma once
#include <vector>
#include <stdint.h>
#include "rocksdb/slice.h"
namespace
rocksdb {
class
BlockBuilder {
public
:
BlockBuilder(
const
BlockBuilder&) =
delete
;
void
operator=(
const
BlockBuilder&) =
delete
;
explicit
BlockBuilder(
int
block_restart_interval,
bool
use_delta_encoding =
true
);
// Reset the contents as if the BlockBuilder was just constructed.
void
Reset();
// REQUIRES: Finish() has not been called since the last call to Reset().
// REQUIRES: key is larger than any previously added key
void
Add(
const
Slice& key,
const
Slice& value);
// Finish building the block and return a slice that refers to the
// block contents. The returned slice will remain valid for the
// lifetime of this builder or until Reset() is called.
Slice Finish();
// Returns an estimate of the current (uncompressed) size of the block
// we are building.
inline
size_t
CurrentSizeEstimate()
const
{
return
estimate_; }
// Returns an estimated block size after appending key and value.
size_t
EstimateSizeAfterKV(
const
Slice& key,
const
Slice& value)
const
;
// Return true iff no entries have been added since the last Reset()
bool
empty()
const
{
return
buffer_.empty();
}
private
:
const
int
block_restart_interval_;
const
bool
use_delta_encoding_;
std::string buffer_;
// Destination buffer
std::vector<uint32_t> restarts_;
// Restart points
size_t
estimate_;
int
counter_;
// Number of entries emitted since restart
bool
finished_;
// Has Finish() been called?
std::string last_key_;
};
}
// namespace rocksdb