///////////////////////////////////////////////////////////////////// // SymbolTable.cpp - SymbolTable demo storing qualified types // // Helper for Project #2 // // // // Jim Fawcett, CSE687 - Object Oriented Design, Spring 2013 // ///////////////////////////////////////////////////////////////////// #include #include #include #include #include "../MTutility/MTutility.h" typedef std::string Namespace; typedef std::string SourceFile; typedef std::pair NamespaceInfo; typedef std::list Namespaces; typedef std::string TypeName; typedef std::unordered_map Symbols; class SymbolTable { public: void Add(TypeName t, Namespace ns, SourceFile f) { NamespaceInfo info; info.first = ns; info.second = f; Symbols::iterator iter = symbols.find(t); if(iter != symbols.end()) { iter->second.push_back(info); } else { Namespaces nsp; nsp.push_back(info); symbols[t] = nsp; } } bool containsType(const TypeName& type) { return symbols.find(type) != symbols.end(); } SourceFile lookUpFile(const TypeName& type, const Namespace& ns) { Symbols::iterator iter = symbols.find(type); if(iter == symbols.end()) return ""; for(auto info : iter->second) if(info.first == ns) return info.second; return ""; } private: std::unordered_map symbols; }; int main() { Title("MT3Q5 - Symbol Table"); SymbolTable symbols; symbols.Add("X", "::", "X.h"); symbols.Add("Y", "A::", "W.h"); symbols.Add("X", "B::", "V.cpp"); if(symbols.containsType("X")) std::cout << "\n ::X is defined in " << symbols.lookUpFile("X", "::"); if(symbols.containsType("Y")) std::cout << "\n B::X is defined in " << symbols.lookUpFile("X", "B::"); if(symbols.containsType("X")) std::cout << "\n A::Y is defined in " << symbols.lookUpFile("Y", "A::"); if(symbols.containsType("Foobar")) std::cout << "\n ::Foobar is defined in " << symbols.lookUpFile("Foobar", "::"); else std::cout << "\n ::Foobar not defined"; std::cout << "\n\n"; }