GCC Code Coverage Report


ernie/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
41 / 41
100.0%
Branches:
56 / 96
58.3%
Functions:
8 / 8, 3 excl
100.0%

geometry/bounds.h
Line Branch Exec Source
1 // SPDX-License-Identifier: BSD-3-Clause
2 /// @file bounds.h
3 /// @brief Axis-aligned boxes in double precision.
4 #pragma once
5
6 #include <glm/glm.hpp>
7
8 #include <cmath>
9 #include <limits>
10
11 namespace ernie {
12
13 /// @brief An axis-aligned box; the default one is empty and grows to hold what it is given.
14 832 struct Box {
15 2 glm::dvec3 min{std::numeric_limits<double>::infinity()};
16 2 glm::dvec3 max{-std::numeric_limits<double>::infinity()};
17
18 12805 static Box Around(const glm::dvec3& center, const glm::dvec3& halfSize) {
19 12805 return {center - halfSize, center + halfSize};
20 }
21
22 201 bool Empty() const {
23
31/66
<unknown function 14>:
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 7 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 7 times.
✗ Branch 9 not taken.
✓ Branch 10 taken 7 times.
✗ Branch 11 not taken.
✓ Branch 12 taken 8 times.
✓ Branch 13 taken 1 time.
✓ Branch 14 taken 8 times.
✗ Branch 15 not taken.
✓ Branch 16 taken 8 times.
✗ Branch 17 not taken.
✓ Branch 18 taken 19 times.
✗ Branch 19 not taken.
✓ Branch 20 taken 19 times.
✗ Branch 21 not taken.
<unknown function 22>:
✓ Branch 0 taken 57 times.
✓ Branch 1 taken 6 times.
✓ Branch 2 taken 57 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 53 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 54 times.
✓ Branch 7 taken 2 times.
✓ Branch 8 taken 1 time.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
✗ Branch 11 not taken.
ernie::Box::Around(glm::vec<3, double, (glm::qualifier)0> const&, glm::vec<3, double, (glm::qualifier)0> const&):
✗ Branch 0 not taken.
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 7 not taken.
✓ Branch 8 taken 1 time.
✗ Branch 9 not taken.
✓ Branch 10 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
✗ Branch 15 not taken.
✓ Branch 16 taken 1 time.
✗ Branch 17 not taken.
✓ Branch 18 taken 1 time.
✗ Branch 19 not taken.
✗ Branch 20 not taken.
✗ Branch 21 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✓ Branch 24 taken 1 time.
✗ Branch 25 not taken.
✓ Branch 26 taken 1 time.
✗ Branch 27 not taken.
169 return !(min.x <= max.x && min.y <= max.y && min.z <= max.z);
24 }
25 4 glm::dvec3 Center() const {
26 4 return 0.5 * (min + max);
27 }
28 3 glm::dvec3 Size() const {
29
2/2
✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 time.
5 return Empty() ? glm::dvec3(0.0) : max - min;
30 }
31
32 2 Box& Extend(const glm::dvec3& point) {
33
2/2
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 1 time.
2 min = glm::min(min, point);
34
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 2 times.
2 max = glm::max(max, point);
35 2 return *this;
36 }
37 88 Box& Extend(const Box& other) {
38
2/2
✓ Branch 0 taken 72 times.
✓ Branch 1 taken 16 times.
88 if (!other.Empty()) {
39
2/2
✓ Branch 0 taken 10 times.
✓ Branch 1 taken 62 times.
72 min = glm::min(min, other.min);
40
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 64 times.
144 max = glm::max(max, other.max);
41 }
42 88 return *this;
43 }
44 5 Box Grown(double margin) const {
45
1/2
✓ Branch 0 taken 5 times.
✗ Branch 1 not taken.
10 return Empty() ? *this : Box{min - margin, max + margin};
46 }
47
48 /// @return The box holding this one after `transform` (Arvo's method, exact for affine maps).
49 73 Box Transformed(const glm::dmat4& transform) const {
50
2/2
✓ Branch 0 taken 58 times.
✓ Branch 1 taken 15 times.
73 if (Empty()) {
51 15 return *this;
52 }
53 58 const glm::dvec3 translation(transform[3]);
54 58 Box out{translation, translation};
55
2/2
✓ Branch 0 taken 174 times.
✓ Branch 1 taken 58 times.
232 for (int column = 0; column < 3; ++column) {
56
2/2
✓ Branch 0 taken 522 times.
✓ Branch 1 taken 174 times.
696 for (int row = 0; row < 3; ++row) {
57
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 522 times.
522 const double a = transform[column][row] * min[column];
58 522 const double b = transform[column][row] * max[column];
59
2/2
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 518 times.
526 out.min[row] += std::min(a, b);
60
2/2
✓ Branch 0 taken 174 times.
✓ Branch 1 taken 348 times.
696 out.max[row] += std::max(a, b);
61 }
62 }
63 58 return out;
64 }
65
66
2/4
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
4 bool operator==(const Box&) const = default;
67 };
68
69 } // namespace ernie
70