| 171 | ////////////////////////////////////////////////////////////////////////// |
| 172 | |
| 173 | uint8* CvStreamReader::GetTempPtr(int offset, int size, bool mayRecurse, bool* madeCopy) |
| 174 | { |
| 175 | int pageStart = offset >> mPageBits; |
| 176 | int pageEnd = (offset + size - 1) >> mPageBits; |
| 177 | |
| 178 | if (pageStart >= pageEnd) |
| 179 | return mStreamPtrs.mVals[pageStart] + (offset & ((1<<mPageBits) - 1)); |
| 180 | |
| 181 | // Handle the relatively-rare case of spanning multiple pages |
| 182 | if (madeCopy != NULL) |
| 183 | *madeCopy = true; |
| 184 | |
| 185 | uint8* destPtr; |
| 186 | if (mayRecurse) |
| 187 | { |
| 188 | if (mCOFF->mTempBufIdx >= mCOFF->mTempBufs.size()) |
| 189 | mCOFF->mTempBufs.push_back(Array<uint8>()); |
| 190 | auto& arr = mCOFF->mTempBufs[mCOFF->mTempBufIdx++]; |
| 191 | if (arr.size() < size) |
| 192 | arr.Resize(size); |
| 193 | destPtr = arr.mVals; |
| 194 | } |
| 195 | else |
| 196 | { |
| 197 | if (mTempData.size() < size) |
| 198 | mTempData.Resize(size); |
| 199 | destPtr = mTempData.mVals; |
| 200 | } |
| 201 | |
| 202 | uint8* dest = destPtr; |
| 203 | while (size > 0) |
| 204 | { |
| 205 | int copyPage = offset >> mPageBits; |
| 206 | int pageOffset = offset & ((1 << mPageBits) - 1); |
| 207 | int copyBytes = BF_MIN(mCOFF->mCvPageSize - pageOffset, size); |
| 208 | memcpy(destPtr, mStreamPtrs.mVals[copyPage] + pageOffset, copyBytes); |
| 209 | destPtr += copyBytes; |
| 210 | offset += copyBytes; |
| 211 | size -= copyBytes; |
| 212 | } |
| 213 | return dest; |
| 214 | } |
| 215 | |
| 216 | uint8* CvStreamReader::GetPermanentPtr(int offset, int size, bool* madeCopy) |
| 217 | { |
no test coverage detected