19#ifndef TESSERACT_CCUTIL_GENERICVECTOR_H_
20#define TESSERACT_CCUTIL_GENERICVECTOR_H_
75 static_assert(
sizeof(
size_used_) <=
sizeof(
size_t),
"Wow! sizeof(size_t) < sizeof(int32_t)!!");
89 T &
at(
int index)
const {
107 void set(
const T &t,
int index);
151 bool write(FILE *f,
const std::function<
bool(FILE *,
const T &)> &cb)
const;
194 void sort(
int (*comparator)(
const void *,
const void *)) {
199 void swap(
int index1,
int index2) {
200 if (index1 != index2) {
201 T tmp =
data_[index1];
235 FILE *fp = fopen(filename,
"rb");
237 fseek(fp, 0, SEEK_END);
238 auto size = std::ftell(fp);
239 fseek(fp, 0, SEEK_SET);
241 if (size > 0 && size < LONG_MAX) {
245 result =
static_cast<long>(fread(&(*data)[0], 1, size, fp)) == size;
255 FILE *fp = fopen(filename,
"wb");
259 bool result = fwrite(&data[0], 1, data.
size(), fp) == data.
size();
270 const T *a =
static_cast<const T *
>(t1);
271 const T *b =
static_cast<const T *
>(t2);
287 const T *a = *
static_cast<T *
const *
>(t1);
288 const T *b = *
static_cast<T *
const *
>(t2);
319 for (
unsigned i = 0;
i < other.
size(); ++
i) {
326 if (&other !=
this) {
343 for (
int i =
size; i < GenericVector<T *>::size_used_; ++
i) {
365 if (fwrite(&used,
sizeof(used), 1, fp) != 1) {
368 for (
int i = 0;
i < used; ++
i) {
370 if (fwrite(&non_null,
sizeof(non_null), 1, fp) != 1) {
381 if (fp->
FWrite(&used,
sizeof(used), 1) != 1) {
384 for (
int i = 0;
i < used; ++
i) {
386 if (fp->
FWrite(&non_null,
sizeof(non_null), 1) != 1) {
404 if (fread(&reserved,
sizeof(reserved), 1, fp) != 1) {
411 assert(reserved <= UINT16_MAX);
412 if (reserved > UINT16_MAX) {
417 for (uint32_t
i = 0;
i < reserved; ++
i) {
419 if (fread(&non_null,
sizeof(non_null), 1, fp) != 1) {
425 if (!item->DeSerialize(
swap, fp)) {
452 if (size < kDefaultVectorSize) {
453 size = kDefaultVectorSize;
456 size_reserved_ = size;
470 if (size_reserved_ >= size || size <= 0) {
473 if (size < kDefaultVectorSize) {
474 size = kDefaultVectorSize;
476 T *new_array =
new T[size];
477 for (
int i = 0;
i < size_used_; ++
i) {
478 new_array[
i] = data_[
i];
482 size_reserved_ = size;
487 if (size_reserved_ == 0) {
488 reserve(kDefaultVectorSize);
490 reserve(2 * size_reserved_);
499 for (
int i = 0;
i < size; ++
i) {
506 init_to_size(size, t);
511 assert(index >= 0 && index < size_used_);
517 assert(size_used_ > 0);
518 return data_[size_used_ - 1];
523 assert(size_used_ > 0);
524 return data_[--size_used_];
530 assert(index >= 0 && index < size_used_);
539 assert(index >= 0 && index <= size_used_);
540 if (size_reserved_ == size_used_) {
543 for (
int i = size_used_;
i > index; --
i) {
544 data_[
i] = data_[
i - 1];
554 assert(index >= 0 && index < size_used_);
555 for (
int i = index;
i < size_used_ - 1; ++
i) {
556 data_[
i] = data_[
i + 1];
564 for (
int i = 0;
i < size_used_; ++
i) {
565 if (
object == data_[
i]) {
576 if (size_used_ == size_reserved_) {
579 index = size_used_++;
580 data_[index] = std::move(
object);
592 for (
unsigned i = 0;
i < other.
size(); ++
i) {
600 if (&other !=
this) {
610 if (size_reserved_ > 0 && clear_cb_ !=
nullptr) {
611 for (
int i = 0;
i < size_used_; ++
i) {
624 for (
int i = 0;
i < size_used_; ++
i) {
631 if (fwrite(&size_reserved_,
sizeof(size_reserved_), 1, f) != 1) {
634 if (fwrite(&size_used_,
sizeof(size_used_), 1, f) != 1) {
638 for (
int i = 0;
i < size_used_; ++
i) {
639 if (!cb(f, data_[
i])) {
644 if (fwrite(data_,
sizeof(T), size_used_, f) != unsigned_size()) {
654 if (f->
FReadEndian(&reserved,
sizeof(reserved), 1) != 1) {
658 if (f->
FReadEndian(&size_used_,
sizeof(size_used_), 1) != 1) {
662 for (
int i = 0;
i < size_used_; ++
i) {
663 if (!cb(f, data_ +
i)) {
668 if (f->
FReadEndian(data_,
sizeof(T), size_used_) !=
static_cast<unsigned>(size_used_)) {
679 if (fwrite(&size_used_,
sizeof(size_used_), 1, fp) != 1) {
682 if (fwrite(data_,
sizeof(*data_), size_used_, fp) != unsigned_size()) {
689 if (fp->
FWrite(&size_used_,
sizeof(size_used_), 1) != 1) {
692 if (fp->
FWrite(data_,
sizeof(*data_), size_used_) != size_used_) {
705 if (fread(&reserved,
sizeof(reserved), 1, fp) != 1) {
712 assert(reserved <= UINT16_MAX);
713 if (reserved > UINT16_MAX) {
717 size_used_ = reserved;
718 if (fread(data_,
sizeof(T), size_used_, fp) != unsigned_size()) {
722 for (
int i = 0;
i < size_used_; ++
i) {
731 if (fp->
FReadEndian(&reserved,
sizeof(reserved), 1) != 1) {
735 const uint32_t limit = 50000000;
736 assert(reserved <= limit);
737 if (reserved > limit) {
741 size_used_ = reserved;
742 return fp->
FReadEndian(data_,
sizeof(T), size_used_) == size_used_;
750 if (fwrite(&size_used_,
sizeof(size_used_), 1, fp) != 1) {
753 for (
int i = 0;
i < size_used_; ++
i) {
769 if (fp->
FReadEndian(&reserved,
sizeof(reserved), 1) != 1) {
773 init_to_size(reserved, empty);
774 for (
int i = 0;
i < reserved; ++
i) {
787 this->data_ = from->
data_;
791 from->
data_ =
nullptr;
ICOORD & operator+=(ICOORD &op1, const ICOORD &op2)
void ReverseN(void *ptr, int num_bytes)
bool DeSerialize(bool swap, FILE *fp, std::vector< T > &data)
bool Serialize(FILE *fp, const std::vector< T > &data)
int sort_cmp(const void *t1, const void *t2)
bool SaveDataToFile(const GenericVector< char > &data, const char *filename)
void Reverse32(void *ptr)
int sort_ptr_cmp(const void *t1, const void *t2)
bool LoadDataFromFile(const char *filename, GenericVector< char > *data)
size_t unsigned_size() const
void resize(int size, const T &t)
void resize_no_init(int size)
void operator+=(const T &t)
GenericVector(const GenericVector &other)
void insert(const T &t, int index)
static const int kDefaultVectorSize
int get_index(const T &object) const
bool DeSerializeClasses(TFile *fp)
bool Serialize(TFile *fp) const
std::function< void(T)> clear_cb_
bool read(TFile *f, const std::function< bool(TFile *, T *)> &cb)
void swap(int index1, int index2)
void set_clear_callback(const std::function< void(T)> &cb)
void sort(int(*comparator)(const void *, const void *))
bool Serialize(FILE *fp) const
void set(const T &t, int index)
bool SerializeClasses(FILE *fp) const
GenericVector< T > & operator=(const GenericVector &other)
bool DeSerialize(TFile *fp)
int size_reserved() const
void move(GenericVector< T > *from)
void init_to_size(int size, const T &t)
GenericVector< T > & operator+=(const GenericVector &other)
T & operator[](int index) const
bool write(FILE *f, const std::function< bool(FILE *, const T &)> &cb) const
void delete_data_pointers()
bool DeSerialize(bool swap, FILE *fp)
bool Serialize(FILE *fp) const
bool DeSerialize(bool swap, FILE *fp)
PointerVector(const PointerVector &other)
bool Serialize(TFile *fp) const
PointerVector< T > & operator+=(const PointerVector &other)
PointerVector< T > & operator=(const PointerVector &other)
size_t FWrite(const void *buffer, size_t size, size_t count)
size_t FReadEndian(void *buffer, size_t size, size_t count)