Files
2022-10-26 12:25:11 +08:00

115 lines
3.3 KiB
C++

#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
// <WARNING!> 사용방법이 익숙해지기 전까지는 사용하면 위험!
//
struct __LListBase {};
template<class T>
struct __LList : public util::__LListBase
{
T* next;
T* prev;
};
template<>
struct __LList<void> : public util::__LListBase
{
__LList<void>* next;
__LList<void>* prev;
};
typedef struct util::__LList<void>* 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<typename _TYPE_>
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<util::__LList<void>*>(next)&&static_cast<util::__LList<void>*>(item)&&
static_cast<util::__LList<void>*>(prev))
{
static_cast<util::__LList<void>*>(next)->prev = static_cast<util::__LList<void>*>(item);
static_cast<util::__LList<void>*>(item)->next = static_cast<util::__LList<void>*>(next);
static_cast<util::__LList<void>*>(item)->prev = static_cast<util::__LList<void>*>(prev);
static_cast<util::__LList<void>*>(prev)->next = static_cast<util::__LList<void>*>(item);
}
}
inline void util::LList::__Delete(util::__LListBase* prev, util::__LListBase* next)
{
if(static_cast<util::__LList<void>*>(next))
{
static_cast<util::__LList<void>*>(next)->prev = static_cast<util::__LList<void>*>(prev);
}
if(static_cast<util::__LList<void>*>(prev)&&static_cast<util::__LList<void>*>(prev)->next)
static_cast<util::__LList<void>*>(prev)->next = static_cast<util::__LList<void>*>(next);
}
inline void util::LList::Init(util::__LListBase* item)
{
if(static_cast<util::__LList<void>*>(item))
{
static_cast<util::__LList<void>*>(item)->next = static_cast<util::__LList<void>*>(item);
static_cast<util::__LList<void>*>(item)->prev = static_cast<util::__LList<void>*>(item);
}
}
inline bool util::LList::IsEmpty(const util::__LListBase* item)
{
return static_cast<const util::__LList<void>*>(item)->next == item;
}
inline void util::LList::AddNext(util::__LListBase* item, util::__LListBase* entry)
{
__Insert(item, entry, static_cast<util::__LList<void>*>(entry)->next);
}
inline void util::LList::AddPrev(util::__LListBase* item, util::__LListBase* entry)
{
__Insert(item, static_cast<util::__LList<void>*>(entry)->prev, entry);
}
template<typename _TYPE_>
_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