| #ifndef UTIL_HXX |
| #define UTIL_HXX |
| |
| #include <string> |
| #include <sys/stat.h> |
| #include <unistd.h> |
| #include <stdexcept> |
| #include <memory> |
| |
| template <typename... Args> |
| std::string string_format(const std::string& format, Args... args) |
| { |
| int size = snprintf(nullptr, 0, format.c_str(), args...) + |
| 1; // Extra space for '\0' |
| if (size <= 0) |
| { |
| throw std::runtime_error("Error during formatting."); |
| } |
| std::unique_ptr<char[]> buf(new char[size]); |
| snprintf(buf.get(), size, format.c_str(), args...); |
| return std::string(buf.get(), |
| buf.get() + size - 1); // We don't want the '\0' inside |
| } |
| |
| // QUESTION: inline looks fun. so this copy pastes the code around i guess, but |
| // its considered faster than referencing code? |
| inline bool file_exists(const std::string& name) |
| { |
| // https://stackoverflow.com/questions/12774207/fastest-way-to-check-if-a-file-exist-using-standard-c-c11-c |
| struct stat buffer; |
| return (stat(name.c_str(), &buffer) == 0); |
| } |
| |
| inline int valueOrDefault(int value, int default_value) |
| { |
| return value <= 0 ? default_value : value; |
| } |
| |
| inline void scale(int* value, int targetValue, int* otherValue) |
| { |
| if (*value != targetValue) |
| { |
| *otherValue = *otherValue * targetValue / *value; |
| *value = targetValue; |
| } |
| } |
| |
| #endif |