9#if !defined(OWL_TEMPLATE_H)
13#if defined(BI_HAS_PRAGMA_ONCE)
40 void operator delete(
void* ptr);
41 void*
operator new(
size_t sz);
43 void*
Alloc(
size_t sz);
45 void*
ReAlloc(
void* ptr,
size_t sz);
53inline void TStandardAllocator::operator
delete(
void* ptr)
55 ::operator
delete(ptr);
58inline void* TStandardAllocator::operator
new(
size_t sz)
60 return ::operator
new(sz);
75 return ::realloc(ptr, sz);
90 void*
operator new(
size_t sz);
91 void operator delete(
void* ptr);
93 void*
Alloc(
size_t sz);
95 void*
ReAlloc(
void* ptr,
size_t sz);
101inline void* TLocalAllocator::operator
new(
size_t sz)
103 return static_cast<void*
>(::LocalAlloc(LPTR, sz));
106inline void TLocalAllocator::operator
delete(
void* ptr)
108 ::LocalFree(
static_cast<HLOCAL
>(ptr));
113 return static_cast<void*
>(::LocalAlloc(LPTR, sz));
118 ::LocalFree(
static_cast<HLOCAL
>(ptr));
123 return static_cast<void*
>(::LocalReAlloc(
static_cast<HLOCAL
>(ptr), sz, LPTR));
138 void*
operator new(
size_t sz);
139 void operator delete(
void* ptr);
141 void*
Alloc(
size_t sz);
142 void Free(
void* ptr);
143 void*
ReAlloc(
void* ptr,
size_t sz);
149inline void* TGlobalAllocator::operator
new(
size_t sz)
151 return static_cast<void*
>(::GlobalLock(::GlobalAlloc(GPTR, sz)));
154inline void TGlobalAllocator::operator
delete(
void* ptr)
156 HGLOBAL hMem =
static_cast<HGLOBAL
>(GlobalHandle(ptr));
157 if (GlobalUnlock(hMem) == 0)
163 return static_cast<void*
>(::GlobalLock(::GlobalAlloc(GPTR, sz)));
168 HGLOBAL hMem =
static_cast<HGLOBAL
>(GlobalHandle(ptr));
169 if (GlobalUnlock(hMem) == 0)
175 HGLOBAL hMem =
static_cast<HGLOBAL
>(GlobalHandle(ptr));
176 if (hMem && GlobalUnlock(hMem) == 0)
177 return static_cast<void*
>(::GlobalLock(GlobalReAlloc(hMem, sz, GPTR)));
201 void*
operator new(size_t, size_t,
const A&);
202 void operator delete(
void*);
204 void operator delete(
void* p, size_t,
const A&);
221 return A::operator
new(sz + extra);
225inline void TMBlockList<A>::operator
delete(
void* ptr)
227 A::operator
delete (ptr);
233 A::operator
delete (p);
266 unsigned Count()
const {
return BlockCount; }
274 const size_t BlockSize;
283 : CurBlock(0), BlockSize(sz), BlockCount(0)
292#if !defined( BI_WINDOWS_WEP_BUG )
313 while (BlockCount > term)
316 CurBlock = temp->Next;
370 : Data(sz), CurLoc(sz)
378 sz = std::max(
static_cast<size_t>(1), sz);
379 if (sz > Data.GetBlockSize() - CurLoc)
381 if (Data.AllocBlock(sz) == 0)
386 void* temp = Data.Block() + CurLoc;
404 : Memstk(ms), Blk(ms.Data.
Count()), CurLoc(ms.CurLoc)
409 const auto ok = Blk < Memstk.Data.Count() || (Blk == Memstk.Data.Count() && CurLoc <= Memstk.CurLoc);
410 WARN(!ok,
_T(
"TMMarker::~TMMarker: Terminating due to failed precondition."));
411 if (!ok) std::terminate();
413 Memstk.Data.FreeTo(Blk);
414 Memstk.CurLoc = CurLoc;
441 :
public TMMarker<TStandardAllocator>
479 : FreeList(nullptr), Mem(sz* count), Size(std::max(sz, sizeof(void*)))
481 CHECK(sz != 0 && count != 0);
488 if (FreeList ==
nullptr)
489 return Mem.Allocate(Size);
492 void *temp = FreeList;
493 FreeList = *
static_cast<void**
>(temp);
501 *
static_cast<void **
>(block) = FreeList;
540 static_cast<void>(t);
548inline char*
__owl_construct(
void* p,
char c) { *(
static_cast<char*
>(p)) = c;
return static_cast<char*
>(p); }
554inline int*
__owl_construct(
void* p,
int c) { *(
static_cast<int*
>(p)) = c;
return static_cast<int*
>(p); }
555inline unsigned int*
__owl_construct(
void* p,
unsigned int c) { *(
static_cast<unsigned int*
>(p)) = c;
return static_cast<unsigned int*
>(p); }
561inline long*
__owl_construct(
void* p,
long c) { *(
static_cast<long*
>(p)) = c;
return static_cast<long*
>(p); }
574template <
class T,
class T1>
600template <
class T,
class T1>
630template <
class T1,
class T2>
696template <
class T,
class A = TStandardAllocator>
710 :
Mem(sizeof(T), upper - lower + 1),
Data(0) {
Resize(upper); }
781template <
class T,
class A = TStandardAllocator>
806 int AddAt(
const T& t,
int index) {
return 0; }
807 bool DetachItem(
const T& t);
845template <
class T,
class R,
class A = TStandardAllocator>
903template <
class T,
class R,
class A = TStandardAllocator>
931 int AddAt(R t,
int index);
975template <
class T,
class R,
class A = TStandardAllocator>
986 TMIPtrArray(
int upper,
int lower = 0,
int delta = 0);
994 void Flush(
bool del =
true);
1072 operator bool()
const {
return Cur != 0; }
1149template <
class T,
class T1>
1166template <
class T,
class T1>
1186 else if (*s > p->
Split)
1202 else if (*s == p->
Split)
1244 for (
int i = 0; i < static_cast<int>(array.ItemCnt); i++)
1251template <
class T,
class A>
1259template <
class T,
class A>
1268 for (
int i = 0; i < static_cast<int>(array.ItemCnt); i++)
1277template <
class T,
class A>
1286template <
class T,
class A>
1289 if (index ==
Size())
1299 memmove(&
Data[index + 1], &
Data[index],
sizeof(T*) * (
ItemCnt - index));
1304template <
class T,
class A>
1307 const auto index = this->
Find(t);
1308 if (index != this->
NPOS)
1310 T* tmp =
Data[index];
1319template <
class T,
class A>
1322 if (loc <
static_cast<int>(
Size()))
1333template <
class T,
class A>
1336 return this->
Find(t) != this->
NPOS;
1339template <
class T,
class A>
1342 for (
int i = 0; i < static_cast<int>(
Size()); i++)
1348template <
class T,
class A>
1355template <
class T,
class A>
1362template <
class T,
class A>
1365 for (
int i = 0; i < static_cast<int>(
Size()); i++)
1366 (iter)(*
Data[i], args);
1369template <
class T,
class A>
1372 for (
int i = 0; i < static_cast<int>(
Size()); i++)
1373 if ((cond)(*
Data[i], args))
1378template <
class T,
class A>
1381 for (
int i =
static_cast<int>(
Size()) - 1; i >= 0; i--)
1382 if ((cond)(*
Data[i], args))
1387template <
class T,
class A>
1390 for (
int i = 0; i < static_cast<int>(
Size()); i++)
1398template <
class T,
class A>
1401 if (
static_cast<int>(
Reserved) > index)
1406template <
class T,
class A>
1411 T** data =
static_cast<T**
>(A::ReAlloc(
static_cast<void*
>(
Data), (
Reserved + delta) *
sizeof(T**)));
1414 data =
static_cast<T**
>(A::Alloc((
Reserved + delta) *
sizeof(T**)));
1421 Data =
static_cast<T**
>(A::Alloc((
Reserved + delta) *
sizeof(T**)));
1423 memset(
reinterpret_cast<uint8*
>(
Data) +
Reserved *
sizeof(T**), 0, delta *
sizeof(T**));
1427template <
class T,
class A>
1430 memmove(&
Data[index], &
Data[index + 1],
sizeof(T*) * (
ItemCnt - index - 1));
1436template <
class T,
class A>
1441template <
class T,
class A>
1450template <
class T,
class A>
1455 unsigned loc = this->
ItemCnt++;
1456 while (loc > 0 && t < *(this->
Data[loc - 1]))
1458 this->
Data[loc] = this->
Data[loc - 1];
1465template <
class T,
class A>
1468 const auto index = this->
Find(t);
1469 if (index != this->
NPOS)
1471 T* tmp = this->
Data[index];
1474 this->
Mem.Free(tmp);
1480template <
class T,
class A>
1483 return this->
Find(t) != this->
NPOS;
1486template <
class T,
class A>
1490 auto upper =
static_cast<int>(this->
Size()) - 1;
1491 while (lower <= upper)
1493 const auto middle = (lower + upper) / 2;
1494 if (*(this->
Data[middle]) == t)
1496 if (*(this->
Data[middle]) < t)
1506template <
class T,
class R,
class A>
1512 for (
int i = 0; i < static_cast<int>(array.ItemCnt); i++)
1513 Data[i] = array.Data[i];
1517template <
class T,
class R,
class A>
1526 for (
int i = 0; i < static_cast<int>(array.ItemCnt); i++)
1527 Data[i] = array.Data[i];
1533template <
class T,
class R,
class A>
1542template <
class T,
class R,
class A>
1545 if (index ==
Size())
1555 memmove(&
Data[index + 1], &
Data[index],
sizeof(T) * (
ItemCnt - index));
1560template <
class T,
class R,
class A>
1563 const auto index = this->
Find(t);
1564 if (index != this->
NPOS)
1572template <
class T,
class R,
class A>
1575 if (loc <
static_cast<int>(
Size()))
1583template <
class T,
class R,
class A>
1589template <
class T,
class R,
class A>
1595template <
class T,
class R,
class A>
1598 return this->
Find(t) != this->
NPOS;
1601template <
class T,
class R,
class A>
1604 for (
int i = 0; i < static_cast<int>(
Size()); i++)
1610template <
class T,
class R,
class A>
1617template <
class T,
class R,
class A>
1624template <
class T,
class R,
class A>
1627 for (
int i = 0; i < static_cast<int>(
Size()); i++)
1628 (iter)(
Data[i], args);
1631template <
class T,
class R,
class A>
1634 for (
int i = 0; i < static_cast<int>(
Size()); i++)
1635 if ((cond)(
Data[i], args))
1640template <
class T,
class R,
class A>
1643 for (
int i =
static_cast<int>(
Size()) - 1; i >= 0; i--)
1644 if ((cond)(
Data[i],args))
1649template <
class T,
class R,
class A>
1655template <
class T,
class R,
class A>
1663template<
class T,
class R,
class A>
void
1668 T* data =
static_cast<T*
>(this->
ReAlloc(
static_cast<void*
>(
Data), (
Reserved + delta) *
sizeof(T)));
1671 data =
static_cast<T*
>(this->
Alloc((
Reserved + delta) *
sizeof(T)));
1687 memset(
reinterpret_cast<uint8*
>(
Data) +
Reserved *
sizeof(T), 0, delta *
sizeof(T));
1691template <
class T,
class R,
class A>
1694 memmove(&
Data[index], &
Data[index + 1],
sizeof(T) * (
ItemCnt - index - 1));
1700template <
class T,
class R,
class A>
1705template <
class T,
class R,
class A>
1714template <
class T,
class R,
class A>
1719 unsigned loc = this->
ItemCnt++;
1720 while (loc > 0 && t < this->
Data[loc - 1])
1722 this->
Data[loc] = this->
Data[loc - 1];
1725 this->
Data[loc] = t;
1729template <
class T,
class R,
class A>
1732 const auto index = this->
Find(t);
1733 if (index != this->
NPOS)
1741template <
class T,
class R,
class A>
1747template <
class T,
class R,
class A>
1750 return this->
Find(t) != this->
NPOS;
1753template <
class T,
class R,
class A>
1757 auto upper =
static_cast<int>(this->
Size()) - 1;
1758 while (lower <= upper)
1760 const auto middle = (lower + upper) / 2;
1761 if (this->
Data[middle] == t)
1763 if (this->
Data[middle] < t)
1773template <
class T,
class R,
class A>
1778template <
class T,
class R,
class A>
1783template <
class T,
class R,
class A>
1787template <
class T,
class R,
class A>
1793template <
class T,
class R,
class A>
1803template <
class T,
class R,
class A>
1806 const auto index = this->
Find(t);
1807 if (index != this->
NPOS)
1809 R tmp = this->
Data[index];
1817template <
class T,
class R,
class A>
1820 if (loc <
static_cast<int>(this->
Size()))
1822 R tmp = this->
Data[loc];
1830template <
class T,
class R,
class A>
1835 for (
int i = 0; i < static_cast<int>(this->
Size()); i++)
1836 delete this->
Data[i];
1878 for (
int i = 0; i < static_cast<int>(this->
Size()); i++)
1879 delete this->
Data[i];
1887 const auto index = this->
Find(t);
1888 if (index != this->
NPOS)
1890 T tmp = this->
Data[index];
1901 if (loc <
static_cast<int>(this->
Size()))
1903 T tmp = this->
Data[loc];
1949 for (
int i = 0; i < static_cast<int>(this->
Size()); i++)
1950 delete this->
Data[i];
1958 const auto index = this->
Find(t);
1959 if (index != this->
NPOS)
1961 T tmp = this->
Data[index];
1972 if (loc <
static_cast<int>(this->
Size()))
1974 T tmp = this->
Data[loc];
2030 T data = tmp->
Data;
delete tmp;
2063 if (item &&
Remove(item))
2074 if (loc <
static_cast<int>(
Size()))
2092 return this->
Find(t) != 0;
2108 (iter) (i->Data, args);
2115 if ((cond) (i->Data, args))
2124 if ((cond) (i->Data, args))
2137 node->
Next =
nullptr;
2141 else if (node ==
Last)
2144 node->
Prev =
nullptr;
2152 node->
Prev =
nullptr;
2153 node->
Next =
nullptr;
2221 return ::operator
new(sz);
2226 return static_cast<void*
>(::LocalAlloc(LPTR, sz));
2231 return static_cast<void*
>(::GlobalLock(::GlobalAlloc(GPTR, sz)));
2237 return m.Allocate(sz);
#define WARN(condition, message)
#define PRECONDITION(condition)
uint GetItemsInContainer() const
int Add(TBaseNode< T > *node)
void(*) IterFunc(THelpContext &, void *)
int Add(TBaseNode< T > *node, const T &data)
T * FirstThat(CondFunc cond, void *args) const
bool DetachItem(const T &t)
T * LastThat(CondFunc cond, void *args) const
void ForEach(IterFunc iter, void *args)
TBaseNode< T > * Find(const T &t) const
uint GetItemsInContainer() const
TBaseListIterator< THelpContext > Iterator
bool HasMember(const T &t) const
TBaseNode< THelpContext > * First
void Add(TBaseListIterator< T > *iter, const T &data)
bool(*) CondFunc(const THelpContext &, void *)
bool Remove(TBaseNode< T > *t)
TBaseNode< THelpContext > * Last
TBaseList(int, int lower=0, int delta=0)
int Add(TBaseNode< T > *item, TBaseNode< T > *node)
void PushBack(const T &data)
const T & operator*() const
const T & Current() const
TBaseList< THelpContext > & List
TBaseNode< THelpContext > * Cur
TBaseListIterator(TBaseList< T > &list)
TBaseMemBlocks(size_t sz=8192)
TBlockList(TBlockList *blk)
Provides class-specific operator new and operator delete that allocate from global memory.
void * ReAlloc(void *ptr, size_t sz)
TPtrArrayIterator< TCoolBand *, TIPtrArray< TCoolBand * > > Iterator
TIPtrArray< T > & operator=(const TIPtrArray< T > &array)
TIPtrArray(int upper, int lower=0, int delta=0)
void Flush(bool del=true)
TIPtrArray(const TIPtrArray< T > &array)
TISortedPtrArray< T > & operator=(const TISortedPtrArray< T > &array)
void Flush(bool del=true)
TPtrArrayIterator< T, TISortedPtrArray< T > > Iterator
Provides class-specific operator new and operator delete that allocate from local memory.
void * ReAlloc(void *ptr, size_t sz)
TMBaseMemBlocks(size_t=8192)
size_t GetBlockSize() const
TMBlockList(TMBlockList *)
TPtrArrayIterator< R, TMIPtrArray< T, R, A > > Iterator
void Flush(bool del=true)
TMIPtrArray< T, R, A > & operator=(const TMIPtrArray< T, R, A > &array)
TMMarker(TMMemStack< A > &ms)
Managed single-size block allocator.
TMMemBlocks(size_t sz, unsigned int count=100)
void * Allocate(size_t sz)
T * FirstThat(CondFunc cond, void *args) const
void SqueezeEntry(unsigned loc)
bool HasMember(const T &t) const
int Find(const T &t) const
bool DestroyItem(const T &t)
void RemoveEntry(int loc)
TMObjectArray(int upper, int lower=0, int=0)
T * LastThat(CondFunc cond, void *args) const
void AddAt(const T &t, uint index)
bool(*) CondFunc(const T &, void *)
void ForEach(IterFunc iter, void *args)
TMMemBlocks< A > & GetAllocator()
TMObjectArray< T, A > & operator=(const TMObjectArray< T, A > &array)
void(*) IterFunc(T &, void *)
TObjArrayIterator< T, TMObjectArray< T, A > > Iterator
bool DestroyItem(const T &t)
TObjArrayIterator< T, TMSortedObjectArray< T, A > > Iterator
bool HasMember(const T &t) const
TMSortedObjectArray(int upper, int lower=0, int delta=0)
TMSortedObjectArray< T, A > & operator=(const TMSortedObjectArray< T, A > &array)
int Find(const T &t) const
TMapNode(const TMapNode< T1, T2 > &node)
TMapNode(T1 &name, T2 &val)
bool operator<(const TMapNode &ms) const
bool operator==(const TMapNode &ms) const
TMapNode & operator=(const TMapNode &other)
TMarker(TMMemStack< TStandardAllocator > &ms)
TMemBlocks(size_t sz, unsigned n=100)
TMemStack(size_t sz=8192)
Iterator for TObjectContainer.
TObjArrayIterator(T1 &array)
const T & Current() const
const T & operator*() const
TObjectArray(int upper, int lower=0, int delta=0)
TObjArrayIterator< TComboBoxExItem, TObjectArray< TComboBoxExItem > > Iterator
TObjectArray< T > & operator=(const TObjectArray< T > &array)
bool(*) CondFunc(const TComboBoxExItem &, void *)
TObjectArray(const TObjectArray< T > &array)
void(*) IterFunc(TComboBoxExItem &, void *)
TPtrArray(int upper, int lower=0, int delta=0)
TPtrArray(const TPtrArray< T > &array)
Iterator for Pointer Container.
TPtrArrayIterator(T1 &array)
const T operator*() const
TPtrArrayIterator< R, TSTypedArray< T, R, A > > Iterator
TSTypedArray(int upper, int lower=0, int delta=0)
TSTypedArray< T, R, A > & operator=(const TSTypedArray< T, R, A > &array)
bool HasMember(R t) const
TSortedObjectArray< T > & operator=(const TSortedObjectArray< T > &array)
TSortedObjectArray(const TSortedObjectArray< T > &array)
void(*) IterFunc(tstring &, void *)
bool(*) CondFunc(const tstring &, void *)
TSortedObjectArray(int upper, int lower=0, int delta=0)
TObjArrayIterator< tstring, TSortedObjectArray< tstring > > Iterator
TSortedPtrArray(const TSortedPtrArray< T > &array)
TSortedPtrArray(int upper, int lower=0, int delta=0)
Provides class-specific operator new and operator delete that simply call the global operator new and...
void * ReAlloc(void *ptr, size_t sz)
TTernaryNode(T split, const T1 &data)
TTernaryNode< T, T1 > * RInsert(TTernaryNode< T, T1 > *p, T *s, const T1 &data)
T1 * RSearch(TTernaryNode< T, T1 > *p, T *s)
TTernaryNode< T, T1 > * Root
void Insert(T *s, const T1 &data)
void Flush(TTernaryNode< T, T1 > *p)
TTypedArray(int upper, int=0, int=0)
void RemoveEntry(int loc)
void ForEach(IterFunc iter, void *args)
bool(*) CondFunc(int, void *)
TTypedArray< T, R, A > & operator=(const TTypedArray< T, R, A > &array)
void AddAt(R t, uint index)
bool HasMember(R t) const
T * FirstThat(CondFunc cond, void *args) const
void SqueezeEntry(unsigned loc)
TPtrArrayIterator< int, TTypedArray< int, int, TStandardAllocator > > Iterator
TTypedArray(const TTypedArray< T, R, A > &array)
T * LastThat(CondFunc cond, void *args) const
void(*) IterFunc(int, void *)
TStandardAllocator TSharedAllocator
Object Windows Library (OWLNext Core).
TMMemBlocks< TStandardAllocator > TStandardBlocks
void InUse(const T &arg)
Handy utility to avoid compiler warnings about unused parameters.
void __owl_destruct(T *t)
T * __owl_construct(void *P)
ulong TStaticSync< T >::Count
General definitions used by all ObjectWindows programs.
#define REINTERPRET_CAST(targetType, object)