115 lines
3.3 KiB
C++
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
|