eis/inc/zlib/MemFix.hpp

132 lines
2.9 KiB
C++

/************************************************
* Fixed element pointer position.
* The current pointer points to the latest element
*
* create zoufuzhou 20201001
*
************************************************/
#ifndef _MEM_FIX_ADDR_CACHE_HPP_
#define _MEM_FIX_ADDR_CACHE_HPP_
#include <glob/GlobMem.h>
template <typename T>
class CMemFix {
typedef struct {
unsigned int maxsize;
unsigned int size;
unsigned int next;
} HEAD;
// Local variable
private:
unsigned int m_getnext;
// Memory variable
private:
HEAD* p_head;
T* p_ptr;
private:
void init(const string& tableName) {
char* ptr = (char*)GlobMem::GetInstancePtr()->GetTablePtr(tableName);
if (ptr == nullptr) {
p_ptr = nullptr;
p_head = nullptr;
assert(true);
return;
}
p_head = (HEAD*)(ptr);
p_ptr = (T*)(ptr + sizeof(HEAD));
};
public:
// memfix get not need set cache maxsize
CMemFix(const string& tableName) {
this->init(tableName);
// assert(p_head->maxsize>1);
this->m_getnext = p_head->next;
};
// memfix push need set cache maxsize
CMemFix(const string& tableName, unsigned int maxsize) {
// assert(maxsize>1);
this->init(tableName);
p_head->maxsize = maxsize;
if (p_head->size > p_head->maxsize) {
p_head->size = p_head->maxsize;
}
if (p_head->next > p_head->maxsize) {
p_head->next = p_head->maxsize;
}
p_head->next = p_head->next % p_head->maxsize;
this->m_getnext = p_head->next;
};
~CMemFix(){};
T* operator()(void) { return p_ptr; };
// Take the next value
T* getNext() {
if (this->m_getnext == p_head->next) {
return nullptr;
} else {
unsigned int tmpnext = this->m_getnext;
this->m_getnext = (this->m_getnext + 1) % this->p_head->maxsize;
return this->operator[](tmpnext);
}
};
// unsigned int get_next() { return this->m_getnext; }
// Take the current latest value
T* getCur(void) { return p_ptr + this->index_cur(); }
unsigned int index_cur(void) {
if (p_head->next <= 0) {
return this->p_head->maxsize - 1;
} else {
return (p_head->next - 1) % this->p_head->maxsize;
}
}
unsigned int max_size(void) { return this->p_head->maxsize; }
T* operator[](unsigned int i) {
if (p_ptr == nullptr) return nullptr;
return p_ptr + i;
};
void push(T* t) {
if (p_ptr == nullptr) return;
if (p_head->size < this->p_head->maxsize) {
p_head->size++;
}
memcpy(p_ptr + p_head->next, t, sizeof(T));
// cout<<"p_next:"<<p_head->next<<endl;
p_head->next = (p_head->next + 1) % this->p_head->maxsize;
};
unsigned int size(void) {
if (p_head == nullptr) return 0;
return p_head->size;
};
void clear(void) {
if (p_head == nullptr) return;
p_head->size = 0;
p_head->next = 0;
this->m_getnext = p_head->next;
};
};
#endif