if (LIKELY(length() >= sizeof(T))) {
val = loadUnaligned<T>(data());
offset_ += sizeof(T);
+ advanceBufferIfEmpty();
} else {
pullSlow(&val, sizeof(T));
}
if (LIKELY(length() >= len)) {
str.append(reinterpret_cast<const char*>(data()), len);
offset_ += len;
+ advanceBufferIfEmpty();
} else {
readFixedStringSlow(&str, len);
}
}
skip(i);
-
- if (UNLIKELY(!tryAdvanceBuffer())) {
- throw std::out_of_range("string underflow");
- }
}
}
size_t skipAtMost(size_t len) {
if (LIKELY(length() >= len)) {
offset_ += len;
+ advanceBufferIfEmpty();
return len;
}
return skipAtMostSlow(len);
void skip(size_t len) {
if (LIKELY(length() >= len)) {
offset_ += len;
+ advanceBufferIfEmpty();
} else {
skipSlow(len);
}
if (LIKELY(length() >= len)) {
memcpy(buf, data(), len);
offset_ += len;
+ advanceBufferIfEmpty();
return len;
}
return pullAtMostSlow(buf, len);
if (LIKELY(length() >= len)) {
memcpy(buf, data(), len);
offset_ += len;
+ advanceBufferIfEmpty();
} else {
pullSlow(buf, len);
}
}
offset_ += len;
+ advanceBufferIfEmpty();
return copied + len;
}
return true;
}
+ void advanceBufferIfEmpty() {
+ if (length() == 0) {
+ tryAdvanceBuffer();
+ }
+ }
+
BufType* crtBuf_;
size_t offset_ = 0;
}
str->append(reinterpret_cast<const char*>(data()), len);
offset_ += len;
+ advanceBufferIfEmpty();
}
size_t pullAtMostSlow(void* buf, size_t len) {
}
memcpy(p, data(), len);
offset_ += len;
+ advanceBufferIfEmpty();
return copied + len;
}
len -= available;
}
offset_ += len;
+ advanceBufferIfEmpty();
return skipped + len;
}