| // Copyright 2015 Google Inc. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| // |
| //////////////////////////////////////////////////////////////////////////////// |
| // |
| // LRU cache decorator for binary_parse::PagedByteArray subclasses. |
| |
| #ifndef PIEX_BINARY_PARSE_CACHED_PAGED_BYTE_ARRAY_H_ |
| #define PIEX_BINARY_PARSE_CACHED_PAGED_BYTE_ARRAY_H_ |
| |
| #include <mutex> |
| #include <vector> |
| |
| #if !defined(WIN32_LEAN_AND_MEAN) |
| #define WIN32_LEAN_AND_MEAN |
| #endif |
| #include "src/binary_parse/range_checked_byte_ptr.h" |
| |
| namespace piex { |
| namespace binary_parse { |
| |
| class CachedPagedByteArray : public PagedByteArray { |
| public: |
| // Decorates 'paged_byte_array' with a LRU cache layer of the size |
| // 'cache_size'. |
| explicit CachedPagedByteArray(const PagedByteArray* paged_byte_array, |
| size_t cache_size); |
| |
| virtual size_t length() const { return paged_byte_array_->length(); } |
| |
| virtual size_t pageSize() const { return paged_byte_array_->pageSize(); } |
| |
| virtual void getPage(size_t page_index, const unsigned char** begin, |
| const unsigned char** end, |
| PagedByteArray::PagePtr* page) const; |
| |
| private: |
| struct CachedPage { |
| size_t index; |
| PagedByteArray::PagePtr page; |
| const unsigned char* begin; |
| const unsigned char* end; |
| }; |
| |
| // Disallow copy construction and assignment. |
| CachedPagedByteArray(const CachedPagedByteArray&); |
| void operator=(const CachedPagedByteArray&); |
| |
| // Gets the index of the page if it is in the cache and returns true, else |
| // returns false. |
| bool getFromCache(size_t page_index, size_t* cache_index) const; |
| |
| mutable std::mutex mutex_; |
| const PagedByteArray* paged_byte_array_; |
| const size_t cache_size_; |
| mutable std::vector<CachedPage> cached_pages_; |
| }; |
| |
| } // namespace binary_parse |
| } // namespace piex |
| |
| #endif // PIEX_BINARY_PARSE_CACHED_PAGED_BYTE_ARRAY_H_ |