Skip to content

Commit

Permalink
Customize builder for VkLayerSettingEXT
Browse files Browse the repository at this point in the history
  • Loading branch information
KyleMayes committed Dec 29, 2024
1 parent 5739175 commit 301dc80
Show file tree
Hide file tree
Showing 3 changed files with 108 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

package com.kylemayes.generator.generate.file

import com.kylemayes.generator.generate.support.generateCustomBuilderMethods
import com.kylemayes.generator.generate.support.generatePtr
import com.kylemayes.generator.generate.support.generateRef
import com.kylemayes.generator.generate.support.getStructExtensions
import com.kylemayes.generator.generate.support.getStructLifetime
import com.kylemayes.generator.generate.support.skipBuilderMethods
import com.kylemayes.generator.registry.ArrayType
import com.kylemayes.generator.registry.Identifier
import com.kylemayes.generator.registry.Member
Expand Down Expand Up @@ -193,10 +195,11 @@ private fun Registry.generateMethods(struct: Structure): String {

// Filter out the fields that do not require builder methods since they will
// be set by other builder methods (i.e., array length fields for
// non-optional array fields).
// non-optional array fields) or have custom handling.
val skip = skipBuilderMethods[struct.name.original] ?: setOf()
val requireBuilders =
members.values.filter {
arraysByLength[it.name].let { a -> a?.optional ?: true }
!skip.contains(it.name.original) && arraysByLength[it.name].let { a -> a?.optional ?: true }
}

// Generate the builder methods.
Expand Down Expand Up @@ -235,6 +238,8 @@ private fun Registry.generateMethods(struct: Structure): String {
}
}

methods.addAll(generateCustomBuilderMethods(struct))

return methods.joinToString("")
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.kylemayes.generator.generate.support

import com.kylemayes.generator.registry.Registry
import com.kylemayes.generator.registry.Structure
import com.kylemayes.generator.registry.intern

/** Builder methods to skip (due to handling of special cases below). */
val skipBuilderMethods =
mapOf(
"VkLayerSettingEXT" to setOf("type", "pValues"),
)

/** Generates builder methods for special cases. */
fun Registry.generateCustomBuilderMethods(struct: Structure): List<String> =
when (struct.name.original) {
"VkLayerSettingEXT" -> generateLayerSettingBuilderMethods(struct)
else -> listOf()
}

/** Generate one method per type since the type and values fields are linked. */
private fun Registry.generateLayerSettingBuilderMethods(struct: Structure): List<String> {
val generateType = { type: String ->
when (type) {
"BOOL32" -> "Bool32"
"INT32" -> "i32"
"INT64" -> "i64"
"UINT32" -> "u32"
"UINT64" -> "u64"
"FLOAT32" -> "f32"
"FLOAT64" -> "f64"
"STRING" -> "*const u8"
else -> "()"
}
}

return this.enums["VkLayerSettingTypeEXT".intern()]!!.variants.map {
"""
#[inline]
pub fn values_${it.name.value.lowercase()}(mut self, values: &[${generateType(it.name.value)}]) -> Self {
self.value.type_ = LayerSettingTypeEXT::${it.name.value};
self.value.value_count = values.len() as u32;
self.value.values = values.as_ptr().cast();
self
}
"""
}
}
57 changes: 54 additions & 3 deletions vulkanalia/src/vk/builders.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30003,13 +30003,64 @@ impl<'b> LayerSettingEXTBuilder<'b> {
}

#[inline]
pub fn type_(mut self, type_: LayerSettingTypeEXT) -> Self {
self.value.type_ = type_;
pub fn values_bool32(mut self, values: &[Bool32]) -> Self {
self.value.type_ = LayerSettingTypeEXT::BOOL32;
self.value.value_count = values.len() as u32;
self.value.values = values.as_ptr().cast();
self
}

#[inline]
pub fn values(mut self, values: &'b [u8]) -> Self {
pub fn values_int32(mut self, values: &[i32]) -> Self {
self.value.type_ = LayerSettingTypeEXT::INT32;
self.value.value_count = values.len() as u32;
self.value.values = values.as_ptr().cast();
self
}

#[inline]
pub fn values_int64(mut self, values: &[i64]) -> Self {
self.value.type_ = LayerSettingTypeEXT::INT64;
self.value.value_count = values.len() as u32;
self.value.values = values.as_ptr().cast();
self
}

#[inline]
pub fn values_uint32(mut self, values: &[u32]) -> Self {
self.value.type_ = LayerSettingTypeEXT::UINT32;
self.value.value_count = values.len() as u32;
self.value.values = values.as_ptr().cast();
self
}

#[inline]
pub fn values_uint64(mut self, values: &[u64]) -> Self {
self.value.type_ = LayerSettingTypeEXT::UINT64;
self.value.value_count = values.len() as u32;
self.value.values = values.as_ptr().cast();
self
}

#[inline]
pub fn values_float32(mut self, values: &[f32]) -> Self {
self.value.type_ = LayerSettingTypeEXT::FLOAT32;
self.value.value_count = values.len() as u32;
self.value.values = values.as_ptr().cast();
self
}

#[inline]
pub fn values_float64(mut self, values: &[f64]) -> Self {
self.value.type_ = LayerSettingTypeEXT::FLOAT64;
self.value.value_count = values.len() as u32;
self.value.values = values.as_ptr().cast();
self
}

#[inline]
pub fn values_string(mut self, values: &[*const u8]) -> Self {
self.value.type_ = LayerSettingTypeEXT::STRING;
self.value.value_count = values.len() as u32;
self.value.values = values.as_ptr().cast();
self
Expand Down

0 comments on commit 301dc80

Please sign in to comment.