3 #ifndef INCLUDE_NN_NLIB_REALLOCVEC_H_
4 #define INCLUDE_NN_NLIB_REALLOCVEC_H_
20 typedef void* (*ReallocFunc)(
void*, size_t);
43 NLIB_MOVE_MEMBER_HELPER_4(ReallocVec, m_Vec, m_Cur, m_Size, m_Realloc)
47 if (m_Cur == m_Size) {
48 size_t newSize = (m_Size == 0) ? 1 : m_Size * 2;
49 if (newSize < m_Size)
return false;
50 if (!this->Expand(newSize))
return false;
56 if (m_Cur == 0)
return false;
61 const T&
operator[](
size_t idx)
const {
return m_Vec[idx]; }
63 const T&
front()
const {
return *begin(); }
64 T&
back() {
return *(begin() + m_Cur - 1); }
65 const T&
back()
const {
return *(begin() + m_Cur - 1); }
75 return const_reverse_iterator(end());
79 return const_reverse_iterator(begin());
82 return const_reverse_iterator(end());
85 return const_reverse_iterator(begin());
89 swap(m_Vec, rhs.m_Vec);
90 swap(m_Cur, rhs.m_Cur);
91 swap(m_Size, rhs.m_Size);
92 swap(m_Realloc, rhs.m_Realloc);
98 return (n > m_Size) ? this->Expand(n) :
true;
101 if (!this->reserve(n))
return false;
107 if (m_Cur != m_Size) {
117 iterator
insert(iterator pos,
const T& val) {
118 ptrdiff_t idx = pos - begin();
119 if (!this->push_back(val))
return NULL;
120 std::rotate(begin() + idx, &back(), end());
121 return begin() + idx;
130 ReallocFunc m_Realloc;
143 void* newPtr = m_Realloc(ptr, newSize *
sizeof(T));
144 if (!newPtr)
return false;
145 m_Vec =
reinterpret_cast<T*
>(newPtr);
159 NLIB_MOVE_MEMBER_HELPER_3(ReallocQueue, m_FrontIdx, m_FrontVec, m_BackVec)
161 return m_FrontVec.GetRealloc();
164 return m_FrontVec.size() - m_FrontIdx + m_BackVec.size();
167 return m_FrontIdx == m_FrontVec.size() && m_BackVec.empty();
171 if (m_FrontIdx == m_FrontVec.size()) {
172 if (m_BackVec.empty())
return false;
174 m_FrontVec.swap(m_BackVec);
181 if (m_FrontIdx == m_FrontVec.size()) {
182 NLIB_ASSERT(!m_BackVec.empty());
184 m_FrontVec.swap(m_BackVec);
187 return m_FrontVec[m_FrontIdx];
190 if (m_FrontIdx == m_FrontVec.size()) {
191 if (m_BackVec.empty())
return false;
193 m_FrontVec.swap(m_BackVec);
196 if (v) *v = m_FrontVec[m_FrontIdx];
202 swap(m_FrontIdx, rhs.m_FrontIdx);
203 m_FrontVec.swap(rhs.m_FrontVec);
204 m_BackVec.swap(rhs.m_BackVec);
216 typedef VecType::ReallocFunc ReallocFunc;
222 NLIB_MOVE_MEMBER_HELPER_1(ReallocCstringVec, m_Vec)
225 return this->push_back(str, str +
nlib_strlen(str));
229 size_t n = endCharPtr - startCharPtr;
230 char* p =
reinterpret_cast<char*
>(m_Vec.GetRealloc()(NULL, n + 1));
231 if (!p)
return false;
234 if (!m_Vec.push_back(p))
return false;
238 if (m_Vec.empty())
return false;
239 m_Vec.GetRealloc()(m_Vec.back(), 0);
248 const char* front() const
NLIB_NOEXCEPT {
return m_Vec.front(); }
250 const char* back() const
NLIB_NOEXCEPT {
return m_Vec.back(); }
257 VecType::iterator it = m_Vec.begin();
258 VecType::iterator end = m_Vec.end();
259 for (; it != end; ++it) {
260 m_Vec.GetRealloc()(*it, 0);
272 NLIB_DEFINE_STD_SWAP(NLIB_NS::ReallocCstringVec)
273 #ifndef NLIB_STD_SWAP_WORKAROUND
276 NLIB_DEFINE_STD_SWAP_T_BEGIN1(
std)
279 NLIB_DEFINE_STD_SWAP_T1(AL, NLIB_NS::ReallocVec)
280 NLIB_DEFINE_STD_SWAP_T1(AL, NLIB_NS::ReallocQueue)
282 #ifndef NLIB_STD_SWAP_WORKAROUND
285 NLIB_DEFINE_STD_SWAP_T_END1(
std)
288 #endif // INCLUDE_NN_NLIB_REALLOCVEC_H_
#define NLIB_NOEXCEPT
Defines noexcept geared to the environment, or the equivalent.
T * iterator
Random-access iterator.
bool empty() const noexcept
Determines whether the queue is empty.
ReallocQueue(ReallocFunc func) noexcept
Enables the user to specify the realloc function with the constructor.
size_t capacity() const noexcept
Gets the maximum number of elements that can be stored without expanding the vector.
ReallocVec< T >::ReallocFunc ReallocFunc
The type for functions corresponding to realloc.
T value_type
Element type T.
bool push_back(const T &v) noexcept
Adds an element to the vector.
Substitute definitions for the C++11 standard header type_traits. These substitute definitions are us...
const_reverse_iterator crend() const noexcept
Gets the read-only iterator pointing ahead of the first element.
size_t size_type
Unsigned integer type (size_t).
bool empty() const noexcept
Determines whether the vector is empty.
char * front() noexcept
Gets the first string.
#define NLIB_DISALLOW_COPY_AND_ASSIGN(TypeName)
Prohibits use of the copy constructor and assignment operator for the class specified by TypeName...
bool pop_back() noexcept
Deletes a string from the end of the vector.
size_t size() const noexcept
Gets the size of the vector.
const_reverse_iterator rend() const noexcept
See rend.
The class for realloc-based implementations of C string vectors.
The class for realloc-based implementations of queues with POD-type elements.
const_iterator begin() const noexcept
See begin.
const T * const_pointer
const T*.
bool reserve(size_t n) noexcept
Makes it possible to store as many as n elements without expanding the vector.
iterator insert(iterator pos, const T &val)
Inserts an element in the position specified by pos.
const_iterator cend() const noexcept
Gets the read-only iterator pointing beyond the last element.
const_iterator end() const noexcept
See end.
char * back() noexcept
Gets the last string.
size_t capacity() const noexcept
Gets the maximum number of elements that can be stored without reallocating memory.
bool pop() noexcept
Deletes the first element in the queue.
Defines that class that is corresponding to std::unique_ptr.
const_iterator cbegin() const noexcept
Gets the read-only iterator pointing to the first element.
const T & const_reference
const T&.
const T * const_iterator
Read-only random-access iterator.
T & front()
Gets the first element.
size_t size() const noexcept
Gets the size of the queue.
void swap(ReallocCstringVec &rhs) noexcept
Swaps vectors.
bool resize(size_t n) noexcept
Changes the number of elements.
bool reserve(size_t n) noexcept
Makes it possible to store as many as n elements without reallocating memory.
T & back()
Gets the last element.
bool pop(T *v) noexcept
Gets the first element in the queue and then deletes it.
bool pop_back() noexcept
Deletes an element from the end of the vector.
void swap(ReallocQueue &rhs) noexcept
Swaps queues.
const T & front() const
See front.
#define NLIB_CEXPR
Defines constexpr if it is available for use. If not, holds an empty string.
std::reverse_iterator< const_iterator > const_reverse_iterator
std::reverse_iterator
ReallocCstringVec() noexcept
Uses std::realloc with the default constructor.
T & operator[](size_t idx)
Gets the nth element, where n is specified by idx.
reverse_iterator rend() noexcept
Gets the reverse iterator pointing ahead of the first element.
bool push_back(const char *str) noexcept
Adds a C string to the end.
bool push_back(const char *startCharPtr, const char *endCharPtr) noexcept
Adds a (sub)string to the end.
constexpr ReallocVec() noexcept
Uses std::realloc with the default constructor.
size_t size() const noexcept
Gets the size of the vector.
ReallocCstringVec(ReallocFunc func) noexcept
Enables the user to specify the realloc function with the constructor.
const_reverse_iterator rbegin() const noexcept
See rbegin.
void clear() noexcept
Empties the vector. Note that the memory remains allocated.
const T & back() const
See back.
iterator end() noexcept
Gets the iterator pointing beyond the last element.
A file that contains the configuration information for each development environment.
const_reverse_iterator crbegin() const noexcept
Gets the read-only reverse iterator pointing to the last element.
reverse_iterator rbegin() noexcept
Gets the reverse iterator pointing to the last element.
bool push(const T &val) noexcept
Adds an element to the queue.
std::reverse_iterator< iterator > reverse_iterator
std::reverse_iterator
char * operator[](size_t idx) noexcept
Gets the nth string, where n is specified by idx.
void shrink_to_fit() noexcept
Adjusts the size of allocated memory to exactly fit the current number of elements.
iterator begin() noexcept
Gets the iterator pointing to the first element.
#define NLIB_STATIC_ASSERT(exp)
Defines a static assertion. Uses static_assert if it is available for use.
ReallocQueue() noexcept
Uses std::realloc with the default constructor.
ptrdiff_t difference_type
Signed integer type (ptrdiff_t).
bool empty() const noexcept
Determines whether the vector is empty.
T & front()
Gets the first element in the queue.
The class for realloc-based implementations of vectors with POD-type elements.
const T & operator[](size_t idx) const
See operator[](size_t idx) =.
void swap(ReallocVec &rhs) noexcept
Swaps vectors.