⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 diskcache.h

📁 本人收集整理的一份c/c++跨平台网络库
💻 H
字号:
#ifndef UTILS_BASE_DISKCACHE_H_#define UTILS_BASE_DISKCACHE_H_#include <map>#include <string>#ifdef WIN32#undef UnlockResource#endif  // WIN32namespace utils_base {class StreamInterface;///////////////////////////////////////////////////////////////////////////////// DiskCache - An LRU cache of streams, stored on disk.//// Streams are identified by a unique resource id.  Multiple streams can be// associated with each resource id, distinguished by an index.  When old// resources are flushed from the cache, all streams associated with those// resources are removed together.// DiskCache is designed to persist across executions of the program.  It is// safe for use from an arbitrary number of users on a single thread, but not// from multiple threads or other processes.///////////////////////////////////////////////////////////////////////////////class DiskCache {public:  DiskCache();  ~DiskCache();  bool Initialize(const std::string& folder, size_t size);  bool Purge();  bool LockResource(const std::string& id);  StreamInterface* WriteResource(const std::string& id, size_t index);  bool UnlockResource(const std::string& id);  StreamInterface* ReadResource(const std::string& id, size_t index) const;  bool HasResource(const std::string& id) const;  bool HasResourceStream(const std::string& id, size_t index) const;  bool DeleteResource(const std::string& id); protected:  virtual bool InitializeEntries() = 0;  virtual bool PurgeFiles() = 0;  virtual bool FileExists(const std::string& filename) const = 0;  virtual bool DeleteFile(const std::string& filename) const = 0;  enum LockState { LS_UNLOCKED, LS_LOCKED, LS_UNLOCKING };  struct Entry {    LockState lock_state;    mutable size_t accessors;    size_t size;    size_t streams;    time_t last_modified;  };  typedef std::map<std::string, Entry> EntryMap;  friend class DiskCacheAdapter;  bool CheckLimit();  std::string IdToFilename(const std::string& id, size_t index) const;  bool FilenameToId(const std::string& filename, std::string* id,                    size_t* index) const;  const Entry* GetEntry(const std::string& id) const {    return const_cast<DiskCache*>(this)->GetOrCreateEntry(id, false);  }  Entry* GetOrCreateEntry(const std::string& id, bool create);  void ReleaseResource(const std::string& id, size_t index) const;  std::string folder_;  size_t max_cache_, total_size_;  EntryMap map_;  mutable size_t total_accessors_;};///////////////////////////////////////////////////////////////////////////////// CacheLock - Automatically manage locking and unlocking, with optional// rollback semantics///////////////////////////////////////////////////////////////////////////////class CacheLock {public:  CacheLock(DiskCache* cache, const std::string& id, bool rollback = false)  : cache_(cache), id_(id), rollback_(rollback)  {    locked_ = cache_->LockResource(id_);  }  ~CacheLock() {    if (locked_) {      cache_->UnlockResource(id_);      if (rollback_) {        cache_->DeleteResource(id_);      }    }  }  bool IsLocked() const { return locked_; }  void Commit() { rollback_ = false; }private:  DiskCache* cache_;  std::string id_;  bool rollback_, locked_;};///////////////////////////////////////////////////////////////////////////////}  // namespace utils_base#endif // UTILS_BASE_DISKCACHE_H_

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -