diff options
author | John Hodge <tpg@mutabah.net> | 2016-08-07 19:01:17 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-08-07 19:01:17 +0800 |
commit | e27816641fcaeb387bc154daa06831ce4644893a (patch) | |
tree | e8d923cc82121fa536c730462f0c8093956fa088 | |
parent | 1cc3e0f157aa27d53caccbe20e0467b39ef35fd7 (diff) | |
download | mrust-e27816641fcaeb387bc154daa06831ce4644893a.tar.gz |
HIR - Add clone() method to Pattern (and a few constructors)
-rw-r--r-- | src/hir/pattern.cpp | 125 | ||||
-rw-r--r-- | src/hir/pattern.hpp | 12 |
2 files changed, 137 insertions, 0 deletions
diff --git a/src/hir/pattern.cpp b/src/hir/pattern.cpp index ba688f1f..8a95fa53 100644 --- a/src/hir/pattern.cpp +++ b/src/hir/pattern.cpp @@ -114,5 +114,130 @@ namespace HIR { ) return os; } +} // namespace HIR + + +namespace { + ::std::vector< ::HIR::Pattern> clone_pat_vec(const ::std::vector< ::HIR::Pattern>& pats) { + ::std::vector< ::HIR::Pattern> rv; + rv.reserve( pats.size() ); + for(const auto& pat : pats) + rv.push_back( pat.clone() ); + return rv; + } + ::std::vector< ::std::pair< ::std::string, ::HIR::Pattern> > clone_pat_fields(const ::std::vector< ::std::pair< ::std::string, ::HIR::Pattern> >& pats) { + ::std::vector< ::std::pair< ::std::string, ::HIR::Pattern> > rv; + rv.reserve( pats.size() ); + for(const auto& field : pats) + rv.push_back( ::std::make_pair(field.first, field.second.clone()) ); + return rv; + } + + ::HIR::Pattern::Value clone_patval(const ::HIR::Pattern::Value& val) { + TU_MATCH(::HIR::Pattern::Value, (val), (e), + (Integer, + return ::HIR::Pattern::Value::make_Integer(e); + ), + (String, + return ::HIR::Pattern::Value::make_String(e); + ), + (Named, + return ::HIR::Pattern::Value::make_Named(e.clone()); + ) + ) + throw ""; + } +} // namespace + +::HIR::Pattern HIR::Pattern::clone() const +{ + TU_MATCH(::HIR::Pattern::Data, (m_data), (e), + (Any, + return Pattern(m_binding, Data::make_Any({})); + ), + (Box, + return Pattern(m_binding, Data::make_Box({ + box$( e.sub->clone() ) + })); + ), + (Ref, + return Pattern(m_binding, Data::make_Ref({ + e.type, box$(e.sub->clone()) + })); + ), + (Tuple, + return Pattern(m_binding, Data::make_Tuple({ + clone_pat_vec(e.sub_patterns) + })); + ), + (StructTuple, + return Pattern(m_binding, Data::make_StructTuple({ + e.path.clone(), + e.binding, + clone_pat_vec(e.sub_patterns) + })); + ), + (StructTupleWildcard, + return Pattern(m_binding, Data::make_StructTupleWildcard({ + e.path.clone(), + e.binding + })); + ), + (Struct, + return Pattern(m_binding, Data::make_Struct({ + e.path.clone(), + e.binding, + clone_pat_fields(e.sub_patterns), + e.is_exhaustive + })); + ), + + (Value, + return Pattern(m_binding, Data::make_Value({ + clone_patval(e.val) + })); + ), + (Range, + return Pattern(m_binding, Data::make_Range({ + clone_patval(e.start), + clone_patval(e.end) + })); + ), + + (EnumTuple, + return Pattern(m_binding, Data::make_EnumTupleWildcard({ + e.path.clone() + })); + ), + (EnumTupleWildcard, + return Pattern(m_binding, Data::make_EnumTupleWildcard({ + e.path.clone() + })); + ), + (EnumStruct, + return Pattern(m_binding, Data::make_EnumStruct({ + e.path.clone(), + e.binding_ptr, + e.binding_idx, + clone_pat_fields(e.sub_patterns), + e.is_exhaustive + })); + ), + (Slice, + return Pattern(m_binding, Data::make_Slice({ + clone_pat_vec(e.sub_patterns) + })); + ), + (SplitSlice, + return Pattern(m_binding, Data::make_SplitSlice({ + clone_pat_vec(e.leading), + e.extra_bind, + clone_pat_vec(e.trailing) + })); + ) + ) + + throw ""; } + diff --git a/src/hir/pattern.hpp b/src/hir/pattern.hpp index 479666f7..72cb061d 100644 --- a/src/hir/pattern.hpp +++ b/src/hir/pattern.hpp @@ -110,6 +110,18 @@ struct Pattern PatternBinding m_binding; Data m_data; + Pattern() {} + Pattern(PatternBinding pb, Data d): + m_binding( mv$(pb) ), + m_data( mv$(d) ) + {} + Pattern(const Pattern&) = delete; + Pattern(Pattern&&) = default; + Pattern& operator=(const Pattern&) = delete; + Pattern& operator=(Pattern&&) = default; + + Pattern clone() const; + friend ::std::ostream& operator<<(::std::ostream& os, const Pattern& x); }; |