mirror of
https://github.com/ZDoom/Raze.git
synced 2024-12-21 09:50:39 +00:00
b2470aa677
git-svn-id: https://svn.eduke32.com/eduke32@6688 1a8010ca-5511-0410-912e-c29ae57300e0
67 lines
1.7 KiB
C++
67 lines
1.7 KiB
C++
|
|
#pragma once
|
|
|
|
#ifndef collections_h_
|
|
#define collections_h_
|
|
|
|
#if CXXSTD >= 2011 || EDUKE32_MSVC_PREREQ(1800)
|
|
|
|
// GrowArray - heap-allocated storage that can expand at runtime
|
|
// requirements: type must work properly with realloc -- otherwise, use std::vector
|
|
|
|
template <typename T, size_t increment_ = 1, typename = enable_if_t<std::is_pod<T>::value>, typename = enable_if_t<(increment_ > 0)>>
|
|
struct GrowArray
|
|
{
|
|
FORCE_INLINE T * begin() const { return data_; }
|
|
FORCE_INLINE T * end() const { return data_ + size_; }
|
|
|
|
FORCE_INLINE size_t size() const { return size_; }
|
|
|
|
FORCE_INLINE T& operator[](size_t index) { return data_[index]; }
|
|
FORCE_INLINE const T& operator[](size_t index) const { return data_[index]; }
|
|
|
|
FORCE_INLINE T& first() { return data_[0]; }
|
|
FORCE_INLINE const T& first() const { return data_[0]; }
|
|
|
|
FORCE_INLINE T& last() { return data_[size_-1]; }
|
|
FORCE_INLINE const T& last() const { return data_[size_-1]; }
|
|
|
|
void append(T item)
|
|
{
|
|
if (size_ == capacity_)
|
|
reallocate(capacity_ + increment_);
|
|
data_[size_++] = item;
|
|
}
|
|
|
|
void removeLast()
|
|
{
|
|
--size_;
|
|
}
|
|
|
|
void vacuum()
|
|
{
|
|
if (size_ < capacity_)
|
|
reallocate(size_);
|
|
}
|
|
|
|
void clear()
|
|
{
|
|
size_ = 0;
|
|
capacity_ = 0;
|
|
free(data_);
|
|
data_ = nullptr;
|
|
}
|
|
|
|
protected:
|
|
void reallocate(size_t newcapacity)
|
|
{
|
|
data_ = (T *)Xrealloc(data_, newcapacity * sizeof(T));
|
|
capacity_ = newcapacity;
|
|
}
|
|
T * data_ = nullptr;
|
|
size_t size_ = 0, capacity_ = 0;
|
|
};
|
|
|
|
#endif
|
|
|
|
#endif // collections_h_
|