Commit 2d042e64 authored by Yedidya Feldblum's avatar Yedidya Feldblum Committed by Facebook Github Bot

Closer guarantee of constexpr Fingerprint tables computation

Summary: [Folly] Closer guarantee of `constexpr` Fingerprint tables computation. Works around a limitation that `template <...> constexpr` functions are only sometimes `constexpr` and may be non-`constexpr` for some instantiations with no warning by enforcing `constexpr` for the instantiations used.

Differential Revision: D10116556

fbshipit-source-id: f7014e5b2fce411c27c331874a7fd33841e14df3
parent aa472be6
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include <folly/Fingerprint.h> #include <folly/Fingerprint.h>
#include <folly/Portability.h>
#include <folly/Utility.h> #include <folly/Utility.h>
#include <folly/detail/FingerprintPolynomial.h> #include <folly/detail/FingerprintPolynomial.h>
...@@ -101,29 +102,32 @@ constexpr poly_table<Deg> make_poly_table() { ...@@ -101,29 +102,32 @@ constexpr poly_table<Deg> make_poly_table() {
return copy_table(table); return copy_table(table);
} }
// private global variables marked constexpr to enforce that make_poly_table is
// really invoked at constexpr time, which would not otherwise be guaranteed
FOLLY_STORAGE_CONSTEXPR auto const poly_table_63 = make_poly_table<63>();
FOLLY_STORAGE_CONSTEXPR auto const poly_table_95 = make_poly_table<95>();
FOLLY_STORAGE_CONSTEXPR auto const poly_table_127 = make_poly_table<127>();
} // namespace } // namespace
template <> template <>
FOLLY_STORAGE_CONSTEXPR const uint64_t const uint64_t FingerprintTable<64>::poly[poly_size(64)] = {
FingerprintTable<64>::poly[poly_size(64)] = { FingerprintTablePoly<63>::data[0]};
FingerprintTablePoly<63>::data[0]};
template <> template <>
FOLLY_STORAGE_CONSTEXPR const uint64_t const uint64_t FingerprintTable<96>::poly[poly_size(96)] = {
FingerprintTable<96>::poly[poly_size(96)] = { FingerprintTablePoly<95>::data[0],
FingerprintTablePoly<95>::data[0], FingerprintTablePoly<95>::data[1]};
FingerprintTablePoly<95>::data[1]};
template <> template <>
FOLLY_STORAGE_CONSTEXPR const uint64_t const uint64_t FingerprintTable<128>::poly[poly_size(128)] = {
FingerprintTable<128>::poly[poly_size(128)] = { FingerprintTablePoly<127>::data[0],
FingerprintTablePoly<127>::data[0], FingerprintTablePoly<127>::data[1]};
FingerprintTablePoly<127>::data[1]};
template <> template <>
const poly_table<64> FingerprintTable<64>::table = make_poly_table<63>(); const poly_table<64> FingerprintTable<64>::table = poly_table_63;
template <> template <>
const poly_table<96> FingerprintTable<96>::table = make_poly_table<95>(); const poly_table<96> FingerprintTable<96>::table = poly_table_95;
template <> template <>
const poly_table<128> FingerprintTable<128>::table = make_poly_table<127>(); const poly_table<128> FingerprintTable<128>::table = poly_table_127;
} // namespace detail } // namespace detail
} // namespace folly } // namespace folly
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