Abandon using C++ std::unordered_map :(

Apple Clang++ doesn't seem cope with the necessary hash template class
specializations. So have degraded to Qt QHash.

git-svn-id: svn+ssh://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx@5227 ab8295b8-cf94-4d9e-aec4-7959e3be5d79
This commit is contained in:
Bill Somerville 2015-04-15 19:24:41 +00:00
parent 3f75b4144a
commit 84cd4b7036
3 changed files with 15 additions and 40 deletions

View File

@ -33,7 +33,6 @@
#include <iostream> #include <iostream>
#include <exception> #include <exception>
#include <unordered_map>
#include <QtWidgets> #include <QtWidgets>
#include <QStandardItemModel> #include <QStandardItemModel>
@ -42,6 +41,7 @@
#include <QFont> #include <QFont>
#include <QDateTime> #include <QDateTime>
#include <QTime> #include <QTime>
#include <QHash>
#include "MessageServer.hpp" #include "MessageServer.hpp"
#include "NetworkMessage.hpp" #include "NetworkMessage.hpp"
@ -416,9 +416,9 @@ private:
auto iter = dock_widgets_.find (id); auto iter = dock_widgets_.find (id);
if (iter != std::end (dock_widgets_)) if (iter != std::end (dock_widgets_))
{ {
(*iter).second->close (); (*iter)->close ();
dock_widgets_.erase (iter);
} }
dock_widgets_.erase (iter);
} }
QStandardItemModel * log_; QStandardItemModel * log_;
@ -429,8 +429,7 @@ private:
QTableView * log_table_view_; QTableView * log_table_view_;
// maps client id to widgets // maps client id to widgets
using client_map = std::unordered_map<QString, ClientWidget *>; QHash<QString, ClientWidget *> dock_widgets_;
client_map dock_widgets_;
}; };
#include "MessageAggregator.moc" #include "MessageAggregator.moc"

View File

@ -1,9 +1,8 @@
#include "MessageServer.hpp" #include "MessageServer.hpp"
#include <unordered_map>
#include <QUdpSocket> #include <QUdpSocket>
#include <QTimer> #include <QTimer>
#include <QHash>
#include "NetworkMessage.hpp" #include "NetworkMessage.hpp"
#include "qt_helpers.hpp" #include "qt_helpers.hpp"
@ -50,8 +49,7 @@ public:
port_type sender_port_; port_type sender_port_;
QDateTime last_activity_; QDateTime last_activity_;
}; };
using client_hash = std::unordered_map<QString, Client>; // maps id to Client QHash<QString, Client> clients_; // maps id to Client
client_hash clients_;
QTimer * clock_; QTimer * clock_;
}; };
@ -109,7 +107,7 @@ void MessageServer::impl::parse_message (QHostAddress const& sender, port_type s
auto id = in.id (); auto id = in.id ();
bool new_client {false}; bool new_client {false};
if (std::end (clients_) == clients_.find (id)) if (!clients_.contains (id))
{ {
new_client = true; new_client = true;
} }
@ -196,7 +194,7 @@ void MessageServer::impl::parse_message (QHostAddress const& sender, port_type s
if (check_status (in)) if (check_status (in))
{ {
Q_EMIT self_->client_closed (id); Q_EMIT self_->client_closed (id);
clients_.erase (id); clients_.remove (id);
} }
break; break;
@ -209,17 +207,13 @@ void MessageServer::impl::parse_message (QHostAddress const& sender, port_type s
void MessageServer::impl::tick () void MessageServer::impl::tick ()
{ {
auto now = QDateTime::currentDateTime (); auto now = QDateTime::currentDateTime ();
for (auto iter = std::begin (clients_); iter != std::end (clients_);) for (auto iter = std::begin (clients_); iter != std::end (clients_); ++iter)
{ {
if (now > (*iter).second.last_activity_.addSecs (NetworkMessage::pulse)) if (now > (*iter).last_activity_.addSecs (NetworkMessage::pulse))
{ {
Q_EMIT self_->clear_decodes ((*iter).first); Q_EMIT self_->clear_decodes (iter.key ());
Q_EMIT self_->client_closed ((*iter).first); Q_EMIT self_->client_closed (iter.key ());
iter = clients_.erase (iter); clients_.erase (iter); // safe while iterating as doesn't rehash
}
else
{
++iter;
} }
} }
} }
@ -288,7 +282,7 @@ void MessageServer::reply (QString const& id, QTime time, qint32 snr, float delt
out << time << snr << delta_time << delta_frequency << mode.toUtf8 () << message_text.toUtf8 (); out << time << snr << delta_time << delta_frequency << mode.toUtf8 () << message_text.toUtf8 ();
if (m_->check_status (out)) if (m_->check_status (out))
{ {
m_->writeDatagram (message, (*iter).second.sender_address_, (*iter).second.sender_port_); m_->writeDatagram (message, iter.value ().sender_address_, (*iter).sender_port_);
} }
} }
} }
@ -302,7 +296,7 @@ void MessageServer::replay (QString const& id)
NetworkMessage::Builder out {&message, NetworkMessage::Replay, id}; NetworkMessage::Builder out {&message, NetworkMessage::Replay, id};
if (m_->check_status (out)) if (m_->check_status (out))
{ {
m_->writeDatagram (message, (*iter).second.sender_address_, (*iter).second.sender_port_); m_->writeDatagram (message, iter.value ().sender_address_, (*iter).sender_port_);
} }
} }
} }

View File

@ -64,24 +64,6 @@
return QString {mo.enumerator (mo.indexOfEnumerator (#ENUM)).valueToKey (m)}; \ return QString {mo.enumerator (mo.indexOfEnumerator (#ENUM)).valueToKey (m)}; \
} }
namespace std
{
/*
* std::hash specialization for QString so it can be used
* as a key in std::unordered_map
*/
template<class Key> struct hash;
template<> struct hash<QString>
{
typedef QString Key;
typedef uint result_type;
inline uint operator () (const QString &s) const
{
return qHash (s);
}
};
}
inline inline
void throw_qstring (QString const& qs) void throw_qstring (QString const& qs)
{ {