10 #ifndef _XSENS_LIST_HPP_2006_06_08
11 #define _XSENS_LIST_HPP_2006_06_08
13 #ifndef _XSENS_LIST_H_2006_06_08
25 # include <malloc/malloc.h>
35 #define CMT_LIST_LINEAR_SEARCH_TRESHOLD 10
42 m_data = (T*) malloc(m_max *
sizeof(T));
55 m_data = (T*) malloc(m_max *
sizeof(T));
66 m_count =
src.m_count;
67 m_data = (T*) malloc(m_max *
sizeof(T));
70 memcpy(m_data,
src.m_data,m_count*
sizeof(T));
81 m_data = (T*) malloc(m_max *
sizeof(T));
103 if (m_manage && m_data != NULL)
109 template <
typename T>
112 for (
unsigned i=0;i<m_count;++i)
117 template <
typename T>
120 for (
unsigned i=0;i<m_count;++i)
125 template <
typename T>
131 template <
typename T>
136 if (newSize == m_max)
138 if (m_count > newSize)
145 m_data = (T*) realloc(m_data,m_max *
sizeof(T));
149 template <
typename T>
152 if (m_count == m_max)
153 resize(m_max + 1 + m_max/2);
154 m_data[m_count++] = item;
157 template <
typename T>
160 if (m_count+
count > m_max)
161 resize(m_max +
count + m_max/2);
162 for (
unsigned i = 0; i <
count; ++i)
163 m_data[m_count++] = lst[i];
166 template <
typename T>
169 if (m_max <
source.m_count + m_count)
170 resize(
source.m_count + m_count);
173 m_data[m_count++] =
new T(*
source.m_data[i]);
176 template <
typename T>
180 resize(
source.m_count + m_count);
183 m_data[m_count++] =
source.m_data[i];
186 template <
typename T>
187 template <
typename TB>
190 if (m_count == m_max)
191 resize(m_max + 1 + m_max/2);
192 m_data[m_count++] =
new TB(item);
195 template <
typename T>
196 template <
typename TR>
199 if (m_count == m_max)
200 resize(m_max + 1 + m_max/2);
201 m_data[m_count++] = item;
204 template <
typename T>
207 #ifdef _XSENS_LIST_RANGE_CHECKS
209 throw "List.last: empty list";
211 return m_data[m_count-1];
214 template <
typename T>
217 #ifdef _XSENS_LIST_RANGE_CHECKS
218 if (
index >= m_count)
219 throw "List.get: index out of bounds";
221 if (
index >= m_count)
222 return m_data[m_count-1];
223 return m_data[
index];
226 template <
typename T>
229 if (m_count == m_max)
230 resize(1 + m_max + (m_max >> 1));
231 for (
unsigned i=m_count;i>
index;--i)
232 m_data[i] = m_data[i-1];
233 if (
index <= m_count)
234 m_data[
index] = item;
236 m_data[m_count] = item;
240 template <
typename T>
241 template <
typename TB>
244 if (m_count == m_max)
245 resize(1 + m_max + (m_max >> 1));
246 for (
unsigned i=m_count;i>
index;--i)
247 m_data[i] = m_data[i-1];
248 if (
index <= m_count)
249 m_data[
index] =
new TB(item);
251 m_data[m_count] =
new TB(item);
255 template <
typename T>
258 #ifdef _XSENS_LIST_RANGE_CHECKS
259 if (
index >= m_count)
260 throw "List[]: index out of bounds";
262 return m_data[
index];
265 #if defined(_XSENS_LIST_WITH_MATH) && defined(_XSENS_LIST_IO)
267 template <
typename T>
270 os <<
'[' <<
t.length() <<
"]{ ";
271 for (
unsigned i=0 ; i<
t.length() ; ++i)
277 #ifndef _CMTMATLABHEADERS
278 #define _CMTMATLABHEADERS
279 struct MatlabFileHeader {
280 char description[116];
287 struct MatlabDataHeader {
292 struct MatlabMatrixHeader {
299 int32_t dimensions_m, dimensions_n;
307 template <
typename T>
308 void List<T>::saveAsMatlab(
const char* filename,
const char *varname)
const
313 MatlabFileHeader file_header;
314 MatlabMatrixHeader matrix_header;
316 MatlabDataHeader inner_header;
317 MatlabDataHeader outer_header;
319 FILE* fp =
fopen(filename,
"wb");
323 strcpy(file_header.description,
"cmtMath/Xsens");
324 for (i = strlen(file_header.description); i <116; ++i)
325 file_header.description[i] =
' ';
326 file_header.data_offset1 = 0;
327 file_header.data_offset2 = 0;
328 file_header.version = 0x0100;
329 file_header.endian = (
int16_t)
'M' << 8 |
'I';
333 matrix_header.flags_data_type = 6;
334 matrix_header.flags_data_size = 8;
335 matrix_header.flags0 = 6;
336 matrix_header.flags1 = 0;
337 matrix_header.dimensions_data_type = 5;
338 matrix_header.dimensions_data_size = 8;
339 matrix_header.dimensions_m = m_count;
340 matrix_header.dimensions_n = m_data[0]->size();
341 matrix_header.name_type = 1;
343 if ( varname == (
char *)NULL )
344 matrix_header.name_length = 0;
346 matrix_header.name_length = (
int32_t) strlen(varname);
348 name_pad = matrix_header.name_length & 7;
350 inner_header.data_type = 9;
351 inner_header.n_bytes =
sizeof(double) * m_count * matrix_header.dimensions_n;
353 outer_header.data_type = 14;
354 outer_header.n_bytes =
sizeof(matrix_header) + matrix_header.name_length + name_pad
355 +
sizeof(MatlabDataHeader) + inner_header.n_bytes;
357 fwrite((
char*) &file_header,
sizeof(MatlabFileHeader),1,fp);
358 fwrite((
char*) &outer_header,
sizeof(MatlabDataHeader),1,fp);
359 fwrite((
char*) &matrix_header,
sizeof(MatlabMatrixHeader),1,fp);
360 fwrite(varname,
sizeof(
char),matrix_header.name_length,fp);
363 fwrite(
"\0\0\0\0\0\0\0",
sizeof(
char),8-name_pad,fp);
365 fwrite((
char*) &inner_header,
sizeof(MatlabDataHeader),1,fp);
370 for ( j = 0; j < (size_t) matrix_header.dimensions_n; j++ )
371 for ( i = 0; i < m_count; i++ )
373 tmp = (*m_data[i])[(
unsigned)j];
374 fwrite(&tmp,
sizeof(
double),1,fp);
381 template <
typename T>
389 pivot = m_data[left];
392 while (!(m_data[right] < pivot) && (left < right))
396 m_data[left] = m_data[right];
399 while (!(pivot < m_data[left]) && (left < right))
401 if (!(left == right))
403 m_data[right] = m_data[left];
407 m_data[left] = pivot;
409 qSort(l_hold, left-1);
411 qSort(left+1, r_hold);
414 template <
typename T>
422 pivot = m_data[left];
425 while (!(*m_data[right] < *pivot) && (left < right))
429 m_data[left] = m_data[right];
432 while (!(*pivot < *m_data[left]) && (left < right))
434 if (!(left == right))
436 m_data[right] = m_data[left];
440 m_data[left] = pivot;
442 qSortDeref(l_hold, left-1);
444 qSortDeref(left+1, r_hold);
449 #define XSENS_LIST_JOBSORT
452 template <
typename T>
457 #if defined(XSENS_LIST_QSORT)
459 #elif defined(XSENS_LIST_COMBSORT)
466 while (gap > 1 || swaps > 0)
470 dgap = floor(((
double) gap) / 1.247330950103979);
472 if (gap == 10 || gap == 9)
478 for (
uint32_t i = 0; i < gappedCount; ++i)
480 if (m_data[i] > m_data[i+gap])
483 m_data[i] = m_data[i+gap];
484 m_data[i+gap] = temp;
489 #elif defined(XSENS_LIST_JOBSORT)
497 Linker* list = (Linker*) malloc(m_count*
sizeof(Linker));
502 list[0].item = m_data[0];
506 for (
uint32_t i = 1; i < m_count; ++i)
509 list[i].item = m_data[i];
510 if (m_data[i] < m_data[curr->index])
512 while (curr->prev != NULL)
515 if (!(m_data[i] < m_data[curr->index]))
518 list[i].next = curr->next;
520 curr->next->prev = &list[i];
521 curr->next = &list[i];
526 if (curr != &list[i])
530 curr->prev = &list[i];
536 while (curr->next != NULL)
539 if (m_data[i] < m_data[curr->index])
543 list[i].prev = curr->prev;
544 curr->prev->next = &list[i];
545 curr->prev = &list[i];
550 if (curr != &list[i])
554 curr->next = &list[i];
561 while (curr->prev != NULL) curr = curr->prev;
564 for (
uint32_t i = 0; i < m_count; ++i)
566 m_data[i] = curr->item;
575 for (
uint32_t i = 1; i < m_count; ++i)
580 if (m_data[j] < m_data[j-1])
583 m_data[j] = m_data[j-1];
594 template <
typename T>
599 #if defined(XSENS_LIST_QSORT)
600 qSortDeref(0,m_count-1);
601 #elif defined(XSENS_LIST_COMBSORT)
608 while (gap > 1 || swaps > 0)
612 dgap = floor(((
double) gap) / 1.247330950103979);
614 if (gap == 10 || gap == 9)
620 for (
uint32_t i = 0; i < gappedCount; ++i)
622 if (*m_data[i+gap] < *m_data[i])
625 m_data[i] = m_data[i+gap];
626 m_data[i+gap] = temp;
631 #elif defined(XSENS_LIST_JOBSORT)
639 Linker* list = (Linker*) malloc(m_count*
sizeof(Linker));
644 list[0].item = m_data[0];
648 for (
uint32_t i = 1; i < m_count; ++i)
651 list[i].item = m_data[i];
652 if (*m_data[i] < *m_data[curr->index])
654 while (curr->prev != NULL)
657 if (!(*m_data[i] < *m_data[curr->index]))
660 list[i].next = curr->next;
662 curr->next->prev = &list[i];
663 curr->next = &list[i];
668 if (curr != &list[i])
672 curr->prev = &list[i];
678 while (curr->next != NULL)
681 if (*m_data[i] < *m_data[curr->index])
685 list[i].prev = curr->prev;
686 curr->prev->next = &list[i];
687 curr->prev = &list[i];
692 if (curr != &list[i])
696 curr->next = &list[i];
703 while (curr->prev != NULL) curr = curr->prev;
706 for (
uint32_t i = 0; i < m_count; ++i)
708 m_data[i] = curr->item;
717 for (
uint32_t i = 1; i < m_count; ++i)
722 if (*(m_data[j]) < *(m_data[j-1]))
725 m_data[j] = m_data[j-1];
736 template <
typename T>
737 template <
typename T2>
743 #ifdef _XSENS_LIST_RANGE_CHECKS
745 throw "List.twinSortAscending: sizes do not match";
752 while (iteration < m_count-1)
755 for (
uint32_t i=iteration+1;i<m_count;++i)
757 if (m_data[i] < m_data[mini])
760 if (mini != iteration)
763 m_data[mini] = m_data[iteration];
764 m_data[iteration] = tmp;
768 twin.
m_data[iteration] = tmp2;
774 template <
typename T>
777 #ifdef _XSENS_LIST_RANGE_CHECKS
778 if (
index >= m_count)
779 throw "List.remove: index out of bounds";
781 if (
index == m_count-1)
787 for (
unsigned i =
index;i < m_count;++i)
788 m_data[i] = m_data[i+1];
791 template <
typename T>
794 #ifdef _XSENS_LIST_RANGE_CHECKS
796 throw "List.removeTail: list size less than remove count";
806 template <
typename T>
809 #ifdef _XSENS_LIST_RANGE_CHECKS
811 throw "List.deleteAndRemoveTail: list size less than remove count";
815 for (
unsigned i = 0;i <
count;++i)
816 delete m_data[--m_count];
822 template <
typename T>
825 #ifdef _XSENS_LIST_RANGE_CHECKS
827 throw "List.freeAndRemoveTail: list size less than remove count";
831 for (
unsigned i = 0;i <
count;++i)
832 free(m_data[--m_count]);
838 template <
typename T>
844 for (
uint32_t j=i+1;j < m_count; ++j)
846 if (m_data[i] == m_data[j])
857 template <
typename T>
863 for (
uint32_t j=i+1;j < m_count; ++j)
865 if (*(m_data[i]) == *(m_data[j]))
876 template <
typename T>
879 #ifdef _XSENS_LIST_RANGE_CHECKS
880 if (
index >= m_count)
881 throw "List.deleteAndRemove: index out of bounds";
883 delete m_data[
index];
884 if (
index == m_count-1)
890 for (
unsigned i =
index;i < m_count;++i)
891 m_data[i] = m_data[i+1];
894 template <
typename T>
897 #ifdef _XSENS_LIST_RANGE_CHECKS
898 if (
index >= m_count)
899 throw "List.freeAndRemove: index out of bounds";
902 if (
index == m_count-1)
908 for (
unsigned i =
index;i < m_count;++i)
909 m_data[i] = m_data[i+1];
912 template <
typename T>
913 template <
typename TB>
917 if (((
const T*)m_data)[i] == item)
922 template <
typename T>
926 if (!fnc(m_data[i],item))
931 template <
typename T>
932 template <
typename TB>
936 if (*(m_data[i]) == item)
941 template <
typename T>
942 template <
typename TB>
956 if (m_data[i-1] == item)
958 if (m_data[i-1] < item)
966 template <
typename T>
967 template <
typename TB>
971 return findDeref(item);
981 if (*(m_data[i-1]) == item)
983 if (*(m_data[i-1]) < item)
991 template <
typename T>
997 for (i=0;i<m_count;++i)
998 if (item < m_data[i])
1015 if (m_data[i-1] == item)
1020 if (m_data[i-1] < item)
1030 template <
typename T>
1036 for (i=0;i<m_count;++i)
1037 if (*item < *m_data[i])
1054 if (*(m_data[i-1]) == *item)
1059 if (*(m_data[i-1]) < *item)
1069 template <
typename T>
1070 template <
typename TB>
1076 for (i=0;i<m_count;++i)
1077 if (item < m_data[i])
1079 insertCopy<TB>(item,i);
1094 if (m_data[i-1] == item)
1096 insertCopy<TB>(item,i-1);
1099 if (m_data[i-1] < item)
1104 insertCopy<TB>(item,
n-1);
1109 template <
typename T>
1120 template <
typename T>
1131 template <
typename T>
1132 template <
typename TB>
1136 if (m_max <
source.m_count)
1138 m_count =
source.m_count;
1140 m_data[i] =
new TB(*
source.m_data[i]);
1143 template <
typename T>
1147 if (m_max <
x.m_count)
1149 m_count =
x.m_count;
1151 m_data[i] =
x.m_data[i];
1154 template <
typename T>
1157 #ifdef _XSENS_LIST_RANGE_CHECKS
1158 if (i >= m_count || j >= m_count)
1159 throw "List.swap: index out of bounds";
1162 m_data[i] = m_data[j];
1166 template <
typename T>
1173 m_data[i] = m_data[
end];
Class function calling janitor class.
void append(const T &item)
Adds an item to the end of the list.
void freeItemsOnDestroy(void)
void appendShallowCopy(const List< T > &source)
Adds the contents of the source list to the end of the list.
uint32_t m_count
The number of items currently in the list.
uint32_t insertSortedDeref(const T &item)
Assumes the list is sorted by dereferenced values and inserts the item at the appropriate spot.
uint32_t removeDuplicateEntries(void)
Removes any duplicate entries and returns the number of items removed. Items are compared directly.
T * m_data
The array containing the items.
T & operator[](const uint32_t index) const XSENS_LIST_THROW
Retrieves the item at the given index. An index beyond the end probably causes an exception.
T & get(const uint32_t index) const XSENS_LIST_THROW
Retrieves the item at the given index. An index beyond the end returns the first item.
uint32_t findDeref(const TB &item) const
Finds an item in an unsorted list (walk over all items) using the T::== operator on dereferenced list...
uint32_t findSorted(const TB &item) const
Finds an item in a sorted list (binary search) using the T::== and T::< operators.
void appendDeepCopy(const List< T > &source)
Adds the contents of the source list to the end of the list.
T & last(void) const XSENS_LIST_THROW
Retrieves the last item.
void sortAscendingDeref(void)
Sorts the list in an ascending order, using the T::< operator on dereferenced list items.
List()
Standard constructor, creates an empty list with some room for items.
void deleteAndRemove(const uint32_t index) XSENS_LIST_THROW
Removes an item at the given index in the list.
void reverse(void)
Reverse the order of the list, useful for sorted lists that are read/created in the reverse order.
void deleteAndRemoveTail(const uint32_t count) XSENS_LIST_THROW
void freeAndRemove(const uint32_t index) XSENS_LIST_THROW
Removes an item at the given index in the list.
~List()
Destroy the list. This does NOT automatically delete items IN the list.
uint32_t find(const TB &item) const
Finds an item in an unsorted list (walk over all items) using the T::== operator.
void qSortDeref(uint32_t left, uint32_t right)
Sorts the list in an ascending order, using the T::< operator on dereferenced list items.
uint32_t findSortedDeref(const TB &item) const
Finds an item in a sorted list (binary search) using the T::== and T::< operators on dereferenced lis...
void insertCopy(const TB &item, const uint32_t index)
Inserts a copy of the referenced item at the given index, shifting any items below it down one spot.
void isShallowCopyOf(const List< T > &source)
Overwrites the current list with a shallow (memcopy) copy of another list.
void swap(const uint32_t i, const uint32_t j) XSENS_LIST_THROW
Swaps two items in the list.
void clear(void)
Clears the list without explicitly deleting anything.
void appendList(uint32_t count, const T *lst)
Adds a number of items to the end of the list.
void appendCopy(const TB &item)
Adds a copy of a referenced item to the end of the list.
void removeTail(const uint32_t count) XSENS_LIST_THROW
Removes items from the end of the list.
void deleteItemsOnDestroy(void)
uint32_t insertSortedCopy(const TB &item)
Assumes the list is sorted and inserts a copy of the referenced item at the appropriate spot.
void freeAndClear(void)
Calls free for all items in the list and then clears the list.
uint32_t removeDuplicateEntriesDeref(void)
Removes any duplicate entries and returns the number of items removed. Items are compared after deref...
void insert(const T &item, const uint32_t index)
Inserts an item at the given index, shifting any items below it down one spot.
void resize(uint32_t newSize)
Resizes the list to at least the given size.
void remove(const uint32_t index) XSENS_LIST_THROW
Removes an item at the given index in the list.
uint32_t insertSorted(const T &item)
Assumes the list is sorted and inserts the item at the appropriate spot.
void deleteAndClear(void)
Calls delete for all items in the list and then clears the list.
void freeAndRemoveTail(const uint32_t count) XSENS_LIST_THROW
void twinSortAscending(List< T2 > &twin)
Sorts the first list in an ascending order, using the T::< operator, the second list will be updated ...
void appendRelated(const TR &item)
Adds a related item to the end of the list, using the T = TR operator.
void qSort(uint32_t left, uint32_t right)
Sorts the list in an ascending order, using the T::< operator.
void sortAscending(void)
Sorts the list in an ascending order, using the T::< operator.
void isDeepCopyOf(const List< T > &source)
Make a copy of the list, duplicating list items i with: copy[i] = new TB(*source[i])
GLuint GLuint GLsizei count
GLsizei GLsizei GLchar * source
char BASE_IMPEXP * strcpy(char *dest, size_t destSize, const char *source) MRPT_NO_THROWS
An OS-independent version of strcpy.
void BASE_IMPEXP memcpy(void *dest, size_t destSize, const void *src, size_t copyCount) MRPT_NO_THROWS
An OS and compiler independent version of "memcpy".
FILE BASE_IMPEXP * fopen(const char *fileName, const char *mode) MRPT_NO_THROWS
An OS-independent version of fopen.
int BASE_IMPEXP void BASE_IMPEXP fclose(FILE *f)
An OS-independent version of fclose.
std::ostream & operator<<(std::ostream &out, MD5 md5)
const_iterator find(const KEY &key) const
The namespace of all Xsens software since 2006.
unsigned __int32 uint32_t
#define XSENS_LIST_NOTFOUND
#define CMT_LIST_LINEAR_SEARCH_TRESHOLD