#include <iostream>
#include <cstdlib>
struct Data
{
int key;
int original_index;
};
bool compare_with_itself_called = false;
bool pointer_order_changed = false;
int compare(const void *p1, const void *p2)
{
if(p1==p2)
{
compare_with_itself_called = true;
return 0;
}
const Data *d1 = (const Data*)p1;
const Data *d2 = (const Data*)p2;
if(d1->key < d2->key)
return -1;
if(d2->key < d1->key)
return 1;
bool index_cond = d1->original_index<d2->original_index;
bool ptr_cond = (p1<p2);
if(index_cond!=ptr_cond)
{
pointer_order_changed = true;
}
return index_cond ? -1 : 1;
}
void outputArray(Data d[], unsigned n)
{
for(unsigned i=0; i!=n; ++i)
std::cout << d[i].key << "@" << d[i].original_index << std::endl;
}
int main()
{
const unsigned N = 4;
Data array[N] = { { 8, 0 }, { 8, 1 }, { 1, 2 }, { 1, 3 } };
qsort(array, N, sizeof(Data), compare);
outputArray(array, N);
std::cout << std::endl << "compare_with_itself_called="
<< (compare_with_itself_called ? "true" : "false") << std::endl;
std::cout << "pointer_order_changed="
<< (pointer_order_changed ? "true" : "false") << std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGxpYj4KCnN0cnVjdCBEYXRhCnsKICAgaW50IGtleTsKICAgaW50IG9yaWdpbmFsX2luZGV4Owp9OwoKYm9vbCBjb21wYXJlX3dpdGhfaXRzZWxmX2NhbGxlZCA9IGZhbHNlOwpib29sIHBvaW50ZXJfb3JkZXJfY2hhbmdlZCA9IGZhbHNlOwoKaW50IGNvbXBhcmUoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQp7CiAgIGlmKHAxPT1wMikKICAgewogICAgICBjb21wYXJlX3dpdGhfaXRzZWxmX2NhbGxlZCA9IHRydWU7CiAgICAgIHJldHVybiAwOwogICB9CiAgIGNvbnN0IERhdGEgKmQxID0gKGNvbnN0IERhdGEqKXAxOwogICBjb25zdCBEYXRhICpkMiA9IChjb25zdCBEYXRhKilwMjsKICAgaWYoZDEtPmtleSA8IGQyLT5rZXkpCiAgICAgcmV0dXJuIC0xOwogICBpZihkMi0+a2V5IDwgZDEtPmtleSkKICAgICByZXR1cm4gMTsKICAgYm9vbCBpbmRleF9jb25kID0gZDEtPm9yaWdpbmFsX2luZGV4PGQyLT5vcmlnaW5hbF9pbmRleDsKICAgYm9vbCBwdHJfY29uZCA9IChwMTxwMik7CiAgIGlmKGluZGV4X2NvbmQhPXB0cl9jb25kKQogICB7CiAgICAgIHBvaW50ZXJfb3JkZXJfY2hhbmdlZCA9IHRydWU7CiAgIH0KICAgcmV0dXJuIGluZGV4X2NvbmQgPyAtMSA6IDE7Cn0KCnZvaWQgb3V0cHV0QXJyYXkoRGF0YSBkW10sIHVuc2lnbmVkIG4pCnsKICAgZm9yKHVuc2lnbmVkIGk9MDsgaSE9bjsgKytpKQogICAgICBzdGQ6OmNvdXQgPDwgZFtpXS5rZXkgPDwgIkAiIDw8IGRbaV0ub3JpZ2luYWxfaW5kZXggPDwgc3RkOjplbmRsOwp9CgppbnQgbWFpbigpCnsKICAgY29uc3QgdW5zaWduZWQgTiA9IDQ7CiAgIERhdGEgYXJyYXlbTl0gPSB7IHsgOCwgMCB9LCB7IDgsIDEgfSwgeyAxLCAyIH0sIHsgMSwgMyB9IH07CiAgIHFzb3J0KGFycmF5LCBOLCBzaXplb2YoRGF0YSksIGNvbXBhcmUpOwogICBvdXRwdXRBcnJheShhcnJheSwgTik7CiAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGwgPDwgImNvbXBhcmVfd2l0aF9pdHNlbGZfY2FsbGVkPSIKICAgICAgPDwgKGNvbXBhcmVfd2l0aF9pdHNlbGZfY2FsbGVkID8gInRydWUiIDogImZhbHNlIikgPDwgc3RkOjplbmRsOwogICBzdGQ6OmNvdXQgPDwgInBvaW50ZXJfb3JkZXJfY2hhbmdlZD0iCiAgICAgIDw8IChwb2ludGVyX29yZGVyX2NoYW5nZWQgPyAidHJ1ZSIgOiAiZmFsc2UiKSA8PCBzdGQ6OmVuZGw7CiAgIHJldHVybiAwOwp9