#ifndef SEGMENTED_SEQUENCES_H #define SEGMENTED_SEQUENCES_H #include #include #include #include #include #include using SegmentedString = std::vector>; class SegmentedSequences { public: SegmentedSequences() = default; virtual ~SegmentedSequences() = default; virtual void Visit(std::function visitor) const = 0; virtual size_t MinSize() const = 0; }; class SegmentedSequencesLeaf : public SegmentedSequences { private: std::shared_ptr sequence_; public: SegmentedSequencesLeaf() = default; ~SegmentedSequencesLeaf() override = default; explicit SegmentedSequencesLeaf(std::shared_ptr sequence); void Visit(std::function visitor) const override; size_t MinSize() const override; const std::string& sequence() const { return *sequence_; } }; class SegmentedSequencesAlternatives : public SegmentedSequences { private: std::vector> alternatives_; size_t min_size_ = 0; public: SegmentedSequencesAlternatives() = default; ~SegmentedSequencesAlternatives() override = default; explicit SegmentedSequencesAlternatives( std::vector> alternatives); void Visit(std::function visitor) const override; size_t MinSize() const override; const std::vector>& alternatives() const { return alternatives_; } }; class SegmentedSequencesProduct : public SegmentedSequences { private: std::shared_ptr a_; std::shared_ptr b_; size_t min_size_ = 0; public: SegmentedSequencesProduct() = default; ~SegmentedSequencesProduct() override = default; SegmentedSequencesProduct(std::shared_ptr a, std::shared_ptr b); void Visit(std::function visitor) const override; size_t MinSize() const override; std::shared_ptr a() const { return a_; } std::shared_ptr b() const { return b_; } }; #endif