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