From 597f60cf6bc4fd32ce46f3a87f119ea96aea48ae Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Mon, 12 Oct 2020 14:27:21 -0700 Subject: [PATCH] ircd: Add assume() convenience wrapping for __builtin_assume(). --- include/ircd/ircd.h | 1 + include/ircd/util/assume.h | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 include/ircd/util/assume.h diff --git a/include/ircd/ircd.h b/include/ircd/ircd.h index 53002ec3c..8795dcf6e 100644 --- a/include/ircd/ircd.h +++ b/include/ircd/ircd.h @@ -40,6 +40,7 @@ // Project library interfaces // +#include "util/assume.h" #include "util/mask.h" #include "string_view.h" #include "vector_view.h" diff --git a/include/ircd/util/assume.h b/include/ircd/util/assume.h new file mode 100644 index 000000000..599430874 --- /dev/null +++ b/include/ircd/util/assume.h @@ -0,0 +1,26 @@ +// The Construct +// +// Copyright (C) The Construct Developers, Authors & Contributors +// Copyright (C) 2016-2020 Jason Volk +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice is present in all copies. The +// full license for this software is available in the LICENSE file. + +#pragma once +#define HAVE_IRCD_UTIL_ASSUME_H + +namespace ircd { inline namespace util +{ + template + [[using gnu: always_inline, gnu_inline, artificial]] + extern inline void + assume(T&& expr) + { + assert(static_cast(expr)); + #if __has_builtin(__builtin_assume) + __builtin_assume(static_cast(expr)); + #endif + } +}}