[RFC PATCH v1 06/23] libcamera: base: Add alignment utility functions
Barnabás Pőcze
barnabas.pocze at ideasonboard.com
Fri Jun 6 18:41:39 CEST 2025
Add a couple internal functions to check alignment, and to
align integers, pointer up to a given alignment.
Signed-off-by: Barnabás Pőcze <barnabas.pocze at ideasonboard.com>
---
include/libcamera/base/details/align.h | 72 ++++++++++++++++++++++++++
1 file changed, 72 insertions(+)
create mode 100644 include/libcamera/base/details/align.h
diff --git a/include/libcamera/base/details/align.h b/include/libcamera/base/details/align.h
new file mode 100644
index 000000000..e1c24c6e1
--- /dev/null
+++ b/include/libcamera/base/details/align.h
@@ -0,0 +1,72 @@
+#pragma once
+
+#include <cassert>
+#include <cstddef>
+#include <cstdint>
+
+#include <libcamera/base/details/cxx20.h>
+
+namespace libcamera::details::align {
+
+template<typename T>
+bool is(T *p, std::uintptr_t alignment)
+{
+ assert(alignment > 0);
+
+ return reinterpret_cast<std::uintptr_t>(p) % alignment == 0;
+}
+
+template<typename T>
+constexpr T up(T x, cxx20::type_identity_t<T> alignment)
+{
+ static_assert(std::is_unsigned_v<T>);
+ assert(alignment > 0);
+
+ const auto padding = (alignment - (x % alignment)) % alignment;
+ assert(x + padding >= x);
+
+ return x + padding;
+}
+
+template<typename T>
+auto *up(T *p, std::uintptr_t alignment)
+{
+ using U = std::conditional_t<
+ std::is_const_v<T>,
+ const std::byte,
+ std::byte
+ >;
+
+ return reinterpret_cast<U *>(up(reinterpret_cast<std::uintptr_t>(p), alignment));
+}
+
+template<typename T>
+T *up(std::size_t size, std::size_t alignment, T *&ptr, std::size_t *avail = nullptr)
+{
+ assert(alignment > 0);
+
+ auto p = reinterpret_cast<std::uintptr_t>(ptr);
+ const auto padding = (alignment - (p % alignment)) % alignment;
+
+ if (avail) {
+ if (size > *avail || padding > *avail - size)
+ return nullptr;
+
+ *avail -= size + padding;
+ }
+
+ p += padding;
+ ptr = reinterpret_cast<T *>(p + size);
+
+ return reinterpret_cast<T *>(p);
+}
+
+template<typename U, typename T>
+U *up(T *&ptr, std::size_t *avail = nullptr)
+{
+ return reinterpret_cast<std::conditional_t<std::is_const_v<T>, const U, U> *>(
+ up(sizeof(U), alignof(U), ptr, avail)
+ );
+}
+
+} /* namespace libcamera::details::align */
--
2.49.0
More information about the libcamera-devel
mailing list