PIMapIterators refactoring
PIChunkStream some refactoring
This commit is contained in:
@@ -125,15 +125,14 @@ int PIChunkStream::read() {
|
||||
}
|
||||
|
||||
|
||||
int PIChunkStream::peekVInt(Version version_, PIByteArray * data_, int pos, PIByteArray & hdr, uint & ret) {
|
||||
int PIChunkStream::peekVInt(Version version_, uchar * data_, int sz, uint & ret) {
|
||||
switch (version_) {
|
||||
case Version_1:
|
||||
memcpy(&ret, data_->data(pos), 4);
|
||||
memcpy(&ret, data_, 4);
|
||||
return 4;
|
||||
case Version_2: {
|
||||
PIByteArray hdr(data_, piMini(4, sz));
|
||||
hdr.resize(4);
|
||||
hdr.fill(uchar(0));
|
||||
memcpy(hdr.data(), data_->data(pos), piMini(4, data_->size_s() - pos));
|
||||
uchar hsz = 0;
|
||||
ret = readVInt(hdr, &hsz);
|
||||
return hsz;
|
||||
@@ -153,13 +152,16 @@ void PIChunkStream::replaceChunk(int id, const PIByteArray & v) {
|
||||
pos.length = v.size_s();
|
||||
if (size_mod != 0) {
|
||||
auto it = data_map.makeIterator();
|
||||
while (it.next())
|
||||
if (it.valueRef().start > pos.start)
|
||||
it.valueRef().start += size_mod;
|
||||
if (size_mod > 0)
|
||||
while (it.next()) {
|
||||
if (it.value().start > pos.start) {
|
||||
it.value().start += size_mod;
|
||||
}
|
||||
}
|
||||
if (size_mod > 0) {
|
||||
data_->insert(pos.start, PIByteArray(size_mod));
|
||||
else
|
||||
} else {
|
||||
data_->remove(pos.start, -size_mod);
|
||||
}
|
||||
}
|
||||
memcpy(data_->data(pos.start - pos.size_bytes), nsba.data(), nsba.size());
|
||||
pos.start += nsba.size_s() - pos.size_bytes;
|
||||
@@ -172,10 +174,9 @@ void PIChunkStream::readAll() {
|
||||
if (!data_) return;
|
||||
int pos = 0, sz = data_->size_s(), hsz = 0;
|
||||
uint csz = 0, cid = 0;
|
||||
PIByteArray hdr;
|
||||
while (pos < sz) {
|
||||
pos += peekVInt((Version)version_, data_, pos, hdr, cid);
|
||||
hsz = peekVInt((Version)version_, data_, pos, hdr, csz);
|
||||
pos += peekVInt((Version)version_, data_->data(pos), data_->size_s() - pos, cid);
|
||||
hsz = peekVInt((Version)version_, data_->data(pos), data_->size_s() - pos, csz);
|
||||
pos += hsz;
|
||||
data_map[cid] = CacheEntry(pos, csz, hsz);
|
||||
pos += csz;
|
||||
@@ -193,8 +194,7 @@ bool PIChunkStream::extract(PIByteArray & data, bool read_all) {
|
||||
if (tmp_data.size_s() < 4) return false;
|
||||
data_ = &tmp_data;
|
||||
_init();
|
||||
if (read_all)
|
||||
readAll();
|
||||
if (read_all) readAll();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -208,19 +208,27 @@ void PIChunkStream::_init() {
|
||||
if ((v & 0x80) == 0x80) {
|
||||
v &= 0x7f;
|
||||
switch (v) {
|
||||
case 2: version_ = (uchar)Version_2; data_->pop_front(); first_byte_taken = true; break;
|
||||
default: version_ = Version_1; break;
|
||||
case 2:
|
||||
version_ = (uchar)Version_2;
|
||||
data_->pop_front();
|
||||
first_byte_taken = true;
|
||||
break;
|
||||
default:
|
||||
version_ = Version_1;
|
||||
break;
|
||||
}
|
||||
} else
|
||||
} else {
|
||||
version_ = Version_1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
uint PIChunkStream::readVInt(PIByteArray & s, uchar * bytes_cnt) {
|
||||
if (s.isEmpty()) return 0;
|
||||
uchar bytes[4]; s >> bytes[0];
|
||||
uchar abc = 0;
|
||||
uchar bytes[4];
|
||||
uchar abc;
|
||||
s >> bytes[0];
|
||||
for (abc = 0; abc < 3; ++abc) {
|
||||
uchar mask = (0x80 >> abc);
|
||||
if ((bytes[0] & mask) == mask) {
|
||||
|
||||
Reference in New Issue
Block a user