Skip to content

Commit 86ee042

Browse files
committed
Add support for C++20 modules.
Fixed YaaZ#29 Fixed YaaZ#32
1 parent d9b2147 commit 86ee042

File tree

5 files changed

+107
-8
lines changed

5 files changed

+107
-8
lines changed

Generate.java

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,8 @@ static <T> String processTemplate(Ifdef.Range ifdef, int sourcePosition,
207207
return processTemplate(content.toString(), replacementStrings);
208208
}
209209

210-
static void generateEnums(String orig, Ifdef.Range ifdef) throws IOException {
210+
static List<String> generateEnums(String orig, Ifdef.Range ifdef) throws IOException {
211+
List<String> enums = new ArrayList<>();
211212
record Entry(String name, String originalName) {}
212213
StringBuilder content = new StringBuilder();
213214
Pattern typedefPattern = Pattern.compile("typedef\\s+enum\\s+Vma(\\w+)");
@@ -217,6 +218,8 @@ record Entry(String name, String originalName) {}
217218
String name = typedefMatcher.group(1);
218219
boolean flagBits = name.endsWith("FlagBits");
219220
String flags = flagBits ? name.substring(0, name.length() - 4) + "s" : null;
221+
enums.add(name);
222+
if (flagBits) enums.add(flags);
220223

221224
String body = orig.substring(typedefMatcher.end(), orig.indexOf("}", typedefMatcher.end()));
222225
Matcher entryMatcher = entryPattern.matcher(body);
@@ -300,6 +303,7 @@ enum class $0$1 {
300303
301304
#endif
302305
""", content.toString()));
306+
return enums;
303307
}
304308

305309
enum VarTag {
@@ -482,6 +486,7 @@ static class Handle {
482486
final StringBuilder declarations = new StringBuilder(), definitions = new StringBuilder();
483487
Ifdef.Range ifdef;
484488
final Set<Handle> dependencies = new LinkedHashSet<>();
489+
final Set<String> methods = new LinkedHashSet<>();
485490
Handle owner = null;
486491
boolean appended = false;
487492

@@ -587,7 +592,7 @@ static String deduceVectorSize(String funcName, String lenIfNotNull) {
587592

588593
static Set<String> BLACKLISTED_UNIQUE_HANDLES = Set.of("DefragmentationContext"); // These handles will not have unique variants
589594

590-
static void generateHandles(String orig, Ifdef.Range ifdef, List<String> structs) throws IOException {
595+
static List<Handle> generateHandles(String orig, Ifdef.Range ifdef, List<String> structs) throws IOException {
591596
// Forward declarations for structs
592597
StringBuilder forwardDeclarations = new StringBuilder(), declarations = new StringBuilder(), definitions = new StringBuilder();
593598
for (String s : structs) forwardDeclarations.append("\nstruct ").append(s).append(";");
@@ -634,6 +639,7 @@ static void generateHandles(String orig, Ifdef.Range ifdef, List<String> structs
634639
String funcName = "vma" + name; // Original function name
635640
if (handle != namespaceHandle && name.equals("Destroy" + handle.name)) name = "destroy"; // E.g. Allocator::destroyAllocator -> Allocator::destroy
636641
String methodName = name.substring(0, 1).toLowerCase() + name.substring(1); // Generated method name
642+
handle.methods.add(methodName);
637643

638644
// Find dependencies of array sizes
639645
Integer[] arrayByLengthIndex = new Integer[params.size()];
@@ -876,6 +882,34 @@ String generate(boolean definition, boolean uniqueHandle, boolean customVectorAl
876882
}
877883
#endif
878884
""", definitions.toString()));
885+
return Stream.concat(Stream.of(namespaceHandle), handles.values().stream()).toList();
886+
}
887+
888+
static void generateModule(List<String> enums, List<String> structs, List<Handle> handles) throws IOException {
889+
Files.writeString(Path.of("src/vk_mem_alloc.cppm"), processTemplate("""
890+
module;
891+
#define VMA_IMPLEMENTATION
892+
#include <vk_mem_alloc.hpp>
893+
export module vk_mem_alloc_hpp;
894+
export namespace VMA_HPP_NAMESPACE {
895+
using VMA_HPP_NAMESPACE::operator|;
896+
using VMA_HPP_NAMESPACE::operator&;
897+
using VMA_HPP_NAMESPACE::operator^;
898+
using VMA_HPP_NAMESPACE::operator~;
899+
using VMA_HPP_NAMESPACE::to_string;
900+
using VMA_HPP_NAMESPACE::functionsFromDispatcher;
901+
$0
902+
# ifndef VULKAN_HPP_NO_SMART_HANDLE
903+
$1
904+
using VMA_HPP_NAMESPACE::UniqueBuffer;
905+
using VMA_HPP_NAMESPACE::UniqueImage;
906+
# endif
907+
}
908+
""", Stream.concat(Stream.concat(enums.stream(), structs.stream()), handles.stream()
909+
.flatMap(h -> h.name == null ? h.methods.stream() : Stream.of(h.name)))
910+
.map(s -> " using VMA_HPP_NAMESPACE::" + s + ";").collect(Collectors.joining("\n")),
911+
handles.stream().skip(1).map(h -> " using VMA_HPP_NAMESPACE::Unique" + h.name + ";")
912+
.collect(Collectors.joining("\n"))));
879913
}
880914

