move semantics/perfect forwarding for hashtable keys

master
Daniel Kolesa 2015-06-14 03:04:03 +01:00
parent 48b8ba7522
commit c5678238c3
2 changed files with 10 additions and 4 deletions

View File

@ -90,9 +90,9 @@ namespace detail {
}
template<typename U>
T &insert(octa::Size h, const U &key) {
T &insert(octa::Size h, U &&key) {
Chain *c = insert(h);
B::set_key(c->value, key);
B::set_key(c->value, octa::forward<U>(key));
return B::get_data(c->value);
}

View File

@ -26,9 +26,9 @@ namespace detail {
return e.second;
}
template<typename U>
static inline void set_key(Element &e, const U &key) {
static inline void set_key(Element &e, U &&key) {
e.first.~K();
new ((K *)&e.first) K(key);
new ((K *)&e.first) K(octa::forward<U>(key));
}
};
}
@ -85,6 +85,12 @@ public:
if (v) return *v;
return p_table.insert(h, key);
}
T &operator[](K &&key) {
octa::Size h;
T *v = p_table.access_base(key, h);
if (v) return *v;
return p_table.insert(h, octa::move(key));
}
void swap(Map &v) {
octa::swap(p_table, v.p_table);