FlatHashMap: fix CE

This commit is contained in:
Arseny Smirnov 2022-02-11 18:11:17 +01:00
parent ecceb51881
commit a11d37dd4c
2 changed files with 16 additions and 16 deletions

View File

@ -389,6 +389,7 @@ install(TARGETS tdutils EXPORT TdTargets
find_package(benchmark QUIET) find_package(benchmark QUIET)
find_package(folly QUIET) find_package(folly QUIET)
find_package(gflags QUIET)
if (ABSL_FOUND AND benchmark_FOUND AND folly_FOUND) if (ABSL_FOUND AND benchmark_FOUND AND folly_FOUND)
add_executable(benchmark-hashset test/hashset_benchmark.cpp) add_executable(benchmark-hashset test/hashset_benchmark.cpp)

View File

@ -104,7 +104,7 @@ struct MapNode {
} }
MapNode(KeyT key, ValueT value) : first(std::move(key)) { MapNode(KeyT key, ValueT value) : first(std::move(key)) {
new (&second) ValueT(std::move(value)); new (&second) ValueT(std::move(value));
DCHECK(!empty()); DCHECK(!empty());
} }
~MapNode() { ~MapNode() {
if (!empty()) { if (!empty()) {
@ -115,8 +115,8 @@ struct MapNode {
*this = std::move(other); *this = std::move(other);
} }
MapNode &operator=(MapNode &&other) noexcept { MapNode &operator=(MapNode &&other) noexcept {
DCHECK(empty()); DCHECK(empty());
DCHECK(!other.empty()); DCHECK(!other.empty());
first = std::move(other.first); first = std::move(other.first);
other.first = KeyT{}; other.first = KeyT{};
new (&second) ValueT(std::move(other.second)); new (&second) ValueT(std::move(other.second));
@ -129,18 +129,18 @@ struct MapNode {
} }
void clear() { void clear() {
DCHECK(!empty()); DCHECK(!empty());
first = KeyT(); first = KeyT();
second.~ValueT(); second.~ValueT();
DCHECK(empty()); DCHECK(empty());
} }
template <class... ArgsT> template <class... ArgsT>
void emplace(KeyT key, ArgsT &&...args) { void emplace(KeyT key, ArgsT &&...args) {
DCHECK(empty()); DCHECK(empty());
first = std::move(key); first = std::move(key);
new (&second) ValueT(std::forward<ArgsT>(args)...); new (&second) ValueT(std::forward<ArgsT>(args)...);
DCHECK(!empty()); DCHECK(!empty());
} }
}; };
@ -168,8 +168,8 @@ struct SetNode {
*this = std::move(other); *this = std::move(other);
} }
SetNode &operator=(SetNode &&other) noexcept { SetNode &operator=(SetNode &&other) noexcept {
DCHECK(empty()); DCHECK(empty());
DCHECK(!other.empty()); DCHECK(!other.empty());
first = std::move(other.first); first = std::move(other.first);
other.first = KeyT{}; other.first = KeyT{};
return *this; return *this;
@ -198,8 +198,9 @@ class FlatHashTable {
using ConstNodeIterator = typename fixed_vector<Node>::const_iterator; using ConstNodeIterator = typename fixed_vector<Node>::const_iterator;
using KeyT = typename Node::key_type; using KeyT = typename Node::key_type;
using key_type = typename Node::key_type;
using public_type = typename Node::public_type; using public_type = typename Node::public_type;
using value_type = typename Node::value_type; using value_type = typename Node::public_type;
struct Iterator { struct Iterator {
using iterator_category = std::bidirectional_iterator_tag; using iterator_category = std::bidirectional_iterator_tag;
@ -228,11 +229,11 @@ class FlatHashTable {
return &*it_; return &*it_;
} }
bool operator==(const Iterator &other) const { bool operator==(const Iterator &other) const {
DCHECK(map_ == other.map_); DCHECK(map_ == other.map_);
return it_ == other.it_; return it_ == other.it_;
} }
bool operator!=(const Iterator &other) const { bool operator!=(const Iterator &other) const {
DCHECK(map_ == other.map_); DCHECK(map_ == other.map_);
return it_ != other.it_; return it_ != other.it_;
} }
@ -417,13 +418,13 @@ class FlatHashTable {
} }
template <class ItT> template <class ItT>
void insert(ItT begin, ItT end) { void insert(ItT begin, ItT end) {
for (; begin != end; ++begin) { for (; begin != end; ++begin) {
emplace(*begin); emplace(*begin);
} }
} }
value_type &operator[](const KeyT &key) { typename Node::value_type &operator[](const KeyT &key) {
return emplace(key).first->value(); return emplace(key).first->value();
} }
@ -477,7 +478,6 @@ class FlatHashTable {
} }
private: private:
fixed_vector<Node> nodes_; fixed_vector<Node> nodes_;
size_t used_nodes_{}; size_t used_nodes_{};
@ -591,5 +591,4 @@ template <class KeyT, class HashT = std::hash<KeyT>, class EqT = std::equal_to<K
using FlatHashSet = FlatHashSetImpl<KeyT, HashT, EqT>; using FlatHashSet = FlatHashSetImpl<KeyT, HashT, EqT>;
//using FlatHashSet = std::unordered_set<KeyT, HashT, EqT>; //using FlatHashSet = std::unordered_set<KeyT, HashT, EqT>;
} // namespace td } // namespace td