blob: 32fe3907824c60bfcd336864dee0dfffeced76e0 [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_UI_LIB_ESCHER_UTIL_ALIGN_H_
#define SRC_UI_LIB_ESCHER_UTIL_ALIGN_H_
#include <lib/syslog/cpp/macros.h>
#include <cstdint>
#include <memory>
namespace escher {
// If |position| is already aligned to |alignment|, return it. Otherwise,
// return the next-larger value that is so aligned. |alignment| must be
// positive; the result is undefined otherwise.
inline size_t AlignedToNext(size_t position, size_t alignment) {
FX_DCHECK(alignment);
size_t remainder = position % alignment;
return remainder ? position + (alignment - remainder) : position;
}
inline uint8_t* AlignedToNext(uint8_t* ptr, size_t alignment) {
return reinterpret_cast<uint8_t*>(AlignedToNext(reinterpret_cast<size_t>(ptr), alignment));
}
template <typename T>
T* NextAlignedPtr(void* ptr) {
size_t space = sizeof(T) + alignof(T);
return reinterpret_cast<T*>(std::align(alignof(T), sizeof(T), ptr, space));
}
template <typename T>
T* NextAlignedTriviallyDestructiblePtr(void* ptr) {
static_assert(std::is_trivially_destructible<T>::value, "Type must be trivially destructible.");
return NextAlignedPtr<T>(ptr);
}
} // namespace escher
#endif // SRC_UI_LIB_ESCHER_UTIL_ALIGN_H_