void NetMessage::MakeSpace(size_t size) { if (Writeable() + Prependable() < size) { if (!IsDynamic()) { SetDynamic(); } dynamic_data_->resize(writer_pos_ + size); } else { const size_t readable_size = Readable(); if (!IsDynamic()) { memcpy(static_data_.data(), static_data_.data() + reader_pos_, readable_size); } else { memcpy(dynamic_data_->data(), dynamic_data_->data() + reader_pos_, readable_size); } reader_pos_ = 0; writer_pos_ = readable_size; assert(readable_size == Readable()); } }
void NetMessage::Retrieve(size_t size) { assert(Readable() >= size); if (Readable() > size) { reader_pos_ += size; } else { RetrieveAll(); } }
void NetMessage::SetDynamic() { assert(!IsDynamic()); if (IsDynamic()) { return; } const size_t content_size = Readable(); dynamic_data_ = std::make_unique<DynamicVector>(content_size); dynamic_data_->insert(dynamic_data_->begin(), static_data_.begin() + reader_pos_, static_data_.begin() + writer_pos_); reader_pos_ = 0; writer_pos_ = content_size; assert(content_size == Readable()); }
std::string NetMessage::ReadString() { assert(Readable() > 0); const uint8_t *eos = Data(); while (*eos++); size_t lenght = eos - Data() - 1; assert(Readable() >= lenght); std::string value; if (lenght > 0) { value.resize(lenght); memcpy(const_cast<char *>(value.data()), Data(), lenght); Retrieve(lenght); } return value; }
uint64_t NetMessage::ReadUInt64() { assert(Readable() >= sizeof(uint64_t)); uint64_t value = 0; memcpy(&value, Data(), sizeof(uint64_t)); Retrieve(sizeof(uint64_t)); return value; }
int32_t NetMessage::ReadInt32() { assert(Readable() >= sizeof(int32_t)); int32_t value = 0; memcpy(&value, Data(), sizeof(int32_t)); Retrieve(sizeof(int32_t)); return value; }
std::string NetMessage::ReadLenghtAndString() { assert(Readable() >= sizeof(uint32_t)); uint32_t lenght = 0; memcpy(&lenght, Data(), sizeof(uint32_t)); Retrieve(sizeof(uint32_t)); std::string value; if (lenght > 0) { value.resize(lenght); memcpy(const_cast<char *>(value.data()), Data(), lenght); Retrieve(lenght); } return value; }
inline void DiscardReadedBytes() { if (m_read_idx > 0) { if (Readable()) { size_t tmp = ReadableBytes(); memmove(m_buffer, m_buffer + m_read_idx, tmp); m_read_idx = 0; m_write_idx = tmp; } else { m_read_idx = m_write_idx = 0; } } }
bool MsgBuffer::Pop(VCI_CAN_OBJ& msgpg) { if(Readable())//是否有包可读 { EnterCriticalSection(&m_section); if (pReadIndex > (VCI_CAN_OBJ*)m_buf + sizeof(m_buf)/sizeof(VCI_CAN_OBJ)) { pReadIndex = (VCI_CAN_OBJ*)m_buf; msgpg = *pReadIndex; pReadIndex++; } else { msgpg = *pReadIndex; pReadIndex++; } LeaveCriticalSection(&m_section); return true; } return false; }
inline size_t ReadableBytes() { return Readable() ? m_write_idx - m_read_idx : 0; }