aboutsummaryrefslogtreecommitdiffstats
path: root/native
diff options
context:
space:
mode:
authorKeisuke Kuroyanagi <ksk@google.com>2014-07-23 11:54:36 +0900
committerKeisuke Kuroyanagi <ksk@google.com>2014-07-24 10:24:42 +0900
commit6810e8df1ef7cdc37869f43a91f52695a1db8f0c (patch)
tree53ddf8b349ef1d20b0f3b6f012ac4f6dc8485531 /native
parent3f513f107ef0754da2b1c704167325151ce9b7ea (diff)
downloadlatinime-6810e8df1ef7cdc37869f43a91f52695a1db8f0c.tar.gz
latinime-6810e8df1ef7cdc37869f43a91f52695a1db8f0c.tar.xz
latinime-6810e8df1ef7cdc37869f43a91f52695a1db8f0c.zip
Refactoring checkAndPrepareWriting.
Bug: 14425059 Change-Id: I98940f3841a6c61b0482440b4da21f415dc843f6
Diffstat (limited to 'native')
-rw-r--r--native/jni/src/suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.cpp46
1 files changed, 28 insertions, 18 deletions
diff --git a/native/jni/src/suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.cpp b/native/jni/src/suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.cpp
index 259dae4c6..6e88bed9e 100644
--- a/native/jni/src/suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.cpp
+++ b/native/jni/src/suggest/policyimpl/dictionary/utils/buffer_with_extendable_buffer.cpp
@@ -107,27 +107,37 @@ bool BufferWithExtendableBuffer::extendBuffer() {
}
bool BufferWithExtendableBuffer::checkAndPrepareWriting(const int pos, const int size) {
- if (isInAdditionalBuffer(pos)) {
- const int tailPosition = getTailPosition();
- if (pos == tailPosition) {
- // Append data to the tail.
- if (pos + size > static_cast<int>(mAdditionalBuffer.size()) + mOriginalBufferSize) {
- // Need to extend buffer.
- if (!extendBuffer()) {
- return false;
- }
- }
- 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.
+ if (pos < 0 || size < 0) {
+ // Invalid position or size.
+ return false;
+ }
+ const size_t totalRequiredSize = static_cast<size_t>(pos + size);
+ if (!isInAdditionalBuffer(pos)) {
+ // Here don't need to care about the additional buffer.
+ if (static_cast<size_t>(mOriginalBufferSize) < totalRequiredSize) {
+ // Violate the boundary.
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;
}