void MultiList::sortList() { if (ITEM_NONE == mSortColumnIndex) return; ListPtr list = mVectorColumnInfo[mSortColumnIndex].list; size_t count = list->getItemCount(); if (0 == count) return; VectorSizeT vec; size_t size = mToSortIndex.size(); vec.resize(size); for (size_t pos=0; pos<size; ++pos) vec[mToSortIndex[pos]] = pos; struct Keeper { inline void keep(VectorSizeT & vec, VectorSizeT & vec2, VectorColumnInfo & info, size_t _index) { text.resize(info.size()); std::vector<Ogre::UTFString>::iterator itext = text.begin(); for (VectorColumnInfo::iterator iter=info.begin(); iter!=info.end(); ++iter, ++itext) { (*itext) = (*iter).list->getItem(_index); } index1 = _index; index2 = vec2[_index]; } inline void restore(VectorSizeT & vec, VectorSizeT & vec2, VectorColumnInfo & info, size_t _index) { std::vector<Ogre::UTFString>::iterator itext = text.begin(); for (VectorColumnInfo::iterator iter=info.begin(); iter!=info.end(); ++iter, ++itext) { (*iter).list->setItem(_index, *itext); } vec[vec2[_index]] = index1; vec2[_index] = index2; } inline void swap(VectorSizeT & vec, VectorSizeT & vec2, VectorColumnInfo & info, size_t _index1, size_t _index2) { for (VectorColumnInfo::iterator iter=info.begin(); iter!=info.end(); ++iter) { (*iter).list->setItem(_index1, (*iter).list->getItem(_index2)); } vec[vec2[_index1]] = _index2; vec2[_index1] = vec2[_index2]; } std::vector<Ogre::UTFString> text; size_t index1, index2; }; Keeper keeper; int step = (int)count/2; if (mSortUp) { for( ; step>0 ; ) { for( size_t i=0; i<(count-step); ++i ) { int j = (int)i; while ( (j>=0) && (list->getItem(j) > list->getItem(j+step)) ){ keeper.keep(mToSortIndex, vec, mVectorColumnInfo, j); keeper.swap(mToSortIndex, vec, mVectorColumnInfo, j, j+step); keeper.restore(mToSortIndex, vec, mVectorColumnInfo, j+step); --j; } } step >>= 1; } } else { for( ; step>0 ; ) {