#pragma once
#include <cmath>

void __attribute__((noinline)) vfastpow2_array(const float *input,
                                               float *output, int count);

void __attribute__((noinline)) vfastpow10_array(const float *input,
                                                float *output, int count);

void __attribute__((noinline)) vfastsqrt_array(const float *input,
                                               float *output, int count);

void __attribute__((noinline)) vfastlog2_array(const float *input,
                                               float *output, int count);

void __attribute__((noinline)) vfastpow_array(const float *a, const float *b,
                                              float *output, int count);

void __attribute__((noinline)) vfastsin_0topi_array(const float *input,
                                                    float *output, int count);

void __attribute__((noinline)) vfastcos_0topi_array(const float *input,
                                                    float *output, int count);

void __attribute__((noinline)) vfastfmod1_array(const float *input,
                                                float *output, int count);

void __attribute__((noinline)) vfastwrapmod1_array(const float *input,
                                                   float *output, int count);

void __attribute__((noinline)) vfastclamp_array(const float *input, float min,
                                                float max, float *output,
                                                int count);

void __attribute__((noinline)) vfastclamp_nanzero_array(const float *input,
                                                        float min, float max,
                                                        float *output,
                                                        int count);

void __attribute__((noinline)) vfastnanzero_array(const float *input,
                                                  float *output, int count);

void __attribute__((noinline)) vfastabs_array(const float *input, float *output,
                                              int count);

void __attribute__((noinline)) vfastmin_array(const float *a, const float *b,
                                              float *output, int count);

void __attribute__((noinline)) vfastmax_array(const float *a, const float *b,
                                              float *output, int count);

float __attribute__((noinline)) vfastmin_elem_array(const float *input,
                                                    int count);

float __attribute__((noinline)) vfastmax_elem_array(const float *input,
                                                    int count);

float __attribute__((noinline)) vfastmin_abs_elem_array(const float *input,
                                                        int count);

float __attribute__((noinline)) vfastmax_abs_elem_array(const float *input,
                                                        int count);

void __attribute__((noinline))
vfast_curve_fade_array(const float *input, float gain, float startTime,
                       float endTime, float fadeInDuration,
                       float fadeOutDuration, float fadeInExponent,
                       float fadeOutExponent, float *output, int count);

float __attribute__((noinline)) vfast_ema_squared_array(const float *input,
                                                        float alpha,
                                                        float initialValue,
                                                        int count);

inline float fastfmod1(float x) { return x - std::floor(x); }