From ee1e1bb95f977fef8ea6b5aa9a9ed1f5987309ee Mon Sep 17 00:00:00 2001
From: Nic Barker <nic@nicbarker.com>
Date: Sat, 28 Sep 2024 19:33:23 +1200
Subject: [PATCH] C++ only on windows

---
 CMakeLists.txt                                | 15 ++++------
 clay.h                                        | 28 +++++++++++--------
 examples/cpp-project-example/CMakeLists.txt   | 12 ++++++++
 examples/cpp-project-example/main.cpp         | 10 +++++++
 .../CMakeLists.txt                            |  9 ++----
 5 files changed, 47 insertions(+), 27 deletions(-)
 create mode 100644 examples/cpp-project-example/CMakeLists.txt
 create mode 100644 examples/cpp-project-example/main.cpp

diff --git a/CMakeLists.txt b/CMakeLists.txt
index ca72ae0..1cf2e6d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,12 +1,9 @@
 cmake_minimum_required(VERSION 3.28)
+project(clay)
 
-if (MSVC)
-project(clay CXX)
-set(CMAKE_CXX_STANDARD 20)
-else ()
-project(clay C)
-set(CMAKE_C_STANDARD 99)
-endif()
-
+if(MSVC)
+add_subdirectory("examples/cpp-project-example")
+elseif()
 add_subdirectory("examples/raylib-sidebar-scrolling-container")
-add_subdirectory("examples/clay-official-website")
\ No newline at end of file
+add_subdirectory("examples/clay-official-website")
+endif()
\ No newline at end of file
diff --git a/clay.h b/clay.h
index 0b724dc..f6d7c5d 100644
--- a/clay.h
+++ b/clay.h
@@ -452,7 +452,11 @@ extern uint32_t Clay__debugViewWidth;
 #define CLAY__MAX(x, y) (((x) > (y)) ? (x) : (y))
 #define CLAY__MIN(x, y) (((x) < (y)) ? (x) : (y))
 
-#define CLAY__ALIGNMENT(type) (offsetof(struct { char c; type x; }, x))
+#ifdef __cplusplus
+#define CLAY__ALIGNMENT(type) alignof(type)
+#elif
+#define CLAY__ALIGNMENT(type) (offsetof(struct { char c; type x; } a, a.x))
+#endif
 
 bool Clay__warningsEnabled = true;
 
@@ -614,14 +618,14 @@ typedef enum CLAY_PACKED_ENUM {
 } Clay__LayoutElementType;
 
 Clay_RenderCommandType Clay__LayoutElementTypeToRenderCommandType[] = {
-    [CLAY__LAYOUT_ELEMENT_TYPE_CONTAINER] = CLAY_RENDER_COMMAND_TYPE_NONE,
-    [CLAY__LAYOUT_ELEMENT_TYPE_RECTANGLE] = CLAY_RENDER_COMMAND_TYPE_RECTANGLE,
-    [CLAY__LAYOUT_ELEMENT_TYPE_FLOATING_CONTAINER] = CLAY_RENDER_COMMAND_TYPE_NONE,
-    [CLAY__LAYOUT_ELEMENT_TYPE_SCROLL_CONTAINER] = CLAY_RENDER_COMMAND_TYPE_NONE,
-    [CLAY__LAYOUT_ELEMENT_TYPE_BORDER_CONTAINER] = CLAY_RENDER_COMMAND_TYPE_BORDER,
-    [CLAY__LAYOUT_ELEMENT_TYPE_IMAGE] = CLAY_RENDER_COMMAND_TYPE_IMAGE,
-    [CLAY__LAYOUT_ELEMENT_TYPE_TEXT] = CLAY_RENDER_COMMAND_TYPE_TEXT,
-    [CLAY__LAYOUT_ELEMENT_TYPE_CUSTOM] = CLAY_RENDER_COMMAND_TYPE_CUSTOM,
+    CLAY_RENDER_COMMAND_TYPE_NONE,
+    CLAY_RENDER_COMMAND_TYPE_RECTANGLE,
+    CLAY_RENDER_COMMAND_TYPE_NONE,
+    CLAY_RENDER_COMMAND_TYPE_NONE,
+    CLAY_RENDER_COMMAND_TYPE_BORDER,
+    CLAY_RENDER_COMMAND_TYPE_IMAGE,
+    CLAY_RENDER_COMMAND_TYPE_TEXT,
+    CLAY_RENDER_COMMAND_TYPE_CUSTOM,
 };
 
 Clay_LayoutConfig CLAY_LAYOUT_DEFAULT = (Clay_LayoutConfig){};
@@ -1414,7 +1418,7 @@ uint32_t Clay__HashTextWithConfig(Clay_String *text, Clay_TextElementConfig *con
     union {
         float fontSize;
         uint32_t bits;
-    } fontSizeBits = { .fontSize = config->fontSize };
+    } fontSizeBits = { .fontSize = (float)config->fontSize };
     uint32_t hash = 0;
     uint64_t pointerAsNumber = (uint64_t)text->chars;
 
@@ -1615,8 +1619,8 @@ void Clay__OpenFloatingElement(Clay_ElementId id, Clay_LayoutConfig *layoutConfi
     Clay__LayoutElementTreeRootArray_Add(&Clay__layoutElementTreeRoots, (Clay__LayoutElementTreeRoot) {
         .layoutElementIndex = Clay__layoutElements.length - 1,
         .parentId = parent->id,
+        .clipElementId = (uint32_t)(originalParentId == 0 ? (Clay__openClipElementStack.length > 0 ? Clay__int32_tArray_Get(&Clay__openClipElementStack, (int)Clay__openClipElementStack.length - 1) : 0) : 0),
         .zIndex = floatingConfig->zIndex,
-        .clipElementId = originalParentId == 0 ? (Clay__openClipElementStack.length > 0 ? Clay__int32_tArray_Get(&Clay__openClipElementStack, (int)Clay__openClipElementStack.length - 1) : 0) : 0,
     });
 }
 
