test and ensure C++ compatibility of chess headers default tip

Tue, 08 Sep 2026 14:34:48 +0200

author
Mike Becker <universe@uap-core.de>
date
Tue, 08 Sep 2026 14:34:48 +0200
changeset 224
93e0e89496fe
parent 223
e2519b3dd5e7

test and ensure C++ compatibility of chess headers

do not need C++ compatibility of terminal-chess application, though

relates to #986

Makefile file | annotate | diff | comparison | revisions
src/chess/bishop.h file | annotate | diff | comparison | revisions
src/chess/knight.h file | annotate | diff | comparison | revisions
src/chess/queen.h file | annotate | diff | comparison | revisions
src/chess/rules.h file | annotate | diff | comparison | revisions
src/input.h file | annotate | diff | comparison | revisions
src/network.h file | annotate | diff | comparison | revisions
test/test.cpp file | annotate | diff | comparison | revisions
--- a/Makefile	Tue Sep 08 13:55:48 2026 +0200
+++ b/Makefile	Tue Sep 08 14:34:48 2026 +0200
@@ -36,6 +36,11 @@
 tests: $(BUILDDIR) $(BUILDDIR)/libchess$(LIB_EXT) FORCE
 	cd test && $(MAKE)
 
+# only to be called specifically - not included in "all" target
+# we don't want to require that CXX even exists
+test-cpp: test/test.cpp
+	test -n '$(CXX)' && $(CXX) -o /dev/null -Isrc -c $<
+
 check: tests FORCE
 	$(BUILDDIR)/run-tests
 
--- a/src/chess/bishop.h	Tue Sep 08 13:55:48 2026 +0200
+++ b/src/chess/bishop.h	Tue Sep 08 14:34:48 2026 +0200
@@ -28,11 +28,11 @@
  */
 
 #ifndef BISHOP_H
-#define	BISHOP_H
+#define BISHOP_H
 
 #include "rules.h"
 
-#ifdef	__cplusplus
+#ifdef  __cplusplus
 extern "C" {
 #endif
 
@@ -45,9 +45,9 @@
 #define bishop_moves_allowed(gamestate, color, file, rank, moves) \
         filter_moves_allowed(gamestate, color, file, rank, moves, bishop_moves)
 
-#ifdef	__cplusplus
+#ifdef  __cplusplus
 }
 #endif
 
-#endif	/* BISHOP_H */
+#endif  /* BISHOP_H */
 
--- a/src/chess/knight.h	Tue Sep 08 13:55:48 2026 +0200
+++ b/src/chess/knight.h	Tue Sep 08 14:34:48 2026 +0200
@@ -28,11 +28,11 @@
  */
 
 #ifndef KNIGHT_H
-#define	KNIGHT_H
+#define KNIGHT_H
 
 #include "rules.h"
 
-#ifdef	__cplusplus
+#ifdef  __cplusplus
 extern "C" {
 #endif
 
@@ -45,9 +45,9 @@
 #define knight_moves_allowed(gamestate, color, file, rank, moves) \
         filter_moves_allowed(gamestate, color, file, rank, moves, knight_moves)
 
-#ifdef	__cplusplus
+#ifdef  __cplusplus
 }
 #endif
 
-#endif	/* KNIGHT_H */
+#endif  /* KNIGHT_H */
 
--- a/src/chess/queen.h	Tue Sep 08 13:55:48 2026 +0200
+++ b/src/chess/queen.h	Tue Sep 08 14:34:48 2026 +0200
@@ -28,11 +28,11 @@
  */
 
 #ifndef QUEEN_H
-#define	QUEEN_H
+#define QUEEN_H
 
 #include "rules.h"
 
-#ifdef	__cplusplus
+#ifdef  __cplusplus
 extern "C" {
 #endif
 
@@ -45,9 +45,9 @@
 #define queen_moves_allowed(gamestate, color, file, rank, moves) \
         filter_moves_allowed(gamestate, color, file, rank, moves, queen_moves)
 
-#ifdef	__cplusplus
+#ifdef  __cplusplus
 }
 #endif
 
-#endif	/* QUEEN_H */
+#endif  /* QUEEN_H */
 
