/*
- * Copyright 2015 Facebook, Inc.
+ * Copyright 2017 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* limitations under the License.
*/
-#ifndef FOLLY_EXPERIMENTAL_BIT_VECTOR_CODING_H
-#define FOLLY_EXPERIMENTAL_BIT_VECTOR_CODING_H
+#pragma once
#include <cstdlib>
#include <limits>
#include <folly/experimental/Select64.h>
#include <glog/logging.h>
-#ifndef __GNUC__
-#error BitVectorCoding.h requires GCC
-#endif
-
#if !FOLLY_X64
#error BitVectorCoding.h requires x86_64
#endif
-#if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__
-#error BitVectorCoding.h requires little endianness
-#endif
-
namespace folly { namespace compression {
+static_assert(kIsLittleEndian, "BitVectorCoding.h requires little endianness");
+
template <class Pointer>
struct BitVectorCompressedListBase {
BitVectorCompressedListBase() = default;
if (begin == end) {
return MutableCompressedList();
}
- BitVectorEncoder encoder(end - begin, *(end - 1));
+ BitVectorEncoder encoder(size_t(end - begin), *(end - 1));
for (; begin != end; ++begin) {
encoder.add(*begin);
}
reinterpret_cast<folly::Unaligned<uint64_t>*>(block), inner);
if (skipQuantum != 0) {
- size_t nextSkipPointerSize = value / (skipQuantum ?: 1);
+ size_t nextSkipPointerSize = value / skipQuantum;
while (skipPointersSize_ < nextSkipPointerSize) {
auto pos = skipPointersSize_++;
folly::storeUnaligned<SkipValueType>(
}
if (forwardQuantum != 0) {
- if (size_ != 0 && (size_ % (forwardQuantum ?: 1) == 0)) {
- const auto pos = size_ / (forwardQuantum ?: 1) - 1;
+ if (size_ != 0 && (size_ % forwardQuantum == 0)) {
+ const auto pos = size_ / forwardQuantum - 1;
folly::storeUnaligned<SkipValueType>(
forwardPointers_ + pos * sizeof(SkipValueType), value);
}
layout.bits = bitVectorSizeInBytes;
if (skipQuantum != 0) {
- size_t numSkipPointers = upperBound / (skipQuantum ?: 1);
+ size_t numSkipPointers = upperBound / skipQuantum;
layout.skipPointers = numSkipPointers * sizeof(SkipValueType);
}
if (forwardQuantum != 0) {
- size_t numForwardPointers = size / (forwardQuantum ?: 1);
+ size_t numForwardPointers = size / forwardQuantum;
layout.forwardPointers = numForwardPointers * sizeof(SkipValueType);
}
// Use forward pointer.
if (Encoder::forwardQuantum > 0 && n > Encoder::forwardQuantum) {
- // Workaround to avoid 'division by zero' compile-time error.
- constexpr size_t q = Encoder::forwardQuantum ?: 1;
-
- const size_t steps = position_ / q;
+ const size_t steps = position_ / Encoder::forwardQuantum;
const size_t dest = folly::loadUnaligned<SkipValueType>(
forwardPointers_ + (steps - 1) * sizeof(SkipValueType));
reposition(dest);
- n = position_ + 1 - steps * q;
+ n = position_ + 1 - steps * Encoder::forwardQuantum;
// Correct inner_ will be set at the end.
}
if (Encoder::skipQuantum > 0 && v - value_ > Encoder::skipQuantum) {
size_t q = v / Encoder::skipQuantum;
- position_ = folly::loadUnaligned<SkipValueType>(
- skipPointers_ + (q - 1) * sizeof(SkipValueType)) - 1;
+ position_ = size_t(folly::loadUnaligned<SkipValueType>(
+ skipPointers_ + (q - 1) * sizeof(SkipValueType))) - 1;
reposition(q * Encoder::skipQuantum);
}
};
}} // namespaces
-
-#endif // FOLLY_EXPERIMENTAL_BIT_VECTOR_CODING_H