#pragma once #if !defined(BAD_APPLE_OS_MEMORY_HPP_INCLUDED) #define BAD_APPLE_OS_MEMORY_HPP_INCLUDED #include #include #include #include #include namespace std { template struct allocator { using value_type = T; using size_type = std::size_t; using propagate_on_container_move_assignment = true_type; constexpr allocator() noexcept = default; constexpr allocator(const allocator&) noexcept = default; template constexpr allocator(const allocator&) noexcept {} [[nodiscard]] constexpr T* allocate(size_t n) { if (numeric_limits::max() / sizeof(T) < n) { __ba_throw bad_array_new_length(); } return static_cast(::operator new(n * sizeof(T))); // TODO: alignment for bigger types } constexpr void deallocate(T* p, size_t n) { (void) n; ::operator delete(p); // TODO: bigger alignments } }; constexpr void* align(std::size_t alignment, std::size_t size, void*& ptr, std::size_t& space) noexcept { if (space < size) { return nullptr; } std::size_t addr = __builtin_bit_cast(std::size_t, ptr); if (addr % alignment != 0) { std::size_t offset = alignment + (addr % alignment); if (space < size + offset) { return nullptr; } addr += offset; space -= offset; ptr = __builtin_bit_cast(void*, addr); } return ptr; } #if defined(BASTL_EXTENSIONS) template constexpr T alignUp(T value, T alignTo) noexcept { if (value % alignTo != 0) { return value + alignTo - (value % alignTo); } return value; } #endif } #endif // !defined(BAD_APPLE_OS_MEMORY_HPP_INCLUDED)