leocad/common/lc_array.h

237 lines
3.2 KiB
C
Raw Normal View History

#pragma once
2016-10-05 23:28:52 +02:00
template <class T>
class lcArray
{
public:
lcArray(int Size = 0, int Grow = 16)
{
mData = nullptr;
2016-10-05 23:28:52 +02:00
mLength = 0;
mAlloc = 0;
mGrow = Grow;
if (Size != 0)
AllocGrow(Size);
}
lcArray(const lcArray<T>& Array)
{
mData = nullptr;
2016-10-05 23:28:52 +02:00
*this = Array;
}
~lcArray()
{
delete[] mData;
}
lcArray<T>& operator=(const lcArray<T>& Array)
{
mLength = Array.mLength;
mAlloc = Array.mAlloc;
mGrow = Array.mGrow;
delete[] mData;
mData = new T[mAlloc];
for (int i = 0; i < mLength; i++)
mData[i] = Array.mData[i];
return *this;
}
lcArray(lcArray<T>&& Array)
{
mData = nullptr;
*this = std::move(Array);
}
lcArray<T>& operator=(lcArray<T>&& Array)
{
delete[] mData;
2020-03-23 00:07:07 +01:00
mData = Array.mData;
Array.mData = nullptr;
mLength = Array.mLength;
Array.mLength = 0;
mAlloc = Array.mAlloc;
Array.mAlloc = 0;
mGrow = Array.mGrow;
2020-03-23 00:07:07 +01:00
Array.mGrow = 16;
return *this;
}
2016-10-05 23:28:52 +02:00
const T& operator[](int Index) const
{
return mData[Index];
}
T& operator[](int Index)
{
return mData[Index];
}
bool operator==(const lcArray<T>& Array) const
{
if (mLength != Array.mLength)
return false;
for (int i = 0; i < mLength; i++)
if (mData[i] != Array.mData[i])
return false;
return true;
}
2017-04-03 02:15:09 +02:00
T* begin()
2017-04-02 01:53:54 +02:00
{
return &mData[0];
}
2017-04-03 02:15:09 +02:00
T* end()
{
return &mData[0] + mLength;
}
const T* begin() const
{
return &mData[0];
}
const T* end() const
2017-04-02 01:53:54 +02:00
{
return &mData[0] + mLength;
}
2016-10-05 23:28:52 +02:00
bool IsEmpty() const
{
return mLength == 0;
}
int GetSize() const
{
return mLength;
}
2019-05-21 23:17:51 +02:00
void SetSize(size_t NewSize)
2016-10-05 23:28:52 +02:00
{
if (NewSize > mAlloc)
AllocGrow(NewSize - mLength);
2019-05-28 01:22:49 +02:00
mLength = (int)NewSize;
2016-10-05 23:28:52 +02:00
}
void SetGrow(int Grow)
{
if (Grow)
mGrow = Grow;
}
2019-05-18 20:33:27 +02:00
void AllocGrow(size_t Grow)
2016-10-05 23:28:52 +02:00
{
if ((mLength + Grow) > mAlloc)
{
2020-03-23 04:18:52 +01:00
const size_t NewSize = ((mLength + Grow + mGrow - 1) / mGrow) * mGrow;
2016-10-05 23:28:52 +02:00
T* NewData = new T[NewSize];
for (int i = 0; i < mLength; i++)
NewData[i] = mData[i];
delete[] mData;
mData = NewData;
mAlloc = NewSize;
}
}
void Add(const T& NewItem)
{
AllocGrow(1);
mData[mLength++] = NewItem;
}
T& Add()
{
AllocGrow(1);
return mData[mLength++];
}
T& InsertAt(int Index)
{
if (Index >= mLength)
AllocGrow(Index - mLength + 1);
else
AllocGrow(1);
mLength++;
for (int i = mLength - 1; i > Index; i--)
mData[i] = mData[i - 1];
return mData[Index];
}
void InsertAt(int Index, const T& NewItem)
{
if (Index >= mLength)
AllocGrow(Index - mLength + 1);
else
AllocGrow(1);
mLength++;
for (int i = mLength - 1; i > Index; i--)
mData[i] = mData[i - 1];
mData[Index] = NewItem;
}
void RemoveIndex(int Index)
{
mLength--;
for (int i = Index; i < mLength; i++)
mData[i] = mData[i + 1];
}
void Remove(const T& Item)
{
for (int i = 0; i < mLength; i++)
{
if (mData[i] == Item)
{
RemoveIndex(i);
return;
}
}
}
void RemoveAll()
{
mLength = 0;
}
void DeleteAll()
{
for (int i = 0; i < mLength; i++)
delete mData[i];
mLength = 0;
}
int FindIndex(const T& Item) const
{
for (int i = 0; i < mLength; i++)
if (mData[i] == Item)
return i;
return -1;
}
protected:
T* mData;
int mLength;
2019-05-18 20:33:27 +02:00
size_t mAlloc;
2016-10-05 23:28:52 +02:00
int mGrow;
};