furnace/extern/vgsound_emu-modified/vgsound_emu/src/core/util.hpp

83 lines
2.0 KiB
C++

/*
License: Zlib
see https://gitlab.com/cam900/vgsound_emu/-/blob/main/LICENSE for more details
Copyright holder(s): cam900
Various core utilities for vgsound_emu
*/
#ifndef _VGSOUND_EMU_SRC_CORE_UTIL_HPP
#define _VGSOUND_EMU_SRC_CORE_UTIL_HPP
#pragma once
#include <algorithm>
#include <array>
#include <cmath>
#include <iterator>
#include <memory>
#include <string>
#include <vector>
#define VGS_MIN(a,b) (((a)<(b))?(a):(b))
#define VGS_MAX(a,b) (((a)>(b))?(a):(b))
#define VGS_CLAMP(x,xMin,xMax) (VGS_MIN(VGS_MAX((x),(xMin)),(xMax)))
namespace vgsound_emu
{
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
typedef unsigned long long u64;
typedef signed char s8;
typedef signed short s16;
typedef signed int s32;
typedef signed long long s64;
typedef float f32;
typedef double f64;
static constexpr f64 PI = 3.1415926535897932384626433832795;
// std::clamp is only for C++17 or later; I use my own code
template<typename T>
static inline T clamp(T in, T min, T max)
{
#if defined(_HAS_CXX17) && _HAS_CXX17
// just use std::clamp if C++17 or above
return std::clamp(in, min, max);
#else
// otherwise, use my own implementation of std::clamp
return VGS_CLAMP(in,min,max);
#endif
}
// get bitfield, bitfield(input, position, len)
template<typename T>
static inline T bitfield(T in, u8 pos, u8 len = 1)
{
return (in >> pos) & (len ? (T(1 << len) - 1) : 1);
}
// get sign extended value, sign_ext<type>(input, len)
template<typename T>
static inline T sign_ext(T in, u8 len)
{
len = VGS_MAX(0, (8 * sizeof(T)) - len);
return T(T(in) << len) >> len;
}
// get sign extended value, sign_ext<type>(input, len)
template<typename T>
static inline T sign_ext_nomax(T in, u8 len)
{
len = (8 * sizeof(T)) - len;
return T(T(in) << len) >> len;
}
// convert attenuation decibel value to gain
static inline f32 dB_to_gain(f32 attenuation) { return std::pow(10.0f, attenuation / 20.0f); }
}; // namespace vgsound_emu
#endif