GCC Code Coverage Report


ernie/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
117 / 181
64.6%
Branches:
468 / 882
53.1%
Functions:
13 / 24, 4 excl
54.2%

scene/path.h
Line Branch Exec Source
1 // SPDX-License-Identifier: BSD-3-Clause
2 /// @file path.h
3 /// @brief Prim paths, interned names, and the scene's table of paths as (parent, name) nodes.
4 #pragma once
5
6 #include "ernie/export.h"
7 #include "ernie/util/hash_index.h"
8
9 #include <compare>
10 #include <cstdint>
11 #include <deque>
12 #include <functional>
13 #include <limits>
14 #include <optional>
15 #include <string>
16 #include <string_view>
17 #include <vector>
18
19 namespace ernie {
20
21 /// @brief An absolute prim path such as `/World/Rover/Wheel_FL`, as text.
22
359/675
✓ Branch 1 taken 6 times.
✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 2 times.
✓ Branch 4 taken 19 times.
✗ Branch 4 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 5 taken 30 times.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✓ Branch 6 taken 1 time.
✓ Branch 6 taken 2 times.
✓ Branch 7 taken 2 times.
✓ Branch 7 taken 79 times.
✓ Branch 8 taken 1 time.
✓ Branch 8 taken 1 time.
✓ Branch 8 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 8 not taken.
✓ Branch 9 taken 1 time.
✓ Branch 9 taken 1 time.
✓ Branch 9 taken 1 time.
✓ Branch 9 taken 3 times.
✓ Branch 9 taken 1 time.
✗ Branch 10 not taken.
✓ Branch 10 taken 1 time.
✓ Branch 10 taken 1 time.
✗ Branch 10 not taken.
✓ Branch 10 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 11 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 11 not taken.
✗ Branch 11 not taken.
✓ Branch 12 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 12 taken 1 time.
✓ Branch 12 taken 1 time.
✗ Branch 12 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 13 not taken.
✓ Branch 13 taken 1 time.
✓ Branch 13 taken 2 times.
✓ Branch 13 taken 1 time.
✗ Branch 13 not taken.
✓ Branch 13 taken 2 times.
✗ Branch 14 not taken.
✓ Branch 14 taken 1 time.
✓ Branch 14 taken 2 times.
✓ Branch 14 taken 1 time.
✓ Branch 14 taken 2 times.
✓ Branch 14 taken 5 times.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✗ Branch 15 not taken.
✗ Branch 15 not taken.
✗ Branch 15 not taken.
✓ Branch 15 taken 2 times.
✓ Branch 15 taken 1 time.
✓ Branch 16 taken 1 time.
✗ Branch 16 not taken.
✓ Branch 16 taken 1 time.
✗ Branch 16 not taken.
✗ Branch 16 not taken.
✓ Branch 17 taken 1 time.
✓ Branch 17 taken 1 time.
✓ Branch 17 taken 1 time.
✓ Branch 17 taken 2 times.
✗ Branch 17 not taken.
✓ Branch 17 taken 1 time.
✗ Branch 17 not taken.
✗ Branch 18 not taken.
✓ Branch 18 taken 1 time.
✓ Branch 18 taken 2 times.
✓ Branch 18 taken 2 times.
✗ Branch 18 not taken.
✓ Branch 18 taken 1 time.
✗ Branch 19 not taken.
✗ Branch 19 not taken.
✓ Branch 19 taken 1 time.
✓ Branch 19 taken 65 times.
✓ Branch 19 taken 1 time.
✗ Branch 20 not taken.
✗ Branch 20 not taken.
✓ Branch 20 taken 1 time.
✗ Branch 20 not taken.
✓ Branch 20 taken 1 time.
✗ Branch 20 not taken.
✗ Branch 20 not taken.
✓ Branch 20 taken 2 times.
✓ Branch 21 taken 1 time.
✓ Branch 21 taken 1 time.
✗ Branch 21 not taken.
✓ Branch 21 taken 1 time.
✓ Branch 21 taken 3 times.
✓ Branch 21 taken 2 times.
✗ Branch 21 not taken.
✓ Branch 22 taken 1 time.
✓ Branch 22 taken 2 times.
✗ Branch 22 not taken.
✗ Branch 22 not taken.
✗ Branch 22 not taken.
✗ Branch 23 not taken.
✗ Branch 23 not taken.
✗ Branch 23 not taken.
✓ Branch 23 taken 1 time.
✓ Branch 23 taken 1 time.
✓ Branch 23 taken 65 times.
✗ Branch 23 not taken.
✓ Branch 23 taken 1 time.
✓ Branch 23 taken 1 time.
✓ Branch 24 taken 1 time.
✓ Branch 24 taken 1 time.
✓ Branch 24 taken 1 time.
✗ Branch 24 not taken.
✗ Branch 24 not taken.
✗ Branch 24 not taken.
✗ Branch 24 not taken.
✗ Branch 24 not taken.
✓ Branch 24 taken 1 time.
✗ Branch 24 not taken.
✗ Branch 25 not taken.
✓ Branch 25 taken 3 times.
✗ Branch 25 not taken.
✗ Branch 25 not taken.
✗ Branch 26 not taken.
✓ Branch 26 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 26 taken 1 time.
✓ Branch 26 taken 2 times.
✓ Branch 27 taken 1 time.
✓ Branch 27 taken 1 time.
✓ Branch 27 taken 1 time.
✓ Branch 27 taken 1 time.
✗ Branch 27 not taken.
✓ Branch 27 taken 1 time.
✓ Branch 27 taken 1 time.
✗ Branch 27 not taken.
✓ Branch 28 taken 1 time.
✗ Branch 28 not taken.
✗ Branch 28 not taken.
✗ Branch 28 not taken.
✗ Branch 28 not taken.
✓ Branch 28 taken 2 times.
✗ Branch 29 not taken.
✗ Branch 29 not taken.
✓ Branch 29 taken 2 times.
✗ Branch 29 not taken.
✓ Branch 30 taken 1 time.
✓ Branch 30 taken 1 time.
✓ Branch 30 taken 1 time.
✓ Branch 30 taken 2 times.
✓ Branch 31 taken 2 times.
✓ Branch 31 taken 1 time.
✗ Branch 31 not taken.
✗ Branch 31 not taken.
✓ Branch 31 taken 1 time.
✓ Branch 31 taken 2 times.
✓ Branch 31 taken 1 time.
✗ Branch 32 not taken.
✗ Branch 32 not taken.
✗ Branch 32 not taken.
✗ Branch 32 not taken.
✗ Branch 32 not taken.
✗ Branch 32 not taken.
✓ Branch 32 taken 1 time.
✓ Branch 33 taken 1 time.
✓ Branch 33 taken 2 times.
✓ Branch 33 taken 1 time.
✗ Branch 33 not taken.
✓ Branch 34 taken 1 time.
✓ Branch 34 taken 2 times.
✗ Branch 34 not taken.
✗ Branch 34 not taken.
✓ Branch 35 taken 1 time.
✓ Branch 35 taken 1 time.
✗ Branch 35 not taken.
✗ Branch 35 not taken.
✓ Branch 35 taken 1 time.
✓ Branch 35 taken 2 times.
✓ Branch 35 taken 3 times.
✓ Branch 36 taken 1 time.
✗ Branch 36 not taken.
✓ Branch 36 taken 1 time.
✗ Branch 36 not taken.
✗ Branch 36 not taken.
✓ Branch 36 taken 1 time.
✗ Branch 36 not taken.
✗ Branch 37 not taken.
✓ Branch 37 taken 1 time.
✓ Branch 37 taken 1 time.
✓ Branch 37 taken 1 time.
✗ Branch 37 not taken.
✗ Branch 38 not taken.
✗ Branch 38 not taken.
✗ Branch 38 not taken.
✓ Branch 39 taken 1 time.
✓ Branch 39 taken 1 time.
✓ Branch 39 taken 2 times.
✓ Branch 39 taken 1 time.
✓ Branch 40 taken 1 time.
✗ Branch 40 not taken.
✓ Branch 40 taken 1 time.
✓ Branch 40 taken 1 time.
✗ Branch 40 not taken.
✓ Branch 40 taken 5 times.
✗ Branch 41 not taken.
✓ Branch 41 taken 1 time.
✗ Branch 41 not taken.
✓ Branch 41 taken 1 time.
✓ Branch 41 taken 1 time.
✗ Branch 41 not taken.
✗ Branch 42 not taken.
✗ Branch 42 not taken.
✗ Branch 42 not taken.
✓ Branch 43 taken 1 time.
✓ Branch 43 taken 1 time.
✓ Branch 43 taken 2 times.
✓ Branch 43 taken 1 time.
✓ Branch 43 taken 5 times.
✗ Branch 44 not taken.
✗ Branch 44 not taken.
✓ Branch 44 taken 2 times.
✗ Branch 44 not taken.
✗ Branch 44 not taken.
✗ Branch 44 not taken.
✓ Branch 45 taken 1 time.
✗ Branch 45 not taken.
✗ Branch 45 not taken.
✓ Branch 45 taken 1 time.
✓ Branch 46 taken 1 time.
✗ Branch 46 not taken.
✓ Branch 46 taken 1 time.
✓ Branch 46 taken 1 time.
✗ Branch 47 not taken.
✓ Branch 47 taken 1 time.
✗ Branch 47 not taken.
✓ Branch 47 taken 1 time.
✓ Branch 47 taken 1 time.
✗ Branch 48 not taken.
✓ Branch 48 taken 1 time.
✓ Branch 48 taken 1 time.
✓ Branch 48 taken 1 time.
✓ Branch 48 taken 1 time.
✗ Branch 48 not taken.
✗ Branch 48 not taken.
✗ Branch 49 not taken.
✗ Branch 49 not taken.
✗ Branch 49 not taken.
✓ Branch 49 taken 1 time.
✓ Branch 50 taken 1 time.
✗ Branch 50 not taken.
✓ Branch 51 taken 1 time.
✓ Branch 51 taken 1 time.
✗ Branch 51 not taken.
✓ Branch 51 taken 1 time.
✓ Branch 51 taken 1 time.
✗ Branch 52 not taken.
✓ Branch 52 taken 1 time.
✓ Branch 52 taken 1 time.
✗ Branch 52 not taken.
✓ Branch 52 taken 1 time.
✗ Branch 52 not taken.
✗ Branch 53 not taken.
✗ Branch 53 not taken.
✗ Branch 53 not taken.
✓ Branch 53 taken 1 time.
✗ Branch 53 not taken.
✓ Branch 54 taken 1 time.
✗ Branch 54 not taken.
✓ Branch 54 taken 1 time.
✓ Branch 54 taken 1 time.
✓ Branch 55 taken 1 time.
✗ Branch 55 not taken.
✓ Branch 55 taken 1 time.
✗ Branch 55 not taken.
✗ Branch 56 not taken.
✗ Branch 56 not taken.
✓ Branch 56 taken 1 time.
✓ Branch 56 taken 1 time.
✗ Branch 56 not taken.
✓ Branch 57 taken 1 time.
✓ Branch 57 taken 1 time.
✗ Branch 57 not taken.
✓ Branch 57 taken 1 time.
✓ Branch 57 taken 1 time.
✗ Branch 58 not taken.
✗ Branch 58 not taken.
✗ Branch 58 not taken.
✓ Branch 59 taken 1 time.
✓ Branch 59 taken 100 times.
✗ Branch 59 not taken.
✗ Branch 60 not taken.
✓ Branch 60 taken 1 time.
✓ Branch 60 taken 1 time.
✓ Branch 60 taken 2 times.
✗ Branch 60 not taken.
✓ Branch 60 taken 1 time.
✓ Branch 61 taken 1 time.
✗ Branch 61 not taken.
✗ Branch 61 not taken.
✗ Branch 61 not taken.
✓ Branch 62 taken 1 time.
✗ Branch 62 not taken.
✓ Branch 62 taken 1 time.
✗ Branch 63 not taken.
✗ Branch 63 not taken.
✓ Branch 63 taken 100 times.
✓ Branch 63 taken 1 time.
✗ Branch 63 not taken.
✓ Branch 64 taken 1 time.
✓ Branch 64 taken 2 times.
✗ Branch 64 not taken.
✗ Branch 64 not taken.
✗ Branch 65 not taken.
✓ Branch 65 taken 1 time.
✗ Branch 65 not taken.
✗ Branch 65 not taken.
✓ Branch 65 taken 1 time.
✗ Branch 66 not taken.
✓ Branch 66 taken 1 time.
✗ Branch 67 not taken.
✓ Branch 68 taken 1 time.
✓ Branch 68 taken 1 time.
✓ Branch 68 taken 1 time.
✓ Branch 69 taken 2 times.
✗ Branch 69 not taken.
✓ Branch 69 taken 1 time.
✗ Branch 70 not taken.
✓ Branch 71 taken 1 time.
✗ Branch 72 not taken.
✓ Branch 72 taken 1 time.
✗ Branch 72 not taken.
✓ Branch 72 taken 1 time.
✗ Branch 73 not taken.
✓ Branch 73 taken 1 time.
✗ Branch 73 not taken.
✓ Branch 73 taken 1 time.
✓ Branch 73 taken 3 times.
✓ Branch 73 taken 1 time.
✓ Branch 74 taken 1 time.
✗ Branch 74 not taken.
✗ Branch 74 not taken.
✓ Branch 75 taken 1 time.
✗ Branch 76 not taken.
✗ Branch 76 not taken.
✓ Branch 77 taken 1 time.
✓ Branch 77 taken 1 time.
✓ Branch 77 taken 2 times.
✗ Branch 78 not taken.
✗ Branch 78 not taken.
✗ Branch 78 not taken.
✓ Branch 79 taken 1 time.
✓ Branch 79 taken 1 time.
✗ Branch 80 not taken.
✓ Branch 80 taken 1 time.
✓ Branch 81 taken 1 time.
✓ Branch 83 taken 1 time.
✓ Branch 83 taken 1 time.
✗ Branch 84 not taken.
✗ Branch 84 not taken.
✗ Branch 84 not taken.
✓ Branch 85 taken 4 times.
✓ Branch 85 taken 1 time.
✗ Branch 85 not taken.
✗ Branch 86 not taken.
✓ Branch 86 taken 1 time.
✗ Branch 86 not taken.
✓ Branch 86 taken 1 time.
✓ Branch 87 taken 1 time.
✗ Branch 87 not taken.
✗ Branch 88 not taken.
✓ Branch 89 taken 1 time.
✓ Branch 89 taken 1 time.
✓ Branch 89 taken 1 time.
✗ Branch 90 not taken.
✗ Branch 90 not taken.
✓ Branch 90 taken 1 time.
✗ Branch 91 not taken.
✓ Branch 91 taken 1 time.
✗ Branch 92 not taken.
✓ Branch 93 taken 1 time.
✗ Branch 94 not taken.
✓ Branch 94 taken 1 time.
✗ Branch 95 not taken.
✓ Branch 95 taken 1 time.
✗ Branch 96 not taken.
✓ Branch 98 taken 1 time.
✓ Branch 99 taken 1 time.
✗ Branch 99 not taken.
✓ Branch 99 taken 1 time.
✗ Branch 100 not taken.
✗ Branch 100 not taken.
✓ Branch 100 taken 1000 times.
✓ Branch 100 taken 1 time.
✗ Branch 101 not taken.
✗ Branch 101 not taken.
✓ Branch 101 taken 1 time.
✗ Branch 102 not taken.
✓ Branch 102 taken 1 time.
✗ Branch 102 not taken.
✓ Branch 103 taken 1 time.
✗ Branch 103 not taken.
✓ Branch 103 taken 1 time.
✗ Branch 104 not taken.
✗ Branch 105 not taken.
✓ Branch 106 taken 1 time.
✓ Branch 106 taken 1 time.
✓ Branch 106 taken 1 time.
✗ Branch 106 not taken.
✗ Branch 107 not taken.
✓ Branch 107 taken 1 time.
✗ Branch 107 not taken.
✗ Branch 107 not taken.
✓ Branch 107 taken 2 times.
✗ Branch 108 not taken.
✗ Branch 108 not taken.
✓ Branch 108 taken 1 time.
✗ Branch 108 not taken.
✓ Branch 109 taken 1 time.
✓ Branch 110 taken 1 time.
✓ Branch 110 taken 1 time.
✗ Branch 110 not taken.
✗ Branch 111 not taken.
✓ Branch 111 taken 1 time.
✗ Branch 111 not taken.
✓ Branch 111 taken 1 time.
✗ Branch 111 not taken.
✓ Branch 112 taken 1 time.
✗ Branch 112 not taken.
✓ Branch 112 taken 2 times.
✗ Branch 113 not taken.
✓ Branch 114 taken 1 time.
✗ Branch 115 not taken.
✓ Branch 115 taken 1 time.
✓ Branch 116 taken 1 time.
✓ Branch 116 taken 1 time.
✓ Branch 117 taken 1 time.
✗ Branch 117 not taken.
✗ Branch 118 not taken.
✓ Branch 118 taken 1 time.
✗ Branch 119 not taken.
✗ Branch 119 not taken.
✗ Branch 119 not taken.
✓ Branch 120 taken 1 time.
✓ Branch 120 taken 4 times.
✓ Branch 120 taken 2 times.
✓ Branch 121 taken 1 time.
✓ Branch 121 taken 1 time.
✗ Branch 121 not taken.
✗ Branch 122 not taken.
✓ Branch 122 taken 1 time.
✗ Branch 122 not taken.
✗ Branch 122 not taken.
✓ Branch 123 taken 1 time.
✓ Branch 123 taken 1 time.
✗ Branch 124 not taken.
✓ Branch 124 taken 1 time.
✓ Branch 125 taken 1 time.
✗ Branch 125 not taken.
✓ Branch 125 taken 1 time.
✗ Branch 125 not taken.
✓ Branch 126 taken 1 time.
✗ Branch 126 not taken.
✗ Branch 127 not taken.
✗ Branch 127 not taken.
✓ Branch 128 taken 1 time.
✓ Branch 128 taken 1 time.
✓ Branch 129 taken 1 time.
✗ Branch 130 not taken.
✗ Branch 131 not taken.
✓ Branch 131 taken 64 times.
✓ Branch 132 taken 1 time.
✓ Branch 132 taken 1 time.
✗ Branch 132 not taken.
✗ Branch 133 not taken.
✓ Branch 133 taken 1 time.
✗ Branch 134 not taken.
✗ Branch 135 not taken.
✓ Branch 135 taken 64 times.
✓ Branch 136 taken 1 time.
✗ Branch 136 not taken.
✗ Branch 136 not taken.
✓ Branch 137 taken 1 time.
✓ Branch 137 taken 1 time.
✗ Branch 138 not taken.
✗ Branch 138 not taken.
✓ Branch 139 taken 1 time.
✗ Branch 139 not taken.
✓ Branch 140 taken 1 time.
✓ Branch 140 taken 1 time.
✗ Branch 141 not taken.
✓ Branch 141 taken 1 time.
✗ Branch 141 not taken.
✓ Branch 142 taken 1 time.
✗ Branch 142 not taken.
✗ Branch 144 not taken.
✓ Branch 145 taken 1 time.
✓ Branch 145 taken 1 time.
✗ Branch 146 not taken.
✗ Branch 146 not taken.
✓ Branch 147 taken 1 time.
✗ Branch 147 not taken.
✓ Branch 147 taken 1 time.
✓ Branch 148 taken 1 time.
✗ Branch 148 not taken.
✗ Branch 150 not taken.
✓ Branch 151 taken 1 time.
✓ Branch 151 taken 1 time.
✗ Branch 152 not taken.
✓ Branch 152 taken 1 time.
✗ Branch 153 not taken.
✗ Branch 153 not taken.
✓ Branch 153 taken 1 time.
✗ Branch 153 not taken.
✓ Branch 154 taken 1 time.
✗ Branch 154 not taken.
✓ Branch 154 taken 1 time.
✓ Branch 156 taken 1 time.
✗ Branch 156 not taken.
✗ Branch 156 not taken.
✗ Branch 157 not taken.
✓ Branch 157 taken 1 time.
✓ Branch 157 taken 1 time.
✓ Branch 157 taken 1 time.
✓ Branch 157 taken 1 time.
✗ Branch 158 not taken.
✗ Branch 158 not taken.
✗ Branch 159 not taken.
✗ Branch 159 not taken.
✓ Branch 160 taken 1 time.
✓ Branch 160 taken 1 time.
✓ Branch 160 taken 1 time.
✗ Branch 161 not taken.
✓ Branch 161 taken 1 time.
✓ Branch 161 taken 1 time.
✓ Branch 161 taken 1 time.
✗ Branch 162 not taken.
✗ Branch 162 not taken.
✗ Branch 162 not taken.
✗ Branch 165 not taken.
✓ Branch 165 taken 1 time.
✓ Branch 165 taken 1 time.
✓ Branch 166 taken 1 time.
✗ Branch 166 not taken.
✗ Branch 166 not taken.
✓ Branch 167 taken 1 time.
✗ Branch 168 not taken.
✗ Branch 168 not taken.
✓ Branch 169 taken 1 time.
✓ Branch 169 taken 1 time.
✗ Branch 170 not taken.
✓ Branch 171 taken 1 time.
✗ Branch 172 not taken.
✗ Branch 173 not taken.
✓ Branch 173 taken 1 time.
✓ Branch 174 taken 1 time.
✗ Branch 174 not taken.
✓ Branch 175 taken 1 time.
✗ Branch 176 not taken.
✗ Branch 176 not taken.
✗ Branch 176 not taken.
✓ Branch 177 taken 1 time.
✓ Branch 177 taken 1 time.
✓ Branch 177 taken 1 time.
✗ Branch 178 not taken.
✗ Branch 179 not taken.
✓ Branch 180 taken 1 time.
✓ Branch 181 taken 1 time.
✗ Branch 182 not taken.
✗ Branch 182 not taken.
✓ Branch 183 taken 1 time.
✗ Branch 185 not taken.
✓ Branch 186 taken 1 time.
✗ Branch 188 not taken.
✓ Branch 189 taken 1 time.
✓ Branch 189 taken 1 time.
✓ Branch 189 taken 1 time.
✗ Branch 190 not taken.
✗ Branch 190 not taken.
✓ Branch 193 taken 1 time.
✗ Branch 194 not taken.
✓ Branch 197 taken 1 time.
✓ Branch 197 taken 1 time.
✓ Branch 197 taken 1 time.
✗ Branch 198 not taken.
✗ Branch 198 not taken.
✗ Branch 198 not taken.
✓ Branch 199 taken 1 time.
✗ Branch 200 not taken.
✓ Branch 201 taken 1 time.
✓ Branch 201 taken 1 time.
✓ Branch 201 taken 1 time.
✗ Branch 202 not taken.
✗ Branch 202 not taken.
✗ Branch 202 not taken.
✓ Branch 203 taken 1 time.
✗ Branch 204 not taken.
✓ Branch 205 taken 1 time.
✓ Branch 205 taken 1 time.
✓ Branch 205 taken 1 time.
✗ Branch 206 not taken.
✗ Branch 206 not taken.
✗ Branch 206 not taken.
✓ Branch 207 taken 1 time.
✗ Branch 208 not taken.
✓ Branch 209 taken 1 time.
✗ Branch 210 not taken.
✓ Branch 211 taken 1 time.
✗ Branch 212 not taken.
✓ Branch 213 taken 1 time.
✗ Branch 214 not taken.
✓ Branch 215 taken 1 time.
✗ Branch 216 not taken.
✗ Branch 216 not taken.
✓ Branch 217 taken 1 time.
✓ Branch 217 taken 1 time.
✗ Branch 218 not taken.
✓ Branch 219 taken 1 time.
✗ Branch 220 not taken.
✓ Branch 221 taken 1 time.
✗ Branch 222 not taken.
✗ Branch 224 not taken.
✗ Branch 224 not taken.
✓ Branch 225 taken 1 time.
✓ Branch 225 taken 5 times.
✓ Branch 225 taken 1 time.
✗ Branch 226 not taken.
✗ Branch 226 not taken.
✓ Branch 227 taken 1 time.
✗ Branch 227 not taken.
✓ Branch 228 taken 1 time.
✗ Branch 229 not taken.
✓ Branch 229 taken 1 time.
✓ Branch 230 taken 1 time.
✗ Branch 230 not taken.
✗ Branch 230 not taken.
✓ Branch 231 taken 1 time.
✗ Branch 232 not taken.
✓ Branch 233 taken 1 time.
✓ Branch 233 taken 1 time.
✗ Branch 233 not taken.
✗ Branch 234 not taken.
✓ Branch 234 taken 1 time.
✗ Branch 235 not taken.
✓ Branch 236 taken 1 time.
✗ Branch 236 not taken.
✓ Branch 237 taken 1 time.
✗ Branch 238 not taken.
✓ Branch 239 taken 1 time.
✓ Branch 241 taken 1 time.
✗ Branch 242 not taken.
✗ Branch 244 not taken.
✓ Branch 245 taken 1 time.
✓ Branch 258 taken 1 time.
✗ Branch 259 not taken.
✗ Branch 261 not taken.
✓ Branch 262 taken 1 time.
✗ Branch 264 not taken.
✓ Branch 265 taken 1 time.
✗ Branch 267 not taken.
✓ Branch 268 taken 1 time.
✗ Branch 270 not taken.
✓ Branch 271 taken 1 time.
✓ Branch 279 taken 1 time.
✗ Branch 280 not taken.
✗ Branch 282 not taken.
✓ Branch 283 taken 1 time.
✗ Branch 285 not taken.
✓ Branch 286 taken 1 time.
✗ Branch 288 not taken.
✓ Branch 289 taken 1 time.
14458 class ERNIE_API Path {
23 public:
24
10/15
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 440 times.
✓ Branch 1 taken 80 times.
✓ Branch 2 taken 1 time.
✓ Branch 2 taken 1 time.
✓ Branch 4 taken 1 time.
✓ Branch 4 taken 146 times.
✗ Branch 5 not taken.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 time.
✗ Branch 11 not taken.
✗ Branch 13 not taken.
✓ Branch 14 taken 1 time.
683 Path() = default;
25 /// @param text An absolute path of valid names.
26 /// @throws std::invalid_argument If it is not.
27 Path(std::string_view text);
28 729 Path(const char* text) : Path(std::string_view(text)) {}
29 8460 Path(const std::string& text) : Path(std::string_view(text)) {}
30
31 static Path Root();
32 /// @return Whether `name` is a valid prim name: a letter or underscore, then letters, digits
33 /// and underscores.
34 static bool IsValidName(std::string_view name);
35
36 251 const std::string& String() const {
37
24/46
<unknown function 22>:
✓ Branch 0 taken 1 time.
✓ Branch 1 taken 8 times.
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 time.
✓ Branch 4 taken 4 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✓ Branch 7 taken 13 times.
✓ Branch 7 taken 1 time.
✓ Branch 7 taken 2 times.
✗ Branch 8 not taken.
✗ Branch 8 not taken.
✗ Branch 8 not taken.
✗ Branch 9 not taken.
✗ Branch 10 not taken.
<unknown function 36>:
✓ Branch 1 taken 21 times.
✗ Branch 2 not taken.
ernie::Path::Path(char const*):
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
ernie::Path::Path(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 1 taken 27 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 3 times.
✓ Branch 4 taken 1 time.
✗ Branch 5 not taken.
✗ Branch 5 not taken.
✓ Branch 8 taken 8 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 2 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 2 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 89 times.
✗ Branch 18 not taken.
✓ Branch 20 taken 1 time.
✗ Branch 21 not taken.
ernie::Path::String[abi:cxx11]() const:
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
✓ Branch 3 taken 17 times.
✓ Branch 4 taken 2 times.
✗ Branch 5 not taken.
✓ Branch 6 taken 8 times.
✗ Branch 7 not taken.
7333 return text_;
38 }
39 10390 bool IsEmpty() const {
40
13/18
<unknown function 22>:
✓ Branch 0 taken 35 times.
✓ Branch 1 taken 544 times.
✓ Branch 2 taken 2739 times.
✗ Branch 3 not taken.
<unknown function 39>:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::Path::Path(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✗ Branch 0 not taken.
✓ Branch 1 taken 3938 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 3112 times.
✓ Branch 4 taken 5 times.
✓ Branch 5 taken 1 time.
✓ Branch 6 taken 4 times.
✓ Branch 7 taken 1 time.
✓ Branch 8 taken 3 times.
✓ Branch 9 taken 1 time.
ernie::Path::String[abi:cxx11]() const:
✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
10386 return text_.empty();
41 }
42 3090 bool IsRoot() const {
43
13/14
<unknown function 22>:
✓ Branch 0 taken 32 times.
✓ Branch 1 taken 25 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 257 times.
✓ Branch 4 taken 1 time.
✓ Branch 5 taken 2738 times.
ernie::Path::Path(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 1 time.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 1 time.
ernie::Path::String[abi:cxx11]() const:
✓ Branch 0 taken 25 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 3 times.
✓ Branch 3 taken 1 time.
3090 return text_ == "/";
44 }
45 /// @return The last name; empty for the root and the empty path.
46 std::string_view Name() const;
47 /// @return The parent; empty for the root and the empty path.
48 Path Parent() const;
49 /// @throws std::invalid_argument If this path is empty or `name` is invalid.
50 Path Child(std::string_view name) const;
51 /// @return Whether this path is `ancestor` or lies below it.
52 bool HasPrefix(const Path& ancestor) const;
53
54 750 auto operator<=>(const Path&) const = default;
55
56 private:
57
12/34
<unknown function 22>:
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::Path::Path(char const*):
✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 6 taken 1 time.
✗ Branch 7 not taken.
ernie::Path::Path(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 0 taken 8 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 2 times.
ernie::Path::String[abi:cxx11]() const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✓ Branch 6 taken 2 times.
✗ Branch 7 not taken.
ernie::Path::operator<=>(ernie::Path const&) const:
✓ Branch 0 taken 287 times.
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 432 times.
✗ Branch 5 not taken.
751 std::string text_;
58 };
59
60 /// An interned name; 0 is no name.
61 using Token = std::uint32_t;
62
63 /// @brief Interned strings: each distinct name is stored once and compared as a number.
64 1 class TokenTable {
65 public:
66 TokenTable();
67 /// @return The name's token, adding it if new.
68 Token Intern(std::string_view text);
69 /// @return The name's token, if interned.
70 std::optional<Token> Find(std::string_view text) const;
71 14348 std::string_view Text(Token token) const {
72 14348 return texts_[token];
73 }
74 ✗ void Reserve(std::size_t count) {
75 ✗ index_.Reserve(count);
76 }
77
78 private:
79 std::deque<std::string> texts_;
80 HashIndex index_;
81 };
82
83 /// An interned path, a node of a `PathTable`; 0 is the root.
84 using PathId = std::uint32_t;
85 inline constexpr PathId kRootPath = 0;
86 inline constexpr PathId kNoPath = std::numeric_limits<PathId>::max();
87
88 /// @brief Every path the scene has named, as (parent, name) nodes with their children in order.
89 /// Paths are never removed, so ids stay valid; prims come and go on them.
90 class PathTable {
91 public:
92 PathTable();
93
94 /// @return The path's id, adding it and its ancestors if new.
95 PathId Intern(const Path& path);
96 /// @return The child's id, adding it if new.
97 PathId Child(PathId parent, Token name);
98 4138 PathId Child(PathId parent, std::string_view name) {
99 4138 return Child(parent, names_.Intern(name));
100 }
101 /// @return The path's id, if interned.
102 std::optional<PathId> Find(const Path& path) const;
103
104 Path ToPath(PathId id) const;
105 34898 PathId Parent(PathId id) const {
106
3/4
ernie::PathTable::Child(unsigned int, std::basic_string_view<char, std::char_traits<char> >):
✓ Branch 1 taken 1 time.
✗ Branch 2 not taken.
ernie::TokenTable::Text(unsigned int) const:
✓ Branch 0 taken 19 times.
✓ Branch 1 taken 6 times.
34898 return nodes_[id].parent;
107 }
108 Token Name(PathId id) const {
109 return nodes_[id].name;
110 }
111 1 PathId FirstChild(PathId id) const {
112 1 return nodes_[id].firstChild;
113 }
114 2 PathId NextSibling(PathId id) const {
115 2 return nodes_[id].nextSibling;
116 }
117 /// Calls `visit(child)` for each child of `id`, in the order they were added.
118 30026 template <typename Visit> void ForEachChild(PathId id, const Visit& visit) const {
119
14/36
void ernie::PathTable::ForEachChild<ernie::(anonymous namespace)::Resolver<double>::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1}>(unsigned int, ernie::(anonymous namespace)::Resolver<double>::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1} const&) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
void ernie::PathTable::ForEachChild<ernie::(anonymous namespace)::Resolver<ernie::Target>::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1}>(unsigned int, ernie::(anonymous namespace)::Resolver<ernie::Target>::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1} const&) const:
✓ Branch 0 taken 141 times.
✓ Branch 1 taken 697 times.
void ernie::PathTable::ForEachChild<ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1}>(unsigned int, ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1} const&) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
void ernie::PathTable::ForEachChild<ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1}>(unsigned int, ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1} const&) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
void ernie::PathTable::ForEachChild<ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1}>(unsigned int, ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1} const&) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
void ernie::PathTable::ForEachChild<ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1}>(unsigned int, ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1} const&) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
void ernie::PathTable::ForEachChild<ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1}>(unsigned int, ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1} const&) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
void ernie::PathTable::ForEachChild<ernie::(anonymous namespace)::Resolver<int>::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1}>(unsigned int, ernie::(anonymous namespace)::Resolver<int>::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1} const&) const:
✓ Branch 0 taken 141 times.
✓ Branch 1 taken 9151 times.
void ernie::PathTable::ForEachChild<ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1}>(unsigned int, ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1} const&) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
void ernie::PathTable::ForEachChild<ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1}>(unsigned int, ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1} const&) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
void ernie::PathTable::ForEachChild<ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1}>(unsigned int, ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1} const&) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
void ernie::PathTable::ForEachChild<ernie::(anonymous namespace)::Resolver<unsigned char>::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1}>(unsigned int, ernie::(anonymous namespace)::Resolver<unsigned char>::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1} const&) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
void ernie::PathTable::ForEachChild<ernie::(anonymous namespace)::Resolver<unsigned int>::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1}>(unsigned int, ernie::(anonymous namespace)::Resolver<unsigned int>::Subtree(unsigned int, ernie::BitSet&)::{lambda(unsigned int)#1} const&) const:
✓ Branch 0 taken 288 times.
✓ Branch 1 taken 18308 times.
void ernie::PathTable::ForEachChild<ernie::Scene::AddTo(ernie::Box&, unsigned int, glm::mat<4, 4, double, (glm::qualifier)0> const&, bool) const::{lambda(unsigned int)#1}>(unsigned int, ernie::Scene::AddTo(ernie::Box&, unsigned int, glm::mat<4, 4, double, (glm::qualifier)0> const&, bool) const::{lambda(unsigned int)#1} const&) const:
✓ Branch 0 taken 42 times.
✓ Branch 1 taken 42 times.
void ernie::PathTable::ForEachChild<ernie::Scene::Children(ernie::Path const&) const::{lambda(unsigned int)#1}>(unsigned int, ernie::Scene::Children(ernie::Path const&) const::{lambda(unsigned int)#1} const&) const:
✓ Branch 0 taken 60 times.
✓ Branch 1 taken 57 times.
void ernie::PathTable::ForEachChild<ernie::Scene::Remove(ernie::Path const&)::{lambda(unsigned int)#1}>(unsigned int, ernie::Scene::Remove(ernie::Path const&)::{lambda(unsigned int)#1} const&) const:
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 261 times.
void ernie::PathTable::ForEachChild<ernie::TransformGraph::AdoptDescendants(unsigned int)::{lambda(unsigned int)#1}>(unsigned int, ernie::TransformGraph::AdoptDescendants(unsigned int)::{lambda(unsigned int)#1} const&) const:
✓ Branch 0 taken 352 times.
✓ Branch 1 taken 1510 times.
void ernie::PathTable::ForEachChild<ernie::TransformGraph::AdoptDescendants(unsigned int)::{lambda(unsigned int)#2}>(unsigned int, ernie::TransformGraph::AdoptDescendants(unsigned int)::{lambda(unsigned int)#2} const&) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
31058 for (PathId child = nodes_[id].firstChild; child != kNoPath;
120 1032 child = nodes_[child].nextSibling) {
121 1032 visit(child);
122 }
123 30026 }
124 /// @return Whether `id` is `ancestor` or lies below it.
125 bool HasPrefix(PathId id, PathId ancestor) const;
126
127 3071 std::size_t Size() const {
128
2/4
<unknown function 22>:
✗ Branch 0 not taken.
✓ Branch 1 taken 2823 times.
<unknown function 39>:
✓ Branch 1 taken 248 times.
✗ Branch 2 not taken.
3071 return nodes_.size();
129 }
130 /// Makes room for `count` more paths and as many new names.
131 void Reserve(std::size_t count);
132 22181 TokenTable& Names() {
133
13/26
<unknown function 39>:
✓ Branch 3 taken 248 times.
✗ Branch 4 not taken.
ernie::Path::Path(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&):
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 time.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 time.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 time.
✗ Branch 11 not taken.
✓ Branch 13 taken 1 time.
✗ Branch 14 not taken.
✓ Branch 16 taken 1 time.
✗ Branch 17 not taken.
ernie::PathTable::Child(unsigned int, std::basic_string_view<char, std::char_traits<char> >):
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::TokenTable::Text(unsigned int) const:
✓ Branch 3 taken 2 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 70 times.
✗ Branch 7 not taken.
✓ Branch 8 taken 2794 times.
✓ Branch 9 taken 245 times.
✓ Branch 11 taken 104 times.
✗ Branch 12 not taken.
✓ Branch 15 taken 233 times.
✗ Branch 16 not taken.
22179 return names_;
134 }
135 30060 const TokenTable& Names() const {
136
1/2
✓ Branch 1 taken 3358 times.
✗ Branch 2 not taken.
30060 return names_;
137 }
138
139 private:
140 243 struct Node {
141 PathId parent = kNoPath;
142 Token name = 0;
143 PathId firstChild = kNoPath;
144 PathId lastChild = kNoPath;
145 PathId nextSibling = kNoPath;
146 };
147 static std::uint64_t Hash(PathId parent, Token name);
148
149 TokenTable names_;
150 std::vector<Node> nodes_;
151 HashIndex children_;
152 };
153
154 } // namespace ernie
155
156 template <> struct std::hash<ernie::Path> {
157 17 std::size_t operator()(const ernie::Path& path) const noexcept {
158
4/8
ernie::Path::Path(char const*):
✓ Branch 1 taken 4 times.
✓ Branch 2 taken 2 times.
ernie::Path::String[abi:cxx11]() const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::PathTable::Child(unsigned int, std::basic_string_view<char, std::char_traits<char> >):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 5 taken 2 times.
✓ Branch 6 taken 1 time.
17 return std::hash<std::string>()(path.String());
159 }
160 };
161