tetl 0.1.0
Embedded Template Library
Loading...
Searching...
No Matches
pointer_like_traits.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSL-1.0
2// SPDX-FileCopyrightText: Copyright (C) 2021 Tobias Hienzsch
3
4#ifndef TETL_MEMORY_POINTER_LIKE_TRAITS_HPP
5#define TETL_MEMORY_POINTER_LIKE_TRAITS_HPP
6
7#include <etl/_cstddef/size_t.hpp>
8#include <etl/_cstdint/uintptr_t.hpp>
9#include <etl/_math/ilog2.hpp>
10
11namespace etl {
12
13/// \brief A traits type that is used to handle pointer types and things that
14/// are just wrappers for pointers as a uniform entity.
15template <typename T>
16struct pointer_like_traits;
17
18/// \brief Provide pointer_like_traits for non-cvr pointers.
19template <typename T>
20struct pointer_like_traits<T*> {
21 [[nodiscard]] static auto get_as_void_pointer(T* p) -> void*
22 {
23 return p;
24 }
25
26 [[nodiscard]] static auto get_from_void_pointer(void* p) -> T*
27 {
28 return static_cast<T*>(p);
29 }
30
31 static constexpr size_t free_bits = ilog2(alignof(T));
32};
33
34/// Provide pointer_like_traits for const things.
35template <typename T>
36struct pointer_like_traits<T const> {
37 using non_const = pointer_like_traits<T>;
38
39 [[nodiscard]] static auto get_as_void_pointer(T const p) -> void const*
40 {
41 return non_const::get_as_void_pointer(p);
42 }
43
44 // NOLINTNEXTLINE(readability-const-return-type)
45 [[nodiscard]] static auto get_from_void_pointer(void const* p) -> T const
46 {
47 return non_const::get_from_void_pointer(const_cast<void*>(p));
48 }
49
50 static constexpr size_t free_bits = non_const::free_bits;
51};
52
53/// Provide pointer_like_traits for const pointers.
54template <typename T>
55struct pointer_like_traits<T const*> {
56 using non_const = pointer_like_traits<T*>;
57
58 [[nodiscard]] static auto get_as_void_pointer(T const* p) -> void const*
59 {
60 return non_const::get_as_void_pointer(const_cast<T*>(p));
61 }
62
63 [[nodiscard]] static auto get_from_void_pointer(void const* p) -> T const*
64 {
65 return non_const::get_from_void_pointer(const_cast<void*>(p));
66 }
67
68 static constexpr size_t free_bits = non_const::free_bits;
69};
70
71/// Provide pointer_like_traits for uintptr_t.
72template <>
73struct pointer_like_traits<uintptr_t> {
74 [[nodiscard]] static auto get_as_void_pointer(uintptr_t p) -> void*
75 {
76 return bit_cast<void*>(p);
77 }
78
79 [[nodiscard]] static auto get_from_void_pointer(void* p) -> uintptr_t
80 {
81 return bit_cast<uintptr_t>(p);
82 }
83
84 // No bits are available!
85 static constexpr size_t free_bits = 0;
86};
87
88} // namespace etl
89
90#endif // TETL_MEMORY_POINTER_LIKE_TRAITS_HPP
Definition adjacent_find.hpp:9
constexpr auto ilog2(Int x) noexcept -> Int
Definition ilog2.hpp:12
static constexpr size_t free_bits
Definition pointer_like_traits.hpp:31
static auto get_from_void_pointer(void *p) -> T *
Definition pointer_like_traits.hpp:26
static auto get_as_void_pointer(T *p) -> void *
Definition pointer_like_traits.hpp:21
static constexpr size_t free_bits
Definition pointer_like_traits.hpp:50
static auto get_as_void_pointer(T const p) -> void const *
Definition pointer_like_traits.hpp:39
static auto get_from_void_pointer(void const *p) -> T const
Definition pointer_like_traits.hpp:45
static auto get_from_void_pointer(void const *p) -> T const *
Definition pointer_like_traits.hpp:63
static constexpr size_t free_bits
Definition pointer_like_traits.hpp:68
static auto get_as_void_pointer(T const *p) -> void const *
Definition pointer_like_traits.hpp:58
static constexpr size_t free_bits
Definition pointer_like_traits.hpp:85
static auto get_from_void_pointer(void *p) -> uintptr_t
Definition pointer_like_traits.hpp:79
static auto get_as_void_pointer(uintptr_t p) -> void *
Definition pointer_like_traits.hpp:74