mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Simplifications on LinearExpression.
This commit is contained in:
		
							parent
							
								
									e6c67924b0
								
							
						
					
					
						commit
						00a277c0f5
					
				| @ -353,7 +353,7 @@ void eraseIndices(T& _data, vector<bool> const& _indices) | ||||
| 	T result; | ||||
| 	for (size_t i = 0; i < _data.size(); i++) | ||||
| 		if (!_indices[i]) | ||||
| 			result.emplace_back(move(_data[i])); | ||||
| 			result.push_back(move(_data[i])); | ||||
| 	_data = move(result); | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -39,6 +39,7 @@ using rational = boost::rational<bigint>; | ||||
| /**
 | ||||
|  * A linear expression of the form | ||||
|  * factors[0] + factors[1] * X1 + factors[2] * X2 + ... | ||||
|  * where the variables X_i are implicit. | ||||
|  */ | ||||
| struct LinearExpression | ||||
| { | ||||
| @ -72,7 +73,9 @@ struct LinearExpression | ||||
| 	auto begin() const { return factors.begin(); } | ||||
| 	auto end() const { return factors.end(); } | ||||
| 
 | ||||
| 	void emplace_back(rational _value) { factors.emplace_back(move(_value)); } | ||||
| 	void push_back(rational _value) { factors.push_back(move(_value)); } | ||||
| 
 | ||||
| 	size_t size() const { return factors.size(); } | ||||
| 
 | ||||
| 	void resize(size_t _size) | ||||
| 	{ | ||||
| @ -88,15 +91,13 @@ struct LinearExpression | ||||
| 
 | ||||
| 	bool isConstant() const | ||||
| 	{ | ||||
| 		return ranges::all_of(factors | ranges::views::tail, [](rational const& _v) { return _v.numerator() == 0; }); | ||||
| 		return ranges::all_of(factors | ranges::views::tail, [](rational const& _v) { return !_v; }); | ||||
| 	} | ||||
| 
 | ||||
| 	size_t size() const { return factors.size(); } | ||||
| 
 | ||||
| 	LinearExpression& operator/=(rational const& _divisor) | ||||
| 	{ | ||||
| 		for (rational& x: factors) | ||||
| 			if (x.numerator()) | ||||
| 			if (x) | ||||
| 				x /= _divisor; | ||||
| 		return *this; | ||||
| 	} | ||||
| @ -104,7 +105,7 @@ struct LinearExpression | ||||
| 	LinearExpression& operator*=(rational const& _factor) | ||||
| 	{ | ||||
| 		for (rational& x: factors) | ||||
| 			if (x.numerator()) | ||||
| 			if (x) | ||||
| 				x *= _factor; | ||||
| 		return *this; | ||||
| 	} | ||||
| @ -112,7 +113,7 @@ struct LinearExpression | ||||
| 	friend LinearExpression operator*(rational const& _factor, LinearExpression _expr) | ||||
| 	{ | ||||
| 		for (rational& x: _expr.factors) | ||||
| 			if (x.numerator()) | ||||
| 			if (x) | ||||
| 				x *= _factor; | ||||
| 		return _expr; | ||||
| 	} | ||||
| @ -120,10 +121,10 @@ struct LinearExpression | ||||
| 	LinearExpression& operator-=(LinearExpression const& _y) | ||||
| 	{ | ||||
| 		if (size() < _y.size()) | ||||
| 			factors.resize(_y.size()); | ||||
| 			resize(_y.size()); | ||||
| 		for (size_t i = 0; i < size(); ++i) | ||||
| 			if (_y.factors[i].numerator()) | ||||
| 				factors[i] -= _y.factors[i]; | ||||
| 			if (i < _y.size() && _y[i]) | ||||
| 				(*this)[i] -= _y[i]; | ||||
| 		return *this; | ||||
| 	} | ||||
| 
 | ||||
| @ -137,10 +138,10 @@ struct LinearExpression | ||||
| 	LinearExpression& operator+=(LinearExpression const& _y) | ||||
| 	{ | ||||
| 		if (size() < _y.size()) | ||||
| 			factors.resize(_y.size()); | ||||
| 			resize(_y.size()); | ||||
| 		for (size_t i = 0; i < size(); ++i) | ||||
| 			if (_y.factors[i].numerator()) | ||||
| 				factors[i] += _y.factors[i]; | ||||
| 			if (i < _y.size() && _y[i]) | ||||
| 				(*this)[i] += _y[i]; | ||||
| 		return *this; | ||||
| 	} | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user