18namespace ddc::detail {
20NpyByteOrder get_byte_order(std::size_t
const itemsize)
noexcept
23 return NpyByteOrder::not_applicable;
26 if (std::endian::native == std::endian::little) {
27 return NpyByteOrder::little_endian;
30 if (std::endian::native == std::endian::big) {
31 return NpyByteOrder::big_endian;
34 return NpyByteOrder::not_applicable;
37void write_le(std::ostream& os, std::uint16_t
const value_u16)
39 constexpr unsigned int mask = 0xFFU;
41 unsigned int const value_u = value_u16;
43 std::array<
char, 2> bytes;
44 bytes[0] = value_u & mask;
45 bytes[1] = (value_u >> 8U) & mask;
47 os.write(bytes.data(),
sizeof(value_u16));
50std::string NpyDtype::str()
const
52 return std::string(1,
static_cast<
char>(byte_order)) +
static_cast<
char>(kind)
53 + std::to_string(itemsize);
57void save_npy(std::ostream& os, NpyArrayView
const& view)
60 std::string shape_str =
"(";
61 for (std::size_t
const ext : view.shape) {
62 shape_str += std::to_string(ext);
67 std::string
const header_dict
68 = std::string(
"{'descr': '") + view.dtype.str() +
"', 'fortran_order': "
69 + (view.fortran_order ?
"True" :
"False") +
", 'shape': " + shape_str +
", }";
72 std::size_t
const non_padded_header_len = header_dict.size() + 1;
74 std::size_t
const alignment = 16;
75 std::size_t
const remainder = (6 + 1 + 1 + 2 + non_padded_header_len) % alignment;
76 std::size_t
const padding = (alignment - remainder) % alignment;
77 if (!std::in_range<std::uint16_t>(non_padded_header_len + padding)) {
78 throw std::runtime_error(
"save_npy: header too large for npy v1.0.");
80 auto const header_len =
static_cast<std::uint16_t>(non_padded_header_len + padding);
83 os.write(
"\x93NUMPY", 6);
89 write_le(os, header_len);
91 os.write(header_dict.data(), header_dict.size());
92 os.write(
" ", padding);
96 std::size_t
const n_elems
97 = std::accumulate(view.shape.begin(), view.shape.end(), 1ULL, std::multiplies<> {});
98 os.write(
reinterpret_cast<
char const*>(view.data), n_elems * view.dtype.itemsize);
101void save_npy(std::filesystem::path
const& filename, NpyArrayView
const& view)
103 std::ofstream file(filename, std::ios::binary);
104 file.exceptions(std::ios::failbit | std::ios::badbit);
106 save_npy(file, view);
The top-level namespace of DDC.