mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 11:42:30 +00:00 
			
		
		
		
	Add dict support for rvalue references and C++11 move semantics.
				
					
				
			This commit is contained in:
		
							parent
							
								
									840bb17089
								
							
						
					
					
						commit
						c479fdeb85
					
				
					 1 changed files with 38 additions and 4 deletions
				
			
		|  | @ -314,11 +314,11 @@ class dict | ||||||
| 	int do_insert(const K &key, int &hash) | 	int do_insert(const K &key, int &hash) | ||||||
| 	{ | 	{ | ||||||
| 		if (hashtable.empty()) { | 		if (hashtable.empty()) { | ||||||
| 			entries.push_back(entry_t(std::pair<K, T>(key, T()), -1)); | 			entries.emplace_back(std::pair<K, T>(key, T()), -1); | ||||||
| 			do_rehash(); | 			do_rehash(); | ||||||
| 			hash = do_hash(key); | 			hash = do_hash(key); | ||||||
| 		} else { | 		} else { | ||||||
| 			entries.push_back(entry_t(std::pair<K, T>(key, T()), hashtable[hash])); | 			entries.emplace_back(std::pair<K, T>(key, T()), hashtable[hash]); | ||||||
| 			hashtable[hash] = entries.size() - 1; | 			hashtable[hash] = entries.size() - 1; | ||||||
| 		} | 		} | ||||||
| 		return entries.size() - 1; | 		return entries.size() - 1; | ||||||
|  | @ -327,11 +327,25 @@ class dict | ||||||
| 	int do_insert(const std::pair<K, T> &value, int &hash) | 	int do_insert(const std::pair<K, T> &value, int &hash) | ||||||
| 	{ | 	{ | ||||||
| 		if (hashtable.empty()) { | 		if (hashtable.empty()) { | ||||||
| 			entries.push_back(entry_t(value, -1)); | 			entries.emplace_back(value, -1); | ||||||
| 			do_rehash(); | 			do_rehash(); | ||||||
| 			hash = do_hash(value.first); | 			hash = do_hash(value.first); | ||||||
| 		} else { | 		} else { | ||||||
| 			entries.push_back(entry_t(value, hashtable[hash])); | 			entries.emplace_back(value, hashtable[hash]); | ||||||
|  | 			hashtable[hash] = entries.size() - 1; | ||||||
|  | 		} | ||||||
|  | 		return entries.size() - 1; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	int do_insert(std::pair<K, T> &&rvalue, int &hash) | ||||||
|  | 	{ | ||||||
|  | 		if (hashtable.empty()) { | ||||||
|  | 			auto key = rvalue.first; | ||||||
|  | 			entries.emplace_back(std::forward<std::pair<K, T>>(rvalue), -1); | ||||||
|  | 			do_rehash(); | ||||||
|  | 			hash = do_hash(key); | ||||||
|  | 		} else { | ||||||
|  | 			entries.emplace_back(std::forward<std::pair<K, T>>(rvalue), hashtable[hash]); | ||||||
| 			hashtable[hash] = entries.size() - 1; | 			hashtable[hash] = entries.size() - 1; | ||||||
| 		} | 		} | ||||||
| 		return entries.size() - 1; | 		return entries.size() - 1; | ||||||
|  | @ -441,6 +455,26 @@ public: | ||||||
| 		return std::pair<iterator, bool>(iterator(this, i), true); | 		return std::pair<iterator, bool>(iterator(this, i), true); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	std::pair<iterator, bool> insert(std::pair<K, T> &&rvalue) | ||||||
|  | 	{ | ||||||
|  | 		int hash = do_hash(rvalue.first); | ||||||
|  | 		int i = do_lookup(rvalue.first, hash); | ||||||
|  | 		if (i >= 0) | ||||||
|  | 			return std::pair<iterator, bool>(iterator(this, i), false); | ||||||
|  | 		i = do_insert(std::forward<std::pair<K, T>>(rvalue), hash); | ||||||
|  | 		return std::pair<iterator, bool>(iterator(this, i), true); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	std::pair<iterator, bool> insert(K const &key, T &&rvalue) | ||||||
|  | 	{ | ||||||
|  | 		int hash = do_hash(key); | ||||||
|  | 		int i = do_lookup(key, hash); | ||||||
|  | 		if (i >= 0) | ||||||
|  | 			return std::pair<iterator, bool>(iterator(this, i), false); | ||||||
|  | 		i = do_insert(std::make_pair(key, std::forward<T>(rvalue)), hash); | ||||||
|  | 		return std::pair<iterator, bool>(iterator(this, i), true); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	int erase(const K &key) | 	int erase(const K &key) | ||||||
| 	{ | 	{ | ||||||
| 		int hash = do_hash(key); | 		int hash = do_hash(key); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue