00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef __DATABASE_H__
00012 #define __DATABASE_H__
00013 #include "RNPlatform/Inc/DLLExportAPI.h"
00014
00015 namespace RNReplicaNet
00016 {
00017
00018 typedef int t_HashFromDataFunc(void *pData);
00019 typedef int t_HashFromKeyFunc(void *pKey);
00020 typedef bool t_CompareDataWithKeyFunc(void *pData,void *pKey);
00021
00022
00023 const int kSubNodes = 32;
00024
00025 class DatabaseNode;
00026 struct DatabaseLinkNode;
00027 class DatabaseLinkNodePool;
00028
00029 class REPNETEXPORTAPI Database
00030 {
00031 friend class DatabaseNode;
00032 public:
00033 enum Direction
00034 {
00035 kForward=0,
00036 kBackward,
00037 kUndefined
00038 };
00039
00040 Database();
00041 virtual ~Database();
00042
00043 void *AddItem(void *data);
00044 void *AddItemHead(void *data);
00045 void *FindItem(void *keyData);
00046 bool RemoveItem(void *data);
00047 bool RemoveItem(void);
00048
00049 void BeginIterate(void);
00050 void EndIterate(void);
00051 void *Iterate(void);
00052
00053 void SetHashFromDataFunc(t_HashFromDataFunc *pfunc);
00054 void SetHashFromKeyFunc(t_HashFromKeyFunc *pfunc);
00055 void SetCompareDataWithKeyFunc(t_CompareDataWithKeyFunc *pfunc);
00056
00057 void SetEnableFastFind(bool enable = false);
00058 bool GetEnableFastFind(void)
00059 {
00060 return mEnableFastFind;
00061 }
00062
00063 int Tidy(void);
00064
00065 private:
00066 bool mEnableFastFind;
00067 Direction mDirection;
00068 bool mUsed;
00069
00070 DatabaseNode *MatchNode(int objectHash,bool create);
00071 void SemiFreeDatabaseLinkNode (DatabaseLinkNode *theLinkNode);
00072
00073 t_HashFromDataFunc *mHashFromDataFunc;
00074 t_HashFromKeyFunc *mHashFromKeyFunc;
00075 t_CompareDataWithKeyFunc *mCompareDataWithKeyFunc;
00076
00077
00078 DatabaseNode *mTreeDatabaseNodeRoot;
00079
00080
00081 DatabaseNode *mLinkDatabaseNodeRoot;
00082
00083
00084
00085 DatabaseNode *mDatabaseNodeTidyIterator;
00086
00087
00088 DatabaseLinkNode *mIterator;
00089
00090
00091 DatabaseLinkNode *mPrevIterator;
00092
00093
00094 DatabaseNode *mFindCache;
00095 int mFindCacheCounter;
00096
00097
00098
00099 DatabaseLinkNode *mLinkNodeRoot;
00100 DatabaseLinkNode *mLinkNodeTail;
00101
00102
00103
00104 DatabaseLinkNodePool *mPoolRootNode;
00105 DatabaseLinkNodePool *mPoolFreeRootNode;
00106
00107
00108 int mNumNodesWithZeroEntries;
00109 };
00110
00111 class REPNETEXPORTAPI DatabaseNode
00112 {
00113 friend class Database;
00114 public:
00115 DatabaseNode(DatabaseNode *parent,Database *theDatabase);
00116 virtual ~DatabaseNode();
00117
00118 protected:
00119 void AddItem(void *data,DatabaseLinkNode *theLinkNode);
00120
00121 int mHash;
00122 DatabaseNode *mParent;
00123 DatabaseNode *mGreaterThan;
00124 DatabaseNode *mLessThan;
00125 DatabaseNode *mSame;
00126
00127 DatabaseNode *mLinkNext;
00128 DatabaseNode *mLinkPrev;
00129
00130 Database *mDatabase;
00131
00132 unsigned int mBitMask;
00133 void *mData[kSubNodes];
00134 DatabaseLinkNode *mTheLinkNode[kSubNodes];
00135 };
00136
00137 struct REPNETEXPORTAPI DatabaseLinkNode
00138 {
00139 DatabaseLinkNode *mNext;
00140 DatabaseLinkNode *mPrev;
00141 void *mData;
00142
00143
00144 DatabaseLinkNodePool *mOwnerPool;
00145 int mOwnerEntry;
00146
00147
00148 DatabaseNode *mDatabaseNode;
00149 int mDatabaseEntry;
00150 };
00151
00152 class REPNETEXPORTAPI DatabaseLinkNodePool
00153 {
00154 public:
00155 DatabaseLinkNodePool();
00156 virtual ~DatabaseLinkNodePool();
00157
00158 DatabaseLinkNodePool *mNext;
00159 DatabaseLinkNodePool *mPrev;
00160
00161 DatabaseLinkNodePool *mNextFree;
00162 DatabaseLinkNodePool *mPrevFree;
00163
00164 unsigned int mBitMask;
00165 DatabaseLinkNode mNodes[kSubNodes];
00166 };
00167
00168 }
00169
00170
00171 #endif