#ifndef COSMOPOLITAN_TOOL_PLINKO_LIB_GC_H_
#define COSMOPOLITAN_TOOL_PLINKO_LIB_GC_H_
#include "tool/plinko/lib/types.h"
COSMOPOLITAN_C_START_

struct Gc {
  int A, B, C;
  unsigned n;
  unsigned noop;
  unsigned *P;
  dword M[];
};

int MarkSweep(int, int);
struct Gc *NewGc(int);
int Census(struct Gc *);
void Sweep(struct Gc *);
void Marker(const dword[], int, int);
int Relocater(const dword[], const unsigned[], int, int);

forceinline int Relocate(const struct Gc *G, int x) {
  if (x >= G->C) return x;
  return Relocater(G->M, G->P, G->A, x);
}

forceinline void Mark(struct Gc *G, int x) {
  if (x >= G->A) return;
  Marker(G->M, G->A, x);
}

COSMOPOLITAN_C_END_
#endif /* COSMOPOLITAN_TOOL_PLINKO_LIB_GC_H_ */