1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef LATINIME_BYTE_ARRAY_VIEW_H 18 #define LATINIME_BYTE_ARRAY_VIEW_H 19 20 #include <cstdint> 21 #include <cstdlib> 22 23 #include "defines.h" 24 25 namespace latinime { 26 27 /** 28 * Helper class used to keep track of read accesses for a given memory region. 29 */ 30 class ReadOnlyByteArrayView { 31 public: ReadOnlyByteArrayView()32 ReadOnlyByteArrayView() : mPtr(nullptr), mSize(0) {} 33 ReadOnlyByteArrayView(const uint8_t * const ptr,const size_t size)34 ReadOnlyByteArrayView(const uint8_t *const ptr, const size_t size) 35 : mPtr(ptr), mSize(size) {} 36 size()37 AK_FORCE_INLINE size_t size() const { 38 return mSize; 39 } 40 data()41 AK_FORCE_INLINE const uint8_t *data() const { 42 return mPtr; 43 } 44 skip(const size_t n)45 AK_FORCE_INLINE const ReadOnlyByteArrayView skip(const size_t n) const { 46 if (mSize <= n) { 47 return ReadOnlyByteArrayView(); 48 } 49 return ReadOnlyByteArrayView(mPtr + n, mSize - n); 50 } 51 52 private: 53 DISALLOW_ASSIGNMENT_OPERATOR(ReadOnlyByteArrayView); 54 55 const uint8_t *const mPtr; 56 const size_t mSize; 57 }; 58 59 /** 60 * Helper class used to keep track of read-write accesses for a given memory region. 61 */ 62 class ReadWriteByteArrayView { 63 public: ReadWriteByteArrayView()64 ReadWriteByteArrayView() : mPtr(nullptr), mSize(0) {} 65 ReadWriteByteArrayView(uint8_t * const ptr,const size_t size)66 ReadWriteByteArrayView(uint8_t *const ptr, const size_t size) 67 : mPtr(ptr), mSize(size) {} 68 size()69 AK_FORCE_INLINE size_t size() const { 70 return mSize; 71 } 72 data()73 AK_FORCE_INLINE uint8_t *data() const { 74 return mPtr; 75 } 76 getReadOnlyView()77 AK_FORCE_INLINE ReadOnlyByteArrayView getReadOnlyView() const { 78 return ReadOnlyByteArrayView(mPtr, mSize); 79 } 80 subView(const size_t start,const size_t n)81 ReadWriteByteArrayView subView(const size_t start, const size_t n) const { 82 ASSERT(start + n <= mSize); 83 return ReadWriteByteArrayView(mPtr + start, n); 84 } 85 86 private: 87 // Default copy constructor and assignment operator are used for using this class with STL 88 // containers. 89 90 // These members cannot be const to have the assignment operator. 91 uint8_t *mPtr; 92 size_t mSize; 93 }; 94 95 } // namespace latinime 96 #endif // LATINIME_BYTE_ARRAY_VIEW_H 97