209 struct Entry { |
209 struct Entry { |
210 ModelElement data; |
210 ModelElement data; |
211 ModelId id; |
211 ModelId id; |
212 }; |
212 }; |
213 std::vector<Entry> body; |
213 std::vector<Entry> body; |
214 std::map<ModelId, int> positions; |
214 std::map<ModelId, std::size_t> positions; |
215 ModelId runningId = {1}; |
215 ModelId runningId = {1}; |
216 public: |
216 public: |
217 Model(QObject* parent); |
217 Model(QObject* parent); |
218 virtual ~Model(); |
218 virtual ~Model(); |
219 ModelId append(const ModelElement& value); |
219 ModelId append(const ModelElement& value); |
220 const ModelElement& at(int position) const; |
220 const ModelElement& at(std::size_t position) const; |
221 ModelId idAt(int position) const; |
221 ModelId idAt(std::size_t position) const; |
222 void assignAt(int position, const ModelElement& element); |
222 void assignAt(std::size_t position, const ModelElement& element); |
223 std::optional<int> find(ModelId id) const; |
223 std::optional<int> find(ModelId id) const; |
224 void remove(int index); |
224 void remove(std::size_t index); |
225 int rowCount(const QModelIndex&) const override; |
225 int rowCount(const QModelIndex&) const override; |
226 QVariant data(const QModelIndex& index, int role) const override; |
226 QVariant data(const QModelIndex& index, int role) const override; |
227 const ModelElement& operator[](int index) const; |
227 const ModelElement& operator[](std::size_t index) const; |
228 int size() const; |
228 std::size_t size() const; |
229 auto operator[](int index) { |
229 auto operator[](const std::size_t index) { |
230 struct { |
230 struct { |
231 Model& model; |
231 Model& model; |
232 int index; |
232 const std::size_t index; |
233 operator const ModelElement&() { |
233 operator const ModelElement&() { |
234 return model.at(index); |
234 return model.at(index); |
235 } |
235 } |
236 auto& operator=(const ModelElement& newData) { |
236 auto& operator=(const ModelElement& newData) { |
237 model.assignAt(index, newData); |
237 model.assignAt(index, newData); |
249 void updateHeaderNameField(Model& model, const QString &name); |
249 void updateHeaderNameField(Model& model, const QString &name); |
250 |
250 |
251 template<typename T> |
251 template<typename T> |
252 void iterate(const Model& model, std::function<void(const T&)> fn) |
252 void iterate(const Model& model, std::function<void(const T&)> fn) |
253 { |
253 { |
254 for (int i = 0; i < model.size(); ++i) { |
254 for (std::size_t i = 0; i < model.size(); ++i) { |
255 if (std::holds_alternative<T>(model[i])) { |
255 if (std::holds_alternative<T>(model[i])) { |
256 fn(std::get<T>(model[i])); |
256 fn(std::get<T>(model[i])); |
257 } |
257 } |
258 } |
258 } |
259 } |
259 } |