/** @file Sequence.hpp * * Author: Roland Conybeare **/ #pragma once #include "Expression.hpp" //#include namespace xo { namespace ast { class Sequence : public Expression { public: Sequence(const std::vector> & xv) : Expression(exprtype::sequence, xv[xv.size() - 1]->valuetype()), expr_v_(xv) {} static rp make(const std::vector> & xv) { return new Sequence(xv); } std::size_t size() const { return expr_v_.size(); } const rp & operator[](std::size_t i) const { return expr_v_[i]; } // ----- from Expression ----- /** note: broken if .expr_v_ contains any def-exprs * (will treat references to so-defined vars as free). * must rewrite these first **/ virtual std::set get_free_variables() const override; virtual std::size_t visit_preorder(VisitFn visitor_fn) override; /** note: borken if .expr_v_ contains any def-exprs **/ virtual std::size_t visit_layer(VisitFn visitor_fn) override; virtual rp xform_layer(TransformFn visitor_fn) override; virtual void attach_envs(ref::brw parent) override; // ----- from GeneralizedExpression ---- virtual void display(std::ostream & os) const override; private: /** sequence of expressions; evaluate in left-to-right order. **/ std::vector> expr_v_; }; } /*namespace ast*/ } /*namespace xo*/ /** end Sequence.hpp **/