/** @file utils.hpp * * @author Cory Alexander Balaton (coryab) * @author Janita Ovidie Sandtrøen Willumsen (janitaws) * * @version 1.0 * * @brief Function prototypes and macros that are useful. * * These utility function are mainly for convenience and aren't directly * related to the project. * * @bug No known bugs * */ #ifndef __UTILS__ #define __UTILS__ #include #include #include #include #include /** @def DEBUG(msg) * @brief Writes a debug message * * This macro writes a debug message that includes the filename, * line number, and a custom message. The function is wrapped in an ifdef * that checks if DBG is defined, so one can choose to display the debug * messages by adding the -DDBG flag when compiling. * */ #ifdef DBG #define DEBUG(msg) std::cout << __FILE__ << " " << __LINE__ << ": " \ << msg << std::endl #else #define DEBUG(msg) #endif /** @def ASSERT(expr) * @brief A prettier assertion function. * * This macro calls the m_assert function which is a more informative * assertion function than the regular assert function from cassert. * */ #define ASSERT(expr, msg) m_assert(expr, #expr, __METHOD_NAME__, __FILE__, \ __LINE__, msg) /** @def __METHOD_NAME__ * @brief Get the name of the current method/function. * */ #define __METHOD_NAME__ methodName(__PRETTY_FUNCTION__) /** @brief Turns a double into a string written in scientific format. * * @details The code is stolen from https://github.com/anderkve/FYS3150. * * @param d The number to stringify * @param width The reserved width of the string * @param prec The precision of the stringified number * * @return std::string * */ std::string scientific_format(double d, int width=20, int prec=10); /** @brief Turns a vector of doubles into a string written in scientific format. * * @details The code is stolen from https://github.com/anderkve/FYS3150. * * @param v The vector to stringify * @param width The reserved width of the string * @param prec The precision of the stringified number * * @return std::string * */ std::string scientific_format(const std::vector& v, int width=20, int prec=10); /** @brief Test an expression, confirm that test is ok, or abort execution. * * @details This function takes in an expression and prints an OK message if * it's true, or it prints a fail message and aborts execution if it fails. * * @param expr The expression to be evaluated * @param expr_str The stringified version of the expression * @param func The function name of the caller * @param file The file of the caller * @param line The line number where this function is called from * @param msg The message to be displayed * */ void m_assert(bool expr, std::string expr_str, std::string func, std::string file, int line, std::string msg); /** @brief Test if two armadillo vectors are close to each other. * * @details This function takes in 2 vectors and checks if they are * approximately equal to each other given a tolerance. * * @param a Vector a * @param b Vector b * @param tol The tolerance * * @return bool * */ bool arma_vector_close_to(arma::vec &a, arma::vec &b, double tol=1e-8); /** @brief Takes in the __PRETTY_FUNCTION__ string and removes the return type. * * @details This function should only be used for the __METHOD_NAME__ macro, * since it takes the output from __PRETTY_FUNCTION__ and strips the return * type. * * @param pretty_function The string from __PRETTY_FUNCTION__ * * @return std::string * */ static inline std::string methodName(const std::string& pretty_function) { size_t colons = pretty_function.find("::"); size_t begin = pretty_function.substr(0,colons).rfind(" ") + 1; size_t end = pretty_function.rfind("(") - begin; return pretty_function.substr(begin,end) + "()"; } /** @brief Make path given. * * @details This tries to be the equivalent to "mkdir -p" and creates a new * directory whenever it needs to. * * @param path The path to be created * @param mode The mode/permissions for all the new directories * * @return bool * */ bool mkpath(std::string path, int mode = 0777); #endif