/* ----------
 *	pgstat_kind.h
 *
 *	Definitions related to the statistics kinds for the PostgreSQL
 *	cumulative statistics system.  Can be included in backend or
 *	frontend code.
 *
 *	Copyright (c) 2001-2025, PostgreSQL Global Development Group
 *
 *	src/include/utils/pgstat_kind.h
 * ----------
 */
#ifndef PGSTAT_KIND_H
#define PGSTAT_KIND_H

/* The types of statistics entries */
#define PgStat_Kind uint32

/* Range of IDs allowed, for built-in and custom kinds */
#define PGSTAT_KIND_MIN	1		/* Minimum ID allowed */
#define PGSTAT_KIND_MAX	256		/* Maximum ID allowed */

/* use 0 for INVALID, to catch zero-initialized data */
#define PGSTAT_KIND_INVALID 0

/* stats for variable-numbered objects */
#define PGSTAT_KIND_DATABASE	1	/* database-wide statistics */
#define PGSTAT_KIND_RELATION	2	/* per-table statistics */
#define PGSTAT_KIND_FUNCTION	3	/* per-function statistics */
#define PGSTAT_KIND_REPLSLOT	4	/* per-slot statistics */
#define PGSTAT_KIND_SUBSCRIPTION	5	/* per-subscription statistics */
#define PGSTAT_KIND_BACKEND	6	/* per-backend statistics */

/* stats for fixed-numbered objects */
#define PGSTAT_KIND_ARCHIVER	7
#define PGSTAT_KIND_BGWRITER	8
#define PGSTAT_KIND_CHECKPOINTER	9
#define PGSTAT_KIND_IO	10
#define PGSTAT_KIND_SLRU	11
#define PGSTAT_KIND_WAL	12

#define PGSTAT_KIND_BUILTIN_MIN PGSTAT_KIND_DATABASE
#define PGSTAT_KIND_BUILTIN_MAX PGSTAT_KIND_WAL
#define PGSTAT_KIND_BUILTIN_SIZE (PGSTAT_KIND_BUILTIN_MAX + 1)

/* Custom stats kinds */

/* Range of IDs allowed for custom stats kinds */
#define PGSTAT_KIND_CUSTOM_MIN	128
#define PGSTAT_KIND_CUSTOM_MAX	PGSTAT_KIND_MAX
#define PGSTAT_KIND_CUSTOM_SIZE	(PGSTAT_KIND_CUSTOM_MAX - PGSTAT_KIND_CUSTOM_MIN + 1)

/*
 * PgStat_Kind to use for extensions that require an ID, but are still in
 * development and have not reserved their own unique kind ID yet. See:
 * https://wiki.postgresql.org/wiki/CustomCumulativeStats
 */
#define PGSTAT_KIND_EXPERIMENTAL	128

static inline bool
pgstat_is_kind_builtin(PgStat_Kind kind)
{
	return kind >= PGSTAT_KIND_BUILTIN_MIN && kind <= PGSTAT_KIND_BUILTIN_MAX;
}

static inline bool
pgstat_is_kind_custom(PgStat_Kind kind)
{
	return kind >= PGSTAT_KIND_CUSTOM_MIN && kind <= PGSTAT_KIND_CUSTOM_MAX;
}

#endif							/* PGSTAT_KIND_H */
