SDL icon indicating copy to clipboard operation
SDL copied to clipboard

[SDL3] C++ headers & modules

Open CXCubeHD opened this issue 9 months ago • 8 comments

Since SDL3 is in development, I would like to propose that there should be some kind of C++ header generation. This would make using headers way more comfortable as a C++ user. I really like the way VulkanHpp was implemented.

On top of that SDL3 should have optional (by default off) C++ 20 Module support (just like VulkanHpp aswell). Much work has been done on the compiler and CMake side to make this as easy as possible (read this article for more).

I would really love to see this happen

Edit:

For good C++ adaptation I would expect the following:

  1. Namespacing:

Example:

sdl::Delay(2000); // sdl namespace is lowercase, types & functions are PascalCase
sdl::Event e;
  1. Flags as enum class:

(some flags will have to be renamed because of clarity)

Example:

SDL_SOMEFLAG_FLAG1
sdl::SomeFlag::Flag1

SDL_SOMEFLAG_FLAG1 | SDL_SOMEFLAG_FLAG2

sdl::SomeFlag::Flag1 | sdl::SomeFlag::Flag2

CXCubeHD avatar May 11 '24 22:05 CXCubeHD

Please no lower-case sdl, this looks so wrong. :)

Sackzement avatar May 11 '24 22:05 Sackzement

Please no lower-case sdl, this looks so wrong. :)

I guess uppercase SDL would also be okay then. It could even be made configurable through a macro and cmake (just like VulkanHpp)

CXCubeHD avatar May 11 '24 23:05 CXCubeHD

Feel free to submit a PR for this.

slouken avatar May 12 '24 22:05 slouken

Feel free to submit a PR for this.

Yo I feel like I can do this but I need to get more familiar with the code / project structure 👌

CXCubeHD avatar May 12 '24 22:05 CXCubeHD

I'm pretty sure this can easily be solved by writing a parser that goes through all the file and generates an intermediate representation in json, which is then converted into a C++ module file. The parser can hugely simplify the process of generating bindings to other languages. This is the approach taken by both ImGui (see here ) and Raylib (see here ) to generate some kind of "API dump" in JSON/other format, which is then translated into the target language code.

Finally, since by adopting this parser the target becomes larger than C++ bindings, I think it should be part of a separate repo that is only used by maintainers of bindings in other languages.

TerensTare avatar May 22 '24 19:05 TerensTare

@TerensTare See https://github.com/libsdl-org/SDL/issues/6337 If you know how to write such a parser, that would enable lots of other things.

madebr avatar May 22 '24 20:05 madebr

I will try to write a set up a parser with minimal features that can be easily improved and come back with a PR.

TerensTare avatar May 22 '24 21:05 TerensTare

So here's my attempt at this: it's not final but covers both namespacing and strong typed enums. You simply need Python>=3.10 to codegen the C++ modules and the resulting code can be used like this.

TerensTare avatar Jun 19 '24 07:06 TerensTare