00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00028 #ifndef qmpool_h
00029 #define qmpool_h
00030
00037
00038
00040 #ifndef QF_MPOOL_SIZ_SIZE
00043 #define QF_MPOOL_SIZ_SIZE 2
00044 #endif
00045 #if (QF_MPOOL_SIZ_SIZE == 1)
00046
00052 typedef uint8_t QMPoolSize;
00053 #elif (QF_MPOOL_SIZ_SIZE == 2)
00054
00055 typedef uint16_t QMPoolSize;
00056 #elif (QF_MPOOL_SIZ_SIZE == 4)
00057 typedef uint32_t QMPoolSize;
00058 #else
00059 #error "QF_MPOOL_SIZ_SIZE defined incorrectly, expected 1, 2, or 4"
00060 #endif
00061
00063 #ifndef QF_MPOOL_CTR_SIZE
00064
00067 #define QF_MPOOL_CTR_SIZE 2
00068 #endif
00069 #if (QF_MPOOL_CTR_SIZE == 1)
00070
00076 typedef uint8_t QMPoolCtr;
00077 #elif (QF_MPOOL_CTR_SIZE == 2)
00078 typedef uint16_t QMPoolCtr;
00079 #elif (QF_MPOOL_CTR_SIZE == 4)
00080 typedef uint32_t QMPoolCtr;
00081 #else
00082 #error "QF_MPOOL_CTR_SIZE defined incorrectly, expected 1, 2, or 4"
00083 #endif
00084
00098 class QMPool {
00099 private:
00100
00102 void *m_start;
00103
00105 void *m_end;
00106
00108 void *m_free;
00109
00111 QMPoolSize m_blockSize;
00112
00114 QMPoolCtr m_nTot;
00115
00117 QMPoolCtr m_nFree;
00118
00124 QMPoolCtr m_nMin;
00125
00126 public:
00127
00145 void init(void *poolSto, uint32_t poolSize, QMPoolSize blockSize);
00146
00165 void *get(void);
00166
00181 void put(void *b);
00182
00184 QMPoolSize getBlockSize(void) const {
00185 return m_blockSize;
00186 }
00187
00188 private:
00189 friend class QF;
00190 };
00191
00192 #endif // qmpool_h