v2.0.0
Loading...
Searching...
No Matches
fiff_explain.cpp
Go to the documentation of this file.
1//=============================================================================================================
12
13//=============================================================================================================
14// INCLUDES
15//=============================================================================================================
16
17#include "fiff_explain.h"
18
19#include <QFile>
20#include <QHash>
21#include <QRegularExpression>
22#include <QTextStream>
23
24//=============================================================================================================
25// USED NAMESPACES
26//=============================================================================================================
27
28using namespace FIFFLIB;
29
30//=============================================================================================================
31// STATIC HELPERS
32//=============================================================================================================
33
34// Q_INIT_RESOURCE must not be expanded inside a namespace; static builds need it.
35static void initFiffExplanationsResource()
36{
37 Q_INIT_RESOURCE(fiff_explanations);
38}
39
40namespace
41{
42
43// Explanation classes of fiff_explanations.txt (MNE-C mne_show_fiff)
44enum ExplanationClass
45{
46 TagClass = 1,
47 BlockClass = 2,
48 UnitClass = 3,
49 UnitMultiplierClass = 4,
50 ChannelKindClass = 5
51};
52
53quint64 key(int exclass, int kind)
54{
55 return (static_cast<quint64>(static_cast<quint32>(exclass)) << 32) | static_cast<quint32>(kind);
56}
57
58const QHash<quint64, QString>& explanations()
59{
60 static const QHash<quint64, QString> table = [] {
61 initFiffExplanationsResource();
62 QHash<quint64, QString> entries;
63 QFile file(QStringLiteral(":/fiff/fiff_explanations.txt"));
64 if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
65 qWarning("[FiffExplain] the built-in explanation table is missing");
66 return entries;
67 }
68 // <class> <kind> "<text>"; the first entry of a duplicated class/kind wins, inner spaces collapse as in MNE-C
69 const QRegularExpression line(QStringLiteral(R"(^\s*(\d+)\s+(-?\d+)\s+"([^"]*)\")"));
70 QTextStream in(&file);
71 while (!in.atEnd()) {
72 const QRegularExpressionMatch m = line.match(in.readLine());
73 const quint64 k = m.hasMatch() ? key(m.captured(1).toInt(), m.captured(2).toInt()) : 0;
74 if (m.hasMatch() && !entries.contains(k)) {
75 entries.insert(k, m.captured(3).simplified());
76 }
77 }
78 return entries;
79 }();
80 return table;
81}
82
83QString lookup(int exclass, int kind)
84{
85 return explanations().value(key(exclass, kind));
86}
87
88} // namespace
89
90//=============================================================================================================
91// DEFINE MEMBER METHODS
92//=============================================================================================================
93
94QString FiffExplain::tag(int kind)
95{
96 return lookup(TagClass, kind);
97}
98
99//=============================================================================================================
100
101QString FiffExplain::block(int kind)
102{
103 return lookup(BlockClass, kind);
104}
105
106//=============================================================================================================
107
109{
110 return lookup(UnitClass, unit);
111}
112
113//=============================================================================================================
114
115QString FiffExplain::unitMultiplier(int unitMul)
116{
117 return lookup(UnitMultiplierClass, unitMul);
118}
119
120//=============================================================================================================
121
123{
124 return lookup(ChannelKindClass, kind);
125}
Human-readable names of FIFF tag kinds, block kinds, units, unit multipliers and channel kinds.
FIFF file I/O, in-memory data structures and high-level readers/writers.
static QString tag(int kind)
static QString channelKind(int kind)
static QString unit(int unit)
static QString block(int kind)
static QString unitMultiplier(int unitMul)