void library::sort(sort_type sort) { auto compare = [this, sort](const std::unique_ptr<imgtool_module> &a, const std::unique_ptr<imgtool_module> &b) { return module_compare(a.get(), b.get(), sort) < 0; }; m_modules.sort(compare); }
void imgtool_library_sort(imgtool_library *library, imgtool_libsort_t sort) { imgtool_module *m1; imgtool_module *m2; imgtool_module *target; imgtool_module **before; imgtool_module **after; for (m1 = library->first; m1; m1 = m1->next) { target = m1; for (m2 = m1->next; m2; m2 = m2->next) { while(module_compare(target, m2, sort) > 0) target = m2; } if (target != m1) { /* unlink the target */ before = target->previous ? &target->previous->next : &library->first; after = target->next ? &target->next->previous : &library->last; *before = target->next; *after = target->previous; /* now place the target before m1 */ target->previous = m1->previous; target->next = m1; before = m1->previous ? &m1->previous->next : &library->first; *before = target; m1->previous = target; /* since we changed the order, we have to replace ourselves */ m1 = target; } } }