#ifndef UTILS_H
#define UTILS_H

namespace Utils {

    template<typename T>
    T interpolate(const T& a, const T& b, float f) {
        return a * (1.0f - f) + b * f;
    }

    template<typename T>
    int popCount(const T& t) {
        static constexpr int map[16] = {0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4};
        int sum = 0;
        for(int i = 0; i < static_cast<int> (sizeof (T) * 8); i += 4) {
            sum += map[(t >> i) & 0xF];
        }
        return sum;
    }

    constexpr int roundUpLog2(int i) {
        if(i <= 0) {
            return 0;
        }
        int c = 1;
        while(((i - 1) >> c) > 0) {
            c++;
        }
        return c;
    }
}

#endif