// ********************************************************************** // // Copyright (c) 2003-2006 ZeroC, Inc. All rights reserved. // // This copy of Ice is licensed to you under the terms described in the // ICE_LICENSE file included in this distribution. // // ********************************************************************** #ifndef ICE_GRID_CACHE_H #define ICE_GRID_CACHE_H #include #include #include #include namespace IceGrid { template class Cache : public IceUtil::Mutex { typedef IceUtil::Handle ValuePtr; public: Cache() : _entriesHint(_entries.end()) { } virtual ~Cache() { } bool has(const Key& key) { Lock sync(*this); return getImpl(key); } ValuePtr remove(const Key& key) { Lock sync(*this); return removeImpl(key); } void setTraceLevels(const TraceLevelsPtr& traceLevels) { _traceLevels = traceLevels; } const TraceLevelsPtr& getTraceLevels() const { return _traceLevels; } protected: virtual ValuePtr getImpl(const Key& key, bool create = false) { typename std::map::iterator p = _entries.end(); if(_entriesHint != _entries.end()) { if(_entriesHint->first == key) { p = _entriesHint; } } if(p == _entries.end()) { p = _entries.find(key); } if(p != _entries.end()) { _entriesHint = p; return p->second; } else { if(create) { return createAndAddImpl(key); } else { return 0; } } } virtual ValuePtr createAndAddImpl(const Key& key) { return addImpl(key, createEntry(key)); } virtual ValuePtr addImpl(const Key& key, const ValuePtr& entry) { typename std::map::value_type v(key, entry); _entriesHint = _entries.insert(_entriesHint, v); return entry; } virtual ValuePtr removeImpl(const Key& key) { typename std::map::iterator p = _entries.end(); if(_entriesHint != _entries.end()) { if(_entriesHint->first == key) { p = _entriesHint; } } if(p == _entries.end()) { p = _entries.find(key); } assert(p != _entries.end()); if(p->second->canRemove()) { ValuePtr entry = p->second; _entries.erase(p); _entriesHint = _entries.end(); return entry; } else { _entriesHint = p; return p->second; } } virtual ValuePtr createEntry(const Key& key) { return new Value(*this, key); } TraceLevelsPtr _traceLevels; std::map _entries; typename std::map::iterator _entriesHint; }; template class CacheByString : public Cache { typedef IceUtil::Handle TPtr; public: virtual std::vector getAll(const std::string& expr) { IceUtil::Mutex::Lock sync(*this); return getMatchingKeys >(Cache::_entries, expr); } }; }; #endif