proxygen
Assume.h
Go to the documentation of this file.
1 /*
2  * Copyright 2015-present 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 <cstdlib>
20 
21 #include <folly/Portability.h>
22 
23 namespace folly {
24 
25 namespace detail {
26 
27 extern void assume_check(bool cond);
28 
29 } // namespace detail
30 
41 FOLLY_ALWAYS_INLINE void assume(bool cond) {
42  if (kIsDebug) {
44  } else {
45 #if defined(__clang__) // Must go first because Clang also defines __GNUC__.
46  __builtin_assume(cond);
47 #elif defined(__GNUC__)
48  if (!cond) {
49  __builtin_unreachable();
50  }
51 #elif defined(_MSC_VER)
52  __assume(cond);
53 #else
54  // Do nothing.
55 #endif
56  }
57 }
58 
60  assume(false);
61  // Do a bit more to get the compiler to understand
62  // that this function really will never return.
63 #if defined(__GNUC__)
64  __builtin_unreachable();
65 #elif defined(_MSC_VER)
66  __assume(0);
67 #else
68  // Well, it's better than nothing.
69  std::abort();
70 #endif
71 }
72 
73 } // namespace folly
constexpr auto kIsDebug
Definition: Portability.h:264
#define FOLLY_ALWAYS_INLINE
Definition: CPortability.h:151
—— Concurrent Priority Queue Implementation ——
Definition: AtomicBitSet.h:29
void assume_check(bool cond)
Definition: Assume.cpp:25
FOLLY_ALWAYS_INLINE void assume_unreachable()
Definition: Assume.h:59
FOLLY_ALWAYS_INLINE void assume(bool cond)
Definition: Assume.h:41