Files
2026-07-13 13:27:18 +08:00

60 lines
1.9 KiB
C++

/*!
* Copyright (c) 2022-2026 Microsoft Corporation. All rights reserved.
* Copyright (c) 2022-2026 The LightGBM developers. All rights reserved.
* Licensed under the MIT License. See LICENSE file in the project root for license information.
*/
#ifndef LIGHTGBM_INCLUDE_LIGHTGBM_UTILS_BINARY_WRITER_H_
#define LIGHTGBM_INCLUDE_LIGHTGBM_UTILS_BINARY_WRITER_H_
#include <cstdlib>
#include <vector>
namespace LightGBM {
/*!
* \brief An interface for serializing binary data to a buffer
*/
struct BinaryWriter {
/*!
* \brief Append data to this binary target
* \param data Buffer to write from
* \param bytes Number of bytes to write from buffer
* \return Number of bytes written
*/
virtual size_t Write(const void* data, size_t bytes) = 0;
/*!
* \brief Append data to this binary target aligned on a given byte size boundary
* \param data Buffer to write from
* \param bytes Number of bytes to write from buffer
* \param alignment The size of bytes to align to in whole increments
* \return Number of bytes written
*/
size_t AlignedWrite(const void* data, size_t bytes, size_t alignment = 8) {
auto ret = Write(data, bytes);
if (bytes % alignment != 0) {
size_t padding = AlignedSize(bytes, alignment) - bytes;
std::vector<char> tmp(padding, 0);
ret += Write(tmp.data(), padding);
}
return ret;
}
/*!
* \brief The aligned size of a buffer length.
* \param bytes The number of bytes in a buffer
* \param alignment The size of bytes to align to in whole increments
* \return Number of aligned bytes
*/
static size_t AlignedSize(size_t bytes, size_t alignment = 8) {
if (bytes % alignment == 0) {
return bytes;
} else {
return bytes / alignment * alignment + alignment;
}
}
};
} // namespace LightGBM
#endif // LIGHTGBM_INCLUDE_LIGHTGBM_UTILS_BINARY_WRITER_H_