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 81 82 83 84 85 86
|
#include "stdafx.h"
#include "SrcPos.h"
#include "Core/CloneEnv.h"
#include "Core/StrBuf.h"
namespace storm {
SrcPos::SrcPos() : file(null), start(0), end(0) {}
SrcPos::SrcPos(Url *file, Nat start, Nat end) : file(file), start(min(start, end)), end(max(start, end)) {}
Bool SrcPos::unknown() const {
return file == null;
}
Bool SrcPos::any() const {
return file != null;
}
Bool SrcPos::empty() const {
return file == null;
}
SrcPos SrcPos::operator +(Nat v) const {
return SrcPos(file, start + v, end + v);
}
SrcPos SrcPos::extend(SrcPos o) const {
if (file != o.file) {
if (unknown())
return o;
if (o.unknown())
return *this;
if (*file != *o.file)
return *this;
}
// Now we know they are equal.
return SrcPos(file, min(start, o.start), max(end, o.end));
}
SrcPos SrcPos::firstCh() const {
return SrcPos(file, start, start + 1);
}
SrcPos SrcPos::lastCh() const {
if (end > 0)
return SrcPos(file, end - 1, end);
else
return SrcPos(file, end, end);
}
void SrcPos::deepCopy(CloneEnv *env) {
cloned(file, env);
}
Bool SrcPos::operator ==(SrcPos o) const {
if (!file && !o.file)
return true;
if (!file || !o.file)
return false;
return *file == *o.file
&& start == o.start
&& end == o.end;
}
Bool SrcPos::operator !=(SrcPos o) const {
return !(*this == o);
}
wostream &operator <<(wostream &to, const SrcPos &p) {
if (p.unknown())
return to << L"<unknown location>";
else
return to << p.file << L"(" << p.start << L"-" << p.end << L")";
}
void SrcPos::toS(StrBuf *to) const {
if (unknown())
*to << S("<unknown location>");
else
*to << file << S("(") << start << S("-") << end << S(")");
}
}
|