16 #ifndef INCLUDE_NN_NLIB_REALLOCVEC_H_ 17 #define INCLUDE_NN_NLIB_REALLOCVEC_H_ 34 typedef void* (*ReallocFunc)(
void*, size_t) NLIB_NOEXCEPT_FUNCPTR;
47 : vec_(
nullptr), cur_(0), size_(0), realloc_(::
nlib_realloc) {}
55 #ifdef __cpp_rvalue_references 57 : vec_(rhs.vec_), cur_(rhs.cur_), size_(rhs.size_), realloc_(rhs.realloc_) {
67 realloc_ = rhs.realloc_;
76 : vec_(rhs.vec_), cur_(rhs.cur_), size_(rhs.size_), realloc_(rhs.realloc_) {
86 realloc_ = rhs.realloc_;
97 swap(size_, rhs.size_);
98 swap(realloc_, rhs.realloc_);
103 size_t newsize = (size_ == 0) ? 1 : size_ * 2;
104 if (newsize < size_)
return false;
105 if (!this->Expand(newsize))
return false;
111 if (cur_ == 0)
return false;
118 const T&
front()
const {
return *begin(); }
119 T&
back() {
return *(begin() + cur_ - 1); }
120 const T&
back()
const {
return *(begin() + cur_ - 1); }
130 return const_reverse_iterator(end());
134 return const_reverse_iterator(begin());
137 return const_reverse_iterator(end());
140 return const_reverse_iterator(begin());
146 return (n > size_) ? this->Expand(n) :
true;
149 if (!this->reserve(n))
return false;
165 iterator
insert(iterator pos,
const T& val) {
166 ptrdiff_t idx = pos - begin();
167 if (!this->push_back(val))
return nullptr;
168 std::rotate(begin() + idx, &back(), end());
169 return begin() + idx;
178 ReallocFunc realloc_;
191 void* new_ptr = realloc_(ptr, new_size *
sizeof(T));
192 if (!new_ptr)
return false;
193 vec_ =
static_cast<T*
>(new_ptr);
204 : front_idx_(0), front_vec_(func), back_vec_(func) {}
206 #ifdef __cpp_rvalue_references 208 : front_idx_(rhs.front_idx_), front_vec_(std::move(rhs.front_vec_)),
209 back_vec_(std::move(rhs.back_vec_)) {
213 front_idx_ = rhs.front_idx_;
215 front_vec_ = std::move(rhs.front_vec_);
216 back_vec_ = std::move(rhs.back_vec_);
221 : front_idx_(rhs.front_idx_),
222 front_vec_(rhs.front_vec_,
move_tag()),
223 back_vec_(rhs.back_vec_,
move_tag()) {
227 front_idx_ = rhs.front_idx_;
229 front_vec_.assign(rhs.front_vec_,
move_tag());
230 back_vec_.assign(rhs.back_vec_,
move_tag());
235 swap(front_idx_, rhs.front_idx_);
236 swap(front_vec_, rhs.front_vec_);
237 swap(back_vec_, rhs.back_vec_);
240 return front_vec_.GetRealloc();
243 return front_vec_.size() - front_idx_ + back_vec_.size();
246 return front_idx_ == front_vec_.size() && back_vec_.empty();
250 if (front_idx_ == front_vec_.size()) {
252 if (back_vec_.empty())
return false;
254 swap(front_vec_, back_vec_);
261 if (front_idx_ == front_vec_.size()) {
263 NLIB_ASSERT(!back_vec_.empty());
265 swap(front_vec_, back_vec_);
268 return front_vec_[front_idx_];
271 if (front_idx_ == front_vec_.size()) {
273 if (back_vec_.empty())
return false;
275 swap(front_vec_, back_vec_);
278 if (v) *v = front_vec_[front_idx_];
292 typedef VecType::ReallocFunc ReallocFunc;
298 #ifdef __cpp_rvalue_references 299 #ifdef NLIB_CXX11_DEFAULTED_AND_DELETED_FUNCTIONS 305 vec_ = std::move(rhs.vec_);
318 swap(vec_, rhs.vec_);
322 return this->push_back(str, str +
nlib_strlen(str));
326 size_t n = endchar_ptr - startchar_ptr;
327 char* p =
static_cast<char*
>(vec_.GetRealloc()(
nullptr, n + 1));
328 if (!p)
return false;
331 if (!vec_.push_back(p))
return false;
335 if (vec_.empty())
return false;
336 vec_.GetRealloc()(vec_.back(), 0);
345 const char* front()
const NLIB_NOEXCEPT {
return vec_.front(); }
347 const char* back()
const NLIB_NOEXCEPT {
return vec_.back(); }
355 for (; it != end; ++it) {
356 vec_.GetRealloc()(*it, 0);
368 NLIB_DEFINE_STD_SWAP(NLIB_NS::ReallocCstringVec)
370 NLIB_DEFINE_STD_SWAP_T_BEGIN2(
nn, nlib)
371 NLIB_DEFINE_STD_SWAP_T1(AL, NLIB_NS::ReallocVec)
372 NLIB_DEFINE_STD_SWAP_T1(AL, NLIB_NS::ReallocQueue)
373 NLIB_DEFINE_STD_SWAP_T_END2(
nn, nlib)
375 #endif // INCLUDE_NN_NLIB_REALLOCVEC_H_ const T & front() const
See front.
T * iterator
Random-access iterator.
ReallocQueue(ReallocFunc func) noexcept
Enables the user to specify the realloc function with the constructor.
const_iterator end() const noexcept
See end.
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...
size_t size_type
Unsigned integer type (size_t).
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_iterator begin() const noexcept
See begin.
The class for realloc-based implementations of C string vectors.
bool empty() const noexcept
Determines whether the queue is empty.
The class for realloc-based implementations of queues with POD-type elements.
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.
char * back() noexcept
Gets the last string.
const_reverse_iterator crbegin() const noexcept
Gets the read-only reverse iterator pointing to the last element.
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&.
ReallocFunc GetRealloc() const noexcept
Gets the specified realloc function.
const T * const_iterator
Read-only random-access iterator.
T & front()
Gets the first element.
void swap(ReallocCstringVec &rhs) noexcept
Swaps vectors.
bool resize(size_t n) noexcept
Changes the number of elements.
const_reverse_iterator rbegin() const noexcept
See rbegin.
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.
An empty structure indicating that an argument to a function needs to be moved.
bool empty() const noexcept
Determines whether the vector is empty.
std::reverse_iterator< const_iterator > const_reverse_iterator
std::reverse_iterator<const_iterator>
ReallocFunc GetRealloc() const noexcept
Gets the specified realloc function.
ReallocCstringVec() noexcept
Uses std::realloc with the default constructor.
T & operator[](size_t idx)
Gets the nth element, where n is specified by idx.
size_t size() const noexcept
Gets the size of the queue.
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.
const_reverse_iterator rend() const noexcept
See rend.
constexpr ReallocVec() noexcept
Uses std::realloc with the default constructor.
ReallocCstringVec(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.
void clear() noexcept
Empties the vector. Note that the memory remains allocated.
bool empty() const noexcept
Determines whether the vector is empty.
#define NLIB_NOEXCEPT
Defines noexcept geared to the environment, or the equivalent.
size_t capacity() const noexcept
Gets the maximum number of elements that can be stored without reallocating memory.
iterator end() noexcept
Gets the iterator pointing beyond the last element.
const T & operator[](size_t idx) const
See operator[](size_t idx) =.
#define NLIB_CEXPR
Defines constexpr if it is available for use. If not, holds an empty string.
A file that contains the configuration information for each development environment.
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<iterator>
bool push_back(const char *startchar_ptr, const char *endchar_ptr) noexcept
Adds a (sub)string to the end.
const_reverse_iterator crend() const noexcept
Gets the read-only iterator pointing ahead of the first element.
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.
ReallocFunc GetRealloc() const noexcept
Gets the specified realloc function.
#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).
T & front()
Gets the first element in the queue.
size_t size() const noexcept
Gets the size of the vector.
The class for realloc-based implementations of vectors with POD-type elements.
const_iterator cend() const noexcept
Gets the read-only iterator pointing beyond the last element.
void swap(ReallocVec &rhs) noexcept
Swaps vectors.
const T & back() const
See back.