881915
public static void main(String[] args) throws Exception {
@@ -890,9 +924,10 @@ public static void main(String[] args) throws Exception {
890924

891925
Ifdef.Range ifdef = Ifdef.buildTree(orig, 2);
892926

893-
generateEnums(orig, ifdef);
927+
List<String> enums = generateEnums(orig, ifdef);
894928
List<String> structs = generateStructs(orig, ifdef);
895-
generateHandles(orig, ifdef, structs);
929+
List<Handle> handles = generateHandles(orig, ifdef, structs);
930+
generateModule(enums, structs, handles);
896931
}
897932

898933
}

Vulkan-Hpp

Submodule Vulkan-Hpp updated 87 files

include/vk_mem_alloc.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,12 @@ namespace VMA_HPP_NAMESPACE {
5959
};
6060
}
6161
namespace VULKAN_HPP_NAMESPACE {
62-
template<> struct UniqueHandleTraits<Buffer, VMA_HPP_NAMESPACE::Dispatcher> {
62+
template<> class UniqueHandleTraits<Buffer, VMA_HPP_NAMESPACE::Dispatcher> {
63+
public:
6364
using deleter = VMA_HPP_NAMESPACE::Deleter<Buffer, VMA_HPP_NAMESPACE::Allocator>;
6465
};
65-
template<> struct UniqueHandleTraits<Image, VMA_HPP_NAMESPACE::Dispatcher> {
66+
template<> class UniqueHandleTraits<Image, VMA_HPP_NAMESPACE::Dispatcher> {
67+
public:
6668
using deleter = VMA_HPP_NAMESPACE::Deleter<Image, VMA_HPP_NAMESPACE::Allocator>;
6769
};
6870
}

src/vk_mem_alloc.cppm

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
module;
2+
#define VMA_IMPLEMENTATION
3+
#include <vk_mem_alloc.hpp>
4+
export module vk_mem_alloc_hpp;
5+
export namespace VMA_HPP_NAMESPACE {
6+
using VMA_HPP_NAMESPACE::operator|;
7+
using VMA_HPP_NAMESPACE::operator&;
8+
using VMA_HPP_NAMESPACE::operator^;
9+
using VMA_HPP_NAMESPACE::operator~;
10+
using VMA_HPP_NAMESPACE::to_string;
11+
using VMA_HPP_NAMESPACE::functionsFromDispatcher;
12+
using VMA_HPP_NAMESPACE::AllocatorCreateFlagBits;
13+
using VMA_HPP_NAMESPACE::AllocatorCreateFlags;
14+
using VMA_HPP_NAMESPACE::MemoryUsage;
15+
using VMA_HPP_NAMESPACE::AllocationCreateFlagBits;
16+
using VMA_HPP_NAMESPACE::AllocationCreateFlags;
17+
using VMA_HPP_NAMESPACE::PoolCreateFlagBits;
18+
using VMA_HPP_NAMESPACE::PoolCreateFlags;
19+
using VMA_HPP_NAMESPACE::DefragmentationFlagBits;
20+
using VMA_HPP_NAMESPACE::DefragmentationFlags;
21+
using VMA_HPP_NAMESPACE::DefragmentationMoveOperation;
22+
using VMA_HPP_NAMESPACE::VirtualBlockCreateFlagBits;
23+
using VMA_HPP_NAMESPACE::VirtualBlockCreateFlags;
24+
using VMA_HPP_NAMESPACE::VirtualAllocationCreateFlagBits;
25+
using VMA_HPP_NAMESPACE::VirtualAllocationCreateFlags;
26+
using VMA_HPP_NAMESPACE::DeviceMemoryCallbacks;
27+
using VMA_HPP_NAMESPACE::VulkanFunctions;
28+
using VMA_HPP_NAMESPACE::AllocatorCreateInfo;
29+
using VMA_HPP_NAMESPACE::AllocatorInfo;
30+
using VMA_HPP_NAMESPACE::Statistics;
31+
using VMA_HPP_NAMESPACE::DetailedStatistics;
32+
using VMA_HPP_NAMESPACE::TotalStatistics;
33+
using VMA_HPP_NAMESPACE::Budget;
34+
using VMA_HPP_NAMESPACE::AllocationCreateInfo;
35+
using VMA_HPP_NAMESPACE::PoolCreateInfo;
36+
using VMA_HPP_NAMESPACE::AllocationInfo;
37+
using VMA_HPP_NAMESPACE::DefragmentationInfo;
38+
using VMA_HPP_NAMESPACE::DefragmentationMove;
39+
using VMA_HPP_NAMESPACE::DefragmentationPassMoveInfo;
40+
using VMA_HPP_NAMESPACE::DefragmentationStats;
41+
using VMA_HPP_NAMESPACE::VirtualBlockCreateInfo;
42+
using VMA_HPP_NAMESPACE::VirtualAllocationCreateInfo;
43+
using VMA_HPP_NAMESPACE::VirtualAllocationInfo;
44+
using VMA_HPP_NAMESPACE::createAllocator;
45+
using VMA_HPP_NAMESPACE::createVirtualBlock;
46+
using VMA_HPP_NAMESPACE::Allocator;
47+
using VMA_HPP_NAMESPACE::Pool;
48+
using VMA_HPP_NAMESPACE::Allocation;
49+
using VMA_HPP_NAMESPACE::DefragmentationContext;
50+
using VMA_HPP_NAMESPACE::VirtualAllocation;
51+
using VMA_HPP_NAMESPACE::VirtualBlock;
52+
# ifndef VULKAN_HPP_NO_SMART_HANDLE
53+
using VMA_HPP_NAMESPACE::UniqueAllocator;
54+
using VMA_HPP_NAMESPACE::UniquePool;
55+
using VMA_HPP_NAMESPACE::UniqueAllocation;
56+
using VMA_HPP_NAMESPACE::UniqueDefragmentationContext;
57+
using VMA_HPP_NAMESPACE::UniqueVirtualAllocation;
58+
using VMA_HPP_NAMESPACE::UniqueVirtualBlock;
59+
using VMA_HPP_NAMESPACE::UniqueBuffer;
60+
using VMA_HPP_NAMESPACE::UniqueImage;
61+
# endif
62+
}

0 commit comments

Comments
 (0)