Program Listing for File initialized_list.h¶
↰ Return to documentation for file (src/initialized_list.h)
//
// Created by Zayd Hammoudeh on 11/3/18.
//
#ifndef PROJECT02_INITIALIZED_LIST_H
#define PROJECT02_INITIALIZED_LIST_H
#include <unordered_set>
#include <string>
#include "compiler_utils.h" // Used for hash
typedef std::pair<std::string, bool> InitVar;
// Forward Declaration
namespace Quack {
class TypeChecker;
}
class InitializedList {
friend class Quack::TypeChecker;
public:
InitializedList() = default;
InitializedList(const InitializedList& other) { this->vars_ = other.vars_; }
InitializedList& operator=(const InitializedList &other){
this->vars_ = other.vars_;
return *this;
}
inline void add(const std::string &var_name, bool is_field) {
vars_.insert(InitVar(var_name, is_field));
}
inline bool exists(const std::string &var_name, bool is_field) {
return vars_.find(InitVar(var_name, is_field)) != vars_.end();
}
typename std::unordered_set<InitVar>::const_iterator begin() const { return vars_.begin(); }
typename std::unordered_set<InitVar>::iterator begin() { return vars_.begin(); }
typename std::unordered_set<InitVar>::const_iterator end() const { return vars_.end(); }
typename std::unordered_set<InitVar>::iterator end() { return vars_.end(); }
void var_intersect(const InitializedList &other) {
std::unordered_set<InitVar> intersect, large, small;
// Iterate over the smaller list for better p
small = (vars_.size() > other.vars_.size()) ? other.vars_ : vars_;
large = (small == vars_) ? other.vars_ : vars_;
for (const auto &var_name : small) {
auto loc = large.find(var_name);
if (loc != large.end())
intersect.insert(var_name);
}
vars_ = intersect;
}
const std::unordered_set<InitVar> all_items() const { return vars_; }
void var_union(const InitializedList& other) {
for (const auto &var_info : other.vars_)
add(var_info.first, var_info.second);
}
inline unsigned count() { return vars_.size(); }
protected:
std::unordered_set<InitVar> vars_;
};
#endif //PROJECT02_INITIALIZED_LIST_H