Fix build with Clang on Windows

This commit is contained in:
Mat Sutcliffe
2020-08-26 21:31:52 +01:00
parent b80114213d
commit bb8aeaa3d0
10 changed files with 56 additions and 21 deletions

View File

@@ -218,6 +218,10 @@ win32:llvm {
equals(WORD_SIZE,32): QMAKE_CXXFLAGS += --target=i686-pc-windows-gnu equals(WORD_SIZE,32): QMAKE_CXXFLAGS += --target=i686-pc-windows-gnu
equals(WORD_SIZE,64): QMAKE_CXXFLAGS += --target=x86_64-pc-windows-gnu equals(WORD_SIZE,64): QMAKE_CXXFLAGS += --target=x86_64-pc-windows-gnu
} }
else {
CONFIG += c++latest
QMAKE_CXXFLAGS_WARN_ON += -Wno-deprecated-declarations
}
# Address Sanitizer # Address Sanitizer
# https://stackoverflow.com/a/48585886/1639256 # https://stackoverflow.com/a/48585886/1639256

View File

@@ -71,6 +71,16 @@ namespace BlackMisc
return ok; return ok;
} }
CAtomicFile::~CAtomicFile()
{
#if __cplusplus >= 201700L
const bool ex = std::uncaught_exceptions() > 0;
#else
const bool ex = std::uncaught_exception();
#endif
if (ex) { QFile::close(); }
}
void CAtomicFile::close() void CAtomicFile::close()
{ {
if (! isOpen()) { return; } if (! isOpen()) { return; }

View File

@@ -38,7 +38,7 @@ namespace BlackMisc
CAtomicFile(const QString &filename) : QFile(filename) {} CAtomicFile(const QString &filename) : QFile(filename) {}
//! \copydoc QFile::~QFile //! \copydoc QFile::~QFile
virtual ~CAtomicFile() override { if (std::uncaught_exception()) { QFile::close(); } } virtual ~CAtomicFile() override;
//! \copydoc QFile::open //! \copydoc QFile::open
//! Just before opening the file, the filename is changed so we actually write to a temporary file. //! Just before opening the file, the filename is changed so we actually write to a temporary file.

View File

@@ -358,7 +358,7 @@ namespace BlackMisc
QFileInfoList result = dir.entryInfoList(nameFilters, QDir::Files); QFileInfoList result = dir.entryInfoList(nameFilters, QDir::Files);
if (predicate) if (predicate)
{ {
result.erase(std::remove_if(result.begin(), result.end(), std::not1(predicate)), result.end()); result.erase(std::remove_if(result.begin(), result.end(), [ = ](const auto &f) { return !predicate(f); }), result.end());
} }
if (recursive) if (recursive)
{ {

View File

@@ -8,7 +8,7 @@
#include "blackmisc/processctrl.h" #include "blackmisc/processctrl.h"
#include "blackmisc/logmessage.h" #include "blackmisc/logmessage.h"
#include <QStringBuilder>
#include <array> #include <array>
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
@@ -36,7 +36,7 @@ namespace BlackMisc
QString command = '"' % QString(program).replace('/', '\\') % '"'; QString command = '"' % QString(program).replace('/', '\\') % '"';
if (!arguments.isEmpty()) if (!arguments.isEmpty())
{ {
command += " \"" % arguments.join('" "').replace('/', '\\') % '"'; command += " \"" % arguments.join("\" \"").replace('/', '\\') % '"';
} }
DWORD flags = 0; DWORD flags = 0;

View File

@@ -571,7 +571,12 @@ namespace BlackMisc
{ {
if (m_page) if (m_page)
{ {
if (std::uncaught_exception()) { m_page->abandonBatch(); } #if __cplusplus >= 201700L
const bool ex = std::uncaught_exceptions() > 0;
#else
const bool ex = std::uncaught_exception();
#endif
if (ex) { m_page->abandonBatch(); }
else { m_page->endBatch(); } else { m_page->endBatch(); }
} }
} }

View File

@@ -78,7 +78,8 @@ namespace XSwiftBus
{ {
const int y = boxTop - (lineHeight + lineSpace) * (i + 1); const int y = boxTop - (lineHeight + lineSpace) * (i + 1);
const size_t ii = static_cast<size_t>(i); const size_t ii = static_cast<size_t>(i);
XPLMDrawString(m_messages[ii].m_rgb.data(), x + arrowWidth + arrowWidth / 2, y, const_cast<char *>(m_messages[ii].m_text.c_str()), nullptr, xplmFont_Basic); XPLMDrawString(m_messages[ii].m_rgb.data(), x + arrowWidth + arrowWidth / 2, y,
const_cast<char *>(reinterpret_cast<const char *>(m_messages[ii].m_text.c_str())), nullptr, xplmFont_Basic);
} }
} }
@@ -114,8 +115,7 @@ namespace XSwiftBus
m_scrollUpCommand("org/swift-project/xswiftbus/scroll_up", "Scroll up XSwiftBus text messages", [this] { scrollUp(); }), m_scrollUpCommand("org/swift-project/xswiftbus/scroll_up", "Scroll up XSwiftBus text messages", [this] { scrollUp(); }),
m_scrollDownCommand("org/swift-project/xswiftbus/scroll_down", "Scroll down XSwiftBus text messages", [this] { scrollDown(); }), m_scrollDownCommand("org/swift-project/xswiftbus/scroll_down", "Scroll down XSwiftBus text messages", [this] { scrollDown(); }),
m_scrollToTopCommand("org/swift-project/xswiftbus/scroll_top", "Scroll to top of XSwiftBus text messages", [this] { scrollToTop(); }), m_scrollToTopCommand("org/swift-project/xswiftbus/scroll_top", "Scroll to top of XSwiftBus text messages", [this] { scrollToTop(); }),
m_scrollToBottomCommand("org/swift-project/xswiftbus/scroll_bottom", "Scroll to bottom of XSwiftBus text messages", [this] { scrollToBottom(); }), m_scrollToBottomCommand("org/swift-project/xswiftbus/scroll_bottom", "Scroll to bottom of XSwiftBus text messages", [this] { scrollToBottom(); })
m_debugCommand("org/swift-project/xswiftbus/debug", "", [this] { static int c = 0; this->addMessage({ "hello " + std::to_string(c++), 0, .75, 0 }); })
{ {
show(); show();
} }

View File

@@ -22,16 +22,30 @@
namespace XSwiftBus namespace XSwiftBus
{ {
//! \cond
namespace Private
{
inline auto empty_u8string()
{
using namespace std::literals;
return u8""s;
}
}
//! \endcond
/*! /*!
* Class representing a single line of text to be drawn in a message box. * Class representing a single line of text to be drawn in a message box.
*/ */
struct CMessage struct CMessage
{ {
//! String type.
using string = decltype(Private::empty_u8string());
//! Constructor. //! Constructor.
CMessage(const std::string &text, float r = 1, float g = 1, float b = 1) : m_text(text), m_rgb{{ r, g, b }} {} CMessage(const string &text, float r = 1, float g = 1, float b = 1) : m_text(text), m_rgb{{ r, g, b }} {}
//! Text. //! Text.
std::string m_text; string m_text;
//! Color. //! Color.
std::array<float, 3> m_rgb; std::array<float, 3> m_rgb;
@@ -148,7 +162,6 @@ namespace XSwiftBus
CCommand m_scrollDownCommand; CCommand m_scrollDownCommand;
CCommand m_scrollToTopCommand; CCommand m_scrollToTopCommand;
CCommand m_scrollToBottomCommand; CCommand m_scrollToBottomCommand;
CCommand m_debugCommand;
}; };
} //ns } //ns

View File

@@ -145,12 +145,13 @@ namespace XSwiftBus
void CService::addTextMessage(const std::string &text, double red, double green, double blue) void CService::addTextMessage(const std::string &text, double red, double green, double blue)
{ {
if (text.empty()) { return; } if (text.empty()) { return; }
static const std::string ellipsis = u8"\u2026"; static const CMessage::string ellipsis = u8"\u2026";
const int lineLength = m_messages.maxLineLength() - static_cast<int>(ellipsis.size()); const int lineLength = m_messages.maxLineLength() - static_cast<int>(ellipsis.size());
std::vector<std::string> wrappedLines; std::vector<CMessage::string> wrappedLines;
for (size_t i = 0; i < text.size(); i += static_cast<size_t>(lineLength)) for (size_t i = 0; i < text.size(); i += static_cast<size_t>(lineLength))
{ {
wrappedLines.push_back(text.substr(i, static_cast<size_t>(lineLength)) + ellipsis); wrappedLines.emplace_back(text.begin() + i, text.begin() + i + static_cast<size_t>(lineLength));
wrappedLines.back() += ellipsis;
} }
wrappedLines.back().erase(wrappedLines.back().size() - ellipsis.size()); wrappedLines.back().erase(wrappedLines.back().size() - ellipsis.size());
if (wrappedLines.back().empty()) { wrappedLines.pop_back(); } if (wrappedLines.back().empty()) { wrappedLines.pop_back(); }

View File

@@ -161,8 +161,10 @@ namespace BlackMiscTest
void CTestStringUtils::testSimplify() void CTestStringUtils::testSimplify()
{ {
const QString input = QString::fromUtf8(u8"ŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïñòóôõöùúûüýÿ"); const auto inputChars = u8"ŠŽšžŸÀÁÂÃÄÅÇÈÉÊËÌÍÎÏÑÒÓÔÕÖÙÚÛÜÝàáâãäåçèéêëìíîïñòóôõöùúûüýÿ";
const QString output = QLatin1String("SZszYAAAAAACEEEEIIIINOOOOOUUUUYaaaaaaceeeeiiiinooooouuuuyy"); const auto outputChars = "SZszYAAAAAACEEEEIIIINOOOOOUUUUYaaaaaaceeeeiiiinooooouuuuyy";
const QString input = QString::fromUtf8(reinterpret_cast<const char *>(inputChars));
const QString output = QLatin1String(outputChars);
QCOMPARE(simplifyAccents(input), output); QCOMPARE(simplifyAccents(input), output);
QCOMPARE(simplifyByDecomposition(input), output); QCOMPARE(simplifyByDecomposition(input), output);
} }