#include <cuda_runtime.h>
#include <stdbool.h>

#ifndef _{{if .WithDomain}}{{toUpper .Field}}{{else}}{{toUpper .FieldNoDomain}}{{end}}_NTT_H
#define _{{if .WithDomain}}{{toUpper .Field}}{{else}}{{toUpper .FieldNoDomain}}{{end}}_NTT_H

#ifdef __cplusplus
extern "C" {
#endif

typedef struct scalar_t scalar_t;
typedef struct NTTConfig NTTConfig;
{{if .WithDomain}}typedef struct DeviceContext DeviceContext;{{end}}

cudaError_t {{if .WithDomain}}{{.Field}}{{else}}{{.FieldNoDomain}}{{end}}_ntt_cuda(const scalar_t* input, int size, int dir, NTTConfig* config, scalar_t* output);
{{if .WithDomain -}}
cudaError_t {{.Field}}_initialize_domain(scalar_t* primitive_root, DeviceContext* ctx, bool fast_twiddles);
cudaError_t {{.Field}}_release_domain(DeviceContext* ctx);{{end}}

#ifdef __cplusplus
}
#endif

#endif