@@ -2757,7 +2761,7 @@ void Clay__RenderDebugView() {
         highlightedRow = -1;
     }
     Clay__RenderDebugLayoutData layoutData = {};
-    CLAY_FLOATING_CONTAINER(CLAY_ID("Clay__DebugView"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_FIXED(Clay__debugViewWidth) , CLAY_SIZING_FIXED(Clay__layoutDimensions.height) }), CLAY_FLOATING_CONFIG(.attachment = { .element = CLAY_ATTACH_POINT_LEFT_CENTER, .parent = CLAY_ATTACH_POINT_RIGHT_CENTER })) {
+    CLAY_FLOATING_CONTAINER(CLAY_ID("Clay__DebugView"), CLAY_LAYOUT(.sizing = { CLAY_SIZING_FIXED((float)Clay__debugViewWidth) , CLAY_SIZING_FIXED(Clay__layoutDimensions.height) }), CLAY_FLOATING_CONFIG(.attachment = { .element = CLAY_ATTACH_POINT_LEFT_CENTER, .parent = CLAY_ATTACH_POINT_RIGHT_CENTER })) {
         CLAY_RECTANGLE(CLAY_ID("Clay__DebugViewLeftBorder"), CLAY_LAYOUT(.sizing = { .width = CLAY_SIZING_FIXED(1), .height = CLAY_SIZING_GROW() }), CLAY_RECTANGLE_CONFIG(.color = CLAY__DEBUGVIEW_COLOR_3)) {}
         CLAY_CONTAINER(CLAY_ID("Clay__DebugViewInner"), CLAY_LAYOUT(.layoutDirection = CLAY_TOP_TO_BOTTOM, .sizing = {CLAY_SIZING_GROW(), CLAY_SIZING_GROW()})) {
             CLAY_RECTANGLE(CLAY_ID("Clay__DebugViewTopHeaderOuter"), CLAY_LAYOUT(.sizing = {CLAY_SIZING_GROW(), CLAY_SIZING_FIXED(CLAY__DEBUGVIEW_ROW_HEIGHT)}, .childAlignment = {.y = CLAY_ALIGN_Y_CENTER}, .padding = {CLAY__DEBUGVIEW_OUTER_PADDING}), CLAY_RECTANGLE_CONFIG(.color = CLAY__DEBUGVIEW_COLOR_2)) {
diff --git a/examples/cpp-project-example/CMakeLists.txt b/examples/cpp-project-example/CMakeLists.txt
new file mode 100644
index 0000000..6ebaae7
--- /dev/null
+++ b/examples/cpp-project-example/CMakeLists.txt
@@ -0,0 +1,12 @@
+cmake_minimum_required(VERSION 3.28)
+project(clay_examples_cpp_project_example CXX)
+
+set(CMAKE_CXX_STANDARD 20)
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer -g")
+
+add_executable(clay_examples_cpp_project_example main.cpp)
+
+target_include_directories(clay_examples_cpp_project_example PUBLIC .)
+
+set(CMAKE_CXX_FLAGS_DEBUG "-Wall")
+set(CMAKE_CXX_FLAGS_RELEASE "-O3")
\ No newline at end of file
diff --git a/examples/cpp-project-example/main.cpp b/examples/cpp-project-example/main.cpp
new file mode 100644
index 0000000..9048d25
--- /dev/null
+++ b/examples/cpp-project-example/main.cpp
@@ -0,0 +1,10 @@
+#include <iostream>
+#define CLAY_IMPLEMENTATION
+#include "../../clay.h"
+
+int main(void) {
+    uint64_t totalMemorySize = Clay_MinMemorySize();
+    Clay_Arena clayMemory = (Clay_Arena) { .label = CLAY_STRING("Clay Memory Arena"), .capacity = totalMemorySize, .memory = (char *)malloc(totalMemorySize) };
+    Clay_Initialize(clayMemory, (Clay_Dimensions) {1024,768});
+    return 0;
+}
diff --git a/examples/raylib-sidebar-scrolling-container/CMakeLists.txt b/examples/raylib-sidebar-scrolling-container/CMakeLists.txt
index 1499b58..15b0a1d 100644
--- a/examples/raylib-sidebar-scrolling-container/CMakeLists.txt
+++ b/examples/raylib-sidebar-scrolling-container/CMakeLists.txt
@@ -1,5 +1,7 @@
 cmake_minimum_required(VERSION 3.28)
-project(clay_examples_raylib_sidebar_scrolling_container C)
+project(clay_examples_raylib_sidebar_scrolling_container)
+
+target_compile_options(clay_examples_raylib_sidebar_scrolling_container PUBLIC -Wall -Werror -Wno-unknown-pragmas)
 
 # Adding Raylib
 include(FetchContent)
@@ -17,13 +19,8 @@ FetchContent_Declare(
 
 FetchContent_MakeAvailable(raylib)
 
-set(CMAKE_C_STANDARD 99)
-
 add_executable(clay_examples_raylib_sidebar_scrolling_container main.c multi-compilation-unit.c)
 
-if(!MSVC)
-target_compile_options(clay_examples_raylib_sidebar_scrolling_container PUBLIC -Wall -Werror -Wno-unknown-pragmas)
-endif()
 target_include_directories(clay_examples_raylib_sidebar_scrolling_container PUBLIC .)
 
 target_link_libraries(clay_examples_raylib_sidebar_scrolling_container PUBLIC raylib)