Style tweaks to max_align_v calculation
authorYedidya Feldblum <yfeldblum@fb.com>
Fri, 21 Jul 2017 07:20:14 +0000 (00:20 -0700)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Fri, 21 Jul 2017 07:38:49 +0000 (00:38 -0700)
Summary:
[Folly] Style tweaks to `max_align_v` calculation.

* Change ns from `folly::detail` since that can be crowded and many other folly libraries may include this header.
* Extract a 2-param `max` alias.
* Fix an incorrectly hardcoded `size_t`.

Reviewed By: WillerZ

Differential Revision: D5468758

fbshipit-source-id: 14a3f67323020a3cfce2b3b46f5f64f3e6125027

folly/Portability.h

index d0c14dd7e388122d732b9f29fb1ae11c0aebde1c..0ac569516646a74e169909300e7249456091d5d2 100644 (file)
@@ -33,21 +33,20 @@ constexpr bool kHasUnalignedAccess = true;
 constexpr bool kHasUnalignedAccess = false;
 #endif
 
-namespace detail {
+namespace portability_detail {
+
+template <typename I, I A, I B>
+using integral_max = std::integral_constant<I, (A < B) ? B : A>;
 
 template <typename I, I A, I... Bs>
-struct integral_max
-    : std::integral_constant<
-          I,
-          (A > integral_max<I, Bs...>::value) ? A
-                                              : integral_max<I, Bs...>::value> {
-};
+struct integral_sequence_max
+    : integral_max<I, A, integral_sequence_max<I, Bs...>::value> {};
 
-template <typename I, size_t A>
-struct integral_max<I, A> : std::integral_constant<I, A> {};
+template <typename I, I A>
+struct integral_sequence_max<I, A> : std::integral_constant<I, A> {};
 
 template <typename... Ts>
-using max_alignment = integral_max<size_t, alignof(Ts)...>;
+using max_alignment = integral_sequence_max<size_t, alignof(Ts)...>;
 
 using max_basic_alignment = max_alignment<
     std::max_align_t,
@@ -66,7 +65,7 @@ using max_basic_alignment = max_alignment<
     std::nullptr_t>;
 } // namespace detail
 
-constexpr size_t max_align_v = detail::max_basic_alignment::value;
+constexpr size_t max_align_v = portability_detail::max_basic_alignment::value;
 
 // max_align_t is a type which is aligned at least as strictly as the
 // most-aligned basic type (see the specification of std::max_align_t). This