当前位置:网站首页>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边栏推荐
- Inputstream/outputstream (input and output of file)
- The width of the picture in rich text used by wechat applet exceeds the problem
- Reading notes of Clickhouse principle analysis and Application Practice (4)
- Realize IIC data / instruction interaction with micro batg135
- Appium基础 — APPium安装(二)
- 实用的小工具指令
- R统计绘图-随机森林分类分析及物种丰度差异检验组合图
- What is Gibson's law?
- 27-31. Dependency transitivity, principle
- Tree DP
猜你喜欢

颈椎、脚气

198. House raiding

GoogleChromePortable 谷歌chrome浏览器便携版官网下载方式

Learning multi-level structural information for small organ segmentation
![[MySQL] introduction, function, creation, view, deletion and modification of database view (with exercises)](/img/03/2b37e63d0d482d5020b7421ac974cb.jpg)
[MySQL] introduction, function, creation, view, deletion and modification of database view (with exercises)

Webrtc quickly set up video call and video conference

C实现贪吃蛇小游戏

C language exercises (recursion)

QT qtablewidget table column top requirements ideas and codes

MySQL learning notes 3 - JDBC
随机推荐
List of top ten professional skills required for data science work
Mysql 45讲学习笔记(七)行锁
Overview of convolutional neural network structure optimization
Common JS tool Libraries
SQL injection SQL lab 11~22
27-31. Dependency transitivity, principle
颈椎、脚气
Mysql 45讲学习笔记(十一)字符串字段怎么加索引
【无标题】
Arcpy uses the updatelayer function to change the symbol system of the layer
24 magicaccessorimpl can access the debugging of all methods
Manually page the list (parameter list, current page, page size)
The sorting in C language realizes the number sorting method from small to large
AWT common components, FileDialog file selection box
Realize IIC data / instruction interaction with micro batg135
InputStream/OutputStream(文件的输入输出)
Arcpy 利用updatelayer函数改变图层的符号系统
ES6 modularization
Invalid revision: 3.18.1-g262b901-dirty
Dimension and format of data