mirror of
				https://github.com/Z3Prover/z3
				synced 2025-10-31 11:42:28 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			76 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*++
 | |
| Copyright (c) 2006 Microsoft Corporation
 | |
| 
 | |
| Module Name:
 | |
| 
 | |
|     struct_factory.cpp
 | |
| 
 | |
| Abstract:
 | |
| 
 | |
|     <abstract>
 | |
| 
 | |
| Author:
 | |
| 
 | |
|     Leonardo de Moura (leonardo) 2008-11-06.
 | |
| 
 | |
| Revision History:
 | |
| 
 | |
| --*/
 | |
| #include "model/struct_factory.h"
 | |
| #include "model/model_core.h"
 | |
| 
 | |
| struct_factory::value_set& struct_factory::get_value_set(sort * s) {
 | |
|     value_set * set = nullptr;
 | |
|     if (!m_sort2value_set.find(s, set)) {
 | |
|         set = alloc(value_set, m_model.get_manager());
 | |
|         m_sort2value_set.insert(s, set);
 | |
|         m_sorts.push_back(s);
 | |
|         m_sets.push_back(set);
 | |
|     }
 | |
|     SASSERT(set != 0);
 | |
|     return *set;
 | |
| }
 | |
| 
 | |
| struct_factory::struct_factory(ast_manager & m, family_id fid, model_core & md):
 | |
|     value_factory(m, fid),
 | |
|     m_model(md),
 | |
|     m_sorts(m) {
 | |
| }
 | |
| 
 | |
| struct_factory::~struct_factory() {
 | |
| }
 | |
| 
 | |
| void struct_factory::register_value(expr * new_value) {
 | |
|     sort * s        = new_value->get_sort();
 | |
|     auto& [set, values] = get_value_set(s);
 | |
|     if (!set.contains(new_value)) {
 | |
|         values.push_back(new_value);
 | |
|         set.insert(new_value);
 | |
|     }
 | |
| }
 | |
| 
 | |
| bool struct_factory::get_some_values(sort * s, expr_ref & v1, expr_ref & v2) {
 | |
|     auto& [set, values] = get_value_set(s);
 | |
|     switch (set.size()) {
 | |
|     case 0:
 | |
|         v1 = get_fresh_value(s);
 | |
|         v2 = get_fresh_value(s);
 | |
|         return v1 != 0 && v2 != 0;
 | |
|     case 1:
 | |
|         v1 = get_some_value(s);
 | |
|         v2 = get_fresh_value(s);
 | |
|         return v2 != 0;
 | |
|     default:
 | |
|         obj_hashtable<expr>::iterator it = set.begin();
 | |
|         v1 = *it;
 | |
|         ++it;
 | |
|         v2 = *it;
 | |
|         return true;
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 | |
| 
 |