当前位置:网站首页>tars源码分析之4
tars源码分析之4
2022-07-04 06:33:00 【涛歌依旧】
基础buffer的实现,也很简单,大致看看:
#include "util/tc_buffer.h"
#include <iostream>
#include <algorithm>
#include <limits>
#include <cassert>
inline static std::size_t RoundUp2Power(std::size_t size)
{
if (size == 0)
return 0;
std::size_t roundUp = 1;
while (roundUp < size)
roundUp *= 2;
return roundUp;
}
namespace tars
{
const std::size_t TC_Buffer::kMaxBufferSize = std::numeric_limits<std::size_t>::max() / 2;
const std::size_t TC_Buffer::kDefaultSize = 128;
std::size_t TC_Buffer::PushData(const void* data, std::size_t size)
{
if (!data || size == 0)
return 0;
if (ReadableSize() + size >= kMaxBufferSize)
return 0; // overflow
AssureSpace(size);
::memcpy(&_buffer[_writePos], data, size);
Produce(size);
return size;
}
std::size_t TC_Buffer::PopData(void* buf, std::size_t size)
{
const std::size_t dataSize = ReadableSize();
if (!buf ||
size == 0 ||
dataSize == 0)
return 0;
if (size > dataSize)
size = dataSize; // truncate
::memcpy(buf, &_buffer[_readPos], size);
Consume(size);
return size;
}
void TC_Buffer::PeekData(void*& buf, std::size_t& size)
{
buf = ReadAddr();
size = ReadableSize();
}
void TC_Buffer::Consume(std::size_t bytes)
{
assert (_readPos + bytes <= _writePos);
_readPos += bytes;
if (IsEmpty())
Clear();
}
void TC_Buffer::AssureSpace(std::size_t needsize)
{
if (WritableSize() >= needsize)
return;
const size_t dataSize = ReadableSize();
const size_t oldCap = _capacity;
while (WritableSize() + _readPos < needsize)
{
if (_capacity < kDefaultSize)
{
_capacity = kDefaultSize;
}
else if (_capacity <= kMaxBufferSize)
{
const size_t newCapcity = RoundUp2Power(_capacity);
if (_capacity < newCapcity)
_capacity = newCapcity;
else
_capacity = 2 * newCapcity;
}
else
{
assert(false);
}
}
if (oldCap < _capacity)
{
char* tmp(new char[_capacity]);
if (dataSize != 0)
memcpy(&tmp[0], &_buffer[_readPos], dataSize);
ResetBuffer(tmp);
}
else
{
assert (_readPos > 0);
::memmove(&_buffer[0], &_buffer[_readPos], dataSize);
}
_readPos = 0;
_writePos = dataSize;
assert (needsize <= WritableSize());
}
void TC_Buffer::Shrink()
{
if (IsEmpty())
{
Clear();
_capacity = 0;
ResetBuffer();
return;
}
if (_capacity <= kDefaultSize)
return;
std::size_t oldCap = _capacity;
std::size_t dataSize = ReadableSize();
if (dataSize * 100 > oldCap * _highWaterPercent)
return;
std::size_t newCap = RoundUp2Power(dataSize);
char* tmp(new char[newCap]);
memcpy(&tmp[0], &_buffer[_readPos], dataSize);
ResetBuffer(tmp);
_capacity = newCap;
_readPos = 0;
_writePos = dataSize;
}
void TC_Buffer::Clear()
{
_readPos = _writePos = 0;
}
void TC_Buffer::Swap(TC_Buffer& buf)
{
std::swap(_readPos, buf._readPos);
std::swap(_writePos, buf._writePos);
std::swap(_capacity, buf._capacity);
std::swap(_buffer, buf._buffer);
}
void TC_Buffer::ResetBuffer(void* ptr)
{
delete[] _buffer;
_buffer = reinterpret_cast<char*>(ptr);
}
void TC_Buffer::SetHighWaterPercent(size_t percents)
{
if (percents < 10 || percents >= 100)
return;
_highWaterPercent = percents;
}
} // end namespace tars
边栏推荐
- [number theory] fast power (Euler power)
- Uniapp custom environment variables
- How to help others effectively
- P26-P34 third_ template
- AWT common components, FileDialog file selection box
- 颈椎、脚气
- Appium foundation - appium installation (II)
- Functions in C language (detailed explanation)
- What is the sheji principle?
- 2022.7.3-----leetcode.556
猜你喜欢
SQL join, left join, right join usage
JSON Web Token----JWT和传统session登录认证对比
How to realize multi account login of video platform members
【无标题】
JSON Web Token----JWT和傳統session登錄認證對比
GoogleChromePortable 谷歌chrome浏览器便携版官网下载方式
uniapp 自定義環境變量
MySQL installation and configuration
2022 where to find enterprise e-mail and which is the security of enterprise e-mail system?
How to avoid JVM memory leakage?
随机推荐
Lightroom import picture gray / Black rectangular multi display
746. Climb stairs with minimum cost
2022 where to find enterprise e-mail and which is the security of enterprise e-mail system?
微信小程序使用rich-text中图片宽度超出问题
Webrtc quickly set up video call and video conference
JSON Web Token----JWT和传统session登录认证对比
Considerations for testing a website
Invalid bound statement (not found): com. example. mapper. TblUserRecordMapper. login
Practical gadget instructions
STM32 单片机ADC 电压计算
C實現貪吃蛇小遊戲
运算符<< >>傻瓜式测试用例
Stc8h development (XII): I2C drive AT24C08, at24c32 series EEPROM storage
QT 获取随机颜色值设置label背景色 代码
Learning multi-level structural information for small organ segmentation
STC8H开发(十二): I2C驱动AT24C08,AT24C32系列EEPROM存储
AWT introduction
2022.7.2-----leetcode. eight hundred and seventy-one
2022.7.3-----leetcode. five hundred and fifty-six
Manually page the list (parameter list, current page, page size)