diff --git a/assembler/annotation.h b/assembler/annotation.h index 0aa8ba2..8e35d0e 100644 --- a/assembler/annotation.h +++ b/assembler/annotation.h @@ -60,6 +60,26 @@ public: elements_.push_back(std::forward(element)); } + void SetOrAddElementByIndex(size_t ele_idx, AnnotationElement &&element) + { + // did not find a simple way to replace element directly because of circular dependency of class definition + auto len = elements_.size(); + ASSERT(ele_idx <= len); + if (ele_idx == len) { + AddElement(std::move(element)); + return; + } + std::vector eles; + for (size_t i = 0; i < ele_idx; i++) { + eles.push_back(std::forward(elements_[i])); + } + eles.push_back(std::forward(element)); + for (size_t i = ele_idx + 1; i < len; i++) { + eles.push_back(std::forward(elements_[i])); + } + elements_ = std::forward>(eles); + } + private: std::string record_name_; std::vector elements_; diff --git a/assembler/meta.h b/assembler/meta.h index 192af07..a613d4a 100644 --- a/assembler/meta.h +++ b/assembler/meta.h @@ -207,6 +207,12 @@ public: annotations_.insert(annotations_.end(), annotations.begin(), annotations.end()); } + void SetOrAddAnnotationElementByIndex(size_t anno_idx, size_t ele_idx, AnnotationElement &&element) + { + ASSERT(anno_idx < annotations_.size()); + annotations_[anno_idx].SetOrAddElementByIndex(ele_idx, std::forward(element)); + } + std::optional ValidateData() override; protected: