#include #include #include /////////////////////////////////////////////////////////////////////////////// int main (int, char**) { cruft::TAP::logger tap; // set aside a sizeable buffer. it has to be large enough to conceivably // satisfy a sane allocation request during testing, just in case the // underlying code actually decides to do something; we don't be touching // it ourselves. static u08 buffer[1024*1024]; // pick an alignment that isn't likely to be satisfied by any likely // underlying allocator. if the allocation fulfills this alignment then // we're probably operating correctly. static constexpr std::size_t alignment = 3; cruft::alloc::aligned::direct alloc ( cruft::make_view (buffer), alignment ); // allocate a range of values and make sure they all satisfy our alignment. // don't choose values which are likely to combine with the testing // alignment to produce a likely system alignment. eg, 3 + 5 == 8 which is // a power-of-2. uintptr_t result[4] = { reinterpret_cast(alloc.allocate ( 9).data ()), // just over a power of two reinterpret_cast(alloc.allocate ( 1).data ()), // a single byte reinterpret_cast(alloc.allocate ( 64).data ()), // a cache line reinterpret_cast(alloc.allocate (250).data ()) // multiple lines, but not a power of two }; tap.expect ( !(result[0] % alignment) && !(result[1] % alignment) && !(result[2] % alignment) && !(result[3] % alignment), "allocations make alignment of {}", alignment ); return tap.status (); }