#ifndef ALIGNSIZE_H
#define ALIGNSIZE_H

#include "UserSuffix.h" // 用到Aligin的地方通常也会用到K/M/G尾缀

/// 将size向上对齐到algin，不足的大小补齐。algin必须是2^n
/// T、T2可以为uint16_t, uint32_t， int，int64_t，size_t，不能为负数
template <typename T, typename T2>
inline void AlignUp(T &size, const T2 align){
    T odd = size & T(align-1);
    size += (odd) ? (align-odd) : 0;
}

/// 返回size向上对齐到algin的数值，不足的大小补齐。algin必须是2^n
/// T、T2可以为uint16_t, uint32_t， int，int64_t，size_t，不能为负数
template <typename T, typename T2>
inline T getAlignUp(const T size, const T2 align) {
    T odd = size & T(align - 1);
    return size + ((odd) ? (align - odd) : 0);
}

/// 将size向下对齐到algin边界，超出的余数去掉。algin必须是2^n
/// T、T2可以为uint16_t, uint32_t， int，int64_t，size_t，不能为负数
template <typename T, typename T2>
inline void AlignDown(T &size, const T2 align) {
    size -= size & T(align - 1);
}

/// 返回size向下对齐到algin的数值，不足的大小补齐。algin必须是2^n
/// T、T2可以为uint16_t, uint32_t， int，int64_t，size_t，不能为负数
template <typename T, typename T2>
inline T getAlignDown(const T size, const T2 align) {
    return size - (size & T(align - 1));
}

/// 判断size是否对齐algin。algin必须是2^n
/// T、T2可以为uint16_t, uint32_t， int，int64_t，size_t，不能为负数
template <typename T, typename T2>
inline bool isAlign(const T &size, const T2 align) {
    return (size & T(align - 1))==0;
}

#endif // ALIGNSIZE_H/
