From 85f3322d21230060885d626dbc5892dce90631cd Mon Sep 17 00:00:00 2001
From: Aleksander Alekseev <aleksander@timescale.com>
Date: Fri, 19 Apr 2024 12:33:52 +0300
Subject: [PATCH v1] Use macro to define the number of enum values

Refactoring in the interest of code consistency, a follow-up to 2e068db56e31.

The argument against inserting a special enum value at the end of the enum
definition is that a switch statement might generate a compiler warning unless
it has a default clause.

Aleksander Alekseev, reviewed by TODO FIXME

Discussion: https://postgr.es/m/CAJ7c6TMsiaV5urU_Pq6zJ2tXPDwk69-NKVh4AMN5XrRiM7N%2BGA%40mail.gmail.com
---
 contrib/pg_stat_statements/pg_stat_statements.c | 6 +++---
 src/backend/postmaster/autovacuum.c             | 5 +++--
 src/bin/pg_dump/pg_backup.h                     | 5 +++--
 src/include/storage/pmsignal.h                  | 6 +++---
 src/include/storage/procsignal.h                | 6 +++---
 5 files changed, 15 insertions(+), 13 deletions(-)

diff --git a/contrib/pg_stat_statements/pg_stat_statements.c b/contrib/pg_stat_statements/pg_stat_statements.c
index 67cec865ba..4fd65ce82d 100644
--- a/contrib/pg_stat_statements/pg_stat_statements.c
+++ b/contrib/pg_stat_statements/pg_stat_statements.c
@@ -125,11 +125,11 @@ typedef enum pgssStoreKind
 	 * and this order is required in pg_stat_statements_internal().
 	 */
 	PGSS_PLAN = 0,
-	PGSS_EXEC,
-
-	PGSS_NUMKIND				/* Must be last value of this enum */
+	PGSS_EXEC
 } pgssStoreKind;
 
+#define PGSS_NUMKIND (PGSS_EXEC+1)
+
 /*
  * Hashtable key that defines the identity of a hashtable entry.  We separate
  * queries by user and by database even if they are otherwise identical.
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index c367ede6f8..48dd1b61b9 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -245,10 +245,11 @@ typedef struct WorkerInfoData *WorkerInfo;
 typedef enum
 {
 	AutoVacForkFailed,			/* failed trying to start a worker */
-	AutoVacRebalance,			/* rebalance the cost limits */
-	AutoVacNumSignals,			/* must be last */
+	AutoVacRebalance			/* rebalance the cost limits */
 }			AutoVacuumSignal;
 
+#define AutoVacNumSignals (AutoVacRebalance+1)
+
 /*
  * Autovacuum workitem array, stored in AutoVacuumShmem->av_workItems.  This
  * list is mostly protected by AutovacuumLock, except that if an item is
diff --git a/src/bin/pg_dump/pg_backup.h b/src/bin/pg_dump/pg_backup.h
index fbf5f1c515..1a03a8a27e 100644
--- a/src/bin/pg_dump/pg_backup.h
+++ b/src/bin/pg_dump/pg_backup.h
@@ -73,10 +73,11 @@ enum _dumpPreparedQueries
 	PREPQUERY_DUMPRANGETYPE,
 	PREPQUERY_DUMPTABLEATTACH,
 	PREPQUERY_GETCOLUMNACLS,
-	PREPQUERY_GETDOMAINCONSTRAINTS,
-	NUM_PREP_QUERIES			/* must be last */
+	PREPQUERY_GETDOMAINCONSTRAINTS
 };
 
+#define NUM_PREP_QUERIES (PREPQUERY_GETDOMAINCONSTRAINTS+1)
+
 /* Parameters needed by ConnectDatabase; same for dump and restore */
 typedef struct _connParams
 {
diff --git a/src/include/storage/pmsignal.h b/src/include/storage/pmsignal.h
index 029b720109..8189a39205 100644
--- a/src/include/storage/pmsignal.h
+++ b/src/include/storage/pmsignal.h
@@ -39,11 +39,11 @@ typedef enum
 	PMSIGNAL_START_AUTOVAC_WORKER,	/* start an autovacuum worker */
 	PMSIGNAL_BACKGROUND_WORKER_CHANGE,	/* background worker state change */
 	PMSIGNAL_START_WALRECEIVER, /* start a walreceiver */
-	PMSIGNAL_ADVANCE_STATE_MACHINE, /* advance postmaster's state machine */
-
-	NUM_PMSIGNALS				/* Must be last value of enum! */
+	PMSIGNAL_ADVANCE_STATE_MACHINE /* advance postmaster's state machine */
 } PMSignalReason;
 
+#define NUM_PMSIGNALS (PMSIGNAL_ADVANCE_STATE_MACHINE+1)
+
 /*
  * Reasons why the postmaster would send SIGQUIT to its children.
  */
diff --git a/src/include/storage/procsignal.h b/src/include/storage/procsignal.h
index 7d290ea7d0..553aec66d3 100644
--- a/src/include/storage/procsignal.h
+++ b/src/include/storage/procsignal.h
@@ -46,11 +46,11 @@ typedef enum
 	PROCSIG_RECOVERY_CONFLICT_LOGICALSLOT,
 	PROCSIG_RECOVERY_CONFLICT_BUFFERPIN,
 	PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK,
-	PROCSIG_RECOVERY_CONFLICT_LAST = PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK,
-
-	NUM_PROCSIGNALS				/* Must be last! */
+	PROCSIG_RECOVERY_CONFLICT_LAST = PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK
 } ProcSignalReason;
 
+#define NUM_PROCSIGNALS (PROCSIG_RECOVERY_CONFLICT_LAST+1)
+
 typedef enum
 {
 	PROCSIGNAL_BARRIER_SMGRRELEASE, /* ask smgr to close files */
-- 
2.44.0

