From eb1ee390bbb72dce3ea917b7ccc1f4098317917e Mon Sep 17 00:00:00 2001 From: Stowy Date: Sun, 22 Dec 2024 18:20:31 +0100 Subject: [PATCH] Simplified bindings generation --- bindings/jai/clay-jai/windows/clay.lib | Bin 257844 -> 261382 bytes bindings/jai/generate.jai | 417 +++---------------------- bindings/jai/module.jai | 10 +- bindings/jai/windows.jai | 349 ++++++++++++++++++++- 4 files changed, 383 insertions(+), 393 deletions(-) diff --git a/bindings/jai/clay-jai/windows/clay.lib b/bindings/jai/clay-jai/windows/clay.lib index 35da4f4d451c8a2e2f3e148fbfece233df971b89..fd4db6cdecf888c4781a0c2e3d791916f81a9b8a 100644 GIT binary patch delta 57669 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 JQ`dnbe*xTCVV?j1 delta 54723 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 diff --git a/bindings/jai/generate.jai b/bindings/jai/generate.jai index e78776b..3571b8a 100644 --- a/bindings/jai/generate.jai +++ b/bindings/jai/generate.jai @@ -2,6 +2,11 @@ AT_COMPILE_TIME :: true; SOURCE_PATH :: "source"; +DECLARATIONS_TO_OMIT :: string.[ + "Clay_Vector2", + "Clay_Color", +]; + #if AT_COMPILE_TIME { #run,stallable { Compiler.set_build_options_dc(.{do_output=false}); @@ -22,389 +27,32 @@ SOURCE_PATH :: "source"; } } - -Build_Type :: enum { - STATIC_LIBRARY; - DYNAMIC_LIBRARY; - EXECUTABLE; - OBJ_FILE; -} - -build_cpp_static_lib :: #bake_arguments build_cpp(type = .STATIC_LIBRARY); -build_cpp_dynamic_lib :: #bake_arguments build_cpp(type = .DYNAMIC_LIBRARY); -build_cpp_executable :: #bake_arguments build_cpp(type = .EXECUTABLE); - -// This is a modified version of the procedure from BuildCpp. It will assume a clang-like compiler if you add something to compiler_executable_path. -build_cpp :: ( - output_basename: string, - files: ..string, - type: Build_Type, - debug := false, - extra: [] string = .[], - library_files: [] string = .[], - target := OS, - compiler_executable_path := "", - ar_executable_path := "", - working_directory := "", - loc := #caller_location -) -> bool { - Basic.auto_release_temp(); - Basic.push_allocator(Basic.temp); - - arguments: [..] string; - - output_filename: string; - if target == .WINDOWS && compiler_executable_path == "" { - if #complete type == { - case .STATIC_LIBRARY; - output_filename = Basic.tprint("%.lib", output_basename); - case .DYNAMIC_LIBRARY; - output_filename = Basic.tprint("%.dll", output_basename); - case .EXECUTABLE; - output_filename = Basic.tprint("%.exe", output_basename); - case .OBJ_FILE; - output_filename = Basic.tprint("%.obj", output_basename); - } - - #if OS == .WINDOWS { - String.path_overwrite_separators(output_filename, #char "\\"); - - vc_path, linker_path := WindowsResources.find_visual_studio_in_a_ridiculous_garbage_way(); - - kit_root := WindowsResources.find_windows_kit_root(); - if !kit_root { - Compiler.compiler_report("Unable to find Windows Kit root; can't compile.\n", loc); - return false; - } - } else { - Compiler.compiler_report("Unable to find Visual Studio; can't compile.\n", loc); - vc_path, linker_path: string; - kit_root: string; - return false; // Visual studio is not available in non-windows OS. - } - - linker := String.join(linker_path, "\\", "cl.exe"); - Basic.array_add(*arguments, linker); - - Basic.array_add(*arguments, "/nologo"); - - // Include directories: - vc_include_path := String.join(vc_path, "\\..\\..\\include"); - kit_root_include := String.replace(kit_root, "Lib", "Include"); - Basic.array_add(*arguments, - Basic.tprint("/I%", vc_include_path), - Basic.tprint("/I%\\um", kit_root_include), - Basic.tprint("/I%\\ucrt", kit_root_include), - Basic.tprint("/I%\\shared", kit_root_include), - ); - - // Definitions: - Basic.array_add(*arguments, "/DWIN32"); - if debug { - Basic.array_add(*arguments, "/DDEBUG"); - } - - // Compiler options: - if debug { - Basic.array_add(*arguments, "/Od"); // Disable optimizations. - } else { - Basic.array_add(*arguments, - "/O2", // Maximize speed. - "/Oi", // Enable intrinsics. - ); - } - Basic.array_add(*arguments, "/W3"); - - if debug { - Basic.array_add(*arguments, - "/DEBUG", // Generate debug info. - "/Zi", // Generate pdb file. - Basic.tprint("/Fd%.pdb", output_basename), // Sets name of pdb file. - ); - } - - Basic.array_add(*arguments, - "-diagnostics:caret", - "-diagnostics:column" - ); - - Basic.array_add(*arguments, .. extra); - - // Add files: - objs: [..] string; - Basic.array_reserve(*objs, files.count); - for files { - src := String.copy_temporary_string(it); - String.path_overwrite_separators(src); - Basic.array_add(*arguments, src); - - Basic.array_add(*objs, Basic.tprint("%.obj", String.path_strip_extension(String.path_filename(it)))); - } - - // Make sure to cleanup the resulting obj files. - defer { - if type != .OBJ_FILE { - for objs File.file_delete(it); - } - - if type == .DYNAMIC_LIBRARY then File.file_delete(Basic.tprint("%.exp", output_basename)); - } - - if type == .STATIC_LIBRARY || type == .OBJ_FILE { - Basic.array_add(*arguments, "/c"); // Compile without linking. - } else { - Basic.array_add(*arguments, "/link"); - - // Linker options: - if type == .DYNAMIC_LIBRARY { - Basic.array_add(*arguments, "/DLL"); - } - Basic.array_add(*arguments, - "/MACHINE:AMD64", - Basic.tprint("/OUT:%", output_filename), - Basic.tprint("/libpath:%", vc_path), - Basic.tprint("/libpath:%\\um\\x64", kit_root), - Basic.tprint("/libpath:%\\ucrt\\x64", kit_root), - ); - } - - Basic.array_add(*arguments, .. library_files); - - Basic.log("%", Process.get_quoted_command_string(arguments)); - result, output_string, error_string := Process.run_command(..arguments, capture_and_return_output = true, print_captured_output = true, working_directory = working_directory); - - if result.exit_code { - Compiler.compiler_report(Basic.tprint("Compiler failed with exit code '%'.\n", result.exit_code), loc); - return false; - } - - if type == .STATIC_LIBRARY { - // Create library: - Basic.array_reset_keeping_memory(*arguments); - - librarian := String.join(linker_path, "\\lib.exe"); - - Basic.array_add(*arguments, librarian, "/nologo"); - Basic.array_add(*arguments, ..objs); - Basic.array_add(*arguments, Basic.tprint("/OUT:%", output_filename)); - - Basic.log("%", Process.get_quoted_command_string(arguments)); - result, output_string, error_string := Process.run_command(..arguments, capture_and_return_output = true, print_captured_output = true, working_directory = working_directory); - - if result.exit_code { - Compiler.compiler_report(Basic.tprint("Librarian failed with exit code '%'.\n", result.exit_code), loc); - return false; - } - } - } else { - if #complete type == { - case .STATIC_LIBRARY; - #if OS == .WINDOWS { - output_filename = Basic.tprint("%.lib", output_basename); - } else { - output_filename = Basic.tprint("%.a", output_basename); - } - - case .OBJ_FILE; - output_filename = Basic.tprint("%.o", output_basename); - case .DYNAMIC_LIBRARY; - if target == { - case .WINDOWS; output_filename = Basic.tprint("%.dll", output_basename); - case .MACOS; output_filename = Basic.tprint("%.dylib", output_basename); - case .LINUX; #through; - case .ANDROID; output_filename = Basic.tprint("%.so", output_basename); - case .NONE; #if OS == .WINDOWS then output_filename = Basic.tprint("%.dll", output_basename); else assert(false); - case; assert(false); - } - case .EXECUTABLE; - output_filename = Basic.copy_temporary_string(output_basename); - } - - #if OS == .WINDOWS { - String.path_overwrite_separators(output_filename, #char "\\"); - } - - compiler := compiler_executable_path; - ar := ar_executable_path; - if !compiler || (type == .STATIC_LIBRARY && !ar) { - is_cpp_project := false; - for files { - if String.ends_with(it, ".cpp") { - is_cpp_project = true; // Use c++ compiler, so we link the required c++ runtime libraries by default. - break; - } - } - - if !compiler { - if is_cpp_project { - // @Cleanup: Could be simplified to the following, but that currently triggers a compiler bug. -rluba, 2024-01-23 - // compiler = ifx to_string(getenv("CXX")) else "clang++"; - compiler = to_string(getenv("CXX")); - if !compiler compiler ="clang++"; - } else { - compiler = to_string(getenv("CC")); - if !compiler compiler ="clang"; - } - } - - if !ar ar = "ar"; - - } - - Basic.array_add(*arguments, compiler); - - if debug { - Basic.array_add(*arguments, "-g", "-Og"); - } else { - Basic.array_add(*arguments, "-O3"); - } - - Basic.array_add(*arguments, ..extra); - - if type == .STATIC_LIBRARY || type == .OBJ_FILE { - array_add(*arguments, "-c"); - } else { - if type == .DYNAMIC_LIBRARY { - array_add(*arguments, "-shared", "-fpic"); - } - - if target == .MACOS { - if type == { - case .DYNAMIC_LIBRARY; - array_add(*arguments, "-install_name", tprint("@rpath/%", output_filename)); - case .EXECUTABLE; - array_add(*arguments, "-rpath", "@loader_path"); - } - } - - array_add(*arguments, "-o", output_filename); - } - - // Add files: - objs: [..] string; - array_reserve(*objs, files.count); - for files { - src := copy_temporary_string(it); - String.path_overwrite_separators(src); - array_add(*arguments, src); - - array_add(*objs, tprint("%.o", String.path_basename(it))); - } - - // Make sure to cleanup the resulting obj files. - defer { - if type != .OBJ_FILE { - for objs File.file_delete(it); - } - } - - array_add(*arguments, .. library_files); - - log("%", Process.get_quoted_command_string(arguments)); - result, output_string, error_string := Process.run_command(..arguments, capture_and_return_output = true, print_captured_output = true, working_directory = working_directory); - - if result.exit_code { - Compiler.compiler_report(tprint("Compiler failed with exit code '%'.\n", result.exit_code), loc); - return false; - } - - if type == .STATIC_LIBRARY { - File.file_delete(output_filename); // ar only adds/updates the archive, but does not delete files from it. - - // Create library: - array_reset_keeping_memory(*arguments); - array_add(*arguments, - ar, - "-rc", // replace or insert files into the archive, do not warn if archive needs to be created. - output_filename, - ); - - array_add(*arguments, ..objs); - - // Run archiver command: - log("%", Process.get_quoted_command_string(arguments)); - result, output_string, error_string := Process.run_command(..arguments, capture_and_return_output = true, print_captured_output = true, working_directory = working_directory); - - if result.exit_code { - Compiler.compiler_report(tprint("Archive command failed with exit code '%'.\n", result.exit_code), loc); - return false; - } - } - } - - return true; -} - -enum_cpp_files :: (path: string, recursive:=false) -> [..] string { - files: [..] string; - - visitor :: (info: *FileUtils.File_Visit_Info, files: *[..] string) { - extension := String.path_extension(info.full_name); - if extension == "cpp" || extension == "c" { - Basic.array_add(files, String.copy_string(info.full_name)); - } - } - - FileUtils.visit_files(path, recursive=recursive, *files, visitor); - - return files; -} - -free_cpp_files :: (files: [] string) { - for files Basic.free(it); - Basic.array_free(files); -} - - generate_bindings :: (args: [] string, minimum_os_version: type_of(Compiler.Build_Options.minimum_os_version)) -> bool { - compile := Basic.array_find(args, "-compile"); - compile_debug := Basic.array_find(args, "-debug"); + compile := array_find(args, "-compile"); + compile_debug := array_find(args, "-debug"); if compile { could_copy := FileUtils.copy_file("../../clay.h", "source/clay.h"); if !could_copy then return false; - source_file := Basic.tprint("%/clay.c", SOURCE_PATH); + source_file := tprint("%/clay.c", SOURCE_PATH); success := true; #if OS == .WINDOWS { File.make_directory_if_it_does_not_exist("clay-jai/windows", true); - // Can't use this because clay doesn't support MSVC - success &&= build_cpp_static_lib( - "clay-jai/windows/clay", - source_file, - debug = compile_debug, - target=.NONE, - compiler_executable_path="clang", - ar_executable_path="llvm-ar", - ); + command := ifx compile_debug { + Process.break_command_into_strings("clang -c source\\clay.c"); + } else { + Process.break_command_into_strings("clang -O3 -c source\\clay.c"); + } + result := Process.run_command(..command, capture_and_return_output=true, print_captured_output=true); + if result.exit_code != 0 then return false; + defer File.file_delete("clay.o"); - // { - // command := Process.break_command_into_strings("clang -c -o clay-jai/windows/clay.lib -static source/clay.c"); - // result, out, error := Process.run_command(..command, capture_and_return_output = true); - - // write_string(out); - // if result.exit_code != 0 - // { - // write_string("Failed to build clay. Do you have clang installed ?\n"); - // write_string(error); - // success = false; - // } - // } - - // { - // command := Process.break_command_into_strings("clang -c -o clay-jai/windows/clay.dll -dynamic source/clay.c"); - // result, out, error := Process.run_command(..command, capture_and_return_output = true); - - // write_string(out); - // if result.exit_code != 0 - // { - // write_string("Failed to build clay. Do you have clang installed ?\n"); - // write_string(error); - // success = false; - // } - // } + command = Process.break_command_into_strings("llvm-ar -rc clay-jai/windows/clay.lib clay.o"); + result = Process.run_command(..command, capture_and_return_output=true, print_captured_output=true); + if result.exit_code != 0 then return false; } else { // TODO MacOS // TODO Linux @@ -420,20 +68,22 @@ generate_bindings :: (args: [] string, minimum_os_version: type_of(Compiler.Buil using options; #if OS == .WINDOWS { - Basic.array_add(*libpaths, "clay-jai/windows"); + array_add(*libpaths, "clay-jai/windows"); output_filename = "windows.jai"; } else { assert(false); } - Basic.array_add(*libnames, "clay"); - Basic.array_add(*include_paths, SOURCE_PATH); - Basic.array_add(*source_files, Basic.tprint("%/clay.h", SOURCE_PATH)); - Basic.array_add(*strip_prefixes, "Clay_"); + array_add(*libnames, "clay"); + array_add(*include_paths, SOURCE_PATH); + array_add(*source_files, tprint("%/clay.h", SOURCE_PATH)); + array_add(*strip_prefixes, "Clay_"); auto_detect_enum_prefixes = true; log_stripped_declarations = true; - generate_compile_time_struct_checks = false; + generate_compile_time_struct_checks = true; + + visitor = clay_visitor; } could_generate := Generator.generate_bindings(options, output_filename); @@ -443,6 +93,19 @@ generate_bindings :: (args: [] string, minimum_os_version: type_of(Compiler.Buil return could_generate; } +clay_visitor :: (decl: *Generator.Declaration, parent_decl: *Generator.Declaration) -> Generator.Declaration_Visit_Result { + if !parent_decl + { + if array_find(DECLARATIONS_TO_OMIT, decl.name) + { + decl.decl_flags |= .OMIT_FROM_OUTPUT; + return .STOP; + } + } + + return .RECURSE; +} + #scope_file using Basic :: #import "Basic"; diff --git a/bindings/jai/module.jai b/bindings/jai/module.jai index c284510..f206bfa 100644 --- a/bindings/jai/module.jai +++ b/bindings/jai/module.jai @@ -1,5 +1,13 @@ + +Vector2 :: Math.Vector2; +Color :: Math.Vector4; + +#scope_module + +Math :: #import "Math"; + #if OS == .WINDOWS { #load "windows.jai"; } else { - assert(false) + assert(false); } \ No newline at end of file diff --git a/bindings/jai/windows.jai b/bindings/jai/windows.jai index de200b1..530cafb 100644 --- a/bindings/jai/windows.jai +++ b/bindings/jai/windows.jai @@ -1,7 +1,7 @@ // // This file was auto-generated using the following command: // -// jai ./generate.jai - -compile +// jai generate.jai - -compile // @@ -32,18 +32,6 @@ Dimensions :: struct { height: float; } -Vector2 :: struct { - x: float; - y: float; -} - -Color :: struct { - r: float; - g: float; - b: float; - a: float; -} - BoundingBox :: struct { x: float; y: float; @@ -373,12 +361,18 @@ SetCullingEnabled :: (enabled: bool) -> void #foreign clay "Clay_SetCullingEnabl // Internal API functions required by macros OpenElement :: (__args: ..Any) -> void #foreign clay "Clay__OpenElement"; CloseElement :: (__args: ..Any) -> void #foreign clay "Clay__CloseElement"; - +StoreLayoutConfig :: (config: LayoutConfig) -> *LayoutConfig #foreign clay "Clay__StoreLayoutConfig"; ElementPostConfiguration :: (__args: ..Any) -> void #foreign clay "Clay__ElementPostConfiguration"; AttachId :: (id: ElementId) -> void #foreign clay "Clay__AttachId"; AttachLayoutConfig :: (config: *LayoutConfig) -> void #foreign clay "Clay__AttachLayoutConfig"; AttachElementConfig :: (config: ElementConfigUnion, type: ElementConfigType) -> void #foreign clay "Clay__AttachElementConfig"; - +StoreRectangleElementConfig :: (config: RectangleElementConfig) -> *RectangleElementConfig #foreign clay "Clay__StoreRectangleElementConfig"; +StoreTextElementConfig :: (config: TextElementConfig) -> *TextElementConfig #foreign clay "Clay__StoreTextElementConfig"; +StoreImageElementConfig :: (config: ImageElementConfig) -> *ImageElementConfig #foreign clay "Clay__StoreImageElementConfig"; +StoreFloatingElementConfig :: (config: FloatingElementConfig) -> *FloatingElementConfig #foreign clay "Clay__StoreFloatingElementConfig"; +StoreCustomElementConfig :: (config: CustomElementConfig) -> *CustomElementConfig #foreign clay "Clay__StoreCustomElementConfig"; +StoreScrollElementConfig :: (config: ScrollElementConfig) -> *ScrollElementConfig #foreign clay "Clay__StoreScrollElementConfig"; +StoreBorderElementConfig :: (config: BorderElementConfig) -> *BorderElementConfig #foreign clay "Clay__StoreBorderElementConfig"; HashString :: (key: String, offset: u32, seed: u32) -> ElementId #foreign clay "Clay__HashString"; Noop :: (__args: ..Any) -> void #foreign clay "Clay__Noop"; OpenTextElement :: (text: String, textConfig: *TextElementConfig) -> void #foreign clay "Clay__OpenTextElement"; @@ -389,4 +383,329 @@ Clay__debugMaxElementsLatch: bool #elsewhere clay; #scope_file +#import "Basic"; // For assert + clay :: #library,no_dll "clay-jai/windows/clay"; + +#run { + { + instance: String; + assert(((cast(*void)(*instance.length)) - cast(*void)(*instance)) == 0, "String.length has unexpected offset % instead of 0", ((cast(*void)(*instance.length)) - cast(*void)(*instance))); + assert(size_of(type_of(String.length)) == 4, "String.length has unexpected size % instead of 4", size_of(type_of(String.length))); + assert(((cast(*void)(*instance.chars)) - cast(*void)(*instance)) == 8, "String.chars has unexpected offset % instead of 8", ((cast(*void)(*instance.chars)) - cast(*void)(*instance))); + assert(size_of(type_of(String.chars)) == 8, "String.chars has unexpected size % instead of 8", size_of(type_of(String.chars))); + assert(size_of(String) == 16, "String has size % instead of 16", size_of(String)); + } + + { + instance: StringArray; + assert(((cast(*void)(*instance.capacity)) - cast(*void)(*instance)) == 0, "StringArray.capacity has unexpected offset % instead of 0", ((cast(*void)(*instance.capacity)) - cast(*void)(*instance))); + assert(size_of(type_of(StringArray.capacity)) == 4, "StringArray.capacity has unexpected size % instead of 4", size_of(type_of(StringArray.capacity))); + assert(((cast(*void)(*instance.length)) - cast(*void)(*instance)) == 4, "StringArray.length has unexpected offset % instead of 4", ((cast(*void)(*instance.length)) - cast(*void)(*instance))); + assert(size_of(type_of(StringArray.length)) == 4, "StringArray.length has unexpected size % instead of 4", size_of(type_of(StringArray.length))); + assert(((cast(*void)(*instance.internalArray)) - cast(*void)(*instance)) == 8, "StringArray.internalArray has unexpected offset % instead of 8", ((cast(*void)(*instance.internalArray)) - cast(*void)(*instance))); + assert(size_of(type_of(StringArray.internalArray)) == 8, "StringArray.internalArray has unexpected size % instead of 8", size_of(type_of(StringArray.internalArray))); + assert(size_of(StringArray) == 16, "StringArray has size % instead of 16", size_of(StringArray)); + } + + { + instance: Arena; + assert(((cast(*void)(*instance.label)) - cast(*void)(*instance)) == 0, "Arena.label has unexpected offset % instead of 0", ((cast(*void)(*instance.label)) - cast(*void)(*instance))); + assert(size_of(type_of(Arena.label)) == 16, "Arena.label has unexpected size % instead of 16", size_of(type_of(Arena.label))); + assert(((cast(*void)(*instance.nextAllocation)) - cast(*void)(*instance)) == 16, "Arena.nextAllocation has unexpected offset % instead of 16", ((cast(*void)(*instance.nextAllocation)) - cast(*void)(*instance))); + assert(size_of(type_of(Arena.nextAllocation)) == 8, "Arena.nextAllocation has unexpected size % instead of 8", size_of(type_of(Arena.nextAllocation))); + assert(((cast(*void)(*instance.capacity)) - cast(*void)(*instance)) == 24, "Arena.capacity has unexpected offset % instead of 24", ((cast(*void)(*instance.capacity)) - cast(*void)(*instance))); + assert(size_of(type_of(Arena.capacity)) == 8, "Arena.capacity has unexpected size % instead of 8", size_of(type_of(Arena.capacity))); + assert(((cast(*void)(*instance.memory)) - cast(*void)(*instance)) == 32, "Arena.memory has unexpected offset % instead of 32", ((cast(*void)(*instance.memory)) - cast(*void)(*instance))); + assert(size_of(type_of(Arena.memory)) == 8, "Arena.memory has unexpected size % instead of 8", size_of(type_of(Arena.memory))); + assert(size_of(Arena) == 40, "Arena has size % instead of 40", size_of(Arena)); + } + + { + instance: Dimensions; + assert(((cast(*void)(*instance.width)) - cast(*void)(*instance)) == 0, "Dimensions.width has unexpected offset % instead of 0", ((cast(*void)(*instance.width)) - cast(*void)(*instance))); + assert(size_of(type_of(Dimensions.width)) == 4, "Dimensions.width has unexpected size % instead of 4", size_of(type_of(Dimensions.width))); + assert(((cast(*void)(*instance.height)) - cast(*void)(*instance)) == 4, "Dimensions.height has unexpected offset % instead of 4", ((cast(*void)(*instance.height)) - cast(*void)(*instance))); + assert(size_of(type_of(Dimensions.height)) == 4, "Dimensions.height has unexpected size % instead of 4", size_of(type_of(Dimensions.height))); + assert(size_of(Dimensions) == 8, "Dimensions has size % instead of 8", size_of(Dimensions)); + } + + { + instance: BoundingBox; + assert(((cast(*void)(*instance.x)) - cast(*void)(*instance)) == 0, "BoundingBox.x has unexpected offset % instead of 0", ((cast(*void)(*instance.x)) - cast(*void)(*instance))); + assert(size_of(type_of(BoundingBox.x)) == 4, "BoundingBox.x has unexpected size % instead of 4", size_of(type_of(BoundingBox.x))); + assert(((cast(*void)(*instance.y)) - cast(*void)(*instance)) == 4, "BoundingBox.y has unexpected offset % instead of 4", ((cast(*void)(*instance.y)) - cast(*void)(*instance))); + assert(size_of(type_of(BoundingBox.y)) == 4, "BoundingBox.y has unexpected size % instead of 4", size_of(type_of(BoundingBox.y))); + assert(((cast(*void)(*instance.width)) - cast(*void)(*instance)) == 8, "BoundingBox.width has unexpected offset % instead of 8", ((cast(*void)(*instance.width)) - cast(*void)(*instance))); + assert(size_of(type_of(BoundingBox.width)) == 4, "BoundingBox.width has unexpected size % instead of 4", size_of(type_of(BoundingBox.width))); + assert(((cast(*void)(*instance.height)) - cast(*void)(*instance)) == 12, "BoundingBox.height has unexpected offset % instead of 12", ((cast(*void)(*instance.height)) - cast(*void)(*instance))); + assert(size_of(type_of(BoundingBox.height)) == 4, "BoundingBox.height has unexpected size % instead of 4", size_of(type_of(BoundingBox.height))); + assert(size_of(BoundingBox) == 16, "BoundingBox has size % instead of 16", size_of(BoundingBox)); + } + + { + instance: ElementId; + assert(((cast(*void)(*instance.id)) - cast(*void)(*instance)) == 0, "ElementId.id has unexpected offset % instead of 0", ((cast(*void)(*instance.id)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementId.id)) == 4, "ElementId.id has unexpected size % instead of 4", size_of(type_of(ElementId.id))); + assert(((cast(*void)(*instance.offset)) - cast(*void)(*instance)) == 4, "ElementId.offset has unexpected offset % instead of 4", ((cast(*void)(*instance.offset)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementId.offset)) == 4, "ElementId.offset has unexpected size % instead of 4", size_of(type_of(ElementId.offset))); + assert(((cast(*void)(*instance.baseId)) - cast(*void)(*instance)) == 8, "ElementId.baseId has unexpected offset % instead of 8", ((cast(*void)(*instance.baseId)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementId.baseId)) == 4, "ElementId.baseId has unexpected size % instead of 4", size_of(type_of(ElementId.baseId))); + assert(((cast(*void)(*instance.stringId)) - cast(*void)(*instance)) == 16, "ElementId.stringId has unexpected offset % instead of 16", ((cast(*void)(*instance.stringId)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementId.stringId)) == 16, "ElementId.stringId has unexpected size % instead of 16", size_of(type_of(ElementId.stringId))); + assert(size_of(ElementId) == 32, "ElementId has size % instead of 32", size_of(ElementId)); + } + + { + instance: CornerRadius; + assert(((cast(*void)(*instance.topLeft)) - cast(*void)(*instance)) == 0, "CornerRadius.topLeft has unexpected offset % instead of 0", ((cast(*void)(*instance.topLeft)) - cast(*void)(*instance))); + assert(size_of(type_of(CornerRadius.topLeft)) == 4, "CornerRadius.topLeft has unexpected size % instead of 4", size_of(type_of(CornerRadius.topLeft))); + assert(((cast(*void)(*instance.topRight)) - cast(*void)(*instance)) == 4, "CornerRadius.topRight has unexpected offset % instead of 4", ((cast(*void)(*instance.topRight)) - cast(*void)(*instance))); + assert(size_of(type_of(CornerRadius.topRight)) == 4, "CornerRadius.topRight has unexpected size % instead of 4", size_of(type_of(CornerRadius.topRight))); + assert(((cast(*void)(*instance.bottomLeft)) - cast(*void)(*instance)) == 8, "CornerRadius.bottomLeft has unexpected offset % instead of 8", ((cast(*void)(*instance.bottomLeft)) - cast(*void)(*instance))); + assert(size_of(type_of(CornerRadius.bottomLeft)) == 4, "CornerRadius.bottomLeft has unexpected size % instead of 4", size_of(type_of(CornerRadius.bottomLeft))); + assert(((cast(*void)(*instance.bottomRight)) - cast(*void)(*instance)) == 12, "CornerRadius.bottomRight has unexpected offset % instead of 12", ((cast(*void)(*instance.bottomRight)) - cast(*void)(*instance))); + assert(size_of(type_of(CornerRadius.bottomRight)) == 4, "CornerRadius.bottomRight has unexpected size % instead of 4", size_of(type_of(CornerRadius.bottomRight))); + assert(size_of(CornerRadius) == 16, "CornerRadius has size % instead of 16", size_of(CornerRadius)); + } + + { + instance: ChildAlignment; + assert(((cast(*void)(*instance.x)) - cast(*void)(*instance)) == 0, "ChildAlignment.x has unexpected offset % instead of 0", ((cast(*void)(*instance.x)) - cast(*void)(*instance))); + assert(size_of(type_of(ChildAlignment.x)) == 4, "ChildAlignment.x has unexpected size % instead of 4", size_of(type_of(ChildAlignment.x))); + assert(((cast(*void)(*instance.y)) - cast(*void)(*instance)) == 4, "ChildAlignment.y has unexpected offset % instead of 4", ((cast(*void)(*instance.y)) - cast(*void)(*instance))); + assert(size_of(type_of(ChildAlignment.y)) == 4, "ChildAlignment.y has unexpected size % instead of 4", size_of(type_of(ChildAlignment.y))); + assert(size_of(ChildAlignment) == 8, "ChildAlignment has size % instead of 8", size_of(ChildAlignment)); + } + + { + instance: SizingMinMax; + assert(((cast(*void)(*instance.min)) - cast(*void)(*instance)) == 0, "SizingMinMax.min has unexpected offset % instead of 0", ((cast(*void)(*instance.min)) - cast(*void)(*instance))); + assert(size_of(type_of(SizingMinMax.min)) == 4, "SizingMinMax.min has unexpected size % instead of 4", size_of(type_of(SizingMinMax.min))); + assert(((cast(*void)(*instance.max)) - cast(*void)(*instance)) == 4, "SizingMinMax.max has unexpected offset % instead of 4", ((cast(*void)(*instance.max)) - cast(*void)(*instance))); + assert(size_of(type_of(SizingMinMax.max)) == 4, "SizingMinMax.max has unexpected size % instead of 4", size_of(type_of(SizingMinMax.max))); + assert(size_of(SizingMinMax) == 8, "SizingMinMax has size % instead of 8", size_of(SizingMinMax)); + } + + { + instance: SizingAxis; + assert(((cast(*void)(*instance.type)) - cast(*void)(*instance)) == 8, "SizingAxis.type has unexpected offset % instead of 8", ((cast(*void)(*instance.type)) - cast(*void)(*instance))); + assert(size_of(type_of(SizingAxis.type)) == 4, "SizingAxis.type has unexpected size % instead of 4", size_of(type_of(SizingAxis.type))); + assert(size_of(SizingAxis) == 12, "SizingAxis has size % instead of 12", size_of(SizingAxis)); + } + + { + instance: Sizing; + assert(((cast(*void)(*instance.width)) - cast(*void)(*instance)) == 0, "Sizing.width has unexpected offset % instead of 0", ((cast(*void)(*instance.width)) - cast(*void)(*instance))); + assert(size_of(type_of(Sizing.width)) == 12, "Sizing.width has unexpected size % instead of 12", size_of(type_of(Sizing.width))); + assert(((cast(*void)(*instance.height)) - cast(*void)(*instance)) == 12, "Sizing.height has unexpected offset % instead of 12", ((cast(*void)(*instance.height)) - cast(*void)(*instance))); + assert(size_of(type_of(Sizing.height)) == 12, "Sizing.height has unexpected size % instead of 12", size_of(type_of(Sizing.height))); + assert(size_of(Sizing) == 24, "Sizing has size % instead of 24", size_of(Sizing)); + } + + { + instance: Padding; + assert(((cast(*void)(*instance.x)) - cast(*void)(*instance)) == 0, "Padding.x has unexpected offset % instead of 0", ((cast(*void)(*instance.x)) - cast(*void)(*instance))); + assert(size_of(type_of(Padding.x)) == 2, "Padding.x has unexpected size % instead of 2", size_of(type_of(Padding.x))); + assert(((cast(*void)(*instance.y)) - cast(*void)(*instance)) == 2, "Padding.y has unexpected offset % instead of 2", ((cast(*void)(*instance.y)) - cast(*void)(*instance))); + assert(size_of(type_of(Padding.y)) == 2, "Padding.y has unexpected size % instead of 2", size_of(type_of(Padding.y))); + assert(size_of(Padding) == 4, "Padding has size % instead of 4", size_of(Padding)); + } + + { + instance: LayoutConfig; + assert(((cast(*void)(*instance.sizing)) - cast(*void)(*instance)) == 0, "LayoutConfig.sizing has unexpected offset % instead of 0", ((cast(*void)(*instance.sizing)) - cast(*void)(*instance))); + assert(size_of(type_of(LayoutConfig.sizing)) == 24, "LayoutConfig.sizing has unexpected size % instead of 24", size_of(type_of(LayoutConfig.sizing))); + assert(((cast(*void)(*instance.padding)) - cast(*void)(*instance)) == 24, "LayoutConfig.padding has unexpected offset % instead of 24", ((cast(*void)(*instance.padding)) - cast(*void)(*instance))); + assert(size_of(type_of(LayoutConfig.padding)) == 4, "LayoutConfig.padding has unexpected size % instead of 4", size_of(type_of(LayoutConfig.padding))); + assert(((cast(*void)(*instance.childGap)) - cast(*void)(*instance)) == 28, "LayoutConfig.childGap has unexpected offset % instead of 28", ((cast(*void)(*instance.childGap)) - cast(*void)(*instance))); + assert(size_of(type_of(LayoutConfig.childGap)) == 2, "LayoutConfig.childGap has unexpected size % instead of 2", size_of(type_of(LayoutConfig.childGap))); + assert(((cast(*void)(*instance.childAlignment)) - cast(*void)(*instance)) == 32, "LayoutConfig.childAlignment has unexpected offset % instead of 32", ((cast(*void)(*instance.childAlignment)) - cast(*void)(*instance))); + assert(size_of(type_of(LayoutConfig.childAlignment)) == 8, "LayoutConfig.childAlignment has unexpected size % instead of 8", size_of(type_of(LayoutConfig.childAlignment))); + assert(((cast(*void)(*instance.layoutDirection)) - cast(*void)(*instance)) == 40, "LayoutConfig.layoutDirection has unexpected offset % instead of 40", ((cast(*void)(*instance.layoutDirection)) - cast(*void)(*instance))); + assert(size_of(type_of(LayoutConfig.layoutDirection)) == 4, "LayoutConfig.layoutDirection has unexpected size % instead of 4", size_of(type_of(LayoutConfig.layoutDirection))); + assert(size_of(LayoutConfig) == 44, "LayoutConfig has size % instead of 44", size_of(LayoutConfig)); + } + + { + instance: RectangleElementConfig; + assert(((cast(*void)(*instance.color)) - cast(*void)(*instance)) == 0, "RectangleElementConfig.color has unexpected offset % instead of 0", ((cast(*void)(*instance.color)) - cast(*void)(*instance))); + assert(size_of(type_of(RectangleElementConfig.color)) == 16, "RectangleElementConfig.color has unexpected size % instead of 16", size_of(type_of(RectangleElementConfig.color))); + assert(((cast(*void)(*instance.cornerRadius)) - cast(*void)(*instance)) == 16, "RectangleElementConfig.cornerRadius has unexpected offset % instead of 16", ((cast(*void)(*instance.cornerRadius)) - cast(*void)(*instance))); + assert(size_of(type_of(RectangleElementConfig.cornerRadius)) == 16, "RectangleElementConfig.cornerRadius has unexpected size % instead of 16", size_of(type_of(RectangleElementConfig.cornerRadius))); + assert(size_of(RectangleElementConfig) == 32, "RectangleElementConfig has size % instead of 32", size_of(RectangleElementConfig)); + } + + { + instance: TextElementConfig; + assert(((cast(*void)(*instance.textColor)) - cast(*void)(*instance)) == 0, "TextElementConfig.textColor has unexpected offset % instead of 0", ((cast(*void)(*instance.textColor)) - cast(*void)(*instance))); + assert(size_of(type_of(TextElementConfig.textColor)) == 16, "TextElementConfig.textColor has unexpected size % instead of 16", size_of(type_of(TextElementConfig.textColor))); + assert(((cast(*void)(*instance.fontId)) - cast(*void)(*instance)) == 16, "TextElementConfig.fontId has unexpected offset % instead of 16", ((cast(*void)(*instance.fontId)) - cast(*void)(*instance))); + assert(size_of(type_of(TextElementConfig.fontId)) == 2, "TextElementConfig.fontId has unexpected size % instead of 2", size_of(type_of(TextElementConfig.fontId))); + assert(((cast(*void)(*instance.fontSize)) - cast(*void)(*instance)) == 18, "TextElementConfig.fontSize has unexpected offset % instead of 18", ((cast(*void)(*instance.fontSize)) - cast(*void)(*instance))); + assert(size_of(type_of(TextElementConfig.fontSize)) == 2, "TextElementConfig.fontSize has unexpected size % instead of 2", size_of(type_of(TextElementConfig.fontSize))); + assert(((cast(*void)(*instance.letterSpacing)) - cast(*void)(*instance)) == 20, "TextElementConfig.letterSpacing has unexpected offset % instead of 20", ((cast(*void)(*instance.letterSpacing)) - cast(*void)(*instance))); + assert(size_of(type_of(TextElementConfig.letterSpacing)) == 2, "TextElementConfig.letterSpacing has unexpected size % instead of 2", size_of(type_of(TextElementConfig.letterSpacing))); + assert(((cast(*void)(*instance.lineHeight)) - cast(*void)(*instance)) == 22, "TextElementConfig.lineHeight has unexpected offset % instead of 22", ((cast(*void)(*instance.lineHeight)) - cast(*void)(*instance))); + assert(size_of(type_of(TextElementConfig.lineHeight)) == 2, "TextElementConfig.lineHeight has unexpected size % instead of 2", size_of(type_of(TextElementConfig.lineHeight))); + assert(((cast(*void)(*instance.wrapMode)) - cast(*void)(*instance)) == 24, "TextElementConfig.wrapMode has unexpected offset % instead of 24", ((cast(*void)(*instance.wrapMode)) - cast(*void)(*instance))); + assert(size_of(type_of(TextElementConfig.wrapMode)) == 4, "TextElementConfig.wrapMode has unexpected size % instead of 4", size_of(type_of(TextElementConfig.wrapMode))); + assert(size_of(TextElementConfig) == 28, "TextElementConfig has size % instead of 28", size_of(TextElementConfig)); + } + + { + instance: ImageElementConfig; + assert(((cast(*void)(*instance.imageData)) - cast(*void)(*instance)) == 0, "ImageElementConfig.imageData has unexpected offset % instead of 0", ((cast(*void)(*instance.imageData)) - cast(*void)(*instance))); + assert(size_of(type_of(ImageElementConfig.imageData)) == 8, "ImageElementConfig.imageData has unexpected size % instead of 8", size_of(type_of(ImageElementConfig.imageData))); + assert(((cast(*void)(*instance.sourceDimensions)) - cast(*void)(*instance)) == 8, "ImageElementConfig.sourceDimensions has unexpected offset % instead of 8", ((cast(*void)(*instance.sourceDimensions)) - cast(*void)(*instance))); + assert(size_of(type_of(ImageElementConfig.sourceDimensions)) == 8, "ImageElementConfig.sourceDimensions has unexpected size % instead of 8", size_of(type_of(ImageElementConfig.sourceDimensions))); + assert(size_of(ImageElementConfig) == 16, "ImageElementConfig has size % instead of 16", size_of(ImageElementConfig)); + } + + { + instance: FloatingAttachPoints; + assert(((cast(*void)(*instance.element)) - cast(*void)(*instance)) == 0, "FloatingAttachPoints.element has unexpected offset % instead of 0", ((cast(*void)(*instance.element)) - cast(*void)(*instance))); + assert(size_of(type_of(FloatingAttachPoints.element)) == 4, "FloatingAttachPoints.element has unexpected size % instead of 4", size_of(type_of(FloatingAttachPoints.element))); + assert(((cast(*void)(*instance.parent)) - cast(*void)(*instance)) == 4, "FloatingAttachPoints.parent has unexpected offset % instead of 4", ((cast(*void)(*instance.parent)) - cast(*void)(*instance))); + assert(size_of(type_of(FloatingAttachPoints.parent)) == 4, "FloatingAttachPoints.parent has unexpected size % instead of 4", size_of(type_of(FloatingAttachPoints.parent))); + assert(size_of(FloatingAttachPoints) == 8, "FloatingAttachPoints has size % instead of 8", size_of(FloatingAttachPoints)); + } + + { + instance: FloatingElementConfig; + assert(((cast(*void)(*instance.offset)) - cast(*void)(*instance)) == 0, "FloatingElementConfig.offset has unexpected offset % instead of 0", ((cast(*void)(*instance.offset)) - cast(*void)(*instance))); + assert(size_of(type_of(FloatingElementConfig.offset)) == 8, "FloatingElementConfig.offset has unexpected size % instead of 8", size_of(type_of(FloatingElementConfig.offset))); + assert(((cast(*void)(*instance.expand)) - cast(*void)(*instance)) == 8, "FloatingElementConfig.expand has unexpected offset % instead of 8", ((cast(*void)(*instance.expand)) - cast(*void)(*instance))); + assert(size_of(type_of(FloatingElementConfig.expand)) == 8, "FloatingElementConfig.expand has unexpected size % instead of 8", size_of(type_of(FloatingElementConfig.expand))); + assert(((cast(*void)(*instance.zIndex)) - cast(*void)(*instance)) == 16, "FloatingElementConfig.zIndex has unexpected offset % instead of 16", ((cast(*void)(*instance.zIndex)) - cast(*void)(*instance))); + assert(size_of(type_of(FloatingElementConfig.zIndex)) == 2, "FloatingElementConfig.zIndex has unexpected size % instead of 2", size_of(type_of(FloatingElementConfig.zIndex))); + assert(((cast(*void)(*instance.parentId)) - cast(*void)(*instance)) == 20, "FloatingElementConfig.parentId has unexpected offset % instead of 20", ((cast(*void)(*instance.parentId)) - cast(*void)(*instance))); + assert(size_of(type_of(FloatingElementConfig.parentId)) == 4, "FloatingElementConfig.parentId has unexpected size % instead of 4", size_of(type_of(FloatingElementConfig.parentId))); + assert(((cast(*void)(*instance.attachment)) - cast(*void)(*instance)) == 24, "FloatingElementConfig.attachment has unexpected offset % instead of 24", ((cast(*void)(*instance.attachment)) - cast(*void)(*instance))); + assert(size_of(type_of(FloatingElementConfig.attachment)) == 8, "FloatingElementConfig.attachment has unexpected size % instead of 8", size_of(type_of(FloatingElementConfig.attachment))); + assert(((cast(*void)(*instance.pointerCaptureMode)) - cast(*void)(*instance)) == 32, "FloatingElementConfig.pointerCaptureMode has unexpected offset % instead of 32", ((cast(*void)(*instance.pointerCaptureMode)) - cast(*void)(*instance))); + assert(size_of(type_of(FloatingElementConfig.pointerCaptureMode)) == 4, "FloatingElementConfig.pointerCaptureMode has unexpected size % instead of 4", size_of(type_of(FloatingElementConfig.pointerCaptureMode))); + assert(size_of(FloatingElementConfig) == 36, "FloatingElementConfig has size % instead of 36", size_of(FloatingElementConfig)); + } + + { + instance: CustomElementConfig; + assert(((cast(*void)(*instance.customData)) - cast(*void)(*instance)) == 0, "CustomElementConfig.customData has unexpected offset % instead of 0", ((cast(*void)(*instance.customData)) - cast(*void)(*instance))); + assert(size_of(type_of(CustomElementConfig.customData)) == 8, "CustomElementConfig.customData has unexpected size % instead of 8", size_of(type_of(CustomElementConfig.customData))); + assert(size_of(CustomElementConfig) == 8, "CustomElementConfig has size % instead of 8", size_of(CustomElementConfig)); + } + + { + instance: ScrollElementConfig; + assert(((cast(*void)(*instance.horizontal)) - cast(*void)(*instance)) == 0, "ScrollElementConfig.horizontal has unexpected offset % instead of 0", ((cast(*void)(*instance.horizontal)) - cast(*void)(*instance))); + assert(size_of(type_of(ScrollElementConfig.horizontal)) == 1, "ScrollElementConfig.horizontal has unexpected size % instead of 1", size_of(type_of(ScrollElementConfig.horizontal))); + assert(((cast(*void)(*instance.vertical)) - cast(*void)(*instance)) == 1, "ScrollElementConfig.vertical has unexpected offset % instead of 1", ((cast(*void)(*instance.vertical)) - cast(*void)(*instance))); + assert(size_of(type_of(ScrollElementConfig.vertical)) == 1, "ScrollElementConfig.vertical has unexpected size % instead of 1", size_of(type_of(ScrollElementConfig.vertical))); + assert(size_of(ScrollElementConfig) == 2, "ScrollElementConfig has size % instead of 2", size_of(ScrollElementConfig)); + } + + { + instance: Border; + assert(((cast(*void)(*instance.width)) - cast(*void)(*instance)) == 0, "Border.width has unexpected offset % instead of 0", ((cast(*void)(*instance.width)) - cast(*void)(*instance))); + assert(size_of(type_of(Border.width)) == 4, "Border.width has unexpected size % instead of 4", size_of(type_of(Border.width))); + assert(((cast(*void)(*instance.color)) - cast(*void)(*instance)) == 4, "Border.color has unexpected offset % instead of 4", ((cast(*void)(*instance.color)) - cast(*void)(*instance))); + assert(size_of(type_of(Border.color)) == 16, "Border.color has unexpected size % instead of 16", size_of(type_of(Border.color))); + assert(size_of(Border) == 20, "Border has size % instead of 20", size_of(Border)); + } + + { + instance: BorderElementConfig; + assert(((cast(*void)(*instance.left)) - cast(*void)(*instance)) == 0, "BorderElementConfig.left has unexpected offset % instead of 0", ((cast(*void)(*instance.left)) - cast(*void)(*instance))); + assert(size_of(type_of(BorderElementConfig.left)) == 20, "BorderElementConfig.left has unexpected size % instead of 20", size_of(type_of(BorderElementConfig.left))); + assert(((cast(*void)(*instance.right)) - cast(*void)(*instance)) == 20, "BorderElementConfig.right has unexpected offset % instead of 20", ((cast(*void)(*instance.right)) - cast(*void)(*instance))); + assert(size_of(type_of(BorderElementConfig.right)) == 20, "BorderElementConfig.right has unexpected size % instead of 20", size_of(type_of(BorderElementConfig.right))); + assert(((cast(*void)(*instance.top)) - cast(*void)(*instance)) == 40, "BorderElementConfig.top has unexpected offset % instead of 40", ((cast(*void)(*instance.top)) - cast(*void)(*instance))); + assert(size_of(type_of(BorderElementConfig.top)) == 20, "BorderElementConfig.top has unexpected size % instead of 20", size_of(type_of(BorderElementConfig.top))); + assert(((cast(*void)(*instance.bottom)) - cast(*void)(*instance)) == 60, "BorderElementConfig.bottom has unexpected offset % instead of 60", ((cast(*void)(*instance.bottom)) - cast(*void)(*instance))); + assert(size_of(type_of(BorderElementConfig.bottom)) == 20, "BorderElementConfig.bottom has unexpected size % instead of 20", size_of(type_of(BorderElementConfig.bottom))); + assert(((cast(*void)(*instance.betweenChildren)) - cast(*void)(*instance)) == 80, "BorderElementConfig.betweenChildren has unexpected offset % instead of 80", ((cast(*void)(*instance.betweenChildren)) - cast(*void)(*instance))); + assert(size_of(type_of(BorderElementConfig.betweenChildren)) == 20, "BorderElementConfig.betweenChildren has unexpected size % instead of 20", size_of(type_of(BorderElementConfig.betweenChildren))); + assert(((cast(*void)(*instance.cornerRadius)) - cast(*void)(*instance)) == 100, "BorderElementConfig.cornerRadius has unexpected offset % instead of 100", ((cast(*void)(*instance.cornerRadius)) - cast(*void)(*instance))); + assert(size_of(type_of(BorderElementConfig.cornerRadius)) == 16, "BorderElementConfig.cornerRadius has unexpected size % instead of 16", size_of(type_of(BorderElementConfig.cornerRadius))); + assert(size_of(BorderElementConfig) == 116, "BorderElementConfig has size % instead of 116", size_of(BorderElementConfig)); + } + + { + instance: ElementConfigUnion; + assert(((cast(*void)(*instance.rectangleElementConfig)) - cast(*void)(*instance)) == 0, "ElementConfigUnion.rectangleElementConfig has unexpected offset % instead of 0", ((cast(*void)(*instance.rectangleElementConfig)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementConfigUnion.rectangleElementConfig)) == 8, "ElementConfigUnion.rectangleElementConfig has unexpected size % instead of 8", size_of(type_of(ElementConfigUnion.rectangleElementConfig))); + assert(((cast(*void)(*instance.textElementConfig)) - cast(*void)(*instance)) == 0, "ElementConfigUnion.textElementConfig has unexpected offset % instead of 0", ((cast(*void)(*instance.textElementConfig)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementConfigUnion.textElementConfig)) == 8, "ElementConfigUnion.textElementConfig has unexpected size % instead of 8", size_of(type_of(ElementConfigUnion.textElementConfig))); + assert(((cast(*void)(*instance.imageElementConfig)) - cast(*void)(*instance)) == 0, "ElementConfigUnion.imageElementConfig has unexpected offset % instead of 0", ((cast(*void)(*instance.imageElementConfig)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementConfigUnion.imageElementConfig)) == 8, "ElementConfigUnion.imageElementConfig has unexpected size % instead of 8", size_of(type_of(ElementConfigUnion.imageElementConfig))); + assert(((cast(*void)(*instance.floatingElementConfig)) - cast(*void)(*instance)) == 0, "ElementConfigUnion.floatingElementConfig has unexpected offset % instead of 0", ((cast(*void)(*instance.floatingElementConfig)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementConfigUnion.floatingElementConfig)) == 8, "ElementConfigUnion.floatingElementConfig has unexpected size % instead of 8", size_of(type_of(ElementConfigUnion.floatingElementConfig))); + assert(((cast(*void)(*instance.customElementConfig)) - cast(*void)(*instance)) == 0, "ElementConfigUnion.customElementConfig has unexpected offset % instead of 0", ((cast(*void)(*instance.customElementConfig)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementConfigUnion.customElementConfig)) == 8, "ElementConfigUnion.customElementConfig has unexpected size % instead of 8", size_of(type_of(ElementConfigUnion.customElementConfig))); + assert(((cast(*void)(*instance.scrollElementConfig)) - cast(*void)(*instance)) == 0, "ElementConfigUnion.scrollElementConfig has unexpected offset % instead of 0", ((cast(*void)(*instance.scrollElementConfig)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementConfigUnion.scrollElementConfig)) == 8, "ElementConfigUnion.scrollElementConfig has unexpected size % instead of 8", size_of(type_of(ElementConfigUnion.scrollElementConfig))); + assert(((cast(*void)(*instance.borderElementConfig)) - cast(*void)(*instance)) == 0, "ElementConfigUnion.borderElementConfig has unexpected offset % instead of 0", ((cast(*void)(*instance.borderElementConfig)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementConfigUnion.borderElementConfig)) == 8, "ElementConfigUnion.borderElementConfig has unexpected size % instead of 8", size_of(type_of(ElementConfigUnion.borderElementConfig))); + assert(size_of(ElementConfigUnion) == 8, "ElementConfigUnion has size % instead of 8", size_of(ElementConfigUnion)); + } + + { + instance: ElementConfig; + assert(((cast(*void)(*instance.type)) - cast(*void)(*instance)) == 0, "ElementConfig.type has unexpected offset % instead of 0", ((cast(*void)(*instance.type)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementConfig.type)) == 4, "ElementConfig.type has unexpected size % instead of 4", size_of(type_of(ElementConfig.type))); + assert(((cast(*void)(*instance.config)) - cast(*void)(*instance)) == 8, "ElementConfig.config has unexpected offset % instead of 8", ((cast(*void)(*instance.config)) - cast(*void)(*instance))); + assert(size_of(type_of(ElementConfig.config)) == 8, "ElementConfig.config has unexpected size % instead of 8", size_of(type_of(ElementConfig.config))); + assert(size_of(ElementConfig) == 16, "ElementConfig has size % instead of 16", size_of(ElementConfig)); + } + + { + instance: ScrollContainerData; + assert(((cast(*void)(*instance.scrollPosition)) - cast(*void)(*instance)) == 0, "ScrollContainerData.scrollPosition has unexpected offset % instead of 0", ((cast(*void)(*instance.scrollPosition)) - cast(*void)(*instance))); + assert(size_of(type_of(ScrollContainerData.scrollPosition)) == 8, "ScrollContainerData.scrollPosition has unexpected size % instead of 8", size_of(type_of(ScrollContainerData.scrollPosition))); + assert(((cast(*void)(*instance.scrollContainerDimensions)) - cast(*void)(*instance)) == 8, "ScrollContainerData.scrollContainerDimensions has unexpected offset % instead of 8", ((cast(*void)(*instance.scrollContainerDimensions)) - cast(*void)(*instance))); + assert(size_of(type_of(ScrollContainerData.scrollContainerDimensions)) == 8, "ScrollContainerData.scrollContainerDimensions has unexpected size % instead of 8", size_of(type_of(ScrollContainerData.scrollContainerDimensions))); + assert(((cast(*void)(*instance.contentDimensions)) - cast(*void)(*instance)) == 16, "ScrollContainerData.contentDimensions has unexpected offset % instead of 16", ((cast(*void)(*instance.contentDimensions)) - cast(*void)(*instance))); + assert(size_of(type_of(ScrollContainerData.contentDimensions)) == 8, "ScrollContainerData.contentDimensions has unexpected size % instead of 8", size_of(type_of(ScrollContainerData.contentDimensions))); + assert(((cast(*void)(*instance.config)) - cast(*void)(*instance)) == 24, "ScrollContainerData.config has unexpected offset % instead of 24", ((cast(*void)(*instance.config)) - cast(*void)(*instance))); + assert(size_of(type_of(ScrollContainerData.config)) == 2, "ScrollContainerData.config has unexpected size % instead of 2", size_of(type_of(ScrollContainerData.config))); + assert(((cast(*void)(*instance.found)) - cast(*void)(*instance)) == 26, "ScrollContainerData.found has unexpected offset % instead of 26", ((cast(*void)(*instance.found)) - cast(*void)(*instance))); + assert(size_of(type_of(ScrollContainerData.found)) == 1, "ScrollContainerData.found has unexpected size % instead of 1", size_of(type_of(ScrollContainerData.found))); + assert(size_of(ScrollContainerData) == 32, "ScrollContainerData has size % instead of 32", size_of(ScrollContainerData)); + } + + { + instance: RenderCommand; + assert(((cast(*void)(*instance.boundingBox)) - cast(*void)(*instance)) == 0, "RenderCommand.boundingBox has unexpected offset % instead of 0", ((cast(*void)(*instance.boundingBox)) - cast(*void)(*instance))); + assert(size_of(type_of(RenderCommand.boundingBox)) == 16, "RenderCommand.boundingBox has unexpected size % instead of 16", size_of(type_of(RenderCommand.boundingBox))); + assert(((cast(*void)(*instance.config)) - cast(*void)(*instance)) == 16, "RenderCommand.config has unexpected offset % instead of 16", ((cast(*void)(*instance.config)) - cast(*void)(*instance))); + assert(size_of(type_of(RenderCommand.config)) == 8, "RenderCommand.config has unexpected size % instead of 8", size_of(type_of(RenderCommand.config))); + assert(((cast(*void)(*instance.text)) - cast(*void)(*instance)) == 24, "RenderCommand.text has unexpected offset % instead of 24", ((cast(*void)(*instance.text)) - cast(*void)(*instance))); + assert(size_of(type_of(RenderCommand.text)) == 16, "RenderCommand.text has unexpected size % instead of 16", size_of(type_of(RenderCommand.text))); + assert(((cast(*void)(*instance.id)) - cast(*void)(*instance)) == 40, "RenderCommand.id has unexpected offset % instead of 40", ((cast(*void)(*instance.id)) - cast(*void)(*instance))); + assert(size_of(type_of(RenderCommand.id)) == 4, "RenderCommand.id has unexpected size % instead of 4", size_of(type_of(RenderCommand.id))); + assert(((cast(*void)(*instance.commandType)) - cast(*void)(*instance)) == 44, "RenderCommand.commandType has unexpected offset % instead of 44", ((cast(*void)(*instance.commandType)) - cast(*void)(*instance))); + assert(size_of(type_of(RenderCommand.commandType)) == 4, "RenderCommand.commandType has unexpected size % instead of 4", size_of(type_of(RenderCommand.commandType))); + assert(size_of(RenderCommand) == 48, "RenderCommand has size % instead of 48", size_of(RenderCommand)); + } + + { + instance: RenderCommandArray; + assert(((cast(*void)(*instance.capacity)) - cast(*void)(*instance)) == 0, "RenderCommandArray.capacity has unexpected offset % instead of 0", ((cast(*void)(*instance.capacity)) - cast(*void)(*instance))); + assert(size_of(type_of(RenderCommandArray.capacity)) == 4, "RenderCommandArray.capacity has unexpected size % instead of 4", size_of(type_of(RenderCommandArray.capacity))); + assert(((cast(*void)(*instance.length)) - cast(*void)(*instance)) == 4, "RenderCommandArray.length has unexpected offset % instead of 4", ((cast(*void)(*instance.length)) - cast(*void)(*instance))); + assert(size_of(type_of(RenderCommandArray.length)) == 4, "RenderCommandArray.length has unexpected size % instead of 4", size_of(type_of(RenderCommandArray.length))); + assert(((cast(*void)(*instance.internalArray)) - cast(*void)(*instance)) == 8, "RenderCommandArray.internalArray has unexpected offset % instead of 8", ((cast(*void)(*instance.internalArray)) - cast(*void)(*instance))); + assert(size_of(type_of(RenderCommandArray.internalArray)) == 8, "RenderCommandArray.internalArray has unexpected size % instead of 8", size_of(type_of(RenderCommandArray.internalArray))); + assert(size_of(RenderCommandArray) == 16, "RenderCommandArray has size % instead of 16", size_of(RenderCommandArray)); + } + + { + instance: PointerData; + assert(((cast(*void)(*instance.position)) - cast(*void)(*instance)) == 0, "PointerData.position has unexpected offset % instead of 0", ((cast(*void)(*instance.position)) - cast(*void)(*instance))); + assert(size_of(type_of(PointerData.position)) == 8, "PointerData.position has unexpected size % instead of 8", size_of(type_of(PointerData.position))); + assert(((cast(*void)(*instance.state)) - cast(*void)(*instance)) == 8, "PointerData.state has unexpected offset % instead of 8", ((cast(*void)(*instance.state)) - cast(*void)(*instance))); + assert(size_of(type_of(PointerData.state)) == 4, "PointerData.state has unexpected size % instead of 4", size_of(type_of(PointerData.state))); + assert(size_of(PointerData) == 12, "PointerData has size % instead of 12", size_of(PointerData)); + } +} +