Program Listing for File compact_set.h
↰ Return to documentation for file (include/converter/include/core/utils/compact_set.h
)
#ifndef MINDSPORE_CORE_UTILS_COMPACT_SET_H_
#define MINDSPORE_CORE_UTILS_COMPACT_SET_H_
#include <vector>
#include <utility>
#include <algorithm>
namespace mindspore {
// CompactSet uses a std::vector to hold data, it keeps insertion order
// but use less memory than OrderedSet. It could be more efficient than
// OrderedSet when used with a small number of elements.
template <typename T>
class CompactSet {
public:
using data_type = std::vector<T>;
using iterator = typename data_type::iterator;
using const_iterator = typename data_type::const_iterator;
void add(T &&e) {
auto iter = std::find(data_.begin(), data_.end(), e);
if (iter == data_.end()) {
data_.emplace_back(std::move(e));
}
}
void insert(const T &e) {
auto iter = std::find(data_.begin(), data_.end(), e);
if (iter == data_.end()) {
data_.push_back(e);
}
}
template <class InputIt>
void insert(InputIt first, InputIt last) {
for (; first != last; ++first) {
insert(*first);
}
}
iterator find(const T &e) { return std::find(data_.begin(), data_.end(), e); }
const_iterator find(const T &e) const { return std::find(data_.begin(), data_.end(), e); }
bool contains(const T &e) const { return (find(e) != data_.end()); }
bool erase(const T &e) {
auto iter = std::find(data_.begin(), data_.end(), e);
if (iter == data_.end()) {
return false;
}
data_.erase(iter);
return true;
}
iterator erase(const iterator &pos) { return data_.erase(pos); }
void clear() { data_.clear(); }
const T &front() const { return data_.front(); }
const T &back() const { return data_.back(); }
T pop() {
T e = std::move(data_.front());
(void)data_.erase(data_.begin());
return e;
}
bool empty() const { return data_.empty(); }
std::size_t size() const { return data_.size(); }
iterator begin() { return data_.begin(); }
iterator end() { return data_.end(); }
const_iterator begin() const { return data_.cbegin(); }
const_iterator end() const { return data_.cend(); }
const_iterator cbegin() const { return data_.cbegin(); }
const_iterator cend() const { return data_.cend(); }
private:
data_type data_;
};
} // namespace mindspore
#endif // MINDSPORE_CORE_UTILS_COMPACT_SET_H_