一个链表的实现
WC中Hash表的接口形式,后面有空再填填实现
template<typename T,typename TKey>
class TSHashTable{
public:
TSHashTable();;
~TSHashTable();
int* Ptr(int a2,int* a3);
int Initialize();
int GrowListArray(unsigned int a2);
int MonitorFullness(int a2);
int InternalNewNode(int a2,int a3,int a4);
int InternalLinkNode(int a2,int a3);
int InternalClear(int a2);
void Unlink(int a2);
int Delete(int a2);
int DeleteNode(int a2);
unsigned int * New(void* a2,int a3,int a4);
int Insert(int a2,int a3);
int Next(int a2);
int Head();
public:
//IntPtr vtable; // 4
TSExplicitList<T,?> m_fulllist; // 12
int m_fullnessIndicator; // 4
TSGrowableArray<TSExplicitList<T,?>,TSCD<TSExplicitList<T,?>>> m_slotlistarray; // 20
int m_slotmask; // 4
};/*==============================分割线===================================*/
内存池
https://stackoverflow.com/questions/1885849/difference-between-new-operator-and-operator-new
https://stackoverflow.com/questions/6500313/why-should-c-programmers-minimize-use-of-new
https://softwareengineering.stackexchange.com/questions/162614/compilable-modern-alternatives-to-c-c
https://stackoverflow.com/questions/519808/call-a-constructor-on-a-already-allocated-memory
https://docs.microsoft.com/en-us/cpp/cpp/new-operator-cpp?redirectedfrom=MSDN&view=vs-2019
https://bbs.csdn.net/topics/200069137
https://isocpp.org/wiki/faq/dtors#placement-new
https://www.geeksforgeeks.org/placement-new-operator-cpp/+&cd=1&hl=en&ct=clnk&gl=sg
https://stackoverflow.com/questions/3763846/what-is-an-in-place-constructor-in-c
https://stackoverflow.com/questions/2697892/what-is-return-type-of-new-in-c/2697929#2697929
https://stackoverflow.com/questions/5279042/placement-new-vs-explicit-constructor-call-in-c
https://stackoverflow.com/questions/38171964/move-construct-object-with-placement-new
https://stackoverflow.com/questions/519808/call-a-constructor-on-a-already-allocated-memory
https://isocpp.org/wiki/faq/dtors+&cd=1&hl=en&ct=clnk&gl=sg
https://docs.microsoft.com/en-us/cpp/cpp/new-operator-cpp?redirectedfrom=MSDN&view=vs-2019
https://thinkingeek.com/2017/11/19/simple-memory-pool/+&cd=1&hl=en&ct=clnk&gl=sg
https://www.boost.org/doc/libs/1_46_1/libs/pool/doc/index.html+&cd=2&hl=en&ct=clnk&gl=sg
/*==============================分割线===================================*/
AOP
http://vitiy.info/c11-functional-decomposition-easy-way-to-do-aop/+&cd=3&hl=zh-CN&ct=clnk&gl=sg
/*==============================分割线===================================*/
参考:
https://github.com/webcoyote/coho/blob/master/Base/List.h
数据和link的转换逻辑迷了好久,参考上面的仓里的测试用例才想明白,"embedded"Links
照着这个还原了一下WC里面的TSList实现如下:
Link
template<typename T>
class TSLink{
public:
TSLink(){
m_nextNode = (T*)((size_t)this + 1 - 0);
m_prevLink = this;
}
T* Next(){
T* ret = m_nextNode;
if ( ((size_t)ret & 1) || !ret )
ret = NULL;
return (T*)ret;
}
T* Prev(){
T* prevNode = m_prevLink->m_prevLink->m_nextNode;
if ( ((size_t)prevNode & 1) || !prevNode )
prevNode = NULL;
return prevNode;
}
TSLink<T>* NextLink(int offset){
T* next = m_nextNode;
if ( ((size_t)next & 1) || !next )
return (TSLink<T>*)((size_t)next & ~1);
if ( offset < 0 )
offset = (size_t) this - (size_t)m_prevLink->m_nextNode;
return (TSLink<T>*)((size_t)next + offset);
}
public:
TSLink<T>* m_prevLink;
T* m_nextNode;
};List(模板第二个参数我还没想明白,目前没影响,估计和offset获取赋值有关)
template<typename T,typename N>
class TSList{
public:
TSList(){
m_terminator.m_nextNode = NULL;
m_linkoffset = 0;
m_terminator.m_prevLink = (TSLink<T>*)&m_terminator.m_prevLink;
m_terminator.m_nextNode = (T*)((size_t)(&m_terminator.m_prevLink) | 1);
}
~TSList(){
UnlinkAll();
if ( m_terminator.m_prevLink ) {
m_terminator.m_prevLink->NextLink(-1)->m_prevLink = m_terminator.m_prevLink;
m_terminator.m_prevLink->m_nextNode = m_terminator.m_nextNode;
m_terminator.m_prevLink = NULL;
m_terminator.m_nextNode = NULL;
}
}
void UnlinkAll(){
while (1){
T* next = m_terminator.m_nextNode;
if ( ((size_t)next & 1) || !next )
break;
UnlinkNode(m_terminator.m_nextNode);
}
}
void UnlinkNode(T* whichNode) {
TSLink<T>* target;
if (whichNode)
target = (TSLink<T>*)whichNode;
else
target = &m_terminator;
if ( target->m_prevLink ){
target->NextLink(-1)->m_prevLink = target->m_prevLink;
target->m_prevLink->m_nextNode = target->m_nextNode;
target->m_prevLink = NULL;
target->m_nextNode = NULL;
}
}
T* NewNode(int option, int a3, int a4){
T *v5;
v5 = new T;
if (option)
LinkNode(v5, option, NULL);
return v5;
}
void LinkNode(TSLink<T>* a2, int option, TSLink<T>* a4){
TSLink<T>* target;
TSLink<T>* dest = a4;
if ( a2 )
target = a2;
else
target = &m_terminator;
if (target->m_prevLink) {
target->NextLink(-1)->m_prevLink = target->m_prevLink;
target->m_prevLink->m_nextNode = target->m_nextNode;
target->m_prevLink = NULL;
target->m_nextNode = NULL;
}
if ( !a4 )
dest = &m_terminator;
if ( option == 1 ) {
target->m_prevLink = dest;
target->m_nextNode = dest->m_nextNode;
dest->NextLink(m_linkoffset)->m_prevLink = target;
dest->m_nextNode = (T*)a2;
} else if ( option == 2 ) {
TSLink<T>* v6 = dest->m_prevLink;
target->m_prevLink = dest->m_prevLink;
target->m_nextNode = v6->m_nextNode;
v6->m_nextNode = (T*)a2;
dest->m_prevLink = target;
}
}
void LinkNode(T* a2, int option, TSLink<T>* a4) {
TSLink<T>* target;
if ( a2 )
target = (TSLink<T>*)(m_linkoffset + (size_t)a2);
else
target = &m_terminator;
if ( target->m_prevLink ){
target->NextLink(-1)->m_prevLink = target->m_prevLink;
target->m_prevLink->m_nextNode = target->m_nextNode;
target->m_prevLink = NULL;
target->m_nextNode = NULL;
}
TSLink<T> *dest;
if ( a4 )
dest = (TSLink<T>*)(m_linkoffset + (size_t)a4);
else
dest = &m_terminator;
if ( option == 1 ){
target->m_prevLink = dest;
target->m_nextNode = dest->m_nextNode;
dest->NextLink( m_linkoffset)->m_prevLink = target;
dest->m_nextNode = a2;
}else if ( option == 2 ){
TSLink<T> *v6 = dest->m_prevLink;
target->m_prevLink = dest->m_prevLink;
target->m_nextNode = v6->m_nextNode;
v6->m_nextNode = a2;
dest->m_prevLink = target;
}
}
T* DeleteNode(T* a2) {
T* v2;
v2 = Next(a2);
delete a2;
return v2;
}
T* Next(T* whichNode) {//sure
TSLink<T>* target;
T* result;
if (whichNode)
target = (TSLink<T>*)(m_linkoffset + (size_t)whichNode);
else
target = &m_terminator;
result = target->m_nextNode;
if ( (size_t)result & 1 || !result )
result = NULL;
return result;
}
T* Next(TSLink<T>* target) {//sure
T* result;
TSLink<T>* v2 = target;
if ( !target )
v2 = &m_terminator;
result = v2->m_nextNode;
if ( (size_t)result & 1 || !result )
result = NULL;
return result;
}
T* Next(TSList<T,N>* target) {//sure
T* result;
TSList<T,N>* v2 = target;
if ( !target )
v2 = this;
result = v2->m_terminator.m_nextNode;
if ( (size_t)result & 1 || !result )
result = NULL;
return result;
}
T* RawNext(T* whichNode) {
TSLink<T>* target;
if (whichNode)
target = (TSLink<T>*)(m_linkoffset + (size_t)whichNode);
else
target = &m_terminator;
return target->m_nextNode;
}
T* RawNext(TSLink<T>* whichNode) {
TSLink<T>* target;
target = whichNode;
if ( !whichNode )
target = &m_terminator;
return target->m_nextNode;
}
T* RawNext(TSList<T,N>* whichNode) {
TSList<T,N>* target;
target = whichNode;
if ( !whichNode )
target = this;
return target->m_terminator.m_nextNode;
}
T* Prev(T* whichNode) {
TSLink<T>* v2;
T* result;
if ( whichNode )
v2 = (TSLink<T>*)(m_linkoffset + whichNode);
else
v2 = &m_terminator;
result = v2->m_prevLink->m_nextNode;
if ( (size_t)result & 1 || !result )
result = NULL;
return result;
}
T* Prev(TSLink<T>* whichNode) {//sure
TSLink<T>* v2;
T* result;
v2 = whichNode;
if(!whichNode)
v2 = &m_terminator;
result = v2->m_prevLink->m_prevLink->m_nextNode;
if ( (size_t)result & 1 || !result )
result = NULL;
return result;
}
T* Head() {//sure
T* result;
result = m_terminator.m_nextNode;
if ( (size_t)result & 1 || !result )
result = NULL;
return result;
}
void Combine(TSList<T,N>* target, int option, TSLink<T>* mid) {
TSLink<T>* midLink = mid;
TSLink<T>* v5 = &target->m_terminator;
if ( &target->m_terminator != target->m_terminator.m_prevLink ){
if (!mid)
midLink = &m_terminator;
if ( option == 1 ) {
TSLink<T>* v9 = midLink;
T* v6 = midLink->m_nextNode;
midLink->NextLink(m_linkoffset)->m_prevLink = v5;
v9->m_nextNode = target->m_terminator.m_nextNode;
v5->NextLink(target->m_linkoffset)->m_prevLink = v9;
v5->m_prevLink->m_nextNode = v6;
}else if ( option == 2 ){
TSLink<T>* v7 = midLink->m_prevLink;
T* v8 = midLink->m_prevLink->m_nextNode;
midLink->m_prevLink->m_nextNode = target->m_terminator.m_nextNode;
midLink->m_prevLink = v5->m_prevLink;
v5->m_prevLink->NextLink(target->m_linkoffset)->m_prevLink = v7;
v5->m_prevLink->m_nextNode = v8;
}
target->m_terminator.m_prevLink = v5;
target->m_terminator.m_nextNode = (T*)((size_t)v5 | 1);
}
}
bool IsLinked(T* whichNode){
TSLink<T> *target;
if(whichNode)
target = (TSLink<T>*)(m_linkoffset + (size_t)whichNode);
else
target = &m_terminator;
return target->m_nextNode != NULL;
}
void Clear(){
T* target;
for (;;){//free(target)
target = m_terminator.m_nextNode;
if ( (size_t)target & 1 || !target )
break;
delete target;
}
}
int ChangeLinkOffset(int newOffset){
int result;
if ( m_linkoffset != newOffset ){
UnlinkAll();
m_linkoffset = newOffset;
m_terminator.m_prevLink = m_terminator.m_prevLink;
result = (size_t)m_terminator.m_prevLink | 1;
m_terminator.m_nextNode = (T*)result;
}
return result;
}
public:
int m_linkoffset;
TSLink<T> m_terminator;
};测试用例:
struct Data {
TSLink<Data> forward;
unsigned value;
};
int main(int argv,char* argc[]){
Data a,a2,a3,a4;
a.value = 1;
a2.value = 2;
a3.value = 3;
a4.value = 4;
TSList<Data,int> b,e;
std::cout << b.m_linkoffset << std::endl;
b.Clear();
std::cout << b.IsLinked(&a) << std::endl;
b.LinkNode(&a, 2, NULL);
b.LinkNode(&a2, 2, NULL);
b.LinkNode(&a3, 2, NULL);
std::cout << b.IsLinked(&a) << std::endl;
std::cout << b.m_linkoffset << std::endl;
std::cout << "================" << std::endl;
std::cout << (b.Head() ? b.Head()->value : 0) << std::endl;
std::cout << (b.Next(b.Head()) ? b.Next(b.Head())->value : 0) << std::endl;
std::cout << (b.Next(b.Next(b.Head())) ? b.Next(b.Next(b.Head()))->value : 0) << std::endl;
std::cout << "================" << std::endl;
e.LinkNode(&a4, 2, NULL);
b.Combine(&e,1,NULL);
std::cout << "================" << std::endl;
std::cout << (b.Head() ? b.Head()->value : 0) << std::endl;
std::cout << (b.Next(b.Head()) ? b.Next(b.Head())->value : 0) << std::endl;
std::cout << (b.Next(b.Next(b.Head())) ? b.Next(b.Next(b.Head()))->value : 0) << std::endl;
std::cout << (b.Next(b.Next(b.Next(b.Head()))) ? b.Next(b.Next(b.Next(b.Head())))->value : 0) << std::endl;
std::cout << "================" << std::endl;
Data* next = &a2;
if (!((size_t)next & 1) && next)
b.UnlinkNode(&a2);
std::cout << "================" << std::endl;
std::cout << (b.Head() ? b.Head()->value : 0) << std::endl;
std::cout << (b.Next(b.Head()) ? b.Next(b.Head())->value : 0) << std::endl;
std::cout << (b.Next(b.Next(b.Head())) ? b.Next(b.Next(b.Head()))->value : 0) << std::endl;
std::cout << "================" << std::endl;
getchar();
return 0;
}- 点赞
- 收藏
- 关注作者
评论(0)