GCC Code Coverage Report


ernie/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
120 / 454
26.4%
Branches:
96 / 534
18.0%
Functions:
13 / 43, 1 excl
30.2%

scene/inherit.cpp
Line Branch Exec Source
1 // SPDX-License-Identifier: BSD-3-Clause
2 /// @file inherit.cpp
3 /// @brief Resolving inherited attributes from the nearest authoring ancestor into their resolved
4 /// columns, for only the subtrees whose authored values or prims changed.
5 #include "ernie/scene/convert.h"
6 #include "ernie/scene/scene.h"
7 #include "ernie/util/profiler.h"
8
9 #include <algorithm>
10 #include <concepts>
11
12 namespace ernie {
13 namespace {
14
15 /// @brief One inherited attribute resolving over the store.
16 ✗ template <typename T> struct Resolver {
17 PrimStore& store;
18 AttributeId attribute;
19 AttributeId resolved;
20 T fallback;
21 /// The "inherited" token, which authors nothing.
22 Token inherited;
23
24 /// @return What the prim's own value resolves to: null when it doesn't author one.
25 28368 const T* Own(PrimId prim) const {
26 18448 const T* own = store.Get<T>(prim, attribute);
27 if constexpr (std::same_as<T, Token>) {
28
4/4
✓ Branch 0 taken 6 times.
✓ Branch 1 taken 18442 times.
✓ Branch 2 taken 1 time.
✓ Branch 3 taken 5 times.
18448 return own != nullptr && *own == inherited ? nullptr : own;
29 }
30 return own;
31 }
32
33 /// @return The value `path` inherits from its ancestors.
34 27594 T Above(PathId path) const {
35 27594 const PathTable& paths = store.Paths();
36
6/26
ernie::(anonymous namespace)::Resolver<double>::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<ernie::Target>::Above(unsigned int) const:
✓ Branch 0 taken 3 times.
✓ Branch 1 taken 556 times.
ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<int>::Above(unsigned int) const:
✓ Branch 0 taken 67 times.
✓ Branch 1 taken 8945 times.
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<unsigned char>::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<unsigned int>::Above(unsigned int) const:
✓ Branch 0 taken 134 times.
✓ Branch 1 taken 18026 times.
27731 for (PathId above = paths.Parent(path); above != kRootPath; above = paths.Parent(above)) {
37 204 const std::optional<PrimId> prim = store.Find(above);
38
6/52
ernie::(anonymous namespace)::Resolver<double>::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<ernie::Target>::Above(unsigned int) const:
✓ Branch 0 taken 3 times.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 3 times.
ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<int>::Above(unsigned int) const:
✓ Branch 0 taken 67 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 67 times.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<unsigned char>::Above(unsigned int) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<unsigned int>::Above(unsigned int) const:
✓ Branch 0 taken 134 times.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✓ Branch 4 taken 134 times.
204 if (const T* own = prim ? Own(*prim) : nullptr) {
39 67 return *own;
40 }
41 }
42 27527 return fallback;
43 }
44
45 /// Resolves the subtree at `root`, descending past a prim only while its value changes or it
46 /// is one of `roots`, which it clears as it reaches them.
47 27594 void Subtree(PathId root, BitSet& roots) {
48
0/12
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
27594 std::vector<std::pair<PathId, T>> pending{{root, Above(root)}};
49
6/26
ernie::(anonymous namespace)::Resolver<double>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<ernie::Target>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 0 taken 697 times.
✓ Branch 1 taken 556 times.
ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 0 taken 9153 times.
✓ Branch 1 taken 9012 times.
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<unsigned char>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<unsigned int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 0 taken 18314 times.
✓ Branch 1 taken 18026 times.
55758 while (!pending.empty()) {
50 28164 const auto [path, above] = std::move(pending.back());
51 28164 pending.pop_back();
52
3/26
ernie::(anonymous namespace)::Resolver<double>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<ernie::Target>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 697 times.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 9153 times.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<unsigned char>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<unsigned int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 18314 times.
✗ Branch 2 not taken.
28164 const std::optional<PrimId> prim = store.Find(path);
53
3/26
ernie::(anonymous namespace)::Resolver<double>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<ernie::Target>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✓ Branch 1 taken 697 times.
ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<int>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✓ Branch 1 taken 9153 times.
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<unsigned char>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<unsigned int>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✓ Branch 1 taken 18314 times.
28164 if (!prim) {
54 ✗ continue;
55 }
56 28164 const bool isRoot = roots.Test(path);
57
3/26
ernie::(anonymous namespace)::Resolver<double>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<ernie::Target>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 2 taken 697 times.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 2 taken 9153 times.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<unsigned char>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<unsigned int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 2 taken 18314 times.
✗ Branch 3 not taken.
28164 roots.Set(path, false);
58
3/26
ernie::(anonymous namespace)::Resolver<double>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<ernie::Target>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 697 times.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 9153 times.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<unsigned char>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<unsigned int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 18314 times.
✗ Branch 2 not taken.
28164 const T* own = Own(*prim);
59
6/32
ernie::(anonymous namespace)::Resolver<double>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<ernie::Target>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 0 taken 695 times.
✓ Branch 1 taken 2 times.
ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 0 taken 4 times.
✓ Branch 1 taken 9149 times.
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
ernie::(anonymous namespace)::Resolver<unsigned char>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 0 not taken.
✗ Branch 1 not taken.
ernie::(anonymous namespace)::Resolver<unsigned int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 0 taken 5 times.
✓ Branch 1 taken 18309 times.
28164 const T value = own != nullptr ? *own : above;
60 // Prims without the column (typeless ones, materials) pass the value through.
61
3/26
ernie::(anonymous namespace)::Resolver<double>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<ernie::Target>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 697 times.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 9153 times.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<unsigned char>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<unsigned int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 18314 times.
✗ Branch 2 not taken.
28164 const bool stored = store.GetBucket(store.PrimBucket(*prim)).Find(resolved) != nullptr;
62 // An unchanged prim's descendants are unchanged too, unless they are roots themselves.
63
14/78
ernie::(anonymous namespace)::Resolver<double>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
ernie::(anonymous namespace)::Resolver<ernie::Target>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 697 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 690 times.
✓ Branch 4 taken 7 times.
✓ Branch 5 taken 690 times.
✗ Branch 6 not taken.
ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
ernie::(anonymous namespace)::Resolver<int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 9153 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 9043 times.
✓ Branch 4 taken 110 times.
✓ Branch 5 taken 9041 times.
✓ Branch 6 taken 2 times.
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
ernie::(anonymous namespace)::Resolver<unsigned char>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
ernie::(anonymous namespace)::Resolver<unsigned int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 18314 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 18304 times.
✓ Branch 4 taken 10 times.
✓ Branch 5 taken 18298 times.
✓ Branch 6 taken 6 times.
28164 if (store.Derive(*prim, resolved, value) || isRoot || !stored) {
64
3/26
ernie::(anonymous namespace)::Resolver<double>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<ernie::Target>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 697 times.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 9151 times.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<unsigned char>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<unsigned int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 18308 times.
✗ Branch 2 not taken.
28156 store.Paths().ForEachChild(
65
3/26
ernie::(anonymous namespace)::Resolver<double>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<ernie::Target>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 697 times.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::mat<4, 4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::qua<double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<2, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<3, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<glm::vec<4, double, (glm::qualifier)0> >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 9151 times.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<unsigned char>::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 1 not taken.
✗ Branch 2 not taken.
ernie::(anonymous namespace)::Resolver<unsigned int>::Subtree(unsigned int, ernie::BitSet&):
✓ Branch 1 taken 18308 times.
✗ Branch 2 not taken.
28156 path, [&](PathId child) { pending.emplace_back(child, value); });
66 }
67 }
68
0/6
ernie::(anonymous namespace)::Resolver<std::vector<ernie::Target, std::allocator<ernie::Target> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<float, std::allocator<float> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
ernie::(anonymous namespace)::Resolver<std::vector<unsigned int, std::allocator<unsigned int> > >::Subtree(unsigned int, ernie::BitSet&):
✗ Branch 2 not taken.
✗ Branch 3 not taken.
27594 }
69 };
70
71 /// @return The paths of the prims whose subtrees resolve `attribute` again: those added or with
72 /// it changed.
73 248 BitSet Roots(const PrimStore& store, const ChangeSet& changes, AttributeId attribute) {
74 248 BitSet roots;
75
1/2
✓ Branch 1 taken 248 times.
✗ Branch 2 not taken.
248 roots.Resize(store.Paths().Size());
76 3894 const auto add = [&](BucketId bucket, std::uint32_t begin, std::uint32_t end) {
77 3646 const Bucket& rows = store.GetBucket(bucket);
78
4/4
✓ Branch 0 taken 356 times.
✓ Branch 1 taken 32476 times.
✓ Branch 2 taken 29186 times.
✓ Branch 3 taken 3646 times.
33188 for (std::uint32_t row = begin; row < std::min(end, rows.Rows()); ++row) {
79 29186 roots.Set(store.PrimPath(rows.prims[row]));
80 }
81 3894 };
82
2/2
✓ Branch 0 taken 5376 times.
✓ Branch 1 taken 248 times.
5624 for (const ChangeSet::Rows& rows : changes.rows) {
83
2/2
✓ Branch 0 taken 3452 times.
✓ Branch 1 taken 1924 times.
5376 if (rows.change.kind == StructuralChange::Kind::Added ||
84 rows.change.kind == StructuralChange::Kind::Reset) {
85
1/2
✓ Branch 1 taken 3452 times.
✗ Branch 2 not taken.
3452 add(rows.bucket, rows.change.row, rows.change.row + rows.change.count);
86 }
87 }
88
2/2
✓ Branch 0 taken 2444 times.
✓ Branch 1 taken 248 times.
2692 for (const ChangeSet::Values& values : changes.values) {
89
2/2
✓ Branch 0 taken 134 times.
✓ Branch 1 taken 2310 times.
2444 if (values.attribute == attribute) {
90
2/2
✓ Branch 0 taken 194 times.
✓ Branch 1 taken 134 times.
328 for (const RowRange range : values.rows) {
91
1/2
✓ Branch 1 taken 194 times.
✗ Branch 2 not taken.
194 add(values.bucket, range.begin, range.end);
92 }
93 }
94 }
95 248 return roots;
96 ✗ }
97
98 } // namespace
99
100 62 void Scene::Resolve() {
101 62 ERNIE_ZONE("Resolve inherited attributes");
102
1/2
✓ Branch 1 taken 62 times.
✗ Branch 2 not taken.
62 const ChangeSet changes = store_.ChangesSince(resolved_);
103
3/4
✓ Branch 1 taken 62 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 248 times.
✓ Branch 4 taken 62 times.
310 for (const AttributeDef* def : InheritedAttributes()) {
104
1/2
✓ Branch 1 taken 248 times.
✗ Branch 2 not taken.
248 const AttributeId attribute = store_.Tokens().Intern(def->name);
105 248 WithColumnType(def->type, [&]<typename T>(std::type_identity<T>) {
106 if constexpr (std::equality_comparable<T> && !std::same_as<T, Tensor>) {
107 744 Resolver<T> resolver{
108
3/26
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<double>(std::type_identity<double>) const:
✗ Branch 2 not taken.
✗ Branch 3 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<ernie::Target>(std::type_identity<ernie::Target>) const:
✓ Branch 2 taken 62 times.
✗ Branch 3 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::mat<4, 4, double, (glm::qualifier)0> >(std::type_identity<glm::mat<4, 4, double, (glm::qualifier)0> >) const:
✗ Branch 2 not taken.
✗ Branch 3 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::qua<double, (glm::qualifier)0> >(std::type_identity<glm::qua<double, (glm::qualifier)0> >) const:
✗ Branch 2 not taken.
✗ Branch 3 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::vec<2, double, (glm::qualifier)0> >(std::type_identity<glm::vec<2, double, (glm::qualifier)0> >) const:
✗ Branch 2 not taken.
✗ Branch 3 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::vec<3, double, (glm::qualifier)0> >(std::type_identity<glm::vec<3, double, (glm::qualifier)0> >) const:
✗ Branch 2 not taken.
✗ Branch 3 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::vec<4, double, (glm::qualifier)0> >(std::type_identity<glm::vec<4, double, (glm::qualifier)0> >) const:
✗ Branch 2 not taken.
✗ Branch 3 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<int>(std::type_identity<int>) const:
✓ Branch 2 taken 62 times.
✗ Branch 3 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<std::vector<ernie::Target, std::allocator<ernie::Target> > >(std::type_identity<std::vector<ernie::Target, std::allocator<ernie::Target> > >) const:
✗ Branch 2 not taken.
✗ Branch 3 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<std::vector<float, std::allocator<float> > >(std::type_identity<std::vector<float, std::allocator<float> > >) const:
✗ Branch 2 not taken.
✗ Branch 3 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<std::vector<unsigned int, std::allocator<unsigned int> > >(std::type_identity<std::vector<unsigned int, std::allocator<unsigned int> > >) const:
✗ Branch 2 not taken.
✗ Branch 3 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<unsigned char>(std::type_identity<unsigned char>) const:
✗ Branch 2 not taken.
✗ Branch 3 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<unsigned int>(std::type_identity<unsigned int>) const:
✓ Branch 2 taken 124 times.
✗ Branch 3 not taken.
248 store_, attribute, store_.Tokens().Intern(ResolvedName(def->name)),
109
5/30
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<double>(std::type_identity<double>) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<ernie::Target>(std::type_identity<ernie::Target>) const:
✓ Branch 1 taken 62 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 62 times.
✗ Branch 4 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::mat<4, 4, double, (glm::qualifier)0> >(std::type_identity<glm::mat<4, 4, double, (glm::qualifier)0> >) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::qua<double, (glm::qualifier)0> >(std::type_identity<glm::qua<double, (glm::qualifier)0> >) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::vec<2, double, (glm::qualifier)0> >(std::type_identity<glm::vec<2, double, (glm::qualifier)0> >) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::vec<3, double, (glm::qualifier)0> >(std::type_identity<glm::vec<3, double, (glm::qualifier)0> >) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::vec<4, double, (glm::qualifier)0> >(std::type_identity<glm::vec<4, double, (glm::qualifier)0> >) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<int>(std::type_identity<int>) const:
✓ Branch 0 taken 62 times.
✗ Branch 1 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<std::vector<ernie::Target, std::allocator<ernie::Target> > >(std::type_identity<std::vector<ernie::Target, std::allocator<ernie::Target> > >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<std::vector<float, std::allocator<float> > >(std::type_identity<std::vector<float, std::allocator<float> > >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<std::vector<unsigned int, std::allocator<unsigned int> > >(std::type_identity<std::vector<unsigned int, std::allocator<unsigned int> > >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<unsigned char>(std::type_identity<unsigned char>) const:
✗ Branch 0 not taken.
✗ Branch 1 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<unsigned int>(std::type_identity<unsigned int>) const:
✓ Branch 1 taken 124 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 124 times.
✗ Branch 4 not taken.
496 ToElement<T>(store_.Paths(), def->fallback).value_or(T{}), inherited_};
110
0/6
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<std::vector<ernie::Target, std::allocator<ernie::Target> > >(std::type_identity<std::vector<ernie::Target, std::allocator<ernie::Target> > >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<std::vector<float, std::allocator<float> > >(std::type_identity<std::vector<float, std::allocator<float> > >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<std::vector<unsigned int, std::allocator<unsigned int> > >(std::type_identity<std::vector<unsigned int, std::allocator<unsigned int> > >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
248 BitSet roots = Roots(store_, changes, attribute);
111 // Ancestors intern first, so most roots are reached from one above them.
112 248 const BitSet start = roots;
113
3/26
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<double>(std::type_identity<double>) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<ernie::Target>(std::type_identity<ernie::Target>) const:
✓ Branch 1 taken 62 times.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::mat<4, 4, double, (glm::qualifier)0> >(std::type_identity<glm::mat<4, 4, double, (glm::qualifier)0> >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::qua<double, (glm::qualifier)0> >(std::type_identity<glm::qua<double, (glm::qualifier)0> >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::vec<2, double, (glm::qualifier)0> >(std::type_identity<glm::vec<2, double, (glm::qualifier)0> >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::vec<3, double, (glm::qualifier)0> >(std::type_identity<glm::vec<3, double, (glm::qualifier)0> >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<glm::vec<4, double, (glm::qualifier)0> >(std::type_identity<glm::vec<4, double, (glm::qualifier)0> >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<int>(std::type_identity<int>) const:
✓ Branch 1 taken 62 times.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<std::vector<ernie::Target, std::allocator<ernie::Target> > >(std::type_identity<std::vector<ernie::Target, std::allocator<ernie::Target> > >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<std::vector<float, std::allocator<float> > >(std::type_identity<std::vector<float, std::allocator<float> > >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<std::vector<unsigned int, std::allocator<unsigned int> > >(std::type_identity<std::vector<unsigned int, std::allocator<unsigned int> > >) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<unsigned char>(std::type_identity<unsigned char>) const:
✗ Branch 1 not taken.
✗ Branch 2 not taken.
auto ernie::Scene::Resolve()::{lambda<typename $T0>(std::type_identity<$T0>)#1}::operator()<unsigned int>(std::type_identity<unsigned int>) const:
✓ Branch 1 taken 124 times.
✗ Branch 2 not taken.
248 start.ForEachRun([&](std::size_t begin, std::size_t end) {
114 for (std::size_t path = begin; path < end; ++path) {
115 if (roots.Test(path)) {
116 resolver.Subtree(static_cast<PathId>(path), roots);
117 }
118 }
119 });
120 248 }
121 248 });
122 }
123 // Its own writes are to resolved columns, which no resolve reads.
124 62 resolved_ = store_.Version();
125 62 }
126
127 } // namespace ernie
128