Add address_of
This commit is contained in:
@ -17,6 +17,17 @@ constexpr void* operator new(size_t, void* ptr) noexcept
|
|||||||
namespace asl
|
namespace asl
|
||||||
{
|
{
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
[[nodiscard]]
|
||||||
|
constexpr T* address_of(T& obj)
|
||||||
|
{
|
||||||
|
return __builtin_addressof(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
void address_of(const T&& obj) = delete;
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
constexpr isize_t memcmp(const void* a, const void* b, isize_t size)
|
constexpr isize_t memcmp(const void* a, const void* b, isize_t size)
|
||||||
{
|
{
|
||||||
return __builtin_memcmp(a, b, static_cast<size_t>(size));
|
return __builtin_memcmp(a, b, static_cast<size_t>(size));
|
||||||
|
@ -97,6 +97,7 @@ cc_library(
|
|||||||
],
|
],
|
||||||
deps = [
|
deps = [
|
||||||
"//asl/base",
|
"//asl/base",
|
||||||
|
"//asl/memory",
|
||||||
],
|
],
|
||||||
visibility = ["//visibility:public"],
|
visibility = ["//visibility:public"],
|
||||||
)
|
)
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include "asl/base/utility.hpp"
|
#include "asl/base/utility.hpp"
|
||||||
#include "asl/base/meta.hpp"
|
#include "asl/base/meta.hpp"
|
||||||
#include "asl/base/functional.hpp"
|
#include "asl/base/functional.hpp"
|
||||||
|
#include "asl/memory/memory.hpp"
|
||||||
|
|
||||||
namespace asl
|
namespace asl
|
||||||
{
|
{
|
||||||
@ -43,7 +44,7 @@ public:
|
|||||||
&& same_as<invoke_result_t<T, Args...>, R>
|
&& same_as<invoke_result_t<T, Args...>, R>
|
||||||
)
|
)
|
||||||
// NOLINTNEXTLINE(*cast*)
|
// NOLINTNEXTLINE(*cast*)
|
||||||
: m_obj{const_cast<void*>(reinterpret_cast<const void*>(&t))}
|
: m_obj{const_cast<void*>(reinterpret_cast<const void*>(address_of(t)))}
|
||||||
, m_invoke{invoke<un_ref_t<T>>}
|
, m_invoke{invoke<un_ref_t<T>>}
|
||||||
{}
|
{}
|
||||||
|
|
||||||
@ -56,7 +57,7 @@ public:
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
// NOLINTNEXTLINE(*cast*)
|
// NOLINTNEXTLINE(*cast*)
|
||||||
m_obj = const_cast<void*>(reinterpret_cast<const void*>(&t));
|
m_obj = const_cast<void*>(reinterpret_cast<const void*>(address_of(t)));
|
||||||
m_invoke = invoke<un_ref_t<T>>;
|
m_invoke = invoke<un_ref_t<T>>;
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
|
Reference in New Issue
Block a user