| 195 | } |
| 196 | |
| 197 | void Build() { |
| 198 | buffer_->resize(GetSize()); |
| 199 | char* cbuffer = reinterpret_cast<char*>(&((*buffer_)[0])); |
| 200 | if (col_cnt_ - modify_times_ >= 128) { |
| 201 | if (modify_times_ > 0) { |
| 202 | uint16_t modify_count = (uint16_t)(modify_times_ | 0x8000); |
| 203 | memcpy(cbuffer, static_cast<const void*>(&modify_count), 2); |
| 204 | } else { |
| 205 | memcpy(cbuffer, static_cast<const void*>(&col_cnt_), 2); |
| 206 | } |
| 207 | memrev16ifbe(static_cast<void*>(cbuffer)); |
| 208 | cbuffer += 2; |
| 209 | } else { |
| 210 | if (modify_times_ > 0) { |
| 211 | uint8_t modify_count = (uint8_t)(modify_times_ | 0x80); |
| 212 | memcpy(cbuffer, static_cast<const void*>(&modify_count), 1); |
| 213 | } else { |
| 214 | uint8_t col_cnt_tmp = (uint8_t)col_cnt_; |
| 215 | memcpy(cbuffer, static_cast<const void*>(&col_cnt_tmp), 1); |
| 216 | } |
| 217 | cbuffer += 1; |
| 218 | } |
| 219 | std::vector<Column>::iterator it = datas_.begin(); |
| 220 | for (; it != datas_.end(); ++it) { |
| 221 | Column& col = *it; |
| 222 | memcpy(cbuffer, static_cast<const void*>(&col.type), 1); |
| 223 | cbuffer += 1; |
| 224 | uint16_t buffer_size = (uint16_t)col.buffer.size(); |
| 225 | if (buffer_size < 128) { |
| 226 | uint8_t size_value = (uint8_t)buffer_size; |
| 227 | memcpy(cbuffer, static_cast<const void*>(&size_value), 1); |
| 228 | cbuffer += 1; |
| 229 | } else { |
| 230 | uint8_t first_value = (uint8_t)(buffer_size >> 8 | 0x80); |
| 231 | uint8_t second_value = (uint8_t)(buffer_size & 0xFF); |
| 232 | memcpy(cbuffer, static_cast<const void*>(&first_value), 1); |
| 233 | cbuffer += 1; |
| 234 | memcpy(cbuffer, static_cast<const void*>(&second_value), 1); |
| 235 | cbuffer += 1; |
| 236 | } |
| 237 | if (!col.buffer.empty()) { |
| 238 | memcpy(cbuffer, static_cast<const void*>(col.buffer.c_str()), |
| 239 | col.buffer.size()); |
| 240 | } |
| 241 | cbuffer += col.buffer.size(); |
| 242 | } |
| 243 | } |
| 244 | |
| 245 | private: |
| 246 | uint32_t GetSize() { |