mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-15 14:16:07 -06:00
126 lines
2.1 KiB
C++
126 lines
2.1 KiB
C++
#include "Core.h"
|
|
|
|
#define LLOG(x)
|
|
|
|
namespace Upp {
|
|
|
|
int64 NewInVectorSerial()
|
|
{
|
|
static int64 x;
|
|
INTERLOCKED {
|
|
++x;
|
|
}
|
|
return x;
|
|
}
|
|
|
|
|
|
thread_local int64 invector_cache_serial_;
|
|
thread_local int invector_cache_blki_;
|
|
thread_local int invector_cache_offset_;
|
|
thread_local int invector_cache_end_;
|
|
|
|
void SetInvectorCache__(int64 serial, int blki, int offset, int end)
|
|
{
|
|
invector_cache_serial_ = serial;
|
|
invector_cache_blki_ = blki;
|
|
invector_cache_offset_ = offset;
|
|
invector_cache_end_ = end;
|
|
}
|
|
|
|
void ClearInvectorCache__()
|
|
{
|
|
invector_cache_serial_ = 0;
|
|
}
|
|
|
|
int FindInvectorCache__(int64 serial, int& pos, int& off)
|
|
{
|
|
if(invector_cache_serial_ == serial && pos >= invector_cache_offset_ &&
|
|
pos < invector_cache_end_) {
|
|
LLOG("Found in cache, serial: " << invector_cache_serial_ << ", offset: " << invector_cache_offset_ << ", end: " << invector_cache_end_);
|
|
off = invector_cache_offset_;
|
|
pos -= off;
|
|
return invector_cache_blki_;
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
void Bits::Clear()
|
|
{
|
|
if(bp)
|
|
MemoryFree(bp);
|
|
alloc = 0;
|
|
bp = NULL;
|
|
}
|
|
|
|
void Bits::Realloc(int nalloc)
|
|
{
|
|
size_t sz = sizeof(dword) * nalloc;
|
|
dword *nbp = (dword *)MemoryAllocSz(sz);
|
|
nalloc = int(sz / sizeof(dword));
|
|
if(bp) {
|
|
Copy(nbp, bp, bp + min(alloc, nalloc));
|
|
MemoryFree(bp);
|
|
}
|
|
if(nalloc > alloc)
|
|
Fill(nbp + alloc, nbp + nalloc, (dword)0);
|
|
bp = nbp;
|
|
alloc = nalloc;
|
|
}
|
|
|
|
void Bits::Expand(int q)
|
|
{
|
|
Realloc(3 * q / 2 + 1);
|
|
}
|
|
|
|
void Bits::Reserve(int nbits)
|
|
{
|
|
int n = (nbits + 31) >> 5;
|
|
if(n > alloc)
|
|
Realloc(n);
|
|
}
|
|
|
|
int Bits::GetLast() const
|
|
{
|
|
int lasti = alloc - 1;
|
|
while(lasti > 0 && bp[lasti] == 0)
|
|
lasti--;
|
|
return lasti;
|
|
}
|
|
|
|
void Bits::Shrink()
|
|
{
|
|
int nalloc = GetLast() + 1;
|
|
if(nalloc != alloc)
|
|
Realloc(nalloc);
|
|
}
|
|
|
|
dword *Bits::CreateRaw(int n_dwords)
|
|
{
|
|
|
|
Clear();
|
|
Realloc(n_dwords);
|
|
return bp;
|
|
}
|
|
|
|
String Bits::ToString() const
|
|
{
|
|
StringBuffer ss;
|
|
for(int i = GetLast(); i >= 0; i--)
|
|
ss << FormatIntHex(bp[i]);
|
|
return String(ss);
|
|
}
|
|
|
|
void Bits::Serialize(Stream& s)
|
|
{
|
|
int dwords;
|
|
if(s.IsStoring())
|
|
dwords = GetLast() + 1;
|
|
s % dwords;
|
|
if(dwords < 0)
|
|
s.LoadError();
|
|
if(s.IsLoading())
|
|
CreateRaw(dwords);
|
|
s.SerializeRaw(bp, dwords);
|
|
}
|
|
|
|
}
|