Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
bool isRecordType(const TypeSet& s) {
    return !s.empty() && !s.isAll() && all_of(s, (bool(*)(const Type&))&isRecordType);
}