Centipede 0.0.1
Centipede program
Loading...
Searching...
No Matches
binary.cpp
1#include "binary.hpp"
2#include "centipede/util/error_types.hpp"
3#include "centipede/util/return_types.hpp"
4#include <cassert>
5#include <cstddef>
6#include <cstdint>
7#include <cstdio>
8#include <expected>
9#include <fstream>
10#include <ios>
11#include <vector>
12
14{
15
16 namespace
17 {
18 template <typename T>
19 inline auto write_to_file(std::ofstream& output_file, const T& data)
20 {
21 const auto write_size = sizeof(T);
22 // NOLINTBEGIN (cppcoreguidelines-pro-type-reinterpret-cast)
23 output_file.write(reinterpret_cast<const char*>(&data), static_cast<std::streamsize>(write_size));
24 // NOLINTEND (cppcoreguidelines-pro-type-reinterpret-cast)
25 return write_size;
26 }
27
28 template <typename T>
29 inline auto write_to_file(std::ofstream& output_file, const std::vector<T>& data)
30 {
31 const auto write_size = sizeof(T) * data.size();
32 // NOLINTBEGIN (cppcoreguidelines-pro-type-reinterpret-cast)
33 output_file.write(reinterpret_cast<const char*>(data.data()), static_cast<std::streamsize>(write_size));
34 // NOLINTEND (cppcoreguidelines-pro-type-reinterpret-cast)
35 return write_size;
36 }
37 } // namespace
38
39 auto Binary::fill_entrypoint_to_buffer(BufferPoint buffer_point, bool has_check_value) -> bool
40 {
41 if ((not has_check_value) or buffer_point.second != 0)
42 {
43 data_buffer_.first.push_back(buffer_point.first);
44 data_buffer_.second.push_back(buffer_point.second);
45 return true;
46 }
47 return false;
48 }
49
51 {
52 data_buffer_.first.reserve(config_.max_bufferpoint_size);
53 data_buffer_.second.reserve(config_.max_bufferpoint_size);
54 reset();
55 output_file_.open(config_.out_filename, std::ios::binary | std::ios::out | std::ios::trunc);
56 if (!output_file_.is_open())
57 {
58 return std::unexpected{ ErrorCode::writer_file_fail_to_open };
59 }
60 return {};
61 }
62
64 {
65 assert(data_buffer_.first.size() == data_buffer_.second.size());
66 if (data_buffer_.first.empty())
67 {
68 return std::unexpected{ ErrorCode::writer_uninitialized };
69 }
70 if (not has_entry_)
71 {
72 return 0;
73 }
74 auto written_size = write_to_binary();
75 reset();
76 return written_size;
77 }
78
79 auto Binary::write_to_binary() -> std::size_t
80 {
81 assert(data_buffer_.first.size() == data_buffer_.second.size());
82 const auto data_size = static_cast<uint32_t>((data_buffer_.first.size()) + (data_buffer_.second.size()));
83 auto total_written_size = std::size_t{ 0 };
84 total_written_size += write_to_file(output_file_, data_size);
85 total_written_size += write_to_file(output_file_, data_buffer_.second);
86 total_written_size += write_to_file(output_file_, data_buffer_.first);
87 return total_written_size;
88 }
89
90 void Binary::resize_data_buffer(std::size_t size)
91 {
92 assert(size <= data_buffer_.first.size());
93 assert(data_buffer_.first.size() == data_buffer_.second.size());
94
95 data_buffer_.first.resize(size);
96 data_buffer_.second.resize(size);
97 }
98
99 void Binary::reset()
100 {
101 data_buffer_.first.resize(1, 0);
102 data_buffer_.second.resize(1, 0.F);
103 has_entry_ = false;
104 }
105
106 auto Binary::check_buffer_size(std::size_t size_to_add) const -> bool
107 {
108 return data_buffer_.first.size() + size_to_add < config_.max_bufferpoint_size;
109 }
110} // namespace centipede::writer
auto init() -> EnumError<>
Initialization.
Definition binary.cpp:50
auto write_current_entry() -> EnumError< std::size_t >
Streaming an entry data to the output file.
Definition binary.cpp:63
BufferType data_buffer_
Data buffer to store entry_point.
Definition binary.hpp:172
Config config_
Member variable for the configuration.
Definition binary.hpp:171
std::ofstream output_file_
Output file handler.
Definition binary.hpp:173
@ writer_uninitialized
Write is not initialized.
@ writer_file_fail_to_open
File failed to be open.
std::expected< T, ErrorCode > EnumError
Template alias for expected return values.