Add CachelinePadded<T> to folly.
[folly.git] / folly / detail / CachelinePaddedImpl.h
1 /*
2  * Copyright 2016 Facebook, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #pragma once
18
19 #include <folly/detail/CacheLocality.h>
20
21 namespace folly {
22
23 template <typename T>
24 class CachelinePadded;
25
26 namespace detail {
27
28 template <
29     typename T,
30     bool needsPadding = (sizeof(T) % CacheLocality::kFalseSharingRange != 0)>
31 struct CachelinePaddedImpl;
32
33 // We need alignas(T) alignas(kFalseSharingRange) for the case where alignof(T)
34 // > alignof(kFalseSharingRange).
35 template <typename T>
36 struct alignas(T) alignas(detail::CacheLocality::kFalseSharingRange)
37     CachelinePaddedImpl<T, /* needsPadding = */ false> {
38   template <typename... Args>
39   explicit CachelinePaddedImpl(Args&&... args)
40       : item(std::forward<Args>(args)...) {}
41   T item;
42 };
43
44 template <typename T>
45 struct alignas(T) alignas(detail::CacheLocality::kFalseSharingRange)
46     CachelinePaddedImpl<T, /* needsPadding = */ true> {
47   template <typename... Args>
48   explicit CachelinePaddedImpl(Args&&... args)
49       : item(std::forward<Args>(args)...) {}
50
51   T item;
52   char padding
53       [CacheLocality::kFalseSharingRange -
54        sizeof(T) % CacheLocality::kFalseSharingRange];
55 };
56 } // namespace detail
57 } // namespace folly