#pragma once
#include <cute/config.hpp>
#include <cute/numeric/numeric_types.hpp>
#include <cute/numeric/math.hpp>
namespace cute
{
template <int N>
CUTE_HOST_DEVICE constexpr
bool
is_byte_aligned(void const* const ptr)
{
static_assert(has_single_bit(N), "N must be a power of 2 in alignment check");
return (reinterpret_cast<uintptr_t>(ptr) & (N-1)) == 0;
}
#if defined(__CUDACC__)
# define CUTE_ALIGNAS(n) __align__(n)
#else
# define CUTE_ALIGNAS(n) alignas(n)
#endif
template <size_t Alignment, class Child = void>
struct aligned_struct {};
template <class Child> struct CUTE_ALIGNAS( 1) aligned_struct< 1, Child> {};
template <class Child> struct CUTE_ALIGNAS( 2) aligned_struct< 2, Child> {};
template <class Child> struct CUTE_ALIGNAS( 4) aligned_struct< 4, Child> {};
template <class Child> struct CUTE_ALIGNAS( 8) aligned_struct< 8, Child> {};
template <class Child> struct CUTE_ALIGNAS( 16) aligned_struct< 16, Child> {};
template <class Child> struct CUTE_ALIGNAS( 32) aligned_struct< 32, Child> {};
template <class Child> struct CUTE_ALIGNAS( 64) aligned_struct< 64, Child> {};
template <class Child> struct CUTE_ALIGNAS(128) aligned_struct<128, Child> {};
template <class Child> struct CUTE_ALIGNAS(256) aligned_struct<256, Child> {};
}