// vim:fileencoding=utf-8:foldmethod=marker

#ifndef MISC_UTILS_H
#define MISC_UTILS_H

#include "../aliases/aliases.h"

#ifdef WAPP_PLATFORM_CPP
BEGIN_C_LINKAGE
#endif // !WAPP_PLATFORM_CPP

#define KB(SIZE) (SIZE * 1024ull)
#define MB(SIZE) (KB(SIZE) * 1024)
#define GB(SIZE) (MB(SIZE) * 1024)
#define TB(SIZE) (GB(SIZE) * 1024)

#define wapp_misc_utils_padding_size(SIZE) u8 reserved_padding[sizeof(void *) - ((SIZE) % sizeof(void *))]

#define U64_RSHIFT_OR_1(X)  (((u64)X) | (((u64)X) >> 1))
#define U64_RSHIFT_OR_2(X)  (((u64)X) | (((u64)X) >> 2))
#define U64_RSHIFT_OR_4(X)  (((u64)X) | (((u64)X) >> 4))
#define U64_RSHIFT_OR_8(X)  (((u64)X) | (((u64)X) >> 8))
#define U64_RSHIFT_OR_16(X) (((u64)X) | (((u64)X) >> 16))
#define U64_RSHIFT_OR_32(X) (((u64)X) | (((u64)X) >> 32))
#define wapp_misc_utils_u64_round_up_pow2(X) ( \
  ( \
    U64_RSHIFT_OR_32( \
      U64_RSHIFT_OR_16( \
        U64_RSHIFT_OR_8( \
          U64_RSHIFT_OR_4( \
            U64_RSHIFT_OR_2( \
              U64_RSHIFT_OR_1(X - 1) \
            ) \
          ) \
        ) \
      ) \
    ) \
  ) + 1 \
)

#ifdef WAPP_PLATFORM_CPP
END_C_LINKAGE

#include <tuple>

#define wapp_misc_utils_va_args_count(T, ...) (std::tuple_size<decltype(std::make_tuple(__VA_ARGS__))>::value)
#else
#define wapp_misc_utils_va_args_count(T, ...) (sizeof((T[]){__VA_ARGS__})/sizeof(T))
#endif // !WAPP_PLATFORM_CPP

#endif // !MISC_UTILS_H
