"In fact, the f(void) style has been called an "abomination" by Bjarne Stroustrup, the creator of C++, Dennis Ritchie, the co-creator of C, and Doug McIlroy, head of the research department where Unix was born."
		
			
				
	
	
		
			137 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include <cassert>
 | |
| 
 | |
| #include <iostream>
 | |
| 
 | |
| #include "LiftedUtils.h"
 | |
| 
 | |
| 
 | |
| namespace Horus {
 | |
| 
 | |
| namespace LiftedUtils {
 | |
| 
 | |
| std::unordered_map<std::string, unsigned> symbolDict;
 | |
| 
 | |
| 
 | |
| Symbol
 | |
| getSymbol (const std::string& symbolName)
 | |
| {
 | |
|   std::unordered_map<std::string, unsigned>::iterator it
 | |
|       = symbolDict.find (symbolName);
 | |
|   if (it != symbolDict.end()) {
 | |
|     return it->second;
 | |
|   } else {
 | |
|     symbolDict[symbolName] = symbolDict.size() - 1;
 | |
|     return symbolDict.size() - 1;
 | |
|   }
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| void
 | |
| printSymbolDictionary()
 | |
| {
 | |
|   std::unordered_map<std::string, unsigned>::const_iterator it
 | |
|       = symbolDict.begin();
 | |
|   while (it != symbolDict.end()) {
 | |
|     std::cout << it->first << " -> " << it->second << std::endl;
 | |
|     ++ it;
 | |
|   }
 | |
| }
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| std::ostream&
 | |
| operator<< (std::ostream& os, const Symbol& s)
 | |
| {
 | |
|   std::unordered_map<std::string, unsigned>::const_iterator it
 | |
|       = LiftedUtils::symbolDict.begin();
 | |
|   while (it != LiftedUtils::symbolDict.end() && it->second != s) {
 | |
|     ++ it;
 | |
|   }
 | |
|   assert (it != LiftedUtils::symbolDict.end());
 | |
|   os << it->first;
 | |
|   return os;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| std::ostream&
 | |
| operator<< (std::ostream& os, const LogVar& X)
 | |
| {
 | |
|   const std::string labels[] = {
 | |
|       "A", "B", "C", "D", "E", "F",
 | |
|       "G", "H", "I", "J", "K", "M"  };
 | |
|   (X >= 12) ? os << "X_" << X.id_ : os << labels[X];
 | |
|   return os;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| std::ostream&
 | |
| operator<< (std::ostream& os, const Tuple& t)
 | |
| {
 | |
|   os << "(" ;
 | |
|   for (size_t i = 0; i < t.size(); i++) {
 | |
|     os << ((i != 0) ? "," : "") << t[i];
 | |
|   }
 | |
|   os << ")" ;
 | |
|   return os;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| std::ostream&
 | |
| operator<< (std::ostream& os, const Ground& gr)
 | |
| {
 | |
|   os << gr.functor();
 | |
|   os << "(" ;
 | |
|   for (size_t i = 0; i < gr.args().size(); i++) {
 | |
|     if (i != 0) os << ", " ;
 | |
|     os << gr.args()[i];
 | |
|   }
 | |
|   os << ")" ;
 | |
|   return os;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| LogVars
 | |
| Substitution::getDiscardedLogVars() const
 | |
| {
 | |
|   LogVars discardedLvs;
 | |
|   std::set<LogVar> doneLvs;
 | |
|   std::unordered_map<LogVar, LogVar>::const_iterator it
 | |
|       = subs_.begin();
 | |
|   while (it != subs_.end()) {
 | |
|     if (Util::contains (doneLvs, it->second)) {
 | |
|       discardedLvs.push_back (it->first);
 | |
|     } else {
 | |
|       doneLvs.insert (it->second);
 | |
|     }
 | |
|     ++ it;
 | |
|   }
 | |
|   return discardedLvs;
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| std::ostream&
 | |
| operator<< (std::ostream& os, const Substitution& theta)
 | |
| {
 | |
|   std::unordered_map<LogVar, LogVar>::const_iterator it;
 | |
|   os << "[" ;
 | |
|   it = theta.subs_.begin();
 | |
|   while (it != theta.subs_.end()) {
 | |
|     if (it != theta.subs_.begin()) os << ", " ;
 | |
|     os << it->first << "->" << it->second ;
 | |
|     ++ it;
 | |
|   }
 | |
|   os << "]" ;
 | |
|   return os;
 | |
| }
 | |
| 
 | |
| }  // namespace Horus
 | |
| 
 |