#pragma once #ifndef UTILITY_LINKED_LIST_CSTYLE_H #define UTILITY_LINKED_LIST_CSTYLE_H //================================================================================================== // namespace util { ; #pragma pack(push) #pragma pack() // // C Style Linked List // »ç¿ë¹æ¹ýÀÌ Àͼ÷ÇØÁö±â Àü±îÁö´Â »ç¿ëÇϸé À§Çè! // struct __LListBase {}; template struct __LList : public util::__LListBase { T* next; T* prev; }; template<> struct __LList : public util::__LListBase { __LList* next; __LList* prev; }; typedef struct util::__LList* PListNode; struct LList { static void Init(__LListBase* item); static bool IsEmpty(const __LListBase* item); static void AddNext(__LListBase* item, __LListBase* entry); static void AddPrev(__LListBase* item, __LListBase* entry); template static _TYPE_* Delete(_TYPE_* delitem); // private: static void __Insert(__LListBase* item, __LListBase* prev, __LListBase* next); static void __Delete(__LListBase* prev, __LListBase* next); }; #pragma pack(pop) }; //end of namespace //================================================================================================== // inline void util::LList::__Insert( util::__LListBase* item, util::__LListBase* prev, util::__LListBase* next) { if(static_cast*>(next)&&static_cast*>(item)&& static_cast*>(prev)) { static_cast*>(next)->prev = static_cast*>(item); static_cast*>(item)->next = static_cast*>(next); static_cast*>(item)->prev = static_cast*>(prev); static_cast*>(prev)->next = static_cast*>(item); } } inline void util::LList::__Delete(util::__LListBase* prev, util::__LListBase* next) { if(static_cast*>(next)) { static_cast*>(next)->prev = static_cast*>(prev); } if(static_cast*>(prev)&&static_cast*>(prev)->next) static_cast*>(prev)->next = static_cast*>(next); } inline void util::LList::Init(util::__LListBase* item) { if(static_cast*>(item)) { static_cast*>(item)->next = static_cast*>(item); static_cast*>(item)->prev = static_cast*>(item); } } inline bool util::LList::IsEmpty(const util::__LListBase* item) { return static_cast*>(item)->next == item; } inline void util::LList::AddNext(util::__LListBase* item, util::__LListBase* entry) { __Insert(item, entry, static_cast*>(entry)->next); } inline void util::LList::AddPrev(util::__LListBase* item, util::__LListBase* entry) { __Insert(item, static_cast*>(entry)->prev, entry); } template _TYPE_* util::LList::Delete(_TYPE_* del_item) { util::__LListBase* next_item = del_item->next; util::LList::__Delete(del_item->prev, next_item); Init(del_item); return static_cast<_TYPE_*>(next_item); } //================================================================================================== #endif //UTILITY_LINKED_LIST_CSTYLE_H