#ifndef PULSEVIEW_PV_DATA_DECODE_ROWDATA_HPP
#define PULSEVIEW_PV_DATA_DECODE_ROWDATA_HPP
+#include <unordered_map>
#include <vector>
-#include "annotation.hpp"
+#include <QtGlobal>
+#include <QHash>
+#include <QString>
+
+#include <libsigrokdecode/libsigrokdecode.h>
+
+#include <pv/data/decode/annotation.hpp>
+
+using std::deque;
+using std::unordered_map;
+
+#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
+namespace std {
+ template<> struct hash<QString> {
+ std::size_t operator()(const QString& s) const noexcept {
+ return (size_t) qHash(s);
+ }
+ };
+}
+#endif
namespace pv {
namespace data {
namespace decode {
+class Row;
+
class RowData
{
public:
- RowData() = default;
+ RowData(Row* row);
+
+ const Row* row() const;
-public:
uint64_t get_max_sample() const;
+ uint64_t get_annotation_count() const;
+
/**
- * Extracts sorted annotations between two period into a vector.
+ * Extracts annotations between the given sample range into a vector.
+ * Note: The annotations are unsorted and only annotations that fully
+ * fit into the sample range are considered.
*/
- void get_annotation_subset(
- std::vector<pv::data::decode::Annotation> &dest,
+ void get_annotation_subset(deque<const pv::data::decode::Annotation*> &dest,
uint64_t start_sample, uint64_t end_sample) const;
- void push_annotation(const Annotation &a);
+ const deque<Annotation>& annotations() const;
+
+ const Annotation* emplace_annotation(srd_proto_data *pdata);
private:
- std::vector<Annotation> annotations_;
+ deque<Annotation> annotations_;
+ unordered_map<QString, vector<QString> > ann_texts_; // unordered_map since pointers must not change
+ Row* row_;
+ uint64_t prev_ann_start_sample_;
};
-}
-} // data
-} // pv
+} // namespace decode
+} // namespace data
+} // namespace pv
#endif // PULSEVIEW_PV_DATA_DECODE_ROWDATA_HPP