1/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2/*
3 *     Copyright 2016 Couchbase, Inc
4 *
5 *   Licensed under the Apache License, Version 2.0 (the "License");
6 *   you may not use this file except in compliance with the License.
7 *   You may obtain a copy of the License at
8 *
9 *       http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *   Unless required by applicable law or agreed to in writing, software
12 *   distributed under the License is distributed on an "AS IS" BASIS,
13 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *   See the License for the specific language governing permissions and
15 *   limitations under the License.
16 */
17
18#pragma once
19
20#include <cstddef>
21#include <type_traits>
22
23#include "visibility.h"
24
25#if defined(__GNUC__) || defined(__clang__)
26/**
27 * Branch prediction hint for the compiler where the given
28 * expression is likely to evaluate to true
29 */
30#define likely(x) __builtin_expect(!!(x), 1)
31
32/**
33 * Branch prediction hint for the compiler where the given
34 * expression is unlikely to evaluate to true
35 */
36#define unlikely(x) __builtin_expect(!!(x), 0)
37#else
38#define likely(x) (x)
39#define unlikely(x) (x)
40#endif
41
42namespace phosphor {
43    // Introducing cross-platform ssize_t (doesn't exist on windows)
44    // as future-proofing if e.g. negative statistics are ever needed
45    using ssize_t = std::make_signed<size_t>::type;
46}
47