当前位置:网站首页>Tar source code analysis 4
Tar source code analysis 4
2022-07-04 06:37:00 【Tao song remains the same】
Basics buffer The implementation of the , It's also very simple. , Take a general look at :
#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边栏推荐
- tars源码分析之3
- Download kicad on Alibaba cloud image station
- The width of the picture in rich text used by wechat applet exceeds the problem
- ADC voltage calculation of STM32 single chip microcomputer
- 实用的小工具指令
- 颈椎、脚气
- 2022 where to find enterprise e-mail and which is the security of enterprise e-mail system?
- Webrtc quickly set up video call and video conference
- [March 3, 2019] MAC starts redis
- Can the out of sequence message complete TCP three handshakes
猜你喜欢

C réaliser des jeux de serpents gourmands

17-18. Dependency scope and life cycle plug-ins

颈椎、脚气

Error CVC complex type 2.4. a: Invalid content beginning with element 'base extension' was found. Should start with one of '{layoutlib}'.

SQL join, left join, right join usage

雲原生——上雲必讀之SSH篇(常用於遠程登錄雲服務器)

Reading notes of Clickhouse principle analysis and Application Practice (4)

MySQL installation and configuration

C實現貪吃蛇小遊戲

Cloud native - SSH article that must be read on the cloud (commonly used for remote login to ECS)
随机推荐
What is the sheji principle?
Internet of things protocol ZigBee ZigBee module uses the concept of protocol stack
tars源码分析之1
Overview of convolutional neural network structure optimization
2022.7.2-----leetcode. eight hundred and seventy-one
Considerations for testing a website
微信小程序使用rich-text中图片宽度超出问题
The width of the picture in rich text used by wechat applet exceeds the problem
运算符<< >>傻瓜式测试用例
[Android reverse] function interception (CPU cache mechanism | CPU cache mechanism causes function interception failure)
8. Factory method
Functions in C language (detailed explanation)
ADC voltage calculation of STM32 single chip microcomputer
Common JS tool Libraries
Error CVC complex type 2.4. a: Invalid content beginning with element 'base extension' was found. Should start with one of '{layoutlib}'.
CORS is not intended to protect API endpoints - nikofischer
Can the out of sequence message complete TCP three handshakes
Learn about the Internet of things protocol WiFi ZigBee Bluetooth, etc. --- WiFi and WiFi protocols start from WiFi. What do we need to know about WiFi protocol itself?
Appium基础 — APPium安装(二)
Displaying currency in Indian numbering format