******************
HttpCache.h
******************
#ifndef _HTTP_CACHE_H
#define _HTTP_CACHE_H
#include <map>
#include "CacheItem.h"
class CHttpCache {
public:
virtual ~CHttpCache() {}
static CHttpCache& GetInstance();
bool Cache(const char* const pszUri, const char* const pszBody);
bool Cache(std::string sUri, std::string sBody);
std::string Get(const char* const pszUri);
std::string Get(std::string sUri);
bool Delete(const char* const pszUri);
bool Delete(std::string sUri);
void Purge(long nDelta);
std::map<std::string, CCacheItem*>& GetItems();
private:
CHttpCache() {}
static CHttpCache m_hInstance;
std::map<std::string, CCacheItem*> m_hItems;
};
#include "HttpCache.cpp"
#endif //_HTTP_CAHE_H
******************
HttpCache.cpp
********************
#include <ctime>
#include "HttpCache.h"
CHttpCache CHttpCache::m_hInstance;
CHttpCache& CHttpCache::GetInstance() {
return CHttpCache::m_hInstance;
}
bool CHttpCache::Cache(const char* const pszUri, const char* const pszBody) {
return Cache(std::string(pszUri), std::string(pszBody));
}
bool CHttpCache::Cache(std::string sUri, std::string sBody) {
std::map<std::string, CCacheItem*>::iterator iter = m_hItems.find(sUri);
if(iter == m_hItems.end()) {
CCacheItem* pItem = new CCacheItem(sUri, sBody);
m_hItems[sUri] = pItem;
return true;
}
iter->second->SetBody(sBody);
iter->second->SetSince((long)time(NULL));
return false;
}
std::string CHttpCache::Get(const char* const pszUri) {
return Get(std::string(pszUri));
}
std::string CHttpCache::Get(std::string sUri) {
std::map<std::string, CCacheItem*>::iterator iter = m_hItems.find(sUri);
if(iter == m_hItems.end())
return NULL;
return iter->second->GetBody();
}
bool CHttpCache::Delete(const char* const pszUri) {
return Delete(std::string(pszUri));
}
bool CHttpCache::Delete(std::string sUri) {
std::map<std::string, CCacheItem*>::iterator iter = m_hItems.find(sUri);
if(iter == m_hItems.end())
return false;
CCacheItem* pItem = iter->second;
m_hItems.erase(iter);
delete pItem;
return true;
}
void CHttpCache::Purge(long nDelta) {
long nNow = (long)time(NULL);
for(std::map<std::string, CCacheItem*>::iterator iter = m_hItems.begin(); iter != m_hItems.end(); ) {
if(iter->second->GetSince() > nNow - nDelta) {
iter++;
continue;
}
CCacheItem* pItem = iter->second;
m_hItems.erase(iter++);
delete pItem;
}
}
std::map<std::string, CCacheItem*>& CHttpCache::GetItems() {
return m_hItems;
}
头文件声明函数,然后再定义,为啥全重定义