start buffer test
This commit is contained in:
parent
96febb88ec
commit
b05cf56b1a
58
Buffer.cc
58
Buffer.cc
|
@ -2,6 +2,7 @@
|
||||||
// Created by kyle on 2023-10-09.
|
// Created by kyle on 2023-10-09.
|
||||||
//
|
//
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include "Buffer.h"
|
#include "Buffer.h"
|
||||||
|
|
||||||
|
@ -12,6 +13,26 @@ constexpr size_t defaultCapacity = 32;
|
||||||
constexpr size_t maxReasonableLine = 8192;
|
constexpr size_t maxReasonableLine = 8192;
|
||||||
|
|
||||||
|
|
||||||
|
static size_t
|
||||||
|
nearestPower(size_t x)
|
||||||
|
{
|
||||||
|
if (x == 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
x--;
|
||||||
|
|
||||||
|
x |= x >> 1;
|
||||||
|
x |= x >> 2;
|
||||||
|
x |= x >> 4;
|
||||||
|
x |= x >> 8;
|
||||||
|
x |= x >> 16;
|
||||||
|
x |= x >> 32;
|
||||||
|
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Buffer::Buffer()
|
Buffer::Buffer()
|
||||||
: contents(nullptr), length(0), capacity(0)
|
: contents(nullptr), length(0), capacity(0)
|
||||||
{
|
{
|
||||||
|
@ -31,16 +52,10 @@ Buffer::Buffer(const char *data)
|
||||||
{
|
{
|
||||||
size_t datalen = strnlen(data, maxReasonableLine);
|
size_t datalen = strnlen(data, maxReasonableLine);
|
||||||
|
|
||||||
this->Append(data, datalen);
|
this->Append((uint8_t *)data, datalen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint8_t *
|
|
||||||
Buffer::Contents()
|
|
||||||
{
|
|
||||||
return this->contents;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Buffer::Append(uint8_t *data, size_t datalen)
|
Buffer::Append(uint8_t *data, size_t datalen)
|
||||||
{
|
{
|
||||||
|
@ -68,11 +83,6 @@ Buffer::Insert(size_t index, uint8_t *data, size_t datalen)
|
||||||
{
|
{
|
||||||
auto resized = this->shift(index, datalen);
|
auto resized = this->shift(index, datalen);
|
||||||
|
|
||||||
if (newCap > 0) {
|
|
||||||
this->Resize(newCap);
|
|
||||||
resized = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(this->contents + index, data, datalen);
|
memcpy(this->contents + index, data, datalen);
|
||||||
return resized;
|
return resized;
|
||||||
}
|
}
|
||||||
|
@ -83,11 +93,6 @@ Buffer::Insert(size_t index, uint8_t c)
|
||||||
return this->Insert(index, &c, 1);
|
return this->Insert(index, &c, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t
|
|
||||||
Buffer::Size()
|
|
||||||
{
|
|
||||||
return this->length;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Buffer::Resize(size_t newCapacity)
|
Buffer::Resize(size_t newCapacity)
|
||||||
|
@ -113,11 +118,16 @@ Buffer::Resize(size_t newCapacity)
|
||||||
size_t
|
size_t
|
||||||
Buffer::Trim()
|
Buffer::Trim()
|
||||||
{
|
{
|
||||||
size_t projectedCapacity = this->capacity * 2;
|
size_t projectedCapacity = nearestPower(this->length);
|
||||||
|
|
||||||
|
assert(projectedCapacity >= length);
|
||||||
|
|
||||||
if (projectedCapacity < this->capacity) {
|
if (projectedCapacity < this->capacity) {
|
||||||
this->Resize(projectedCapacity);
|
this->Resize(projectedCapacity);
|
||||||
|
return this->Capacity();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -143,20 +153,12 @@ Buffer::mustGrow(size_t delta)
|
||||||
}
|
}
|
||||||
|
|
||||||
auto newCapacity = delta + this->length;
|
auto newCapacity = delta + this->length;
|
||||||
newCapacity--;
|
return nearestPower(newCapacity);
|
||||||
|
|
||||||
newCapacity |= newCapacity >> 1;
|
|
||||||
newCapacity |= newCapacity >> 2;
|
|
||||||
newCapacity |= newCapacity >> 4;
|
|
||||||
newCapacity |= newCapacity >> 8;
|
|
||||||
newCapacity |= newCapacity >> 16;
|
|
||||||
newCapacity |= newCapacity >> 32;
|
|
||||||
return newCapacity;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Buffer:shift(size_t offset, size_t delta)
|
Buffer::shift(size_t offset, size_t delta)
|
||||||
{
|
{
|
||||||
auto resized = false;
|
auto resized = false;
|
||||||
auto newCap = this->mustGrow(delta);
|
auto newCap = this->mustGrow(delta);
|
||||||
|
|
4
Buffer.h
4
Buffer.h
|
@ -18,7 +18,7 @@ public:
|
||||||
Buffer(const char *);
|
Buffer(const char *);
|
||||||
|
|
||||||
uint8_t *Contents() { return this->contents; }
|
uint8_t *Contents() { return this->contents; }
|
||||||
size_t Size() { return this->size; };
|
size_t Size() { return this->length; };
|
||||||
size_t Capacity() { return this->capacity; }
|
size_t Capacity() { return this->capacity; }
|
||||||
|
|
||||||
bool Append(uint8_t *data, size_t datalen);
|
bool Append(uint8_t *data, size_t datalen);
|
||||||
|
@ -35,7 +35,7 @@ public:
|
||||||
void Reclaim();
|
void Reclaim();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool mustGrow(size_t delta);
|
size_t mustGrow(size_t delta);
|
||||||
bool shift(size_t offset, size_t delta);
|
bool shift(size_t offset, size_t delta);
|
||||||
|
|
||||||
uint8_t *contents;
|
uint8_t *contents;
|
||||||
|
|
|
@ -6,7 +6,11 @@
|
||||||
int
|
int
|
||||||
main()
|
main()
|
||||||
{
|
{
|
||||||
Buffer buffer("hlo, world");
|
kge::Buffer buffer("hlo, world");
|
||||||
|
|
||||||
|
std::cout << buffer.Contents() << std::endl;
|
||||||
|
|
||||||
|
buffer.Insert(1, (uint8_t *)"el", 2);
|
||||||
|
|
||||||
std::cout << buffer.Contents() << std::endl;
|
std::cout << buffer.Contents() << std::endl;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue