On Fri, Oct 05, 2018 at 09:36:28PM +0200, René Scharfe wrote:
> Am 05.10.2018 um 21:08 schrieb Jeff King:
> > On Fri, Oct 05, 2018 at 08:48:27PM +0200, René Scharfe wrote:
> >> +#define DEFINE_SORT(name, type, compare) \
> >> +static int compare##_void(const void *one, const void *two)
> >> \
> >> +{ \
> >> + return compare(one, two); \
> >> +} \
> >> +static void name(type base, size_t nmemb) \
> >> +{ \
> >> + const type dummy = NULL; \
> >> + if (nmemb > 1) \
> >> + qsort(base, nmemb, sizeof(base[0]), compare##_void); \
> >> + else if (0) \
> >> + compare(dummy, dummy); \
> >> +}
> >
> > I do like that this removes the need to have the code block aspart of
> > the macro.
> >
> > Did you measure to see if there is any runtime impact?
>
> No, but I wouldn't expect any -- the generated code should be the same
> in most cases.
>
> Here's an example: https://godbolt.org/z/gwXENy.
OK, that's good enough for me.
> The typed comparison function can be inlined into the one with the void
> pointers, though.
Right, that makes sense. I suspect it depends on the comparison function
being static, but in a DEFINE_SORT() world, they generally could be.
So I like this approach.
-Peff