--- a/src/chess/rules.h	Tue Sep 08 13:55:48 2026 +0200
+++ b/src/chess/rules.h	Tue Sep 08 14:34:48 2026 +0200
@@ -49,7 +49,11 @@
 #define INVALID_CHECKMATE     11
 #define RULES_VIOLATED        32
 
-#if __STDC_VERSION__ < 202310L
+#ifdef __cplusplus
+extern "C" {
+#define enum_byte(name) enum e##name : uint8_t
+#define typedef_enum_byte(name) typedef enum e##name name
+#elif __STDC_VERSION__ < 202310L
 /* since #warning is also a C23 feature, the only hope is this: */
 #pragma GCC warning "Type safety for enums is only available since C23"
 #define enum_byte(name) enum e##name
@@ -82,6 +86,7 @@
 #define KING   0x06u
 
 enum_byte(Piece) {
+    NOPIECE = 0,
     WPAWN   = WHITE|PAWN,
     WROOK   = WHITE|ROOK,
     WKNIGHT = WHITE|KNIGHT,
@@ -203,8 +208,8 @@
 static inline bool isfile(char file) {return file >= 'a' && file <= 'h';}
 static inline bool isrank(char rank) {return rank >= '1' && rank <= '8';}
 
-static inline Rank rankidx(char rank) {return rank-'1';}
-static inline File fileidx(char file) {return file-'a';}
+static inline Rank rankidx(char rank) {return (Rank)(rank-'1');}
+static inline File fileidx(char file) {return (File)(file-'a');}
 
 static inline char rankchr(Rank rank) {return (char)rank+'1';}
 static inline char filechr(File file) {return (char)file+'a';}
@@ -348,7 +353,7 @@
  * @param rank the rank
  */
 static inline void piece_remove(GameState *gamestate, File file, Rank rank) {
-    piece_set(gamestate, file, rank, 0);
+    piece_set(gamestate, file, rank, NOPIECE);
 }
 
 typedef size_t(*moves_generator_func)(const GameState *gamestate,
@@ -717,5 +722,9 @@
  */
 bool check_no_material(const GameState *gamestate);
 
+#ifdef __cplusplus
+}
+#endif
+
 #endif	/* RULES_H */
 
--- a/src/input.h	Tue Sep 08 13:55:48 2026 +0200
+++ b/src/input.h	Tue Sep 08 14:34:48 2026 +0200
@@ -32,10 +32,6 @@
 
 #include <stdlib.h>
 
-#ifdef	__cplusplus
-extern "C" {
-#endif
-
 int prompt_yesno(const char *msg);
 
 /**
@@ -52,9 +48,5 @@
 
 int input_getmaxy(void);
 
-#ifdef	__cplusplus
-}
-#endif
-
 #endif	/* INPUT_H */
 
--- a/src/network.h	Tue Sep 08 13:55:48 2026 +0200
+++ b/src/network.h	Tue Sep 08 14:34:48 2026 +0200
@@ -33,10 +33,6 @@
 #include <sys/socket.h>
 #include <stdint.h>
 
-#ifdef	__cplusplus
-extern "C" {
-#endif
-    
 #define NETCODE_ACCEPT 0x01
 #define NETCODE_DECLINE 0x02
 #define NETCODE_GAMEINFO 0x10
@@ -156,9 +152,5 @@
     return net_ntohl(l);
 }
 
-#ifdef	__cplusplus
-}
-#endif
-
 #endif	/* TCHESS_NETWORK_H */
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/test.cpp	Tue Sep 08 14:34:48 2026 +0200
@@ -0,0 +1,43 @@
+/*
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+ *
+ * Copyright 2026 Mike Becker. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *   1. Redistributions of source code must retain the above copyright
+ *      notice, this list of conditions and the following disclaimer.
+ *
+ *   2. Redistributions in binary form must reproduce the above copyright
+ *      notice, this list of conditions and the following disclaimer in the
+ *      documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include "chess/rules.h"
+#include "chess/fen.h"
+#include "chess/pgn.h"
+
+// the only purpose of this file is to check
+// that the headers compile flawlessly with a C++ compiler
+
+static_assert(sizeof(Color) == 1);
+static_assert(sizeof(Rank) == 1);
+static_assert(sizeof(File) == 1);
+static_assert(sizeof(Piece) == 1);
+
+static_assert(sizeof(Board) == 64);
+

mercurial