00001
00015 #ifndef INC_MI32_MICACHEARRAY_H
00016 #define INC_MI32_MICACHEARRAY_H
00017
00018 #ifndef INC_MI32_MICACHE_H
00019 #include <mi32/micache.h>
00020 #endif
00021
00022 #ifndef GENERATING_DOXYGEN_OUTPUT
00023 template <class _CT> class MICACHEARRAYIO;
00024 #endif
00025
00026 template <class _CT>
00027 class MICACHEARRAY : private MICACHEIO {
00028 public:
00032 explicit MICACHEARRAY (MICACHEARRAYIO<_CT>& ioref) : m_ioref(ioref), m_ItemSize(0), m_NumItemsInCacheEntry(0) {}
00033
00035 virtual ~MICACHEARRAY () {}
00036
00042 ERRVALUE Create (
00043 INT32 NumBuckets,
00044 INT32 BucketSize = 32768,
00045 bool bSynchronizeAccess = false,
00046 INT32 ItemSize = sizeof(_CT)
00047 ) {
00048 m_ItemSize = ItemSize;
00049 m_NumItemsInCacheEntry = BucketSize / ItemSize;
00050 return (m_Cache.Create(NumBuckets, m_NumItemsInCacheEntry * ItemSize, *this, 0, bSynchronizeAccess));
00051 }
00052
00055 ERRVALUE Flush (
00056 ) { return (m_Cache.Flush()); }
00057
00059 void Free (
00060 ) { m_Cache.Free(); }
00061
00065 ERRVALUE Read (
00066 INT32 ItemIdx,
00067 _CT& item,
00068 void* UserDataPtr = 0
00069 ) {
00070 INT32 ItemID = ItemIdx / m_NumItemsInCacheEntry;
00071 INT32 Offset = (ItemIdx % m_NumItemsInCacheEntry) * m_ItemSize;
00072 return (m_Cache.Read(ItemID, Offset, m_ItemSize, &item, UserDataPtr));
00073 }
00074
00078 ERRVALUE Write (
00079 INT32 ItemIdx,
00080 const _CT& item,
00081 void* UserDataPtr = 0
00082 ) {
00083 INT32 ItemID = ItemIdx / m_NumItemsInCacheEntry;
00084 INT32 Offset = (ItemIdx % m_NumItemsInCacheEntry) * m_ItemSize;
00085 return (m_Cache.Write(ItemID, Offset, m_ItemSize, &item, UserDataPtr));
00086 }
00087
00088 private:
00089 #ifndef GENERATING_DOXYGEN_OUTPUT
00090 MICACHE m_Cache;
00091 MICACHEARRAYIO<_CT>& m_ioref;
00092 UINT32 m_ItemSize;
00093 UINT32 m_NumItemsInCacheEntry;
00094
00095 ERRVALUE CacheLoad (
00096 MICACHE::ITEMINFO& iteminfo
00097 ) { return (m_ioref.ArrayLoad(iteminfo.GetItemID() * m_NumItemsInCacheEntry, m_ItemSize, m_NumItemsInCacheEntry, static_cast<_CT*>(iteminfo.GetMemPtr()))); }
00098
00099 ERRVALUE CacheSave (
00100 MICACHE::ITEMINFO& iteminfo
00101 ) { return (m_ioref.ArraySave(iteminfo.GetItemID() * m_NumItemsInCacheEntry, m_ItemSize, m_NumItemsInCacheEntry, static_cast<const _CT*>(iteminfo.GetMemPtr()))); }
00102 #endif // GENERATING_DOXYGEN_OUTPUT
00103 };
00104
00105
00107 template <class _CT>
00108 class MICACHEARRAYIO {
00109 protected:
00112 virtual ERRVALUE ArrayLoad (
00113 INT32 ItemIdx,
00114 INT32 ItemSize,
00115 INT32 NumItems,
00116 _CT* BucketPtr
00117 ) = 0;
00118
00121 virtual ERRVALUE ArraySave (
00122 INT32 ItemIdx,
00123 INT32 ItemSize,
00124 INT32 NumItems,
00125 const _CT* BucketPtr
00126 ) = 0;
00127 friend class MICACHEARRAY<_CT>;
00128 };
00129
00130 #endif // INC_MI32_MICACHEARRAY_H
00131