Grok 20.3.2
SparseCache.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2016-2026 Grok Image Compression Inc.
3 *
4 * This source code is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU Affero General Public License, version 3,
6 * as published by the Free Software Foundation.
7 *
8 * This source code is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Affero General Public License for more details.
12 *
13 * You should have received a copy of the GNU Affero General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 */
17
18#pragma once
19
20#include <unordered_map>
21
22namespace grk
23{
24template<typename T>
26{
27public:
28 SparseCache(uint64_t maxChunkSize)
29 : chunkSize_(std::min<uint64_t>(maxChunkSize, 1024)), currChunk_(nullptr), currChunkIndex_(0)
30 {}
31 virtual ~SparseCache(void)
32 {
33 for(auto& ch : chunks)
34 {
35 for(size_t i = 0; i < chunkSize_; ++i)
36 delete ch.second[i];
37 delete[] ch.second;
38 }
39 }
40
41 T* tryGet(uint64_t index)
42 {
43 uint64_t chunkIndex = index / chunkSize_;
44 uint64_t itemIndex = index % chunkSize_;
45 if(currChunk_ == nullptr || (chunkIndex != currChunkIndex_))
46 {
47 auto iter = chunks.find(chunkIndex);
48 if(iter != chunks.end())
49 {
50 currChunk_ = iter->second;
51 currChunkIndex_ = chunkIndex; // Update currChunkIndex_ when the chunk is found
52 }
53 else
54 {
55 return nullptr;
56 }
57 }
58 return currChunk_[itemIndex];
59 }
60
61 T* get(uint64_t index)
62 {
63 uint64_t chunkIndex = index / chunkSize_;
64 uint64_t itemIndex = index % chunkSize_;
65 if(currChunk_ == nullptr || (chunkIndex != currChunkIndex_))
66 {
67 currChunkIndex_ = chunkIndex;
68 auto iter = chunks.find(chunkIndex);
69 if(iter != chunks.end())
70 {
71 currChunk_ = iter->second;
72 }
73 else
74 {
75 currChunk_ = new T*[chunkSize_];
76 memset(currChunk_, 0, chunkSize_ * sizeof(T*));
77 chunks[chunkIndex] = currChunk_;
78 }
79 }
80 auto item = currChunk_[itemIndex];
81 if(!item)
82 {
83 item = create(index);
84 currChunk_[itemIndex] = item;
85 }
86 return item;
87 }
88
89protected:
90 virtual T* create(uint64_t index) = 0;
91
92private:
93 std::unordered_map<uint64_t, T**> chunks;
94 uint64_t chunkSize_;
97};
98
99template<typename T, typename P>
100class BlockCache : public SparseCache<T>
101{
102public:
103 BlockCache(uint16_t numLayers, uint32_t maxNumBlocks, P* blockInitializer)
104 : SparseCache<T>(maxNumBlocks), blockInitializer_(blockInitializer), numLayers_(numLayers)
105 {}
106 virtual ~BlockCache() = default;
107
108protected:
109 virtual T* create(uint64_t index) override
110 {
111 auto item = new T(numLayers_);
112 blockInitializer_->initCodeBlock(item, (uint32_t)index);
113 return item;
114 }
115
116private:
118 uint16_t numLayers_;
119};
120
121} // namespace grk
virtual T * create(uint64_t index) override
Definition SparseCache.h:109
uint16_t numLayers_
Definition SparseCache.h:118
virtual ~BlockCache()=default
P * blockInitializer_
Definition SparseCache.h:117
BlockCache(uint16_t numLayers, uint32_t maxNumBlocks, P *blockInitializer)
Definition SparseCache.h:103
T * tryGet(uint64_t index)
Definition SparseCache.h:41
virtual T * create(uint64_t index)=0
T * get(uint64_t index)
Definition SparseCache.h:61
T ** currChunk_
Definition SparseCache.h:95
uint64_t currChunkIndex_
Definition SparseCache.h:96
std::unordered_map< uint64_t, T ** > chunks
Definition SparseCache.h:93
SparseCache(uint64_t maxChunkSize)
Definition SparseCache.h:28
virtual ~SparseCache(void)
Definition SparseCache.h:31
uint64_t chunkSize_
Definition SparseCache.h:94
ResWindow.
Definition CompressedChunkCache.h:36