Files
scylladb/utils/sequenced_set.hh
Vlad Zolotarov 6017d7f6bc sequenced_set: add a non-const version of get_vector()
This is meant to allow std::moving the returned object when needed.
Otherwise std::move(s.get_vector()) will be degraded to copying.

Signed-off-by: Vlad Zolotarov <vladz@cloudius-systems.com>
2015-07-17 10:24:57 +02:00

57 lines
1017 B
C++

/*
* Copyright (C) 2014 Cloudius Systems, Ltd.
*/
namespace utils {
/**
* This class implements an add-only vector that ensures that the elements are
* unique.
*
* This class provides a similar functionality to the Java's LinkedHashSet
* class.
*/
template<typename T>
struct sequenced_set {
typedef typename std::vector<T>::iterator iterator;
void push_back(const T& val) {
if (_set.find(val) != _set.end()) {
return;
}
_set.insert(val);
_vec.push_back(val);
}
size_t size() {
return _vec.size();
}
iterator begin() {
return _vec.begin();
}
iterator end() {
return _vec.end();
}
const std::vector<T>& get_vector() const {
return _vec;
}
std::vector<T>& get_vector() {
return _vec;
}
void reserve(size_t sz) {
_set.reserve(sz);
_vec.reserve(sz);
}
private:
std::unordered_set<T> _set;
std::vector<T> _vec;
};
} // namespace utils