9 #include <aliceVision/system/Logger.hpp>
28 typedef typename std::vector<T>::iterator Iterator;
29 typedef typename std::vector<T>::const_iterator ConstIterator;
30 typedef typename std::vector<T>::reference Reference;
31 typedef typename std::vector<T>::const_reference ConstReference;
44 const T& operator[](
int index)
const {
return _data[index]; }
46 T& operator[](
int index) {
return _data[index]; }
48 void clear() { _data.clear(); }
50 Iterator begin() {
return _data.begin(); }
51 Iterator end() {
return _data.end(); }
53 ConstIterator begin()
const {
return _data.begin(); }
54 ConstIterator end()
const {
return _data.end(); }
56 Reference front() {
return _data.front(); }
57 ConstReference front()
const {
return _data.front(); }
59 Reference back() {
return _data.back(); }
60 ConstReference back()
const {
return _data.back(); }
62 const std::vector<T>& getData()
const {
return _data; }
63 std::vector<T>& getDataWritable() {
return _data; }
64 int size()
const {
return _data.size(); }
65 bool empty()
const {
return _data.empty(); }
66 size_t capacity()
const {
return _data.capacity(); }
67 void reserve(
int n) { _data.reserve(n); }
68 void resize(
int n) { _data.resize(n); }
69 void resize(
int n, T value) { _data.resize(n, value); }
70 void resize_with(
int n,
const T& val) { _data.resize(n, val); }
71 void swap(
StaticVector& other) { _data.swap(other._data); }
72 void assign(
int n, T value) { _data.assign(n, value); }
74 void shrink_to_fit() { _data.shrink_to_fit(); }
76 void reserveAddIfNeeded(
int nplanned,
int ntoallocated)
78 if (size() + nplanned > capacity())
80 reserveAdd(nplanned + ntoallocated);
84 void reserveAdd(
int ntoallocated) { _data.reserve(capacity() + ntoallocated); }
86 void push_back(
const T& val) { _data.push_back(val); }
88 void push_front(
const T& val) { _data.insert(_data.begin(), val); }
90 void push_back_arr(
StaticVector<T>* arr) { _data.insert(_data.end(), arr->getData().begin(), arr->getData().end()); }
92 void push_back_arr(
StaticVector<T>& arr) { _data.insert(_data.end(), arr.getData().begin(), arr.getData().end()); }
94 void remove(
int i) { _data.erase(_data.begin() + i); }
96 int push_back_distinct(
const T& val)
98 int id = indexOf(val);
100 _data.push_back(val);
106 T val = _data.back();
111 int indexOf(
const T& value)
const
113 const auto it = std::find(_data.begin(), _data.end(), value);
114 return it != _data.end() ? std::distance(_data.begin(), it) : -1;
117 int indexOfSorted(
const T& value)
const {
return indexOf(value); }
119 int indexOfNearestSorted(
const T& value)
const
122 auto it = std::lower_bound(_data.begin(), _data.end(), value);
123 if (it == _data.end())
126 if (it != _data.begin())
129 auto prevIt = std::prev(it);
130 it = (value - *prevIt) < (*it - value) ? prevIt : it;
132 return std::distance(_data.begin(), it);
139 return std::distance(_data.begin(), std::min_element(_data.begin(), _data.end()));
146 return std::distance(_data.begin(), std::max_element(_data.begin(), _data.end()));
163 int sizeOfStaticVector(
const StaticVector<T>& a)
171 int indexOf(T* arr,
int n,
const T& what)
173 int isthereindex = -1;
176 while ((i < n) && (isthereindex == -1))
189 void saveArrayOfArraysToFile(
const std::string& fileName, StaticVector<StaticVector<T>*>* aa)
191 ALICEVISION_LOG_DEBUG(
"[IO] saveArrayOfArraysToFile: " << fileName);
192 FILE* f = fopen(fileName.c_str(),
"wb");
194 fwrite(&n,
sizeof(
int), 1, f);
195 for (
int i = 0; i < n; i++)
198 StaticVector<T>* a = (*aa)[i];
201 fwrite(&m,
sizeof(
int), 1, f);
206 fwrite(&m,
sizeof(
int), 1, f);
209 fwrite(&(*a)[0],
sizeof(T), m, f);
217 void saveArrayOfArraysToFile(
const std::string fileName, StaticVector<StaticVector<T>>& aa)
219 ALICEVISION_LOG_DEBUG(
"[IO] saveArrayOfArraysToFile: " << fileName);
220 FILE* f = fopen(fileName.c_str(),
"wb");
222 fwrite(&n,
sizeof(
int), 1, f);
223 for (
int i = 0; i < n; i++)
226 StaticVector<T>& a = aa[i];
229 fwrite(&m,
sizeof(
int), 1, f);
234 fwrite(&m,
sizeof(
int), 1, f);
237 fwrite(&a[0],
sizeof(T), m, f);
245 StaticVector<StaticVector<T>*>* loadArrayOfArraysFromFile(
const std::string& fileName)
247 ALICEVISION_LOG_DEBUG(
"[IO] loadArrayOfArraysFromFile: " << fileName);
248 FILE* f = fopen(fileName.c_str(),
"rb");
251 ALICEVISION_THROW_ERROR(
"[IO] loadArrayOfArraysFromFile: can't open file " << fileName);
255 size_t retval = fread(&n,
sizeof(
int), 1, f);
259 ALICEVISION_THROW_ERROR(
"[IO] loadArrayOfArraysFromFile: can't read outer array size");
261 StaticVector<StaticVector<T>*>* aa =
new StaticVector<StaticVector<T>*>();
263 aa->resize_with(n, NULL);
264 for (
int i = 0; i < n; i++)
267 retval = fread(&m,
sizeof(
int), 1, f);
271 ALICEVISION_THROW_ERROR(
"[IO] loadArrayOfArraysFromFile: can't read inner array size");
275 StaticVector<T>* a =
new StaticVector<T>();
277 retval = fread(&(*a)[0],
sizeof(T), m, f);
281 ALICEVISION_THROW_ERROR(
"[IO] loadArrayOfArraysFromFile: can't read vector element");
292 void loadArrayOfArraysFromFile(StaticVector<StaticVector<T>>& out_aa,
const std::string& fileName)
294 ALICEVISION_LOG_DEBUG(
"[IO] loadArrayOfArraysFromFile: " << fileName);
295 FILE* f = fopen(fileName.c_str(),
"rb");
298 ALICEVISION_THROW_ERROR(
"[IO] loadArrayOfArraysFromFile: can't open file " << fileName);
302 size_t retval = fread(&n,
sizeof(
int), 1, f);
306 ALICEVISION_THROW_ERROR(
"[IO] loadArrayOfArraysFromFile: can't read outer array size");
311 for (
int i = 0; i < n; i++)
314 retval = fread(&m,
sizeof(
int), 1, f);
318 ALICEVISION_THROW_ERROR(
"[IO] loadArrayOfArraysFromFile: can't read inner array size");
322 StaticVector<T>& a = out_aa[i];
324 retval = fread(&a[0],
sizeof(T), m, f);
328 ALICEVISION_THROW_ERROR(
"[IO] loadArrayOfArraysFromFile: can't read vector element");
336 void saveArrayToFile(
const std::string& fileName,
const StaticVector<T>& a,
bool docompress =
true)
338 saveArrayToFile(fileName, &a, docompress);
342 void saveArrayToFile(
const std::string& fileName,
const StaticVector<T>* a,
bool docompress =
true)
344 ALICEVISION_LOG_DEBUG(
"[IO] saveArrayToFile: " << fileName);
346 std::filesystem::path filepath = fileName;
347 std::filesystem::create_directories(filepath.parent_path());
351 ALICEVISION_LOG_DEBUG(
"[IO] saveArrayToFile called with NULL static vector");
357 ALICEVISION_LOG_WARNING(
"[IO] saveArrayToFile called with 0-sized static vector");
361 if ((docompress ==
false) || (a->size() < 1000))
363 FILE* f = fopen(fileName.c_str(),
"wb");
366 ALICEVISION_THROW_ERROR(
"[IO] file " << fileName <<
" could not be opened, msg: " << strerror(errno));
374 int items = fwrite(&n,
sizeof(
int), 1, f);
375 if (items < 1 && ferror(f) != 0)
378 ALICEVISION_THROW_ERROR(
"[IO] failed to write 1 int to " << fileName <<
", msg: " << strerror(errno));
380 items = fwrite(&(*a)[0],
sizeof(T), n, f);
381 if (items < n && ferror(f) != 0)
384 ALICEVISION_THROW_ERROR(
"[IO] failed to write n items to " << fileName <<
", msg: " << strerror(errno));
404 uLong comprLen = uLong((
double)(
sizeof(T) * a->size()) * 1.02) + 12;
405 Byte* compr = (Byte*)calloc((uInt)comprLen, 1);
406 int err = compress(compr, &comprLen, (
const Bytef*)(&(*a)[0]),
sizeof(T) * a->size());
410 ALICEVISION_LOG_ERROR(
"compress error " << err <<
" : " << (
sizeof(T) * a->size()) <<
" -> " << comprLen <<
", n " << a->size());
412 FILE* f = fopen(fileName.c_str(),
"wb");
416 ALICEVISION_THROW_ERROR(
"[IO] file " << fileName <<
" could not be opened, msg: " << strerror(errno));
421 int items = fwrite(&n,
sizeof(
int), 1, f);
422 if (items < 1 && ferror(f) != 0)
426 ALICEVISION_THROW_ERROR(
"[IO] failed to write 1 int to " << fileName <<
", msg: " << strerror(errno));
428 items = fwrite(&(*a)[0],
sizeof(T), n, f);
429 if (items < 1 && ferror(f) != 0)
433 ALICEVISION_THROW_ERROR(
"[IO] failed to write " << n <<
" items to " << fileName <<
", msg: " << strerror(errno));
440 FILE* f = fopen(fileName.c_str(),
"wb");
444 ALICEVISION_THROW_ERROR(
"[IO] file " << fileName <<
" could not be opened, msg: " << strerror(errno));
447 int items = fwrite(&n,
sizeof(
int), 1, f);
448 if (items < 1 && ferror(f) != 0)
452 ALICEVISION_THROW_ERROR(
"[IO] failed to write 1 int to " << fileName <<
", msg: " << strerror(errno));
455 items = fwrite(&n,
sizeof(
int), 1, f);
456 if (items < 1 && ferror(f) != 0)
460 ALICEVISION_THROW_ERROR(
"[IO] failed to write 1 int to " << fileName <<
", msg: " << strerror(errno));
462 items = fwrite(&comprLen,
sizeof(uLong), 1, f);
463 if (items < 1 && ferror(f) != 0)
467 ALICEVISION_THROW_ERROR(
"[IO] failed to write 1 uLong to " << fileName <<
", msg: " << strerror(errno));
469 items = fwrite(compr,
sizeof(Byte), comprLen, f);
470 if (items < 1 && ferror(f) != 0)
474 ALICEVISION_THROW_ERROR(
"[IO] failed to write " << comprLen <<
" items to " << fileName <<
", msg: " << strerror(errno));
484 StaticVector<T>* loadArrayFromFile(
const std::string& fileName,
bool printfWarning =
false)
486 ALICEVISION_LOG_DEBUG(
"[IO] loadArrayFromFile: " << fileName);
488 FILE* f = fopen(fileName.c_str(),
"rb");
491 ALICEVISION_THROW_ERROR(
"loadArrayFromFile : can't open file " << fileName);
496 size_t retval = fread(&n,
sizeof(
int), 1, f);
500 ALICEVISION_THROW_ERROR(
"[IO] loadArrayFromFile: can't read array size (1) from " << fileName);
502 StaticVector<T>* a = NULL;
506 retval = fread(&n,
sizeof(
int), 1, f);
510 ALICEVISION_THROW_ERROR(
"[IO] loadArrayFromFile: can't read array size (2)");
512 a =
new StaticVector<T>();
516 retval = fread(&comprLen,
sizeof(uLong), 1, f);
521 ALICEVISION_THROW_ERROR(
"[IO] loadArrayFromFile: can't read ulong elem size");
523 Byte* compr = (Byte*)calloc((uInt)comprLen, 1);
524 retval = fread(compr,
sizeof(Byte), comprLen, f);
525 if (retval != comprLen)
529 ALICEVISION_THROW_ERROR(
"[IO] loadArrayFromFile: can't read blob");
532 uLong uncomprLen =
sizeof(T) * n;
533 int err = uncompress((Bytef*)(&(*a)[0]), &uncomprLen, compr, comprLen);
539 ALICEVISION_THROW_ERROR(
"uncompress error " << err <<
" : " << (
sizeof(T) * n) <<
" -> " << uncomprLen <<
", n " << n);
542 if (uncomprLen !=
sizeof(T) * n)
546 ALICEVISION_THROW_ERROR(
"loadArrayFromFile: uncompression failed uncomprLen!=sizeof(T)*n");
553 a =
new StaticVector<T>();
555 size_t retval = fread(&(*a)[0],
sizeof(T), n, f);
560 ALICEVISION_THROW_ERROR(
"[IO] loadArrayFromFile: can't read n elements");
571 bool loadArrayFromFile(StaticVector<T>& out,
const std::string& fileName,
bool printfWarning =
false)
573 ALICEVISION_LOG_DEBUG(
"[IO] loadArrayFromFile: " << fileName);
575 FILE* f = fopen(fileName.c_str(),
"rb");
578 throw std::runtime_error(
"loadArrayFromFile : can't open file " + fileName);
583 size_t retval = fread(&n,
sizeof(
int), 1, f);
585 ALICEVISION_LOG_WARNING(
"[IO] loadArrayFromFile: can't read array size (1) from " << fileName);
590 retval = fread(&n,
sizeof(
int), 1, f);
592 ALICEVISION_LOG_WARNING(
"[IO] loadArrayFromFile: can't read array size (2)");
596 retval = fread(&comprLen,
sizeof(uLong), 1, f);
598 ALICEVISION_LOG_WARNING(
"[IO] loadArrayFromFile: can't read ulong elem size");
599 Byte* compr = (Byte*)calloc((uInt)comprLen, 1);
600 retval = fread(compr,
sizeof(Byte), comprLen, f);
601 if (retval != comprLen)
602 ALICEVISION_LOG_WARNING(
"[IO] loadArrayFromFile: can't read blob");
604 uLong uncomprLen =
sizeof(T) * n;
605 int err = uncompress((Bytef*)out.getDataWritable().data(), &uncomprLen, compr, comprLen);
609 ALICEVISION_LOG_ERROR(
"uncompress error " << err <<
" : " << (
sizeof(T) * n) <<
" -> " << uncomprLen <<
", n " << n);
612 if (uncomprLen !=
sizeof(T) * n)
615 throw std::runtime_error(
"loadArrayFromFile: uncompression failed uncomprLen!=sizeof(T)*n");
623 size_t retval = fread(out.getDataWritable().data(),
sizeof(T), n, f);
625 ALICEVISION_LOG_WARNING(
"[IO] loadArrayFromFile: can't read n elements");
635 void loadArrayFromFileIntoArray(StaticVector<T>* a,
const std::string& fileName,
bool printfWarning =
false)
637 ALICEVISION_LOG_DEBUG(
"[IO] loadArrayFromFileIntoArray: " << fileName);
639 FILE* f = fopen(fileName.c_str(),
"rb");
642 ALICEVISION_THROW_ERROR(
"loadArrayFromFileIntoArray: can not open file: " << fileName);
645 fread(&n,
sizeof(
int), 1, f);
649 fread(&n,
sizeof(
int), 1, f);
653 ALICEVISION_THROW_ERROR(
"loadArrayFromFileIntoArray: expected length " << a->size() <<
" loaded length " << n);
657 fread(&comprLen,
sizeof(uLong), 1, f);
658 Byte* compr = (Byte*)calloc((uInt)comprLen, 1);
659 fread(compr,
sizeof(Byte), comprLen, f);
661 uLong uncomprLen =
sizeof(T) * n;
662 int err = uncompress((Bytef*)(&(*a)[0]), &uncomprLen, compr, comprLen);
667 ALICEVISION_THROW_ERROR(
"uncompress error " << err <<
" : " << (
sizeof(T) * n) <<
" -> " << uncomprLen <<
", n " << n);
670 if (uncomprLen !=
sizeof(T) * n)
673 ALICEVISION_THROW_ERROR(
"loadArrayFromFileIntoArray: uncompression failed uncomprLen!=sizeof(T)*n");
683 ALICEVISION_THROW_ERROR(
"loadArrayFromFileIntoArray: expected length " << a->size() <<
" loaded length " << n);
685 fread(&(*a)[0],
sizeof(T), n, f);
691 int getArrayLengthFromFile(
const std::string& fileName);
694 void deleteAllPointers(StaticVector<T*>& vec)
696 for (
int i = 0; i < vec.size(); ++i)
707 void deleteArrayOfArrays(StaticVector<StaticVector<T>*>** aa)
709 for (
int i = 0; i < (*aa)->size(); i++)
711 if ((*(*aa))[i] != NULL)
713 delete ((*(*aa))[i]);
721 void deleteArrayOfArrays(StaticVector<StaticVector<T>*>& aa)
723 for (
int i = 0; i < aa.size(); i++)
735 StaticVector<StaticVector<T>*>* cloneArrayOfArrays(StaticVector<StaticVector<T>*>* inAOA)
737 StaticVector<StaticVector<T>*>* outAOA =
new StaticVector<StaticVector<T>*>();
738 outAOA->reserve(inAOA->size());
740 for (
int i = 0; i < inAOA->size(); i++)
742 if ((*inAOA)[i] == NULL)
744 outAOA->push_back(NULL);
748 StaticVector<T>* outA =
new StaticVector<T>();
749 outA->reserve((*inAOA)[i]->size());
750 outA->push_back_arr((*inAOA)[i]);
751 outAOA->push_back(outA);