Commit 29cfa7b7 authored by Philip Pronin's avatar Philip Pronin Committed by Sara Golemon

cleanup CompressedList / MutableCompressedList interfaces

Summary: Drop those `const_cast<>` hacks.

Reviewed By: @ot

Differential Revision: D2217629
parent c286b93a
...@@ -58,9 +58,10 @@ struct BitVectorCompressedListBase { ...@@ -58,9 +58,10 @@ struct BitVectorCompressedListBase {
skipPointers(reinterpret_cast<Pointer>(other.skipPointers)), skipPointers(reinterpret_cast<Pointer>(other.skipPointers)),
forwardPointers(reinterpret_cast<Pointer>(other.forwardPointers)) {} forwardPointers(reinterpret_cast<Pointer>(other.forwardPointers)) {}
void free() { ::free(const_cast<unsigned char*>(data.data())); } template <class T = Pointer>
auto free() -> decltype(::free(T(nullptr))) {
size_t getUpperBound() const { return upperBound; } return ::free(data.data());
}
size_t size = 0; size_t size = 0;
size_t upperBound = 0; size_t upperBound = 0;
...@@ -85,6 +86,7 @@ struct BitVectorEncoder { ...@@ -85,6 +86,7 @@ struct BitVectorEncoder {
"Value should be unsigned integral"); "Value should be unsigned integral");
typedef BitVectorCompressedList CompressedList; typedef BitVectorCompressedList CompressedList;
typedef MutableBitVectorCompressedList MutableCompressedList;
typedef Value ValueType; typedef Value ValueType;
typedef SkipValue SkipValueType; typedef SkipValue SkipValueType;
...@@ -94,10 +96,10 @@ struct BitVectorEncoder { ...@@ -94,10 +96,10 @@ struct BitVectorEncoder {
static constexpr size_t forwardQuantum = kForwardQuantum; static constexpr size_t forwardQuantum = kForwardQuantum;
template <class RandomAccessIterator> template <class RandomAccessIterator>
static BitVectorCompressedList encode(RandomAccessIterator begin, static MutableCompressedList encode(RandomAccessIterator begin,
RandomAccessIterator end) { RandomAccessIterator end) {
if (begin == end) { if (begin == end) {
return BitVectorCompressedList(); return MutableCompressedList();
} }
BitVectorEncoder encoder(end - begin, *(end - 1)); BitVectorEncoder encoder(end - begin, *(end - 1));
for (; begin != end; ++begin) { for (; begin != end; ++begin) {
...@@ -106,7 +108,7 @@ struct BitVectorEncoder { ...@@ -106,7 +108,7 @@ struct BitVectorEncoder {
return encoder.finish(); return encoder.finish();
} }
explicit BitVectorEncoder(const MutableBitVectorCompressedList& result) explicit BitVectorEncoder(const MutableCompressedList& result)
: bits_(result.bits), : bits_(result.bits),
skipPointers_(result.skipPointers), skipPointers_(result.skipPointers),
forwardPointers_(result.forwardPointers), forwardPointers_(result.forwardPointers),
...@@ -130,15 +132,15 @@ struct BitVectorEncoder { ...@@ -130,15 +132,15 @@ struct BitVectorEncoder {
while (skipPointersSize_ < nextSkipPointerSize) { while (skipPointersSize_ < nextSkipPointerSize) {
auto pos = skipPointersSize_++; auto pos = skipPointersSize_++;
folly::storeUnaligned<SkipValueType>( folly::storeUnaligned<SkipValueType>(
skipPointers_ + pos * sizeof(SkipValueType), size_); skipPointers_ + pos * sizeof(SkipValueType), size_);
} }
} }
if (forwardQuantum != 0) { if (forwardQuantum != 0) {
if ( size_ != 0 && (size_ % (forwardQuantum ?: 1) == 0)) { if (size_ != 0 && (size_ % (forwardQuantum ?: 1) == 0)) {
const auto pos = size_ / (forwardQuantum ?: 1) - 1; const auto pos = size_ / (forwardQuantum ?: 1) - 1;
folly::storeUnaligned<SkipValueType>( folly::storeUnaligned<SkipValueType>(
forwardPointers_ + pos * sizeof(SkipValueType), value); forwardPointers_ + pos * sizeof(SkipValueType), value);
} }
} }
...@@ -146,10 +148,10 @@ struct BitVectorEncoder { ...@@ -146,10 +148,10 @@ struct BitVectorEncoder {
++size_; ++size_;
} }
const BitVectorCompressedList& finish() const { const MutableCompressedList& finish() const {
CHECK_EQ(size_, result_.size); CHECK_EQ(size_, result_.size);
// TODO(ott): Relax this assumption. // TODO(ott): Relax this assumption.
CHECK_EQ(result_.getUpperBound(), lastValue_); CHECK_EQ(result_.upperBound, lastValue_);
return result_; return result_;
} }
...@@ -162,7 +164,7 @@ struct BitVectorEncoder { ...@@ -162,7 +164,7 @@ struct BitVectorEncoder {
size_t size_ = 0; size_t size_ = 0;
size_t skipPointersSize_ = 0; size_t skipPointersSize_ = 0;
BitVectorCompressedList result_; MutableCompressedList result_;
}; };
template <class Value, template <class Value,
...@@ -195,7 +197,7 @@ struct BitVectorEncoder<Value, SkipValue, kSkipQuantum, kForwardQuantum>:: ...@@ -195,7 +197,7 @@ struct BitVectorEncoder<Value, SkipValue, kSkipQuantum, kForwardQuantum>::
size_t bytes() const { return bits + skipPointers + forwardPointers; } size_t bytes() const { return bits + skipPointers + forwardPointers; }
template <typename Range> template <class Range>
BitVectorCompressedListBase<typename Range::iterator> openList( BitVectorCompressedListBase<typename Range::iterator> openList(
Range& buf) const { Range& buf) const {
BitVectorCompressedListBase<typename Range::iterator> result; BitVectorCompressedListBase<typename Range::iterator> result;
...@@ -216,7 +218,7 @@ struct BitVectorEncoder<Value, SkipValue, kSkipQuantum, kForwardQuantum>:: ...@@ -216,7 +218,7 @@ struct BitVectorEncoder<Value, SkipValue, kSkipQuantum, kForwardQuantum>::
return result; return result;
} }
MutableBitVectorCompressedList allocList() const { MutableCompressedList allocList() const {
uint8_t* buf = nullptr; uint8_t* buf = nullptr;
if (size > 0) { if (size > 0) {
buf = static_cast<uint8_t*>(malloc(bytes() + 7)); buf = static_cast<uint8_t*>(malloc(bytes() + 7));
...@@ -243,7 +245,7 @@ class BitVectorReader { ...@@ -243,7 +245,7 @@ class BitVectorReader {
typedef typename Encoder::ValueType ValueType; typedef typename Encoder::ValueType ValueType;
typedef typename Encoder::SkipValueType SkipValueType; typedef typename Encoder::SkipValueType SkipValueType;
explicit BitVectorReader(const BitVectorCompressedList& list) explicit BitVectorReader(const typename Encoder::CompressedList& list)
: size_(list.size), : size_(list.size),
bits_(list.bits), bits_(list.bits),
skipPointers_(list.skipPointers), skipPointers_(list.skipPointers),
...@@ -255,7 +257,7 @@ class BitVectorReader { ...@@ -255,7 +257,7 @@ class BitVectorReader {
return; return;
} }
upperBound_ = list.getUpperBound(); upperBound_ = list.upperBound;
} }
void reset() { void reset() {
...@@ -383,7 +385,6 @@ class BitVectorReader { ...@@ -383,7 +385,6 @@ class BitVectorReader {
size_t size() const { return size_; } size_t size() const { return size_; }
size_t position() const { return position_; } size_t position() const { return position_; }
ValueType value() const { return value_; } ValueType value() const { return value_; }
bool jump(size_t n) { bool jump(size_t n) {
...@@ -434,6 +435,6 @@ class BitVectorReader { ...@@ -434,6 +435,6 @@ class BitVectorReader {
const uint8_t* const forwardPointers_; const uint8_t* const forwardPointers_;
}; };
}} // namespaces }} // namespaces
#endif // FOLLY_EXPERIMENTAL_BIT_VECTOR_CODING_H #endif // FOLLY_EXPERIMENTAL_BIT_VECTOR_CODING_H
...@@ -56,23 +56,21 @@ struct EliasFanoCompressedListBase { ...@@ -56,23 +56,21 @@ struct EliasFanoCompressedListBase {
template <class OtherPointer> template <class OtherPointer>
EliasFanoCompressedListBase( EliasFanoCompressedListBase(
const EliasFanoCompressedListBase<OtherPointer>& other) const EliasFanoCompressedListBase<OtherPointer>& other)
: size(other.size), : size(other.size),
numLowerBits(other.numLowerBits), numLowerBits(other.numLowerBits),
data(other.data), data(other.data),
skipPointers(reinterpret_cast<Pointer>(other.skipPointers)), skipPointers(reinterpret_cast<Pointer>(other.skipPointers)),
forwardPointers(reinterpret_cast<Pointer>(other.forwardPointers)), forwardPointers(reinterpret_cast<Pointer>(other.forwardPointers)),
lower(reinterpret_cast<Pointer>(other.lower)), lower(reinterpret_cast<Pointer>(other.lower)),
upper(reinterpret_cast<Pointer>(other.upper)) { upper(reinterpret_cast<Pointer>(other.upper)) { }
}
void free() { template <class T = Pointer>
::free(const_cast<unsigned char*>(data.data())); auto free() -> decltype(::free(T(nullptr))) {
return ::free(data.data());
} }
size_t upperSize() const { size_t upperSize() const { return data.end() - upper; }
return data.end() - upper;
}
size_t size = 0; size_t size = 0;
uint8_t numLowerBits = 0; uint8_t numLowerBits = 0;
...@@ -96,10 +94,11 @@ template <class Value, ...@@ -96,10 +94,11 @@ template <class Value,
size_t kForwardQuantum = 0> // 0 = disabled size_t kForwardQuantum = 0> // 0 = disabled
struct EliasFanoEncoderV2 { struct EliasFanoEncoderV2 {
static_assert(std::is_integral<Value>::value && static_assert(std::is_integral<Value>::value &&
std::is_unsigned<Value>::value, std::is_unsigned<Value>::value,
"Value should be unsigned integral"); "Value should be unsigned integral");
typedef EliasFanoCompressedList CompressedList; typedef EliasFanoCompressedList CompressedList;
typedef MutableEliasFanoCompressedList MutableCompressedList;
typedef Value ValueType; typedef Value ValueType;
typedef SkipValue SkipValueType; typedef SkipValue SkipValueType;
...@@ -122,10 +121,10 @@ struct EliasFanoEncoderV2 { ...@@ -122,10 +121,10 @@ struct EliasFanoEncoderV2 {
// EliasFanoCompressedList has no ownership of it, you need to call // EliasFanoCompressedList has no ownership of it, you need to call
// free() explicitly. // free() explicitly.
template <class RandomAccessIterator> template <class RandomAccessIterator>
static EliasFanoCompressedList encode(RandomAccessIterator begin, static MutableCompressedList encode(RandomAccessIterator begin,
RandomAccessIterator end) { RandomAccessIterator end) {
if (begin == end) { if (begin == end) {
return EliasFanoCompressedList(); return MutableCompressedList();
} }
EliasFanoEncoderV2 encoder(end - begin, *(end - 1)); EliasFanoEncoderV2 encoder(end - begin, *(end - 1));
for (; begin != end; ++begin) { for (; begin != end; ++begin) {
...@@ -134,21 +133,20 @@ struct EliasFanoEncoderV2 { ...@@ -134,21 +133,20 @@ struct EliasFanoEncoderV2 {
return encoder.finish(); return encoder.finish();
} }
explicit EliasFanoEncoderV2(const MutableEliasFanoCompressedList& result) explicit EliasFanoEncoderV2(const MutableCompressedList& result)
: lower_(result.lower), : lower_(result.lower),
upper_(result.upper), upper_(result.upper),
skipPointers_(reinterpret_cast<SkipValueType*>( skipPointers_(reinterpret_cast<SkipValueType*>(
result.skipPointers)), result.skipPointers)),
forwardPointers_(reinterpret_cast<SkipValueType*>( forwardPointers_(reinterpret_cast<SkipValueType*>(
result.forwardPointers)), result.forwardPointers)),
result_(result) { result_(result) {
memset(result.data.data(), 0, result.data.size()); memset(result.data.data(), 0, result.data.size());
} }
EliasFanoEncoderV2(size_t size, ValueType upperBound) EliasFanoEncoderV2(size_t size, ValueType upperBound)
: EliasFanoEncoderV2( : EliasFanoEncoderV2(
Layout::fromUpperBoundAndSize(upperBound, size).allocList()) { Layout::fromUpperBoundAndSize(upperBound, size).allocList()) { }
}
void add(ValueType value) { void add(ValueType value) {
CHECK_GE(value, lastValue_); CHECK_GE(value, lastValue_);
...@@ -184,7 +182,7 @@ struct EliasFanoEncoderV2 { ...@@ -184,7 +182,7 @@ struct EliasFanoEncoderV2 {
++size_; ++size_;
} }
const EliasFanoCompressedList& finish() const { const MutableCompressedList& finish() const {
CHECK_EQ(size_, result_.size); CHECK_EQ(size_, result_.size);
return result_; return result_;
} }
...@@ -210,7 +208,7 @@ struct EliasFanoEncoderV2 { ...@@ -210,7 +208,7 @@ struct EliasFanoEncoderV2 {
size_t size_ = 0; size_t size_ = 0;
size_t skipPointersSize_ = 0; size_t skipPointersSize_ = 0;
EliasFanoCompressedList result_; MutableCompressedList result_;
}; };
template <class Value, template <class Value,
...@@ -283,7 +281,7 @@ struct EliasFanoEncoderV2<Value, ...@@ -283,7 +281,7 @@ struct EliasFanoEncoderV2<Value,
return lower + upper + skipPointers + forwardPointers; return lower + upper + skipPointers + forwardPointers;
} }
template <typename Range> template <class Range>
EliasFanoCompressedListBase<typename Range::iterator> EliasFanoCompressedListBase<typename Range::iterator>
openList(Range& buf) const { openList(Range& buf) const {
EliasFanoCompressedListBase<typename Range::iterator> result; EliasFanoCompressedListBase<typename Range::iterator> result;
...@@ -305,7 +303,7 @@ struct EliasFanoEncoderV2<Value, ...@@ -305,7 +303,7 @@ struct EliasFanoEncoderV2<Value,
return result; return result;
} }
MutableEliasFanoCompressedList allocList() const { MutableCompressedList allocList() const {
uint8_t* buf = nullptr; uint8_t* buf = nullptr;
// WARNING: Current read/write logic assumes that the 7 bytes // WARNING: Current read/write logic assumes that the 7 bytes
// following the last byte of lower and upper sequences are // following the last byte of lower and upper sequences are
...@@ -337,10 +335,10 @@ class UpperBitsReader { ...@@ -337,10 +335,10 @@ class UpperBitsReader {
public: public:
typedef typename Encoder::ValueType ValueType; typedef typename Encoder::ValueType ValueType;
explicit UpperBitsReader(const EliasFanoCompressedList& list) explicit UpperBitsReader(const typename Encoder::CompressedList& list)
: forwardPointers_(list.forwardPointers), : forwardPointers_(list.forwardPointers),
skipPointers_(list.skipPointers), skipPointers_(list.skipPointers),
start_(list.upper) { start_(list.upper) {
reset(); reset();
} }
...@@ -529,7 +527,7 @@ class EliasFanoReader { ...@@ -529,7 +527,7 @@ class EliasFanoReader {
typedef Encoder EncoderType; typedef Encoder EncoderType;
typedef typename Encoder::ValueType ValueType; typedef typename Encoder::ValueType ValueType;
explicit EliasFanoReader(const EliasFanoCompressedList& list) explicit EliasFanoReader(const typename Encoder::CompressedList& list)
: size_(list.size), : size_(list.size),
lower_(list.lower), lower_(list.lower),
upper_(list), upper_(list),
......
...@@ -81,7 +81,7 @@ std::vector<size_t> order; ...@@ -81,7 +81,7 @@ std::vector<size_t> order;
std::vector<uint32_t> encodeSmallData; std::vector<uint32_t> encodeSmallData;
std::vector<uint32_t> encodeLargeData; std::vector<uint32_t> encodeLargeData;
typename Encoder::CompressedList list; typename Encoder::MutableCompressedList list;
void init() { void init() {
std::mt19937 gen; std::mt19937 gen;
......
...@@ -81,7 +81,7 @@ std::vector<size_t> order; ...@@ -81,7 +81,7 @@ std::vector<size_t> order;
std::vector<uint32_t> encodeSmallData; std::vector<uint32_t> encodeSmallData;
std::vector<uint32_t> encodeLargeData; std::vector<uint32_t> encodeLargeData;
typename Encoder::CompressedList list; typename Encoder::MutableCompressedList list;
void init() { void init() {
std::mt19937 gen; std::mt19937 gen;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment