-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDgBoundedRF2D.cpp
113 lines (89 loc) · 3.09 KB
/
DgBoundedRF2D.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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
////////////////////////////////////////////////////////////////////////////////
//
// DgBoundedRF2D.cpp: DgBoundedRF2D class implementation
//
// Version 6.1 - Kevin Sahr, 5/23/13
//
////////////////////////////////////////////////////////////////////////////////
#include <limits>
#include <cstdint>
#include "DgBoundedRF2D.h"
#include "DgDiscRF.h"
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
DgBoundedRF2D::DgBoundedRF2D (const DgDiscRF<DgIVec2D, DgDVec2D, long double>& rf,
const DgIVec2D& lowerLeftIn,
const DgIVec2D& upperRightIn)
: DgBoundedRF<DgIVec2D, DgDVec2D, long double>
(rf, lowerLeftIn, upperRightIn, rf.undefAddress()),
discRF_ (rf), lowerLeft_ (lowerLeftIn), upperRight_ (upperRightIn),
numI_ (upperRightIn.i() - lowerLeftIn.i() + 1),
numJ_ (upperRightIn.j() - lowerLeftIn.j() + 1)
{
if (numI() <= 0 || numJ() <= 0)
{
report("DgBoundedRF2D::DgBoundedRF2D() invalid bounds", DgBase::Fatal);
}
size_ = numI() * numJ();
if ((size_ / numI()) != static_cast<unsigned long>(numJ()))
{
report("DgBoundedRF2D::DgBoundedRF2D() invalid size setting due to "
"possible overflow", DgBase::Warning);
validSize_ = false;
}
else validSize_ = true;
} // DgBoundedRF2D::DgBoundedRF2D
////////////////////////////////////////////////////////////////////////////////
DgIVec2D&
DgBoundedRF2D::incrementAddress (DgIVec2D& add) const
{
if (!validAddress(add)) return add = invalidAdd();
else if (add == upperRight() || add == endAdd()) return add = endAdd();
if (add.j() == upperRight().j())
{
add = DgIVec2D(add.i() + 1, lowerLeft().j());
}
else
{
add.setJ(add.j() + 1);
}
return add;
} // DgIVec2D& DgBoundedRF2D::incrementAddress
////////////////////////////////////////////////////////////////////////////////
DgIVec2D&
DgBoundedRF2D::decrementAddress (DgIVec2D& add) const
{
if (!validAddress(add) || add == lowerLeft()) return add = invalidAdd();
if (add.j() == lowerLeft().j())
{
add = DgIVec2D(add.i() - 1, upperRight().j());
}
else
{
add.setJ(add.j() - 1);
}
return add;
} // DgIVec2D& DgBoundedRF2D::decrementAddress
////////////////////////////////////////////////////////////////////////////////
std::uint64_t
DgBoundedRF2D::seqNumAddress (const DgIVec2D& add) const
{
DgIVec2D tVec = add - lowerLeft();
std::int64_t sNum = tVec.i() * numJ() + tVec.j();
if (!zeroBased())
sNum++;
return sNum;
} // std::uint64_t DgBoundedRF2D::seqNumAddress
////////////////////////////////////////////////////////////////////////////////
DgIVec2D
DgBoundedRF2D::addFromSeqNum (std::uint64_t sNum) const
{
DgIVec2D res;
if (!zeroBased())
sNum--;
res.setI(sNum / numJ());
res.setJ(sNum % numJ());
res += lowerLeft();
return res;
} // DgIVec2D DgBoundedRF2D::addFromSeqNum
////////////////////////////////////////////////////////////////////////////////