# HG changeset patch # User Mike Becker # Date 1788870888 -7200 # Node ID 93e0e89496fed1c9ef581e88832a4d64046db67a # Parent e2519b3dd5e75c6f526a181ca12b0bc9975c5e6d test and ensure C++ compatibility of chess headers do not need C++ compatibility of terminal-chess application, though relates to #986 diff -r e2519b3dd5e7 -r 93e0e89496fe Makefile --- 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 diff -r e2519b3dd5e7 -r 93e0e89496fe src/chess/bishop.h --- 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 */ diff -r e2519b3dd5e7 -r 93e0e89496fe src/chess/knight.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 */ diff -r e2519b3dd5e7 -r 93e0e89496fe src/chess/queen.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 */ diff -r e2519b3dd5e7 -r 93e0e89496fe src/chess/rules.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 */ diff -r e2519b3dd5e7 -r 93e0e89496fe src/input.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 -#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 */ diff -r e2519b3dd5e7 -r 93e0e89496fe src/network.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 #include -#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 */ diff -r e2519b3dd5e7 -r 93e0e89496fe test/test.cpp --- /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); +