// Copyright 2015 The Crashpad Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef CRASHPAD_UTIL_STDLIB_ALIGNED_ALLOCATOR_H_ #define CRASHPAD_UTIL_STDLIB_ALIGNED_ALLOCATOR_H_ #include <stddef.h> #include <limits> #include <memory> #include <new> #include <utility> #include <vector> namespace crashpad { //! \brief Allocates memory with the specified alignment constraint. //! //! This function wraps `posix_memalign()` or `_aligned_malloc()`. Memory //! allocated by this function must be released by AlignFree(). void* AlignedAllocate(size_t alignment, size_t size); //! \brief Frees memory allocated by AlignedAllocate(). //! //! This function wraps `free()` or `_aligned_free()`. void AlignedFree(void* pointer); //! \brief A standard allocator that aligns its allocations as requested, //! suitable for use as an allocator in standard containers. //! //! This is similar to `std::allocator<T>`, with the addition of an alignment //! guarantee. \a Alignment must be a power of 2. If \a Alignment is not //! specified, the default alignment for type \a T is used. template <class T, size_t Alignment = alignof(T)> struct AlignedAllocator { … }; template <class T1, class T2, size_t Alignment> bool operator==(const AlignedAllocator<T1, Alignment>& lhs, const AlignedAllocator<T2, Alignment>& rhs) noexcept { … } template <class T1, class T2, size_t Alignment> bool operator!=(const AlignedAllocator<T1, Alignment>& lhs, const AlignedAllocator<T2, Alignment>& rhs) noexcept { … } //! \brief A `std::vector` using AlignedAllocator. //! //! This is similar to `std::vector<T>`, with the addition of an alignment //! guarantee. \a Alignment must be a power of 2. If \a Alignment is not //! specified, the default alignment for type \a T is used. AlignedVector; } // namespace crashpad #endif // CRASHPAD_UTIL_STDLIB_ALIGNED_ALLOCATOR_H_