27 # define TRACE( lvl, ... )
28 # define TRACEN( nam, lvl, ... )
29 # define UNDEF_TRACE_AT_END
40 static inline void* QV_MEMALIGN(
size_t boundary,
size_t size)
43 posix_memalign(&retadr, boundary, size);
47 #ifndef QUICKVEC_DO_TEMPLATE
48 # define QUICKVEC_DO_TEMPLATE 1
52 #if !defined(__GCCXML__) && defined(__GXX_EXPERIMENTAL_CXX0X__)
53 # define NOT_OLD_CXXSTD 1
56 #if QUICKVEC_DO_TEMPLATE == 0
58 # define QUICKVEC_TT unsigned long long
60 # define TT_ QUICKVEC_TT
61 # define QUICKVEC_TEMPLATE
62 # define QUICKVEC QuickVec
63 # define QUICKVEC_TN QuickVec
64 # define QUICKVEC_VERSION
66 # define QUICKVEC_TEMPLATE template <typename TT_>
67 # define QUICKVEC QuickVec<TT_>
68 # define QUICKVEC_TN typename QuickVec<TT_>
69 # define QUICKVEC_VERSION \
76 static short Class_Version() { return 5; } // proper version for templates
120 : size_(other.
size())
121 , data_((TT_*)QV_MEMALIGN(QV_ALIGN, other.
capacity() * sizeof(TT_)))
124 TRACEN(
"QuickVec", 10,
"QuickVec std::vector ctor b4 memcpy this=%p data_=%p &other[0]=%p size_=%d other.size()=%d"
125 , (
void*)
this, (
void*)data_, (
void*)&other[0], size_, other.size());
126 memcpy( data_, (
void*)&other[0], size_ *
sizeof(TT_));
141 , data_((TT_*)QV_MEMALIGN(QV_ALIGN, other.
capacity() * sizeof(TT_)))
142 , capacity_(other.capacity_)
144 TRACEN(
"QuickVec",10,
"QuickVec copy ctor b4 memcpy this=%p data_=%p other.data_=%p size_=%d other.size_=%d"
145 , (
void*)
this, (
void*)data_, (
void*)other.data_, size_, other.size_);
146 memcpy( data_, other.data_, size_ *
sizeof(TT_));
156 TRACEN(
"QuickVec", 10,
"QuickVec copy assign b4 resize/memcpy this=%p data_=%p other.data_=%p size_=%d other.size_=%d"
157 , (
void*)
this, (
void*)data_, (
void*)other.data_, size_, other.size_);
159 memcpy( data_, other.data_, size_ *
sizeof(TT_));
169 , data_(std::move(other.data_))
170 , capacity_(other.capacity_)
172 TRACEN(
"QuickVec", 10,
"QuickVec move ctor this=%p data_=%p other.data_=%p"
173 , (
void*)
this, (
void*)data_, (
void*)other.data_ );
174 other.data_ =
nullptr;
184 TRACEN(
"QuickVec", 10,
"QuickVec move assign this=%p data_=%p other.data_=%p"
185 , (
void*)
this, (
void*)data_, (
void*)other.data_ );
189 data_ = std::move(other.data_);
190 capacity_ = other.capacity_;
191 other.data_ =
nullptr;
339 inline QUICKVEC::QuickVec(
size_t sz)
341 , data_((TT_*)QV_MEMALIGN(QV_ALIGN, sz * sizeof(TT_)))
344 TRACEN(
"QuickVec", 15,
"QuickVec %p ctor sz=%d data_=%p", (
void*)
this, size_, (
void*)data_ );
348 inline QUICKVEC::QuickVec(
size_t sz, TT_ val)
350 , data_((TT_*)QV_MEMALIGN(QV_ALIGN, sz * sizeof(TT_)))
353 TRACEN(
"QuickVec", 15,
"QuickVec %p ctor sz=%d/v data_=%p", (
void*)
this, size_, (
void*)data_ );
359 inline QUICKVEC::~QuickVec() noexcept
361 TRACEN(
"QuickVec", 15,
"QuickVec %p dtor start data_=%p size_=%d"
362 , (
void*)
this, (
void*)data_, size_);
364 TRACEN(
"QuickVec", 15,
"QuickVec %p dtor return", (
void*)
this);
368 inline TT_& QUICKVEC::operator[](
int idx)
370 assert(idx < (
int)size_);
375 inline const TT_& QUICKVEC::operator[](
int idx)
const
377 assert(idx < (
int)size_);
382 inline size_t QUICKVEC::size()
const {
return size_; }
385 inline size_t QUICKVEC::capacity()
const {
return capacity_; }
388 inline QUICKVEC_TN::iterator QUICKVEC::begin() {
return iterator(data_); }
391 inline QUICKVEC_TN::const_iterator QUICKVEC::begin()
const {
return iterator(data_); }
394 inline QUICKVEC_TN::iterator QUICKVEC::end() {
return iterator(data_+size_); }
397 inline QUICKVEC_TN::const_iterator QUICKVEC::end()
const {
return const_iterator(data_+size_); }
400 inline void QUICKVEC::reserve(
size_t size)
402 if (size > capacity_)
406 data_ = (TT_*)QV_MEMALIGN(QV_ALIGN, size *
sizeof(TT_));
407 memcpy(data_, old, size_ *
sizeof(TT_));
408 TRACEN(
"QuickVec", 13,
"QUICKVEC::reserve after memcpy this=%p old=%p data_=%p"
409 , (
void*)
this, (
void*)old, (
void*)data_);
416 inline void QUICKVEC::resize(
size_t size)
418 if (size < size_) size_ = size;
419 else if (size <= capacity_) size_ = size;
423 data_ = (TT_*)QV_MEMALIGN(QV_ALIGN, size *
sizeof(TT_));
424 memcpy(data_, old, size_ *
sizeof(TT_));
425 TRACEN(
"QuickVec", 13,
"QUICKVEC::resize after memcpy this=%p old=%p data_=%p"
426 , (
void*)
this, (
void*)old, (
void*)data_);
428 size_ = capacity_ = size;
437 if (size > old_size) {
438 TRACEN(
"QuickVec", 13,
"QUICKVEC::resize initializing %zu elements", size-old_size );
439 for (
iterator ii = begin() + old_size; ii != end(); ++ii) *ii = val;
448 assert(position <= end());
449 size_t offset = position - begin();
454 size_t cnt = end() - (begin() + offset);
455 while (cnt--) *--dst = *--src;
457 dst = begin() + offset;
459 while (nn--) *dst++ = val;
460 return begin() + offset;
468 assert(position <= end());
469 size_t nn = (last - first);
470 size_t offset = position - begin();
475 size_t cnt = end() - (begin() + offset);
476 while (cnt--) *--dst = *--src;
478 dst = begin() + offset;
480 while (nn--) *dst++ = *first++;
481 return begin() + offset;
488 assert(last <= end());
489 size_t nn = (last - first);
490 size_t offset = first - begin();
494 size_t cnt = end() - src;
495 while (cnt--) *dst++ = *src++;
498 return begin() + offset;
504 TRACEN(
"QuickVec", 12,
"QUICKVEC::swap this=%p enter data_=%p x.data_=%p"
505 , (
void*)
this, (
void*)data_, (
void*)x.data_ );
506 std::swap(data_, x.data_);
507 std::swap(size_, x.size_);
508 std::swap(capacity_, x.capacity_);
509 TRACEN(
"QuickVec", 12,
"QUICKVEC::swap return data_=%p x.data_=%p"
510 , (
void*)data_, (
void*)x.data_ );
516 if (size_ == capacity_)
518 reserve(size_ + size_ / 10 + 1);
526 #ifdef UNDEF_TRACE_AT_END
iterator erase(const_iterator first, const_iterator last)
Erases elements in given range from the QuickVec.
iterator end()
Gets an iterator to the end of the QuickVec.
void clear()
Sets the size to 0. QuickVec does not reinitialize memory, so no further action will be taken...
void reserve(size_t size)
Allocates memory for the QuickVec so that its capacity is at least size.
void resize(size_t size)
Resizes the QuickVec.
TT_ & operator[](int idx)
Returns a reference to a given element.
size_t size_type
size_type is size_t
TT_ value_type
value_type is member type
size_t size() const
Accesses the current size of the QuickVec.
TT_ * iterator
Iterator is pointer-to-member type.
ptrdiff_t difference_type
difference_type is ptrdiff_t
size_t capacity() const
Accesses the current capacity of the QuickVec.
void swap(QuickVec &other) noexcept
Exchanges references to two QuickVec objects.
iterator insert(const_iterator position, size_t nn, const TT_ &val)
Inserts an element into the QuickVec.
void push_back(const value_type &val)
Adds a value to the QuickVec, resizing if necessary (adds 10% capacity)
A QuickVec behaves like a std::vector, but does no initialization of its data, making it faster at th...
QuickVec(size_t sz)
Allocates a QuickVec object, doing no initialization of allocated memory.
const TT_ * const_iterator
const_iterator is const-pointer-to-member type
const TT_ & const_reference
const_reference is const-reference-to-member type
iterator begin()
Gets an iterator to the beginning of the QuickVec.
QuickVec< TT_ > & operator=(const QuickVec &other)
Copy assignment operator.
virtual ~QuickVec() noexcept
Destructor calls free on data.
TT_ & reference
reference is reference-to-member tpye
QuickVec(const QuickVec &other)
Copy Constructor.