Skip to content

Commit 26f1b88

Browse files
authored
Merge pull request #113 from Mahlet-Inc/develop
Develop
2 parents 9385da6 + 4907d2d commit 26f1b88

File tree

13 files changed

+358
-20
lines changed

13 files changed

+358
-20
lines changed

src/CMakeLists.txt

+5-3
Original file line numberDiff line numberDiff line change
@@ -222,9 +222,11 @@ set(CPACK_COMPONENTS_GROUPING ALL_COMPONENTS_IN_ONE)
222222
add_subdirectory(hobbits-core)
223223
add_subdirectory(hobbits-widgets)
224224
add_subdirectory(hobbits-python)
225-
add_subdirectory(hobbits-plugins)
226-
add_subdirectory(hobbits-gui)
227-
add_subdirectory(hobbits-runner)
225+
if (NOT JUST_LIBS)
226+
add_subdirectory(hobbits-plugins)
227+
add_subdirectory(hobbits-gui)
228+
add_subdirectory(hobbits-runner)
229+
endif()
228230

229231
#
230232
# Install

src/hobbits-core/bitarray.cpp

+39-3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include <QSharedPointer>
55
#include <QString>
66
#include <QDir>
7+
#include <QDataStream>
78
#include <stdexcept>
89

910
#ifdef Q_OS_UNIX
@@ -148,11 +149,19 @@ void BitArray::initFromIO(QIODevice *dataStream, qint64 sizeInBits)
148149
if (sizeInBits < 0) {
149150
sizeInBits = dataStream->bytesAvailable() * 8;
150151
}
152+
153+
QDataStream stream(dataStream);
154+
initFromStream(stream, sizeInBits);
155+
}
156+
157+
void BitArray::initFromStream(QDataStream &dataStream, qint64 sizeInBits)
158+
{
151159
m_size = sizeInBits;
152160
qint64 bytesToRead = this->sizeInBytes();
153161
char *byteBuffer = new char[CACHE_CHUNK_BYTE_SIZE];
154162
while (bytesToRead > 0) {
155-
qint64 bytesRead = dataStream->read(byteBuffer, CACHE_CHUNK_BYTE_SIZE);
163+
qint64 actualBytes = qMin(bytesToRead, qint64(CACHE_CHUNK_BYTE_SIZE));
164+
qint64 bytesRead = dataStream.readRawData(byteBuffer, actualBytes);
156165
m_dataFile.write(byteBuffer, bytesRead);
157166
bytesToRead -= bytesRead;
158167

@@ -629,13 +638,40 @@ QByteArray BitArray::readBytes(qint64 byteOffset, qint64 maxBytes) const
629638
}
630639

631640
void BitArray::writeTo(QIODevice *outputStream) const
641+
{
642+
QDataStream stream(outputStream);
643+
writeToStream(stream);
644+
}
645+
646+
BitArray* BitArray::deserialize(QDataStream &stream)
647+
{
648+
qint64 sizeInBits;
649+
stream >> sizeInBits;
650+
if (sizeInBits < 0) {
651+
stream.setStatus(QDataStream::Status::ReadCorruptData);
652+
return nullptr;
653+
}
654+
655+
auto bitArray = new BitArray();
656+
bitArray->initFromStream(stream, sizeInBits);
657+
return bitArray;
658+
}
659+
660+
void BitArray::serialize(QDataStream &stream) const
661+
{
662+
stream << m_size;
663+
writeToStream(stream);
664+
}
665+
666+
void BitArray::writeToStream(QDataStream &dataStream) const
632667
{
633668
QIODevice *reader = dataReader();
634669
char *byteBuffer = new char[CACHE_CHUNK_BYTE_SIZE];
635670
qint64 bytesToWrite = sizeInBytes();
636671
while (bytesToWrite > 0) {
637-
qint64 bytesRead = reader->read(byteBuffer, CACHE_CHUNK_BYTE_SIZE);
638-
outputStream->write(byteBuffer, bytesRead);
672+
qint64 actualBytes = qMin(bytesToWrite, qint64(CACHE_CHUNK_BYTE_SIZE));
673+
qint64 bytesRead = reader->read(byteBuffer, actualBytes);
674+
dataStream.writeRawData(byteBuffer, bytesRead);
639675
bytesToWrite -= bytesRead;
640676

641677
if (bytesToWrite > 0 && bytesRead < 1) {

src/hobbits-core/bitarray.h

+6
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,14 @@ class HOBBITSCORESHARED_EXPORT BitArray
6666
QByteArray readBytes(qint64 byteOffset, qint64 maxBytes) const;
6767
void writeTo(QIODevice *outputStream) const;
6868

69+
static BitArray* deserialize(QDataStream &stream);
70+
void serialize(QDataStream &stream) const;
71+
6972
static QSharedPointer<BitArray> fromString(QString bitArraySpec, QStringList parseErrors = QStringList());
7073

7174
private:
75+
void writeToStream(QDataStream &dataStream) const; // private for use by serializer and writeTo
76+
7277
class CacheLoadLocker {
7378
public:
7479
CacheLoadLocker(qint64 bitIndex, const BitArray* bitArray);
@@ -80,6 +85,7 @@ class HOBBITSCORESHARED_EXPORT BitArray
8085
QByteArray readBytesNoSync(qint64 byteOffset, qint64 maxBytes) const;
8186
QIODevice* dataReader() const;
8287
void initFromIO(QIODevice *dataStream, qint64 sizeInBits);
88+
void initFromStream(QDataStream &dataStream, qint64 sizeInBits);
8389
void reinitializeCache();
8490
void deleteCache();
8591
void loadCacheAt(qint64 bitIndex) const;

src/hobbits-core/bitcontainer.cpp

+35
Original file line numberDiff line numberDiff line change
@@ -161,3 +161,38 @@ void BitContainer::addParent(QUuid parentId)
161161
QMutexLocker lock(&m_mutex);
162162
m_parents.append(parentId);
163163
}
164+
165+
static const QString STREAM_HEADER_V1 = "HobbitsBitContainerStream_V1";
166+
167+
QSharedPointer<BitContainer> BitContainer::deserialize(QDataStream &stream)
168+
{
169+
int streamVersion;
170+
QString streamHeader;
171+
172+
stream >> streamVersion;
173+
stream.setVersion(streamVersion);
174+
175+
stream >> streamHeader;
176+
if (streamHeader != STREAM_HEADER_V1) {
177+
return QSharedPointer<BitContainer>();
178+
}
179+
180+
auto container = QSharedPointer<BitContainer>(new BitContainer());
181+
182+
stream >> container->m_name;
183+
stream >> container->m_nameWasSet;
184+
container->m_bits = QSharedPointer<BitArray>(BitArray::deserialize(stream));
185+
container->setInfo(BitInfo::deserialize(stream));
186+
187+
return container;
188+
}
189+
190+
void BitContainer::serialize(QDataStream &stream) const
191+
{
192+
stream << stream.version();
193+
stream << STREAM_HEADER_V1;
194+
stream << m_name;
195+
stream << m_nameWasSet;
196+
m_bits->serialize(stream);
197+
m_info->serialize(stream);
198+
}

src/hobbits-core/bitcontainer.h

+3
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ class HOBBITSCORESHARED_EXPORT BitContainer : public QObject
6464
void addChild(QUuid childId);
6565
void addParent(QUuid parentId);
6666

67+
static QSharedPointer<BitContainer> deserialize(QDataStream &stream);
68+
void serialize(QDataStream &stream) const;
69+
6770
private:
6871
explicit BitContainer();
6972

src/hobbits-core/bitinfo.cpp

+17
Original file line numberDiff line numberDiff line change
@@ -155,3 +155,20 @@ qint64 BitInfo::frameOffsetContaining(qint64 value, Range indexBounds) const
155155
{
156156
return m_frames->indexOf(value, indexBounds);
157157
}
158+
159+
QSharedPointer<BitInfo> BitInfo::deserialize(QDataStream &stream)
160+
{
161+
auto info = new BitInfo();
162+
info->m_frames = RangeSequence::deserialize(stream);
163+
stream >> info->m_rangeHighlights;
164+
stream >> info->m_metadata;
165+
166+
return QSharedPointer<BitInfo>(info);
167+
}
168+
169+
void BitInfo::serialize(QDataStream &stream) const
170+
{
171+
m_frames->serialize(stream);
172+
stream << m_rangeHighlights;
173+
stream << m_metadata;
174+
}

src/hobbits-core/bitinfo.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ class HOBBITSCORESHARED_EXPORT BitInfo : public QObject
4343

4444
qint64 frameOffsetContaining(qint64 value, Range indexBounds = Range()) const;
4545

46-
friend QDataStream& operator<<(QDataStream&, const BitInfo&);
47-
friend QDataStream& operator>>(QDataStream&, BitInfo&);
46+
static QSharedPointer<BitInfo> deserialize(QDataStream &stream);
47+
void serialize(QDataStream &stream) const;
4848

4949
Q_SIGNALS:
5050
void changed();

src/hobbits-core/rangesequence.cpp

+62
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "rangesequence.h"
22
#include <QMutexLocker>
33
#include <QSharedPointer>
4+
#include <QDataStream>
45
#include <stdexcept>
56

67
#define CACHE_CHUNK_64_SIZE (1000ll * 10ll)
@@ -299,3 +300,64 @@ qint64 RangeSequence::getValueCount() const
299300
{
300301
return m_valueCount;
301302
}
303+
304+
QSharedPointer<RangeSequence> RangeSequence::deserialize(QDataStream &stream)
305+
{
306+
qint64 valueCount;
307+
qint64 constantSize;
308+
stream >> valueCount;
309+
stream >> constantSize;
310+
if (constantSize > 0) {
311+
return RangeSequence::fromConstantSize(constantSize, valueCount);
312+
}
313+
314+
QSharedPointer<RangeSequence> sequence(new RangeSequence());
315+
316+
qint64 size;
317+
qint64 maxSize;
318+
int dataCacheBlockCount;
319+
stream >> size;
320+
stream >> maxSize;
321+
stream >> dataCacheBlockCount;
322+
323+
sequence->m_valueCount = valueCount;
324+
sequence->m_size = size;
325+
sequence->m_maxSize = maxSize;
326+
sequence->resizeCache(dataCacheBlockCount);
327+
char* buffer = new char[CACHE_CHUNK_BYTE_SIZE];
328+
for (int i = 0; i < dataCacheBlockCount; i++) {
329+
int read = stream.readRawData(buffer, CACHE_CHUNK_BYTE_SIZE);
330+
if (read < 1) {
331+
stream.setStatus(QDataStream::Status::ReadCorruptData);
332+
break;
333+
}
334+
sequence->m_dataFile.write(buffer, CACHE_CHUNK_BYTE_SIZE);
335+
}
336+
delete[] buffer;
337+
338+
return sequence;
339+
}
340+
341+
void RangeSequence::serialize(QDataStream &stream) const
342+
{
343+
stream << m_valueCount;
344+
stream << m_constantSize;
345+
if (m_constantSize > 0) {
346+
return;
347+
}
348+
349+
stream << m_size;
350+
stream << m_maxSize;
351+
stream << m_dataCacheBlockCount;
352+
char* buffer = new char[CACHE_CHUNK_BYTE_SIZE];
353+
syncCacheWithFile();
354+
m_dataFile.seek(0);
355+
while (m_dataFile.bytesAvailable() > 0) {
356+
qint64 bytes = m_dataFile.read(buffer, CACHE_CHUNK_BYTE_SIZE);
357+
if (bytes < 1) {
358+
break;
359+
}
360+
stream.writeRawData(buffer, bytes);
361+
}
362+
delete[] buffer;
363+
}

src/hobbits-core/rangesequence.h

+3
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ class HOBBITSCORESHARED_EXPORT RangeSequence
3333

3434
qint64 getValueCount() const;
3535

36+
static QSharedPointer<RangeSequence> deserialize(QDataStream &stream);
37+
void serialize(QDataStream &stream) const;
38+
3639
private:
3740
void writeRange(qint64 i, qint64 end);
3841
Range readRange(qint64 i) const;

src/hobbits-plugins/analyzers/WidthFramer/widthframerform.cpp

-12
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@
55
#include <QVBoxLayout>
66
#include <QtGlobal>
77

8-
#ifdef FFTW_AUTOCORRELATION
98
#include <fftw3.h>
10-
#endif
119

1210
WidthFramerForm::WidthFramerForm(QSharedPointer<ParameterDelegate> delegate) :
1311
ui(new Ui::WidthFramerForm()),
@@ -31,16 +29,10 @@ WidthFramerForm::WidthFramerForm(QSharedPointer<ParameterDelegate> delegate) :
3129
connect(ui->lv_correlations, SIGNAL(clicked(QModelIndex)), this, SLOT(widthSelected(QModelIndex)));
3230
connect(ui->rb_all, SIGNAL(toggled(bool)), this, SLOT(setupScoreList(bool)));
3331
connect(ui->rb_top100, SIGNAL(toggled(bool)), this, SLOT(setupScoreList(bool)));
34-
35-
#ifdef FFTW_AUTOCORRELATION
36-
#endif
3732
}
3833

3934
WidthFramerForm::~WidthFramerForm()
4035
{
41-
#ifdef FFTW_AUTOCORRELATION
42-
#endif
43-
4436
delete m_peakSelector;
4537
delete ui;
4638
}
@@ -148,7 +140,6 @@ void WidthFramerForm::widthSelected(QModelIndex index)
148140

149141
QVector<QPointF> WidthFramerForm::autocorrelate(QSharedPointer<const BitArray> bits)
150142
{
151-
#ifdef FFTW_AUTOCORRELATION
152143
int N = 1 << 19;
153144
fftw_complex *fft_in = reinterpret_cast<fftw_complex*>(fftw_malloc(sizeof(fftw_complex) * unsigned(N)));
154145
fftw_complex *fft_out = reinterpret_cast<fftw_complex*>(fftw_malloc(sizeof(fftw_complex) * unsigned(N)));
@@ -192,7 +183,4 @@ QVector<QPointF> WidthFramerForm::autocorrelate(QSharedPointer<const BitArray> b
192183
fftw_free(fft_out);
193184

194185
return results;
195-
#else
196-
return QVector<QPointF>();
197-
#endif
198186
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pluginInDir("${pluginType}" "BitContainerData" "${CMAKE_CURRENT_SOURCE_DIR}")

0 commit comments

Comments
 (0)