#ifndef PROTOTYPE1_SRC_L1_ANNE_VULKAN_H
#define PROTOTYPE1_SRC_L1_ANNE_VULKAN_H

#include "../codegen/util_template_inst.h"

/* These headers will be guarded */
void generate_util_templ_inst_for_vulkan_headers() {
    SpanU8 vulkan_dep = cstr("#include <vulkan/vulkan.h>");
    SpanU8 l = cstr("l1");
    SpanU8 ns = cstr("vulkan");
    mkdir_nofail("l1/vulkan");
    generate_guarded_span_company_for_primitive(l, ns, cstr("VkQueueFamilyProperties"), vulkan_dep, true, false);
    generate_guarded_span_company_for_primitive(l, ns, cstr("VkExtensionProperties"), vulkan_dep, true, false);

    generate_guarded_span_company_for_primitive(l, ns, cstr("VkSurfaceFormatKHR"), vulkan_dep, true, false);
    generate_guarded_span_company_for_primitive(l, ns, cstr("VkPresentModeKHR"), vulkan_dep, true, false);
    generate_guarded_span_company_for_primitive(l, ns, cstr("VkFormat"), vulkan_dep, false, true);

    generate_Option_templ_inst_guarded_header(l, ns, vulkan_dep, (option_template_instantiation_op){
        .T = cstr("VkPresentModeKHR"), .t_integer = true
    });
    generate_Option_templ_inst_guarded_header(l, ns, vulkan_dep, (option_template_instantiation_op){
        .T = cstr("VkFormat"), .t_integer = true
    });
    generate_Option_templ_inst_guarded_header(l, ns, vulkan_dep, (option_template_instantiation_op){
        .T = cstr("VkSurfaceFormatKHR"), .t_primitive = true
    });
    generate_Option_templ_inst_guarded_header(l, ns, vulkan_dep, (option_template_instantiation_op){
        .T = cstr("VkCompositeAlphaFlagBitsKHR"), .t_integer = true
    });
    generate_Option_templ_inst_guarded_header(l, ns, vulkan_dep, (option_template_instantiation_op){
        .T = cstr("VkExtent2D"), .t_primitive = true
    });
    // for these


    generate_guarded_span_company_for_primitive(l, ns, cstr("VkPhysicalDevice"), vulkan_dep, true, false);
    generate_guarded_span_company_for_primitive(l, ns, cstr("VkImage"), vulkan_dep, true, false);
    generate_guarded_span_company_for_primitive(l, ns, cstr("VkImageView"), vulkan_dep, true, false);
    generate_guarded_span_company_for_primitive(l, ns, cstr("VkFramebuffer"), vulkan_dep, true, false);
    generate_guarded_span_company_for_primitive(l, ns, cstr("VkSemaphore"), vulkan_dep, true, false);
    generate_guarded_span_company_for_primitive(l, ns, cstr("VkBufferCopy"), vulkan_dep, true, false);
    generate_guarded_span_company_for_primitive(l, ns, cstr("VkImageMemoryBarrier"), vulkan_dep, true, false);
    generate_guarded_span_company_for_primitive(l, ns, cstr("VkDescriptorImageInfo"), vulkan_dep, true, false);
}

#endif