1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
|
#include "stdafx.h"
#include "ExprResult.h"
#include "Core/StrBuf.h"
namespace storm {
ExprResult::ExprResult() : returns(true) {}
ExprResult::ExprResult(Value result) : result(result), returns(true) {}
ExprResult::ExprResult(Bool any) : returns(any) {}
Value ExprResult::type() const {
if (returns)
return result;
else
return Value();
}
Bool ExprResult::value() const {
return returns && result != Value();
}
Bool ExprResult::empty() const {
return returns && result == Value();
}
Bool ExprResult::nothing() const {
return !returns;
}
Bool ExprResult::operator ==(const ExprResult &o) const {
return returns == o.returns && result == o.result;
}
Bool ExprResult::operator !=(const ExprResult &o) const {
return !(*this == o);
}
ExprResult ExprResult::asRef(Bool r) const {
if (nothing())
return *this;
return ExprResult(result.asRef(r));
}
wostream &operator <<(wostream &to, const ExprResult &r) {
if (r.nothing()) {
to << L"<nothing>";
} else {
to << r.type();
}
return to;
}
void ExprResult::toS(StrBuf *to) const {
if (nothing()) {
*to << S("nothing");
} else {
*to << type();
}
}
void ExprResult::deepCopy(CloneEnv *env) {
result.deepCopy(env);
}
ExprResult noReturn() {
return ExprResult(false);
}
ExprResult common(ExprResult a, ExprResult b) {
if (a.nothing())
return b;
if (b.nothing())
return a;
return common(a.type(), b.type());
}
}
|