19#include "pw_allocator/hardening.h"
20#include "pw_result/result.h"
39template <
typename T,
size_t kN>
67 constexpr explicit Layout(
size_t size)
68 :
Layout(size,
alignof(std::max_align_t)) {}
69 constexpr Layout(
size_t size,
size_t alignment)
70 : size_(size), alignment_(alignment) {}
72 constexpr size_t size()
const {
return size_; }
73 constexpr size_t alignment()
const {
return alignment_; }
76 template <
typename T, std::enable_if_t<!std::is_array_v<T>,
int> = 0>
78 return Layout(
sizeof(T),
alignof(T));
82 template <
typename T, std::enable_if_t<is_bounded_array_v<T>,
int> = 0>
84 return Layout(
sizeof(T),
alignof(std::remove_extent_t<T>));
88 template <
typename T, std::enable_if_t<is_unbounded_array_v<T>,
int> = 0>
89 static constexpr Layout Of(
size_t count);
94 return result.
ok() ? (*result) :
Layout();
102 return Layout(size_, std::max(alignment, alignment_));
107 template <
typename T>
109 return Align(
alignof(T));
117inline bool operator==(
const Layout& lhs,
const Layout& rhs) {
118 return lhs.size() == rhs.size() && lhs.alignment() == rhs.alignment();
121inline bool operator!=(
const Layout& lhs,
const Layout& rhs) {
122 return !(lhs == rhs);
129template <
typename T, std::enable_if_t<is_unbounded_array_v<T>,
int>>
130constexpr Layout Layout::Of(
size_t count) {
131 using U = std::remove_extent_t<T>;
132 size_t size =
sizeof(U);
133 Hardening::Multiply(size, count);
134 return Layout(size,
alignof(U));
137constexpr Layout Layout::Extend(
size_t size)
const {
138 Hardening::Increment(size, size_);
139 return Layout(size, alignment_);
constexpr bool ok() const
Definition: result.h:451
static constexpr Layout Of()
Creates a Layout for the given type.
Definition: layout.h:77
constexpr Layout Extend(size_t size) const
Returns a new layout from this object increased by the given size.
Definition: layout.h:137
static constexpr Layout Unwrap(const Result< Layout > &result)
Definition: layout.h:93
constexpr Layout Align(size_t alignment) const
Returns a new layout from this object with at least the given alignment.
Definition: layout.h:101
constexpr Layout AlignTo() const
Definition: layout.h:108
The Pigweed namespace.
Definition: alignment.h:27