#ifndef COMMIT_SLAB_IMPL_H
#define COMMIT_SLAB_IMPL_H
-#define MAYBE_UNUSED __attribute__((__unused__))
+#include "git-compat-util.h"
-#define implement_commit_slab(slabname, elemtype) \
- \
-static int stat_ ##slabname## realloc; \
+#define implement_static_commit_slab(slabname, elemtype) \
+ implement_commit_slab(slabname, elemtype, MAYBE_UNUSED static)
+
+#define implement_shared_commit_slab(slabname, elemtype) \
+ implement_commit_slab(slabname, elemtype, )
+
+#define implement_commit_slab(slabname, elemtype, scope) \
\
-static MAYBE_UNUSED void init_ ##slabname## _with_stride(struct slabname *s, \
+scope void init_ ##slabname## _with_stride(struct slabname *s, \
unsigned stride) \
{ \
unsigned int elem_size; \
s->slab = NULL; \
} \
\
-static MAYBE_UNUSED void init_ ##slabname(struct slabname *s) \
+scope void init_ ##slabname(struct slabname *s) \
{ \
init_ ##slabname## _with_stride(s, 1); \
} \
\
-static MAYBE_UNUSED void clear_ ##slabname(struct slabname *s) \
+scope void clear_ ##slabname(struct slabname *s) \
{ \
unsigned int i; \
for (i = 0; i < s->slab_count; i++) \
FREE_AND_NULL(s->slab); \
} \
\
-static MAYBE_UNUSED elemtype *slabname## _at_peek(struct slabname *s, \
+scope elemtype *slabname## _at_peek(struct slabname *s, \
const struct commit *c, \
int add_if_missing) \
{ \
if (!add_if_missing) \
return NULL; \
REALLOC_ARRAY(s->slab, nth_slab + 1); \
- stat_ ##slabname## realloc++; \
for (i = s->slab_count; i <= nth_slab; i++) \
s->slab[i] = NULL; \
s->slab_count = nth_slab + 1; \
return &s->slab[nth_slab][nth_slot * s->stride]; \
} \
\
-static MAYBE_UNUSED elemtype *slabname## _at(struct slabname *s, \
+scope elemtype *slabname## _at(struct slabname *s, \
const struct commit *c) \
{ \
return slabname##_at_peek(s, c, 1); \
} \
\
-static MAYBE_UNUSED elemtype *slabname## _peek(struct slabname *s, \
+scope elemtype *slabname## _peek(struct slabname *s, \
const struct commit *c) \
{ \
return slabname##_at_peek(s, c, 0); \
* to allow a terminating semicolon, which makes instantiations look
* like function declarations. I.e., the expansion of
*
- * implement_commit_slab(indegree, int);
+ * implement_commit_slab(indegree, int, static);
*
* ends in 'struct indegree;'. This would otherwise
* be a syntax error according (at least) to ISO C. It's hard to