#include "segmented_sequences.h" #include SegmentedSequencesLeaf::SegmentedSequencesLeaf( std::shared_ptr sequence) : sequence_(sequence) {} void SegmentedSequencesLeaf::Visit( std::function visitor) const { visitor(SegmentedString{sequence_}); } size_t SegmentedSequencesLeaf::MinSize() const { return sequence_->size(); } SegmentedSequencesAlternatives::SegmentedSequencesAlternatives( std::vector> alternatives) { min_size_ = alternatives[0]->MinSize(); for (const auto &alt : alternatives) { min_size_ = std::min(min_size_, alt->MinSize()); } for (const auto &alt : alternatives) { if (alt->MinSize() == min_size_) { alternatives_.push_back(alt); } } } void SegmentedSequencesAlternatives::Visit( std::function visitor) const { for (const auto &alt : alternatives_) { alt->Visit(visitor); } } size_t SegmentedSequencesAlternatives::MinSize() const { return min_size_; } SegmentedSequencesProduct::SegmentedSequencesProduct( std::shared_ptr a, std::shared_ptr b) : a_(a), b_(b) { min_size_ = a_->MinSize() + b_->MinSize(); } void SegmentedSequencesProduct::Visit( std::function visitor) const { a_->Visit([this, visitor](SegmentedString seq_a) { b_->Visit([this, visitor, &seq_a](SegmentedString seq_b) { SegmentedString joined_seq = seq_a; joined_seq.insert(joined_seq.end(), seq_b.begin(), seq_b.end()); visitor(joined_seq); }); }); } size_t SegmentedSequencesProduct::MinSize() const { return min_size_; }