2016-07-05 20:20:33 +08:00
|
|
|
#pragma once
|
|
|
|
|
2016-08-28 22:47:13 +08:00
|
|
|
#include <vector>
|
2016-07-05 20:20:33 +08:00
|
|
|
|
2016-08-18 22:34:36 +08:00
|
|
|
#include "utils/reference_wrapper.hpp"
|
|
|
|
|
|
|
|
class Label;
|
|
|
|
using label_ref_t = ReferenceWrapper<const Label>;
|
2016-07-05 20:20:33 +08:00
|
|
|
|
|
|
|
class LabelCollection
|
|
|
|
{
|
|
|
|
public:
|
2016-11-29 11:08:08 +08:00
|
|
|
auto begin() { return labels_.begin(); }
|
|
|
|
auto begin() const { return labels_.begin(); }
|
|
|
|
auto cbegin() const { return labels_.begin(); }
|
2016-07-05 20:20:33 +08:00
|
|
|
|
2016-11-29 11:08:08 +08:00
|
|
|
auto end() { return labels_.end(); }
|
|
|
|
auto end() const { return labels_.end(); }
|
|
|
|
auto cend() const { return labels_.end(); }
|
2016-07-05 20:20:33 +08:00
|
|
|
|
2016-08-18 22:34:36 +08:00
|
|
|
bool add(const Label &label);
|
|
|
|
bool has(const Label &label) const;
|
2016-07-05 20:20:33 +08:00
|
|
|
size_t count() const;
|
2016-08-18 22:34:36 +08:00
|
|
|
bool remove(const Label &label);
|
2016-07-05 20:20:33 +08:00
|
|
|
void clear();
|
2016-08-28 22:47:13 +08:00
|
|
|
const std::vector<label_ref_t> &operator()() const;
|
2016-07-05 20:20:33 +08:00
|
|
|
|
2016-11-29 11:08:08 +08:00
|
|
|
template <class Handler>
|
|
|
|
void handle(Handler &handler) const
|
|
|
|
{
|
|
|
|
for (auto &label : labels_)
|
|
|
|
handler.handle(label.get());
|
|
|
|
}
|
|
|
|
|
2016-07-05 20:20:33 +08:00
|
|
|
private:
|
2016-11-29 11:08:08 +08:00
|
|
|
std::vector<label_ref_t> labels_;
|
2016-07-05 20:20:33 +08:00
|
|
|
};
|