This source file includes following definitions.
- GenerateKey
- Put
- Get
- Clear
- Clear
#ifndef _PLT_MEDIA_CACHE_H_
#define _PLT_MEDIA_CACHE_H_
#include "Neptune.h"
template <typename T, typename U>
class PLT_MediaCache
{
public:
typedef typename NPT_Map<NPT_String,T>::Entry ElementEntry;
typedef typename NPT_List<ElementEntry*>::Iterator ElementIterator;
PLT_MediaCache<T,U>() {}
virtual ~PLT_MediaCache<T,U>() {}
NPT_Result Put(const char* root, const char* key, T& value, U* tag = NULL);
NPT_Result Get(const char* root, const char* key, T& value, U* tag = NULL);
NPT_Result Clear(const char* root, const char* key);
NPT_Result Clear(const char* root = NULL);
private:
NPT_String GenerateKey(const char* root, const char* key);
private:
NPT_Mutex m_Mutex;
NPT_Map<NPT_String, T> m_Items;
NPT_Map<NPT_String, U> m_Tags;
};
template <typename T, typename U>
inline
NPT_String
PLT_MediaCache<T,U>::GenerateKey(const char* root, const char* key)
{
NPT_String result = root;
result += "/";
result += key;
return result;
}
template <typename T, typename U>
inline
NPT_Result
PLT_MediaCache<T,U>::Put(const char* root,
const char* key,
T& value,
U* tag)
{
NPT_AutoLock lock(m_Mutex);
NPT_String fullkey = GenerateKey(root, key);
if (fullkey.GetLength() == 0) return NPT_ERROR_INVALID_PARAMETERS;
m_Items.Erase(fullkey);
NPT_CHECK(m_Items.Put(fullkey, value));
if (tag) NPT_CHECK(m_Tags.Put(fullkey, *tag));
return NPT_SUCCESS;
}
template <typename T, typename U>
inline
NPT_Result
PLT_MediaCache<T,U>::Get(const char* root,
const char* key,
T& value,
U* tag )
{
NPT_AutoLock lock(m_Mutex);
NPT_String fullkey = GenerateKey(root, key);
if (fullkey.GetLength() == 0) return NPT_ERROR_INVALID_PARAMETERS;
T* _value = NULL;
NPT_CHECK(m_Items.Get(fullkey, _value));
U* _tag;
if (tag) {
m_Tags.Get(fullkey, _tag);
if (_tag) *tag = *_tag;
}
value = *_value;
return NPT_SUCCESS;
}
template <typename T, typename U>
inline
NPT_Result
PLT_MediaCache<T,U>::Clear(const char* root, const char* key)
{
NPT_AutoLock lock(m_Mutex);
NPT_String fullkey = GenerateKey(root, key);
if (fullkey.GetLength() == 0) return NPT_ERROR_INVALID_PARAMETERS;
ElementIterator entries = m_Items.GetEntries().GetFirstItem();
ElementIterator entry;
while (entries) {
entry = entries++;
if ((*entry)->GetKey() == (fullkey)) {
m_Items.Erase(fullkey);
m_Tags.Erase(fullkey);
return NPT_SUCCESS;
}
}
return NPT_ERROR_NO_SUCH_ITEM;
}
template <typename T, typename U>
inline
NPT_Result
PLT_MediaCache<T,U>::Clear(const char* root)
{
NPT_AutoLock lock(m_Mutex);
if (!root || root[0]=='\0')
return m_Items.Clear();
NPT_String key = GenerateKey(root, "");
ElementIterator entries = m_Items.GetEntries().GetFirstItem();
ElementIterator entry;
while (entries) {
entry = entries++;
NPT_String entry_key = (*entry)->GetKey();
if (entry_key.StartsWith(key)) {
m_Items.Erase(entry_key);
m_Tags.Erase(entry_key);
}
}
return NPT_SUCCESS;
}
#endif