/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Copyright 2011-2017 Danny Robson */ #ifndef CRUFT_UTIL_POINTER_HPP #define CRUFT_UTIL_POINTER_HPP #include "view.hpp" #include #include namespace util { /////////////////////////////////////////////////////////////////////////// /// round the pointer upwards to satisfy the provided alignment template constexpr T* align (T *_ptr, size_t alignment) { // we perform this as two steps to avoid unnecessarily incrementing when // remainder is zero. auto ptr = reinterpret_cast (_ptr); if (ptr % alignment) ptr += alignment - ptr % alignment; return reinterpret_cast (ptr); } /////////////////////////////////////////////////////////////////////////// template constexpr util::view align (util::view value, size_t alignment) { return { align (value.begin (), alignment), value.end () }; } ///------------------------------------------------------------------------ /// round the pointer upwards to satisfy the provided alignment constexpr inline uintptr_t align (uintptr_t ptr, size_t alignment) { // we perform this as two steps to avoid unnecessarily incrementing when // remainder is zero. if (ptr % alignment) ptr += alignment - ptr % alignment; return ptr; } ///------------------------------------------------------------------------ /// round the pointer upwards to the nearest valid alignment for T template constexpr auto align (T *t) { return align (t, alignof (T)); } ///------------------------------------------------------------------------ /// round the pointer upwards to the nearest valid alignment for T template constexpr auto align (uintptr_t ptr) { return align (ptr, alignof (T)); } } #endif