lib/nfs/Manager: gcc 4.7 compatibility hack

std::map::emplace() is only available from gcc 4.8 on.
This commit is contained in:
Max Kellermann 2014-06-17 10:35:34 +02:00
parent c99559dbe9
commit eb8fd07900
3 changed files with 32 additions and 0 deletions

View File

@ -103,6 +103,22 @@ public:
server(_server), export_name(_export_name),
context(nullptr) {}
#if defined(__GNUC__) && !defined(__clang__) && !GCC_CHECK_VERSION(4,8)
/* needed for NfsManager::GetConnection() due to lack of
std::map::emplace() */
NfsConnection(NfsConnection &&other)
:SocketMonitor(((SocketMonitor &)other).GetEventLoop()),
DeferredMonitor(((DeferredMonitor &)other).GetEventLoop()),
server(std::move(other.server)),
export_name(std::move(other.export_name)),
context(nullptr) {
assert(other.context == nullptr);
assert(other.new_leases.empty());
assert(other.active_leases.empty());
assert(other.callbacks.IsEmpty());
}
#endif
~NfsConnection();
gcc_pure

View File

@ -39,10 +39,19 @@ NfsManager::GetConnection(const char *server, const char *export_name)
const std::string key = Key(server, export_name);
#if defined(__GNUC__) && !defined(__clang__) && !GCC_CHECK_VERSION(4,8)
/* std::map::emplace() not available; this hack uses the move
constructor */
auto e = connections.insert(std::make_pair(key,
ManagedConnection(*this, loop,
server,
export_name)));
#else
auto e = connections.emplace(std::piecewise_construct,
std::forward_as_tuple(key),
std::forward_as_tuple(*this, loop,
server,
export_name));
#endif
return e.first->second;
}

View File

@ -41,6 +41,13 @@ class NfsManager {
:NfsConnection(_loop, _server, _export_name),
manager(_manager) {}
#if defined(__GNUC__) && !defined(__clang__) && !GCC_CHECK_VERSION(4,8)
/* needed due to lack of std::map::emplace() */
ManagedConnection(ManagedConnection &&other)
:NfsConnection(std::move(other)),
manager(other.manager) {}
#endif
protected:
/* virtual methods from NfsConnection */
void OnNfsConnectionError(Error &&error) override;