#pragma once #include #include #include #include #include #include #include #include #include #include #include "tools/cabana/core/color.h" class SegmentTree { public: SegmentTree() = default; void build(int n, const std::function &y); inline std::pair minmax(int left, int right) const { return get_minmax(1, 0, size - 1, left, right); } private: std::pair get_minmax(int n, int left, int right, int range_left, int range_right) const; void build_tree(const std::function &y, int n, int left, int right); std::vector> tree; int size = 0; }; class LogScale { public: LogScale(double factor) : factor(factor) {} void setRange(double min, double max) { log_min = factor * std::log10(min); log_max = factor * std::log10(max); } int value(int pos, int pos_min, int pos_max) const { double v = log_min + (log_max - log_min) * ((pos - pos_min) / double(pos_max - pos_min)); return std::lround(std::pow(10, v / factor)); } int position(int v, int pos_min, int pos_max) const { double log_v = std::clamp(factor * std::log10(v), log_min, log_max); return pos_min + (pos_max - pos_min) * ((log_v - log_min) / (log_max - log_min)); } private: double factor, log_min = 0, log_max = 1; }; enum class ValidState { Invalid, Intermediate, Acceptable }; ValidState validateName(std::string &input); ValidState validateNodes(const std::string &input); ValidState validateNonWhitespace(const std::string &input); ValidState validateIpAddress(const std::string &input); ValidState validateDouble(const std::string &input); struct DarkTheme { static constexpr CabanaColor window{0x35, 0x35, 0x35}; static constexpr CabanaColor window_text{0xbb, 0xbb, 0xbb}; static constexpr CabanaColor base{0x3c, 0x3f, 0x41}; static constexpr CabanaColor tooltip_text{0xbb, 0xbb, 0xbb}; static constexpr CabanaColor text{0xbb, 0xbb, 0xbb}; static constexpr CabanaColor button{0x3c, 0x3f, 0x41}; static constexpr CabanaColor highlight{0x2f, 0x65, 0xca}; static constexpr CabanaColor bright_text{0xf0, 0xf0, 0xf0}; static constexpr CabanaColor disabled_text{0x77, 0x77, 0x77}; static constexpr CabanaColor light{0x77, 0x77, 0x77}; static constexpr CabanaColor dark{0x35, 0x35, 0x35}; }; namespace utils { bool isMainThread(); void runOnMainThread(std::function fn); void drainMainThreadQueue(); std::string homePath(); std::filesystem::path configPath(); bool getClipboardText(std::string *text); bool setClipboardText(const std::string &text); std::string bootstrapSvg(const std::string &id); template std::vector toBytes(const T &dat) { return {dat.begin(), dat.end()}; } template auto guarded(const std::shared_ptr &alive, F fn) { return [alive = std::weak_ptr(alive), fn = std::move(fn)](auto &&...args) { if (!alive.expired()) fn(std::forward(args)...); }; } } class UnixSignalHandler { public: UnixSignalHandler(std::function on_signal); ~UnixSignalHandler(); static void signalHandler(int s); private: inline static int sig_fd[2] = {}; std::atomic shutting_down{false}; std::thread waiter; }; int num_decimals(double num); std::filesystem::path executableDir();