void Log::Assert(bool condition, const std::string& message) { if (!condition) { #ifdef HAS_BFD_DL Backtrace bt; Log::Debug << bt.ToString(); #endif Log::Debug << message << std::endl; throw std::runtime_error("Log::Assert() failed: " + message); } }
typename std::enable_if<!arma::is_arma_type<T>::value>::type PrefixedOutStream::BaseLogic(const T& val) { // We will use this to track whether or not we need to terminate at the end of // this call (only for streams which terminate after a newline). bool newlined = false; std::string line; // If we need to, output the prefix. PrefixIfNeeded(); std::ostringstream convert; // Sync flags and precision with destination stream convert.setf(destination.flags()); convert.precision(destination.precision()); convert << val; if (convert.fail()) { PrefixIfNeeded(); if (!ignoreInput) { destination << "Failed type conversion to string for output; output not " "shown." << std::endl; newlined = true; } } else { line = convert.str(); // If the length of the casted thing was 0, it may have been a stream // manipulator, so send it directly to the stream and don't ask questions. if (line.length() == 0) { // The prefix cannot be necessary at this point. if (!ignoreInput) // Only if the user wants it. destination << val; return; } // Now, we need to check for newlines in the output and print it. size_t nl; size_t pos = 0; while ((nl = line.find('\n', pos)) != std::string::npos) { PrefixIfNeeded(); // Only output if the user wants it. if (!ignoreInput) { destination << line.substr(pos, nl - pos); destination << std::endl; } newlined = true; // Ensure this is set for the fatal exception if needed. carriageReturned = true; // Regardless of whether or not we display it. pos = nl + 1; } if (pos != line.length()) // We need to display the rest. { PrefixIfNeeded(); if (!ignoreInput) destination << line.substr(pos); } } // If we displayed a newline and we need to throw afterwards, do that. if (fatal && newlined) { if (!ignoreInput) destination << std::endl; // Print a backtrace, if we can. #ifdef HAS_BFD_DL if (fatal && !ignoreInput && backtrace) { size_t nl; size_t pos = 0; Backtrace bt; std::string btLine = bt.ToString(); while ((nl = btLine.find('\n', pos)) != std::string::npos) { PrefixIfNeeded(); if (!ignoreInput) { destination << btLine.substr(pos, nl - pos); destination << std::endl; } carriageReturned = true; // Regardless of whether or not we display it. pos = nl + 1; } } #endif throw std::runtime_error("fatal error; see Log::Fatal output"); } }
void PrefixedOutStream::BaseLogic(const T& val) { // We will use this to track whether or not we need to terminate at the end of // this call (only for streams which terminate after a newline). bool newlined = false; std::string line; // If we need to, output the prefix. PrefixIfNeeded(); std::ostringstream convert; convert << val; if (convert.fail()) { PrefixIfNeeded(); if (!ignoreInput) { destination << "Failed lexical_cast<std::string>(T) for output; output" " not shown." << std::endl; newlined = true; } } else { line = convert.str(); // If the length of the casted thing was 0, it may have been a stream // manipulator, so send it directly to the stream and don't ask questions. if (line.length() == 0) { // The prefix cannot be necessary at this point. if (!ignoreInput) // Only if the user wants it. destination << val; return; } // Now, we need to check for newlines in retrieved backtrace. //If we find one, output up until the newline, then output the newline //and the prefix and continue looking. size_t nl; size_t pos = 0; #ifdef HAS_BFD_DL if(fatal) { Backtrace bt; std::string btLine = bt.ToString(); while ((nl = btLine.find('\n', pos)) != std::string::npos) { PrefixIfNeeded(); destination << btLine.substr(pos, nl - pos); destination << std::endl; newlined = true; carriageReturned = true; // Regardless of whether or not we display it. pos = nl + 1; } pos = 0; } #endif //The same logic like above, but this time for 'line'. while ((nl = line.find('\n', pos)) != std::string::npos) { PrefixIfNeeded(); // Only output if the user wants it. if (!ignoreInput) { destination << line.substr(pos, nl - pos); destination << std::endl; newlined = true; } carriageReturned = true; // Regardless of whether or not we display it. pos = nl + 1; } if (pos != line.length()) // We need to display the rest. { PrefixIfNeeded(); if (!ignoreInput) destination << line.substr(pos); } } // If we displayed a newline and we need to throw afterwards, do that. if (fatal && newlined) { std::cout << std::endl; throw std::runtime_error("fatal error; see Log::Fatal output"); } }