20 #ifndef TESSERACT_CCUTIL_GENERICVECTOR_H_
21 #define TESSERACT_CCUTIL_GENERICVECTOR_H_
73 T &
get(
int index)
const;
101 void set(T t,
int index);
104 void insert(T t,
int index);
108 virtual void remove(
int index);
129 virtual void clear();
173 T *data_new =
new T[current_size * 2];
174 memcpy(data_new, data,
sizeof(T) * current_size);
190 void sort(
int (*comparator)(
const void*,
const void*)) {
201 return data_[index] == target;
213 int middle = (bottom + top) / 2;
214 if (
data_[middle] > target)
219 while (top - bottom > 1);
237 size_used_ = last_write + 1;
246 while (old_index < size_used_ && !delete_cb->Run(old_index++))
250 if (!delete_cb->
Run(old_index)) {
254 size_used_ = new_size;
259 T result =
static_cast<T
>(0);
284 template <
typename T>
285 bool cmp_eq(T
const & t1, T
const & t2) {
293 template <
typename T>
295 const T* a =
static_cast<const T *
> (t1);
296 const T* b =
static_cast<const T *
> (t2);
299 }
else if (*b < *a) {
310 template <
typename T>
312 const T* a = *
reinterpret_cast<T *
const *
>(t1);
313 const T* b = *
reinterpret_cast<T *
const *
>(t2);
316 }
else if (*b < *a) {
344 for (
int i = 0; i < other.
size(); ++i) {
358 virtual void remove(
int index) {
366 for (
int i = size; i < GenericVector<T*>::size_used_; ++i)
381 for (; old_index < GenericVector<T*>::size_used_; ++old_index) {
406 if (fwrite(&used,
sizeof(used), 1, fp) != 1)
return false;
407 for (
int i = 0; i < used; ++i) {
409 if (fwrite(&non_null,
sizeof(non_null), 1, fp) != 1)
return false;
421 if (fread(&reserved,
sizeof(reserved), 1, fp) != 1)
return false;
424 for (
int i = 0; i < reserved; ++i) {
426 if (fread(&non_null,
sizeof(non_null), 1, fp) != 1)
return false;
430 if (!item->DeSerialize(swap, fp))
return false;
440 sort(&sort_ptr_cmp<T>);
447 template <
typename T>
460 template <
typename T>
470 template <
typename T>
477 template <
typename T>
479 if (size_reserved_ >= size || size <= 0)
481 T* new_array =
new T[size];
482 for (
int i = 0; i < size_used_; ++i)
483 new_array[i] = data_[i];
484 if (data_ !=
NULL)
delete[] data_;
486 size_reserved_ = size;
489 template <
typename T>
491 if (size_reserved_ == 0) {
492 reserve(kDefaultVectorSize);
495 reserve(2 * size_reserved_);
500 template <
typename T>
504 for (
int i = 0; i < size; ++i)
510 template <
typename T>
516 template <
typename T>
521 template <
typename T>
524 return data_[size_used_ - 1];
528 template <
typename T>
537 template <
typename T>
540 if (size_reserved_ == size_used_)
542 for (
int i = size_used_; i > index; --i) {
543 data_[i] = data_[i-1];
551 template <
typename T>
554 for (
int i = index; i < size_used_ - 1; ++i) {
555 data_[i] = data_[i+1];
561 template <
typename T>
563 return index >= 0 && index < size_used_;
567 template <
typename T>
569 for (
int i = 0; i < size_used_; ++i) {
571 if (compare_cb_->Run(
object, data_[i]))
578 template <
typename T>
580 return get_index(
object) != -1;
584 template <
typename T>
587 if (size_used_ == size_reserved_)
589 index = size_used_++;
590 data_[index] = object;
594 template <
typename T>
596 int index = get_index(
object);
599 return push_back(
object);
603 template <
typename T>
605 if (size_used_ == size_reserved_)
607 for (
int i = size_used_; i > 0; --i)
608 data_[i] = data_[i-1];
614 template <
typename T>
619 template <
typename T>
622 for (
int i = 0; i < other.
size(); ++i) {
628 template <
typename T>
637 template <
typename T>
644 template <
typename T>
650 template <
typename T>
652 if (size_reserved_ > 0) {
653 if (clear_cb_ !=
NULL)
654 for (
int i = 0; i < size_used_; ++i)
655 clear_cb_->Run(data_[i]);
661 if (clear_cb_ !=
NULL) {
665 if (compare_cb_ !=
NULL) {
671 template <
typename T>
673 for (
int i = 0; i < size_used_; ++i)
680 template <
typename T>
683 if (fwrite(&size_reserved_,
sizeof(size_reserved_), 1, f) != 1)
return false;
684 if (fwrite(&size_used_,
sizeof(size_used_), 1, f) != 1)
return false;
686 for (
int i = 0; i < size_used_; ++i) {
687 if (!cb->
Run(f, data_[i])) {
694 if (fwrite(data_,
sizeof(T), size_used_, f) != size_used_)
return false;
699 template <
typename T>
704 if (fread(&reserved,
sizeof(reserved), 1, f) != 1)
return false;
707 if (fread(&size_used_,
sizeof(size_used_), 1, f) != 1)
return false;
710 for (
int i = 0; i < size_used_; ++i) {
711 if (!cb->
Run(f, data_ + i, swap)) {
718 if (fread(data_,
sizeof(T), size_used_, f) != size_used_)
return false;
720 for (
int i = 0; i < size_used_; ++i)
729 template <
typename T>
731 if (fwrite(&size_used_,
sizeof(size_used_), 1, fp) != 1)
return false;
732 if (fwrite(data_,
sizeof(*data_), size_used_, fp) != size_used_)
return false;
740 template <
typename T>
743 if (fread(&reserved,
sizeof(reserved), 1, fp) != 1)
return false;
746 size_used_ = reserved;
747 if (fread(data_,
sizeof(T), size_used_, fp) != size_used_)
return false;
749 for (
int i = 0; i < size_used_; ++i)
750 ReverseN(&data_[i],
sizeof(data_[i]));
758 template <
typename T>
760 if (fwrite(&size_used_,
sizeof(size_used_), 1, fp) != 1)
return false;
761 for (
int i = 0; i < size_used_; ++i) {
762 if (!data_[i].Serialize(fp))
return false;
772 template <
typename T>
775 if (fread(&reserved,
sizeof(reserved), 1, fp) != 1)
return false;
778 init_to_size(reserved, empty);
779 for (
int i = 0; i < reserved; ++i) {
780 if (!data_[i].DeSerialize(swap, fp))
return false;
787 template <
typename T>
790 this->data_ = from->
data_;
802 template <
typename T>
804 sort(&tesseract::sort_cmp<T>);
807 #endif // TESSERACT_CCUTIL_GENERICVECTOR_H_