CMakeLists.txt: adjust cmake build rules for Qt6 support
[pulseview.git] / pv / data / segment.hpp
1 /*
2  * This file is part of the PulseView project.
3  *
4  * Copyright (C) 2017 Soeren Apel <soeren@apelpie.net>
5  * Copyright (C) 2012 Joel Holdsworth <joel@airwebreathe.org.uk>
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #ifndef PULSEVIEW_PV_DATA_SEGMENT_HPP
22 #define PULSEVIEW_PV_DATA_SEGMENT_HPP
23
24 #include "pv/util.hpp"
25
26 #include <atomic>
27 #include <memory>
28 #include <mutex>
29 #include <thread>
30 #include <deque>
31
32 #include <QObject>
33
34 using std::atomic;
35 using std::recursive_mutex;
36 using std::deque;
37
38 namespace SegmentTest {
39 struct SmallSize8Single;
40 struct MediumSize8Single;
41 struct MaxSize8Single;
42 struct MediumSize24Single;
43 struct MediumSize32Single;
44 struct MaxSize32Single;
45 struct MediumSize32Multi;
46 struct MaxSize32Multi;
47 struct MaxSize32MultiAtOnce;
48 struct MaxSize32MultiIterated;
49 }  // namespace SegmentTest
50
51 namespace pv {
52 namespace data {
53
54 typedef struct {
55         uint64_t sample_index, chunk_num, chunk_offs;
56         uint8_t* chunk;
57 } SegmentDataIterator;
58
59 class Segment : public QObject
60 {
61         Q_OBJECT
62
63 private:
64         static const uint64_t MaxChunkSize;
65
66 public:
67         Segment(uint32_t segment_id, uint64_t samplerate, unsigned int unit_size);
68
69         virtual ~Segment();
70
71         uint64_t get_sample_count() const;
72
73         const pv::util::Timestamp& start_time() const;
74
75         double samplerate() const;
76         void set_samplerate(double samplerate);
77
78         unsigned int unit_size() const;
79
80         uint32_t segment_id() const;
81
82         void set_complete();
83         bool is_complete() const;
84
85         void free_unused_memory();
86
87 Q_SIGNALS:
88         void completed();
89
90 protected:
91         void append_single_sample(void *data);
92         void append_samples(void *data, uint64_t samples);
93         const uint8_t* get_raw_sample(uint64_t sample_num) const;
94         void get_raw_samples(uint64_t start, uint64_t count, uint8_t *dest) const;
95
96         SegmentDataIterator* begin_sample_iteration(uint64_t start);
97         void continue_sample_iteration(SegmentDataIterator* it, uint64_t increase);
98         void end_sample_iteration(SegmentDataIterator* it);
99         uint8_t* get_iterator_value(SegmentDataIterator* it);
100         uint64_t get_iterator_valid_length(SegmentDataIterator* it);
101
102         uint32_t segment_id_;
103         mutable recursive_mutex mutex_;
104         deque<uint8_t*> data_chunks_;
105         uint8_t* current_chunk_;
106         uint64_t used_samples_, unused_samples_;
107         atomic<uint64_t> sample_count_;
108         pv::util::Timestamp start_time_;
109         double samplerate_;
110         uint64_t chunk_size_;
111         unsigned int unit_size_;
112         int iterator_count_;
113         bool mem_optimization_requested_;
114         bool is_complete_;
115
116         friend struct SegmentTest::SmallSize8Single;
117         friend struct SegmentTest::MediumSize8Single;
118         friend struct SegmentTest::MaxSize8Single;
119         friend struct SegmentTest::MediumSize24Single;
120         friend struct SegmentTest::MediumSize32Single;
121         friend struct SegmentTest::MaxSize32Single;
122         friend struct SegmentTest::MediumSize32Multi;
123         friend struct SegmentTest::MaxSize32Multi;
124         friend struct SegmentTest::MaxSize32MultiAtOnce;
125         friend struct SegmentTest::MaxSize32MultiIterated;
126 };
127
128 } // namespace data
129 } // namespace pv
130
131 typedef std::shared_ptr<pv::data::Segment> SharedPtrToSegment;
132
133 Q_DECLARE_METATYPE(SharedPtrToSegment);
134
135 #endif // PULSEVIEW_PV_DATA_SEGMENT_HPP