#ifndef UTIL_H
#define UTIL_H
/*
File:        util.h
Description: This is a C++ header file containing utility functions
Rev:         0.1
Created:     01.04.26
Author:      Uwe Jakobeit
Copyright:   Binder GmbH TUT
Purpose:     Supply utility functions for math. evaluation, validation, conversion
Notes:       [Any relevant details, such as dependencies, usage examples, or known issues.]
*/

#include <algorithm>
#include <cmath>
#include <cstdint>


#define MAX std::max
#define MIN std::min

namespace UTILITY_FUNCTIONS {

// determine if x is in range of ]lo;hi[
// if so - x will be returned
// if not - lo will be returned if x is smaller than lo
//        - hi will be returned if x is greater than hi
inline double limit(double x, double lo, double hi) {
    return (x < lo) ? lo : (x > hi) ? hi : x;
}

inline double max3(double a, double b, double c) {
    return std::max(a, std::max(b, c));
}
inline double min3(double a, double b, double c) {
    return std::min(a, std::min(b, c));
}


inline bool is_valid(double x) { return std::isfinite(x); }

// ST: REAL_TO_INT(x) i.d.R. trunc Richtung 0. Bei Siemens oft ROUND? Du nutzt
// häufig +0.5.
inline int real_to_int(double x) { return static_cast<int>(x); }

// Platzhalter für GET_VALUE_* (kommt vermutlich aus Parameter-/Recipe-System)
inline std::int32_t GET_VALUE_DINT(int /*a*/, int /*b*/, int /*c*/, int /*d*/) {
    // TODO: an dein Parameter-System anbinden
    return 0;
}
inline double GET_VALUE_REAL(int /*a*/, int /*b*/, int /*c*/, int /*d*/) {
    // TODO: an dein Parameter-System anbinden
    return 0.0;
}

class Util{
public:

};

} // namespace UTILITY_FUNCTIONS



#endif // UTIL_H