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>
   179         if (m_max < 
source.m_count + m_count)
   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>
   268 std::ostream& operator << (std::ostream& os, List<T>& 
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);
   379 #endif  // _XSENS_LIST_WITH_MATH && _XSENS_LIST_IO   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];
  1180 #endif  // _XSENS_LIST_HPP_2006_06_08 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". 
 
GLuint GLuint GLsizei count
 
void freeItemsOnDestroy(void)
 
FILE BASE_IMPEXP * fopen(const char *fileName, const char *mode) MRPT_NO_THROWS
An OS-independent version of fopen. 
 
uint32_t m_count
The number of items currently in the list. 
 
void clear(void)
Clears the list without explicitly deleting anything. 
 
void append(const T &item)
Adds an item to the end of the list. 
 
void appendDeepCopy(const List< T > &source)
Adds the contents of the source list to the end of the list. 
 
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 twinSortAscending(List< T2 > &twin)
Sorts the first list in an ascending order, using the T::< operator, the second list will be updated ...
 
uint32_t find(const TB &item) const
Finds an item in an unsorted list (walk over all items) using the T::== operator. ...
 
void remove(const uint32_t index) XSENS_LIST_THROW
Removes an item at the given index in the list. 
 
int BASE_IMPEXP void BASE_IMPEXP fclose(FILE *f)
An OS-independent version of fclose. 
 
void deleteAndRemoveTail(const uint32_t count) XSENS_LIST_THROW
 
void appendShallowCopy(const List< T > &source)
Adds the contents of the source list to the end of the list. 
 
void appendRelated(const TR &item)
Adds a related item to the end of the list, using the T = TR operator. 
 
void freeAndRemoveTail(const uint32_t count) XSENS_LIST_THROW
 
void deleteAndClear(void)
Calls delete for all items in the list and then clears the list. 
 
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...
 
void reverse(void)
Reverse the order of the list, useful for sorted lists that are read/created in the reverse order...
 
const_iterator find(const KEY &key) const
 
char BASE_IMPEXP * strcpy(char *dest, size_t destSize, const char *source) MRPT_NO_THROWS
An OS-independent version of strcpy. 
 
void appendCopy(const TB &item)
Adds a copy of a referenced item to the end of the list. 
 
uint32_t findSorted(const TB &item) const
Finds an item in a sorted list (binary search) using the T::== and T::< operators. 
 
T * m_data
The array containing the items. 
 
void resize(uint32_t newSize)
Resizes the list to at least the given size. 
 
uint32_t insertSortedCopy(const TB &item)
Assumes the list is sorted and inserts a copy of the referenced item at the appropriate spot...
 
void appendList(uint32_t count, const T *lst)
Adds a number of items to the end of the list. 
 
void deleteAndRemove(const uint32_t index) XSENS_LIST_THROW
Removes an item at the given index in the list. 
 
List()
Standard constructor, creates an empty list with some room for items. 
 
void freeAndRemove(const uint32_t index) XSENS_LIST_THROW
Removes an item at the given index in the list. 
 
T & last(void) const XSENS_LIST_THROW
Retrieves the last item. 
 
void swap(const uint32_t i, const uint32_t j) XSENS_LIST_THROW
Swaps two items in the list. 
 
void removeTail(const uint32_t count) XSENS_LIST_THROW
Removes items from the end of the list. 
 
Class function calling janitor class. 
 
void insert(const T &item, const uint32_t index)
Inserts an item at the given index, shifting any items below it down one spot. 
 
uint32_t insertSortedDeref(const T &item)
Assumes the list is sorted by dereferenced values and inserts the item at the appropriate spot...
 
uint32_t insertSorted(const T &item)
Assumes the list is sorted and inserts the item at the appropriate spot. 
 
void isShallowCopyOf(const List< T > &source)
Overwrites the current list with a shallow (memcopy) copy of another list. 
 
void isDeepCopyOf(const List< T > &source)
Make a copy of the list, duplicating list items i with: copy[i] = new TB(*source[i]) ...
 
void sortAscending(void)
Sorts the list in an ascending order, using the T::< operator. 
 
void qSort(uint32_t left, uint32_t right)
Sorts the list in an ascending order, using the T::< operator. 
 
uint32_t removeDuplicateEntriesDeref(void)
Removes any duplicate entries and returns the number of items removed. Items are compared after deref...
 
void qSortDeref(uint32_t left, uint32_t right)
Sorts the list in an ascending order, using the T::< operator on dereferenced list items...
 
#define XSENS_LIST_NOTFOUND
 
uint32_t removeDuplicateEntries(void)
Removes any duplicate entries and returns the number of items removed. Items are compared directly...
 
GLsizei GLsizei GLchar * source
 
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...
 
The namespace of all Xsens software since 2006. 
 
void freeAndClear(void)
Calls free for all items in the list and then clears the list. 
 
#define CMT_LIST_LINEAR_SEARCH_TRESHOLD
 
unsigned __int32 uint32_t
 
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...
 
void sortAscendingDeref(void)
Sorts the list in an ascending order, using the T::< operator on dereferenced list items...
 
void deleteItemsOnDestroy(void)
 
~List()
Destroy the list. This does NOT automatically delete items IN the list.