// { dg-do run }
|
// { dg-do run }
|
#include
|
#include
|
#include
|
#include
|
|
|
template
|
template
|
class List {
|
class List {
|
public:
|
public:
|
int len;
|
int len;
|
T *array;
|
T *array;
|
|
|
int length() const { return( len ); }
|
int length() const { return( len ); }
|
|
|
List() : len( 0 ), array( 0 ) {}
|
List() : len( 0 ), array( 0 ) {}
|
};
|
};
|
|
|
template
|
template
|
int AlgoStdCompare(const T* a, const T* b) {
|
int AlgoStdCompare(const T* a, const T* b) {
|
if (*a < *b)
|
if (*a < *b)
|
return -1;
|
return -1;
|
else
|
else
|
return (*a > *b); // 0 if equal, 1 if greater
|
return (*a > *b); // 0 if equal, 1 if greater
|
}
|
}
|
|
|
int AlgoStdCompare(const char* const* a, const char * const*b)
|
int AlgoStdCompare(const char* const* a, const char * const*b)
|
{
|
{
|
return strcmp(*a,*b);
|
return strcmp(*a,*b);
|
}
|
}
|
|
|
template
|
template
|
void AlgoFixupSort(List< T >* , int, int ) {
|
void AlgoFixupSort(List< T >* , int, int ) {
|
}
|
}
|
|
|
template
|
template
|
void AlgoSort(int (*compare)(const T *, const T *),
|
void AlgoSort(int (*compare)(const T *, const T *),
|
void (*fixup)( List *, int first, int last),
|
void (*fixup)( List *, int first, int last),
|
List< T >* theList, int first, int last) {
|
List< T >* theList, int first, int last) {
|
if (last < 0)
|
if (last < 0)
|
last = theList->length()-1;
|
last = theList->length()-1;
|
|
|
qsort(theList->array+first, last-first+1, sizeof(T),
|
qsort(theList->array+first, last-first+1, sizeof(T),
|
(int (*)(const void *, const void *))compare);
|
(int (*)(const void *, const void *))compare);
|
if (fixup)
|
if (fixup)
|
fixup(theList, first, last);
|
fixup(theList, first, last);
|
}
|
}
|
|
|
template
|
template
|
void AlgoSort(List< T >* theList, int first = 0, int last = -1) {
|
void AlgoSort(List< T >* theList, int first = 0, int last = -1) {
|
int (*compare)(const T*, const T*) = AlgoStdCompare;
|
int (*compare)(const T*, const T*) = AlgoStdCompare;
|
void (*fixup)( List *, int first, int last) = AlgoFixupSort;
|
void (*fixup)( List *, int first, int last) = AlgoFixupSort;
|
|
|
AlgoSort(compare, fixup, theList, first, last);
|
AlgoSort(compare, fixup, theList, first, last);
|
}
|
}
|
|
|
int
|
int
|
main()
|
main()
|
{
|
{
|
List slist;
|
List slist;
|
AlgoSort( &slist );
|
AlgoSort( &slist );
|
|
|
List ilist;
|
List ilist;
|
AlgoSort( &ilist );
|
AlgoSort( &ilist );
|
}
|
}
|
|
|