-
Notifications
You must be signed in to change notification settings - Fork 1
/
Location.cpp
90 lines (74 loc) · 2.1 KB
/
Location.cpp
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
87
88
89
90
#include <sstream>
#include <algorithm>
#include <ASSERT.h>
#include "Location.h"
using namespace std;
namespace LSystem
{
Location::Location()
: mFileName("")
, mFirstLine(1)
, mFirstColumn(1)
, mLastLine(1)
, mLastColumn(1)
{ }
Location::Location(const char *aFileName, int aFirstLine, int aFirstColumn, int aLastLine, int aLastColumn)
: mFileName(aFileName)
, mFirstLine(aFirstLine)
, mFirstColumn(aFirstColumn)
, mLastLine(aLastLine)
, mLastColumn(aLastColumn)
{
ASSERT(mFirstLine <= mLastLine);
ASSERT(mFirstColumn <= mLastColumn);
}
bool Location::operator == (const Location &o) const
{
return mFirstColumn == o.mFirstColumn
&& mFirstLine == o.mFirstLine
&& mLastColumn == o.mLastColumn
&& mLastLine == o.mLastLine
&& mFileName == o.mFileName;
}
bool Location::operator != (const Location &o) const
{
return mFirstColumn != o.mFirstColumn
|| mFirstLine != o.mFirstLine
|| mLastColumn != o.mLastColumn
|| mLastLine != o.mLastLine
|| mFileName != o.mFileName;
}
std::string Location::ToString() const
{
std::ostringstream s;
s << GetFileName() << ":" << GetFirstLine() << "," << GetFirstColumn() << "-" << GetLastLine() << "," << GetLastColumn();
return s.str();
}
std::string Location::ToShortString() const
{
std::ostringstream s;
s << GetFileName() << ":" << GetFirstLine() << "," << GetFirstColumn();
return s.str();
}
Location Location::operator +(const Location& rhs) const
{
Location r(*this);
r.mFirstLine = min(mFirstLine, rhs.mFirstLine);
r.mFirstColumn = min(mFirstColumn, rhs.mFirstColumn);
r.mLastLine = max(mLastLine, rhs.mLastLine);
r.mLastColumn = max(mLastColumn, rhs.mLastColumn);
ASSERT(mFirstLine <= mLastLine);
ASSERT(mFirstColumn <= mLastColumn);
return r;
}
Location& Location::operator += (const Location& rhs)
{
mFirstLine = min(mFirstLine, rhs.mFirstLine);
mFirstColumn = min(mFirstColumn, rhs.mFirstColumn);
mLastLine = max(mLastLine, rhs.mLastLine);
mLastColumn = max(mLastColumn, rhs.mLastColumn);
ASSERT(mFirstLine <= mLastLine);
ASSERT(mFirstColumn <= mLastColumn);
return *this;
}
}