当前位置:网站首页>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边栏推荐
- [number theory] fast power (Euler power)
- Summary of leetcode BFS question brushing
- Sort list tool class, which can sort strings
- [backpack DP] backpack problem
- What is a spotlight effect?
- Which water in the environment needs water quality monitoring
- Shopping malls, storerooms, flat display, user-defined maps can also be played like this!
- Average two numbers
- Invalid revision: 3.18.1-g262b901-dirty
- STM32 单片机ADC 电压计算
猜你喜欢

The solution of win11 taskbar right click without Task Manager - add win11 taskbar right click function

Learning multi-level structural information for small organ segmentation

Native Cloud - SSH articles must be read on Cloud (used for Remote Login to Cloud Server)

P26-P34 third_ template

Detailed explanation of common APIs for component and container containers: frame, panel, scrollpane

C language - Blue Bridge Cup - Snake filling

27-31. Dependency transitivity, principle

雲原生——上雲必讀之SSH篇(常用於遠程登錄雲服務器)
![[problem record] 03 connect to MySQL database prompt: 1040 too many connections](/img/bb/4d8d202cf5c6e556bc860a734e5934.png)
[problem record] 03 connect to MySQL database prompt: 1040 too many connections

QT get random color value and set label background color code
随机推荐
金盾视频播放器拦截的软件关键词和进程信息
C réaliser des jeux de serpents gourmands
Native Cloud - SSH articles must be read on Cloud (used for Remote Login to Cloud Server)
[number theory] fast power (Euler power)
运算符<< >>傻瓜式测试用例
Is the insurance annuity product worth buying? Is there a hole?
Arcpy 利用updatelayer函数改变图层的符号系统
Mysql 45讲学习笔记(十一)字符串字段怎么加索引
C realize Snake games
ADC voltage calculation of STM32 single chip microcomputer
tars源码分析之10
Tree DP
CORS is not intended to protect API endpoints - nikofischer
树形dp
C language - Blue Bridge Cup - Snake filling
Arcpy uses the updatelayer function to change the symbol system of the layer
[March 3, 2019] MAC starts redis
746. Climb stairs with minimum cost
AWT common components, FileDialog file selection box
Notes and notes