Skip to content
Snippets Groups Projects
Commit f78eb27c authored by Keisuke Kuroyanagi's avatar Keisuke Kuroyanagi Committed by Android (Google) Code Review
Browse files

Merge "Refactoring checkAndPrepareWriting." into lmp-dev

parents 5a289ed2 6810e8df
No related branches found
No related tags found
No related merge requests found
...@@ -107,27 +107,37 @@ bool BufferWithExtendableBuffer::extendBuffer() { ...@@ -107,27 +107,37 @@ bool BufferWithExtendableBuffer::extendBuffer() {
} }
bool BufferWithExtendableBuffer::checkAndPrepareWriting(const int pos, const int size) { bool BufferWithExtendableBuffer::checkAndPrepareWriting(const int pos, const int size) {
if (isInAdditionalBuffer(pos)) { if (pos < 0 || size < 0) {
const int tailPosition = getTailPosition(); // Invalid position or size.
if (pos == tailPosition) { return false;
// Append data to the tail. }
if (pos + size > static_cast<int>(mAdditionalBuffer.size()) + mOriginalBufferSize) { const size_t totalRequiredSize = static_cast<size_t>(pos + size);
// Need to extend buffer. if (!isInAdditionalBuffer(pos)) {
if (!extendBuffer()) { // Here don't need to care about the additional buffer.
return false; if (static_cast<size_t>(mOriginalBufferSize) < totalRequiredSize) {
} // Violate the boundary.
}
mUsedAdditionalBufferSize += size;
} else if (pos + size > tailPosition) {
// The access will beyond the tail of used region.
return false;
}
} else {
if (pos < 0 || mOriginalBufferSize < pos + size) {
// Invalid position or violate the boundary.
return false; return false;
} }
// The buffer has sufficient capacity.
return true;
}
// Hereafter, pos is in the additional buffer.
const size_t tailPosition = static_cast<size_t>(getTailPosition());
if (totalRequiredSize <= tailPosition) {
// The buffer has sufficient capacity.
return true;
}
if (static_cast<size_t>(pos) != tailPosition) {
// The additional buffer must be extended from the tail position.
return false;
}
const size_t extendSize = totalRequiredSize -
std::min(mAdditionalBuffer.size() + mOriginalBufferSize, totalRequiredSize);
if (extendSize > 0 && !extendBuffer()) {
// Failed to extend the buffer.
return false;
} }
mUsedAdditionalBufferSize += size;
return true; return true;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment