dl
dl_stream_input.h
浏览该文件的文档.
1
12#pragma once
13
14#include <vector>
15#include <list>
16#include <map>
17#include <unordered_map>
18#include <string>
19
20#include "base/dl_concept.h"
21#include "memory/dl_buffer.h"
22#include "io/dl_log.h"
23
24
25namespace dl
26{
27
28constexpr size_t SIZE_STREAM_INPUT_CONTAINER_CHECK = 1000000;
29
32{
33public:
36
37 const std::byte* GetBuffer();
38 size_t GetSize() { return _buf.size(); }
39
40 template <IsCopyable T>
41 void Read(T* data)
42 {
43 Read(data, sizeof(T));
44 }
45 //-------------------------------------------特殊操作------------------------------------------
49 template <typename T>
50 void Read64(T* data)
51 {
52 uint64_t temp = 0;
53 Read(&temp, sizeof(uint64_t));//防止64位递归调用
54 *data = (T)temp;
55 }
56
59 template <typename T>
60 void ReadSize(T* data)
61 {
62 size_t len = 0;
63 Read64(&len);
64 data->resize(len);
65 }
66
69 void ReadCString(const char* str)
70 {
71 size_t i = 0;
72 std::byte* p = GetCurrent();
73 while ((bool)(p[i++]))
74 {
75
76 }
77 Read(p, i);
78 }
79
82 template<typename T>
83 bool StreamReadEqual(const T& v)
84 {
85 T v_read;
86 Read(&v_read);
87 return v_read == v;
88 }
89
90 //-------------------------------------------容器操作------------------------------------------
91 template <typename T>
92 void Read(std::list<T>* container)
93 {
94 size_t size = 0;
95 Read64(&size);
97 {
98 log_warn0("不合理的读取值!");
99 return;
100 }
101 container->resize(size);
102 for (auto& iter : *container)
103 {
104 Read(&iter);
105 }
106 }
107
108 template <typename T>
109 void Read(std::vector<T>* container)
110 {
111 size_t size = 0;
112 Read64(&size);
114 {
115 log_warn0("不合理的读取值!");
116 return;
117 }
118 container->resize((size_t)size);
119 for (auto& iter : *container)
120 {
121 Read(&iter);
122 }
123 }
124
125 void Read(std::string* str)
126 {
127 size_t size = 0;
128 Read64(&size);
130 {
131 log_warn0("不合理的读取值!");
132 return;
133 }
134 str->resize((size_t)size);
135 for (auto& iter : *str)
136 {
137 Read(&iter);
138 }
139 }
140
141 template <typename K, typename V>
142 void Read(std::map<K, V>* container)
143 {
144 size_t size = 0;
145 Read64(&size);
147 {
148 log_warn0("不合理的读取值!");
149 return;
150 }
151 for (size_t i = 0; i < size; ++i)
152 {
153 K key;
154 V value;
155 Read(&key);
156 Read(&value);
157 (*container)[key] = value;
158 }
159 }
160
161 template <typename K, typename V>
162 void Read(std::unordered_map<K, V>* container)
163 {
164 size_t size = 0;
165 Read64(&size);
167 {
168 log_warn0("不合理的读取值!");
169 return;
170 }
171 for (size_t i = 0; i < size; ++i)
172 {
173 K key;
174 V value;
175 Read(&key);
176 Read(&value);
177 (*container)[key] = value;
178 }
179 }
180 //----------------------------------------------------------------------------------
181
182
183 bool Read(void* data, size_t byte_count);
184
185
190 bool LoadFromFile(std::string_view path_name, bool decompress = false, size_t length = 0);
191 void LoadFromMemory(BufferView buf, bool decompress = false);
192
193 size_t GetPos() { return _head; }
194 size_t GetRemain() { return _buf.size() - _head; }
195
196 void SetPos(size_t pos);
197 std::byte* GetCurrent()
198 {
199 return _buf.data() + _head;
200 }
201
202 bool IsEnd();
203private:
204 Buffer _buf;
205 size_t _head;
206};
207
208}
void Read(std::list< T > *container)
void Read(std::unordered_map< K, V > *container)
void Read64(T *data)
写入一个类型,写为64位,用于在64位平台的大小不一致,所以特殊处理
void Read(std::string *str)
bool LoadFromFile(std::string_view path_name, bool decompress=false, size_t length=0)
从文件读到内存,可选长度
const std::byte * GetBuffer()
void Read(std::map< K, V > *container)
void ReadCString(const char *str)
写入C风格字符串
void LoadFromMemory(BufferView buf, bool decompress=false)
bool Read(void *data, size_t byte_count)
void ReadSize(T *data)
读入容器的大小,并修改容器至目标大小
void SetPos(size_t pos)
void Read(std::vector< T > *container)
bool StreamReadEqual(const T &v)
读取后判断相等
表示一段内存
用于模板限定,更好的报错信息
日志系统
constexpr size_t SIZE_STREAM_INPUT_CONTAINER_CHECK
void log_warn0(std::string_view str, DL_SOURCE_LOCATION)