core-local array type conversions

Summary:
try to clean up the type conversions and hope it passes on windows.

one interesting thing I learned is that bitshift operations are special: in `x << y`, the result type depends only on the type of `x`, unlike most arithmetic operations where the result type depends on both operands' types.
Closes https://github.com/facebook/rocksdb/pull/2277

Differential Revision: D5050145

Pulled By: ajkr

fbshipit-source-id: f3309e77526ac9612c632bf93a62d99757af9a29
main
Andrew Kryczka 8 years ago committed by Facebook Github Bot
parent c2be434307
commit bbe9ee7dd4
  1. 12
      util/core_local.h

@ -38,23 +38,23 @@ class CoreLocalArray {
private: private:
std::unique_ptr<T[]> data_; std::unique_ptr<T[]> data_;
size_t size_shift_; int size_shift_;
}; };
template<typename T> template<typename T>
CoreLocalArray<T>::CoreLocalArray() { CoreLocalArray<T>::CoreLocalArray() {
unsigned int num_cpus = std::thread::hardware_concurrency(); int num_cpus = static_cast<int>(std::thread::hardware_concurrency());
// find a power of two >= num_cpus and >= 8 // find a power of two >= num_cpus and >= 8
size_shift_ = 3; size_shift_ = 3;
while (1u << size_shift_ < num_cpus) { while (1 << size_shift_ < num_cpus) {
++size_shift_; ++size_shift_;
} }
data_.reset(new T[1 << size_shift_]); data_.reset(new T[static_cast<size_t>(1) << size_shift_]);
} }
template<typename T> template<typename T>
size_t CoreLocalArray<T>::Size() const { size_t CoreLocalArray<T>::Size() const {
return 1u << size_shift_; return static_cast<size_t>(1) << size_shift_;
} }
template<typename T> template<typename T>
@ -77,7 +77,7 @@ std::pair<T*, size_t> CoreLocalArray<T>::AccessElementAndIndex() const {
template<typename T> template<typename T>
T* CoreLocalArray<T>::AccessAtCore(size_t core_idx) const { T* CoreLocalArray<T>::AccessAtCore(size_t core_idx) const {
assert(core_idx < 1u << size_shift_); assert(core_idx < static_cast<size_t>(1) << size_shift_);
return &data_[core_idx]; return &data_[core_idx];
} }

Loading…
Cancel
Save