-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcache.h
More file actions
138 lines (109 loc) · 4.63 KB
/
cache.h
File metadata and controls
138 lines (109 loc) · 4.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#ifndef FFTPACK_CACHE_INC
#define FFTPACK_CACHE_INC
#include <map>
#include <cassert>
// Forwards
class FactorsKey;
class FactorsArrays;
class FactorsCache;
class FactorsLocker;
class FactorsKey
{
private:
size_t mCookie;
public:
FactorsKey() : mCookie(0) {}
FactorsKey(size_t N, bool dblPrecision, bool realFFT) : mCookie(N << 2 | (dblPrecision ? 1 : 0) | (realFFT ? 0 : 2)){}
bool isValid() const { return mCookie != 0; }
bool isSingle() const { return (mCookie & 1) == 0; }
bool isDouble() const { return (mCookie & 1) == 1; }
bool isComplexFFT() const { return (mCookie & 2) == 2; }
bool isRealFFT() const { return (mCookie & 2) == 0; }
size_t getSize() const { return mCookie >> 2; }
bool operator==(const FactorsKey& key) const { return mCookie == key.mCookie; }
bool operator!=(const FactorsKey& key) const { return mCookie != key.mCookie; }
bool operator<(const FactorsKey& key) const { return mCookie < key.mCookie; }
size_t getCost() const { return getSize() << ((isComplexFFT() ? 1 : 0) + (isDouble() ? 1 : 0)); }
size_t getArraySize() const { return getSize() << (isComplexFFT() ? 1 : 0); }
};
class FactorsArrays
{
friend class FactorsCache;
private:
// No copy
FactorsArrays(const FactorsArrays&);
FactorsArrays& operator=(const FactorsArrays&);
FactorsKey mKey;
FactorsArrays* mMoreRU;
FactorsArrays* mLessRU;
FactorsCache* mCache;
int mFacSave[15];
void* mWASave;
int mLockCount;
FactorsArrays(const FactorsKey& key);
~FactorsArrays();
void init();
public:
const int* getFacSave() const { return mFacSave; }
const float* getSingleWASave() const { assert(mKey.isSingle()); return reinterpret_cast<const float*>(mWASave); }
const double* getDoubleWASave() const { assert(mKey.isDouble()); return reinterpret_cast<const double*>(mWASave); }
FactorsKey getKey() const { return mKey; }
bool isSingle() const { return mKey.isSingle(); }
bool isDouble() const { return mKey.isDouble(); }
bool isRealFFT() const { return mKey.isRealFFT(); }
bool isComplexFFT() const { return mKey.isComplexFFT(); }
size_t getSize() const { return mKey.getSize(); }
size_t getArraySize() const { return mKey.getArraySize(); }
size_t getCost() const { return mKey.getCost(); }
FactorsCache* getCache() const { return mCache; }
};
/**
* Cache for saved arrays.
* Note: To make everything thread-safe, protect calls to this class by a mutex. The class itself
* is already designed to be thread-safe then.
**/
class FactorsCache
{
private:
// No copy
FactorsCache(const FactorsCache&);
FactorsCache& operator=(const FactorsCache&);
size_t mMaxCost;
size_t mCurrentCost;
FactorsArrays* mMostRU;
FactorsArrays* mLastRU;
std::map<FactorsKey, FactorsArrays*> mMap;
void addMRU(FactorsArrays* node);
void remove(FactorsArrays* node);
void destroy(FactorsArrays* node);
public:
FactorsCache(size_t maxCost);
~FactorsCache();
/** remove all unlocked entries */
void clear();
/** get entry for size N */
FactorsArrays* lock(size_t N, bool dblPrecision, bool realFFT) { return lock(FactorsKey(N, dblPrecision, realFFT)); }
FactorsArrays* lock(const FactorsKey& key);
/** unlock entry */
void unlock(FactorsArrays* array);
};
class FactorsLocker
{
private:
// No copy
FactorsLocker(const FactorsLocker&);
FactorsLocker& operator=(const FactorsLocker&);
FactorsArrays* mArrays;
public:
FactorsLocker(FactorsArrays* arrays) : mArrays(arrays) {}
~FactorsLocker() { mArrays->getCache()->unlock(mArrays); }
const int* getFacSave() const { return mArrays->getFacSave(); }
const float* getSingleWASave() const { return mArrays->getSingleWASave(); }
const double* getDoubleWASave() const { return mArrays->getDoubleWASave(); }
FactorsArrays* getFactorArrays() const { return mArrays; }
FactorsKey getKey() const { return mArrays->getKey(); }
template <class T> const T* getWASave() const { assert(0); return 0; }
template <> const float* getWASave<float>() const { return getSingleWASave(); }
template <> const double* getWASave<double>() const { return getDoubleWASave(); }
};
#endif // FFTPACK_CACHE_INC