Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #pragma once
00015
00018 #pragma once
00019
00020 #include "kNet/Alignment.h"
00021 #include "kNet/NetworkLogging.h"
00022
00023 namespace kNet
00024 {
00025
00026 class SequentialIntegerSet
00027 {
00028 public:
00029 explicit SequentialIntegerSet(int tableSize_)
00030 :tableSize(tableSize_), tableSizeMask(tableSize_-1)
00031 {
00032 assert(IS_POW2(tableSize));
00033 table = new unsigned long[tableSize];
00034
00035
00036 memset(table, 0xFF, sizeof(unsigned long) * tableSize);
00037
00038 size = 0;
00039 }
00040 ~SequentialIntegerSet()
00041 {
00042 delete[] table;
00043 }
00044
00046 int Size() const { return size; }
00047
00048 int Capacity() const { return tableSize; }
00049
00050 int CountSize()
00051 {
00052 size = 0;
00053 for(int i = 0; i < tableSize; ++i)
00054 if (IsValid(table[i]))
00055 ++size;
00056 }
00057
00058 void Prune()
00059 {
00060 unsigned long *newTable = new unsigned long[tableSize];
00061 size = 0;
00062 for(int i = 0; i < tableSize; ++i)
00063 if (IsValid(table[i]))
00064 {
00065 Add(newTable, table[i]);
00066 ++size;
00067 }
00068 delete[] table;
00069 table = newTable;
00070 }
00071
00073 int Hash(unsigned long value) const { return (int)(value & tableSizeMask); }
00074
00076 int LinearProbe(int idx) const { return (idx + 1) & tableSizeMask; }
00077
00078 bool IsNull(unsigned long value) const { return value == 0xFFFFFFFF; }
00079
00080 bool IsValid(unsigned long value) const { return !IsNull(value); }
00081
00082 void Add(unsigned long value)
00083 {
00084 Add(table, value);
00085 }
00086
00087 bool Exists(unsigned long value) const
00088 {
00089 return table[Hash(value)] == value;
00090 }
00091
00092 private:
00093 unsigned long *table;
00094 int tableSize;
00095 int tableSizeMask;
00096 int size;
00097
00098 void Add(unsigned long *dstTable, int value)
00099 {
00100 dstTable[Hash(value)] = value;
00101 }
00102
00103 SequentialIntegerSet(const SequentialIntegerSet &);
00104 void operator =(const SequentialIntegerSet &);
00105
00106 };
00107
00108 }