void SortUtils::Sort(SortBy sortBy, SortOrder sortOrder, SortAttribute attributes, DatabaseResults& items, int limitEnd /* = -1 */, int limitStart /* = 0 */) { if (sortBy != SortByNone) { // get the matching SortPreparator SortPreparator preparator = getPreparator(sortBy); if (preparator != NULL) { Fields sortingFields = GetFieldsForSorting(sortBy); // Prepare the string used for sorting and store it under FieldSort for (DatabaseResults::iterator item = items.begin(); item != items.end(); ++item) { // add all fields to the item that are required for sorting if they are currently missing for (Fields::const_iterator field = sortingFields.begin(); field != sortingFields.end(); ++field) { if (item->find(*field) == item->end()) item->insert(std::pair<Field, CVariant>(*field, CVariant::ConstNullVariant)); } std::wstring sortLabel; g_charsetConverter.utf8ToW(preparator(attributes, *item), sortLabel, false); item->insert(std::pair<Field, CVariant>(FieldSort, CVariant(sortLabel))); } // Do the sorting std::stable_sort(items.begin(), items.end(), getSorter(sortOrder, attributes)); } } if (limitStart > 0 && (size_t)limitStart < items.size()) { items.erase(items.begin(), items.begin() + limitStart); limitEnd -= limitStart; } if (limitEnd > 0 && (size_t)limitEnd < items.size()) items.erase(items.begin() + limitEnd, items.end()); }