#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_symbol_4 {
  /* 0x0000 */ tint_array<uint, 1> arr;
};

struct ComputeInputs {
  uint subgroup_invocation_id;
  uint subgroup_size;
};

void tint_symbol_inner(ComputeInputs inputs, device tint_array<uint, 1>* const tint_symbol_2) {
  (*(tint_symbol_2))[inputs.subgroup_invocation_id] = inputs.subgroup_size;
}

kernel void tint_symbol(device tint_symbol_4* tint_symbol_3 [[buffer(0)]], uint subgroup_invocation_id [[thread_index_in_simdgroup]], uint subgroup_size [[threads_per_simdgroup]]) {
  ComputeInputs const tint_symbol_1 = {.subgroup_invocation_id=subgroup_invocation_id, .subgroup_size=subgroup_size};
  tint_symbol_inner(tint_symbol_1, &((*(tint_symbol_3)).arr));
  return;
}

