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);
53inline void TStandardAllocator::operator
delete(
void* ptr)
53inline void TStandardAllocator::operator
delete(
void* ptr) {
…}
58inline void* TStandardAllocator::operator
new(
size_t sz)
60 return ::operator
new(
sz);
58inline void* TStandardAllocator::operator
new(
size_t sz) {
…}
75 return ::realloc(ptr,
sz);
90 void*
operator new(
size_t sz);
91 void operator delete(
void* ptr);
101inline void* TLocalAllocator::operator
new(
size_t sz)
101inline void* TLocalAllocator::operator
new(
size_t sz) {
…}
106inline void TLocalAllocator::operator
delete(
void* ptr)
106inline void TLocalAllocator::operator
delete(
void* ptr) {
…}
138 void*
operator new(
size_t sz);
139 void operator delete(
void* ptr);
142 void Free(
void* ptr);
149inline void* TGlobalAllocator::operator
new(
size_t sz)
149inline void* TGlobalAllocator::operator
new(
size_t sz) {
…}
154inline void TGlobalAllocator::operator
delete(
void* ptr)
154inline void TGlobalAllocator::operator
delete(
void* ptr) {
…}
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);
231inline void TMBlockList<A>::operator
delete(
void* p,
size_t,
const A&)
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>
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>
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>
1149template <
class T,
class T1>
1166template <
class T,
class T1>
1186 else if (*s > p->Split)
1202 else if (*s == p->Split)
1240 : Data{
nullptr}, Mem{
sizeof(T), std::max(10u, array.Reserved / 10u)}
1251template <
class T,
class A>
1259template <
class T,
class A>
1266 if (array.ItemCnt >= Reserved)
1267 Resize(array.ItemCnt - Reserved);
1272 ItemCnt = array.ItemCnt;
1277template <
class T,
class A>
1280 if (ItemCnt >= Reserved)
1281 Resize(ItemCnt + 1);
1286template <
class T,
class A>
1289 if (index == Size())
1294 if (index >= Reserved)
1296 if (ItemCnt >= Reserved)
1297 Resize(ItemCnt + 1);
1298 if (index < ItemCnt && ItemCnt)
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>
1348template <
class T,
class A>
1355template <
class T,
class A>
1362template <
class T,
class A>
1369template <
class T,
class A>
1378template <
class T,
class A>
1381 for (
int i =
static_cast<int>(Size()) - 1;
i >= 0;
i--)
1387template <
class T,
class A>
1398template <
class T,
class A>
1401 if (
static_cast<int>(Reserved) > index)
1403 Resize(index - Reserved);
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>
1453 if (this->ItemCnt >= this->Reserved)
1454 this->Resize(this->ItemCnt + 1);
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];
1472 this->Remove(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;
1494 if (*(this->Data[
middle]) == t)
1496 if (*(this->Data[
middle]) < t)
1506template <
class T,
class R,
class A>
1517template <
class T,
class R,
class A>
1524 if (array.ItemCnt >= Reserved)
1525 Resize(array.ItemCnt - Reserved);
1527 Data[
i] = array.Data[
i];
1528 ItemCnt = array.ItemCnt;
1533template <
class T,
class R,
class A>
1536 if (ItemCnt >= Reserved)
1537 Resize(ItemCnt + 1);
1538 Data[ItemCnt++] = t;
1542template <
class T,
class R,
class A>
1545 if (index == Size())
1550 if (index >= Reserved)
1552 if (ItemCnt >= Reserved)
1553 Resize(ItemCnt + 1);
1554 if (index < ItemCnt && ItemCnt)
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>
1586 return DetachItem(t);
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>
1610template <
class T,
class R,
class A>
1617template <
class T,
class R,
class A>
1624template <
class T,
class R,
class A>
1631template <
class T,
class R,
class A>
1640template <
class T,
class R,
class A>
1643 for (
int i =
static_cast<int>(Size()) - 1;
i >= 0;
i--)
1649template <
class T,
class R,
class A>
1655template <
class T,
class R,
class A>
1658 if (Reserved >
static_cast<uint>(index))
1660 Resize(index - Reserved);
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)));
1685 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>
1717 if (this->ItemCnt >= this->Reserved)
1718 this->Resize(this->ItemCnt + 1);
1719 unsigned loc = this->ItemCnt++;
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)
1735 this->Remove(index);
1741template <
class T,
class R,
class A>
1744 return DetachItem(t);
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;
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];
1810 this->Remove(index);
1817template <
class T,
class R,
class A>
1820 if (
loc <
static_cast<int>(this->Size()))
1830template <
class T,
class R,
class A>
1836 delete this->Data[
i];
1879 delete this->Data[
i];
1887 const auto index = this->Find(t);
1888 if (index != this->NPOS)
1890 T
tmp = this->Data[index];
1891 this->Remove(index);
1901 if (
loc <
static_cast<int>(this->Size()))
1950 delete this->Data[
i];
1958 const auto index = this->Find(t);
1959 if (index != this->NPOS)
1961 T
tmp = this->Data[index];
1962 this->Remove(index);
1972 if (
loc <
static_cast<int>(this->Size()))
2055 First = Last =
nullptr;
2063 if (item && Remove(item))
2074 if (
loc <
static_cast<int>(Size()))
2092 return this->Find(t) != 0;
2137 node->Next =
nullptr;
2139 First->Prev =
nullptr;
2141 else if (
node == Last)
2144 node->Prev =
nullptr;
2146 Last->Next =
nullptr;
2152 node->Prev =
nullptr;
2153 node->Next =
nullptr;
2205 node->Next = item->Next;
2221 return ::operator
new(
sz);
2237 return m.Allocate(
sz);
#define WARN(condition, message)
#define PRECONDITION(condition)
uint GetItemsInContainer() const
int Add(TBaseNode< T > *node)
int Add(TBaseNode< T > *node, const T &data)
T * FirstThat(CondFunc cond, void *args) const
bool DetachItem(const T &t)
void(* IterFunc)(T &, void *)
T * LastThat(CondFunc cond, void *args) const
void ForEach(IterFunc iter, void *args)
TBaseNode< T > * Find(const T &t) const
uint GetItemsInContainer() const
TBaseListIterator< T > Iterator
bool HasMember(const T &t) const
void Add(TBaseListIterator< T > *iter, const T &data)
uint ItemSize
optimization for Size()
bool Remove(TBaseNode< T > *t)
TBaseList(int, int lower=0, int delta=0)
int Add(TBaseNode< T > *item, TBaseNode< T > *node)
void PushBack(const T &data)
bool(* CondFunc)(const T &, void *)
const T & operator*() const
const T & Current() const
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< T, TIPtrArray< T > > 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)
TISortedPtrArray(const TISortedPtrArray< T > &array)
TISortedPtrArray(int upper, int lower=0, int delta=0)
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
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)
Holds array pointers to strings.
T * FirstThat(CondFunc cond, void *args) const
void SqueezeEntry(unsigned loc)
void(* IterFunc)(T &, void *)
bool HasMember(const T &t) const
int Find(const T &t) const
bool(* CondFunc)(const T &, void *)
bool DestroyItem(const T &t)
void RemoveEntry(int loc)
TMObjectArray(const TMObjectArray< T, A > &array)
TMObjectArray(int upper, int lower=0, int=0)
T * LastThat(CondFunc cond, void *args) const
void AddAt(const T &t, uint index)
void ForEach(IterFunc iter, void *args)
TMMemBlocks< A > & GetAllocator()
TMObjectArray< T, A > & operator=(const TMObjectArray< T, A > &array)
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(const TMSortedObjectArray< T, A > &array)
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)
Provides the mark for TMemStack.
TMarker(TMMemStack< TStandardAllocator > &ms)
Single-size block allocator.
TMemBlocks(size_t sz, unsigned n=100)
Implements mark and release style memory management using the standard allocator.
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< T, TObjectArray< T > > Iterator
TObjectArray< T > & operator=(const TObjectArray< T > &array)
void(* IterFunc)(T &, void *)
TObjectArray(const TObjectArray< T > &array)
bool(* CondFunc)(const T &, void *)
Array of pointers of simple types.
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
TSTypedArray(const TSTypedArray< T, R, A > &array)
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)(T &, void *)
TSortedObjectArray(int upper, int lower=0, int delta=0)
bool(* CondFunc)(const T &, void *)
TObjArrayIterator< T, TSortedObjectArray< T > > Iterator
Sorted array of pointers of simple types.
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)
Stores pointer to object.
bool(* CondFunc)(R, void *)
TTypedArray(int upper, int=0, int=0)
void RemoveEntry(int loc)
void ForEach(IterFunc iter, void *args)
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(* IterFunc)(R, void *)
void SqueezeEntry(unsigned loc)
TPtrArrayIterator< R, TTypedArray< T, R, A > > Iterator
TTypedArray(const TTypedArray< T, R, A > &array)
T * LastThat(CondFunc cond, void *args) const
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)
General definitions used by all ObjectWindows programs.
#define REINTERPRET_CAST(targetType, object)