ultimatepp/uppsrc/Core/Vcont.cpp

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);
}
}