#ifndef POKEMONSCRIPTTESTER_ASSERTIONFAILED_HPP #define POKEMONSCRIPTTESTER_ASSERTIONFAILED_HPP #include #include class AssertionFailed : public std::exception { static inline std::string& ltrim(std::string& s, const char* t = " \t\n\r\f\v") { s.erase(0, s.find_first_not_of(t)); return s; } static std::string GetLine(const std::string& path, size_t num) { std::ifstream file; file.open(path); file.seekg(std::ios::beg); for (size_t i = 0; i < num - 1; ++i) { file.ignore(std::numeric_limits::max(), '\n'); } std::string line; std::getline(file, line); file.close(); line = ltrim(line); return line; } char* _msg; public: AssertionFailed(const std::string& path, size_t line, const std::string& message = "") { auto l = GetLine(path, line); std::stringstream ss; ss << "Assertion failed at: " << path << ":" << line << std::endl; ss << l; if (message.length() > 0) { ss << std::endl << message; } auto str = ss.str(); _msg = new char[str.length() + 1]; str.copy(_msg, str.length(), 0); _msg[str.length()] = 0; } ~AssertionFailed() { delete[] _msg; } const char* what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_NOTHROW override { return _msg; } }; #endif // POKEMONSCRIPTTESTER_ASSERTIONFAILED_HPP