/*
** ssort.d (C) Helmut Leitner 2003
** struct sort example
*/

struct As // a struct
{
    int x;
    char [] name;

    int cmp(As *p2)
    {
        int a = x;
        int b = p2.x;
        printf("compare %d %d\n",a,b);
        return a < b ? -1 : a > b ? 1 : 0;
    }
}

class TypeInfo_S8ssort_As : TypeInfo
{
    int tsize()
    {
        return As.size;
    }

    int compare_name(void *p1, void *p2)
    {
        char [] a = ((As *) p1).name;
        char [] b = ((As *) p2).name;
        // printf("compare %d %d\n",a,b);
        return a < b ? -1 : a > b ? 1 : 0;
    }

    int compare_x(void *p1, void *p2)
    {
        int a = ((As *) p1).x;
        int b = ((As *) p2).x;
        // printf("compare %d %d\n",a,b);
        return a < b ? -1 : a > b ? 1 : 0;
    }

    int compare(void *p1, void *p2)
    {
        return compare_name(p1,p2);
    }
}

void AsPrint(As a) {
    printf("x=%d name=%.*s\n",a.x,a.name);
}

As sasar[3]= [      // static As array
    { 2, "Gamma"  },
    { 1, "Beta"   },
    { 3, "Alpha"  }
];

void AsArrayPrintTitle(As [] array, char [] title)
{
    if(title.length) {
        printf("%.*s",title);
    }
    for(int i=0; i<array.length; i++)
    {
        AsPrint(array[i]);
    }
}

int main()
{
    AsArrayPrintTitle(sasar,"\nbefore sorting:\n");
    sasar.sort;
    AsArrayPrintTitle(sasar,"\nafter sorting:\n");

    return (0);
}
