TypeSet getGreatestCommonSubtypes(const TypeSet& set) { // handle the empty set if (set.empty()) return set; // handle the all set => empty set (since no common sub-type) if (set.isAll()) return TypeSet(); TypeSet res; auto it = set.begin(); res.insert(*it); ++it; // refine sub-set step by step for(;it != set.end(); ++it) { TypeSet tmp; for(const Type& cur : res) { tmp.insert(getGreatestCommonSubtypes(cur, *it)); } res = tmp; } // done return res; }
TypeSet getGreatestCommonSubtypes(const TypeSet& a, const TypeSet& b) { // special cases if (a.empty()) return a; if (b.empty()) return b; if (a.isAll()) return b; if (b.isAll()) return a; // compute pairwise greatest common sub types TypeSet res; for(const Type& x : a) { for(const Type& y : b) { res.insert(getGreatestCommonSubtypes(x,y)); } } return res; }
bool isRecordType(const TypeSet& s) { return !s.empty() && !s.isAll() && all_of(s, (bool(*)(const Type&))&isRecordType); }