tp: fix GetNonNull function for dense nullable vector
Change-Id: I375d26b286540c3878cc38ee524fb16e475d7c74
diff --git a/src/trace_processor/containers/nullable_vector.h b/src/trace_processor/containers/nullable_vector.h
index b9932d2..2a623c6 100644
--- a/src/trace_processor/containers/nullable_vector.h
+++ b/src/trace_processor/containers/nullable_vector.h
@@ -104,11 +104,12 @@
// GetNonNull(2) = 4
// ...
T GetNonNull(uint32_t ordinal) const {
- // TODO(lalitm): the semtantics of this method really doesn't make
- // sense with dense mode. Reevaluate what we should do in that case.
- PERFETTO_DCHECK(mode_ == Mode::kSparse);
- PERFETTO_DCHECK(ordinal < data_.size());
- return data_[ordinal];
+ if (mode_ == Mode::kDense) {
+ return data_[valid_.Get(ordinal)];
+ } else {
+ PERFETTO_DCHECK(ordinal < data_.size());
+ return data_[ordinal];
+ }
}
// Adds the given value to the NullableVector.
diff --git a/src/trace_processor/containers/nullable_vector_unittest.cc b/src/trace_processor/containers/nullable_vector_unittest.cc
index e9aabbe..37a8b78 100644
--- a/src/trace_processor/containers/nullable_vector_unittest.cc
+++ b/src/trace_processor/containers/nullable_vector_unittest.cc
@@ -86,9 +86,16 @@
ASSERT_EQ(sv.Get(3), 3);
ASSERT_EQ(sv.Get(4), base::nullopt);
+ ASSERT_EQ(sv.GetNonNull(0), 0);
+ ASSERT_EQ(sv.GetNonNull(1), 2);
+ ASSERT_EQ(sv.GetNonNull(2), 3);
+
sv.Set(1, 1);
ASSERT_EQ(sv.Get(1), 1);
ASSERT_EQ(sv.Get(2), 2);
+
+ ASSERT_EQ(sv.GetNonNull(1), 1);
+ ASSERT_EQ(sv.GetNonNull(2), 2);
}
} // namespace