예제 #1
0
	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());
		}
	}
예제 #2
0
	void NetMessage::Retrieve(size_t size)
	{
		assert(Readable() >= size);
		if (Readable() > size)
		{
			reader_pos_ += size;
		}
		else
		{
			RetrieveAll();
		}
	}
예제 #3
0
	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());
	}
예제 #4
0
	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;
	}
예제 #5
0
	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;
	}
예제 #6
0
	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;
	}
예제 #7
0
	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;
	}
예제 #8
0
파일: buffer.hpp 프로젝트: dawnbreaks/arch
				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;
						}
					}
				}
예제 #9
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;
}
예제 #10
0
파일: buffer.hpp 프로젝트: dawnbreaks/arch
				inline size_t ReadableBytes()
				{
					return Readable() ? m_write_idx - m_read_idx : 0;
				}