#include <metal_stdlib>
using namespace metal;

template<typename T, size_t N>
struct tint_array {
  const constant T& operator[](size_t i) const constant { return elements[i]; }
  device T& operator[](size_t i) device { return elements[i]; }
  const device T& operator[](size_t i) const device { return elements[i]; }
  thread T& operator[](size_t i) thread { return elements[i]; }
  const thread T& operator[](size_t i) const thread { return elements[i]; }
  threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
  const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
  T elements[N];
};

struct tint_module_vars_struct {
  device tint_array<uint, 1>* tint_member;
  const constant tint_array<uint4, 1>* tint_storage_buffer_sizes;
};

struct tint_array_lengths_struct {
  uint tint_array_length_0_0;
};

void main_inner(uint sg_id, uint sg_size, tint_module_vars_struct tint_module_vars) {
  (*tint_module_vars.tint_member)[min(sg_id, (tint_array_lengths_struct{.tint_array_length_0_0=((*tint_module_vars.tint_storage_buffer_sizes)[0u].x / 4u)}.tint_array_length_0_0 - 1u))] = sg_size;
}

[[max_total_threads_per_threadgroup(32)]]
kernel void v(uint sg_id [[thread_index_in_simdgroup]], uint sg_size [[threads_per_simdgroup]], device tint_array<uint, 1>* v_1 [[buffer(0)]], const constant tint_array<uint4, 1>* tint_storage_buffer_sizes [[buffer(30)]]) {
  tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.tint_member=v_1, .tint_storage_buffer_sizes=tint_storage_buffer_sizes};
  (main_inner(sg_id, sg_size, tint_module_vars));
}
