This commit is contained in:
deeaitch committed 2026-10-13 08:17:49 -04:00
1 parent 7022c84941
commit c3d3bd51fb
72 files changed
+3703 -2484

No files matched your search

+29 -9
View File
@@ -336,8 +336,28 @@ This matters because the same numeric identifier must not be confused between st
Immutable runtime snapshot with a private frame index. Build it with
`DbcDecodeBuilder::Build(parsed)` or construct it from `std::vector<DecodeFrame>`.
Construction rejects duplicate frame keys and duplicate signal names within a
frame with `std::invalid_argument`, including manually supplied metadata.
Construction validates all definitions before publishing the snapshot and throws
`std::invalid_argument` for invalid metadata, including manually supplied data:
- Normalized CAN IDs must fit 11 bits for standard frames or 29 bits for extended
frames. DBC's bit-31 encoding flag must already be removed.
- Frame keys must be unique; signal names must be unique within their frame.
- Signal lengths must be 1–64 bits, with Intel/Motorola layouts entirely inside
the declared payload. Bit coordinates use overflow-safe 64-bit arithmetic.
- Byte order, numeric type, and multiplexing role must be valid enum values.
- Factor, offset, minimum, and maximum must be finite; minimum must not exceed
maximum. Zero and negative factors are allowed.
- Multiplexing requires one unsigned selector when branches are present, with
branch values in its raw range. Signals may overlap only when they are branches
selected by different raw values, including mixed byte orders.
`dlc` remains a byte count in the storage range 0–255; construction imposes no
additional CAN/CAN FD payload limit. A zero-byte frame may contain no signals.
Both `DbcDecodeBuilder::Build` and the direct constructor apply these rules.
Construction copies the input, including nested metadata, even for rvalue input.
Saved mutable aliases into that input cannot modify definitions or invalidate the
lookup index. Database copies still share the frozen snapshot; a failed
construction or replacement leaves the previous snapshot and its lookups intact.
- `GetFrames()` returns a borrowed `const std::vector<DecodeFrame>&`.
- `FindFrame(FrameKey)` returns `std::shared_ptr<const DecodeFrame>`.
@@ -461,9 +481,9 @@ The decoder applies factor and offset; it does not clamp physical values to the
declared minimum and maximum. Non-finite conversion results (NaN or positive/
negative infinity), including overflow with finite factor/offset, produce
`PhysicalConversionFailed`. The exact raw value and non-finite `physicalValue`
remain available, while signal `valid` is false. Non-finite factor/offset in manually
constructed definitions follow this same conversion-result check. Physical
conversion failure of a selector does not prevent raw branch selection.
remain available, while signal `valid` is false. Non-finite numeric parameters are
rejected during database construction. Finite parameters can still overflow during
conversion; conversion failure of a selector does not prevent raw branch selection.
### Definition ownership and reload
@@ -483,8 +503,8 @@ that metadata is no longer needed.
`GetFrames()` is a borrowed view. References, iterators, and raw pointers obtained
from it or from a handle's `.get()` do not retain ownership. Keep an owning handle
or an unchanged database copy while using them. Do not retain mutable aliases
into a vector moved into the database constructor. The raw string pointer from
or an unchanged database copy while using them. Constructor input is copied and
may be changed independently afterward. The raw string pointer from
`GetValueDescription()` follows the same rule: keep the signal definition handle
alive while using the string.
@@ -763,14 +783,14 @@ Each result has `SignalDecodeStatus status`:
| `Inactive` | Selector is available and chooses another branch |
| `SelectorUnavailable` | Branch activation is unknown because selector bytes are missing |
| `InsufficientPayload` | Selected or unconditional signal bytes are missing |
| `InvalidDefinition` | Invalid length, byte order, numeric type, multiplexing role, layout outside declared DLC, or missing/invalid selector in manually built runtime metadata |
| `InvalidDefinition` | Defensive decoder check failed; invalid definitions are rejected during database construction |
| `PhysicalConversionFailed` | Raw value is available, but the converted physical value is NaN or infinity |
All statuses except `Valid` have `valid == false` and `GetValueDescription()`
returns nullptr. `PhysicalConversionFailed` preserves extracted raw data and the
non-finite conversion result; other invalid statuses have no decoded numeric data. Check `status` to
distinguish inactive branches from errors. Consumers constructing runtime metadata
manually must obey the same non-overlap rules as the parser. Extended and nested
manually receive the same selector and non-overlap validation as parsed files. Extended and nested
multiplexing are outside this stage and are explicitly rejected, rather than
silently decoded as unconditional signals.
+16
View File
@@ -10,6 +10,13 @@ existing Git tag; subsequent changes are listed as unreleased.
#### Added
- Issue #16: construction-time validation for both manual runtime definitions and
`DbcDecodeBuilder` input: normalized CAN IDs, duplicate keys, signal lengths and
positions, enums, finite numeric parameters, ordered ranges, selectors, branch
ranges, and overlaps.
- Regression tests for both construction paths, numeric and bit boundaries,
mixed byte orders, exclusive overlaps, mutable input aliases, and failed reloads.
- `FrameDecodeStatus` distinguishes unknown frames, insufficient payloads,
signal errors, and successful decoding; frame `valid` still means matched.
- `SignalDecodeStatus::PhysicalConversionFailed` reports NaN/Inf results,
@@ -20,6 +27,15 @@ existing Git tag; subsequent changes are listed as unreleased.
#### Changed
- Runtime construction rejects invalid definitions with `std::invalid_argument`
before publishing a snapshot. Decoder tests now expect construction failures
for malformed definitions; finite arithmetic overflow remains a decode status.
- Shared overflow-safe layout validation across parsing, construction, and
decoding. Intel extraction also widens bit coordinates before arithmetic.
- `DecodeDatabase` now accepts definitions by const reference and copies them,
even for rvalues, preventing retained
mutable aliases from modifying the frozen snapshot or invalidating its index.
- Short payloads decode available signals without padding; longer payloads
ignore bytes beyond the declared DLC. Short frame status takes precedence
over signal errors, with per-signal causes retained in definition order.
+1
View File
@@ -8,6 +8,7 @@ SOURCES += \
$$PWD/tree_node.cpp
HEADERS += \
$$PWD/signal_layout.h \
$$PWD/definition_key.h \
$$PWD/dbc_diagnostic.h \
$$PWD/multiplexing.h \
+1 -1
View File
@@ -53,5 +53,5 @@ DecodeDatabase DbcDecodeBuilder::Build(const DbcDatabase &source) const {
frames.push_back(std::move(targetFrame));
}
return DecodeDatabase(std::move(frames));
return DecodeDatabase(frames);
}
+1 -1
View File
@@ -24,7 +24,7 @@ public:
* @brief Build runtime decode database.
* @param source Parsed DBC database.
* @return Immutable runtime snapshot independent of source lifetime.
* @throws std::invalid_argument for duplicate frame keys or signal names.
* @throws std::invalid_argument for invalid metadata or duplicate keys.
*/
DecodeDatabase Build(const DbcDatabase &source) const;
};
+5 -7
View File
@@ -10,6 +10,7 @@
*/
#include "dbc_decoder.h"
#include "signal_layout.h"
#include <cmath>
#include <utility>
@@ -58,11 +59,8 @@ bool DbcDecoder::IsValidDefinition(const DecodeSignal &signal, std::uint8_t dlc)
signal.multiplexing.role != MultiplexRole::Branch))
return false;
// Use widened coordinates to avoid overflow on malformed start bits.
const std::uint64_t start = signal.byteOrder == ByteOrder::Intel
? signal.startBit
: std::uint64_t(signal.startBit / 8U) * 8U + 7U - signal.startBit % 8U;
return start + signal.length <= std::uint64_t(dlc) * 8U;
return IsValidSignalLayout(signal.startBit, signal.length,
signal.byteOrder == ByteOrder::Intel, dlc);
}
DbcDecoder::SelectorState DbcDecoder::ReadSelector(const DecodeFrame &definition,
@@ -154,8 +152,8 @@ bool DbcDecoder::ExtractIntel(const std::vector<std::uint8_t> &data,
value = 0U;
for (std::uint32_t bitIndex = 0U; bitIndex < length; ++bitIndex) {
const std::uint32_t absoluteBit = startBit + bitIndex;
const std::uint32_t byteIndex = absoluteBit / 8U;
const std::uint64_t absoluteBit = std::uint64_t(startBit) + bitIndex;
const std::uint64_t byteIndex = absoluteBit / 8U;
const std::uint32_t bitInByte = absoluteBit % 8U;
if (byteIndex >= data.size())
+4 -7
View File
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: MIT
#include "dbc_statement_handler.h"
#include "text_utils.h"
#include "signal_layout.h"
#include <charconv>
#include <cmath>
#include <limits>
@@ -356,13 +357,9 @@ void DbcSignalHandler::Handle(const std::string &line, DbcParseContext &context)
if (FindSignalByName(*context.currentFrame, signal.name) != nullptr)
throw std::runtime_error("Duplicate signal name '" + signal.name +
"' in frame '" + context.currentFrame->name + "'.");
const std::uint64_t payloadBits = static_cast<std::uint64_t>(context.currentFrame->dlc) * 8U;
std::uint64_t bit = signal.startBit;
for (std::uint32_t index = 0U; index < signal.length; ++index) {
if (bit >= payloadBits)
throw std::runtime_error("Signal exceeds the frame payload length.");
bit = NextSignalBit(bit, signal.isLittleEndian);
}
if (!IsValidSignalLayout(signal.startBit, signal.length, signal.isLittleEndian,
context.currentFrame->dlc))
throw std::runtime_error("Signal exceeds the frame payload length.");
context.currentFrame->signals.push_back(std::move(signal));
context.signalLines.back().push_back(context.lineNumber);
}
+88 -11
View File
@@ -2,27 +2,104 @@
// Copyright (c) 2026 Dim Himro
#include "decode_database.h"
#include "signal_layout.h"
#include <bitset>
#include <cmath>
#include <limits>
#include <stdexcept>
#include <unordered_set>
#include <utility>
DecodeDatabase::Storage::Storage(std::vector<DecodeFrame> definitions)
: frames(std::move(definitions)) {
frameIndexByKey.reserve(frames.size());
for (std::size_t index = 0U; index < frames.size(); ++index) {
const DecodeFrame &frame = frames[index];
if (!frameIndexByKey.emplace(frame.GetKey(), index).second)
throw std::invalid_argument("Duplicate runtime frame key");
namespace {
constexpr std::size_t MaximumPayloadBits = std::numeric_limits<std::uint8_t>::max() * 8U;
using SignalBits = std::bitset<MaximumPayloadBits>;
void ValidateSignal(const DecodeSignal &signal, std::uint8_t dlc) {
if (signal.byteOrder != ByteOrder::Intel && signal.byteOrder != ByteOrder::Motorola)
throw std::invalid_argument("Invalid signal byte order: " + signal.name);
if (signal.valueType != ValueType::Unsigned && signal.valueType != ValueType::Signed)
throw std::invalid_argument("Invalid signal value type: " + signal.name);
if (signal.multiplexing.role != MultiplexRole::Unconditional &&
signal.multiplexing.role != MultiplexRole::Selector &&
signal.multiplexing.role != MultiplexRole::Branch)
throw std::invalid_argument("Invalid multiplexing role: " + signal.name);
if (!IsValidSignalLayout(signal.startBit, signal.length,
signal.byteOrder == ByteOrder::Intel, dlc))
throw std::invalid_argument("Invalid signal length or payload position: " + signal.name);
if (!std::isfinite(signal.factor) || !std::isfinite(signal.offset) ||
!std::isfinite(signal.minimum) || !std::isfinite(signal.maximum) ||
signal.minimum > signal.maximum)
throw std::invalid_argument("Invalid signal numeric parameters: " + signal.name);
}
SignalBits GetSignalBits(const DecodeSignal &signal) {
SignalBits bits;
const bool littleEndian = signal.byteOrder == ByteOrder::Intel;
const std::uint64_t start = SignalStartCoordinate(signal.startBit, littleEndian);
for (std::uint32_t index = 0U; index < signal.length; ++index) {
const std::uint64_t coordinate = start + index;
const std::uint64_t bit = littleEndian ? coordinate
: coordinate / 8U * 8U + 7U - coordinate % 8U;
bits.set(static_cast<std::size_t>(bit));
}
return bits;
}
bool AreMutuallyExclusive(const DecodeSignal &first, const DecodeSignal &second) {
return first.multiplexing.role == MultiplexRole::Branch &&
second.multiplexing.role == MultiplexRole::Branch &&
first.multiplexing.value != second.multiplexing.value;
}
void ValidateFrame(const DecodeFrame &frame) {
const std::uint32_t maximumId = frame.isExtended ? 0x1FFFFFFFU : 0x7FFU;
if (frame.canId > maximumId)
throw std::invalid_argument("Invalid normalized CAN ID: " + std::to_string(frame.canId));
std::unordered_set<std::string> names;
const DecodeSignal *selector = nullptr;
for (const DecodeSignal &signal: frame.signals) {
if (!names.insert(signal.name).second)
throw std::invalid_argument("Duplicate runtime signal key");
throw std::invalid_argument("Duplicate runtime signal key: " + signal.name);
ValidateSignal(signal, frame.dlc);
if (signal.multiplexing.role == MultiplexRole::Selector) {
if (selector != nullptr || signal.valueType != ValueType::Unsigned)
throw std::invalid_argument("Multiplexing requires one unsigned selector per frame");
selector = &signal;
}
}
std::vector<SignalBits> layouts;
layouts.reserve(frame.signals.size());
for (std::size_t index = 0U; index < frame.signals.size(); ++index) {
const DecodeSignal &signal = frame.signals[index];
if (signal.multiplexing.role == MultiplexRole::Branch &&
(selector == nullptr ||
(selector->length < 64U && signal.multiplexing.value >= (std::uint64_t(1U) << selector->length))))
throw std::invalid_argument("Missing selector or branch value outside selector range: " + signal.name);
const SignalBits bits = GetSignalBits(signal);
for (std::size_t previous = 0U; previous < index; ++previous) {
if (!AreMutuallyExclusive(signal, frame.signals[previous]) && (bits & layouts[previous]).any())
throw std::invalid_argument("Overlapping signals: " + signal.name);
}
layouts.push_back(bits);
}
}
}// namespace
DecodeDatabase::Storage::Storage(const std::vector<DecodeFrame> &definitions)
: frames(definitions) {
// Validate the complete snapshot before creating its lookup index.
for (const DecodeFrame &frame: frames)
ValidateFrame(frame);
frameIndexByKey.reserve(frames.size());
for (std::size_t index = 0U; index < frames.size(); ++index) {
if (!frameIndexByKey.emplace(frames[index].GetKey(), index).second)
throw std::invalid_argument("Duplicate runtime frame key");
}
}
DecodeDatabase::DecodeDatabase(std::vector<DecodeFrame> frames)
: storage(std::make_shared<const Storage>(std::move(frames))) {
DecodeDatabase::DecodeDatabase(const std::vector<DecodeFrame> &frames)
: storage(std::make_shared<const Storage>(frames)) {
}
const std::vector<DecodeFrame> &DecodeDatabase::GetFrames() const {
+5 -5
View File
@@ -88,11 +88,11 @@ class DecodeDatabase {
public:
DecodeDatabase() = default;
/**
* Freeze definitions and build the frame index.
* Do not retain mutable aliases into moved input vectors.
* @throws std::invalid_argument for duplicate frame keys or signal names.
* Copy and validate definitions before building the frame index.
* Input aliases cannot modify the snapshot, even for rvalue input.
* @throws std::invalid_argument for invalid metadata or duplicate keys.
*/
explicit DecodeDatabase(std::vector<DecodeFrame> frames);
explicit DecodeDatabase(const std::vector<DecodeFrame> &frames);
/** Borrowed view, valid while this snapshot remains alive and unchanged. */
const std::vector<DecodeFrame> &GetFrames() const;
@@ -105,7 +105,7 @@ private:
std::vector<DecodeFrame> frames;
std::unordered_map<FrameKey, std::size_t, FrameKeyHasher> frameIndexByKey;
explicit Storage(std::vector<DecodeFrame> definitions);
explicit Storage(const std::vector<DecodeFrame> &definitions);
};
std::shared_ptr<const Storage> storage;
+19
View File
@@ -0,0 +1,19 @@
// SPDX-License-Identifier: MIT
#ifndef SIGNAL_LAYOUT_H
#define SIGNAL_LAYOUT_H
#include <cstdint>
/** Linear coordinate in the signal's bit order, widened before arithmetic. */
inline std::uint64_t SignalStartCoordinate(std::uint32_t startBit, bool littleEndian) {
return littleEndian ? std::uint64_t(startBit)
: std::uint64_t(startBit / 8U) * 8U + 7U - startBit % 8U;
}
inline bool IsValidSignalLayout(std::uint32_t startBit, std::uint32_t length,
bool littleEndian, std::uint8_t dlc) {
return length >= 1U && length <= 64U &&
SignalStartCoordinate(startBit, littleEndian) + length <= std::uint64_t(dlc) * 8U;
}
#endif
+2 -2
View File
@@ -287,8 +287,8 @@
<type></type>
<name>DecodeDatabase</name>
<anchorfile>classDecodeDatabase.html</anchorfile>
<anchor>aa935a3a0d334f932d6a8c89a3818286a</anchor>
<arglist>(std::vector&lt; DecodeFrame &gt; frames)</arglist>
<anchor>a51a44cf7c3f23c98ec8781afe0097c0c</anchor>
<arglist>(const std::vector&lt; DecodeFrame &gt; &amp;frames)</arglist>
</member>
<member kind="function">
<type>const std::vector&lt; DecodeFrame &gt; &amp;</type>
+1 -1
View File
@@ -10,7 +10,7 @@
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/definition_key.h:56: warning: Compound SignalKeyHasher is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/dbc_decoder.h:32: warning: Member SignalDecodeStatus (enumeration) of file dbc_decoder.h is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/examples/main.cpp:100: warning: Member main(int argc, char *argv[]) (function) of file examples/main.cpp is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/README.md:1607: warning: end of comment block while expecting command </tt>
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/README.md:1627: warning: end of comment block while expecting command </tt>
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/dbc_statement_handler.h:68: warning: Member Handle(const std::string &line, DbcParseContext &context) const override (function) of class DbcCommentHandler is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/dbc_diagnostic.h:26: warning: Member severity (variable) of struct DbcDiagnostic is not documented.
/home/deeaitch/work/3.projects/git.himro.ca/automotive/dbc/core/dbc_diagnostic.h:27: warning: Member code (variable) of struct DbcDiagnostic is not documented.
+1 -1
View File
@@ -149,7 +149,7 @@ Public Member Functions</h2></td></tr>
<p>Implements <a class="el" href="classDbcStatementHandler.html">DbcStatementHandler</a>.</p>
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8cpp_source.html#l00370">370</a> of file <a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8cpp_source.html#l00367">367</a> of file <a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a>.</p>
</div>
</div>
+1 -1
View File
@@ -139,7 +139,7 @@ Public Member Functions</h2></td></tr>
<dl class="section return"><dt>Returns</dt><dd>Immutable runtime snapshot independent of source lifetime. </dd></dl>
<dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">std::invalid_argument</td><td>for duplicate frame keys or signal names. </td></tr>
<tr><td class="paramname">std::invalid_argument</td><td>for invalid metadata or duplicate keys. </td></tr>
</table>
</dd>
</dl>
+5 -5
View File
@@ -160,11 +160,11 @@ Public Member Functions</h2></td></tr>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Owning immutable frame handle or nullptr. Safe across reload. </dd></dl>
<p class="definition">Definition at line <a class="el" href="dbc__decoder_8cpp_source.html#l00016">16</a> of file <a class="el" href="dbc__decoder_8cpp_source.html">dbc_decoder.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="dbc__decoder_8cpp_source.html#l00017">17</a> of file <a class="el" href="dbc__decoder_8cpp_source.html">dbc_decoder.cpp</a>.</p>
<p class="reference">References <a class="el" href="decode__database_8cpp_source.html#l00033">DecodeDatabase::FindFrame()</a>.</p>
<p class="reference">References <a class="el" href="decode__database_8cpp_source.html#l00110">DecodeDatabase::FindFrame()</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__decoder_8cpp_source.html#l00022">Decode()</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__decoder_8cpp_source.html#l00023">Decode()</a>.</p>
</div>
</div>
@@ -204,9 +204,9 @@ Public Member Functions</h2></td></tr>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Decoded frame value. </dd></dl>
<p class="definition">Definition at line <a class="el" href="dbc__decoder_8cpp_source.html#l00022">22</a> of file <a class="el" href="dbc__decoder_8cpp_source.html">dbc_decoder.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="dbc__decoder_8cpp_source.html#l00023">23</a> of file <a class="el" href="dbc__decoder_8cpp_source.html">dbc_decoder.cpp</a>.</p>
<p class="reference">References <a class="el" href="dbc__decoder_8h_source.html#l00025">RawCanFrame::canId</a>, <a class="el" href="dbc__decoder_8h_source.html#l00027">RawCanFrame::data</a>, <a class="el" href="dbc__decoder_8h_source.html#l00053">DecodedSignalValue::definition</a>, <a class="el" href="dbc__decoder_8h_source.html#l00072">DecodedFrameValue::definition</a>, <a class="el" href="dbc__decoder_8cpp_source.html#l00016">FindFrame()</a>, <a class="el" href="dbc__decoder_8h_source.html#l00026">RawCanFrame::isExtended</a>, <a class="el" href="dbc__decoder_8h_source.html#l00054">DecodedSignalValue::key</a>, <a class="el" href="dbc__decoder_8h_source.html#l00073">DecodedFrameValue::key</a>, <a class="el" href="dbc__decoder_8h_source.html#l00076">DecodedFrameValue::status</a>, <a class="el" href="dbc__decoder_8h_source.html#l00057">DecodedSignalValue::valid</a>, and <a class="el" href="dbc__decoder_8h_source.html#l00075">DecodedFrameValue::valid</a>.</p>
<p class="reference">References <a class="el" href="dbc__decoder_8h_source.html#l00025">RawCanFrame::canId</a>, <a class="el" href="dbc__decoder_8h_source.html#l00027">RawCanFrame::data</a>, <a class="el" href="dbc__decoder_8h_source.html#l00053">DecodedSignalValue::definition</a>, <a class="el" href="dbc__decoder_8h_source.html#l00072">DecodedFrameValue::definition</a>, <a class="el" href="dbc__decoder_8cpp_source.html#l00017">FindFrame()</a>, <a class="el" href="dbc__decoder_8h_source.html#l00026">RawCanFrame::isExtended</a>, <a class="el" href="dbc__decoder_8h_source.html#l00054">DecodedSignalValue::key</a>, <a class="el" href="dbc__decoder_8h_source.html#l00073">DecodedFrameValue::key</a>, <a class="el" href="dbc__decoder_8h_source.html#l00076">DecodedFrameValue::status</a>, <a class="el" href="dbc__decoder_8h_source.html#l00057">DecodedSignalValue::valid</a>, and <a class="el" href="dbc__decoder_8h_source.html#l00075">DecodedFrameValue::valid</a>.</p>
</div>
</div>
+1 -1
View File
@@ -149,7 +149,7 @@ Public Member Functions</h2></td></tr>
<p>Implements <a class="el" href="classDbcStatementHandler.html">DbcStatementHandler</a>.</p>
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8cpp_source.html#l00342">342</a> of file <a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8cpp_source.html#l00343">343</a> of file <a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a>.</p>
</div>
</div>
+1 -1
View File
@@ -152,7 +152,7 @@ Public Member Functions</h2></td></tr>
<p>Implements <a class="el" href="classDbcStatementHandler.html">DbcStatementHandler</a>.</p>
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8cpp_source.html#l00389">389</a> of file <a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8cpp_source.html#l00386">386</a> of file <a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a>.</p>
</div>
</div>
+1 -1
View File
@@ -183,7 +183,7 @@ Public Member Functions</h2></td></tr>
<p class="definition">Definition at line <a class="el" href="dbc__parser_8cpp_source.html#l00044">44</a> of file <a class="el" href="dbc__parser_8cpp_source.html">dbc_parser.cpp</a>.</p>
<p class="reference">References <a class="el" href="dbc__statement__handler_8cpp_source.html#l00391">DbcStatementDispatcher::Dispatch()</a>.</p>
<p class="reference">References <a class="el" href="dbc__statement__handler_8cpp_source.html#l00388">DbcStatementDispatcher::Dispatch()</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__parser_8cpp_source.html#l00031">ParseFile()</a>.</p>
+1 -1
View File
@@ -149,7 +149,7 @@ Public Member Functions</h2></td></tr>
<p>Implements <a class="el" href="classDbcStatementHandler.html">DbcStatementHandler</a>.</p>
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8cpp_source.html#l00352">352</a> of file <a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8cpp_source.html#l00353">353</a> of file <a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a>.</p>
</div>
</div>
+2 -2
View File
@@ -127,7 +127,7 @@ Public Member Functions</h2></td></tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8cpp_source.html#l00374">374</a> of file <a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8cpp_source.html#l00371">371</a> of file <a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a>.</p>
</div>
</div>
@@ -189,7 +189,7 @@ template&lt;class Handler &gt; </div>
</div><div class="memdoc">
<p>Returns false for an unregistered keyword; input must be trimmed. </p>
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8cpp_source.html#l00391">391</a> of file <a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8cpp_source.html#l00388">388</a> of file <a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__parser_8cpp_source.html#l00044">DbcParser::ParseFileWithDiagnostics()</a>.</p>
@@ -149,7 +149,7 @@ Public Member Functions</h2></td></tr>
<p>Implements <a class="el" href="classDbcStatementHandler.html">DbcStatementHandler</a>.</p>
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8cpp_source.html#l00452">452</a> of file <a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8cpp_source.html#l00449">449</a> of file <a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a>.</p>
</div>
</div>
@@ -149,7 +149,7 @@ Public Member Functions</h2></td></tr>
<p>Implements <a class="el" href="classDbcStatementHandler.html">DbcStatementHandler</a>.</p>
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8cpp_source.html#l00403">403</a> of file <a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8cpp_source.html#l00400">400</a> of file <a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a>.</p>
</div>
</div>
+1 -1
View File
@@ -97,7 +97,7 @@ $(document).ready(function(){initNavTree('classDecodeDatabase.html',''); initRes
<p>This is the complete list of members for <a class="el" href="classDecodeDatabase.html">DecodeDatabase</a>, including all inherited members.</p>
<table class="directory">
<tr bgcolor="#f0f0f0" class="even"><td class="entry"><b>DecodeDatabase</b>()=default (defined in <a class="el" href="classDecodeDatabase.html">DecodeDatabase</a>)</td><td class="entry"><a class="el" href="classDecodeDatabase.html">DecodeDatabase</a></td><td class="entry"></td></tr>
<tr class="odd"><td class="entry"><a class="el" href="classDecodeDatabase.html#aa935a3a0d334f932d6a8c89a3818286a">DecodeDatabase</a>(std::vector&lt; DecodeFrame &gt; frames)</td><td class="entry"><a class="el" href="classDecodeDatabase.html">DecodeDatabase</a></td><td class="entry"><span class="mlabel">explicit</span></td></tr>
<tr class="odd"><td class="entry"><a class="el" href="classDecodeDatabase.html#a51a44cf7c3f23c98ec8781afe0097c0c">DecodeDatabase</a>(const std::vector&lt; DecodeFrame &gt; &amp;frames)</td><td class="entry"><a class="el" href="classDecodeDatabase.html">DecodeDatabase</a></td><td class="entry"><span class="mlabel">explicit</span></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970">FindFrame</a>(const FrameKey &amp;key) const</td><td class="entry"><a class="el" href="classDecodeDatabase.html">DecodeDatabase</a></td><td class="entry"></td></tr>
<tr bgcolor="#f0f0f0" class="odd"><td class="entry"><b>FindSignal</b>(const SignalKey &amp;key) const (defined in <a class="el" href="classDecodeDatabase.html">DecodeDatabase</a>)</td><td class="entry"><a class="el" href="classDecodeDatabase.html">DecodeDatabase</a></td><td class="entry"></td></tr>
<tr class="even"><td class="entry"><a class="el" href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">GetFrames</a>() const</td><td class="entry"><a class="el" href="classDecodeDatabase.html">DecodeDatabase</a></td><td class="entry"></td></tr>
+12 -12
View File
@@ -105,8 +105,8 @@ $(document).ready(function(){initNavTree('classDecodeDatabase.html',''); initRes
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="pub-methods" name="pub-methods"></a>
Public Member Functions</h2></td></tr>
<tr class="memitem:aa935a3a0d334f932d6a8c89a3818286a" id="r_aa935a3a0d334f932d6a8c89a3818286a"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDecodeDatabase.html#aa935a3a0d334f932d6a8c89a3818286a">DecodeDatabase</a> (std::vector&lt; <a class="el" href="structDecodeFrame.html">DecodeFrame</a> &gt; frames)</td></tr>
<tr class="separator:aa935a3a0d334f932d6a8c89a3818286a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a51a44cf7c3f23c98ec8781afe0097c0c" id="r_a51a44cf7c3f23c98ec8781afe0097c0c"><td class="memItemLeft" align="right" valign="top">&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDecodeDatabase.html#a51a44cf7c3f23c98ec8781afe0097c0c">DecodeDatabase</a> (const std::vector&lt; <a class="el" href="structDecodeFrame.html">DecodeFrame</a> &gt; &amp;frames)</td></tr>
<tr class="separator:a51a44cf7c3f23c98ec8781afe0097c0c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aa034c1510984a85f60ad6c0bd744d6e8" id="r_aa034c1510984a85f60ad6c0bd744d6e8"><td class="memItemLeft" align="right" valign="top">const std::vector&lt; <a class="el" href="structDecodeFrame.html">DecodeFrame</a> &gt; &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">GetFrames</a> () const</td></tr>
<tr class="separator:aa034c1510984a85f60ad6c0bd744d6e8"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a780d6e747a48b10a5eb0ab85448d2970" id="r_a780d6e747a48b10a5eb0ab85448d2970"><td class="memItemLeft" align="right" valign="top">std::shared_ptr&lt; const <a class="el" href="structDecodeFrame.html">DecodeFrame</a> &gt;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970">FindFrame</a> (const <a class="el" href="structFrameKey.html">FrameKey</a> &amp;key) const</td></tr>
@@ -119,8 +119,8 @@ Public Member Functions</h2></td></tr>
<p class="definition">Definition at line <a class="el" href="decode__database_8h_source.html#l00087">87</a> of file <a class="el" href="decode__database_8h_source.html">decode_database.h</a>.</p>
</div><h2 class="groupheader">Constructor &amp; Destructor Documentation</h2>
<a id="aa935a3a0d334f932d6a8c89a3818286a" name="aa935a3a0d334f932d6a8c89a3818286a"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa935a3a0d334f932d6a8c89a3818286a">&#9670;&#160;</a></span>DecodeDatabase()</h2>
<a id="a51a44cf7c3f23c98ec8781afe0097c0c" name="a51a44cf7c3f23c98ec8781afe0097c0c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a51a44cf7c3f23c98ec8781afe0097c0c">&#9670;&#160;</a></span>DecodeDatabase()</h2>
<div class="memitem">
<div class="memproto">
@@ -131,7 +131,7 @@ Public Member Functions</h2></td></tr>
<tr>
<td class="memname">DecodeDatabase::DecodeDatabase </td>
<td>(</td>
<td class="paramtype">std::vector&lt; <a class="el" href="structDecodeFrame.html">DecodeFrame</a> &gt;&#160;</td>
<td class="paramtype">const std::vector&lt; <a class="el" href="structDecodeFrame.html">DecodeFrame</a> &gt; &amp;&#160;</td>
<td class="paramname"><em>frames</em></td><td>)</td>
<td></td>
</tr>
@@ -142,14 +142,14 @@ Public Member Functions</h2></td></tr>
</tr>
</table>
</div><div class="memdoc">
<p>Freeze definitions and build the frame index. Do not retain mutable aliases into moved input vectors. </p><dl class="exception"><dt>Exceptions</dt><dd>
<p>Copy and validate definitions before building the frame index. Input aliases cannot modify the snapshot, even for rvalue input. </p><dl class="exception"><dt>Exceptions</dt><dd>
<table class="exception">
<tr><td class="paramname">std::invalid_argument</td><td>for duplicate frame keys or signal names. </td></tr>
<tr><td class="paramname">std::invalid_argument</td><td>for invalid metadata or duplicate keys. </td></tr>
</table>
</dd>
</dl>
<p class="definition">Definition at line <a class="el" href="decode__database_8cpp_source.html#l00024">24</a> of file <a class="el" href="decode__database_8cpp_source.html">decode_database.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="decode__database_8cpp_source.html#l00101">101</a> of file <a class="el" href="decode__database_8cpp_source.html">decode_database.cpp</a>.</p>
</div>
</div>
@@ -170,7 +170,7 @@ Public Member Functions</h2></td></tr>
</div><div class="memdoc">
<p>Borrowed view, valid while this snapshot remains alive and unchanged. </p>
<p class="definition">Definition at line <a class="el" href="decode__database_8cpp_source.html#l00028">28</a> of file <a class="el" href="decode__database_8cpp_source.html">decode_database.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="decode__database_8cpp_source.html#l00105">105</a> of file <a class="el" href="decode__database_8cpp_source.html">decode_database.cpp</a>.</p>
</div>
</div>
@@ -191,9 +191,9 @@ Public Member Functions</h2></td></tr>
</div><div class="memdoc">
<p>Owning handles retain the entire snapshot across reload or destruction. </p>
<p class="definition">Definition at line <a class="el" href="decode__database_8cpp_source.html#l00033">33</a> of file <a class="el" href="decode__database_8cpp_source.html">decode_database.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="decode__database_8cpp_source.html#l00110">110</a> of file <a class="el" href="decode__database_8cpp_source.html">decode_database.cpp</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__decoder_8cpp_source.html#l00016">DbcDecoder::FindFrame()</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__decoder_8cpp_source.html#l00017">DbcDecoder::FindFrame()</a>.</p>
</div>
</div>
@@ -213,7 +213,7 @@ Public Member Functions</h2></td></tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="decode__database_8cpp_source.html#l00043">43</a> of file <a class="el" href="decode__database_8cpp_source.html">decode_database.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="decode__database_8cpp_source.html#l00120">120</a> of file <a class="el" href="decode__database_8cpp_source.html">decode_database.cpp</a>.</p>
</div>
</div>
+1 -1
View File
@@ -1,6 +1,6 @@
var classDecodeDatabase =
[
[ "DecodeDatabase", "classDecodeDatabase.html#aa935a3a0d334f932d6a8c89a3818286a", null ],
[ "DecodeDatabase", "classDecodeDatabase.html#a51a44cf7c3f23c98ec8781afe0097c0c", null ],
[ "GetFrames", "classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8", null ],
[ "FindFrame", "classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970", null ]
];
File diff suppressed because it is too large. Load diff
@@ -144,7 +144,7 @@ $(document).ready(function(){initNavTree('dbc__decode__builder_8cpp_source.html'
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> frames.push_back(std::move(targetFrame));</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> }</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> </div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> <span class="keywordflow">return</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>(std::move(frames));</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> <span class="keywordflow">return</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>(frames);</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span>}</div>
</div>
<div class="ttc" id="aclassDbcDecodeBuilder_html_a2bc6386dfb5e58976c42e22c19ec471b"><div class="ttname"><a href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b">DbcDecodeBuilder::Build</a></div><div class="ttdeci">DecodeDatabase Build(const DbcDatabase &amp;source) const</div><div class="ttdoc">Build runtime decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decode__builder_8cpp_source.html#l00015">dbc_decode_builder.cpp:15</a></div></div>
+1
View File
@@ -97,6 +97,7 @@ $(document).ready(function(){initNavTree('dbc__decoder_8cpp.html',''); initResiz
<p>Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
<a href="#details">More...</a></p>
<div class="textblock"><code>#include &quot;<a class="el" href="dbc__decoder_8h_source.html">dbc_decoder.h</a>&quot;</code><br />
<code>#include &quot;signal_layout.h&quot;</code><br />
<code>#include &lt;cmath&gt;</code><br />
<code>#include &lt;utility&gt;</code><br />
</div>
+212 -214
View File
@@ -100,224 +100,222 @@ $(document).ready(function(){initNavTree('dbc__decoder_8cpp_source.html',''); in
<div class="contents">
<a href="dbc__decoder_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span> </div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="preprocessor">#include &quot;<a class="code" href="dbc__decoder_8h.html">dbc_decoder.h</a>&quot;</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="preprocessor">#include &lt;cmath&gt;</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="preprocessor">#include &lt;utility&gt;</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
<div class="foldopen" id="foldopen00016" data-start="{" data-end="}">
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"><a class="line" href="classDbcDecoder.html#a4005c4311f57b7faf21c0cb31463039c"> 16</a></span>std::shared_ptr&lt;const DecodeFrame&gt; <a class="code hl_function" href="classDbcDecoder.html#a4005c4311f57b7faf21c0cb31463039c">DbcDecoder::FindFrame</a>(<span class="keyword">const</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> &amp;database,</div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span> std::uint32_t canId,</div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> <span class="keywordtype">bool</span> isExtended)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> <span class="keywordflow">return</span> database.<a class="code hl_function" href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970">FindFrame</a>(<a class="code hl_struct" href="structFrameKey.html">FrameKey</a>(canId, isExtended));</div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span>}</div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="preprocessor">#include &quot;signal_layout.h&quot;</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span><span class="preprocessor">#include &lt;cmath&gt;</span></div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="preprocessor">#include &lt;utility&gt;</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> </div>
<div class="foldopen" id="foldopen00017" data-start="{" data-end="}">
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"><a class="line" href="classDbcDecoder.html#a4005c4311f57b7faf21c0cb31463039c"> 17</a></span>std::shared_ptr&lt;const DecodeFrame&gt; <a class="code hl_function" href="classDbcDecoder.html#a4005c4311f57b7faf21c0cb31463039c">DbcDecoder::FindFrame</a>(<span class="keyword">const</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> &amp;database,</div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> std::uint32_t canId,</div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> <span class="keywordtype">bool</span> isExtended)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span> <span class="keywordflow">return</span> database.<a class="code hl_function" href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970">FindFrame</a>(<a class="code hl_struct" href="structFrameKey.html">FrameKey</a>(canId, isExtended));</div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span>}</div>
</div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span> </div>
<div class="foldopen" id="foldopen00022" data-start="{" data-end="}">
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"><a class="line" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7"> 22</a></span><a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> <a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a>(<span class="keyword">const</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> &amp;database,</div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span> <span class="keyword">const</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> &amp;frame)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> result;</div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> result.<a class="code hl_variable" href="structDecodedFrameValue.html#a32143efe2023a1ecd977a9ae93e50b73">key</a> = <a class="code hl_struct" href="structFrameKey.html">FrameKey</a>(frame.<a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a>, frame.<a class="code hl_variable" href="structRawCanFrame.html#a462193d275adc1dba8bd18ffa0e36bb7">isExtended</a>);</div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> <span class="keyword">const</span> std::shared_ptr&lt;const DecodeFrame&gt; definition = <a class="code hl_function" href="classDbcDecoder.html#a4005c4311f57b7faf21c0cb31463039c">FindFrame</a>(database, frame.<a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a>, frame.<a class="code hl_variable" href="structRawCanFrame.html#a462193d275adc1dba8bd18ffa0e36bb7">isExtended</a>);</div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span> </div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> <span class="keywordflow">if</span> (definition == <span class="keyword">nullptr</span>)</div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> </div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> result.<a class="code hl_variable" href="structDecodedFrameValue.html#a33e971ba10030506007aa201c89f351d">definition</a> = definition;</div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span> result.<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span> result.<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a> = frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>.size() &lt; definition-&gt;dlc</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> ? FrameDecodeStatus::InsufficientPayload</div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> : FrameDecodeStatus::Valid;</div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> </div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> <span class="keyword">const</span> SelectorState selector = ReadSelector(*definition, frame);</div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> result.signals.reserve(definition-&gt;signals.size());</div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal: definition-&gt;signals) {</div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> decoded = DecodeOneSignal(signal, definition-&gt;dlc, frame, selector);</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> <span class="keywordflow">if</span> (!decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a> &amp;&amp; decoded.status != SignalDecodeStatus::Inactive &amp;&amp;</div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> result.<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a> == FrameDecodeStatus::Valid)</div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> result.<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a> = FrameDecodeStatus::SignalErrors;</div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a828b5ef7faefc14fbf5dbd46249bcad2">definition</a> = std::shared_ptr&lt;const DecodeSignal&gt;(definition, &amp;signal);</div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a33df0fcd92b23b3e08539906fc6b4c4a">key</a> = <a class="code hl_struct" href="structSignalKey.html">SignalKey</a>(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a32143efe2023a1ecd977a9ae93e50b73">key</a>, signal.name);</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> result.signals.push_back(std::move(decoded));</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> }</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> </div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span>}</div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span> </div>
<div class="foldopen" id="foldopen00023" data-start="{" data-end="}">
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"><a class="line" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7"> 23</a></span><a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> <a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a>(<span class="keyword">const</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> &amp;database,</div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span> <span class="keyword">const</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> &amp;frame)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> result;</div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> result.<a class="code hl_variable" href="structDecodedFrameValue.html#a32143efe2023a1ecd977a9ae93e50b73">key</a> = <a class="code hl_struct" href="structFrameKey.html">FrameKey</a>(frame.<a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a>, frame.<a class="code hl_variable" href="structRawCanFrame.html#a462193d275adc1dba8bd18ffa0e36bb7">isExtended</a>);</div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span> <span class="keyword">const</span> std::shared_ptr&lt;const DecodeFrame&gt; definition = <a class="code hl_function" href="classDbcDecoder.html#a4005c4311f57b7faf21c0cb31463039c">FindFrame</a>(database, frame.<a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a>, frame.<a class="code hl_variable" href="structRawCanFrame.html#a462193d275adc1dba8bd18ffa0e36bb7">isExtended</a>);</div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> </div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span> <span class="keywordflow">if</span> (definition == <span class="keyword">nullptr</span>)</div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> </div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span> result.<a class="code hl_variable" href="structDecodedFrameValue.html#a33e971ba10030506007aa201c89f351d">definition</a> = definition;</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span> result.<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> result.<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a> = frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>.size() &lt; definition-&gt;dlc</div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> ? FrameDecodeStatus::InsufficientPayload</div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> : FrameDecodeStatus::Valid;</div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> </div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> <span class="keyword">const</span> SelectorState selector = ReadSelector(*definition, frame);</div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> result.signals.reserve(definition-&gt;signals.size());</div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal: definition-&gt;signals) {</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> decoded = DecodeOneSignal(signal, definition-&gt;dlc, frame, selector);</div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> <span class="keywordflow">if</span> (!decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a> &amp;&amp; decoded.status != SignalDecodeStatus::Inactive &amp;&amp;</div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> result.<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a> == FrameDecodeStatus::Valid)</div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> result.<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a> = FrameDecodeStatus::SignalErrors;</div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a828b5ef7faefc14fbf5dbd46249bcad2">definition</a> = std::shared_ptr&lt;const DecodeSignal&gt;(definition, &amp;signal);</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a33df0fcd92b23b3e08539906fc6b4c4a">key</a> = <a class="code hl_struct" href="structSignalKey.html">SignalKey</a>(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a32143efe2023a1ecd977a9ae93e50b73">key</a>, signal.name);</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> result.signals.push_back(std::move(decoded));</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> }</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> </div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> <span class="keywordflow">return</span> result;</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span>}</div>
</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> </div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span><span class="keywordtype">bool</span> DbcDecoder::IsValidDefinition(<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal, std::uint8_t dlc) {</div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> <span class="keywordflow">if</span> (signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> == 0U || signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> &gt; 64U ||</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> (signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> != ByteOrder::Intel &amp;&amp; signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> != ByteOrder::Motorola) ||</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> (signal.<a class="code hl_variable" href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">valueType</a> != ValueType::Unsigned &amp;&amp; signal.<a class="code hl_variable" href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">valueType</a> != ValueType::Signed) ||</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> (signal.multiplexing.role != MultiplexRole::Unconditional &amp;&amp;</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> signal.multiplexing.role != MultiplexRole::Selector &amp;&amp;</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> signal.multiplexing.role != MultiplexRole::Branch))</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> </div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> <span class="comment">// Use widened coordinates to avoid overflow on malformed start bits.</span></div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> <span class="keyword">const</span> std::uint64_t start = signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> == ByteOrder::Intel</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> ? signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a></div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> : std::uint64_t(signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> / 8U) * 8U + 7U - signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> % 8U;</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> <span class="keywordflow">return</span> start + signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> &lt;= std::uint64_t(dlc) * 8U;</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span>}</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> </div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span>DbcDecoder::SelectorState DbcDecoder::ReadSelector(<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> &amp;definition,</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> <span class="keyword">const</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> &amp;frame) {</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> SelectorState selector;</div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> std::size_t count = 0U;</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal: definition.signals) {</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> <span class="keywordflow">if</span> (signal.multiplexing.role == MultiplexRole::Selector) {</div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> selector.definition = &amp;signal;</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> ++count;</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> }</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> }</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> <span class="keywordflow">if</span> (count != 1U)</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> <span class="keywordflow">return</span> selector;</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> </div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal = *selector.definition;</div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> selector.valid = signal.<a class="code hl_variable" href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">valueType</a> == ValueType::Unsigned &amp;&amp;</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> IsValidDefinition(signal, definition.<a class="code hl_variable" href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">dlc</a>);</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> selector.available = selector.valid &amp;&amp; ExtractUnsigned(frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>, signal, selector.value);</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> <span class="keywordflow">return</span> selector;</div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span>}</div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> </div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span><a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> DbcDecoder::DecodeOneSignal(<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal,</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> std::uint8_t dlc,</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> <span class="keyword">const</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> &amp;frame,</div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> <span class="keyword">const</span> SelectorState &amp;selector) {</div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> decoded;</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> std::uint64_t unsignedValue = 0U;</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> </div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> <span class="keywordflow">if</span> (!IsValidDefinition(signal, dlc) ||</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> (signal.multiplexing.role != MultiplexRole::Unconditional &amp;&amp; !selector.valid)) {</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> <span class="keywordflow">return</span> decoded;</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> }</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> <span class="keywordflow">if</span> (signal.multiplexing.role == MultiplexRole::Branch) {</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> <span class="keywordflow">if</span> (selector.definition-&gt;length &lt; 64U &amp;&amp; signal.multiplexing.value &gt;= (std::uint64_t(1U) &lt;&lt; selector.definition-&gt;length)) {</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> <span class="keywordflow">return</span> decoded;</div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> }</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> <span class="keywordflow">if</span> (!selector.available) {</div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> decoded.status = SignalDecodeStatus::SelectorUnavailable;</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> <span class="keywordflow">return</span> decoded;</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> }</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> <span class="keywordflow">if</span> (signal.multiplexing.value != selector.value) {</div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> decoded.status = SignalDecodeStatus::Inactive;</div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> <span class="keywordflow">return</span> decoded;</div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> }</div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> }</div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> <span class="keywordflow">if</span> (!ExtractUnsigned(frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>, signal, unsignedValue)) {</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> decoded.status = SignalDecodeStatus::InsufficientPayload;</div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> <span class="keywordflow">return</span> decoded;</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> }</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> </div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> <span class="keywordflow">if</span> (signal.<a class="code hl_variable" href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">valueType</a> == ValueType::Signed)</div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28">rawValue</a> = SignExtend(unsignedValue, signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a>);</div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28">rawValue</a> = unsignedValue;</div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> </div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> <span class="keywordtype">double</span> numericValue;</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> std::int64_t *signedValue = std::get_if&lt;std::int64_t&gt;(&amp;decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28">rawValue</a>))</div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> numericValue = <span class="keyword">static_cast&lt;</span><span class="keywordtype">double</span><span class="keyword">&gt;</span>(*signedValue);</div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> numericValue = <span class="keyword">static_cast&lt;</span><span class="keywordtype">double</span><span class="keyword">&gt;</span>(std::get&lt;std::uint64_t&gt;(decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28">rawValue</a>));</div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">physicalValue</a> = numericValue * signal.<a class="code hl_variable" href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">factor</a> + signal.<a class="code hl_variable" href="structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74">offset</a>;</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> <span class="keywordflow">if</span> (!std::isfinite(decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">physicalValue</a>)) {</div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> decoded.status = SignalDecodeStatus::PhysicalConversionFailed;</div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> <span class="keywordflow">return</span> decoded;</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> }</div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> decoded.status = SignalDecodeStatus::Valid;</div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> </div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> <span class="keywordflow">return</span> decoded;</div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span>}</div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> </div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span><span class="keywordtype">bool</span> DbcDecoder::ExtractUnsigned(<span class="keyword">const</span> std::vector&lt;std::uint8_t&gt; &amp;data,</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal,</div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> std::uint64_t &amp;value) {</div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> <span class="keywordflow">if</span> ((signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> == 0U) || (signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> &gt; 64U))</div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> </div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> <span class="keywordflow">if</span> (signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> == ByteOrder::Intel)</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> <span class="keywordflow">return</span> ExtractIntel(data, signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a>, signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a>, value);</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> </div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> <span class="keywordflow">return</span> ExtractMotorola(data, signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a>, signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a>, value);</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span>}</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> </div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span><span class="keywordtype">bool</span> DbcDecoder::ExtractIntel(<span class="keyword">const</span> std::vector&lt;std::uint8_t&gt; &amp;data,</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> std::uint32_t startBit,</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> std::uint32_t length,</div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> std::uint64_t &amp;value) {</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> value = 0U;</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> </div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> <span class="keywordflow">for</span> (std::uint32_t bitIndex = 0U; bitIndex &lt; length; ++bitIndex) {</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> <span class="keyword">const</span> std::uint32_t absoluteBit = startBit + bitIndex;</div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> <span class="keyword">const</span> std::uint32_t byteIndex = absoluteBit / 8U;</div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> <span class="keyword">const</span> std::uint32_t bitInByte = absoluteBit % 8U;</div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> </div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> <span class="keywordflow">if</span> (byteIndex &gt;= data.size())</div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> </div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> <span class="keyword">const</span> std::uint64_t bitValue =</div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> (<span class="keyword">static_cast&lt;</span>std::uint64_t<span class="keyword">&gt;</span>((data[byteIndex] &gt;&gt; bitInByte) &amp; 0x01U) &lt;&lt; bitIndex);</div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> </div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> value |= bitValue;</div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> }</div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> </div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span>}</div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> </div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span><span class="keywordtype">bool</span> DbcDecoder::ExtractMotorola(<span class="keyword">const</span> std::vector&lt;std::uint8_t&gt; &amp;data,</div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> std::uint32_t startBit,</div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> std::uint32_t length,</div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> std::uint64_t &amp;value) {</div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> <span class="comment">/*</span></div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span><span class="comment"> * DBC Motorola bit numbering:</span></div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span><span class="comment"> * - startBit points to the most significant bit of the signal</span></div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span><span class="comment"> * - inside a byte, bit numbering goes 7..0</span></div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span><span class="comment"> * - crossing byte boundary moves to the next byte, bit 7</span></div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span><span class="comment"> * Example: a signal starting at 7 follows 7..0, 15..8, 23..16.</span></div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span><span class="comment"> */</span></div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> </div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span><span class="keywordtype">bool</span> DbcDecoder::IsValidDefinition(<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal, std::uint8_t dlc) {</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> <span class="keywordflow">if</span> (signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> == 0U || signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> &gt; 64U ||</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> (signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> != ByteOrder::Intel &amp;&amp; signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> != ByteOrder::Motorola) ||</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> (signal.<a class="code hl_variable" href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">valueType</a> != ValueType::Unsigned &amp;&amp; signal.<a class="code hl_variable" href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">valueType</a> != ValueType::Signed) ||</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> (signal.multiplexing.role != MultiplexRole::Unconditional &amp;&amp;</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> signal.multiplexing.role != MultiplexRole::Selector &amp;&amp;</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> signal.multiplexing.role != MultiplexRole::Branch))</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> </div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> <span class="keywordflow">return</span> IsValidSignalLayout(signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a>, signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a>,</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> == ByteOrder::Intel, dlc);</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span>}</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> </div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span>DbcDecoder::SelectorState DbcDecoder::ReadSelector(<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> &amp;definition,</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> <span class="keyword">const</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> &amp;frame) {</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> SelectorState selector;</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> std::size_t count = 0U;</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal: definition.signals) {</div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> <span class="keywordflow">if</span> (signal.multiplexing.role == MultiplexRole::Selector) {</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> selector.definition = &amp;signal;</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> ++count;</div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> }</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> }</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> <span class="keywordflow">if</span> (count != 1U)</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> <span class="keywordflow">return</span> selector;</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> </div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal = *selector.definition;</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> selector.valid = signal.<a class="code hl_variable" href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">valueType</a> == ValueType::Unsigned &amp;&amp;</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> IsValidDefinition(signal, definition.<a class="code hl_variable" href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">dlc</a>);</div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> selector.available = selector.valid &amp;&amp; ExtractUnsigned(frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>, signal, selector.value);</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> <span class="keywordflow">return</span> selector;</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span>}</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> </div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span><a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> DbcDecoder::DecodeOneSignal(<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal,</div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> std::uint8_t dlc,</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> <span class="keyword">const</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> &amp;frame,</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> <span class="keyword">const</span> SelectorState &amp;selector) {</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> decoded;</div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> std::uint64_t unsignedValue = 0U;</div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> </div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> <span class="keywordflow">if</span> (!IsValidDefinition(signal, dlc) ||</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> (signal.multiplexing.role != MultiplexRole::Unconditional &amp;&amp; !selector.valid)) {</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> <span class="keywordflow">return</span> decoded;</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> }</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> <span class="keywordflow">if</span> (signal.multiplexing.role == MultiplexRole::Branch) {</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> <span class="keywordflow">if</span> (selector.definition-&gt;length &lt; 64U &amp;&amp; signal.multiplexing.value &gt;= (std::uint64_t(1U) &lt;&lt; selector.definition-&gt;length)) {</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> <span class="keywordflow">return</span> decoded;</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> }</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> <span class="keywordflow">if</span> (!selector.available) {</div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> decoded.status = SignalDecodeStatus::SelectorUnavailable;</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> <span class="keywordflow">return</span> decoded;</div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> }</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> <span class="keywordflow">if</span> (signal.multiplexing.value != selector.value) {</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> decoded.status = SignalDecodeStatus::Inactive;</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> <span class="keywordflow">return</span> decoded;</div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> }</div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> }</div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> <span class="keywordflow">if</span> (!ExtractUnsigned(frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>, signal, unsignedValue)) {</div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> decoded.status = SignalDecodeStatus::InsufficientPayload;</div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> <span class="keywordflow">return</span> decoded;</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> }</div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> </div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> <span class="keywordflow">if</span> (signal.<a class="code hl_variable" href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">valueType</a> == ValueType::Signed)</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28">rawValue</a> = SignExtend(unsignedValue, signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a>);</div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28">rawValue</a> = unsignedValue;</div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> </div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> <span class="keywordtype">double</span> numericValue;</div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> std::int64_t *signedValue = std::get_if&lt;std::int64_t&gt;(&amp;decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28">rawValue</a>))</div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> numericValue = <span class="keyword">static_cast&lt;</span><span class="keywordtype">double</span><span class="keyword">&gt;</span>(*signedValue);</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> numericValue = <span class="keyword">static_cast&lt;</span><span class="keywordtype">double</span><span class="keyword">&gt;</span>(std::get&lt;std::uint64_t&gt;(decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28">rawValue</a>));</div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">physicalValue</a> = numericValue * signal.<a class="code hl_variable" href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">factor</a> + signal.<a class="code hl_variable" href="structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74">offset</a>;</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> <span class="keywordflow">if</span> (!std::isfinite(decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">physicalValue</a>)) {</div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> decoded.status = SignalDecodeStatus::PhysicalConversionFailed;</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> <span class="keywordflow">return</span> decoded;</div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> }</div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> decoded.status = SignalDecodeStatus::Valid;</div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> </div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> <span class="keywordflow">return</span> decoded;</div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span>}</div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> </div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span><span class="keywordtype">bool</span> DbcDecoder::ExtractUnsigned(<span class="keyword">const</span> std::vector&lt;std::uint8_t&gt; &amp;data,</div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal,</div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> std::uint64_t &amp;value) {</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> <span class="keywordflow">if</span> ((signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> == 0U) || (signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> &gt; 64U))</div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> </div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> <span class="keywordflow">if</span> (signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> == ByteOrder::Intel)</div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> <span class="keywordflow">return</span> ExtractIntel(data, signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a>, signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a>, value);</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> </div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> <span class="keywordflow">return</span> ExtractMotorola(data, signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a>, signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a>, value);</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span>}</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> </div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span><span class="keywordtype">bool</span> DbcDecoder::ExtractIntel(<span class="keyword">const</span> std::vector&lt;std::uint8_t&gt; &amp;data,</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> std::uint32_t startBit,</div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> std::uint32_t length,</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> std::uint64_t &amp;value) {</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> value = 0U;</div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> </div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> <span class="keywordflow">for</span> (std::uint32_t bitIndex = 0U; bitIndex &lt; length; ++bitIndex) {</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> <span class="keyword">const</span> std::uint64_t absoluteBit = std::uint64_t(startBit) + bitIndex;</div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> <span class="keyword">const</span> std::uint64_t byteIndex = absoluteBit / 8U;</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> <span class="keyword">const</span> std::uint32_t bitInByte = absoluteBit % 8U;</div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> </div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> <span class="keywordflow">if</span> (byteIndex &gt;= data.size())</div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> </div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> <span class="keyword">const</span> std::uint64_t bitValue =</div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> (<span class="keyword">static_cast&lt;</span>std::uint64_t<span class="keyword">&gt;</span>((data[byteIndex] &gt;&gt; bitInByte) &amp; 0x01U) &lt;&lt; bitIndex);</div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> </div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> value |= bitValue;</div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> }</div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> </div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span>}</div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> </div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span><span class="keywordtype">bool</span> DbcDecoder::ExtractMotorola(<span class="keyword">const</span> std::vector&lt;std::uint8_t&gt; &amp;data,</div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> std::uint32_t startBit,</div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> std::uint32_t length,</div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> std::uint64_t &amp;value) {</div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> <span class="comment">/*</span></div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span><span class="comment"> * DBC Motorola bit numbering:</span></div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span><span class="comment"> * - startBit points to the most significant bit of the signal</span></div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span><span class="comment"> * - inside a byte, bit numbering goes 7..0</span></div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span><span class="comment"> * - crossing byte boundary moves to the next byte, bit 7</span></div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span><span class="comment"> * Example: a signal starting at 7 follows 7..0, 15..8, 23..16.</span></div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span><span class="comment"> */</span></div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> </div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> value = 0U;</div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> </div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> value = 0U;</div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> </div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> std::size_t byteIndex = startBit / 8U;</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> std::uint32_t bitInByte = startBit % 8U;</div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> </div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> <span class="keywordflow">for</span> (std::uint32_t bitIndex = 0U; bitIndex &lt; length; ++bitIndex) {</div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> <span class="keywordflow">if</span> (byteIndex &gt;= data.size())</div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> </div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> value &lt;&lt;= 1U;</div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> value |= <span class="keyword">static_cast&lt;</span>std::uint64_t<span class="keyword">&gt;</span>((data[byteIndex] &gt;&gt; bitInByte) &amp; 0x01U);</div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> </div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> <span class="keywordflow">if</span> (bitInByte == 0U) {</div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> ++byteIndex;</div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> bitInByte = 7U;</div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> } <span class="keywordflow">else</span></div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> --bitInByte;</div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> }</div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> </div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span>}</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> </div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span>std::int64_t DbcDecoder::SignExtend(std::uint64_t value, std::uint32_t bitLength) {</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> <span class="keywordflow">if</span> ((bitLength == 0U) || (bitLength &gt; 64U))</div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> </div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> <span class="keyword">const</span> std::uint64_t signMask = std::uint64_t(1U) &lt;&lt; (bitLength - 1U);</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> <span class="keyword">const</span> std::uint64_t valueMask = (bitLength == 64U)</div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> ? ~std::uint64_t(0U)</div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> : (std::uint64_t(1U) &lt;&lt; bitLength) - 1U;</div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> value &amp;= valueMask;</div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> </div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> <span class="keywordflow">if</span> ((value &amp; signMask) == 0U)</div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>std::int64_t<span class="keyword">&gt;</span>(value);</div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> </div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> <span class="comment">// The complemented magnitude fits int64_t, including for INT64_MIN.</span></div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> <span class="keywordflow">return</span> -1 - <span class="keyword">static_cast&lt;</span>std::int64_t<span class="keyword">&gt;</span>((~value) &amp; valueMask);</div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span>}</div>
<div class="ttc" id="aclassDbcDecoder_html_a345951ffe5d943a70d3a1ea1f39e74f7"><div class="ttname"><a href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a></div><div class="ttdeci">DecodedFrameValue Decode(const DecodeDatabase &amp;database, const RawCanFrame &amp;frame) const</div><div class="ttdoc">Decode one raw CAN frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00022">dbc_decoder.cpp:22</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_a4005c4311f57b7faf21c0cb31463039c"><div class="ttname"><a href="classDbcDecoder.html#a4005c4311f57b7faf21c0cb31463039c">DbcDecoder::FindFrame</a></div><div class="ttdeci">std::shared_ptr&lt; const DecodeFrame &gt; FindFrame(const DecodeDatabase &amp;database, std::uint32_t canId, bool isExtended) const</div><div class="ttdoc">Find frame definition by CAN ID.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00016">dbc_decoder.cpp:16</a></div></div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> std::size_t byteIndex = startBit / 8U;</div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> std::uint32_t bitInByte = startBit % 8U;</div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> </div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> <span class="keywordflow">for</span> (std::uint32_t bitIndex = 0U; bitIndex &lt; length; ++bitIndex) {</div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> <span class="keywordflow">if</span> (byteIndex &gt;= data.size())</div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> </div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> value &lt;&lt;= 1U;</div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> value |= <span class="keyword">static_cast&lt;</span>std::uint64_t<span class="keyword">&gt;</span>((data[byteIndex] &gt;&gt; bitInByte) &amp; 0x01U);</div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> </div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> <span class="keywordflow">if</span> (bitInByte == 0U) {</div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> ++byteIndex;</div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> bitInByte = 7U;</div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> } <span class="keywordflow">else</span></div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> --bitInByte;</div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> }</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> </div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span>}</div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> </div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span>std::int64_t DbcDecoder::SignExtend(std::uint64_t value, std::uint32_t bitLength) {</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> <span class="keywordflow">if</span> ((bitLength == 0U) || (bitLength &gt; 64U))</div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> <span class="keywordflow">return</span> 0;</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> </div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> <span class="keyword">const</span> std::uint64_t signMask = std::uint64_t(1U) &lt;&lt; (bitLength - 1U);</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> <span class="keyword">const</span> std::uint64_t valueMask = (bitLength == 64U)</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> ? ~std::uint64_t(0U)</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> : (std::uint64_t(1U) &lt;&lt; bitLength) - 1U;</div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> value &amp;= valueMask;</div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> </div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> <span class="keywordflow">if</span> ((value &amp; signMask) == 0U)</div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> <span class="keywordflow">return</span> <span class="keyword">static_cast&lt;</span>std::int64_t<span class="keyword">&gt;</span>(value);</div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> </div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> <span class="comment">// The complemented magnitude fits int64_t, including for INT64_MIN.</span></div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> <span class="keywordflow">return</span> -1 - <span class="keyword">static_cast&lt;</span>std::int64_t<span class="keyword">&gt;</span>((~value) &amp; valueMask);</div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span>}</div>
<div class="ttc" id="aclassDbcDecoder_html_a345951ffe5d943a70d3a1ea1f39e74f7"><div class="ttname"><a href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a></div><div class="ttdeci">DecodedFrameValue Decode(const DecodeDatabase &amp;database, const RawCanFrame &amp;frame) const</div><div class="ttdoc">Decode one raw CAN frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00023">dbc_decoder.cpp:23</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_a4005c4311f57b7faf21c0cb31463039c"><div class="ttname"><a href="classDbcDecoder.html#a4005c4311f57b7faf21c0cb31463039c">DbcDecoder::FindFrame</a></div><div class="ttdeci">std::shared_ptr&lt; const DecodeFrame &gt; FindFrame(const DecodeDatabase &amp;database, std::uint32_t canId, bool isExtended) const</div><div class="ttdoc">Find frame definition by CAN ID.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00017">dbc_decoder.cpp:17</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html"><div class="ttname"><a href="classDecodeDatabase.html">DecodeDatabase</a></div><div class="ttdoc">Immutable runtime snapshot. Copies share storage; reload replaces a snapshot. Owning lookup handles a...</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00087">decode_database.h:87</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html_a780d6e747a48b10a5eb0ab85448d2970"><div class="ttname"><a href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970">DecodeDatabase::FindFrame</a></div><div class="ttdeci">std::shared_ptr&lt; const DecodeFrame &gt; FindFrame(const FrameKey &amp;key) const</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8cpp_source.html#l00033">decode_database.cpp:33</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html_a780d6e747a48b10a5eb0ab85448d2970"><div class="ttname"><a href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970">DecodeDatabase::FindFrame</a></div><div class="ttdeci">std::shared_ptr&lt; const DecodeFrame &gt; FindFrame(const FrameKey &amp;key) const</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8cpp_source.html#l00110">decode_database.cpp:110</a></div></div>
<div class="ttc" id="adbc__decoder_8h_html"><div class="ttname"><a href="dbc__decoder_8h.html">dbc_decoder.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>
<div class="ttc" id="astructDecodeFrame_html"><div class="ttname"><a href="structDecodeFrame.html">DecodeFrame</a></div><div class="ttdoc">Runtime-ready frame definition.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00065">decode_database.h:65</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_a51111ac13988be372d5673d12cf3e060"><div class="ttname"><a href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">DecodeFrame::dlc</a></div><div class="ttdeci">std::uint8_t dlc</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00069">decode_database.h:69</a></div></div>
+2 -2
View File
@@ -211,8 +211,8 @@ $(document).ready(function(){initNavTree('dbc__decoder_8h_source.html',''); init
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> </div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span><span class="preprocessor">#endif </span><span class="comment">/* DBC_DECODER_H */</span><span class="preprocessor"></span></div>
<div class="ttc" id="aclassDbcDecoder_html"><div class="ttname"><a href="classDbcDecoder.html">DbcDecoder</a></div><div class="ttdoc">Runtime CAN decoder using prebuilt decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00084">dbc_decoder.h:84</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_a345951ffe5d943a70d3a1ea1f39e74f7"><div class="ttname"><a href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a></div><div class="ttdeci">DecodedFrameValue Decode(const DecodeDatabase &amp;database, const RawCanFrame &amp;frame) const</div><div class="ttdoc">Decode one raw CAN frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00022">dbc_decoder.cpp:22</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_a4005c4311f57b7faf21c0cb31463039c"><div class="ttname"><a href="classDbcDecoder.html#a4005c4311f57b7faf21c0cb31463039c">DbcDecoder::FindFrame</a></div><div class="ttdeci">std::shared_ptr&lt; const DecodeFrame &gt; FindFrame(const DecodeDatabase &amp;database, std::uint32_t canId, bool isExtended) const</div><div class="ttdoc">Find frame definition by CAN ID.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00016">dbc_decoder.cpp:16</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_a345951ffe5d943a70d3a1ea1f39e74f7"><div class="ttname"><a href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a></div><div class="ttdeci">DecodedFrameValue Decode(const DecodeDatabase &amp;database, const RawCanFrame &amp;frame) const</div><div class="ttdoc">Decode one raw CAN frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00023">dbc_decoder.cpp:23</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_a4005c4311f57b7faf21c0cb31463039c"><div class="ttname"><a href="classDbcDecoder.html#a4005c4311f57b7faf21c0cb31463039c">DbcDecoder::FindFrame</a></div><div class="ttdeci">std::shared_ptr&lt; const DecodeFrame &gt; FindFrame(const DecodeDatabase &amp;database, std::uint32_t canId, bool isExtended) const</div><div class="ttdoc">Find frame definition by CAN ID.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00017">dbc_decoder.cpp:17</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html"><div class="ttname"><a href="classDecodeDatabase.html">DecodeDatabase</a></div><div class="ttdoc">Immutable runtime snapshot. Copies share storage; reload replaces a snapshot. Owning lookup handles a...</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00087">decode_database.h:87</a></div></div>
<div class="ttc" id="adbc__decoder_8h_html_a855b2bc36cb18bfbae5ff30a2394e961"><div class="ttname"><a href="dbc__decoder_8h.html#a855b2bc36cb18bfbae5ff30a2394e961">FrameDecodeStatus</a></div><div class="ttdeci">FrameDecodeStatus</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00042">dbc_decoder.h:42</a></div></div>
<div class="ttc" id="adecode__database_8h_html"><div class="ttname"><a href="decode__database_8h.html">decode_database.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>
+378 -386
View File
@@ -104,393 +104,385 @@ $(document).ready(function(){initNavTree('dbc__decoder__test_8cpp_source.html','
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="preprocessor">#include &lt;cmath&gt;</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="preprocessor">#include &lt;limits&gt;</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="preprocessor">#include &lt;sstream&gt;</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span> </div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="keyword">struct </span>DecodeCase {</div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *name;</div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span> <a class="code hl_enumeration" href="decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142b">ByteOrder</a> byteOrder;</div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span> std::uint32_t startBit;</div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span> std::uint32_t length;</div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span> <a class="code hl_enumeration" href="decode__database_8h.html#ad9971b6ef33e02ba2c75d19c1d2518a1">ValueType</a> valueType;</div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span> std::vector&lt;std::uint8_t&gt; data;</div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> <span class="keywordtype">bool</span> valid;</div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> std::int64_t rawValue;</div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span> <span class="keywordtype">double</span> factor;</div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> <span class="keywordtype">double</span> offset;</div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> <span class="keywordtype">double</span> physicalValue;</div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span>};</div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span> </div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span>Q_DECLARE_METATYPE(DecodeCase)</div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span> </div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="keyword">class </span>DbcDecoderTest : <span class="keyword">public</span> QObject {</div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> Q_OBJECT</div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span><span class="keyword">private</span> Q_SLOTS:</div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span> <span class="keywordtype">void</span> decode_data();</div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> <span class="keywordtype">void</span> decode();</div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span> <span class="keywordtype">void</span> boundaries();</div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> <span class="keywordtype">void</span> payloadPolicy_data();</div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> <span class="keywordtype">void</span> payloadPolicy();</div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span> <span class="keywordtype">void</span> invalidDefinitions_data();</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span> <span class="keywordtype">void</span> invalidDefinitions();</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> <span class="keywordtype">void</span> physicalConversion_data();</div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> <span class="keywordtype">void</span> physicalConversion();</div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> <span class="keywordtype">void</span> selectorConversionFailure();</div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> <span class="keywordtype">void</span> zeroDlc();</div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span>};</div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> </div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span><span class="keywordtype">void</span> DbcDecoderTest::decode_data() {</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> QTest::addColumn&lt;DecodeCase&gt;(<span class="stringliteral">&quot;test&quot;</span>);</div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> <span class="keyword">const</span> DecodeCase cases[] = {</div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> {<span class="stringliteral">&quot;Motorola reproduction&quot;</span>, ByteOrder::Motorola, 7U, 16U, ValueType::Unsigned, {0x12, 0x34}, <span class="keyword">true</span>, 0x1234, 1.0, 0.0, 4660.0},</div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> {<span class="stringliteral">&quot;Motorola within byte&quot;</span>, ByteOrder::Motorola, 5U, 4U, ValueType::Unsigned, {0xAC}, <span class="keyword">true</span>, 11, 1.0, 0.0, 11.0},</div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> {<span class="stringliteral">&quot;Motorola unaligned crossing&quot;</span>, ByteOrder::Motorola, 3U, 12U, ValueType::Unsigned, {0xAB, 0xCD}, <span class="keyword">true</span>, 0xBCD, 1.0, 0.0, 3021.0},</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> {<span class="stringliteral">&quot;Motorola starts at bit zero&quot;</span>, ByteOrder::Motorola, 0U, 2U, ValueType::Unsigned, {0x01, 0x80}, <span class="keyword">true</span>, 3, 1.0, 0.0, 3.0},</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> {<span class="stringliteral">&quot;Motorola second byte&quot;</span>, ByteOrder::Motorola, 15U, 16U, ValueType::Unsigned, {0xFF, 0x12, 0x34}, <span class="keyword">true</span>, 0x1234, 1.0, 0.0, 4660.0},</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> {<span class="stringliteral">&quot;Motorola signed scaled&quot;</span>, ByteOrder::Motorola, 7U, 16U, ValueType::Signed, {0xFF, 0xFE}, <span class="keyword">true</span>, -2, 0.5, 10.0, 9.0},</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> {<span class="stringliteral">&quot;Motorola 64 bits&quot;</span>, ByteOrder::Motorola, 7U, 64U, ValueType::Unsigned, {0, 0, 0, 0, 0, 0, 0x12, 0x34}, <span class="keyword">true</span>, 0x1234, 1.0, 0.0, 4660.0},</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> {<span class="stringliteral">&quot;Motorola 64 bits high bit&quot;</span>, ByteOrder::Motorola, 7U, 64U, ValueType::Unsigned, {0x40, 0, 0, 0, 0, 0, 0, 0}, <span class="keyword">true</span>, 0x4000000000000000LL, 1.0, 0.0, 4611686018427387904.0},</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> {<span class="stringliteral">&quot;Motorola short payload&quot;</span>, ByteOrder::Motorola, 7U, 16U, ValueType::Unsigned, {0x12}, <span class="keyword">false</span>, 0, 1.0, 0.0, 0.0},</div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> {<span class="stringliteral">&quot;Motorola empty payload&quot;</span>, ByteOrder::Motorola, 7U, 8U, ValueType::Unsigned, {}, <span class="keyword">false</span>, 0, 1.0, 0.0, 0.0},</div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> {<span class="stringliteral">&quot;Motorola large start&quot;</span>, ByteOrder::Motorola, std::numeric_limits&lt;std::uint32_t&gt;::max(), 8U, ValueType::Unsigned, {0xFF}, <span class="keyword">false</span>, 0, 1.0, 0.0, 0.0},</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> {<span class="stringliteral">&quot;Motorola zero length&quot;</span>, ByteOrder::Motorola, 7U, 0U, ValueType::Unsigned, {0xFF}, <span class="keyword">false</span>, 0, 1.0, 0.0, 0.0},</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> {<span class="stringliteral">&quot;Motorola excessive length&quot;</span>, ByteOrder::Motorola, 7U, 65U, ValueType::Unsigned,</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> std::vector&lt;std::uint8_t&gt;(9U, 0xFF), <span class="keyword">false</span>, 0, 1.0, 0.0, 0.0},</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> {<span class="stringliteral">&quot;Intel regression&quot;</span>, ByteOrder::Intel, 0U, 16U, ValueType::Unsigned, {0x12, 0x34}, <span class="keyword">true</span>, 0x3412, 1.0, 0.0, 13330.0},</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> {<span class="stringliteral">&quot;Intel signed regression&quot;</span>, ByteOrder::Intel, 0U, 16U, ValueType::Signed, {0xFE, 0xFF}, <span class="keyword">true</span>, -2, 0.5, 10.0, 9.0},</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> {<span class="stringliteral">&quot;Intel short payload&quot;</span>, ByteOrder::Intel, 0U, 16U, ValueType::Unsigned, {0x12}, <span class="keyword">false</span>, 0, 1.0, 0.0, 0.0}};</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> </div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> DecodeCase &amp;test: cases)</div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> QTest::newRow(test.name) &lt;&lt; test;</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span>}</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> </div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span><span class="keywordtype">void</span> DbcDecoderTest::decode() {</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> QFETCH(DecodeCase, test);</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> signal;</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = test.name;</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> = test.byteOrder;</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = test.startBit;</div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = test.length;</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">valueType</a> = test.valueType;</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">factor</a> = test.factor;</div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74">offset</a> = test.offset;</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> </div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> definition;</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> definition.<a class="code hl_variable" href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">canId</a> = 0x123U;</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> definition.<a class="code hl_variable" href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">dlc</a> = 8U;</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> definition.signals.push_back(signal);</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> <span class="keyword">const</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> database({definition});</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> </div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> frame;</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a> = definition.<a class="code hl_variable" href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">canId</a>;</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> frame.data = test.data;</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> result = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(database, frame);</div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> QVERIFY2(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a>, test.name);</div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> QCOMPARE(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a33e971ba10030506007aa201c89f351d">definition</a>.get(), &amp;database.GetFrames()[0]);</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> QCOMPARE(result.signals.size(), std::size_t(1U));</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> &amp;decoded = result.signals[0];</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> QCOMPARE(decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a828b5ef7faefc14fbf5dbd46249bcad2">definition</a>.get(), &amp;database.GetFrames()[0].signals[0]);</div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> QCOMPARE(decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a>, test.valid);</div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> <span class="keywordflow">if</span> (!test.valid)</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> </div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> <span class="keywordflow">if</span> (test.valueType == ValueType::Signed) {</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> <span class="keyword">const</span> std::int64_t *raw = std::get_if&lt;std::int64_t&gt;(&amp;decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28">rawValue</a>);</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> QVERIFY(raw != <span class="keyword">nullptr</span>);</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> QCOMPARE(*raw, test.rawValue);</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> <span class="keyword">const</span> std::uint64_t *raw = std::get_if&lt;std::uint64_t&gt;(&amp;decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28">rawValue</a>);</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> QVERIFY(raw != <span class="keyword">nullptr</span>);</div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> QCOMPARE(*raw, <span class="keyword">static_cast&lt;</span>std::uint64_t<span class="keyword">&gt;</span>(test.rawValue));</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> }</div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> QCOMPARE(decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">physicalValue</a>, test.physicalValue);</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span>}</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> </div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span><span class="keywordtype">void</span> DbcDecoderTest::boundaries() {</div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> <span class="keywordflow">for</span> (<a class="code hl_enumeration" href="decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142b">ByteOrder</a> order: {ByteOrder::Intel, ByteOrder::Motorola}) {</div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> <span class="keywordflow">for</span> (<a class="code hl_enumeration" href="decode__database_8h.html#ad9971b6ef33e02ba2c75d19c1d2518a1">ValueType</a> type: {ValueType::Unsigned, ValueType::Signed}) {</div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> <span class="keywordflow">for</span> (std::uint64_t bits: {std::uint64_t(0U), std::uint64_t(0x7FFFFFFFFFFFFFFFULL),</div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> std::uint64_t(0x8000000000000000ULL),</div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> std::uint64_t(0x8000000000000001ULL),</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> std::uint64_t(0xFFFFFFFFFFFFFFFFULL)}) {</div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> definition;</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> definition.<a class="code hl_variable" href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">dlc</a> = 8U;</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> signal;</div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = order == ByteOrder::Intel ? 0U : 7U;</div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 64U;</div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> = order;</div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">valueType</a> = type;</div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">factor</a> = 0.5;</div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74">offset</a> = 10.0;</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> definition.signals.push_back(signal);</div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> <span class="keyword">const</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> database({definition});</div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> frame;</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">byte</span> = 0U; <span class="keywordtype">byte</span> &lt; 8U; ++byte) {</div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> shift = (order == ByteOrder::Intel ? byte : 7U - byte) * 8U;</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>.push_back(<span class="keyword">static_cast&lt;</span>std::uint8_t<span class="keyword">&gt;</span>(bits &gt;&gt; shift));</div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> }</div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> result = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(database, frame);</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> <span class="keyword">const</span> std::int64_t signedExpected = bits &lt;= 0x7FFFFFFFFFFFFFFFULL</div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> ? <span class="keyword">static_cast&lt;</span>std::int64_t<span class="keyword">&gt;</span>(bits)</div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> : std::numeric_limits&lt;std::int64_t&gt;::min() +</div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> static_cast&lt;std::int64_t&gt;(bits - 0x8000000000000000ULL);</div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> &amp;decoded = result.signals.at(0U);</div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> <span class="keyword">const</span> RawSignalValue expected = type == ValueType::Unsigned</div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> ? std::variant&lt;std::int64_t, std::uint64_t&gt;(bits)</div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> : std::variant&lt;std::int64_t, std::uint64_t&gt;(signedExpected);</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> <span class="keyword">const</span> <span class="keywordtype">double</span> physical = (type == ValueType::Unsigned</div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> ? <span class="keyword">static_cast&lt;</span><span class="keywordtype">double</span><span class="keyword">&gt;</span>(bits)</div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> : static_cast&lt;double&gt;(signedExpected)) *</div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> 0.5 +</div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> 10.0;</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> std::ostringstream actualText;</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> std::ostringstream expectedText;</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> std::int64_t *signedValue = std::get_if&lt;std::int64_t&gt;(&amp;decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28">rawValue</a>))</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> actualText &lt;&lt; *signedValue;</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> actualText &lt;&lt; std::get&lt;std::uint64_t&gt;(decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28">rawValue</a>);</div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> <span class="keywordflow">if</span> (type == ValueType::Unsigned)</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> expectedText &lt;&lt; bits;</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> expectedText &lt;&lt; signedExpected;</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> QVERIFY(decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a>);</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> QVERIFY(decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28">rawValue</a> == expected);</div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> QCOMPARE(decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">physicalValue</a>, physical);</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> QCOMPARE(actualText.str(), expectedText.str());</div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> }</div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> }</div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> }</div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span>}</div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> </div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span><span class="keywordtype">void</span> DbcDecoderTest::payloadPolicy_data() {</div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> QTest::addColumn&lt;unsigned&gt;(<span class="stringliteral">&quot;bytes&quot;</span>);</div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> QTest::addColumn&lt;FrameDecodeStatus&gt;(<span class="stringliteral">&quot;status&quot;</span>);</div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> QTest::newRow(<span class="stringliteral">&quot;empty&quot;</span>) &lt;&lt; 0U &lt;&lt; FrameDecodeStatus::InsufficientPayload;</div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> QTest::newRow(<span class="stringliteral">&quot;partial&quot;</span>) &lt;&lt; 1U &lt;&lt; FrameDecodeStatus::InsufficientPayload;</div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> QTest::newRow(<span class="stringliteral">&quot;short-with-all-signals&quot;</span>) &lt;&lt; 2U &lt;&lt; FrameDecodeStatus::InsufficientPayload;</div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> QTest::newRow(<span class="stringliteral">&quot;exact&quot;</span>) &lt;&lt; 3U &lt;&lt; FrameDecodeStatus::Valid;</div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> QTest::newRow(<span class="stringliteral">&quot;long&quot;</span>) &lt;&lt; 4U &lt;&lt; FrameDecodeStatus::Valid;</div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span>}</div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> </div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span><span class="keywordtype">void</span> DbcDecoderTest::payloadPolicy() {</div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> QFETCH(<span class="keywordtype">unsigned</span>, bytes);</div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> QFETCH(<a class="code hl_enumeration" href="dbc__decoder_8h.html#a855b2bc36cb18bfbae5ff30a2394e961">FrameDecodeStatus</a>, status);</div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> <span class="keywordflow">for</span> (<a class="code hl_enumeration" href="decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142b">ByteOrder</a> order: {ByteOrder::Intel, ByteOrder::Motorola}) {</div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> definition;</div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> definition.<a class="code hl_variable" href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">canId</a> = 17U;</div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> definition.<a class="code hl_variable" href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">dlc</a> = 3U;</div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> signal;</div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = <span class="stringliteral">&quot;First&quot;</span>;</div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 8U;</div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> = order;</div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = order == ByteOrder::Intel ? 0U : 7U;</div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> definition.signals.push_back(signal);</div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = <span class="stringliteral">&quot;Second&quot;</span>;</div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> += 8U;</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> definition.signals.push_back(signal);</div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> <span class="keyword">const</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> database({definition});</div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> raw;</div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> raw.<a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a> = 17U;</div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> raw.data.assign(bytes, 42U);</div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> result = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(database, raw);</div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> QVERIFY(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a>);</div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> QCOMPARE(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, status);</div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> QCOMPARE(result.signals.size(), std::size_t(2U));</div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> <span class="keywordflow">for</span> (std::size_t index = 0U; index &lt; result.signals.size(); ++index) {</div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> &amp;value = result.signals[index];</div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> QCOMPARE(value.status, bytes &gt; index ? SignalDecodeStatus::Valid : SignalDecodeStatus::InsufficientPayload);</div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> QCOMPARE(value.<a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a>, bytes &gt; index);</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> <span class="keywordflow">if</span> (value.<a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a>) {</div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> QCOMPARE(std::get&lt;std::uint64_t&gt;(value.<a class="code hl_variable" href="structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28">rawValue</a>), std::uint64_t(42U));</div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> QCOMPARE(value.<a class="code hl_variable" href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">physicalValue</a>, 42.0);</div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> }</div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> }</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> raw.isExtended = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> unknown = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(database, raw);</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> QVERIFY(!unknown.<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a> &amp;&amp; !unknown.<a class="code hl_variable" href="structDecodedFrameValue.html#a33e971ba10030506007aa201c89f351d">definition</a> &amp;&amp; unknown.signals.empty());</div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> QCOMPARE(unknown.<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, FrameDecodeStatus::UnknownFrame);</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> QVERIFY(unknown.<a class="code hl_variable" href="structDecodedFrameValue.html#a32143efe2023a1ecd977a9ae93e50b73">key</a> == <a class="code hl_struct" href="structFrameKey.html">FrameKey</a>(17U, <span class="keyword">true</span>));</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> QCOMPARE(<a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().Decode(<a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>(), raw).status, FrameDecodeStatus::UnknownFrame);</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> </div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> definition.signals.clear();</div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> raw.<a class="code hl_variable" href="structDecodeFrame.html#a3ee2348d781f8f15aaf87e8dcf57ec41">isExtended</a> = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> empty = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(<a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>({definition}), raw);</div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> QVERIFY(empty.<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a> &amp;&amp; empty.signals.empty());</div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> QCOMPARE(empty.<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, status);</div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> }</div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span>}</div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> </div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span><span class="keywordtype">void</span> DbcDecoderTest::invalidDefinitions_data() {</div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> QTest::addColumn&lt;int&gt;(<span class="stringliteral">&quot;kind&quot;</span>);</div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> QTest::newRow(<span class="stringliteral">&quot;zero-length&quot;</span>) &lt;&lt; 0;</div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> QTest::newRow(<span class="stringliteral">&quot;65-bits&quot;</span>) &lt;&lt; 1;</div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span> QTest::newRow(<span class="stringliteral">&quot;outside-dlc&quot;</span>) &lt;&lt; 2;</div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> QTest::newRow(<span class="stringliteral">&quot;start-overflow&quot;</span>) &lt;&lt; 3;</div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> QTest::newRow(<span class="stringliteral">&quot;invalid-byte-order&quot;</span>) &lt;&lt; 4;</div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> QTest::newRow(<span class="stringliteral">&quot;invalid-value-type&quot;</span>) &lt;&lt; 5;</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> QTest::newRow(<span class="stringliteral">&quot;invalid-multiplex-role&quot;</span>) &lt;&lt; 6;</div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> QTest::newRow(<span class="stringliteral">&quot;missing-selector&quot;</span>) &lt;&lt; 7;</div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span>}</div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> </div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span><span class="keywordtype">void</span> DbcDecoderTest::invalidDefinitions() {</div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> QFETCH(<span class="keywordtype">int</span>, kind);</div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> <span class="keywordflow">for</span> (<a class="code hl_enumeration" href="decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142b">ByteOrder</a> order: {ByteOrder::Intel, ByteOrder::Motorola}) {</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> definition;</div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> definition.<a class="code hl_variable" href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">dlc</a> = 1U;</div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> good;</div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span> good.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = <span class="stringliteral">&quot;Good&quot;</span>;</div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span> good.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 4U;</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> good.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> = order;</div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span> good.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = order == ByteOrder::Intel ? 0U : 7U;</div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> bad = good;</div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span> bad.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = <span class="stringliteral">&quot;Bad&quot;</span>;</div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span> <span class="keywordflow">switch</span> (kind) {</div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span> <span class="keywordflow">case</span> 0: bad.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 0U; <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</span> <span class="keywordflow">case</span> 1: bad.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 65U; <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</span> <span class="keywordflow">case</span> 2: bad.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> += 8U; <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno"> 249</span> <span class="keywordflow">case</span> 3: bad.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = std::numeric_limits&lt;std::uint32_t&gt;::max(); <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno"> 250</span> <span class="keywordflow">case</span> 4: bad.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> = <span class="keyword">static_cast&lt;</span><a class="code hl_enumeration" href="decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142b">ByteOrder</a><span class="keyword">&gt;</span>(99); <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span> <span class="keywordflow">case</span> 5: bad.<a class="code hl_variable" href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">valueType</a> = <span class="keyword">static_cast&lt;</span><a class="code hl_enumeration" href="decode__database_8h.html#ad9971b6ef33e02ba2c75d19c1d2518a1">ValueType</a><span class="keyword">&gt;</span>(99); <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span> <span class="keywordflow">case</span> 6: bad.multiplexing.role = <span class="keyword">static_cast&lt;</span>MultiplexRole<span class="keyword">&gt;</span>(99); <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span> <span class="keywordflow">case</span> 7: bad.multiplexing.role = MultiplexRole::Branch; <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span> }</div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span> definition.signals = {bad, good};</div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span> <span class="keyword">const</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> database({definition});</div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> raw;</div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span> raw.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a> = {0xFFU, 0xFFU}; <span class="comment">// Extra bytes must not rescue an invalid definition.</span></div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> result = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(database, raw);</div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span> QVERIFY(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a>);</div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"> 261</span> QCOMPARE(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, FrameDecodeStatus::SignalErrors);</div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"> 262</span> QCOMPARE(result.signals[0].<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, SignalDecodeStatus::InvalidDefinition);</div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span> QVERIFY(!result.signals[0].<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a> &amp;&amp; !result.signals[0].GetValueDescription());</div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"> 264</span> QCOMPARE(result.signals[1].<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, SignalDecodeStatus::Valid);</div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span> QCOMPARE(std::get&lt;std::uint64_t&gt;(result.signals[1].rawValue), std::uint64_t(15U));</div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span> QCOMPARE(result.signals[1].physicalValue, 15.0);</div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"> 267</span> raw.data.clear();</div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> shortResult = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(database, raw);</div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span> QCOMPARE(shortResult.<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, FrameDecodeStatus::InsufficientPayload);</div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span> QCOMPARE(shortResult.signals[0].<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, SignalDecodeStatus::InvalidDefinition);</div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span> QCOMPARE(shortResult.signals[1].<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, SignalDecodeStatus::InsufficientPayload);</div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span> }</div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"> 273</span>}</div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span> </div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span><span class="keywordtype">void</span> DbcDecoderTest::physicalConversion_data() {</div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span> QTest::addColumn&lt;double&gt;(<span class="stringliteral">&quot;factor&quot;</span>);</div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span> QTest::addColumn&lt;double&gt;(<span class="stringliteral">&quot;offset&quot;</span>);</div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span> QTest::addColumn&lt;bool&gt;(<span class="stringliteral">&quot;finite&quot;</span>);</div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span> <span class="keyword">const</span> <span class="keywordtype">double</span> infinity = std::numeric_limits&lt;double&gt;::infinity();</div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span> <span class="keyword">const</span> <span class="keywordtype">double</span> nan = std::numeric_limits&lt;double&gt;::quiet_NaN();</div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> <span class="keyword">const</span> <span class="keywordtype">double</span> maximum = std::numeric_limits&lt;double&gt;::max();</div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span> QTest::newRow(<span class="stringliteral">&quot;nan-factor&quot;</span>) &lt;&lt; nan &lt;&lt; 0.0 &lt;&lt; <span class="keyword">false</span>;</div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span> QTest::newRow(<span class="stringliteral">&quot;nan-offset&quot;</span>) &lt;&lt; 1.0 &lt;&lt; nan &lt;&lt; <span class="keyword">false</span>;</div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno"> 284</span> QTest::newRow(<span class="stringliteral">&quot;infinite-factor&quot;</span>) &lt;&lt; infinity &lt;&lt; 0.0 &lt;&lt; <span class="keyword">false</span>;</div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span> QTest::newRow(<span class="stringliteral">&quot;negative-infinite-factor&quot;</span>) &lt;&lt; -infinity &lt;&lt; 0.0 &lt;&lt; <span class="keyword">false</span>;</div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"> 286</span> QTest::newRow(<span class="stringliteral">&quot;infinite-offset&quot;</span>) &lt;&lt; 1.0 &lt;&lt; infinity &lt;&lt; <span class="keyword">false</span>;</div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span> QTest::newRow(<span class="stringliteral">&quot;negative-infinite-offset&quot;</span>) &lt;&lt; 1.0 &lt;&lt; -infinity &lt;&lt; <span class="keyword">false</span>;</div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span> QTest::newRow(<span class="stringliteral">&quot;multiply-overflow&quot;</span>) &lt;&lt; maximum &lt;&lt; 0.0 &lt;&lt; <span class="keyword">false</span>;</div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span> QTest::newRow(<span class="stringliteral">&quot;add-overflow&quot;</span>) &lt;&lt; maximum / 2.0 &lt;&lt; maximum &lt;&lt; <span class="keyword">false</span>;</div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno"> 290</span> QTest::newRow(<span class="stringliteral">&quot;finite-limit&quot;</span>) &lt;&lt; maximum / 2.0 &lt;&lt; 0.0 &lt;&lt; <span class="keyword">true</span>;</div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno"> 291</span> QTest::newRow(<span class="stringliteral">&quot;zero-factor&quot;</span>) &lt;&lt; 0.0 &lt;&lt; 42.0 &lt;&lt; <span class="keyword">true</span>;</div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"> 292</span>}</div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"> 293</span> </div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span><span class="keywordtype">void</span> DbcDecoderTest::physicalConversion() {</div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno"> 295</span> QFETCH(<span class="keywordtype">double</span>, factor);</div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno"> 296</span> QFETCH(<span class="keywordtype">double</span>, offset);</div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno"> 297</span> QFETCH(<span class="keywordtype">bool</span>, finite);</div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno"> 298</span> <span class="keywordflow">for</span> (<a class="code hl_enumeration" href="decode__database_8h.html#ad9971b6ef33e02ba2c75d19c1d2518a1">ValueType</a> type: {ValueType::Signed, ValueType::Unsigned}) {</div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno"> 299</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> definition;</div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno"> 300</span> definition.<a class="code hl_variable" href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">dlc</a> = 1U;</div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno"> 301</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> signal;</div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno"> 302</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = <span class="stringliteral">&quot;Scaled&quot;</span>;</div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno"> 303</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 4U;</div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"> 304</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">valueType</a> = type;</div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">factor</a> = factor;</div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74">offset</a> = offset;</div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno"> 307</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a822155d9bf4ed5f3300c9e9befe606ff">valueDescriptions</a>.emplace(std::uint64_t(2U), <span class="stringliteral">&quot;Two&quot;</span>);</div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"> 308</span> definition.signals.push_back(signal);</div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = <span class="stringliteral">&quot;Good&quot;</span>;</div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno"> 310</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = 4U;</div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno"> 311</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">factor</a> = 1.0;</div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74">offset</a> = 0.0;</div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"> 313</span> definition.signals.push_back(signal);</div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> raw;</div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"> 315</span> raw.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a> = {0x32U};</div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> result = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(<a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>({definition}), raw);</div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"> 317</span> QVERIFY(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a>);</div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span> QCOMPARE(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, finite ? FrameDecodeStatus::Valid : <a class="code hl_enumeration" href="dbc__decoder_8h.html#a855b2bc36cb18bfbae5ff30a2394e961">FrameDecodeStatus</a>::SignalErrors);</div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"> 319</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> &amp;scaled = result.signals[0];</div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span> QCOMPARE(scaled.<a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a>, finite);</div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span> QCOMPARE(scaled.status, finite ? SignalDecodeStatus::Valid : SignalDecodeStatus::PhysicalConversionFailed);</div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"> 322</span> QCOMPARE(std::isfinite(scaled.<a class="code hl_variable" href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">physicalValue</a>), finite);</div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno"> 323</span> <span class="keywordflow">if</span> (type == ValueType::Signed)</div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span> QCOMPARE(std::get&lt;std::int64_t&gt;(scaled.<a class="code hl_variable" href="structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28">rawValue</a>), std::int64_t(2));</div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"> 325</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno"> 326</span> QCOMPARE(std::get&lt;std::uint64_t&gt;(scaled.<a class="code hl_variable" href="structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28">rawValue</a>), std::uint64_t(2));</div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno"> 327</span> QVERIFY(result.signals[1].<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a>);</div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"> 328</span> QCOMPARE(result.signals[1].physicalValue, 3.0);</div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span> <span class="keywordflow">if</span> (finite) {</div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"> 330</span> QVERIFY(scaled.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>());</div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno"> 331</span> QCOMPARE(*scaled.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>(), std::string(<span class="stringliteral">&quot;Two&quot;</span>));</div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno"> 332</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno"> 333</span> QVERIFY(!scaled.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>());</div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"> 334</span> }</div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"> 335</span> }</div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno"> 336</span>}</div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno"> 337</span> </div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno"> 338</span><span class="keywordtype">void</span> DbcDecoderTest::selectorConversionFailure() {</div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno"> 339</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> definition;</div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno"> 340</span> definition.<a class="code hl_variable" href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">dlc</a> = 1U;</div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno"> 341</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> selector;</div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"> 342</span> selector.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = <span class="stringliteral">&quot;Selector&quot;</span>;</div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"> 343</span> selector.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 1U;</div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"> 344</span> selector.multiplexing.role = MultiplexRole::Selector;</div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"> 345</span> selector.<a class="code hl_variable" href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">factor</a> = std::numeric_limits&lt;double&gt;::infinity();</div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> branch;</div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno"> 347</span> branch.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = <span class="stringliteral">&quot;Branch&quot;</span>;</div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span> branch.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = 1U;</div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno"> 349</span> branch.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 7U;</div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"> 350</span> branch.multiplexing.role = MultiplexRole::Branch;</div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno"> 351</span> branch.multiplexing.value = 1U;</div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno"> 352</span> definition.signals = {branch, selector};</div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno"> 353</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> raw;</div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno"> 354</span> raw.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a> = {85U};</div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno"> 355</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> result = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(<a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>({definition}), raw);</div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno"> 356</span> QCOMPARE(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, FrameDecodeStatus::SignalErrors);</div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno"> 357</span> QVERIFY(result.signals[0].<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a>);</div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno"> 358</span> QCOMPARE(result.signals[0].physicalValue, 42.0);</div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno"> 359</span> QCOMPARE(result.signals[1].<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, SignalDecodeStatus::PhysicalConversionFailed);</div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno"> 360</span> QCOMPARE(std::get&lt;std::uint64_t&gt;(result.signals[1].rawValue), std::uint64_t(1U));</div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno"> 361</span> raw.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a> = {84U};</div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno"> 362</span> selector.<a class="code hl_variable" href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">factor</a> = 1.0;</div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno"> 363</span> definition.signals = {branch, selector};</div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno"> 364</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> inactive = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(<a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>({definition}), raw);</div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno"> 365</span> QCOMPARE(inactive.<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, FrameDecodeStatus::Valid);</div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno"> 366</span> QCOMPARE(inactive.signals[0].<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, SignalDecodeStatus::Inactive);</div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno"> 367</span>}</div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno"> 368</span> </div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno"> 369</span><span class="keywordtype">void</span> DbcDecoderTest::zeroDlc() {</div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno"> 370</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> definition;</div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno"> 371</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> raw;</div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno"> 372</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::vector&lt;std::uint8_t&gt; &amp;data: {std::vector&lt;std::uint8_t&gt;(), std::vector&lt;std::uint8_t&gt;{42U}}) {</div>
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno"> 373</span> raw.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a> = data;</div>
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno"> 374</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> result = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(<a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>({definition}), raw);</div>
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno"> 375</span> QVERIFY(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a> &amp;&amp; result.signals.empty());</div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno"> 376</span> QCOMPARE(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, FrameDecodeStatus::Valid);</div>
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno"> 377</span> }</div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno"> 378</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> signal;</div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno"> 379</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 8U;</div>
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno"> 380</span> definition.signals.push_back(signal);</div>
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno"> 381</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> invalid = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(<a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>({definition}), raw);</div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno"> 382</span> QCOMPARE(invalid.<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, FrameDecodeStatus::SignalErrors);</div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno"> 383</span> QCOMPARE(invalid.signals[0].<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, SignalDecodeStatus::InvalidDefinition);</div>
<div class="line"><a id="l00384" name="l00384"></a><span class="lineno"> 384</span>}</div>
<div class="line"><a id="l00385" name="l00385"></a><span class="lineno"> 385</span> </div>
<div class="line"><a id="l00386" name="l00386"></a><span class="lineno"> 386</span><span class="keywordtype">int</span> RunDecoderTests(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv) {</div>
<div class="line"><a id="l00387" name="l00387"></a><span class="lineno"> 387</span> DbcDecoderTest tests;</div>
<div class="line"><a id="l00388" name="l00388"></a><span class="lineno"> 388</span> <span class="keywordflow">return</span> QTest::qExec(&amp;tests, argc, argv);</div>
<div class="line"><a id="l00389" name="l00389"></a><span class="lineno"> 389</span>}</div>
<div class="line"><a id="l00390" name="l00390"></a><span class="lineno"> 390</span> </div>
<div class="line"><a id="l00391" name="l00391"></a><span class="lineno"> 391</span><span class="preprocessor">#include &quot;dbc_decoder_test.moc&quot;</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="preprocessor">#include &lt;stdexcept&gt;</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span> </div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="keyword">struct </span>DecodeCase {</div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *name;</div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span> <a class="code hl_enumeration" href="decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142b">ByteOrder</a> byteOrder;</div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span> std::uint32_t startBit;</div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span> std::uint32_t length;</div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span> <a class="code hl_enumeration" href="decode__database_8h.html#ad9971b6ef33e02ba2c75d19c1d2518a1">ValueType</a> valueType;</div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> std::vector&lt;std::uint8_t&gt; data;</div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> <span class="keywordtype">bool</span> valid;</div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span> std::int64_t rawValue;</div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> <span class="keywordtype">double</span> factor;</div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> <span class="keywordtype">double</span> offset;</div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span> <span class="keywordtype">double</span> physicalValue;</div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span>};</div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span> </div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span>Q_DECLARE_METATYPE(DecodeCase)</div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span> </div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="keyword">class </span>DbcDecoderTest : <span class="keyword">public</span> QObject {</div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> Q_OBJECT</div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span><span class="keyword">private</span> Q_SLOTS:</div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> <span class="keywordtype">void</span> decode_data();</div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span> <span class="keywordtype">void</span> decode();</div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> <span class="keywordtype">void</span> boundaries();</div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> <span class="keywordtype">void</span> payloadPolicy_data();</div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span> <span class="keywordtype">void</span> payloadPolicy();</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span> <span class="keywordtype">void</span> invalidDefinitions_data();</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> <span class="keywordtype">void</span> invalidDefinitions();</div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> <span class="keywordtype">void</span> physicalConversion_data();</div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> <span class="keywordtype">void</span> physicalConversion();</div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> <span class="keywordtype">void</span> selectorConversionFailure();</div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> <span class="keywordtype">void</span> zeroDlc();</div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span>};</div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> </div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span><span class="keywordtype">void</span> DbcDecoderTest::decode_data() {</div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> QTest::addColumn&lt;DecodeCase&gt;(<span class="stringliteral">&quot;test&quot;</span>);</div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> <span class="keyword">const</span> DecodeCase cases[] = {</div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> {<span class="stringliteral">&quot;Motorola reproduction&quot;</span>, ByteOrder::Motorola, 7U, 16U, ValueType::Unsigned, {0x12, 0x34}, <span class="keyword">true</span>, 0x1234, 1.0, 0.0, 4660.0},</div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> {<span class="stringliteral">&quot;Motorola within byte&quot;</span>, ByteOrder::Motorola, 5U, 4U, ValueType::Unsigned, {0xAC}, <span class="keyword">true</span>, 11, 1.0, 0.0, 11.0},</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> {<span class="stringliteral">&quot;Motorola unaligned crossing&quot;</span>, ByteOrder::Motorola, 3U, 12U, ValueType::Unsigned, {0xAB, 0xCD}, <span class="keyword">true</span>, 0xBCD, 1.0, 0.0, 3021.0},</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> {<span class="stringliteral">&quot;Motorola starts at bit zero&quot;</span>, ByteOrder::Motorola, 0U, 2U, ValueType::Unsigned, {0x01, 0x80}, <span class="keyword">true</span>, 3, 1.0, 0.0, 3.0},</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> {<span class="stringliteral">&quot;Motorola second byte&quot;</span>, ByteOrder::Motorola, 15U, 16U, ValueType::Unsigned, {0xFF, 0x12, 0x34}, <span class="keyword">true</span>, 0x1234, 1.0, 0.0, 4660.0},</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> {<span class="stringliteral">&quot;Motorola signed scaled&quot;</span>, ByteOrder::Motorola, 7U, 16U, ValueType::Signed, {0xFF, 0xFE}, <span class="keyword">true</span>, -2, 0.5, 10.0, 9.0},</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> {<span class="stringliteral">&quot;Motorola 64 bits&quot;</span>, ByteOrder::Motorola, 7U, 64U, ValueType::Unsigned, {0, 0, 0, 0, 0, 0, 0x12, 0x34}, <span class="keyword">true</span>, 0x1234, 1.0, 0.0, 4660.0},</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> {<span class="stringliteral">&quot;Motorola 64 bits high bit&quot;</span>, ByteOrder::Motorola, 7U, 64U, ValueType::Unsigned, {0x40, 0, 0, 0, 0, 0, 0, 0}, <span class="keyword">true</span>, 0x4000000000000000LL, 1.0, 0.0, 4611686018427387904.0},</div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> {<span class="stringliteral">&quot;Motorola short payload&quot;</span>, ByteOrder::Motorola, 7U, 16U, ValueType::Unsigned, {0x12}, <span class="keyword">false</span>, 0, 1.0, 0.0, 0.0},</div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> {<span class="stringliteral">&quot;Motorola empty payload&quot;</span>, ByteOrder::Motorola, 7U, 8U, ValueType::Unsigned, {}, <span class="keyword">false</span>, 0, 1.0, 0.0, 0.0},</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> {<span class="stringliteral">&quot;Motorola large start&quot;</span>, ByteOrder::Motorola, std::numeric_limits&lt;std::uint32_t&gt;::max(), 8U, ValueType::Unsigned, {0xFF}, <span class="keyword">false</span>, 0, 1.0, 0.0, 0.0},</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> {<span class="stringliteral">&quot;Motorola zero length&quot;</span>, ByteOrder::Motorola, 7U, 0U, ValueType::Unsigned, {0xFF}, <span class="keyword">false</span>, 0, 1.0, 0.0, 0.0},</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> {<span class="stringliteral">&quot;Motorola excessive length&quot;</span>, ByteOrder::Motorola, 7U, 65U, ValueType::Unsigned,</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> std::vector&lt;std::uint8_t&gt;(9U, 0xFF), <span class="keyword">false</span>, 0, 1.0, 0.0, 0.0},</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> {<span class="stringliteral">&quot;Intel regression&quot;</span>, ByteOrder::Intel, 0U, 16U, ValueType::Unsigned, {0x12, 0x34}, <span class="keyword">true</span>, 0x3412, 1.0, 0.0, 13330.0},</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> {<span class="stringliteral">&quot;Intel signed regression&quot;</span>, ByteOrder::Intel, 0U, 16U, ValueType::Signed, {0xFE, 0xFF}, <span class="keyword">true</span>, -2, 0.5, 10.0, 9.0},</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> {<span class="stringliteral">&quot;Intel short payload&quot;</span>, ByteOrder::Intel, 0U, 16U, ValueType::Unsigned, {0x12}, <span class="keyword">false</span>, 0, 1.0, 0.0, 0.0}};</div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> </div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> DecodeCase &amp;test: cases)</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> QTest::newRow(test.name) &lt;&lt; test;</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span>}</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> </div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span><span class="keywordtype">void</span> DbcDecoderTest::decode() {</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> QFETCH(DecodeCase, test);</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> signal;</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = test.name;</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> = test.byteOrder;</div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = test.startBit;</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = test.length;</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">valueType</a> = test.valueType;</div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">factor</a> = test.factor;</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74">offset</a> = test.offset;</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> </div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> definition;</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> definition.<a class="code hl_variable" href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">canId</a> = 0x123U;</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> definition.<a class="code hl_variable" href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">dlc</a> = 8U;</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> definition.signals.push_back(signal);</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> <span class="keywordflow">if</span> (test.length == 0U || test.length &gt; 64U || test.startBit &gt; 64U) {</div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> QVERIFY_THROWS_EXCEPTION(std::invalid_argument, (<span class="keywordtype">void</span>) <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>({definition}));</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> }</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> <span class="keyword">const</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> database({definition});</div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> </div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> frame;</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a> = definition.<a class="code hl_variable" href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">canId</a>;</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> frame.data = test.data;</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> result = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(database, frame);</div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> QVERIFY2(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a>, test.name);</div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> QCOMPARE(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a33e971ba10030506007aa201c89f351d">definition</a>.get(), &amp;database.GetFrames()[0]);</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> QCOMPARE(result.signals.size(), std::size_t(1U));</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> &amp;decoded = result.signals[0];</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> QCOMPARE(decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a828b5ef7faefc14fbf5dbd46249bcad2">definition</a>.get(), &amp;database.GetFrames()[0].signals[0]);</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> QCOMPARE(decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a>, test.valid);</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> <span class="keywordflow">if</span> (!test.valid)</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> <span class="keywordflow">return</span>;</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> </div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> <span class="keywordflow">if</span> (test.valueType == ValueType::Signed) {</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> <span class="keyword">const</span> std::int64_t *raw = std::get_if&lt;std::int64_t&gt;(&amp;decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28">rawValue</a>);</div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> QVERIFY(raw != <span class="keyword">nullptr</span>);</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> QCOMPARE(*raw, test.rawValue);</div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> <span class="keyword">const</span> std::uint64_t *raw = std::get_if&lt;std::uint64_t&gt;(&amp;decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28">rawValue</a>);</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> QVERIFY(raw != <span class="keyword">nullptr</span>);</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> QCOMPARE(*raw, <span class="keyword">static_cast&lt;</span>std::uint64_t<span class="keyword">&gt;</span>(test.rawValue));</div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> }</div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> QCOMPARE(decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">physicalValue</a>, test.physicalValue);</div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span>}</div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> </div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span><span class="keywordtype">void</span> DbcDecoderTest::boundaries() {</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> <span class="keywordflow">for</span> (<a class="code hl_enumeration" href="decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142b">ByteOrder</a> order: {ByteOrder::Intel, ByteOrder::Motorola}) {</div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> <span class="keywordflow">for</span> (<a class="code hl_enumeration" href="decode__database_8h.html#ad9971b6ef33e02ba2c75d19c1d2518a1">ValueType</a> type: {ValueType::Unsigned, ValueType::Signed}) {</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> <span class="keywordflow">for</span> (std::uint64_t bits: {std::uint64_t(0U), std::uint64_t(0x7FFFFFFFFFFFFFFFULL),</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> std::uint64_t(0x8000000000000000ULL),</div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> std::uint64_t(0x8000000000000001ULL),</div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> std::uint64_t(0xFFFFFFFFFFFFFFFFULL)}) {</div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> definition;</div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> definition.<a class="code hl_variable" href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">dlc</a> = 8U;</div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> signal;</div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = order == ByteOrder::Intel ? 0U : 7U;</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 64U;</div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> = order;</div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">valueType</a> = type;</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">factor</a> = 0.5;</div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74">offset</a> = 10.0;</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> definition.signals.push_back(signal);</div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> <span class="keyword">const</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> database({definition});</div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> frame;</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">byte</span> = 0U; <span class="keywordtype">byte</span> &lt; 8U; ++byte) {</div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> <span class="keyword">const</span> <span class="keywordtype">unsigned</span> shift = (order == ByteOrder::Intel ? byte : 7U - byte) * 8U;</div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>.push_back(<span class="keyword">static_cast&lt;</span>std::uint8_t<span class="keyword">&gt;</span>(bits &gt;&gt; shift));</div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> }</div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> result = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(database, frame);</div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> <span class="keyword">const</span> std::int64_t signedExpected = bits &lt;= 0x7FFFFFFFFFFFFFFFULL</div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> ? <span class="keyword">static_cast&lt;</span>std::int64_t<span class="keyword">&gt;</span>(bits)</div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> : std::numeric_limits&lt;std::int64_t&gt;::min() +</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> static_cast&lt;std::int64_t&gt;(bits - 0x8000000000000000ULL);</div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> &amp;decoded = result.signals.at(0U);</div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> <span class="keyword">const</span> RawSignalValue expected = type == ValueType::Unsigned</div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> ? std::variant&lt;std::int64_t, std::uint64_t&gt;(bits)</div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> : std::variant&lt;std::int64_t, std::uint64_t&gt;(signedExpected);</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> <span class="keyword">const</span> <span class="keywordtype">double</span> physical = (type == ValueType::Unsigned</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> ? <span class="keyword">static_cast&lt;</span><span class="keywordtype">double</span><span class="keyword">&gt;</span>(bits)</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> : static_cast&lt;double&gt;(signedExpected)) *</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> 0.5 +</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> 10.0;</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> std::ostringstream actualText;</div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> std::ostringstream expectedText;</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> std::int64_t *signedValue = std::get_if&lt;std::int64_t&gt;(&amp;decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28">rawValue</a>))</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> actualText &lt;&lt; *signedValue;</div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> actualText &lt;&lt; std::get&lt;std::uint64_t&gt;(decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28">rawValue</a>);</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> <span class="keywordflow">if</span> (type == ValueType::Unsigned)</div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> expectedText &lt;&lt; bits;</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> expectedText &lt;&lt; signedExpected;</div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> QVERIFY(decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a>);</div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> QVERIFY(decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28">rawValue</a> == expected);</div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> QCOMPARE(decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">physicalValue</a>, physical);</div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> QCOMPARE(actualText.str(), expectedText.str());</div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> }</div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> }</div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> }</div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span>}</div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> </div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span><span class="keywordtype">void</span> DbcDecoderTest::payloadPolicy_data() {</div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> QTest::addColumn&lt;unsigned&gt;(<span class="stringliteral">&quot;bytes&quot;</span>);</div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> QTest::addColumn&lt;FrameDecodeStatus&gt;(<span class="stringliteral">&quot;status&quot;</span>);</div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> QTest::newRow(<span class="stringliteral">&quot;empty&quot;</span>) &lt;&lt; 0U &lt;&lt; FrameDecodeStatus::InsufficientPayload;</div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> QTest::newRow(<span class="stringliteral">&quot;partial&quot;</span>) &lt;&lt; 1U &lt;&lt; FrameDecodeStatus::InsufficientPayload;</div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> QTest::newRow(<span class="stringliteral">&quot;short-with-all-signals&quot;</span>) &lt;&lt; 2U &lt;&lt; FrameDecodeStatus::InsufficientPayload;</div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> QTest::newRow(<span class="stringliteral">&quot;exact&quot;</span>) &lt;&lt; 3U &lt;&lt; FrameDecodeStatus::Valid;</div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> QTest::newRow(<span class="stringliteral">&quot;long&quot;</span>) &lt;&lt; 4U &lt;&lt; FrameDecodeStatus::Valid;</div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span>}</div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> </div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span><span class="keywordtype">void</span> DbcDecoderTest::payloadPolicy() {</div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> QFETCH(<span class="keywordtype">unsigned</span>, bytes);</div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> QFETCH(<a class="code hl_enumeration" href="dbc__decoder_8h.html#a855b2bc36cb18bfbae5ff30a2394e961">FrameDecodeStatus</a>, status);</div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> <span class="keywordflow">for</span> (<a class="code hl_enumeration" href="decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142b">ByteOrder</a> order: {ByteOrder::Intel, ByteOrder::Motorola}) {</div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> definition;</div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> definition.<a class="code hl_variable" href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">canId</a> = 17U;</div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> definition.<a class="code hl_variable" href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">dlc</a> = 3U;</div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> signal;</div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = <span class="stringliteral">&quot;First&quot;</span>;</div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 8U;</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> = order;</div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = order == ByteOrder::Intel ? 0U : 7U;</div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> definition.signals.push_back(signal);</div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = <span class="stringliteral">&quot;Second&quot;</span>;</div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> += 8U;</div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> definition.signals.push_back(signal);</div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> <span class="keyword">const</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> database({definition});</div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> raw;</div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> raw.<a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a> = 17U;</div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> raw.data.assign(bytes, 42U);</div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> result = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(database, raw);</div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> QVERIFY(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a>);</div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> QCOMPARE(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, status);</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> QCOMPARE(result.signals.size(), std::size_t(2U));</div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> <span class="keywordflow">for</span> (std::size_t index = 0U; index &lt; result.signals.size(); ++index) {</div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> &amp;value = result.signals[index];</div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> QCOMPARE(value.status, bytes &gt; index ? SignalDecodeStatus::Valid : SignalDecodeStatus::InsufficientPayload);</div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> QCOMPARE(value.<a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a>, bytes &gt; index);</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> <span class="keywordflow">if</span> (value.<a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a>) {</div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> QCOMPARE(std::get&lt;std::uint64_t&gt;(value.<a class="code hl_variable" href="structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28">rawValue</a>), std::uint64_t(42U));</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> QCOMPARE(value.<a class="code hl_variable" href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">physicalValue</a>, 42.0);</div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> }</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> }</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> raw.isExtended = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> unknown = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(database, raw);</div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> QVERIFY(!unknown.<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a> &amp;&amp; !unknown.<a class="code hl_variable" href="structDecodedFrameValue.html#a33e971ba10030506007aa201c89f351d">definition</a> &amp;&amp; unknown.signals.empty());</div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> QCOMPARE(unknown.<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, FrameDecodeStatus::UnknownFrame);</div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> QVERIFY(unknown.<a class="code hl_variable" href="structDecodedFrameValue.html#a32143efe2023a1ecd977a9ae93e50b73">key</a> == <a class="code hl_struct" href="structFrameKey.html">FrameKey</a>(17U, <span class="keyword">true</span>));</div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> QCOMPARE(<a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().Decode(<a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>(), raw).status, FrameDecodeStatus::UnknownFrame);</div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> </div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> definition.signals.clear();</div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> raw.<a class="code hl_variable" href="structDecodeFrame.html#a3ee2348d781f8f15aaf87e8dcf57ec41">isExtended</a> = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> empty = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(<a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>({definition}), raw);</div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> QVERIFY(empty.<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a> &amp;&amp; empty.signals.empty());</div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> QCOMPARE(empty.<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, status);</div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> }</div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span>}</div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span> </div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span><span class="keywordtype">void</span> DbcDecoderTest::invalidDefinitions_data() {</div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> QTest::addColumn&lt;int&gt;(<span class="stringliteral">&quot;kind&quot;</span>);</div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> QTest::newRow(<span class="stringliteral">&quot;zero-length&quot;</span>) &lt;&lt; 0;</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> QTest::newRow(<span class="stringliteral">&quot;65-bits&quot;</span>) &lt;&lt; 1;</div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> QTest::newRow(<span class="stringliteral">&quot;outside-dlc&quot;</span>) &lt;&lt; 2;</div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> QTest::newRow(<span class="stringliteral">&quot;start-overflow&quot;</span>) &lt;&lt; 3;</div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> QTest::newRow(<span class="stringliteral">&quot;invalid-byte-order&quot;</span>) &lt;&lt; 4;</div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> QTest::newRow(<span class="stringliteral">&quot;invalid-value-type&quot;</span>) &lt;&lt; 5;</div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> QTest::newRow(<span class="stringliteral">&quot;invalid-multiplex-role&quot;</span>) &lt;&lt; 6;</div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> QTest::newRow(<span class="stringliteral">&quot;missing-selector&quot;</span>) &lt;&lt; 7;</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span>}</div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> </div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span><span class="keywordtype">void</span> DbcDecoderTest::invalidDefinitions() {</div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span> QFETCH(<span class="keywordtype">int</span>, kind);</div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span> <span class="keywordflow">for</span> (<a class="code hl_enumeration" href="decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142b">ByteOrder</a> order: {ByteOrder::Intel, ByteOrder::Motorola}) {</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> definition;</div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span> definition.<a class="code hl_variable" href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">dlc</a> = 1U;</div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> good;</div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span> good.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = <span class="stringliteral">&quot;Good&quot;</span>;</div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span> good.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 4U;</div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span> good.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> = order;</div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</span> good.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = order == ByteOrder::Intel ? 0U : 7U;</div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> bad = good;</div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno"> 249</span> bad.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = <span class="stringliteral">&quot;Bad&quot;</span>;</div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno"> 250</span> <span class="keywordflow">switch</span> (kind) {</div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span> <span class="keywordflow">case</span> 0: bad.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 0U; <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span> <span class="keywordflow">case</span> 1: bad.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 65U; <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span> <span class="keywordflow">case</span> 2: bad.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> += 8U; <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span> <span class="keywordflow">case</span> 3: bad.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = std::numeric_limits&lt;std::uint32_t&gt;::max(); <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span> <span class="keywordflow">case</span> 4: bad.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> = <span class="keyword">static_cast&lt;</span><a class="code hl_enumeration" href="decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142b">ByteOrder</a><span class="keyword">&gt;</span>(99); <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span> <span class="keywordflow">case</span> 5: bad.<a class="code hl_variable" href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">valueType</a> = <span class="keyword">static_cast&lt;</span><a class="code hl_enumeration" href="decode__database_8h.html#ad9971b6ef33e02ba2c75d19c1d2518a1">ValueType</a><span class="keyword">&gt;</span>(99); <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span> <span class="keywordflow">case</span> 6: bad.multiplexing.role = <span class="keyword">static_cast&lt;</span>MultiplexRole<span class="keyword">&gt;</span>(99); <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span> <span class="keywordflow">case</span> 7: bad.multiplexing.role = MultiplexRole::Branch; <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span> }</div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span> definition.signals = {bad, good};</div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"> 261</span> QVERIFY_THROWS_EXCEPTION(std::invalid_argument, (<span class="keywordtype">void</span>) <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>({definition}));</div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"> 262</span> }</div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span>}</div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"> 264</span> </div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span><span class="keywordtype">void</span> DbcDecoderTest::physicalConversion_data() {</div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span> QTest::addColumn&lt;double&gt;(<span class="stringliteral">&quot;factor&quot;</span>);</div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"> 267</span> QTest::addColumn&lt;double&gt;(<span class="stringliteral">&quot;offset&quot;</span>);</div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span> QTest::addColumn&lt;bool&gt;(<span class="stringliteral">&quot;finite&quot;</span>);</div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span> <span class="keyword">const</span> <span class="keywordtype">double</span> infinity = std::numeric_limits&lt;double&gt;::infinity();</div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span> <span class="keyword">const</span> <span class="keywordtype">double</span> nan = std::numeric_limits&lt;double&gt;::quiet_NaN();</div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span> <span class="keyword">const</span> <span class="keywordtype">double</span> maximum = std::numeric_limits&lt;double&gt;::max();</div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span> QTest::newRow(<span class="stringliteral">&quot;nan-factor&quot;</span>) &lt;&lt; nan &lt;&lt; 0.0 &lt;&lt; <span class="keyword">false</span>;</div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"> 273</span> QTest::newRow(<span class="stringliteral">&quot;nan-offset&quot;</span>) &lt;&lt; 1.0 &lt;&lt; nan &lt;&lt; <span class="keyword">false</span>;</div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span> QTest::newRow(<span class="stringliteral">&quot;infinite-factor&quot;</span>) &lt;&lt; infinity &lt;&lt; 0.0 &lt;&lt; <span class="keyword">false</span>;</div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span> QTest::newRow(<span class="stringliteral">&quot;negative-infinite-factor&quot;</span>) &lt;&lt; -infinity &lt;&lt; 0.0 &lt;&lt; <span class="keyword">false</span>;</div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span> QTest::newRow(<span class="stringliteral">&quot;infinite-offset&quot;</span>) &lt;&lt; 1.0 &lt;&lt; infinity &lt;&lt; <span class="keyword">false</span>;</div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span> QTest::newRow(<span class="stringliteral">&quot;negative-infinite-offset&quot;</span>) &lt;&lt; 1.0 &lt;&lt; -infinity &lt;&lt; <span class="keyword">false</span>;</div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span> QTest::newRow(<span class="stringliteral">&quot;multiply-overflow&quot;</span>) &lt;&lt; maximum &lt;&lt; 0.0 &lt;&lt; <span class="keyword">false</span>;</div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span> QTest::newRow(<span class="stringliteral">&quot;add-overflow&quot;</span>) &lt;&lt; maximum / 2.0 &lt;&lt; maximum &lt;&lt; <span class="keyword">false</span>;</div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span> QTest::newRow(<span class="stringliteral">&quot;finite-limit&quot;</span>) &lt;&lt; maximum / 2.0 &lt;&lt; 0.0 &lt;&lt; <span class="keyword">true</span>;</div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> QTest::newRow(<span class="stringliteral">&quot;zero-factor&quot;</span>) &lt;&lt; 0.0 &lt;&lt; 42.0 &lt;&lt; <span class="keyword">true</span>;</div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span>}</div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span> </div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno"> 284</span><span class="keywordtype">void</span> DbcDecoderTest::physicalConversion() {</div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span> QFETCH(<span class="keywordtype">double</span>, factor);</div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"> 286</span> QFETCH(<span class="keywordtype">double</span>, offset);</div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span> QFETCH(<span class="keywordtype">bool</span>, finite);</div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span> <span class="keywordflow">for</span> (<a class="code hl_enumeration" href="decode__database_8h.html#ad9971b6ef33e02ba2c75d19c1d2518a1">ValueType</a> type: {ValueType::Signed, ValueType::Unsigned}) {</div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> definition;</div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno"> 290</span> definition.<a class="code hl_variable" href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">dlc</a> = 1U;</div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno"> 291</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> signal;</div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"> 292</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = <span class="stringliteral">&quot;Scaled&quot;</span>;</div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"> 293</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 4U;</div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">valueType</a> = type;</div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno"> 295</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">factor</a> = factor;</div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno"> 296</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74">offset</a> = offset;</div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno"> 297</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a822155d9bf4ed5f3300c9e9befe606ff">valueDescriptions</a>.emplace(std::uint64_t(2U), <span class="stringliteral">&quot;Two&quot;</span>);</div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno"> 298</span> definition.signals.push_back(signal);</div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno"> 299</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = <span class="stringliteral">&quot;Good&quot;</span>;</div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno"> 300</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = 4U;</div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno"> 301</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">factor</a> = 1.0;</div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno"> 302</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74">offset</a> = 0.0;</div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno"> 303</span> definition.signals.push_back(signal);</div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"> 304</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> raw;</div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span> raw.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a> = {0x32U};</div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span> <span class="keywordflow">if</span> (!std::isfinite(factor) || !std::isfinite(offset)) {</div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno"> 307</span> QVERIFY_THROWS_EXCEPTION(std::invalid_argument, (<span class="keywordtype">void</span>) <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>({definition}));</div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"> 308</span> <span class="keywordflow">continue</span>;</div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span> }</div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno"> 310</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> result = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(<a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>({definition}), raw);</div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno"> 311</span> QVERIFY(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a>);</div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span> QCOMPARE(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, finite ? FrameDecodeStatus::Valid : <a class="code hl_enumeration" href="dbc__decoder_8h.html#a855b2bc36cb18bfbae5ff30a2394e961">FrameDecodeStatus</a>::SignalErrors);</div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"> 313</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> &amp;scaled = result.signals[0];</div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span> QCOMPARE(scaled.<a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a>, finite);</div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"> 315</span> QCOMPARE(scaled.status, finite ? SignalDecodeStatus::Valid : SignalDecodeStatus::PhysicalConversionFailed);</div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span> QCOMPARE(std::isfinite(scaled.<a class="code hl_variable" href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">physicalValue</a>), finite);</div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"> 317</span> <span class="keywordflow">if</span> (type == ValueType::Signed)</div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span> QCOMPARE(std::get&lt;std::int64_t&gt;(scaled.<a class="code hl_variable" href="structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28">rawValue</a>), std::int64_t(2));</div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"> 319</span> <span class="keywordflow">else</span></div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span> QCOMPARE(std::get&lt;std::uint64_t&gt;(scaled.<a class="code hl_variable" href="structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28">rawValue</a>), std::uint64_t(2));</div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span> QVERIFY(result.signals[1].<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a>);</div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"> 322</span> QCOMPARE(result.signals[1].physicalValue, 3.0);</div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno"> 323</span> <span class="keywordflow">if</span> (finite) {</div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span> QVERIFY(scaled.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>());</div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"> 325</span> QCOMPARE(*scaled.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>(), std::string(<span class="stringliteral">&quot;Two&quot;</span>));</div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno"> 326</span> } <span class="keywordflow">else</span> {</div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno"> 327</span> QVERIFY(!scaled.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>());</div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"> 328</span> }</div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span> }</div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"> 330</span>}</div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno"> 331</span> </div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno"> 332</span><span class="keywordtype">void</span> DbcDecoderTest::selectorConversionFailure() {</div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno"> 333</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> definition;</div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"> 334</span> definition.<a class="code hl_variable" href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">dlc</a> = 1U;</div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"> 335</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> selector;</div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno"> 336</span> selector.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = <span class="stringliteral">&quot;Selector&quot;</span>;</div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno"> 337</span> selector.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 2U;</div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno"> 338</span> selector.multiplexing.role = MultiplexRole::Selector;</div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno"> 339</span> selector.<a class="code hl_variable" href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">factor</a> = std::numeric_limits&lt;double&gt;::max();</div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno"> 340</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> branch;</div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno"> 341</span> branch.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = <span class="stringliteral">&quot;Branch&quot;</span>;</div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"> 342</span> branch.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = 2U;</div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"> 343</span> branch.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 6U;</div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"> 344</span> branch.multiplexing.role = MultiplexRole::Branch;</div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"> 345</span> branch.multiplexing.value = 2U;</div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span> definition.signals = {branch, selector};</div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno"> 347</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> raw;</div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span> raw.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a> = {170U};</div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno"> 349</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> result = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(<a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>({definition}), raw);</div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"> 350</span> QCOMPARE(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, FrameDecodeStatus::SignalErrors);</div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno"> 351</span> QVERIFY(result.signals[0].<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a>);</div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno"> 352</span> QCOMPARE(result.signals[0].physicalValue, 42.0);</div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno"> 353</span> QCOMPARE(result.signals[1].<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, SignalDecodeStatus::PhysicalConversionFailed);</div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno"> 354</span> QCOMPARE(std::get&lt;std::uint64_t&gt;(result.signals[1].rawValue), std::uint64_t(2U));</div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno"> 355</span> raw.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a> = {168U};</div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno"> 356</span> selector.<a class="code hl_variable" href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">factor</a> = 1.0;</div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno"> 357</span> definition.signals = {branch, selector};</div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno"> 358</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> inactive = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(<a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>({definition}), raw);</div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno"> 359</span> QCOMPARE(inactive.<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, FrameDecodeStatus::Valid);</div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno"> 360</span> QCOMPARE(inactive.signals[0].<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, SignalDecodeStatus::Inactive);</div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno"> 361</span>}</div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno"> 362</span> </div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno"> 363</span><span class="keywordtype">void</span> DbcDecoderTest::zeroDlc() {</div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno"> 364</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> definition;</div>
<div class="line"><a id="l00365" name="l00365"></a><span class="lineno"> 365</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> raw;</div>
<div class="line"><a id="l00366" name="l00366"></a><span class="lineno"> 366</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::vector&lt;std::uint8_t&gt; &amp;data: {std::vector&lt;std::uint8_t&gt;(), std::vector&lt;std::uint8_t&gt;{42U}}) {</div>
<div class="line"><a id="l00367" name="l00367"></a><span class="lineno"> 367</span> raw.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a> = data;</div>
<div class="line"><a id="l00368" name="l00368"></a><span class="lineno"> 368</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> result = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(<a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>({definition}), raw);</div>
<div class="line"><a id="l00369" name="l00369"></a><span class="lineno"> 369</span> QVERIFY(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a> &amp;&amp; result.signals.empty());</div>
<div class="line"><a id="l00370" name="l00370"></a><span class="lineno"> 370</span> QCOMPARE(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, FrameDecodeStatus::Valid);</div>
<div class="line"><a id="l00371" name="l00371"></a><span class="lineno"> 371</span> }</div>
<div class="line"><a id="l00372" name="l00372"></a><span class="lineno"> 372</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> signal;</div>
<div class="line"><a id="l00373" name="l00373"></a><span class="lineno"> 373</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 8U;</div>
<div class="line"><a id="l00374" name="l00374"></a><span class="lineno"> 374</span> definition.signals.push_back(signal);</div>
<div class="line"><a id="l00375" name="l00375"></a><span class="lineno"> 375</span> QVERIFY_THROWS_EXCEPTION(std::invalid_argument, (<span class="keywordtype">void</span>) <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>({definition}));</div>
<div class="line"><a id="l00376" name="l00376"></a><span class="lineno"> 376</span>}</div>
<div class="line"><a id="l00377" name="l00377"></a><span class="lineno"> 377</span> </div>
<div class="line"><a id="l00378" name="l00378"></a><span class="lineno"> 378</span><span class="keywordtype">int</span> RunDecoderTests(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv) {</div>
<div class="line"><a id="l00379" name="l00379"></a><span class="lineno"> 379</span> DbcDecoderTest tests;</div>
<div class="line"><a id="l00380" name="l00380"></a><span class="lineno"> 380</span> <span class="keywordflow">return</span> QTest::qExec(&amp;tests, argc, argv);</div>
<div class="line"><a id="l00381" name="l00381"></a><span class="lineno"> 381</span>}</div>
<div class="line"><a id="l00382" name="l00382"></a><span class="lineno"> 382</span> </div>
<div class="line"><a id="l00383" name="l00383"></a><span class="lineno"> 383</span><span class="preprocessor">#include &quot;dbc_decoder_test.moc&quot;</span></div>
<div class="ttc" id="aclassDbcDecoder_html"><div class="ttname"><a href="classDbcDecoder.html">DbcDecoder</a></div><div class="ttdoc">Runtime CAN decoder using prebuilt decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00084">dbc_decoder.h:84</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_a345951ffe5d943a70d3a1ea1f39e74f7"><div class="ttname"><a href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a></div><div class="ttdeci">DecodedFrameValue Decode(const DecodeDatabase &amp;database, const RawCanFrame &amp;frame) const</div><div class="ttdoc">Decode one raw CAN frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00022">dbc_decoder.cpp:22</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_a345951ffe5d943a70d3a1ea1f39e74f7"><div class="ttname"><a href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a></div><div class="ttdeci">DecodedFrameValue Decode(const DecodeDatabase &amp;database, const RawCanFrame &amp;frame) const</div><div class="ttdoc">Decode one raw CAN frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00023">dbc_decoder.cpp:23</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html"><div class="ttname"><a href="classDecodeDatabase.html">DecodeDatabase</a></div><div class="ttdoc">Immutable runtime snapshot. Copies share storage; reload replaces a snapshot. Owning lookup handles a...</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00087">decode_database.h:87</a></div></div>
<div class="ttc" id="adbc__decoder_8h_html"><div class="ttname"><a href="dbc__decoder_8h.html">dbc_decoder.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>
<div class="ttc" id="adbc__decoder_8h_html_a855b2bc36cb18bfbae5ff30a2394e961"><div class="ttname"><a href="dbc__decoder_8h.html#a855b2bc36cb18bfbae5ff30a2394e961">FrameDecodeStatus</a></div><div class="ttdeci">FrameDecodeStatus</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00042">dbc_decoder.h:42</a></div></div>
+73 -69
View File
@@ -275,89 +275,93 @@ $(document).ready(function(){initNavTree('dbc__lifetime__test_8cpp_source.html',
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> QVERIFY_THROWS_EXCEPTION(std::invalid_argument, (<span class="keywordtype">void</span>) <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>({frame, frame}));</div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> signal;</div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = <span class="stringliteral">&quot;State&quot;</span>;</div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> frame.signals = {signal, signal};</div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> QVERIFY_THROWS_EXCEPTION(std::invalid_argument, (<span class="keywordtype">void</span>) <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>({frame}));</div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> parsed;</div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> <a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> source;</div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> source.<a class="code hl_variable" href="structFrameInfo.html#af470b0742c05bfbffc31c51a68f5c05e">canId</a> = 17U;</div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> parsed.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a> = {source, source};</div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> QVERIFY_THROWS_EXCEPTION(std::invalid_argument, (<span class="keywordtype">void</span>) <a class="code hl_class" href="classDbcDecodeBuilder.html">DbcDecodeBuilder</a>().Build(parsed));</div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span>}</div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> </div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span><span class="keywordtype">void</span> DbcLifetimeTest::failedReload() {</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> database = BuildText(firstDbc);</div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> <span class="keyword">const</span> std::shared_ptr&lt;const DecodeFrame&gt; original = database.<a class="code hl_function" href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970">FindFrame</a>(<a class="code hl_struct" href="structFrameKey.html">FrameKey</a>(17U, <span class="keyword">false</span>));</div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> QVERIFY_THROWS_EXCEPTION(std::runtime_error, database = BuildText(<span class="stringliteral">&quot;BO_ invalid\n&quot;</span>));</div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> QCOMPARE(database.<a class="code hl_function" href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970">FindFrame</a>(<a class="code hl_struct" href="structFrameKey.html">FrameKey</a>(17U, <span class="keyword">false</span>)), original);</div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> database = BuildText(<span class="stringliteral">&quot;&quot;</span>);</div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> QVERIFY(database.<a class="code hl_function" href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">GetFrames</a>().empty());</div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> QVERIFY(!database.<a class="code hl_function" href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970">FindFrame</a>(<a class="code hl_struct" href="structFrameKey.html">FrameKey</a>(17U, <span class="keyword">false</span>)));</div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> QCOMPARE(original-&gt;name, std::string(<span class="stringliteral">&quot;OldFrame&quot;</span>));</div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span>}</div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> </div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span><span class="keywordtype">void</span> DbcLifetimeTest::invalidResults() {</div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> raw;</div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span> raw.<a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a> = 17U;</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> result = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(BuildText(firstDbc), raw);</div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> QVERIFY(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a>);</div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> QVERIFY(!result.signals[0].<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a>);</div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> QCOMPARE(result.signals[0].<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, SignalDecodeStatus::InsufficientPayload);</div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> QVERIFY(!result.signals[0].GetValueDescription());</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> QCOMPARE(result.signals[0].<a class="code hl_variable" href="structDecodedFrameValue.html#a33e971ba10030506007aa201c89f351d">definition</a>-&gt;name, std::string(<span class="stringliteral">&quot;State&quot;</span>));</div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> result = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(<a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>(), raw);</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> QVERIFY(!result.<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a> &amp;&amp; !result.<a class="code hl_variable" href="structDecodedFrameValue.html#a33e971ba10030506007aa201c89f351d">definition</a> &amp;&amp; result.signals.empty());</div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> QVERIFY(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a32143efe2023a1ecd977a9ae93e50b73">key</a> == <a class="code hl_struct" href="structFrameKey.html">FrameKey</a>(17U, <span class="keyword">false</span>));</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> QVERIFY(!<a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a>().GetValueDescription());</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> QVERIFY(!<a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>().FindSignal(<a class="code hl_struct" href="structSignalKey.html">SignalKey</a>(<a class="code hl_struct" href="structFrameKey.html">FrameKey</a>(17U, <span class="keyword">false</span>), <span class="stringliteral">&quot;State&quot;</span>)));</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span>}</div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> </div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span><span class="keywordtype">void</span> DbcLifetimeTest::retainedMultiplexStatuses() {</div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> <span class="keyword">const</span> std::string text =</div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> <span class="stringliteral">&quot;BO_ 17 Frame: 2 ECU\n&quot;</span></div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> <span class="stringliteral">&quot;SG_ Mode M : 0|1@1+ (1,0) [0|1] \&quot;\&quot; ECU\n&quot;</span></div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> <span class="stringliteral">&quot;SG_ State m1 : 8|8@1+ (1,0) [0|255] \&quot;\&quot; ECU\n&quot;</span>;</div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> <span class="keyword">const</span> std::vector&lt;std::vector&lt;std::uint8_t&gt;&gt; payloads = {{0U}, {}, {1U}};</div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> <span class="keyword">const</span> SignalDecodeStatus statuses[] = {SignalDecodeStatus::Inactive,</div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> SignalDecodeStatus::SelectorUnavailable,</div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> SignalDecodeStatus::InsufficientPayload};</div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> <span class="keywordflow">for</span> (std::size_t index = 0U; index &lt; payloads.size(); ++index) {</div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> database = BuildText(text);</div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> raw;</div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> raw.<a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a> = 17U;</div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> raw.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a> = payloads[index];</div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> saved = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(database, raw).signals[1];</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> database = BuildText(secondDbc);</div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> QCOMPARE(saved.status, statuses[index]);</div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> QVERIFY(!saved.<a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a> &amp;&amp; !saved.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>());</div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> QCOMPARE(saved.<a class="code hl_variable" href="structDecodedSignalValue.html#a828b5ef7faefc14fbf5dbd46249bcad2">definition</a>-&gt;multiplexing.role, MultiplexRole::Branch);</div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> QVERIFY(saved.<a class="code hl_variable" href="structDecodedSignalValue.html#a33df0fcd92b23b3e08539906fc6b4c4a">key</a> == <a class="code hl_struct" href="structSignalKey.html">SignalKey</a>(<a class="code hl_struct" href="structFrameKey.html">FrameKey</a>(17U, <span class="keyword">false</span>), <span class="stringliteral">&quot;State&quot;</span>));</div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> }</div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span>}</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> </div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span><span class="keywordtype">int</span> RunLifetimeTests(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv) {</div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> DbcLifetimeTest test;</div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span> <span class="keywordflow">return</span> QTest::qExec(&amp;test, argc, argv);</div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span>}</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> </div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span><span class="preprocessor">#include &quot;dbc_lifetime_test.moc&quot;</span></div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 1U;</div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> frame.<a class="code hl_variable" href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">dlc</a> = 1U;</div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> frame.signals = {signal, signal};</div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> QVERIFY_THROWS_EXCEPTION(std::invalid_argument, (<span class="keywordtype">void</span>) <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>({frame}));</div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> parsed;</div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> <a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> source;</div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> source.<a class="code hl_variable" href="structFrameInfo.html#af470b0742c05bfbffc31c51a68f5c05e">canId</a> = 17U;</div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> parsed.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a> = {source, source};</div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> QVERIFY_THROWS_EXCEPTION(std::invalid_argument, (<span class="keywordtype">void</span>) <a class="code hl_class" href="classDbcDecodeBuilder.html">DbcDecodeBuilder</a>().Build(parsed));</div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span>}</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> </div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span><span class="keywordtype">void</span> DbcLifetimeTest::failedReload() {</div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> database = BuildText(firstDbc);</div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> <span class="keyword">const</span> std::shared_ptr&lt;const DecodeFrame&gt; original = database.<a class="code hl_function" href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970">FindFrame</a>(<a class="code hl_struct" href="structFrameKey.html">FrameKey</a>(17U, <span class="keyword">false</span>));</div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> QVERIFY_THROWS_EXCEPTION(std::runtime_error, database = BuildText(<span class="stringliteral">&quot;BO_ invalid\n&quot;</span>));</div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> QCOMPARE(database.<a class="code hl_function" href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970">FindFrame</a>(<a class="code hl_struct" href="structFrameKey.html">FrameKey</a>(17U, <span class="keyword">false</span>)), original);</div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> database = BuildText(<span class="stringliteral">&quot;&quot;</span>);</div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> QVERIFY(database.<a class="code hl_function" href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">GetFrames</a>().empty());</div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> QVERIFY(!database.<a class="code hl_function" href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970">FindFrame</a>(<a class="code hl_struct" href="structFrameKey.html">FrameKey</a>(17U, <span class="keyword">false</span>)));</div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> QCOMPARE(original-&gt;name, std::string(<span class="stringliteral">&quot;OldFrame&quot;</span>));</div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span>}</div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> </div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span><span class="keywordtype">void</span> DbcLifetimeTest::invalidResults() {</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> raw;</div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> raw.<a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a> = 17U;</div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> result = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(BuildText(firstDbc), raw);</div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> QVERIFY(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a>);</div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> QVERIFY(!result.signals[0].<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a>);</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> QCOMPARE(result.signals[0].<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, SignalDecodeStatus::InsufficientPayload);</div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> QVERIFY(!result.signals[0].GetValueDescription());</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> QCOMPARE(result.signals[0].<a class="code hl_variable" href="structDecodedFrameValue.html#a33e971ba10030506007aa201c89f351d">definition</a>-&gt;name, std::string(<span class="stringliteral">&quot;State&quot;</span>));</div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> result = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(<a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>(), raw);</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> QVERIFY(!result.<a class="code hl_variable" href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">valid</a> &amp;&amp; !result.<a class="code hl_variable" href="structDecodedFrameValue.html#a33e971ba10030506007aa201c89f351d">definition</a> &amp;&amp; result.signals.empty());</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> QVERIFY(result.<a class="code hl_variable" href="structDecodedFrameValue.html#a32143efe2023a1ecd977a9ae93e50b73">key</a> == <a class="code hl_struct" href="structFrameKey.html">FrameKey</a>(17U, <span class="keyword">false</span>));</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span> QVERIFY(!<a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a>().GetValueDescription());</div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> QVERIFY(!<a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>().FindSignal(<a class="code hl_struct" href="structSignalKey.html">SignalKey</a>(<a class="code hl_struct" href="structFrameKey.html">FrameKey</a>(17U, <span class="keyword">false</span>), <span class="stringliteral">&quot;State&quot;</span>)));</div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span>}</div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> </div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span><span class="keywordtype">void</span> DbcLifetimeTest::retainedMultiplexStatuses() {</div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> <span class="keyword">const</span> std::string text =</div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> <span class="stringliteral">&quot;BO_ 17 Frame: 2 ECU\n&quot;</span></div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> <span class="stringliteral">&quot;SG_ Mode M : 0|1@1+ (1,0) [0|1] \&quot;\&quot; ECU\n&quot;</span></div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> <span class="stringliteral">&quot;SG_ State m1 : 8|8@1+ (1,0) [0|255] \&quot;\&quot; ECU\n&quot;</span>;</div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> <span class="keyword">const</span> std::vector&lt;std::vector&lt;std::uint8_t&gt;&gt; payloads = {{0U}, {}, {1U}};</div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> <span class="keyword">const</span> SignalDecodeStatus statuses[] = {SignalDecodeStatus::Inactive,</div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> SignalDecodeStatus::SelectorUnavailable,</div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> SignalDecodeStatus::InsufficientPayload};</div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span> <span class="keywordflow">for</span> (std::size_t index = 0U; index &lt; payloads.size(); ++index) {</div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> database = BuildText(text);</div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> raw;</div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> raw.<a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a> = 17U;</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> raw.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a> = payloads[index];</div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> saved = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(database, raw).signals[1];</div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> database = BuildText(secondDbc);</div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> QCOMPARE(saved.status, statuses[index]);</div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> QVERIFY(!saved.<a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a> &amp;&amp; !saved.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>());</div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> QCOMPARE(saved.<a class="code hl_variable" href="structDecodedSignalValue.html#a828b5ef7faefc14fbf5dbd46249bcad2">definition</a>-&gt;multiplexing.role, MultiplexRole::Branch);</div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> QVERIFY(saved.<a class="code hl_variable" href="structDecodedSignalValue.html#a33df0fcd92b23b3e08539906fc6b4c4a">key</a> == <a class="code hl_struct" href="structSignalKey.html">SignalKey</a>(<a class="code hl_struct" href="structFrameKey.html">FrameKey</a>(17U, <span class="keyword">false</span>), <span class="stringliteral">&quot;State&quot;</span>));</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> }</div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span>}</div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> </div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span><span class="keywordtype">int</span> RunLifetimeTests(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv) {</div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span> DbcLifetimeTest test;</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> <span class="keywordflow">return</span> QTest::qExec(&amp;test, argc, argv);</div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span>}</div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> </div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span><span class="preprocessor">#include &quot;dbc_lifetime_test.moc&quot;</span></div>
<div class="ttc" id="aclassDbcDecodeBuilder_html"><div class="ttname"><a href="classDbcDecodeBuilder.html">DbcDecodeBuilder</a></div><div class="ttdoc">Converts parsed DBC data into runtime decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decode__builder_8h_source.html#l00021">dbc_decode_builder.h:21</a></div></div>
<div class="ttc" id="aclassDbcDecodeBuilder_html_a2bc6386dfb5e58976c42e22c19ec471b"><div class="ttname"><a href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b">DbcDecodeBuilder::Build</a></div><div class="ttdeci">DecodeDatabase Build(const DbcDatabase &amp;source) const</div><div class="ttdoc">Build runtime decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decode__builder_8cpp_source.html#l00015">dbc_decode_builder.cpp:15</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html"><div class="ttname"><a href="classDbcDecoder.html">DbcDecoder</a></div><div class="ttdoc">Runtime CAN decoder using prebuilt decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00084">dbc_decoder.h:84</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_a345951ffe5d943a70d3a1ea1f39e74f7"><div class="ttname"><a href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a></div><div class="ttdeci">DecodedFrameValue Decode(const DecodeDatabase &amp;database, const RawCanFrame &amp;frame) const</div><div class="ttdoc">Decode one raw CAN frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00022">dbc_decoder.cpp:22</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_a4005c4311f57b7faf21c0cb31463039c"><div class="ttname"><a href="classDbcDecoder.html#a4005c4311f57b7faf21c0cb31463039c">DbcDecoder::FindFrame</a></div><div class="ttdeci">std::shared_ptr&lt; const DecodeFrame &gt; FindFrame(const DecodeDatabase &amp;database, std::uint32_t canId, bool isExtended) const</div><div class="ttdoc">Find frame definition by CAN ID.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00016">dbc_decoder.cpp:16</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_a345951ffe5d943a70d3a1ea1f39e74f7"><div class="ttname"><a href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a></div><div class="ttdeci">DecodedFrameValue Decode(const DecodeDatabase &amp;database, const RawCanFrame &amp;frame) const</div><div class="ttdoc">Decode one raw CAN frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00023">dbc_decoder.cpp:23</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_a4005c4311f57b7faf21c0cb31463039c"><div class="ttname"><a href="classDbcDecoder.html#a4005c4311f57b7faf21c0cb31463039c">DbcDecoder::FindFrame</a></div><div class="ttdeci">std::shared_ptr&lt; const DecodeFrame &gt; FindFrame(const DecodeDatabase &amp;database, std::uint32_t canId, bool isExtended) const</div><div class="ttdoc">Find frame definition by CAN ID.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00017">dbc_decoder.cpp:17</a></div></div>
<div class="ttc" id="aclassDbcParser_html"><div class="ttname"><a href="classDbcParser.html">DbcParser</a></div><div class="ttdoc">Minimal DBC parser.</div><div class="ttdef"><b>Definition</b> <a href="dbc__parser_8h_source.html#l00033">dbc_parser.h:33</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html"><div class="ttname"><a href="classDecodeDatabase.html">DecodeDatabase</a></div><div class="ttdoc">Immutable runtime snapshot. Copies share storage; reload replaces a snapshot. Owning lookup handles a...</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00087">decode_database.h:87</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html_a780d6e747a48b10a5eb0ab85448d2970"><div class="ttname"><a href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970">DecodeDatabase::FindFrame</a></div><div class="ttdeci">std::shared_ptr&lt; const DecodeFrame &gt; FindFrame(const FrameKey &amp;key) const</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8cpp_source.html#l00033">decode_database.cpp:33</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html_aa034c1510984a85f60ad6c0bd744d6e8"><div class="ttname"><a href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">DecodeDatabase::GetFrames</a></div><div class="ttdeci">const std::vector&lt; DecodeFrame &gt; &amp; GetFrames() const</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8cpp_source.html#l00028">decode_database.cpp:28</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html_a780d6e747a48b10a5eb0ab85448d2970"><div class="ttname"><a href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970">DecodeDatabase::FindFrame</a></div><div class="ttdeci">std::shared_ptr&lt; const DecodeFrame &gt; FindFrame(const FrameKey &amp;key) const</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8cpp_source.html#l00110">decode_database.cpp:110</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html_aa034c1510984a85f60ad6c0bd744d6e8"><div class="ttname"><a href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">DecodeDatabase::GetFrames</a></div><div class="ttdeci">const std::vector&lt; DecodeFrame &gt; &amp; GetFrames() const</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8cpp_source.html#l00105">decode_database.cpp:105</a></div></div>
<div class="ttc" id="adbc__decode__builder_8h_html"><div class="ttname"><a href="dbc__decode__builder_8h.html">dbc_decode_builder.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>
<div class="ttc" id="adbc__decoder_8h_html"><div class="ttname"><a href="dbc__decoder_8h.html">dbc_decoder.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>
<div class="ttc" id="adbc__parser_8h_html"><div class="ttname"><a href="dbc__parser_8h.html">dbc_parser.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>
<div class="ttc" id="astructDbcDatabase_html"><div class="ttname"><a href="structDbcDatabase.html">DbcDatabase</a></div><div class="ttdoc">Parsed DBC content stored in a simple internal form.</div><div class="ttdef"><b>Definition</b> <a href="dbc__database_8h_source.html#l00022">dbc_database.h:22</a></div></div>
<div class="ttc" id="astructDbcDatabase_html_a2cade5d0234ee816132127542f8c612b"><div class="ttname"><a href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">DbcDatabase::frames</a></div><div class="ttdeci">std::vector&lt; FrameInfo &gt; frames</div><div class="ttdef"><b>Definition</b> <a href="dbc__database_8h_source.html#l00023">dbc_database.h:23</a></div></div>
<div class="ttc" id="astructDecodeFrame_html"><div class="ttname"><a href="structDecodeFrame.html">DecodeFrame</a></div><div class="ttdoc">Runtime-ready frame definition.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00065">decode_database.h:65</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_a51111ac13988be372d5673d12cf3e060"><div class="ttname"><a href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">DecodeFrame::dlc</a></div><div class="ttdeci">std::uint8_t dlc</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00069">decode_database.h:69</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_a52e10215388db7df8b541b9d9909edcf"><div class="ttname"><a href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">DecodeFrame::canId</a></div><div class="ttdeci">std::uint32_t canId</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00067">decode_database.h:67</a></div></div>
<div class="ttc" id="astructDecodeSignal_html"><div class="ttname"><a href="structDecodeSignal.html">DecodeSignal</a></div><div class="ttdoc">Runtime-ready signal definition.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00043">decode_database.h:43</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a58cf5844f2272a23dcb9687d912e4780"><div class="ttname"><a href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">DecodeSignal::name</a></div><div class="ttdeci">std::string name</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00045">decode_database.h:45</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_acd4ef5ee30421d117b5756854302debb"><div class="ttname"><a href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">DecodeSignal::length</a></div><div class="ttdeci">std::uint32_t length</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00047">decode_database.h:47</a></div></div>
<div class="ttc" id="astructDecodedFrameValue_html"><div class="ttname"><a href="structDecodedFrameValue.html">DecodedFrameValue</a></div><div class="ttdoc">Fully decoded frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00071">dbc_decoder.h:71</a></div></div>
<div class="ttc" id="astructDecodedFrameValue_html_a32143efe2023a1ecd977a9ae93e50b73"><div class="ttname"><a href="structDecodedFrameValue.html#a32143efe2023a1ecd977a9ae93e50b73">DecodedFrameValue::key</a></div><div class="ttdeci">FrameKey key</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00073">dbc_decoder.h:73</a></div></div>
<div class="ttc" id="astructDecodedFrameValue_html_a33e971ba10030506007aa201c89f351d"><div class="ttname"><a href="structDecodedFrameValue.html#a33e971ba10030506007aa201c89f351d">DecodedFrameValue::definition</a></div><div class="ttdeci">std::shared_ptr&lt; const DecodeFrame &gt; definition</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00072">dbc_decoder.h:72</a></div></div>
+1 -1
View File
@@ -206,7 +206,7 @@ $(document).ready(function(){initNavTree('dbc__parser_8cpp_source.html',''); ini
<div class="ttc" id="aclassDbcParser_html_a0e915ce79c2e3d4c95a5aaf2bf0409bc"><div class="ttname"><a href="classDbcParser.html#a0e915ce79c2e3d4c95a5aaf2bf0409bc">DbcParser::ParseFileWithDiagnostics</a></div><div class="ttdeci">DbcParseResult ParseFileWithDiagnostics(const std::string &amp;filePath) const</div><div class="ttdoc">Parse with warnings and a structured first error instead of throwing.</div><div class="ttdef"><b>Definition</b> <a href="dbc__parser_8cpp_source.html#l00044">dbc_parser.cpp:44</a></div></div>
<div class="ttc" id="aclassDbcParser_html_aef72826942c9095d653fafa435855e56"><div class="ttname"><a href="classDbcParser.html#aef72826942c9095d653fafa435855e56">DbcParser::ParseFile</a></div><div class="ttdeci">DbcDatabase ParseFile(const std::string &amp;filePath) const</div><div class="ttdoc">Parse DBC file.</div><div class="ttdef"><b>Definition</b> <a href="dbc__parser_8cpp_source.html#l00031">dbc_parser.cpp:31</a></div></div>
<div class="ttc" id="aclassDbcStatementDispatcher_html"><div class="ttname"><a href="classDbcStatementDispatcher.html">DbcStatementDispatcher</a></div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00091">dbc_statement_handler.h:91</a></div></div>
<div class="ttc" id="aclassDbcStatementDispatcher_html_a495c2d5c7ebb8103b1987cdd87c142ed"><div class="ttname"><a href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">DbcStatementDispatcher::Dispatch</a></div><div class="ttdeci">bool Dispatch(const std::string &amp;line, DbcParseContext &amp;context) const</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00391">dbc_statement_handler.cpp:391</a></div></div>
<div class="ttc" id="aclassDbcStatementDispatcher_html_a495c2d5c7ebb8103b1987cdd87c142ed"><div class="ttname"><a href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">DbcStatementDispatcher::Dispatch</a></div><div class="ttdeci">bool Dispatch(const std::string &amp;line, DbcParseContext &amp;context) const</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00388">dbc_statement_handler.cpp:388</a></div></div>
<div class="ttc" id="adbc__parser_8h_html"><div class="ttname"><a href="dbc__parser_8h.html">dbc_parser.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>
<div class="ttc" id="astructDbcDatabase_html"><div class="ttname"><a href="structDbcDatabase.html">DbcDatabase</a></div><div class="ttdoc">Parsed DBC content stored in a simple internal form.</div><div class="ttdef"><b>Definition</b> <a href="dbc__database_8h_source.html#l00022">dbc_database.h:22</a></div></div>
<div class="ttc" id="astructDbcDiagnostic_html"><div class="ttname"><a href="structDbcDiagnostic.html">DbcDiagnostic</a></div><div class="ttdef"><b>Definition</b> <a href="dbc__diagnostic_8h_source.html#l00025">dbc_diagnostic.h:25</a></div></div>
+289 -296
View File
@@ -703,313 +703,306 @@ $(document).ready(function(){initNavTree('dbc__parser__test_8cpp_source.html',''
<div class="line"><a id="l00603" name="l00603"></a><span class="lineno"> 603</span> <span class="stringliteral">&quot;Adjacent large integers remain distinct&quot;</span>);</div>
<div class="line"><a id="l00604" name="l00604"></a><span class="lineno"> 604</span> std::vector&lt;DecodeFrame&gt; definitions = runtime.<a class="code hl_function" href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">GetFrames</a>();</div>
<div class="line"><a id="l00605" name="l00605"></a><span class="lineno"> 605</span> definitions[0].signals[1].length = 0U;</div>
<div class="line"><a id="l00606" name="l00606"></a><span class="lineno"> 606</span> runtime = <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>(definitions);</div>
<div class="line"><a id="l00607" name="l00607"></a><span class="lineno"> 607</span> result = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(runtime, raw);</div>
<div class="line"><a id="l00608" name="l00608"></a><span class="lineno"> 608</span> CHECK(result.signals[0].<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a> == SignalDecodeStatus::InvalidDefinition &amp;&amp;</div>
<div class="line"><a id="l00609" name="l00609"></a><span class="lineno"> 609</span> result.signals[1].<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a> == SignalDecodeStatus::InvalidDefinition,</div>
<div class="line"><a id="l00610" name="l00610"></a><span class="lineno"> 610</span> <span class="stringliteral">&quot;Malformed runtime selector distinguished from payload errors&quot;</span>);</div>
<div class="line"><a id="l00611" name="l00611"></a><span class="lineno"> 611</span> definitions[0].signals.pop_back();</div>
<div class="line"><a id="l00612" name="l00612"></a><span class="lineno"> 612</span> runtime = <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>(definitions);</div>
<div class="line"><a id="l00613" name="l00613"></a><span class="lineno"> 613</span> result = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(runtime, raw);</div>
<div class="line"><a id="l00614" name="l00614"></a><span class="lineno"> 614</span> CHECK(result.signals[0].<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a> == SignalDecodeStatus::InvalidDefinition,</div>
<div class="line"><a id="l00615" name="l00615"></a><span class="lineno"> 615</span> <span class="stringliteral">&quot;Missing runtime selector&quot;</span>);</div>
<div class="line"><a id="l00616" name="l00616"></a><span class="lineno"> 616</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 Frame: 2 ECU\n\n&quot;</span></div>
<div class="line"><a id="l00617" name="l00617"></a><span class="lineno"> 617</span> <span class="stringliteral">&quot;SG_ Branch m2 : 8|8@1+ (1,0) [0|255] \&quot;\&quot; ECU\n&quot;</span></div>
<div class="line"><a id="l00618" name="l00618"></a><span class="lineno"> 618</span> <span class="stringliteral">&quot;SG_ Mode M : 0|1@1+ (1,0) [0|1] \&quot;\&quot; ECU\n&quot;</span>);</div>
<div class="line"><a id="l00619" name="l00619"></a><span class="lineno"> 619</span> <span class="keywordtype">bool</span> rejected = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00620" name="l00620"></a><span class="lineno"> 620</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00621" name="l00621"></a><span class="lineno"> 621</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00622" name="l00622"></a><span class="lineno"> 622</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;error) {</div>
<div class="line"><a id="l00623" name="l00623"></a><span class="lineno"> 623</span> rejected = std::string(error.what()).find(fixture.path.string() + <span class="stringliteral">&quot;:3: &quot;</span>) == 0U;</div>
<div class="line"><a id="l00624" name="l00624"></a><span class="lineno"> 624</span> }</div>
<div class="line"><a id="l00625" name="l00625"></a><span class="lineno"> 625</span> CHECK(rejected, <span class="stringliteral">&quot;Deferred validation reports branch source line&quot;</span>);</div>
<div class="line"><a id="l00626" name="l00626"></a><span class="lineno"> 626</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 Frame: 2 ECU\n&quot;</span></div>
<div class="line"><a id="l00627" name="l00627"></a><span class="lineno"> 627</span> <span class="stringliteral">&quot;SG_ A : 8|8@1+ (1,0) [0|255] \&quot;\&quot; ECU\n&quot;</span></div>
<div class="line"><a id="l00628" name="l00628"></a><span class="lineno"> 628</span> <span class="stringliteral">&quot;SG_ B : 15|8@0+ (1,0) [0|255] \&quot;\&quot; ECU\n&quot;</span>);</div>
<div class="line"><a id="l00629" name="l00629"></a><span class="lineno"> 629</span> rejected = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00630" name="l00630"></a><span class="lineno"> 630</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00631" name="l00631"></a><span class="lineno"> 631</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00632" name="l00632"></a><span class="lineno"> 632</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;) {</div>
<div class="line"><a id="l00633" name="l00633"></a><span class="lineno"> 633</span> rejected = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00634" name="l00634"></a><span class="lineno"> 634</span> }</div>
<div class="line"><a id="l00635" name="l00635"></a><span class="lineno"> 635</span> CHECK(rejected, <span class="stringliteral">&quot;Ordinary overlapping signals rejected&quot;</span>);</div>
<div class="line"><a id="l00636" name="l00636"></a><span class="lineno"> 636</span>}</div>
<div class="line"><a id="l00637" name="l00637"></a><span class="lineno"> 637</span> </div>
<div class="line"><a id="l00638" name="l00638"></a><span class="lineno"> 638</span><span class="keywordtype">void</span> DbcParserTest::invalidSignals() {</div>
<div class="line"><a id="l00639" name="l00639"></a><span class="lineno"> 639</span> Fixture fixture;</div>
<div class="line"><a id="l00640" name="l00640"></a><span class="lineno"> 640</span> <span class="keyword">const</span> std::string ordinary = SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>);</div>
<div class="line"><a id="l00641" name="l00641"></a><span class="lineno"> 641</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string value: {<span class="stringliteral">&quot;-1&quot;</span>, <span class="stringliteral">&quot;+1&quot;</span>, <span class="stringliteral">&quot;0junk&quot;</span>, <span class="stringliteral">&quot;0x10&quot;</span>, <span class="stringliteral">&quot;1.5&quot;</span>,</div>
<div class="line"><a id="l00642" name="l00642"></a><span class="lineno"> 642</span> <span class="stringliteral">&quot;4294967296&quot;</span>, <span class="stringliteral">&quot;999999999999999999999&quot;</span>}) {</div>
<div class="line"><a id="l00643" name="l00643"></a><span class="lineno"> 643</span> RejectSignal(fixture, SignalLine(value, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00644" name="l00644"></a><span class="lineno"> 644</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, value, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00645" name="l00645"></a><span class="lineno"> 645</span> }</div>
<div class="line"><a id="l00646" name="l00646"></a><span class="lineno"> 646</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string length: {<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;65&quot;</span>})</div>
<div class="line"><a id="l00647" name="l00647"></a><span class="lineno"> 647</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, length, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00648" name="l00648"></a><span class="lineno"> 648</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string order: {<span class="stringliteral">&quot;2+&quot;</span>, <span class="stringliteral">&quot;9-&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;1x&quot;</span>, <span class="stringliteral">&quot;1++&quot;</span>, <span class="stringliteral">&quot;01+&quot;</span>})</div>
<div class="line"><a id="l00649" name="l00649"></a><span class="lineno"> 649</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, order, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00650" name="l00650"></a><span class="lineno"> 650</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string value: {<span class="stringliteral">&quot;1junk&quot;</span>, <span class="stringliteral">&quot;nan&quot;</span>, <span class="stringliteral">&quot;NaN&quot;</span>, <span class="stringliteral">&quot;inf&quot;</span>, <span class="stringliteral">&quot;-inf&quot;</span>, <span class="stringliteral">&quot;1e999&quot;</span>, <span class="stringliteral">&quot;1e-999&quot;</span>, <span class="stringliteral">&quot;0x1p2&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;1e&quot;</span>, <span class="stringliteral">&quot;1.2.3&quot;</span>}) {</div>
<div class="line"><a id="l00651" name="l00651"></a><span class="lineno"> 651</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, value, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00652" name="l00652"></a><span class="lineno"> 652</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, value, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00653" name="l00653"></a><span class="lineno"> 653</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, value, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00654" name="l00654"></a><span class="lineno"> 654</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, value));</div>
<div class="line"><a id="l00655" name="l00655"></a><span class="lineno"> 655</span> }</div>
<div class="line"><a id="l00656" name="l00656"></a><span class="lineno"> 656</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;2&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>));</div>
<div class="line"><a id="l00657" name="l00657"></a><span class="lineno"> 657</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string name: {<span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;Two Names&quot;</span>, <span class="stringliteral">&quot;Value m1M&quot;</span>}) {</div>
<div class="line"><a id="l00658" name="l00658"></a><span class="lineno"> 658</span> std::string line = ordinary;</div>
<div class="line"><a id="l00659" name="l00659"></a><span class="lineno"> 659</span> line.replace(4U, 5U, name);</div>
<div class="line"><a id="l00660" name="l00660"></a><span class="lineno"> 660</span> RejectSignal(fixture, line);</div>
<div class="line"><a id="l00661" name="l00661"></a><span class="lineno"> 661</span> }</div>
<div class="line"><a id="l00662" name="l00662"></a><span class="lineno"> 662</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string broken: {</div>
<div class="line"><a id="l00663" name="l00663"></a><span class="lineno"> 663</span> <span class="stringliteral">&quot;SG_&quot;</span>, <span class="stringliteral">&quot;SG_ Value&quot;</span>, <span class="stringliteral">&quot;SG_ Value : 0|8@1+ (1,0) [0|255] ECU&quot;</span>,</div>
<div class="line"><a id="l00664" name="l00664"></a><span class="lineno"> 664</span> <span class="stringliteral">&quot;SG_ Value : 0|8@1+ (1,0) [0|255] \&quot;\&quot;&quot;</span>,</div>
<div class="line"><a id="l00665" name="l00665"></a><span class="lineno"> 665</span> <span class="stringliteral">&quot;SG_ Value : 0|8@1+ (1,0) [0|255] \&quot;\&quot; ECU,&quot;</span>,</div>
<div class="line"><a id="l00666" name="l00666"></a><span class="lineno"> 666</span> <span class="stringliteral">&quot;SG_ Value : 0|8@1+ (1,0) [0|255] \&quot;\&quot; ECU extra&quot;</span>})</div>
<div class="line"><a id="l00667" name="l00667"></a><span class="lineno"> 667</span> RejectSignal(fixture, broken);</div>
<div class="line"><a id="l00668" name="l00668"></a><span class="lineno"> 668</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;64&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>));</div>
<div class="line"><a id="l00669" name="l00669"></a><span class="lineno"> 669</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;63&quot;</span>, <span class="stringliteral">&quot;2&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;3&quot;</span>));</div>
<div class="line"><a id="l00670" name="l00670"></a><span class="lineno"> 670</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;56&quot;</span>, <span class="stringliteral">&quot;2&quot;</span>, <span class="stringliteral">&quot;0+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;3&quot;</span>));</div>
<div class="line"><a id="l00671" name="l00671"></a><span class="lineno"> 671</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;4294967295&quot;</span>, <span class="stringliteral">&quot;64&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>));</div>
<div class="line"><a id="l00672" name="l00672"></a><span class="lineno"> 672</span> RejectSignal(fixture, ordinary, 0U);</div>
<div class="line"><a id="l00673" name="l00673"></a><span class="lineno"> 673</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">char</span> delimiter: {<span class="charliteral">&#39;|&#39;</span>, <span class="charliteral">&#39;@&#39;</span>, <span class="charliteral">&#39;(&#39;</span>, <span class="charliteral">&#39;)&#39;</span>, <span class="charliteral">&#39;[&#39;</span>, <span class="charliteral">&#39;]&#39;</span>, <span class="charliteral">&#39;&quot;&#39;</span>}) {</div>
<div class="line"><a id="l00674" name="l00674"></a><span class="lineno"> 674</span> std::string line = ordinary;</div>
<div class="line"><a id="l00675" name="l00675"></a><span class="lineno"> 675</span> line.erase(line.find(delimiter), 1U);</div>
<div class="line"><a id="l00676" name="l00676"></a><span class="lineno"> 676</span> RejectSignal(fixture, line);</div>
<div class="line"><a id="l00677" name="l00677"></a><span class="lineno"> 677</span> }</div>
<div class="line"><a id="l00678" name="l00678"></a><span class="lineno"> 678</span>}</div>
<div class="line"><a id="l00679" name="l00679"></a><span class="lineno"> 679</span> </div>
<div class="line"><a id="l00680" name="l00680"></a><span class="lineno"> 680</span><span class="keywordtype">void</span> DbcParserTest::validSignals() {</div>
<div class="line"><a id="l00681" name="l00681"></a><span class="lineno"> 681</span> Fixture fixture;</div>
<div class="line"><a id="l00682" name="l00682"></a><span class="lineno"> 682</span> <span class="keyword">const</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a> signalParser;</div>
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno"> 683</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 Frame: 8 ECU\n&quot;</span> +</div>
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno"> 684</span> SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>) + <span class="stringliteral">&quot;\n&quot;</span> +</div>
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno"> 685</span> SignalLine(<span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1-&quot;</span>, <span class="stringliteral">&quot;-1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;-255&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;Negative&quot;</span>) + <span class="stringliteral">&quot;\n&quot;</span>);</div>
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno"> 686</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> factors = signalParser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00687" name="l00687"></a><span class="lineno"> 687</span> CHECK(factors.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[0].signals.size() == 2U &amp;&amp;</div>
<div class="line"><a id="l00688" name="l00688"></a><span class="lineno"> 688</span> factors.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[0].signals[0].factor == 0.0 &amp;&amp;</div>
<div class="line"><a id="l00689" name="l00689"></a><span class="lineno"> 689</span> factors.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[0].signals[1].factor == -1.0,</div>
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno"> 690</span> <span class="stringliteral">&quot;Zero and negative factors and equal range boundaries&quot;</span>);</div>
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno"> 691</span> </div>
<div class="line"><a id="l00692" name="l00692"></a><span class="lineno"> 692</span> <span class="keyword">struct </span>SignalCase {</div>
<div class="line"><a id="l00693" name="l00693"></a><span class="lineno"> 693</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *start;</div>
<div class="line"><a id="l00694" name="l00694"></a><span class="lineno"> 694</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *length;</div>
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno"> 695</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *order;</div>
<div class="line"><a id="l00696" name="l00696"></a><span class="lineno"> 696</span> <span class="keywordtype">unsigned</span> payload;</div>
<div class="line"><a id="l00697" name="l00697"></a><span class="lineno"> 697</span> };</div>
<div class="line"><a id="l00698" name="l00698"></a><span class="lineno"> 698</span> <span class="keyword">const</span> SignalCase validSignals[] = {</div>
<div class="line"><a id="l00699" name="l00699"></a><span class="lineno"> 699</span> {<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, 1U},</div>
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno"> 700</span> {<span class="stringliteral">&quot;7&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0-&quot;</span>, 1U},</div>
<div class="line"><a id="l00701" name="l00701"></a><span class="lineno"> 701</span> {<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;64&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, 8U},</div>
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno"> 702</span> {<span class="stringliteral">&quot;7&quot;</span>, <span class="stringliteral">&quot;64&quot;</span>, <span class="stringliteral">&quot;0-&quot;</span>, 8U},</div>
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno"> 703</span> {<span class="stringliteral">&quot;63&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, 8U},</div>
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno"> 704</span> {<span class="stringliteral">&quot;56&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0+&quot;</span>, 8U},</div>
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno"> 705</span> {<span class="stringliteral">&quot;3&quot;</span>, <span class="stringliteral">&quot;12&quot;</span>, <span class="stringliteral">&quot;0+&quot;</span>, 2U},</div>
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno"> 706</span> {<span class="stringliteral">&quot;2039&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, 255U}};</div>
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno"> 707</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> SignalCase &amp;test: validSignals) {</div>
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno"> 708</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 Frame: &quot;</span> + std::to_string(test.payload) + <span class="stringliteral">&quot; ECU\n&quot;</span> +</div>
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno"> 709</span> SignalLine(test.start, test.length, test.order, <span class="stringliteral">&quot;.5e+1&quot;</span>, <span class="stringliteral">&quot;-2.5E-1&quot;</span>, <span class="stringliteral">&quot;-1.&quot;</span>, <span class="stringliteral">&quot;+2e2&quot;</span>) + <span class="stringliteral">&quot;\n&quot;</span>);</div>
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno"> 710</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00711" name="l00711"></a><span class="lineno"> 711</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> parsed = signalParser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00712" name="l00712"></a><span class="lineno"> 712</span> <span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> &amp;signal = parsed.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.at(0).signals.at(0);</div>
<div class="line"><a id="l00713" name="l00713"></a><span class="lineno"> 713</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#ace290724f9801521609aedaa946d61f1">startBit</a>, <span class="keyword">static_cast&lt;</span>std::uint32_t<span class="keyword">&gt;</span>(std::stoul(test.start)));</div>
<div class="line"><a id="l00714" name="l00714"></a><span class="lineno"> 714</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#a1008b5201f71848177217bd52fb84baa">length</a>, <span class="keyword">static_cast&lt;</span>std::uint32_t<span class="keyword">&gt;</span>(std::stoul(test.length)));</div>
<div class="line"><a id="l00715" name="l00715"></a><span class="lineno"> 715</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#af363b1563fb4c7cc8973f9a80c06846c">isLittleEndian</a>, test.order[0] == <span class="charliteral">&#39;1&#39;</span>);</div>
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno"> 716</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#a52a52b320eef92fbcb4626307f9a498f">isSigned</a>, test.order[1] == <span class="charliteral">&#39;-&#39;</span>);</div>
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno"> 717</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#ae4f78d99a2750aa564d7eba860171499">factor</a>, 5.0);</div>
<div class="line"><a id="l00718" name="l00718"></a><span class="lineno"> 718</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#ab7d0769f47aa540656b22e4e49db517e">offset</a>, -0.25);</div>
<div class="line"><a id="l00719" name="l00719"></a><span class="lineno"> 719</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#ada7bf94fbeaa26bd08c73982b5af255b">minimum</a>, -1.0);</div>
<div class="line"><a id="l00720" name="l00720"></a><span class="lineno"> 720</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#adf1c4331b9eabced0d7fdda40ff0eb52">maximum</a>, 200.0);</div>
<div class="line"><a id="l00721" name="l00721"></a><span class="lineno"> 721</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::exception &amp;error) { CHECK(<span class="keyword">false</span>, error.what()); }</div>
<div class="line"><a id="l00722" name="l00722"></a><span class="lineno"> 722</span> }</div>
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno"> 723</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 Frame: 8 ECU\n&quot;</span></div>
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno"> 724</span> <span class="stringliteral">&quot;SG_\tValue\t:\t0 | 8 @1+ ( 1 , 0 ) [ 0 | 255 ] \&quot;rpm\&quot; ECU1,\tECU2\n&quot;</span>);</div>
<div class="line"><a id="l00725" name="l00725"></a><span class="lineno"> 725</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00726" name="l00726"></a><span class="lineno"> 726</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> parsed = signalParser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00727" name="l00727"></a><span class="lineno"> 727</span> <span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> &amp;signal = parsed.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.at(0).signals.at(0);</div>
<div class="line"><a id="l00728" name="l00728"></a><span class="lineno"> 728</span> CHECK(signal.<a class="code hl_variable" href="structSignalInfo.html#a379e422a00cad56f896cacf60455b088">name</a> == <span class="stringliteral">&quot;Value&quot;</span> &amp;&amp; signal.<a class="code hl_variable" href="structSignalInfo.html#a1f214f03e94ef5794de2d3367bfcbd01">unit</a> == <span class="stringliteral">&quot;rpm&quot;</span> &amp;&amp;</div>
<div class="line"><a id="l00729" name="l00729"></a><span class="lineno"> 729</span> signal.<a class="code hl_variable" href="structSignalInfo.html#a2c95562fd0b29327a7fd7b1e6feee7f3">receivers</a> == std::vector&lt;std::string&gt;({<span class="stringliteral">&quot;ECU1&quot;</span>, <span class="stringliteral">&quot;ECU2&quot;</span>}),</div>
<div class="line"><a id="l00730" name="l00730"></a><span class="lineno"> 730</span> <span class="stringliteral">&quot;Signal tabs, spaces, and receiver list&quot;</span>);</div>
<div class="line"><a id="l00731" name="l00731"></a><span class="lineno"> 731</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::exception &amp;error) { CHECK(<span class="keyword">false</span>, error.what()); }</div>
<div class="line"><a id="l00732" name="l00732"></a><span class="lineno"> 732</span>}</div>
<div class="line"><a id="l00733" name="l00733"></a><span class="lineno"> 733</span> </div>
<div class="line"><a id="l00734" name="l00734"></a><span class="lineno"> 734</span><span class="keywordtype">void</span> DbcParserTest::dispatch() {</div>
<div class="line"><a id="l00735" name="l00735"></a><span class="lineno"> 735</span> CountingHandler::instances = 0;</div>
<div class="line"><a id="l00736" name="l00736"></a><span class="lineno"> 736</span> CountingHandler::calls = 0;</div>
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno"> 737</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> dispatchDatabase;</div>
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno"> 738</span> <a class="code hl_struct" href="structDbcParseContext.html">DbcParseContext</a> context{dispatchDatabase, <span class="keyword">nullptr</span>};</div>
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno"> 739</span> <a class="code hl_class" href="classDbcStatementDispatcher.html">DbcStatementDispatcher</a> dispatcher;</div>
<div class="line"><a id="l00740" name="l00740"></a><span class="lineno"> 740</span> dispatcher.RegisterType&lt;CountingHandler&gt;(<span class="stringliteral">&quot;TEST_&quot;</span>);</div>
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno"> 741</span> CHECK(dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(<span class="stringliteral">&quot;TEST_ first&quot;</span>, context) &amp;&amp;</div>
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno"> 742</span> dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(<span class="stringliteral">&quot;TEST_ second&quot;</span>, context) &amp;&amp;</div>
<div class="line"><a id="l00743" name="l00743"></a><span class="lineno"> 743</span> CountingHandler::instances == 1 &amp;&amp; CountingHandler::calls == 2 &amp;&amp;</div>
<div class="line"><a id="l00744" name="l00744"></a><span class="lineno"> 744</span> dispatchDatabase.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.size() == 2U,</div>
<div class="line"><a id="l00745" name="l00745"></a><span class="lineno"> 745</span> <span class="stringliteral">&quot;Factory dispatch and handler reuse&quot;</span>);</div>
<div class="line"><a id="l00746" name="l00746"></a><span class="lineno"> 746</span> CHECK(!dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(<span class="stringliteral">&quot;TEST_OTHER data&quot;</span>, context) &amp;&amp;</div>
<div class="line"><a id="l00747" name="l00747"></a><span class="lineno"> 747</span> !dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(<span class="stringliteral">&quot;BO_TX_BU_ 1 : ECU;&quot;</span>, context) &amp;&amp;</div>
<div class="line"><a id="l00748" name="l00748"></a><span class="lineno"> 748</span> !dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(<span class="stringliteral">&quot;VAL_TABLE_ States 0 \&quot;Stopped\&quot;;&quot;</span>, context) &amp;&amp;</div>
<div class="line"><a id="l00749" name="l00749"></a><span class="lineno"> 749</span> CountingHandler::calls == 2,</div>
<div class="line"><a id="l00750" name="l00750"></a><span class="lineno"> 750</span> <span class="stringliteral">&quot;Exact and unknown keyword dispatch&quot;</span>);</div>
<div class="line"><a id="l00751" name="l00751"></a><span class="lineno"> 751</span>}</div>
<div class="line"><a id="l00752" name="l00752"></a><span class="lineno"> 752</span> </div>
<div class="line"><a id="l00753" name="l00753"></a><span class="lineno"> 753</span><span class="keywordtype">void</span> DbcParserTest::independentSessions() {</div>
<div class="line"><a id="l00754" name="l00754"></a><span class="lineno"> 754</span> Fixture fixture;</div>
<div class="line"><a id="l00755" name="l00755"></a><span class="lineno"> 755</span> <span class="keyword">const</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a> parser;</div>
<div class="line"><a id="l00756" name="l00756"></a><span class="lineno"> 756</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 First: 8 ECU\n&quot;</span>);</div>
<div class="line"><a id="l00757" name="l00757"></a><span class="lineno"> 757</span> CHECK(parser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string()).<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.size() == 1U, <span class="stringliteral">&quot;First parse&quot;</span>);</div>
<div class="line"><a id="l00758" name="l00758"></a><span class="lineno"> 758</span> fixture.Write(<span class="stringliteral">&quot;SG_ Speed : invalid\n&quot;</span>);</div>
<div class="line"><a id="l00759" name="l00759"></a><span class="lineno"> 759</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00760" name="l00760"></a><span class="lineno"> 760</span> parser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00761" name="l00761"></a><span class="lineno"> 761</span> CHECK(<span class="keyword">false</span>, <span class="stringliteral">&quot;Independent parse context&quot;</span>);</div>
<div class="line"><a id="l00762" name="l00762"></a><span class="lineno"> 762</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;error) {</div>
<div class="line"><a id="l00763" name="l00763"></a><span class="lineno"> 763</span> CHECK(std::string(error.what()).find(<span class="stringliteral">&quot;Signal found before any frame&quot;</span>) !=</div>
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno"> 764</span> std::string::npos,</div>
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno"> 765</span> <span class="stringliteral">&quot;Independent parse context&quot;</span>);</div>
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno"> 766</span> }</div>
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno"> 767</span> fixture.Write(<span class="stringliteral">&quot;BO_ 2 Second: 8 ECU\n&quot;</span>);</div>
<div class="line"><a id="l00768" name="l00768"></a><span class="lineno"> 768</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> recovered = parser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno"> 769</span> CHECK(recovered.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.size() == 1U &amp;&amp; recovered.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[0].canId == 2U,</div>
<div class="line"><a id="l00770" name="l00770"></a><span class="lineno"> 770</span> <span class="stringliteral">&quot;Fresh parse after error&quot;</span>);</div>
<div class="line"><a id="l00771" name="l00771"></a><span class="lineno"> 771</span>}</div>
<div class="line"><a id="l00772" name="l00772"></a><span class="lineno"> 772</span> </div>
<div class="line"><a id="l00773" name="l00773"></a><span class="lineno"> 773</span> </div>
<div class="line"><a id="l00774" name="l00774"></a><span class="lineno"> 774</span><span class="keywordtype">void</span> DbcParserTest::valueDescriptions() {</div>
<div class="line"><a id="l00775" name="l00775"></a><span class="lineno"> 775</span> Fixture fixture;</div>
<div class="line"><a id="l00776" name="l00776"></a><span class="lineno"> 776</span> fixture.Write(</div>
<div class="line"><a id="l00777" name="l00777"></a><span class="lineno"> 777</span> <span class="stringliteral">&quot;VAL_\t256\tState\t0\t\&quot;Off\&quot;\t1 \&quot;On\&quot; 2 \&quot;Error with spaces; and \\\&quot;quotes\\\&quot;\&quot;;\n&quot;</span></div>
<div class="line"><a id="l00778" name="l00778"></a><span class="lineno"> 778</span> <span class="stringliteral">&quot;BO_ 256 Status: 8 ECU\n&quot;</span></div>
<div class="line"><a id="l00779" name="l00779"></a><span class="lineno"> 779</span> <span class="stringliteral">&quot;SG_ State : 0|8@1+ (2,10) [0|520] \&quot;\&quot; ECU\n&quot;</span></div>
<div class="line"><a id="l00780" name="l00780"></a><span class="lineno"> 780</span> <span class="stringliteral">&quot;VAL_ 256 State 3 \&quot;\&quot;;\n&quot;</span></div>
<div class="line"><a id="l00781" name="l00781"></a><span class="lineno"> 781</span> <span class="stringliteral">&quot;VAL_ 2147483904 State -9223372036854775808 \&quot;Minimum\&quot; -1 \&quot;Negative\&quot; 9223372036854775807 \&quot;Maximum\&quot;;\n&quot;</span></div>
<div class="line"><a id="l00782" name="l00782"></a><span class="lineno"> 782</span> <span class="stringliteral">&quot;BO_ 2147483904 Extended: 8 ECU\n&quot;</span></div>
<div class="line"><a id="l00783" name="l00783"></a><span class="lineno"> 783</span> <span class="stringliteral">&quot;SG_ State : 0|64@1- (1,0) [-1e20|1e20] \&quot;\&quot; ECU\n&quot;</span></div>
<div class="line"><a id="l00784" name="l00784"></a><span class="lineno"> 784</span> <span class="stringliteral">&quot;BO_ 2048 Unsigned: 8 ECU\n&quot;</span></div>
<div class="line"><a id="l00785" name="l00785"></a><span class="lineno"> 785</span> <span class="stringliteral">&quot;SG_ State : 0|64@1+ (1,0) [0|2e20] \&quot;\&quot; ECU\n&quot;</span></div>
<div class="line"><a id="l00786" name="l00786"></a><span class="lineno"> 786</span> <span class="stringliteral">&quot;VAL_ 2147485696 State 9223372036854775808 \&quot;High\&quot; 18446744073709551615 \&quot;Full\&quot;;\n&quot;</span>);</div>
<div class="line"><a id="l00787" name="l00787"></a><span class="lineno"> 787</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> parsed = <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno"> 788</span> <span class="keyword">const</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> runtime = <a class="code hl_class" href="classDbcDecodeBuilder.html">DbcDecodeBuilder</a>().<a class="code hl_function" href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b">Build</a>(parsed);</div>
<div class="line"><a id="l00789" name="l00789"></a><span class="lineno"> 789</span> <span class="keyword">const</span> std::unique_ptr&lt;TreeNode&gt; tree = <a class="code hl_class" href="classDbcTreeBuilder.html">DbcTreeBuilder</a>().<a class="code hl_function" href="classDbcTreeBuilder.html#a7e57d067d831b14b383947fd125edd4b">Build</a>(parsed);</div>
<div class="line"><a id="l00790" name="l00790"></a><span class="lineno"> 790</span> CHECK(tree-&gt;GetChild(0)-&gt;GetSignal() == <span class="keyword">nullptr</span>, <span class="stringliteral">&quot;Frame node&quot;</span>);</div>
<div class="line"><a id="l00791" name="l00791"></a><span class="lineno"> 791</span> <span class="keywordflow">for</span> (std::size_t index = 0; index &lt; parsed.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.size(); ++index) {</div>
<div class="line"><a id="l00792" name="l00792"></a><span class="lineno"> 792</span> CHECK(tree-&gt;GetChild(index)-&gt;GetChild(0)-&gt;GetSignal()-&gt;valueDescriptions ==</div>
<div class="line"><a id="l00793" name="l00793"></a><span class="lineno"> 793</span> parsed.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[index].signals[0].valueDescriptions &amp;&amp;</div>
<div class="line"><a id="l00794" name="l00794"></a><span class="lineno"> 794</span> runtime.<a class="code hl_function" href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">GetFrames</a>()[index].signals[0].valueDescriptions ==</div>
<div class="line"><a id="l00795" name="l00795"></a><span class="lineno"> 795</span> parsed.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[index].signals[0].valueDescriptions,</div>
<div class="line"><a id="l00796" name="l00796"></a><span class="lineno"> 796</span> <span class="stringliteral">&quot;All mappings survive both builders&quot;</span>);</div>
<div class="line"><a id="l00797" name="l00797"></a><span class="lineno"> 797</span> }</div>
<div class="line"><a id="l00798" name="l00798"></a><span class="lineno"> 798</span> CHECK(tree-&gt;GetChild(0)-&gt;GetChild(0)-&gt;GetSignal()-&gt;valueDescriptions ==</div>
<div class="line"><a id="l00799" name="l00799"></a><span class="lineno"> 799</span> runtime.<a class="code hl_function" href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">GetFrames</a>()[0].signals[0].valueDescriptions,</div>
<div class="line"><a id="l00800" name="l00800"></a><span class="lineno"> 800</span> <span class="stringliteral">&quot;Both builders preserve descriptions&quot;</span>);</div>
<div class="line"><a id="l00801" name="l00801"></a><span class="lineno"> 801</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> frame;</div>
<div class="line"><a id="l00802" name="l00802"></a><span class="lineno"> 802</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a> = 256;</div>
<div class="line"><a id="l00803" name="l00803"></a><span class="lineno"> 803</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>.resize(8);</div>
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno"> 804</span> <span class="keyword">const</span> std::string expected[] = {<span class="stringliteral">&quot;Off&quot;</span>, <span class="stringliteral">&quot;On&quot;</span>, <span class="stringliteral">&quot;Error with spaces; and \&quot;quotes\&quot;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>};</div>
<div class="line"><a id="l00805" name="l00805"></a><span class="lineno"> 805</span> <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> value = 0; value &lt; 5; ++value) {</div>
<div class="line"><a id="l00806" name="l00806"></a><span class="lineno"> 806</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>[0] = value;</div>
<div class="line"><a id="l00807" name="l00807"></a><span class="lineno"> 807</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> decoded = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(runtime, frame).signals[0];</div>
<div class="line"><a id="l00808" name="l00808"></a><span class="lineno"> 808</span> CHECK(decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a> &amp;&amp; decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">physicalValue</a> == value * 2 + 10, <span class="stringliteral">&quot;Numeric scaling unchanged&quot;</span>);</div>
<div class="line"><a id="l00809" name="l00809"></a><span class="lineno"> 809</span> <span class="keyword">const</span> std::string *description = decoded.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>();</div>
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno"> 810</span> CHECK(value &lt; 4 ? description &amp;&amp; *description == expected[value] : !description,</div>
<div class="line"><a id="l00811" name="l00811"></a><span class="lineno"> 811</span> <span class="stringliteral">&quot;Raw lookup and unknown value&quot;</span>);</div>
<div class="line"><a id="l00812" name="l00812"></a><span class="lineno"> 812</span> }</div>
<div class="line"><a id="l00813" name="l00813"></a><span class="lineno"> 813</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a462193d275adc1dba8bd18ffa0e36bb7">isExtended</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00814" name="l00814"></a><span class="lineno"> 814</span> <span class="keyword">struct </span>Boundary {</div>
<div class="line"><a id="l00815" name="l00815"></a><span class="lineno"> 815</span> std::uint64_t bits;</div>
<div class="line"><a id="l00816" name="l00816"></a><span class="lineno"> 816</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *description;</div>
<div class="line"><a id="l00817" name="l00817"></a><span class="lineno"> 817</span> };</div>
<div class="line"><a id="l00818" name="l00818"></a><span class="lineno"> 818</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> Boundary &amp;test: {Boundary{0x8000000000000000ULL, <span class="stringliteral">&quot;Minimum&quot;</span>},</div>
<div class="line"><a id="l00819" name="l00819"></a><span class="lineno"> 819</span> Boundary{0xFFFFFFFFFFFFFFFFULL, <span class="stringliteral">&quot;Negative&quot;</span>},</div>
<div class="line"><a id="l00820" name="l00820"></a><span class="lineno"> 820</span> Boundary{0x7FFFFFFFFFFFFFFFULL, <span class="stringliteral">&quot;Maximum&quot;</span>}}) {</div>
<div class="line"><a id="l00821" name="l00821"></a><span class="lineno"> 821</span> <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">byte</span> = 0; <span class="keywordtype">byte</span> &lt; 8; ++byte)</div>
<div class="line"><a id="l00822" name="l00822"></a><span class="lineno"> 822</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>[<span class="keywordtype">byte</span>] = <span class="keyword">static_cast&lt;</span>std::uint8_t<span class="keyword">&gt;</span>(test.bits &gt;&gt; (<span class="keywordtype">byte</span> * 8));</div>
<div class="line"><a id="l00823" name="l00823"></a><span class="lineno"> 823</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> decoded = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(runtime, frame).signals[0];</div>
<div class="line"><a id="l00824" name="l00824"></a><span class="lineno"> 824</span> CHECK(decoded.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>() &amp;&amp; *decoded.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>() == test.description,</div>
<div class="line"><a id="l00825" name="l00825"></a><span class="lineno"> 825</span> <span class="stringliteral">&quot;Signed boundaries and distinct extended frame&quot;</span>);</div>
<div class="line"><a id="l00826" name="l00826"></a><span class="lineno"> 826</span> }</div>
<div class="line"><a id="l00827" name="l00827"></a><span class="lineno"> 827</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a> = 2048;</div>
<div class="line"><a id="l00828" name="l00828"></a><span class="lineno"> 828</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> Boundary &amp;test: {Boundary{0x8000000000000000ULL, <span class="stringliteral">&quot;High&quot;</span>},</div>
<div class="line"><a id="l00829" name="l00829"></a><span class="lineno"> 829</span> Boundary{0xFFFFFFFFFFFFFFFFULL, <span class="stringliteral">&quot;Full&quot;</span>}}) {</div>
<div class="line"><a id="l00830" name="l00830"></a><span class="lineno"> 830</span> <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">byte</span> = 0; <span class="keywordtype">byte</span> &lt; 8; ++byte)</div>
<div class="line"><a id="l00831" name="l00831"></a><span class="lineno"> 831</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>[<span class="keywordtype">byte</span>] = <span class="keyword">static_cast&lt;</span>std::uint8_t<span class="keyword">&gt;</span>(test.bits &gt;&gt; (<span class="keywordtype">byte</span> * 8));</div>
<div class="line"><a id="l00832" name="l00832"></a><span class="lineno"> 832</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> decoded = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(runtime, frame).signals[0];</div>
<div class="line"><a id="l00833" name="l00833"></a><span class="lineno"> 833</span> CHECK(decoded.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>() &amp;&amp; *decoded.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>() == test.description,</div>
<div class="line"><a id="l00834" name="l00834"></a><span class="lineno"> 834</span> <span class="stringliteral">&quot;Unsigned boundaries&quot;</span>);</div>
<div class="line"><a id="l00835" name="l00835"></a><span class="lineno"> 835</span> }</div>
<div class="line"><a id="l00836" name="l00836"></a><span class="lineno"> 836</span> CHECK(FindValueDescription(runtime.<a class="code hl_function" href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">GetFrames</a>()[0].signals[0].valueDescriptions, std::int64_t(1)) != <span class="keyword">nullptr</span>,</div>
<div class="line"><a id="l00837" name="l00837"></a><span class="lineno"> 837</span> <span class="stringliteral">&quot;Nonnegative signed lookup matches unsigned key&quot;</span>);</div>
<div class="line"><a id="l00838" name="l00838"></a><span class="lineno"> 838</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>.clear();</div>
<div class="line"><a id="l00839" name="l00839"></a><span class="lineno"> 839</span> CHECK(!<a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().Decode(runtime, frame).signals[0].GetValueDescription(), <span class="stringliteral">&quot;Invalid decode has no description&quot;</span>);</div>
<div class="line"><a id="l00840" name="l00840"></a><span class="lineno"> 840</span>}</div>
<div class="line"><a id="l00841" name="l00841"></a><span class="lineno"> 841</span> </div>
<div class="line"><a id="l00842" name="l00842"></a><span class="lineno"> 842</span><span class="keywordtype">void</span> DbcParserTest::invalidValueDescriptions() {</div>
<div class="line"><a id="l00843" name="l00843"></a><span class="lineno"> 843</span> Fixture fixture;</div>
<div class="line"><a id="l00844" name="l00844"></a><span class="lineno"> 844</span> <span class="keyword">const</span> std::string definitions = <span class="stringliteral">&quot;BO_ 1 Frame: 8 ECU\nSG_ State : 0|64@1+ (1,0) [0|2e20] \&quot;\&quot; ECU\n&quot;</span>;</div>
<div class="line"><a id="l00845" name="l00845"></a><span class="lineno"> 845</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string statement: {</div>
<div class="line"><a id="l00846" name="l00846"></a><span class="lineno"> 846</span> <span class="stringliteral">&quot;VAL_&quot;</span>, <span class="stringliteral">&quot;VAL_ 1 State;&quot;</span>, <span class="stringliteral">&quot;VAL_ 1 State ;&quot;</span>, <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Off\&quot;&quot;</span>,</div>
<div class="line"><a id="l00847" name="l00847"></a><span class="lineno"> 847</span> <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Off\&quot;; junk&quot;</span>, <span class="stringliteral">&quot;VAL_ 1 State 0 Off;&quot;</span>,</div>
<div class="line"><a id="l00848" name="l00848"></a><span class="lineno"> 848</span> <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Unclosed;&quot;</span>, <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Off\&quot;1 \&quot;On\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00849" name="l00849"></a><span class="lineno"> 849</span> <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Off\&quot; 00 \&quot;Duplicate\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00850" name="l00850"></a><span class="lineno"> 850</span> <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Off\&quot; -0 \&quot;Duplicate\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00851" name="l00851"></a><span class="lineno"> 851</span> <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Off\&quot;;\nVAL_ 1 State 0 \&quot;Duplicate\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00852" name="l00852"></a><span class="lineno"> 852</span> <span class="stringliteral">&quot;VAL_ 2 State 0 \&quot;Missing frame\&quot;;&quot;</span>, <span class="stringliteral">&quot;VAL_ 1 Missing 0 \&quot;Missing signal\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00853" name="l00853"></a><span class="lineno"> 853</span> <span class="stringliteral">&quot;VAL_ -1 State 0 \&quot;Bad ID\&quot;;&quot;</span>, <span class="stringliteral">&quot;VAL_ 536870912 State 0 \&quot;Bad ID\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00854" name="l00854"></a><span class="lineno"> 854</span> <span class="stringliteral">&quot;VAL_ 4294967296 State 0 \&quot;Bad ID\&quot;;&quot;</span>, <span class="stringliteral">&quot;VAL_ Environment 0 \&quot;Unsupported\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00855" name="l00855"></a><span class="lineno"> 855</span> <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Bad\\q escape\&quot;;&quot;</span>}) {</div>
<div class="line"><a id="l00856" name="l00856"></a><span class="lineno"> 856</span> fixture.Write(definitions + statement + <span class="charliteral">&#39;\n&#39;</span>);</div>
<div class="line"><a id="l00857" name="l00857"></a><span class="lineno"> 857</span> <span class="keyword">const</span> <span class="keywordtype">int</span> line = statement.find(<span class="charliteral">&#39;\n&#39;</span>) == std::string::npos ? 3 : 4;</div>
<div class="line"><a id="l00858" name="l00858"></a><span class="lineno"> 858</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00859" name="l00859"></a><span class="lineno"> 859</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00860" name="l00860"></a><span class="lineno"> 860</span> CHECK(<span class="keyword">false</span>, statement);</div>
<div class="line"><a id="l00861" name="l00861"></a><span class="lineno"> 861</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;error) {</div>
<div class="line"><a id="l00862" name="l00862"></a><span class="lineno"> 862</span> CHECK(std::string(error.what()).find(fixture.path.string() + <span class="stringliteral">&quot;:&quot;</span> + std::to_string(line) + <span class="stringliteral">&quot;: &quot;</span>) == 0,</div>
<div class="line"><a id="l00863" name="l00863"></a><span class="lineno"> 863</span> statement + <span class="stringliteral">&quot; &quot;</span> + error.what());</div>
<div class="line"><a id="l00864" name="l00864"></a><span class="lineno"> 864</span> }</div>
<div class="line"><a id="l00865" name="l00865"></a><span class="lineno"> 865</span> }</div>
<div class="line"><a id="l00866" name="l00866"></a><span class="lineno"> 866</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string suffix: {</div>
<div class="line"><a id="l00867" name="l00867"></a><span class="lineno"> 867</span> <span class="stringliteral">&quot;BO_ 1 Other: 8 ECU\n&quot;</span>, <span class="comment">// Duplicate frame definition.</span></div>
<div class="line"><a id="l00868" name="l00868"></a><span class="lineno"> 868</span> <span class="stringliteral">&quot;SG_ State : 0|8@1+ (1,0) [0|255] \&quot;\&quot; ECU\n&quot;</span>,<span class="comment">// Duplicate signal definition.</span></div>
<div class="line"><a id="l00869" name="l00869"></a><span class="lineno"> 869</span> <span class="stringliteral">&quot;&quot;</span>}) {</div>
<div class="line"><a id="l00870" name="l00870"></a><span class="lineno"> 870</span> fixture.Write(<span class="stringliteral">&quot;VAL_ 1 &quot;</span> + std::string(suffix.empty() ? <span class="stringliteral">&quot;Missing&quot;</span> : <span class="stringliteral">&quot;State&quot;</span>) +</div>
<div class="line"><a id="l00871" name="l00871"></a><span class="lineno"> 871</span> <span class="stringliteral">&quot; 0 \&quot;Description\&quot;;\n&quot;</span> + definitions + suffix);</div>
<div class="line"><a id="l00872" name="l00872"></a><span class="lineno"> 872</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00873" name="l00873"></a><span class="lineno"> 873</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00874" name="l00874"></a><span class="lineno"> 874</span> CHECK(<span class="keyword">false</span>, <span class="stringliteral">&quot;Missing reference or duplicate definition&quot;</span>);</div>
<div class="line"><a id="l00875" name="l00875"></a><span class="lineno"> 875</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;error) {</div>
<div class="line"><a id="l00876" name="l00876"></a><span class="lineno"> 876</span> <span class="keyword">const</span> std::string line = suffix.empty() ? <span class="stringliteral">&quot;1&quot;</span> : <span class="stringliteral">&quot;4&quot;</span>;</div>
<div class="line"><a id="l00877" name="l00877"></a><span class="lineno"> 877</span> CHECK(std::string(error.what()).find(fixture.path.string() + <span class="stringliteral">&quot;:&quot;</span> + line + <span class="stringliteral">&quot;: &quot;</span>) == 0,</div>
<div class="line"><a id="l00878" name="l00878"></a><span class="lineno"> 878</span> <span class="stringliteral">&quot;Error retains the reference or duplicate definition source location&quot;</span>);</div>
<div class="line"><a id="l00879" name="l00879"></a><span class="lineno"> 879</span> }</div>
<div class="line"><a id="l00880" name="l00880"></a><span class="lineno"> 880</span> }</div>
<div class="line"><a id="l00881" name="l00881"></a><span class="lineno"> 881</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string number: {<span class="stringliteral">&quot;+1&quot;</span>, <span class="stringliteral">&quot;1x&quot;</span>, <span class="stringliteral">&quot;0x10&quot;</span>, <span class="stringliteral">&quot;1.5&quot;</span>, <span class="stringliteral">&quot;1e2&quot;</span>, <span class="stringliteral">&quot;--1&quot;</span>,</div>
<div class="line"><a id="l00882" name="l00882"></a><span class="lineno"> 882</span> <span class="stringliteral">&quot;-9223372036854775809&quot;</span>, <span class="stringliteral">&quot;18446744073709551616&quot;</span>}) {</div>
<div class="line"><a id="l00883" name="l00883"></a><span class="lineno"> 883</span> fixture.Write(<span class="stringliteral">&quot;VAL_ 1 State &quot;</span> + number + <span class="stringliteral">&quot; \&quot;Bad\&quot;;\n&quot;</span> + definitions);</div>
<div class="line"><a id="l00884" name="l00884"></a><span class="lineno"> 884</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00885" name="l00885"></a><span class="lineno"> 885</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00886" name="l00886"></a><span class="lineno"> 886</span> CHECK(<span class="keyword">false</span>, number);</div>
<div class="line"><a id="l00887" name="l00887"></a><span class="lineno"> 887</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;error) {</div>
<div class="line"><a id="l00888" name="l00888"></a><span class="lineno"> 888</span> CHECK(std::string(error.what()).find(fixture.path.string() + <span class="stringliteral">&quot;:1: &quot;</span>) == 0, number);</div>
<div class="line"><a id="l00889" name="l00889"></a><span class="lineno"> 889</span> }</div>
<div class="line"><a id="l00890" name="l00890"></a><span class="lineno"> 890</span> }</div>
<div class="line"><a id="l00891" name="l00891"></a><span class="lineno"> 891</span>}</div>
<div class="line"><a id="l00892" name="l00892"></a><span class="lineno"> 892</span> </div>
<div class="line"><a id="l00893" name="l00893"></a><span class="lineno"> 893</span><span class="keywordtype">int</span> RunParserTests(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv) {</div>
<div class="line"><a id="l00894" name="l00894"></a><span class="lineno"> 894</span> DbcParserTest tests;</div>
<div class="line"><a id="l00895" name="l00895"></a><span class="lineno"> 895</span> <span class="keywordflow">return</span> QTest::qExec(&amp;tests, argc, argv);</div>
<div class="line"><a id="l00896" name="l00896"></a><span class="lineno"> 896</span>}</div>
<div class="line"><a id="l00897" name="l00897"></a><span class="lineno"> 897</span> </div>
<div class="line"><a id="l00898" name="l00898"></a><span class="lineno"> 898</span><span class="preprocessor">#include &quot;dbc_parser_test.moc&quot;</span></div>
<div class="line"><a id="l00606" name="l00606"></a><span class="lineno"> 606</span> QVERIFY_THROWS_EXCEPTION(std::invalid_argument, runtime = <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>(definitions));</div>
<div class="line"><a id="l00607" name="l00607"></a><span class="lineno"> 607</span> definitions[0].signals.pop_back();</div>
<div class="line"><a id="l00608" name="l00608"></a><span class="lineno"> 608</span> QVERIFY_THROWS_EXCEPTION(std::invalid_argument, runtime = <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>(definitions));</div>
<div class="line"><a id="l00609" name="l00609"></a><span class="lineno"> 609</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 Frame: 2 ECU\n\n&quot;</span></div>
<div class="line"><a id="l00610" name="l00610"></a><span class="lineno"> 610</span> <span class="stringliteral">&quot;SG_ Branch m2 : 8|8@1+ (1,0) [0|255] \&quot;\&quot; ECU\n&quot;</span></div>
<div class="line"><a id="l00611" name="l00611"></a><span class="lineno"> 611</span> <span class="stringliteral">&quot;SG_ Mode M : 0|1@1+ (1,0) [0|1] \&quot;\&quot; ECU\n&quot;</span>);</div>
<div class="line"><a id="l00612" name="l00612"></a><span class="lineno"> 612</span> <span class="keywordtype">bool</span> rejected = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00613" name="l00613"></a><span class="lineno"> 613</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00614" name="l00614"></a><span class="lineno"> 614</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00615" name="l00615"></a><span class="lineno"> 615</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;error) {</div>
<div class="line"><a id="l00616" name="l00616"></a><span class="lineno"> 616</span> rejected = std::string(error.what()).find(fixture.path.string() + <span class="stringliteral">&quot;:3: &quot;</span>) == 0U;</div>
<div class="line"><a id="l00617" name="l00617"></a><span class="lineno"> 617</span> }</div>
<div class="line"><a id="l00618" name="l00618"></a><span class="lineno"> 618</span> CHECK(rejected, <span class="stringliteral">&quot;Deferred validation reports branch source line&quot;</span>);</div>
<div class="line"><a id="l00619" name="l00619"></a><span class="lineno"> 619</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 Frame: 2 ECU\n&quot;</span></div>
<div class="line"><a id="l00620" name="l00620"></a><span class="lineno"> 620</span> <span class="stringliteral">&quot;SG_ A : 8|8@1+ (1,0) [0|255] \&quot;\&quot; ECU\n&quot;</span></div>
<div class="line"><a id="l00621" name="l00621"></a><span class="lineno"> 621</span> <span class="stringliteral">&quot;SG_ B : 15|8@0+ (1,0) [0|255] \&quot;\&quot; ECU\n&quot;</span>);</div>
<div class="line"><a id="l00622" name="l00622"></a><span class="lineno"> 622</span> rejected = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00623" name="l00623"></a><span class="lineno"> 623</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00624" name="l00624"></a><span class="lineno"> 624</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00625" name="l00625"></a><span class="lineno"> 625</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;) {</div>
<div class="line"><a id="l00626" name="l00626"></a><span class="lineno"> 626</span> rejected = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00627" name="l00627"></a><span class="lineno"> 627</span> }</div>
<div class="line"><a id="l00628" name="l00628"></a><span class="lineno"> 628</span> CHECK(rejected, <span class="stringliteral">&quot;Ordinary overlapping signals rejected&quot;</span>);</div>
<div class="line"><a id="l00629" name="l00629"></a><span class="lineno"> 629</span>}</div>
<div class="line"><a id="l00630" name="l00630"></a><span class="lineno"> 630</span> </div>
<div class="line"><a id="l00631" name="l00631"></a><span class="lineno"> 631</span><span class="keywordtype">void</span> DbcParserTest::invalidSignals() {</div>
<div class="line"><a id="l00632" name="l00632"></a><span class="lineno"> 632</span> Fixture fixture;</div>
<div class="line"><a id="l00633" name="l00633"></a><span class="lineno"> 633</span> <span class="keyword">const</span> std::string ordinary = SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>);</div>
<div class="line"><a id="l00634" name="l00634"></a><span class="lineno"> 634</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string value: {<span class="stringliteral">&quot;-1&quot;</span>, <span class="stringliteral">&quot;+1&quot;</span>, <span class="stringliteral">&quot;0junk&quot;</span>, <span class="stringliteral">&quot;0x10&quot;</span>, <span class="stringliteral">&quot;1.5&quot;</span>,</div>
<div class="line"><a id="l00635" name="l00635"></a><span class="lineno"> 635</span> <span class="stringliteral">&quot;4294967296&quot;</span>, <span class="stringliteral">&quot;999999999999999999999&quot;</span>}) {</div>
<div class="line"><a id="l00636" name="l00636"></a><span class="lineno"> 636</span> RejectSignal(fixture, SignalLine(value, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00637" name="l00637"></a><span class="lineno"> 637</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, value, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00638" name="l00638"></a><span class="lineno"> 638</span> }</div>
<div class="line"><a id="l00639" name="l00639"></a><span class="lineno"> 639</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string length: {<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;65&quot;</span>})</div>
<div class="line"><a id="l00640" name="l00640"></a><span class="lineno"> 640</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, length, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00641" name="l00641"></a><span class="lineno"> 641</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string order: {<span class="stringliteral">&quot;2+&quot;</span>, <span class="stringliteral">&quot;9-&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;1x&quot;</span>, <span class="stringliteral">&quot;1++&quot;</span>, <span class="stringliteral">&quot;01+&quot;</span>})</div>
<div class="line"><a id="l00642" name="l00642"></a><span class="lineno"> 642</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, order, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00643" name="l00643"></a><span class="lineno"> 643</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string value: {<span class="stringliteral">&quot;1junk&quot;</span>, <span class="stringliteral">&quot;nan&quot;</span>, <span class="stringliteral">&quot;NaN&quot;</span>, <span class="stringliteral">&quot;inf&quot;</span>, <span class="stringliteral">&quot;-inf&quot;</span>, <span class="stringliteral">&quot;1e999&quot;</span>, <span class="stringliteral">&quot;1e-999&quot;</span>, <span class="stringliteral">&quot;0x1p2&quot;</span>, <span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;1e&quot;</span>, <span class="stringliteral">&quot;1.2.3&quot;</span>}) {</div>
<div class="line"><a id="l00644" name="l00644"></a><span class="lineno"> 644</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, value, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00645" name="l00645"></a><span class="lineno"> 645</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, value, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00646" name="l00646"></a><span class="lineno"> 646</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, value, <span class="stringliteral">&quot;255&quot;</span>));</div>
<div class="line"><a id="l00647" name="l00647"></a><span class="lineno"> 647</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, value));</div>
<div class="line"><a id="l00648" name="l00648"></a><span class="lineno"> 648</span> }</div>
<div class="line"><a id="l00649" name="l00649"></a><span class="lineno"> 649</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;2&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>));</div>
<div class="line"><a id="l00650" name="l00650"></a><span class="lineno"> 650</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string name: {<span class="stringliteral">&quot;&quot;</span>, <span class="stringliteral">&quot;Two Names&quot;</span>, <span class="stringliteral">&quot;Value m1M&quot;</span>}) {</div>
<div class="line"><a id="l00651" name="l00651"></a><span class="lineno"> 651</span> std::string line = ordinary;</div>
<div class="line"><a id="l00652" name="l00652"></a><span class="lineno"> 652</span> line.replace(4U, 5U, name);</div>
<div class="line"><a id="l00653" name="l00653"></a><span class="lineno"> 653</span> RejectSignal(fixture, line);</div>
<div class="line"><a id="l00654" name="l00654"></a><span class="lineno"> 654</span> }</div>
<div class="line"><a id="l00655" name="l00655"></a><span class="lineno"> 655</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string broken: {</div>
<div class="line"><a id="l00656" name="l00656"></a><span class="lineno"> 656</span> <span class="stringliteral">&quot;SG_&quot;</span>, <span class="stringliteral">&quot;SG_ Value&quot;</span>, <span class="stringliteral">&quot;SG_ Value : 0|8@1+ (1,0) [0|255] ECU&quot;</span>,</div>
<div class="line"><a id="l00657" name="l00657"></a><span class="lineno"> 657</span> <span class="stringliteral">&quot;SG_ Value : 0|8@1+ (1,0) [0|255] \&quot;\&quot;&quot;</span>,</div>
<div class="line"><a id="l00658" name="l00658"></a><span class="lineno"> 658</span> <span class="stringliteral">&quot;SG_ Value : 0|8@1+ (1,0) [0|255] \&quot;\&quot; ECU,&quot;</span>,</div>
<div class="line"><a id="l00659" name="l00659"></a><span class="lineno"> 659</span> <span class="stringliteral">&quot;SG_ Value : 0|8@1+ (1,0) [0|255] \&quot;\&quot; ECU extra&quot;</span>})</div>
<div class="line"><a id="l00660" name="l00660"></a><span class="lineno"> 660</span> RejectSignal(fixture, broken);</div>
<div class="line"><a id="l00661" name="l00661"></a><span class="lineno"> 661</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;64&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>));</div>
<div class="line"><a id="l00662" name="l00662"></a><span class="lineno"> 662</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;63&quot;</span>, <span class="stringliteral">&quot;2&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;3&quot;</span>));</div>
<div class="line"><a id="l00663" name="l00663"></a><span class="lineno"> 663</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;56&quot;</span>, <span class="stringliteral">&quot;2&quot;</span>, <span class="stringliteral">&quot;0+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;3&quot;</span>));</div>
<div class="line"><a id="l00664" name="l00664"></a><span class="lineno"> 664</span> RejectSignal(fixture, SignalLine(<span class="stringliteral">&quot;4294967295&quot;</span>, <span class="stringliteral">&quot;64&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>));</div>
<div class="line"><a id="l00665" name="l00665"></a><span class="lineno"> 665</span> RejectSignal(fixture, ordinary, 0U);</div>
<div class="line"><a id="l00666" name="l00666"></a><span class="lineno"> 666</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <span class="keywordtype">char</span> delimiter: {<span class="charliteral">&#39;|&#39;</span>, <span class="charliteral">&#39;@&#39;</span>, <span class="charliteral">&#39;(&#39;</span>, <span class="charliteral">&#39;)&#39;</span>, <span class="charliteral">&#39;[&#39;</span>, <span class="charliteral">&#39;]&#39;</span>, <span class="charliteral">&#39;&quot;&#39;</span>}) {</div>
<div class="line"><a id="l00667" name="l00667"></a><span class="lineno"> 667</span> std::string line = ordinary;</div>
<div class="line"><a id="l00668" name="l00668"></a><span class="lineno"> 668</span> line.erase(line.find(delimiter), 1U);</div>
<div class="line"><a id="l00669" name="l00669"></a><span class="lineno"> 669</span> RejectSignal(fixture, line);</div>
<div class="line"><a id="l00670" name="l00670"></a><span class="lineno"> 670</span> }</div>
<div class="line"><a id="l00671" name="l00671"></a><span class="lineno"> 671</span>}</div>
<div class="line"><a id="l00672" name="l00672"></a><span class="lineno"> 672</span> </div>
<div class="line"><a id="l00673" name="l00673"></a><span class="lineno"> 673</span><span class="keywordtype">void</span> DbcParserTest::validSignals() {</div>
<div class="line"><a id="l00674" name="l00674"></a><span class="lineno"> 674</span> Fixture fixture;</div>
<div class="line"><a id="l00675" name="l00675"></a><span class="lineno"> 675</span> <span class="keyword">const</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a> signalParser;</div>
<div class="line"><a id="l00676" name="l00676"></a><span class="lineno"> 676</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 Frame: 8 ECU\n&quot;</span> +</div>
<div class="line"><a id="l00677" name="l00677"></a><span class="lineno"> 677</span> SignalLine(<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>) + <span class="stringliteral">&quot;\n&quot;</span> +</div>
<div class="line"><a id="l00678" name="l00678"></a><span class="lineno"> 678</span> SignalLine(<span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;8&quot;</span>, <span class="stringliteral">&quot;1-&quot;</span>, <span class="stringliteral">&quot;-1&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;-255&quot;</span>, <span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;Negative&quot;</span>) + <span class="stringliteral">&quot;\n&quot;</span>);</div>
<div class="line"><a id="l00679" name="l00679"></a><span class="lineno"> 679</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> factors = signalParser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00680" name="l00680"></a><span class="lineno"> 680</span> CHECK(factors.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[0].signals.size() == 2U &amp;&amp;</div>
<div class="line"><a id="l00681" name="l00681"></a><span class="lineno"> 681</span> factors.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[0].signals[0].factor == 0.0 &amp;&amp;</div>
<div class="line"><a id="l00682" name="l00682"></a><span class="lineno"> 682</span> factors.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[0].signals[1].factor == -1.0,</div>
<div class="line"><a id="l00683" name="l00683"></a><span class="lineno"> 683</span> <span class="stringliteral">&quot;Zero and negative factors and equal range boundaries&quot;</span>);</div>
<div class="line"><a id="l00684" name="l00684"></a><span class="lineno"> 684</span> </div>
<div class="line"><a id="l00685" name="l00685"></a><span class="lineno"> 685</span> <span class="keyword">struct </span>SignalCase {</div>
<div class="line"><a id="l00686" name="l00686"></a><span class="lineno"> 686</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *start;</div>
<div class="line"><a id="l00687" name="l00687"></a><span class="lineno"> 687</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *length;</div>
<div class="line"><a id="l00688" name="l00688"></a><span class="lineno"> 688</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *order;</div>
<div class="line"><a id="l00689" name="l00689"></a><span class="lineno"> 689</span> <span class="keywordtype">unsigned</span> payload;</div>
<div class="line"><a id="l00690" name="l00690"></a><span class="lineno"> 690</span> };</div>
<div class="line"><a id="l00691" name="l00691"></a><span class="lineno"> 691</span> <span class="keyword">const</span> SignalCase validSignals[] = {</div>
<div class="line"><a id="l00692" name="l00692"></a><span class="lineno"> 692</span> {<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, 1U},</div>
<div class="line"><a id="l00693" name="l00693"></a><span class="lineno"> 693</span> {<span class="stringliteral">&quot;7&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0-&quot;</span>, 1U},</div>
<div class="line"><a id="l00694" name="l00694"></a><span class="lineno"> 694</span> {<span class="stringliteral">&quot;0&quot;</span>, <span class="stringliteral">&quot;64&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, 8U},</div>
<div class="line"><a id="l00695" name="l00695"></a><span class="lineno"> 695</span> {<span class="stringliteral">&quot;7&quot;</span>, <span class="stringliteral">&quot;64&quot;</span>, <span class="stringliteral">&quot;0-&quot;</span>, 8U},</div>
<div class="line"><a id="l00696" name="l00696"></a><span class="lineno"> 696</span> {<span class="stringliteral">&quot;63&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, 8U},</div>
<div class="line"><a id="l00697" name="l00697"></a><span class="lineno"> 697</span> {<span class="stringliteral">&quot;56&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;0+&quot;</span>, 8U},</div>
<div class="line"><a id="l00698" name="l00698"></a><span class="lineno"> 698</span> {<span class="stringliteral">&quot;3&quot;</span>, <span class="stringliteral">&quot;12&quot;</span>, <span class="stringliteral">&quot;0+&quot;</span>, 2U},</div>
<div class="line"><a id="l00699" name="l00699"></a><span class="lineno"> 699</span> {<span class="stringliteral">&quot;2039&quot;</span>, <span class="stringliteral">&quot;1&quot;</span>, <span class="stringliteral">&quot;1+&quot;</span>, 255U}};</div>
<div class="line"><a id="l00700" name="l00700"></a><span class="lineno"> 700</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> SignalCase &amp;test: validSignals) {</div>
<div class="line"><a id="l00701" name="l00701"></a><span class="lineno"> 701</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 Frame: &quot;</span> + std::to_string(test.payload) + <span class="stringliteral">&quot; ECU\n&quot;</span> +</div>
<div class="line"><a id="l00702" name="l00702"></a><span class="lineno"> 702</span> SignalLine(test.start, test.length, test.order, <span class="stringliteral">&quot;.5e+1&quot;</span>, <span class="stringliteral">&quot;-2.5E-1&quot;</span>, <span class="stringliteral">&quot;-1.&quot;</span>, <span class="stringliteral">&quot;+2e2&quot;</span>) + <span class="stringliteral">&quot;\n&quot;</span>);</div>
<div class="line"><a id="l00703" name="l00703"></a><span class="lineno"> 703</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00704" name="l00704"></a><span class="lineno"> 704</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> parsed = signalParser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00705" name="l00705"></a><span class="lineno"> 705</span> <span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> &amp;signal = parsed.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.at(0).signals.at(0);</div>
<div class="line"><a id="l00706" name="l00706"></a><span class="lineno"> 706</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#ace290724f9801521609aedaa946d61f1">startBit</a>, <span class="keyword">static_cast&lt;</span>std::uint32_t<span class="keyword">&gt;</span>(std::stoul(test.start)));</div>
<div class="line"><a id="l00707" name="l00707"></a><span class="lineno"> 707</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#a1008b5201f71848177217bd52fb84baa">length</a>, <span class="keyword">static_cast&lt;</span>std::uint32_t<span class="keyword">&gt;</span>(std::stoul(test.length)));</div>
<div class="line"><a id="l00708" name="l00708"></a><span class="lineno"> 708</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#af363b1563fb4c7cc8973f9a80c06846c">isLittleEndian</a>, test.order[0] == <span class="charliteral">&#39;1&#39;</span>);</div>
<div class="line"><a id="l00709" name="l00709"></a><span class="lineno"> 709</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#a52a52b320eef92fbcb4626307f9a498f">isSigned</a>, test.order[1] == <span class="charliteral">&#39;-&#39;</span>);</div>
<div class="line"><a id="l00710" name="l00710"></a><span class="lineno"> 710</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#ae4f78d99a2750aa564d7eba860171499">factor</a>, 5.0);</div>
<div class="line"><a id="l00711" name="l00711"></a><span class="lineno"> 711</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#ab7d0769f47aa540656b22e4e49db517e">offset</a>, -0.25);</div>
<div class="line"><a id="l00712" name="l00712"></a><span class="lineno"> 712</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#ada7bf94fbeaa26bd08c73982b5af255b">minimum</a>, -1.0);</div>
<div class="line"><a id="l00713" name="l00713"></a><span class="lineno"> 713</span> QCOMPARE(signal.<a class="code hl_variable" href="structSignalInfo.html#adf1c4331b9eabced0d7fdda40ff0eb52">maximum</a>, 200.0);</div>
<div class="line"><a id="l00714" name="l00714"></a><span class="lineno"> 714</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::exception &amp;error) { CHECK(<span class="keyword">false</span>, error.what()); }</div>
<div class="line"><a id="l00715" name="l00715"></a><span class="lineno"> 715</span> }</div>
<div class="line"><a id="l00716" name="l00716"></a><span class="lineno"> 716</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 Frame: 8 ECU\n&quot;</span></div>
<div class="line"><a id="l00717" name="l00717"></a><span class="lineno"> 717</span> <span class="stringliteral">&quot;SG_\tValue\t:\t0 | 8 @1+ ( 1 , 0 ) [ 0 | 255 ] \&quot;rpm\&quot; ECU1,\tECU2\n&quot;</span>);</div>
<div class="line"><a id="l00718" name="l00718"></a><span class="lineno"> 718</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00719" name="l00719"></a><span class="lineno"> 719</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> parsed = signalParser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00720" name="l00720"></a><span class="lineno"> 720</span> <span class="keyword">const</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> &amp;signal = parsed.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.at(0).signals.at(0);</div>
<div class="line"><a id="l00721" name="l00721"></a><span class="lineno"> 721</span> CHECK(signal.<a class="code hl_variable" href="structSignalInfo.html#a379e422a00cad56f896cacf60455b088">name</a> == <span class="stringliteral">&quot;Value&quot;</span> &amp;&amp; signal.<a class="code hl_variable" href="structSignalInfo.html#a1f214f03e94ef5794de2d3367bfcbd01">unit</a> == <span class="stringliteral">&quot;rpm&quot;</span> &amp;&amp;</div>
<div class="line"><a id="l00722" name="l00722"></a><span class="lineno"> 722</span> signal.<a class="code hl_variable" href="structSignalInfo.html#a2c95562fd0b29327a7fd7b1e6feee7f3">receivers</a> == std::vector&lt;std::string&gt;({<span class="stringliteral">&quot;ECU1&quot;</span>, <span class="stringliteral">&quot;ECU2&quot;</span>}),</div>
<div class="line"><a id="l00723" name="l00723"></a><span class="lineno"> 723</span> <span class="stringliteral">&quot;Signal tabs, spaces, and receiver list&quot;</span>);</div>
<div class="line"><a id="l00724" name="l00724"></a><span class="lineno"> 724</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::exception &amp;error) { CHECK(<span class="keyword">false</span>, error.what()); }</div>
<div class="line"><a id="l00725" name="l00725"></a><span class="lineno"> 725</span>}</div>
<div class="line"><a id="l00726" name="l00726"></a><span class="lineno"> 726</span> </div>
<div class="line"><a id="l00727" name="l00727"></a><span class="lineno"> 727</span><span class="keywordtype">void</span> DbcParserTest::dispatch() {</div>
<div class="line"><a id="l00728" name="l00728"></a><span class="lineno"> 728</span> CountingHandler::instances = 0;</div>
<div class="line"><a id="l00729" name="l00729"></a><span class="lineno"> 729</span> CountingHandler::calls = 0;</div>
<div class="line"><a id="l00730" name="l00730"></a><span class="lineno"> 730</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> dispatchDatabase;</div>
<div class="line"><a id="l00731" name="l00731"></a><span class="lineno"> 731</span> <a class="code hl_struct" href="structDbcParseContext.html">DbcParseContext</a> context{dispatchDatabase, <span class="keyword">nullptr</span>};</div>
<div class="line"><a id="l00732" name="l00732"></a><span class="lineno"> 732</span> <a class="code hl_class" href="classDbcStatementDispatcher.html">DbcStatementDispatcher</a> dispatcher;</div>
<div class="line"><a id="l00733" name="l00733"></a><span class="lineno"> 733</span> dispatcher.RegisterType&lt;CountingHandler&gt;(<span class="stringliteral">&quot;TEST_&quot;</span>);</div>
<div class="line"><a id="l00734" name="l00734"></a><span class="lineno"> 734</span> CHECK(dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(<span class="stringliteral">&quot;TEST_ first&quot;</span>, context) &amp;&amp;</div>
<div class="line"><a id="l00735" name="l00735"></a><span class="lineno"> 735</span> dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(<span class="stringliteral">&quot;TEST_ second&quot;</span>, context) &amp;&amp;</div>
<div class="line"><a id="l00736" name="l00736"></a><span class="lineno"> 736</span> CountingHandler::instances == 1 &amp;&amp; CountingHandler::calls == 2 &amp;&amp;</div>
<div class="line"><a id="l00737" name="l00737"></a><span class="lineno"> 737</span> dispatchDatabase.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.size() == 2U,</div>
<div class="line"><a id="l00738" name="l00738"></a><span class="lineno"> 738</span> <span class="stringliteral">&quot;Factory dispatch and handler reuse&quot;</span>);</div>
<div class="line"><a id="l00739" name="l00739"></a><span class="lineno"> 739</span> CHECK(!dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(<span class="stringliteral">&quot;TEST_OTHER data&quot;</span>, context) &amp;&amp;</div>
<div class="line"><a id="l00740" name="l00740"></a><span class="lineno"> 740</span> !dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(<span class="stringliteral">&quot;BO_TX_BU_ 1 : ECU;&quot;</span>, context) &amp;&amp;</div>
<div class="line"><a id="l00741" name="l00741"></a><span class="lineno"> 741</span> !dispatcher.<a class="code hl_function" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">Dispatch</a>(<span class="stringliteral">&quot;VAL_TABLE_ States 0 \&quot;Stopped\&quot;;&quot;</span>, context) &amp;&amp;</div>
<div class="line"><a id="l00742" name="l00742"></a><span class="lineno"> 742</span> CountingHandler::calls == 2,</div>
<div class="line"><a id="l00743" name="l00743"></a><span class="lineno"> 743</span> <span class="stringliteral">&quot;Exact and unknown keyword dispatch&quot;</span>);</div>
<div class="line"><a id="l00744" name="l00744"></a><span class="lineno"> 744</span>}</div>
<div class="line"><a id="l00745" name="l00745"></a><span class="lineno"> 745</span> </div>
<div class="line"><a id="l00746" name="l00746"></a><span class="lineno"> 746</span><span class="keywordtype">void</span> DbcParserTest::independentSessions() {</div>
<div class="line"><a id="l00747" name="l00747"></a><span class="lineno"> 747</span> Fixture fixture;</div>
<div class="line"><a id="l00748" name="l00748"></a><span class="lineno"> 748</span> <span class="keyword">const</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a> parser;</div>
<div class="line"><a id="l00749" name="l00749"></a><span class="lineno"> 749</span> fixture.Write(<span class="stringliteral">&quot;BO_ 1 First: 8 ECU\n&quot;</span>);</div>
<div class="line"><a id="l00750" name="l00750"></a><span class="lineno"> 750</span> CHECK(parser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string()).<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.size() == 1U, <span class="stringliteral">&quot;First parse&quot;</span>);</div>
<div class="line"><a id="l00751" name="l00751"></a><span class="lineno"> 751</span> fixture.Write(<span class="stringliteral">&quot;SG_ Speed : invalid\n&quot;</span>);</div>
<div class="line"><a id="l00752" name="l00752"></a><span class="lineno"> 752</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00753" name="l00753"></a><span class="lineno"> 753</span> parser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00754" name="l00754"></a><span class="lineno"> 754</span> CHECK(<span class="keyword">false</span>, <span class="stringliteral">&quot;Independent parse context&quot;</span>);</div>
<div class="line"><a id="l00755" name="l00755"></a><span class="lineno"> 755</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;error) {</div>
<div class="line"><a id="l00756" name="l00756"></a><span class="lineno"> 756</span> CHECK(std::string(error.what()).find(<span class="stringliteral">&quot;Signal found before any frame&quot;</span>) !=</div>
<div class="line"><a id="l00757" name="l00757"></a><span class="lineno"> 757</span> std::string::npos,</div>
<div class="line"><a id="l00758" name="l00758"></a><span class="lineno"> 758</span> <span class="stringliteral">&quot;Independent parse context&quot;</span>);</div>
<div class="line"><a id="l00759" name="l00759"></a><span class="lineno"> 759</span> }</div>
<div class="line"><a id="l00760" name="l00760"></a><span class="lineno"> 760</span> fixture.Write(<span class="stringliteral">&quot;BO_ 2 Second: 8 ECU\n&quot;</span>);</div>
<div class="line"><a id="l00761" name="l00761"></a><span class="lineno"> 761</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> recovered = parser.<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00762" name="l00762"></a><span class="lineno"> 762</span> CHECK(recovered.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.size() == 1U &amp;&amp; recovered.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[0].canId == 2U,</div>
<div class="line"><a id="l00763" name="l00763"></a><span class="lineno"> 763</span> <span class="stringliteral">&quot;Fresh parse after error&quot;</span>);</div>
<div class="line"><a id="l00764" name="l00764"></a><span class="lineno"> 764</span>}</div>
<div class="line"><a id="l00765" name="l00765"></a><span class="lineno"> 765</span> </div>
<div class="line"><a id="l00766" name="l00766"></a><span class="lineno"> 766</span> </div>
<div class="line"><a id="l00767" name="l00767"></a><span class="lineno"> 767</span><span class="keywordtype">void</span> DbcParserTest::valueDescriptions() {</div>
<div class="line"><a id="l00768" name="l00768"></a><span class="lineno"> 768</span> Fixture fixture;</div>
<div class="line"><a id="l00769" name="l00769"></a><span class="lineno"> 769</span> fixture.Write(</div>
<div class="line"><a id="l00770" name="l00770"></a><span class="lineno"> 770</span> <span class="stringliteral">&quot;VAL_\t256\tState\t0\t\&quot;Off\&quot;\t1 \&quot;On\&quot; 2 \&quot;Error with spaces; and \\\&quot;quotes\\\&quot;\&quot;;\n&quot;</span></div>
<div class="line"><a id="l00771" name="l00771"></a><span class="lineno"> 771</span> <span class="stringliteral">&quot;BO_ 256 Status: 8 ECU\n&quot;</span></div>
<div class="line"><a id="l00772" name="l00772"></a><span class="lineno"> 772</span> <span class="stringliteral">&quot;SG_ State : 0|8@1+ (2,10) [0|520] \&quot;\&quot; ECU\n&quot;</span></div>
<div class="line"><a id="l00773" name="l00773"></a><span class="lineno"> 773</span> <span class="stringliteral">&quot;VAL_ 256 State 3 \&quot;\&quot;;\n&quot;</span></div>
<div class="line"><a id="l00774" name="l00774"></a><span class="lineno"> 774</span> <span class="stringliteral">&quot;VAL_ 2147483904 State -9223372036854775808 \&quot;Minimum\&quot; -1 \&quot;Negative\&quot; 9223372036854775807 \&quot;Maximum\&quot;;\n&quot;</span></div>
<div class="line"><a id="l00775" name="l00775"></a><span class="lineno"> 775</span> <span class="stringliteral">&quot;BO_ 2147483904 Extended: 8 ECU\n&quot;</span></div>
<div class="line"><a id="l00776" name="l00776"></a><span class="lineno"> 776</span> <span class="stringliteral">&quot;SG_ State : 0|64@1- (1,0) [-1e20|1e20] \&quot;\&quot; ECU\n&quot;</span></div>
<div class="line"><a id="l00777" name="l00777"></a><span class="lineno"> 777</span> <span class="stringliteral">&quot;BO_ 2048 Unsigned: 8 ECU\n&quot;</span></div>
<div class="line"><a id="l00778" name="l00778"></a><span class="lineno"> 778</span> <span class="stringliteral">&quot;SG_ State : 0|64@1+ (1,0) [0|2e20] \&quot;\&quot; ECU\n&quot;</span></div>
<div class="line"><a id="l00779" name="l00779"></a><span class="lineno"> 779</span> <span class="stringliteral">&quot;VAL_ 2147485696 State 9223372036854775808 \&quot;High\&quot; 18446744073709551615 \&quot;Full\&quot;;\n&quot;</span>);</div>
<div class="line"><a id="l00780" name="l00780"></a><span class="lineno"> 780</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> parsed = <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00781" name="l00781"></a><span class="lineno"> 781</span> <span class="keyword">const</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> runtime = <a class="code hl_class" href="classDbcDecodeBuilder.html">DbcDecodeBuilder</a>().<a class="code hl_function" href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b">Build</a>(parsed);</div>
<div class="line"><a id="l00782" name="l00782"></a><span class="lineno"> 782</span> <span class="keyword">const</span> std::unique_ptr&lt;TreeNode&gt; tree = <a class="code hl_class" href="classDbcTreeBuilder.html">DbcTreeBuilder</a>().<a class="code hl_function" href="classDbcTreeBuilder.html#a7e57d067d831b14b383947fd125edd4b">Build</a>(parsed);</div>
<div class="line"><a id="l00783" name="l00783"></a><span class="lineno"> 783</span> CHECK(tree-&gt;GetChild(0)-&gt;GetSignal() == <span class="keyword">nullptr</span>, <span class="stringliteral">&quot;Frame node&quot;</span>);</div>
<div class="line"><a id="l00784" name="l00784"></a><span class="lineno"> 784</span> <span class="keywordflow">for</span> (std::size_t index = 0; index &lt; parsed.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.size(); ++index) {</div>
<div class="line"><a id="l00785" name="l00785"></a><span class="lineno"> 785</span> CHECK(tree-&gt;GetChild(index)-&gt;GetChild(0)-&gt;GetSignal()-&gt;valueDescriptions ==</div>
<div class="line"><a id="l00786" name="l00786"></a><span class="lineno"> 786</span> parsed.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[index].signals[0].valueDescriptions &amp;&amp;</div>
<div class="line"><a id="l00787" name="l00787"></a><span class="lineno"> 787</span> runtime.<a class="code hl_function" href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">GetFrames</a>()[index].signals[0].valueDescriptions ==</div>
<div class="line"><a id="l00788" name="l00788"></a><span class="lineno"> 788</span> parsed.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>[index].signals[0].valueDescriptions,</div>
<div class="line"><a id="l00789" name="l00789"></a><span class="lineno"> 789</span> <span class="stringliteral">&quot;All mappings survive both builders&quot;</span>);</div>
<div class="line"><a id="l00790" name="l00790"></a><span class="lineno"> 790</span> }</div>
<div class="line"><a id="l00791" name="l00791"></a><span class="lineno"> 791</span> CHECK(tree-&gt;GetChild(0)-&gt;GetChild(0)-&gt;GetSignal()-&gt;valueDescriptions ==</div>
<div class="line"><a id="l00792" name="l00792"></a><span class="lineno"> 792</span> runtime.<a class="code hl_function" href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">GetFrames</a>()[0].signals[0].valueDescriptions,</div>
<div class="line"><a id="l00793" name="l00793"></a><span class="lineno"> 793</span> <span class="stringliteral">&quot;Both builders preserve descriptions&quot;</span>);</div>
<div class="line"><a id="l00794" name="l00794"></a><span class="lineno"> 794</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> frame;</div>
<div class="line"><a id="l00795" name="l00795"></a><span class="lineno"> 795</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a> = 256;</div>
<div class="line"><a id="l00796" name="l00796"></a><span class="lineno"> 796</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>.resize(8);</div>
<div class="line"><a id="l00797" name="l00797"></a><span class="lineno"> 797</span> <span class="keyword">const</span> std::string expected[] = {<span class="stringliteral">&quot;Off&quot;</span>, <span class="stringliteral">&quot;On&quot;</span>, <span class="stringliteral">&quot;Error with spaces; and \&quot;quotes\&quot;&quot;</span>, <span class="stringliteral">&quot;&quot;</span>};</div>
<div class="line"><a id="l00798" name="l00798"></a><span class="lineno"> 798</span> <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> value = 0; value &lt; 5; ++value) {</div>
<div class="line"><a id="l00799" name="l00799"></a><span class="lineno"> 799</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>[0] = value;</div>
<div class="line"><a id="l00800" name="l00800"></a><span class="lineno"> 800</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> decoded = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(runtime, frame).signals[0];</div>
<div class="line"><a id="l00801" name="l00801"></a><span class="lineno"> 801</span> CHECK(decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686">valid</a> &amp;&amp; decoded.<a class="code hl_variable" href="structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978">physicalValue</a> == value * 2 + 10, <span class="stringliteral">&quot;Numeric scaling unchanged&quot;</span>);</div>
<div class="line"><a id="l00802" name="l00802"></a><span class="lineno"> 802</span> <span class="keyword">const</span> std::string *description = decoded.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>();</div>
<div class="line"><a id="l00803" name="l00803"></a><span class="lineno"> 803</span> CHECK(value &lt; 4 ? description &amp;&amp; *description == expected[value] : !description,</div>
<div class="line"><a id="l00804" name="l00804"></a><span class="lineno"> 804</span> <span class="stringliteral">&quot;Raw lookup and unknown value&quot;</span>);</div>
<div class="line"><a id="l00805" name="l00805"></a><span class="lineno"> 805</span> }</div>
<div class="line"><a id="l00806" name="l00806"></a><span class="lineno"> 806</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a462193d275adc1dba8bd18ffa0e36bb7">isExtended</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00807" name="l00807"></a><span class="lineno"> 807</span> <span class="keyword">struct </span>Boundary {</div>
<div class="line"><a id="l00808" name="l00808"></a><span class="lineno"> 808</span> std::uint64_t bits;</div>
<div class="line"><a id="l00809" name="l00809"></a><span class="lineno"> 809</span> <span class="keyword">const</span> <span class="keywordtype">char</span> *description;</div>
<div class="line"><a id="l00810" name="l00810"></a><span class="lineno"> 810</span> };</div>
<div class="line"><a id="l00811" name="l00811"></a><span class="lineno"> 811</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> Boundary &amp;test: {Boundary{0x8000000000000000ULL, <span class="stringliteral">&quot;Minimum&quot;</span>},</div>
<div class="line"><a id="l00812" name="l00812"></a><span class="lineno"> 812</span> Boundary{0xFFFFFFFFFFFFFFFFULL, <span class="stringliteral">&quot;Negative&quot;</span>},</div>
<div class="line"><a id="l00813" name="l00813"></a><span class="lineno"> 813</span> Boundary{0x7FFFFFFFFFFFFFFFULL, <span class="stringliteral">&quot;Maximum&quot;</span>}}) {</div>
<div class="line"><a id="l00814" name="l00814"></a><span class="lineno"> 814</span> <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">byte</span> = 0; <span class="keywordtype">byte</span> &lt; 8; ++byte)</div>
<div class="line"><a id="l00815" name="l00815"></a><span class="lineno"> 815</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>[<span class="keywordtype">byte</span>] = <span class="keyword">static_cast&lt;</span>std::uint8_t<span class="keyword">&gt;</span>(test.bits &gt;&gt; (<span class="keywordtype">byte</span> * 8));</div>
<div class="line"><a id="l00816" name="l00816"></a><span class="lineno"> 816</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> decoded = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(runtime, frame).signals[0];</div>
<div class="line"><a id="l00817" name="l00817"></a><span class="lineno"> 817</span> CHECK(decoded.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>() &amp;&amp; *decoded.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>() == test.description,</div>
<div class="line"><a id="l00818" name="l00818"></a><span class="lineno"> 818</span> <span class="stringliteral">&quot;Signed boundaries and distinct extended frame&quot;</span>);</div>
<div class="line"><a id="l00819" name="l00819"></a><span class="lineno"> 819</span> }</div>
<div class="line"><a id="l00820" name="l00820"></a><span class="lineno"> 820</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a> = 2048;</div>
<div class="line"><a id="l00821" name="l00821"></a><span class="lineno"> 821</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> Boundary &amp;test: {Boundary{0x8000000000000000ULL, <span class="stringliteral">&quot;High&quot;</span>},</div>
<div class="line"><a id="l00822" name="l00822"></a><span class="lineno"> 822</span> Boundary{0xFFFFFFFFFFFFFFFFULL, <span class="stringliteral">&quot;Full&quot;</span>}}) {</div>
<div class="line"><a id="l00823" name="l00823"></a><span class="lineno"> 823</span> <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> <span class="keywordtype">byte</span> = 0; <span class="keywordtype">byte</span> &lt; 8; ++byte)</div>
<div class="line"><a id="l00824" name="l00824"></a><span class="lineno"> 824</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>[<span class="keywordtype">byte</span>] = <span class="keyword">static_cast&lt;</span>std::uint8_t<span class="keyword">&gt;</span>(test.bits &gt;&gt; (<span class="keywordtype">byte</span> * 8));</div>
<div class="line"><a id="l00825" name="l00825"></a><span class="lineno"> 825</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedSignalValue.html">DecodedSignalValue</a> decoded = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(runtime, frame).signals[0];</div>
<div class="line"><a id="l00826" name="l00826"></a><span class="lineno"> 826</span> CHECK(decoded.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>() &amp;&amp; *decoded.<a class="code hl_function" href="structDecodedSignalValue.html#affc38af1bf31bcb6f2c33044bce92bd2">GetValueDescription</a>() == test.description,</div>
<div class="line"><a id="l00827" name="l00827"></a><span class="lineno"> 827</span> <span class="stringliteral">&quot;Unsigned boundaries&quot;</span>);</div>
<div class="line"><a id="l00828" name="l00828"></a><span class="lineno"> 828</span> }</div>
<div class="line"><a id="l00829" name="l00829"></a><span class="lineno"> 829</span> CHECK(FindValueDescription(runtime.<a class="code hl_function" href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">GetFrames</a>()[0].signals[0].valueDescriptions, std::int64_t(1)) != <span class="keyword">nullptr</span>,</div>
<div class="line"><a id="l00830" name="l00830"></a><span class="lineno"> 830</span> <span class="stringliteral">&quot;Nonnegative signed lookup matches unsigned key&quot;</span>);</div>
<div class="line"><a id="l00831" name="l00831"></a><span class="lineno"> 831</span> frame.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>.clear();</div>
<div class="line"><a id="l00832" name="l00832"></a><span class="lineno"> 832</span> CHECK(!<a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().Decode(runtime, frame).signals[0].GetValueDescription(), <span class="stringliteral">&quot;Invalid decode has no description&quot;</span>);</div>
<div class="line"><a id="l00833" name="l00833"></a><span class="lineno"> 833</span>}</div>
<div class="line"><a id="l00834" name="l00834"></a><span class="lineno"> 834</span> </div>
<div class="line"><a id="l00835" name="l00835"></a><span class="lineno"> 835</span><span class="keywordtype">void</span> DbcParserTest::invalidValueDescriptions() {</div>
<div class="line"><a id="l00836" name="l00836"></a><span class="lineno"> 836</span> Fixture fixture;</div>
<div class="line"><a id="l00837" name="l00837"></a><span class="lineno"> 837</span> <span class="keyword">const</span> std::string definitions = <span class="stringliteral">&quot;BO_ 1 Frame: 8 ECU\nSG_ State : 0|64@1+ (1,0) [0|2e20] \&quot;\&quot; ECU\n&quot;</span>;</div>
<div class="line"><a id="l00838" name="l00838"></a><span class="lineno"> 838</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string statement: {</div>
<div class="line"><a id="l00839" name="l00839"></a><span class="lineno"> 839</span> <span class="stringliteral">&quot;VAL_&quot;</span>, <span class="stringliteral">&quot;VAL_ 1 State;&quot;</span>, <span class="stringliteral">&quot;VAL_ 1 State ;&quot;</span>, <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Off\&quot;&quot;</span>,</div>
<div class="line"><a id="l00840" name="l00840"></a><span class="lineno"> 840</span> <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Off\&quot;; junk&quot;</span>, <span class="stringliteral">&quot;VAL_ 1 State 0 Off;&quot;</span>,</div>
<div class="line"><a id="l00841" name="l00841"></a><span class="lineno"> 841</span> <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Unclosed;&quot;</span>, <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Off\&quot;1 \&quot;On\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00842" name="l00842"></a><span class="lineno"> 842</span> <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Off\&quot; 00 \&quot;Duplicate\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00843" name="l00843"></a><span class="lineno"> 843</span> <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Off\&quot; -0 \&quot;Duplicate\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00844" name="l00844"></a><span class="lineno"> 844</span> <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Off\&quot;;\nVAL_ 1 State 0 \&quot;Duplicate\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00845" name="l00845"></a><span class="lineno"> 845</span> <span class="stringliteral">&quot;VAL_ 2 State 0 \&quot;Missing frame\&quot;;&quot;</span>, <span class="stringliteral">&quot;VAL_ 1 Missing 0 \&quot;Missing signal\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00846" name="l00846"></a><span class="lineno"> 846</span> <span class="stringliteral">&quot;VAL_ -1 State 0 \&quot;Bad ID\&quot;;&quot;</span>, <span class="stringliteral">&quot;VAL_ 536870912 State 0 \&quot;Bad ID\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00847" name="l00847"></a><span class="lineno"> 847</span> <span class="stringliteral">&quot;VAL_ 4294967296 State 0 \&quot;Bad ID\&quot;;&quot;</span>, <span class="stringliteral">&quot;VAL_ Environment 0 \&quot;Unsupported\&quot;;&quot;</span>,</div>
<div class="line"><a id="l00848" name="l00848"></a><span class="lineno"> 848</span> <span class="stringliteral">&quot;VAL_ 1 State 0 \&quot;Bad\\q escape\&quot;;&quot;</span>}) {</div>
<div class="line"><a id="l00849" name="l00849"></a><span class="lineno"> 849</span> fixture.Write(definitions + statement + <span class="charliteral">&#39;\n&#39;</span>);</div>
<div class="line"><a id="l00850" name="l00850"></a><span class="lineno"> 850</span> <span class="keyword">const</span> <span class="keywordtype">int</span> line = statement.find(<span class="charliteral">&#39;\n&#39;</span>) == std::string::npos ? 3 : 4;</div>
<div class="line"><a id="l00851" name="l00851"></a><span class="lineno"> 851</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00852" name="l00852"></a><span class="lineno"> 852</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00853" name="l00853"></a><span class="lineno"> 853</span> CHECK(<span class="keyword">false</span>, statement);</div>
<div class="line"><a id="l00854" name="l00854"></a><span class="lineno"> 854</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;error) {</div>
<div class="line"><a id="l00855" name="l00855"></a><span class="lineno"> 855</span> CHECK(std::string(error.what()).find(fixture.path.string() + <span class="stringliteral">&quot;:&quot;</span> + std::to_string(line) + <span class="stringliteral">&quot;: &quot;</span>) == 0,</div>
<div class="line"><a id="l00856" name="l00856"></a><span class="lineno"> 856</span> statement + <span class="stringliteral">&quot; &quot;</span> + error.what());</div>
<div class="line"><a id="l00857" name="l00857"></a><span class="lineno"> 857</span> }</div>
<div class="line"><a id="l00858" name="l00858"></a><span class="lineno"> 858</span> }</div>
<div class="line"><a id="l00859" name="l00859"></a><span class="lineno"> 859</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string suffix: {</div>
<div class="line"><a id="l00860" name="l00860"></a><span class="lineno"> 860</span> <span class="stringliteral">&quot;BO_ 1 Other: 8 ECU\n&quot;</span>, <span class="comment">// Duplicate frame definition.</span></div>
<div class="line"><a id="l00861" name="l00861"></a><span class="lineno"> 861</span> <span class="stringliteral">&quot;SG_ State : 0|8@1+ (1,0) [0|255] \&quot;\&quot; ECU\n&quot;</span>,<span class="comment">// Duplicate signal definition.</span></div>
<div class="line"><a id="l00862" name="l00862"></a><span class="lineno"> 862</span> <span class="stringliteral">&quot;&quot;</span>}) {</div>
<div class="line"><a id="l00863" name="l00863"></a><span class="lineno"> 863</span> fixture.Write(<span class="stringliteral">&quot;VAL_ 1 &quot;</span> + std::string(suffix.empty() ? <span class="stringliteral">&quot;Missing&quot;</span> : <span class="stringliteral">&quot;State&quot;</span>) +</div>
<div class="line"><a id="l00864" name="l00864"></a><span class="lineno"> 864</span> <span class="stringliteral">&quot; 0 \&quot;Description\&quot;;\n&quot;</span> + definitions + suffix);</div>
<div class="line"><a id="l00865" name="l00865"></a><span class="lineno"> 865</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00866" name="l00866"></a><span class="lineno"> 866</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00867" name="l00867"></a><span class="lineno"> 867</span> CHECK(<span class="keyword">false</span>, <span class="stringliteral">&quot;Missing reference or duplicate definition&quot;</span>);</div>
<div class="line"><a id="l00868" name="l00868"></a><span class="lineno"> 868</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;error) {</div>
<div class="line"><a id="l00869" name="l00869"></a><span class="lineno"> 869</span> <span class="keyword">const</span> std::string line = suffix.empty() ? <span class="stringliteral">&quot;1&quot;</span> : <span class="stringliteral">&quot;4&quot;</span>;</div>
<div class="line"><a id="l00870" name="l00870"></a><span class="lineno"> 870</span> CHECK(std::string(error.what()).find(fixture.path.string() + <span class="stringliteral">&quot;:&quot;</span> + line + <span class="stringliteral">&quot;: &quot;</span>) == 0,</div>
<div class="line"><a id="l00871" name="l00871"></a><span class="lineno"> 871</span> <span class="stringliteral">&quot;Error retains the reference or duplicate definition source location&quot;</span>);</div>
<div class="line"><a id="l00872" name="l00872"></a><span class="lineno"> 872</span> }</div>
<div class="line"><a id="l00873" name="l00873"></a><span class="lineno"> 873</span> }</div>
<div class="line"><a id="l00874" name="l00874"></a><span class="lineno"> 874</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> std::string number: {<span class="stringliteral">&quot;+1&quot;</span>, <span class="stringliteral">&quot;1x&quot;</span>, <span class="stringliteral">&quot;0x10&quot;</span>, <span class="stringliteral">&quot;1.5&quot;</span>, <span class="stringliteral">&quot;1e2&quot;</span>, <span class="stringliteral">&quot;--1&quot;</span>,</div>
<div class="line"><a id="l00875" name="l00875"></a><span class="lineno"> 875</span> <span class="stringliteral">&quot;-9223372036854775809&quot;</span>, <span class="stringliteral">&quot;18446744073709551616&quot;</span>}) {</div>
<div class="line"><a id="l00876" name="l00876"></a><span class="lineno"> 876</span> fixture.Write(<span class="stringliteral">&quot;VAL_ 1 State &quot;</span> + number + <span class="stringliteral">&quot; \&quot;Bad\&quot;;\n&quot;</span> + definitions);</div>
<div class="line"><a id="l00877" name="l00877"></a><span class="lineno"> 877</span> <span class="keywordflow">try</span> {</div>
<div class="line"><a id="l00878" name="l00878"></a><span class="lineno"> 878</span> <a class="code hl_class" href="classDbcParser.html">DbcParser</a>().<a class="code hl_function" href="classDbcParser.html#aef72826942c9095d653fafa435855e56">ParseFile</a>(fixture.path.string());</div>
<div class="line"><a id="l00879" name="l00879"></a><span class="lineno"> 879</span> CHECK(<span class="keyword">false</span>, number);</div>
<div class="line"><a id="l00880" name="l00880"></a><span class="lineno"> 880</span> } <span class="keywordflow">catch</span> (<span class="keyword">const</span> std::runtime_error &amp;error) {</div>
<div class="line"><a id="l00881" name="l00881"></a><span class="lineno"> 881</span> CHECK(std::string(error.what()).find(fixture.path.string() + <span class="stringliteral">&quot;:1: &quot;</span>) == 0, number);</div>
<div class="line"><a id="l00882" name="l00882"></a><span class="lineno"> 882</span> }</div>
<div class="line"><a id="l00883" name="l00883"></a><span class="lineno"> 883</span> }</div>
<div class="line"><a id="l00884" name="l00884"></a><span class="lineno"> 884</span>}</div>
<div class="line"><a id="l00885" name="l00885"></a><span class="lineno"> 885</span> </div>
<div class="line"><a id="l00886" name="l00886"></a><span class="lineno"> 886</span><span class="keywordtype">int</span> RunParserTests(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv) {</div>
<div class="line"><a id="l00887" name="l00887"></a><span class="lineno"> 887</span> DbcParserTest tests;</div>
<div class="line"><a id="l00888" name="l00888"></a><span class="lineno"> 888</span> <span class="keywordflow">return</span> QTest::qExec(&amp;tests, argc, argv);</div>
<div class="line"><a id="l00889" name="l00889"></a><span class="lineno"> 889</span>}</div>
<div class="line"><a id="l00890" name="l00890"></a><span class="lineno"> 890</span> </div>
<div class="line"><a id="l00891" name="l00891"></a><span class="lineno"> 891</span><span class="preprocessor">#include &quot;dbc_parser_test.moc&quot;</span></div>
<div class="ttc" id="aclassDbcDecodeBuilder_html"><div class="ttname"><a href="classDbcDecodeBuilder.html">DbcDecodeBuilder</a></div><div class="ttdoc">Converts parsed DBC data into runtime decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decode__builder_8h_source.html#l00021">dbc_decode_builder.h:21</a></div></div>
<div class="ttc" id="aclassDbcDecodeBuilder_html_a2bc6386dfb5e58976c42e22c19ec471b"><div class="ttname"><a href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b">DbcDecodeBuilder::Build</a></div><div class="ttdeci">DecodeDatabase Build(const DbcDatabase &amp;source) const</div><div class="ttdoc">Build runtime decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decode__builder_8cpp_source.html#l00015">dbc_decode_builder.cpp:15</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html"><div class="ttname"><a href="classDbcDecoder.html">DbcDecoder</a></div><div class="ttdoc">Runtime CAN decoder using prebuilt decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00084">dbc_decoder.h:84</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_a345951ffe5d943a70d3a1ea1f39e74f7"><div class="ttname"><a href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a></div><div class="ttdeci">DecodedFrameValue Decode(const DecodeDatabase &amp;database, const RawCanFrame &amp;frame) const</div><div class="ttdoc">Decode one raw CAN frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00022">dbc_decoder.cpp:22</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_a345951ffe5d943a70d3a1ea1f39e74f7"><div class="ttname"><a href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a></div><div class="ttdeci">DecodedFrameValue Decode(const DecodeDatabase &amp;database, const RawCanFrame &amp;frame) const</div><div class="ttdoc">Decode one raw CAN frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00023">dbc_decoder.cpp:23</a></div></div>
<div class="ttc" id="aclassDbcParser_html"><div class="ttname"><a href="classDbcParser.html">DbcParser</a></div><div class="ttdoc">Minimal DBC parser.</div><div class="ttdef"><b>Definition</b> <a href="dbc__parser_8h_source.html#l00033">dbc_parser.h:33</a></div></div>
<div class="ttc" id="aclassDbcParser_html_a0e915ce79c2e3d4c95a5aaf2bf0409bc"><div class="ttname"><a href="classDbcParser.html#a0e915ce79c2e3d4c95a5aaf2bf0409bc">DbcParser::ParseFileWithDiagnostics</a></div><div class="ttdeci">DbcParseResult ParseFileWithDiagnostics(const std::string &amp;filePath) const</div><div class="ttdoc">Parse with warnings and a structured first error instead of throwing.</div><div class="ttdef"><b>Definition</b> <a href="dbc__parser_8cpp_source.html#l00044">dbc_parser.cpp:44</a></div></div>
<div class="ttc" id="aclassDbcParser_html_aef72826942c9095d653fafa435855e56"><div class="ttname"><a href="classDbcParser.html#aef72826942c9095d653fafa435855e56">DbcParser::ParseFile</a></div><div class="ttdeci">DbcDatabase ParseFile(const std::string &amp;filePath) const</div><div class="ttdoc">Parse DBC file.</div><div class="ttdef"><b>Definition</b> <a href="dbc__parser_8cpp_source.html#l00031">dbc_parser.cpp:31</a></div></div>
<div class="ttc" id="aclassDbcStatementDispatcher_html"><div class="ttname"><a href="classDbcStatementDispatcher.html">DbcStatementDispatcher</a></div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00091">dbc_statement_handler.h:91</a></div></div>
<div class="ttc" id="aclassDbcStatementDispatcher_html_a495c2d5c7ebb8103b1987cdd87c142ed"><div class="ttname"><a href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">DbcStatementDispatcher::Dispatch</a></div><div class="ttdeci">bool Dispatch(const std::string &amp;line, DbcParseContext &amp;context) const</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00391">dbc_statement_handler.cpp:391</a></div></div>
<div class="ttc" id="aclassDbcStatementDispatcher_html_a495c2d5c7ebb8103b1987cdd87c142ed"><div class="ttname"><a href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">DbcStatementDispatcher::Dispatch</a></div><div class="ttdeci">bool Dispatch(const std::string &amp;line, DbcParseContext &amp;context) const</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00388">dbc_statement_handler.cpp:388</a></div></div>
<div class="ttc" id="aclassDbcStatementHandler_html"><div class="ttname"><a href="classDbcStatementHandler.html">DbcStatementHandler</a></div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00044">dbc_statement_handler.h:44</a></div></div>
<div class="ttc" id="aclassDbcTreeBuilder_html"><div class="ttname"><a href="classDbcTreeBuilder.html">DbcTreeBuilder</a></div><div class="ttdoc">Builds a simple tree from parsed DBC database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__tree__builder_8h_source.html#l00023">dbc_tree_builder.h:23</a></div></div>
<div class="ttc" id="aclassDbcTreeBuilder_html_a7e57d067d831b14b383947fd125edd4b"><div class="ttname"><a href="classDbcTreeBuilder.html#a7e57d067d831b14b383947fd125edd4b">DbcTreeBuilder::Build</a></div><div class="ttdeci">std::unique_ptr&lt; TreeNode &gt; Build(const DbcDatabase &amp;database) const</div><div class="ttdoc">Build tree representation of parsed DBC data.</div><div class="ttdef"><b>Definition</b> <a href="dbc__tree__builder_8cpp_source.html#l00014">dbc_tree_builder.cpp:14</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html"><div class="ttname"><a href="classDecodeDatabase.html">DecodeDatabase</a></div><div class="ttdoc">Immutable runtime snapshot. Copies share storage; reload replaces a snapshot. Owning lookup handles a...</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00087">decode_database.h:87</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html_aa034c1510984a85f60ad6c0bd744d6e8"><div class="ttname"><a href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">DecodeDatabase::GetFrames</a></div><div class="ttdeci">const std::vector&lt; DecodeFrame &gt; &amp; GetFrames() const</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8cpp_source.html#l00028">decode_database.cpp:28</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html_aa034c1510984a85f60ad6c0bd744d6e8"><div class="ttname"><a href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">DecodeDatabase::GetFrames</a></div><div class="ttdeci">const std::vector&lt; DecodeFrame &gt; &amp; GetFrames() const</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8cpp_source.html#l00105">decode_database.cpp:105</a></div></div>
<div class="ttc" id="adbc__decode__builder_8h_html"><div class="ttname"><a href="dbc__decode__builder_8h.html">dbc_decode_builder.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>
<div class="ttc" id="adbc__decoder_8h_html"><div class="ttname"><a href="dbc__decoder_8h.html">dbc_decoder.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>
<div class="ttc" id="adbc__parser_8h_html"><div class="ttname"><a href="dbc__parser_8h.html">dbc_parser.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>
File diff suppressed because it is too large. Load diff
@@ -231,7 +231,7 @@ $(document).ready(function(){initNavTree('dbc__statement__handler_8h_source.html
<div class="ttc" id="aclassDbcHeaderHandler_html"><div class="ttname"><a href="classDbcHeaderHandler.html">DbcHeaderHandler</a></div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00085">dbc_statement_handler.h:85</a></div></div>
<div class="ttc" id="aclassDbcSignalHandler_html"><div class="ttname"><a href="classDbcSignalHandler.html">DbcSignalHandler</a></div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00058">dbc_statement_handler.h:58</a></div></div>
<div class="ttc" id="aclassDbcStatementDispatcher_html"><div class="ttname"><a href="classDbcStatementDispatcher.html">DbcStatementDispatcher</a></div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00091">dbc_statement_handler.h:91</a></div></div>
<div class="ttc" id="aclassDbcStatementDispatcher_html_a495c2d5c7ebb8103b1987cdd87c142ed"><div class="ttname"><a href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">DbcStatementDispatcher::Dispatch</a></div><div class="ttdeci">bool Dispatch(const std::string &amp;line, DbcParseContext &amp;context) const</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00391">dbc_statement_handler.cpp:391</a></div></div>
<div class="ttc" id="aclassDbcStatementDispatcher_html_a495c2d5c7ebb8103b1987cdd87c142ed"><div class="ttname"><a href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">DbcStatementDispatcher::Dispatch</a></div><div class="ttdeci">bool Dispatch(const std::string &amp;line, DbcParseContext &amp;context) const</div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8cpp_source.html#l00388">dbc_statement_handler.cpp:388</a></div></div>
<div class="ttc" id="aclassDbcStatementHandler_html"><div class="ttname"><a href="classDbcStatementHandler.html">DbcStatementHandler</a></div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00044">dbc_statement_handler.h:44</a></div></div>
<div class="ttc" id="aclassDbcUnsupportedMultiplexingHandler_html"><div class="ttname"><a href="classDbcUnsupportedMultiplexingHandler.html">DbcUnsupportedMultiplexingHandler</a></div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00079">dbc_statement_handler.h:79</a></div></div>
<div class="ttc" id="aclassDbcValueDescriptionHandler_html"><div class="ttname"><a href="classDbcValueDescriptionHandler.html">DbcValueDescriptionHandler</a></div><div class="ttdef"><b>Definition</b> <a href="dbc__statement__handler_8h_source.html#l00074">dbc_statement_handler.h:74</a></div></div>
@@ -0,0 +1,506 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: dbc_validation_test.cpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">DBC Framework
</div>
<div id="projectbrief">DBC parsing and CAN signal decoding framework</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function() { init_codefold(0); });
/* @license-end */
</script>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('dbc__validation__test_8cpp_source.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">dbc_validation_test.cpp</div></div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">// SPDX-License-Identifier: MIT</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="preprocessor">#include &quot;<a class="code" href="dbc__decode__builder_8h.html">dbc_decode_builder.h</a>&quot;</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="preprocessor">#include &quot;<a class="code" href="dbc__decoder_8h.html">dbc_decoder.h</a>&quot;</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="preprocessor">#include &lt;QtTest&gt;</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="preprocessor">#include &lt;limits&gt;</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="preprocessor">#include &lt;stdexcept&gt;</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="preprocessor">#include &lt;utility&gt;</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span> </div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="keyword">namespace </span>{</div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> ValidFrame() {</div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> frame;</div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span> frame.<a class="code hl_variable" href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">canId</a> = 0x123U;</div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span> frame.<a class="code hl_variable" href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">dlc</a> = 8U;</div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> signal;</div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = <span class="stringliteral">&quot;Value&quot;</span>;</div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 8U;</div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span> frame.signals.push_back(signal);</div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> <span class="keywordflow">return</span> frame;</div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> }</div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span> </div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> ParsedDefinitions(<span class="keyword">const</span> std::vector&lt;DecodeFrame&gt; &amp;frames) {</div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span> <a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a> database;</div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> &amp;frame: frames) {</div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span> <a class="code hl_struct" href="structFrameInfo.html">FrameInfo</a> target;</div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> target.<a class="code hl_variable" href="structFrameInfo.html#af470b0742c05bfbffc31c51a68f5c05e">canId</a> = frame.<a class="code hl_variable" href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">canId</a>;</div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> target.<a class="code hl_variable" href="structFrameInfo.html#a34b726afaad2ac5c697fdb2ac070cdaf">isExtended</a> = frame.<a class="code hl_variable" href="structDecodeFrame.html#a3ee2348d781f8f15aaf87e8dcf57ec41">isExtended</a>;</div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span> target.<a class="code hl_variable" href="structFrameInfo.html#aa2b198ea0f55e560c123d35e7b3ecab9">dlc</a> = frame.<a class="code hl_variable" href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">dlc</a>;</div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal: frame.signals) {</div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span> <a class="code hl_struct" href="structSignalInfo.html">SignalInfo</a> copy;</div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> copy.<a class="code hl_variable" href="structSignalInfo.html#a379e422a00cad56f896cacf60455b088">name</a> = signal.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a>;</div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> copy.<a class="code hl_variable" href="structSignalInfo.html#ace290724f9801521609aedaa946d61f1">startBit</a> = signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a>;</div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span> copy.<a class="code hl_variable" href="structSignalInfo.html#a1008b5201f71848177217bd52fb84baa">length</a> = signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a>;</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span> copy.<a class="code hl_variable" href="structSignalInfo.html#af363b1563fb4c7cc8973f9a80c06846c">isLittleEndian</a> = signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> == ByteOrder::Intel;</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> copy.<a class="code hl_variable" href="structSignalInfo.html#a52a52b320eef92fbcb4626307f9a498f">isSigned</a> = signal.<a class="code hl_variable" href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">valueType</a> == ValueType::Signed;</div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> copy.<a class="code hl_variable" href="structSignalInfo.html#ae4f78d99a2750aa564d7eba860171499">factor</a> = signal.<a class="code hl_variable" href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">factor</a>;</div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> copy.<a class="code hl_variable" href="structSignalInfo.html#ab7d0769f47aa540656b22e4e49db517e">offset</a> = signal.<a class="code hl_variable" href="structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74">offset</a>;</div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> copy.<a class="code hl_variable" href="structSignalInfo.html#ada7bf94fbeaa26bd08c73982b5af255b">minimum</a> = signal.<a class="code hl_variable" href="structDecodeSignal.html#a0fb84e19a0ab3bd50b6f65c1075ebc25">minimum</a>;</div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> copy.<a class="code hl_variable" href="structSignalInfo.html#adf1c4331b9eabced0d7fdda40ff0eb52">maximum</a> = signal.<a class="code hl_variable" href="structDecodeSignal.html#a4a6ba87142a9badbf0ca830e9e709cb7">maximum</a>;</div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> copy.multiplexing = signal.multiplexing;</div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> target.signals.push_back(copy);</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> }</div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> database.<a class="code hl_variable" href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">frames</a>.push_back(target);</div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> }</div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> <span class="keywordflow">return</span> database;</div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> }</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span>}<span class="comment">// namespace</span></div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> </div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span><span class="keyword">class </span>DbcValidationTest : <span class="keyword">public</span> QObject {</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> Q_OBJECT</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span><span class="keyword">private</span> Q_SLOTS:</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> <span class="keywordtype">void</span> invalidMetadata_data();</div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> <span class="keywordtype">void</span> invalidMetadata();</div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> <span class="keywordtype">void</span> numericParameters_data();</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> <span class="keywordtype">void</span> numericParameters();</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> <span class="keywordtype">void</span> validBoundaries();</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> <span class="keywordtype">void</span> multiplexingBoundaries();</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> <span class="keywordtype">void</span> independentSnapshot();</div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> <span class="keywordtype">void</span> failedReplacement();</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span>};</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> </div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span><span class="keywordtype">void</span> DbcValidationTest::invalidMetadata_data() {</div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> QTest::addColumn&lt;int&gt;(<span class="stringliteral">&quot;kind&quot;</span>);</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> QTest::newRow(<span class="stringliteral">&quot;standard-id&quot;</span>) &lt;&lt; 0;</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> QTest::newRow(<span class="stringliteral">&quot;extended-id&quot;</span>) &lt;&lt; 1;</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> QTest::newRow(<span class="stringliteral">&quot;encoded-id&quot;</span>) &lt;&lt; 2;</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> QTest::newRow(<span class="stringliteral">&quot;duplicate-frame&quot;</span>) &lt;&lt; 3;</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> QTest::newRow(<span class="stringliteral">&quot;duplicate-signal&quot;</span>) &lt;&lt; 4;</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> QTest::newRow(<span class="stringliteral">&quot;zero-length&quot;</span>) &lt;&lt; 5;</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> QTest::newRow(<span class="stringliteral">&quot;65-bits&quot;</span>) &lt;&lt; 6;</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> QTest::newRow(<span class="stringliteral">&quot;length-overflow&quot;</span>) &lt;&lt; 7;</div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> QTest::newRow(<span class="stringliteral">&quot;intel-start-overflow&quot;</span>) &lt;&lt; 8;</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> QTest::newRow(<span class="stringliteral">&quot;motorola-start-overflow&quot;</span>) &lt;&lt; 9;</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> QTest::newRow(<span class="stringliteral">&quot;intel-outside-payload&quot;</span>) &lt;&lt; 10;</div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> QTest::newRow(<span class="stringliteral">&quot;motorola-outside-payload&quot;</span>) &lt;&lt; 11;</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> QTest::newRow(<span class="stringliteral">&quot;zero-payload&quot;</span>) &lt;&lt; 12;</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> QTest::newRow(<span class="stringliteral">&quot;inverted-range&quot;</span>) &lt;&lt; 13;</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> QTest::newRow(<span class="stringliteral">&quot;byte-order&quot;</span>) &lt;&lt; 14;</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> QTest::newRow(<span class="stringliteral">&quot;value-type&quot;</span>) &lt;&lt; 15;</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> QTest::newRow(<span class="stringliteral">&quot;multiplex-role&quot;</span>) &lt;&lt; 16;</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> QTest::newRow(<span class="stringliteral">&quot;missing-selector&quot;</span>) &lt;&lt; 17;</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> QTest::newRow(<span class="stringliteral">&quot;signed-selector&quot;</span>) &lt;&lt; 18;</div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> QTest::newRow(<span class="stringliteral">&quot;two-selectors&quot;</span>) &lt;&lt; 19;</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> QTest::newRow(<span class="stringliteral">&quot;branch-range&quot;</span>) &lt;&lt; 20;</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> QTest::newRow(<span class="stringliteral">&quot;unconditional-overlap&quot;</span>) &lt;&lt; 21;</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> QTest::newRow(<span class="stringliteral">&quot;mixed-order-overlap&quot;</span>) &lt;&lt; 22;</div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> QTest::newRow(<span class="stringliteral">&quot;same-branch-overlap&quot;</span>) &lt;&lt; 23;</div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span> QTest::newRow(<span class="stringliteral">&quot;selector-branch-overlap&quot;</span>) &lt;&lt; 24;</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> QTest::newRow(<span class="stringliteral">&quot;maximum-can-id&quot;</span>) &lt;&lt; 25;</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span>}</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> </div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span><span class="keywordtype">void</span> DbcValidationTest::invalidMetadata() {</div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> QFETCH(<span class="keywordtype">int</span>, kind);</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> std::vector&lt;DecodeFrame&gt; frames = {ValidFrame()};</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> &amp;frame = frames[0];</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal = frame.signals[0];</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> other = signal;</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> other.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = <span class="stringliteral">&quot;Other&quot;</span>;</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> <span class="keywordflow">switch</span> (kind) {</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> <span class="keywordflow">case</span> 0:</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> frame.<a class="code hl_variable" href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">canId</a> = 0x800U;</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> <span class="keywordflow">case</span> 1:</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span> frame.<a class="code hl_variable" href="structDecodeFrame.html#a3ee2348d781f8f15aaf87e8dcf57ec41">isExtended</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> frame.<a class="code hl_variable" href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">canId</a> = 0x20000000U;</div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> <span class="keywordflow">case</span> 2:</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> frame.<a class="code hl_variable" href="structDecodeFrame.html#a3ee2348d781f8f15aaf87e8dcf57ec41">isExtended</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> frame.<a class="code hl_variable" href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">canId</a> = 0x80000123U;</div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> <span class="keywordflow">case</span> 3:</div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> frames.push_back(frame);</div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> <span class="keywordflow">case</span> 4:</div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> frame.signals.push_back(signal);</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> <span class="keywordflow">case</span> 5:</div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 0U;</div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> <span class="keywordflow">case</span> 6:</div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 65U;</div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> <span class="keywordflow">case</span> 7:</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = std::numeric_limits&lt;std::uint32_t&gt;::max();</div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> <span class="keywordflow">case</span> 8:</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = std::numeric_limits&lt;std::uint32_t&gt;::max();</div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> <span class="keywordflow">case</span> 9:</div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> = ByteOrder::Motorola;</div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = std::numeric_limits&lt;std::uint32_t&gt;::max();</div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span> <span class="keywordflow">case</span> 10:</div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = 57U;</div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> <span class="keywordflow">case</span> 11:</div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> = ByteOrder::Motorola;</div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = 56U;</div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span> <span class="keywordflow">case</span> 12:</div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span> frame.<a class="code hl_variable" href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">dlc</a> = 0U;</div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span> <span class="keywordflow">case</span> 13:</div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a0fb84e19a0ab3bd50b6f65c1075ebc25">minimum</a> = 2.0;</div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a4a6ba87142a9badbf0ca830e9e709cb7">maximum</a> = 1.0;</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span> <span class="keywordflow">case</span> 14:</div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> = <span class="keyword">static_cast&lt;</span><a class="code hl_enumeration" href="decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142b">ByteOrder</a><span class="keyword">&gt;</span>(99);</div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span> <span class="keywordflow">case</span> 15:</div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">valueType</a> = <span class="keyword">static_cast&lt;</span><a class="code hl_enumeration" href="decode__database_8h.html#ad9971b6ef33e02ba2c75d19c1d2518a1">ValueType</a><span class="keyword">&gt;</span>(99);</div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> <span class="keywordflow">case</span> 16:</div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> signal.multiplexing.role = <span class="keyword">static_cast&lt;</span>MultiplexRole<span class="keyword">&gt;</span>(99);</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span> <span class="keywordflow">case</span> 17:</div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span> signal.multiplexing.role = MultiplexRole::Branch;</div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span> <span class="keywordflow">case</span> 18:</div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span> signal.multiplexing.role = MultiplexRole::Selector;</div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">valueType</a> = ValueType::Signed;</div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span> <span class="keywordflow">case</span> 19:</div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span> signal.multiplexing.role = MultiplexRole::Selector;</div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span> other.multiplexing.role = MultiplexRole::Selector;</div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span> other.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = 8U;</div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> frame.signals.push_back(other);</div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span> <span class="keywordflow">case</span> 20:</div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span> <span class="keywordflow">case</span> 23:</div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span> <span class="keywordflow">case</span> 24:</div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span> signal.multiplexing.role = MultiplexRole::Selector;</div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span> other.multiplexing.role = MultiplexRole::Branch;</div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span> other.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = kind == 24 ? 0U : 8U;</div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span> other.multiplexing.value = kind == 20 ? 256U : 1U;</div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> frame.signals.push_back(other);</div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span> <span class="keywordflow">if</span> (kind == 23) {</div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span> other.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = <span class="stringliteral">&quot;Third&quot;</span>;</div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span> frame.signals.push_back(other);</div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> }</div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span> <span class="keywordflow">case</span> 21:</div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span> frame.signals.push_back(other);</div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span> <span class="keywordflow">case</span> 22:</div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span> other.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> = ByteOrder::Motorola;</div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span> other.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = 7U;</div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> frame.signals.push_back(other);</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span> <span class="keywordflow">case</span> 25:</div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span> frame.<a class="code hl_variable" href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">canId</a> = std::numeric_limits&lt;std::uint32_t&gt;::max();</div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span> }</div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span> QVERIFY_THROWS_EXCEPTION(std::invalid_argument, (<span class="keywordtype">void</span>) <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>(frames));</div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span> <span class="comment">// Parsed metadata uses bools for byte order and signedness, so invalid enum</span></div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span> <span class="comment">// values exist only in direct runtime definitions.</span></div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span> <span class="keywordflow">if</span> (kind != 14 &amp;&amp; kind != 15)</div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span> QVERIFY_THROWS_EXCEPTION(std::invalid_argument, (<span class="keywordtype">void</span>) <a class="code hl_class" href="classDbcDecodeBuilder.html">DbcDecodeBuilder</a>().Build(ParsedDefinitions(frames)));</div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span>}</div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span> </div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span><span class="keywordtype">void</span> DbcValidationTest::numericParameters_data() {</div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span> QTest::addColumn&lt;int&gt;(<span class="stringliteral">&quot;field&quot;</span>);</div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span> QTest::addColumn&lt;double&gt;(<span class="stringliteral">&quot;value&quot;</span>);</div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span> <span class="keyword">const</span> <span class="keywordtype">double</span> values[] = {std::numeric_limits&lt;double&gt;::quiet_NaN(),</div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> std::numeric_limits&lt;double&gt;::infinity(),</div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span> -std::numeric_limits&lt;double&gt;::infinity()};</div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> field = 0; field &lt; 4; ++field) {</div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span> <span class="keywordflow">for</span> (<span class="keywordtype">int</span> index = 0; index &lt; 3; ++index) {</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span> <span class="keyword">const</span> QByteArray name = QByteArray::number(field) + <span class="stringliteral">&quot;-&quot;</span> + QByteArray::number(index);</div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span> QTest::newRow(name.constData()) &lt;&lt; field &lt;&lt; values[index];</div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span> }</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span> }</div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span>}</div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span> </div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span><span class="keywordtype">void</span> DbcValidationTest::numericParameters() {</div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span> QFETCH(<span class="keywordtype">int</span>, field);</div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> QFETCH(<span class="keywordtype">double</span>, value);</div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> frame = ValidFrame();</div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal = frame.signals[0];</div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> <span class="keywordflow">switch</span> (field) {</div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> <span class="keywordflow">case</span> 0:</div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">factor</a> = value;</div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span> <span class="keywordflow">case</span> 1:</div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74">offset</a> = value;</div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> <span class="keywordflow">case</span> 2:</div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a0fb84e19a0ab3bd50b6f65c1075ebc25">minimum</a> = value;</div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> <span class="keywordflow">case</span> 3:</div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a4a6ba87142a9badbf0ca830e9e709cb7">maximum</a> = value;</div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span> <span class="keywordflow">break</span>;</div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span> }</div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span> QVERIFY_THROWS_EXCEPTION(std::invalid_argument, (<span class="keywordtype">void</span>) <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>({frame}));</div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span> QVERIFY_THROWS_EXCEPTION(std::invalid_argument, (<span class="keywordtype">void</span>) <a class="code hl_class" href="classDbcDecodeBuilder.html">DbcDecodeBuilder</a>().Build(ParsedDefinitions({frame})));</div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span>}</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> </div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span><span class="keywordtype">void</span> DbcValidationTest::validBoundaries() {</div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span> <span class="keywordflow">for</span> (<a class="code hl_enumeration" href="decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142b">ByteOrder</a> order: {ByteOrder::Intel, ByteOrder::Motorola}) {</div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span> <span class="keywordflow">for</span> (std::uint8_t dlc: {std::uint8_t(8U), std::uint8_t(64U), std::uint8_t(255U)}) {</div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> standard = ValidFrame();</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> standard.<a class="code hl_variable" href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">canId</a> = 0x7FFU;</div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span> standard.<a class="code hl_variable" href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">dlc</a> = dlc;</div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal = standard.signals[0];</div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> = order;</div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = (std::uint32_t(dlc) - 8U) * 8U + (order == ByteOrder::Intel ? 0U : 7U);</div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 64U;</div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">factor</a> = -2.0;</div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74">offset</a> = std::numeric_limits&lt;double&gt;::max();</div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno"> 249</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a0fb84e19a0ab3bd50b6f65c1075ebc25">minimum</a> = -std::numeric_limits&lt;double&gt;::max();</div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno"> 250</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a4a6ba87142a9badbf0ca830e9e709cb7">maximum</a> = std::numeric_limits&lt;double&gt;::max();</div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> extended = standard;</div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span> extended.<a class="code hl_variable" href="structDecodeFrame.html#a3ee2348d781f8f15aaf87e8dcf57ec41">isExtended</a> = <span class="keyword">true</span>;</div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> maximum = extended;</div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span> maximum.<a class="code hl_variable" href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">canId</a> = 0x1FFFFFFFU;</div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span> <span class="keyword">const</span> std::vector&lt;DecodeFrame&gt; frames = {standard, extended, maximum};</div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span> <span class="keyword">const</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> direct(frames);</div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span> <span class="keyword">const</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> built = <a class="code hl_class" href="classDbcDecodeBuilder.html">DbcDecodeBuilder</a>().<a class="code hl_function" href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b">Build</a>(ParsedDefinitions(frames));</div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> &amp;frame: frames) {</div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span> QVERIFY(direct.FindFrame(frame.GetKey()));</div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span> QVERIFY(built.FindSignal(<a class="code hl_struct" href="structSignalKey.html">SignalKey</a>(frame.GetKey(), <span class="stringliteral">&quot;Value&quot;</span>)));</div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"> 261</span> }</div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"> 262</span> }</div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span> }</div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"> 264</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> empty;</div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span> empty.<a class="code hl_variable" href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">canId</a> = 0U;</div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span> QVERIFY(<a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>({empty}).FindFrame(empty.GetKey()));</div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"> 267</span> QVERIFY(<a class="code hl_class" href="classDbcDecodeBuilder.html">DbcDecodeBuilder</a>().Build(<a class="code hl_struct" href="structDbcDatabase.html">DbcDatabase</a>()).GetFrames().empty());</div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span>}</div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span> </div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span><span class="keywordtype">void</span> DbcValidationTest::multiplexingBoundaries() {</div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> frame = ValidFrame();</div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span> frame.<a class="code hl_variable" href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">dlc</a> = 9U;</div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"> 273</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;selector = frame.signals[0];</div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span> selector.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 64U;</div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span> selector.multiplexing.role = MultiplexRole::Selector;</div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> first;</div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span> first.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = <span class="stringliteral">&quot;First&quot;</span>;</div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span> first.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = 64U;</div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span> first.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> = 8U;</div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span> first.multiplexing.role = MultiplexRole::Branch;</div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> first.multiplexing.value = std::numeric_limits&lt;std::uint64_t&gt;::max();</div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> second = first;</div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span> second.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = <span class="stringliteral">&quot;Second&quot;</span>;</div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno"> 284</span> second.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> = ByteOrder::Motorola;</div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span> second.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = 71U;</div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"> 286</span> second.multiplexing.value = 0U;</div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span> frame.signals.push_back(first);</div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span> frame.signals.push_back(second);</div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span> <span class="keyword">const</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> direct({frame});</div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno"> 290</span> <span class="keyword">const</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> built = <a class="code hl_class" href="classDbcDecodeBuilder.html">DbcDecodeBuilder</a>().<a class="code hl_function" href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b">Build</a>(ParsedDefinitions({frame}));</div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno"> 291</span> <a class="code hl_struct" href="structRawCanFrame.html">RawCanFrame</a> raw;</div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"> 292</span> raw.<a class="code hl_variable" href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">canId</a> = frame.<a class="code hl_variable" href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">canId</a>;</div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"> 293</span> raw.<a class="code hl_variable" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">data</a>.assign(9U, 255U);</div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> &amp;database: {direct, built}) {</div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno"> 295</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodedFrameValue.html">DecodedFrameValue</a> result = <a class="code hl_class" href="classDbcDecoder.html">DbcDecoder</a>().<a class="code hl_function" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">Decode</a>(database, raw);</div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno"> 296</span> QCOMPARE(result.signals[1].<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, SignalDecodeStatus::Valid);</div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno"> 297</span> QCOMPARE(result.signals[2].<a class="code hl_variable" href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">status</a>, SignalDecodeStatus::Inactive);</div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno"> 298</span> }</div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno"> 299</span>}</div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno"> 300</span> </div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno"> 301</span><span class="keywordtype">void</span> DbcValidationTest::independentSnapshot() {</div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno"> 302</span> std::vector&lt;DecodeFrame&gt; frames = {ValidFrame()};</div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno"> 303</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> &amp;alias = frames[0];</div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"> 304</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signalAlias = alias.signals[0];</div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span> signalAlias.<a class="code hl_variable" href="structDecodeSignal.html#a822155d9bf4ed5f3300c9e9befe606ff">valueDescriptions</a>.emplace(std::uint64_t(1U), <span class="stringliteral">&quot;One&quot;</span>);</div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span> std::string &amp;descriptionAlias = signalAlias.<a class="code hl_variable" href="structDecodeSignal.html#a822155d9bf4ed5f3300c9e9befe606ff">valueDescriptions</a>.begin()-&gt;second;</div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno"> 307</span> <span class="keyword">const</span> <a class="code hl_struct" href="structFrameKey.html">FrameKey</a> key = alias.GetKey();</div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"> 308</span> <span class="keyword">const</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> database(std::move(frames));</div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span> alias.<a class="code hl_variable" href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">canId</a> = 456U;</div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno"> 310</span> signalAlias.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> = <span class="stringliteral">&quot;Changed&quot;</span>;</div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno"> 311</span> signalAlias.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a> = std::numeric_limits&lt;std::uint32_t&gt;::max();</div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span> descriptionAlias = <span class="stringliteral">&quot;Changed&quot;</span>;</div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"> 313</span> <span class="keyword">const</span> std::shared_ptr&lt;const DecodeFrame&gt; saved = database.FindFrame(key);</div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span> QVERIFY(saved);</div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"> 315</span> QCOMPARE(saved-&gt;canId, key.canId);</div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span> QVERIFY(!database.FindFrame(<a class="code hl_struct" href="structFrameKey.html">FrameKey</a>(456U, <span class="keyword">false</span>)));</div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"> 317</span> <span class="keyword">const</span> std::shared_ptr&lt;const DecodeSignal&gt; signal = database.FindSignal(<a class="code hl_struct" href="structSignalKey.html">SignalKey</a>(key, <span class="stringliteral">&quot;Value&quot;</span>));</div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span> QVERIFY(signal);</div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"> 319</span> QCOMPARE(signal-&gt;startBit, 0U);</div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span> QCOMPARE(signal-&gt;valueDescriptions.begin()-&gt;second, std::string(<span class="stringliteral">&quot;One&quot;</span>));</div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span>}</div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"> 322</span> </div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno"> 323</span><span class="keywordtype">void</span> DbcValidationTest::failedReplacement() {</div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> valid = ValidFrame();</div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"> 325</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> database({valid});</div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno"> 326</span> <span class="keyword">const</span> std::shared_ptr&lt;const DecodeFrame&gt; original = database.FindFrame(valid.GetKey());</div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno"> 327</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> invalid = valid;</div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"> 328</span> invalid.<a class="code hl_variable" href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">canId</a> = 0x800U;</div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span> QVERIFY_THROWS_EXCEPTION(std::invalid_argument, database = <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>({invalid}));</div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"> 330</span> QCOMPARE(database.FindFrame(valid.GetKey()).get(), original.get());</div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno"> 331</span> invalid = valid;</div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno"> 332</span> invalid.signals[0].factor = std::numeric_limits&lt;double&gt;::infinity();</div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno"> 333</span> QVERIFY_THROWS_EXCEPTION(std::invalid_argument,</div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"> 334</span> database = <a class="code hl_class" href="classDbcDecodeBuilder.html">DbcDecodeBuilder</a>().Build(ParsedDefinitions({invalid})));</div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"> 335</span> QCOMPARE(database.FindFrame(valid.GetKey()).get(), original.get());</div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno"> 336</span> QCOMPARE(database.GetFrames().size(), std::size_t(1U));</div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno"> 337</span> database = <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>();</div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno"> 338</span> QVERIFY(database.GetFrames().empty());</div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno"> 339</span> QVERIFY(!database.FindFrame(valid.GetKey()));</div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno"> 340</span> QVERIFY(original);</div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno"> 341</span>}</div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"> 342</span> </div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"> 343</span><span class="keywordtype">int</span> RunValidationTests(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv) {</div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"> 344</span> DbcValidationTest tests;</div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"> 345</span> <span class="keywordflow">return</span> QTest::qExec(&amp;tests, argc, argv);</div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span>}</div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno"> 347</span> </div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span><span class="preprocessor">#include &quot;dbc_validation_test.moc&quot;</span></div>
<div class="ttc" id="aclassDbcDecodeBuilder_html"><div class="ttname"><a href="classDbcDecodeBuilder.html">DbcDecodeBuilder</a></div><div class="ttdoc">Converts parsed DBC data into runtime decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decode__builder_8h_source.html#l00021">dbc_decode_builder.h:21</a></div></div>
<div class="ttc" id="aclassDbcDecodeBuilder_html_a2bc6386dfb5e58976c42e22c19ec471b"><div class="ttname"><a href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b">DbcDecodeBuilder::Build</a></div><div class="ttdeci">DecodeDatabase Build(const DbcDatabase &amp;source) const</div><div class="ttdoc">Build runtime decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decode__builder_8cpp_source.html#l00015">dbc_decode_builder.cpp:15</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html"><div class="ttname"><a href="classDbcDecoder.html">DbcDecoder</a></div><div class="ttdoc">Runtime CAN decoder using prebuilt decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00084">dbc_decoder.h:84</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_a345951ffe5d943a70d3a1ea1f39e74f7"><div class="ttname"><a href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a></div><div class="ttdeci">DecodedFrameValue Decode(const DecodeDatabase &amp;database, const RawCanFrame &amp;frame) const</div><div class="ttdoc">Decode one raw CAN frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00023">dbc_decoder.cpp:23</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html"><div class="ttname"><a href="classDecodeDatabase.html">DecodeDatabase</a></div><div class="ttdoc">Immutable runtime snapshot. Copies share storage; reload replaces a snapshot. Owning lookup handles a...</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00087">decode_database.h:87</a></div></div>
<div class="ttc" id="adbc__decode__builder_8h_html"><div class="ttname"><a href="dbc__decode__builder_8h.html">dbc_decode_builder.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>
<div class="ttc" id="adbc__decoder_8h_html"><div class="ttname"><a href="dbc__decoder_8h.html">dbc_decoder.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>
<div class="ttc" id="adecode__database_8h_html_aaeb92d42f5a6e27b8ba19f18d69d142b"><div class="ttname"><a href="decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142b">ByteOrder</a></div><div class="ttdeci">ByteOrder</div><div class="ttdoc">Signal byte order used for runtime decoding.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00027">decode_database.h:27</a></div></div>
<div class="ttc" id="adecode__database_8h_html_ad9971b6ef33e02ba2c75d19c1d2518a1"><div class="ttname"><a href="decode__database_8h.html#ad9971b6ef33e02ba2c75d19c1d2518a1">ValueType</a></div><div class="ttdeci">ValueType</div><div class="ttdoc">Signal numeric type.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00035">decode_database.h:35</a></div></div>
<div class="ttc" id="astructDbcDatabase_html"><div class="ttname"><a href="structDbcDatabase.html">DbcDatabase</a></div><div class="ttdoc">Parsed DBC content stored in a simple internal form.</div><div class="ttdef"><b>Definition</b> <a href="dbc__database_8h_source.html#l00022">dbc_database.h:22</a></div></div>
<div class="ttc" id="astructDbcDatabase_html_a2cade5d0234ee816132127542f8c612b"><div class="ttname"><a href="structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b">DbcDatabase::frames</a></div><div class="ttdeci">std::vector&lt; FrameInfo &gt; frames</div><div class="ttdef"><b>Definition</b> <a href="dbc__database_8h_source.html#l00023">dbc_database.h:23</a></div></div>
<div class="ttc" id="astructDecodeFrame_html"><div class="ttname"><a href="structDecodeFrame.html">DecodeFrame</a></div><div class="ttdoc">Runtime-ready frame definition.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00065">decode_database.h:65</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_a3ee2348d781f8f15aaf87e8dcf57ec41"><div class="ttname"><a href="structDecodeFrame.html#a3ee2348d781f8f15aaf87e8dcf57ec41">DecodeFrame::isExtended</a></div><div class="ttdeci">bool isExtended</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00068">decode_database.h:68</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_a51111ac13988be372d5673d12cf3e060"><div class="ttname"><a href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">DecodeFrame::dlc</a></div><div class="ttdeci">std::uint8_t dlc</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00069">decode_database.h:69</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_a52e10215388db7df8b541b9d9909edcf"><div class="ttname"><a href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">DecodeFrame::canId</a></div><div class="ttdeci">std::uint32_t canId</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00067">decode_database.h:67</a></div></div>
<div class="ttc" id="astructDecodeSignal_html"><div class="ttname"><a href="structDecodeSignal.html">DecodeSignal</a></div><div class="ttdoc">Runtime-ready signal definition.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00043">decode_database.h:43</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a0fb84e19a0ab3bd50b6f65c1075ebc25"><div class="ttname"><a href="structDecodeSignal.html#a0fb84e19a0ab3bd50b6f65c1075ebc25">DecodeSignal::minimum</a></div><div class="ttdeci">double minimum</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00052">decode_database.h:52</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a428c39913a366a8476dd291061354391"><div class="ttname"><a href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">DecodeSignal::factor</a></div><div class="ttdeci">double factor</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00050">decode_database.h:50</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a4a6ba87142a9badbf0ca830e9e709cb7"><div class="ttname"><a href="structDecodeSignal.html#a4a6ba87142a9badbf0ca830e9e709cb7">DecodeSignal::maximum</a></div><div class="ttdeci">double maximum</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00053">decode_database.h:53</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a58cf5844f2272a23dcb9687d912e4780"><div class="ttname"><a href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">DecodeSignal::name</a></div><div class="ttdeci">std::string name</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00045">decode_database.h:45</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a822155d9bf4ed5f3300c9e9befe606ff"><div class="ttname"><a href="structDecodeSignal.html#a822155d9bf4ed5f3300c9e9befe606ff">DecodeSignal::valueDescriptions</a></div><div class="ttdeci">ValueDescriptions valueDescriptions</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00056">decode_database.h:56</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a92db637af4e224a0ae70173050dc3f74"><div class="ttname"><a href="structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74">DecodeSignal::offset</a></div><div class="ttdeci">double offset</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00051">decode_database.h:51</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a9d37638129263b8902ba5be59baf39a8"><div class="ttname"><a href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">DecodeSignal::valueType</a></div><div class="ttdeci">ValueType valueType</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00049">decode_database.h:49</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_aaf5d7527ddf65b6355c2b4f3626df22d"><div class="ttname"><a href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">DecodeSignal::startBit</a></div><div class="ttdeci">std::uint32_t startBit</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00046">decode_database.h:46</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_abdc4c4bb4a67a6d61d6ca81e8a52833d"><div class="ttname"><a href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">DecodeSignal::byteOrder</a></div><div class="ttdeci">ByteOrder byteOrder</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00048">decode_database.h:48</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_acd4ef5ee30421d117b5756854302debb"><div class="ttname"><a href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">DecodeSignal::length</a></div><div class="ttdeci">std::uint32_t length</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00047">decode_database.h:47</a></div></div>
<div class="ttc" id="astructDecodedFrameValue_html"><div class="ttname"><a href="structDecodedFrameValue.html">DecodedFrameValue</a></div><div class="ttdoc">Fully decoded frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00071">dbc_decoder.h:71</a></div></div>
<div class="ttc" id="astructDecodedFrameValue_html_a645f433798d48a2787e7f00dfbb7dff9"><div class="ttname"><a href="structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9">DecodedFrameValue::status</a></div><div class="ttdeci">FrameDecodeStatus status</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00076">dbc_decoder.h:76</a></div></div>
<div class="ttc" id="astructFrameInfo_html"><div class="ttname"><a href="structFrameInfo.html">FrameInfo</a></div><div class="ttdoc">Describes one CAN frame from a DBC file.</div><div class="ttdef"><b>Definition</b> <a href="frame__info_8h_source.html#l00024">frame_info.h:24</a></div></div>
<div class="ttc" id="astructFrameInfo_html_a34b726afaad2ac5c697fdb2ac070cdaf"><div class="ttname"><a href="structFrameInfo.html#a34b726afaad2ac5c697fdb2ac070cdaf">FrameInfo::isExtended</a></div><div class="ttdeci">bool isExtended</div><div class="ttdef"><b>Definition</b> <a href="frame__info_8h_source.html#l00027">frame_info.h:27</a></div></div>
<div class="ttc" id="astructFrameInfo_html_aa2b198ea0f55e560c123d35e7b3ecab9"><div class="ttname"><a href="structFrameInfo.html#aa2b198ea0f55e560c123d35e7b3ecab9">FrameInfo::dlc</a></div><div class="ttdeci">std::uint8_t dlc</div><div class="ttdef"><b>Definition</b> <a href="frame__info_8h_source.html#l00030">frame_info.h:30</a></div></div>
<div class="ttc" id="astructFrameInfo_html_af470b0742c05bfbffc31c51a68f5c05e"><div class="ttname"><a href="structFrameInfo.html#af470b0742c05bfbffc31c51a68f5c05e">FrameInfo::canId</a></div><div class="ttdeci">std::uint32_t canId</div><div class="ttdef"><b>Definition</b> <a href="frame__info_8h_source.html#l00026">frame_info.h:26</a></div></div>
<div class="ttc" id="astructFrameKey_html"><div class="ttname"><a href="structFrameKey.html">FrameKey</a></div><div class="ttdoc">Stable frame identifier: normalized CAN ID and frame type.</div><div class="ttdef"><b>Definition</b> <a href="definition__key_8h_source.html#l00015">definition_key.h:15</a></div></div>
<div class="ttc" id="astructRawCanFrame_html"><div class="ttname"><a href="structRawCanFrame.html">RawCanFrame</a></div><div class="ttdoc">Raw CAN frame used for runtime or trace decoding.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00024">dbc_decoder.h:24</a></div></div>
<div class="ttc" id="astructRawCanFrame_html_a0acb487612104c99c9907344c035df83"><div class="ttname"><a href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">RawCanFrame::data</a></div><div class="ttdeci">std::vector&lt; std::uint8_t &gt; data</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00027">dbc_decoder.h:27</a></div></div>
<div class="ttc" id="astructRawCanFrame_html_a2d0e7fa0e3d5c20bbed55ed8f7888ff4"><div class="ttname"><a href="structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4">RawCanFrame::canId</a></div><div class="ttdeci">std::uint32_t canId</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00025">dbc_decoder.h:25</a></div></div>
<div class="ttc" id="astructSignalInfo_html"><div class="ttname"><a href="structSignalInfo.html">SignalInfo</a></div><div class="ttdoc">Describes one signal inside a DBC frame.</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00024">signal_info.h:24</a></div></div>
<div class="ttc" id="astructSignalInfo_html_a1008b5201f71848177217bd52fb84baa"><div class="ttname"><a href="structSignalInfo.html#a1008b5201f71848177217bd52fb84baa">SignalInfo::length</a></div><div class="ttdeci">std::uint32_t length</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00028">signal_info.h:28</a></div></div>
<div class="ttc" id="astructSignalInfo_html_a379e422a00cad56f896cacf60455b088"><div class="ttname"><a href="structSignalInfo.html#a379e422a00cad56f896cacf60455b088">SignalInfo::name</a></div><div class="ttdeci">std::string name</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00026">signal_info.h:26</a></div></div>
<div class="ttc" id="astructSignalInfo_html_a52a52b320eef92fbcb4626307f9a498f"><div class="ttname"><a href="structSignalInfo.html#a52a52b320eef92fbcb4626307f9a498f">SignalInfo::isSigned</a></div><div class="ttdeci">bool isSigned</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00030">signal_info.h:30</a></div></div>
<div class="ttc" id="astructSignalInfo_html_ab7d0769f47aa540656b22e4e49db517e"><div class="ttname"><a href="structSignalInfo.html#ab7d0769f47aa540656b22e4e49db517e">SignalInfo::offset</a></div><div class="ttdeci">double offset</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00032">signal_info.h:32</a></div></div>
<div class="ttc" id="astructSignalInfo_html_ace290724f9801521609aedaa946d61f1"><div class="ttname"><a href="structSignalInfo.html#ace290724f9801521609aedaa946d61f1">SignalInfo::startBit</a></div><div class="ttdeci">std::uint32_t startBit</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00027">signal_info.h:27</a></div></div>
<div class="ttc" id="astructSignalInfo_html_ada7bf94fbeaa26bd08c73982b5af255b"><div class="ttname"><a href="structSignalInfo.html#ada7bf94fbeaa26bd08c73982b5af255b">SignalInfo::minimum</a></div><div class="ttdeci">double minimum</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00033">signal_info.h:33</a></div></div>
<div class="ttc" id="astructSignalInfo_html_adf1c4331b9eabced0d7fdda40ff0eb52"><div class="ttname"><a href="structSignalInfo.html#adf1c4331b9eabced0d7fdda40ff0eb52">SignalInfo::maximum</a></div><div class="ttdeci">double maximum</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00034">signal_info.h:34</a></div></div>
<div class="ttc" id="astructSignalInfo_html_ae4f78d99a2750aa564d7eba860171499"><div class="ttname"><a href="structSignalInfo.html#ae4f78d99a2750aa564d7eba860171499">SignalInfo::factor</a></div><div class="ttdeci">double factor</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00031">signal_info.h:31</a></div></div>
<div class="ttc" id="astructSignalInfo_html_af363b1563fb4c7cc8973f9a80c06846c"><div class="ttname"><a href="structSignalInfo.html#af363b1563fb4c7cc8973f9a80c06846c">SignalInfo::isLittleEndian</a></div><div class="ttdeci">bool isLittleEndian</div><div class="ttdef"><b>Definition</b> <a href="signal__info_8h_source.html#l00029">signal_info.h:29</a></div></div>
<div class="ttc" id="astructSignalKey_html"><div class="ttname"><a href="structSignalKey.html">SignalKey</a></div><div class="ttdef"><b>Definition</b> <a href="definition__key_8h_source.html#l00042">definition_key.h:42</a></div></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_59425e443f801f1f2fd8bbe4959a3ccf.html">tests</a></li><li class="navelem"><b>dbc_validation_test.cpp</b></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
</html>
+142 -53
View File
@@ -102,65 +102,154 @@ $(document).ready(function(){initNavTree('decode__database_8cpp_source.html','')
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment">// Copyright (c) 2026 Dim Himro</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span> </div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="preprocessor">#include &quot;<a class="code" href="decode__database_8h.html">decode_database.h</a>&quot;</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="preprocessor">#include &lt;stdexcept&gt;</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="preprocessor">#include &lt;unordered_set&gt;</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="preprocessor">#include &lt;utility&gt;</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span> </div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span>DecodeDatabase::Storage::Storage(std::vector&lt;DecodeFrame&gt; definitions)</div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span> : frames(std::move(definitions)) {</div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span> frameIndexByKey.reserve(frames.size());</div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span> <span class="keywordflow">for</span> (std::size_t index = 0U; index &lt; frames.size(); ++index) {</div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> &amp;frame = frames[index];</div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span> <span class="keywordflow">if</span> (!frameIndexByKey.emplace(frame.GetKey(), index).second)</div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> <span class="keywordflow">throw</span> std::invalid_argument(<span class="stringliteral">&quot;Duplicate runtime frame key&quot;</span>);</div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> std::unordered_set&lt;std::string&gt; names;</div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal: frame.signals) {</div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> <span class="keywordflow">if</span> (!names.insert(signal.name).second)</div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> <span class="keywordflow">throw</span> std::invalid_argument(<span class="stringliteral">&quot;Duplicate runtime signal key&quot;</span>);</div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span> }</div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span> }</div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span>}</div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span> </div>
<div class="foldopen" id="foldopen00024" data-start="{" data-end="}">
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"><a class="line" href="classDecodeDatabase.html#aa935a3a0d334f932d6a8c89a3818286a"> 24</a></span>DecodeDatabase::DecodeDatabase(std::vector&lt;DecodeFrame&gt; frames)</div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> : storage(std::make_shared&lt;const Storage&gt;(std::move(frames))) {</div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span>}</div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="preprocessor">#include &quot;signal_layout.h&quot;</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="preprocessor">#include &lt;bitset&gt;</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="preprocessor">#include &lt;cmath&gt;</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="preprocessor">#include &lt;limits&gt;</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="preprocessor">#include &lt;stdexcept&gt;</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="preprocessor">#include &lt;unordered_set&gt;</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span> </div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="keyword">namespace </span>{</div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span> <span class="keyword">constexpr</span> std::size_t MaximumPayloadBits = std::numeric_limits&lt;std::uint8_t&gt;::max() * 8U;</div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span> <span class="keyword">using </span>SignalBits = std::bitset&lt;MaximumPayloadBits&gt;;</div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> </div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> <span class="keywordtype">void</span> ValidateSignal(<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal, std::uint8_t dlc) {</div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span> <span class="keywordflow">if</span> (signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> != ByteOrder::Intel &amp;&amp; signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> != ByteOrder::Motorola)</div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> <span class="keywordflow">throw</span> std::invalid_argument(<span class="stringliteral">&quot;Invalid signal byte order: &quot;</span> + signal.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a>);</div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> <span class="keywordflow">if</span> (signal.<a class="code hl_variable" href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">valueType</a> != ValueType::Unsigned &amp;&amp; signal.<a class="code hl_variable" href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">valueType</a> != ValueType::Signed)</div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span> <span class="keywordflow">throw</span> std::invalid_argument(<span class="stringliteral">&quot;Invalid signal value type: &quot;</span> + signal.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a>);</div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span> <span class="keywordflow">if</span> (signal.multiplexing.role != MultiplexRole::Unconditional &amp;&amp;</div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span> signal.multiplexing.role != MultiplexRole::Selector &amp;&amp;</div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span> signal.multiplexing.role != MultiplexRole::Branch)</div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span> <span class="keywordflow">throw</span> std::invalid_argument(<span class="stringliteral">&quot;Invalid multiplexing role: &quot;</span> + signal.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a>);</div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span> <span class="keywordflow">if</span> (!IsValidSignalLayout(signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a>, signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a>,</div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> == ByteOrder::Intel, dlc))</div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span> <span class="keywordflow">throw</span> std::invalid_argument(<span class="stringliteral">&quot;Invalid signal length or payload position: &quot;</span> + signal.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a>);</div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span> <span class="keywordflow">if</span> (!std::isfinite(signal.<a class="code hl_variable" href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">factor</a>) || !std::isfinite(signal.<a class="code hl_variable" href="structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74">offset</a>) ||</div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span> !std::isfinite(signal.<a class="code hl_variable" href="structDecodeSignal.html#a0fb84e19a0ab3bd50b6f65c1075ebc25">minimum</a>) || !std::isfinite(signal.<a class="code hl_variable" href="structDecodeSignal.html#a4a6ba87142a9badbf0ca830e9e709cb7">maximum</a>) ||</div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> signal.<a class="code hl_variable" href="structDecodeSignal.html#a0fb84e19a0ab3bd50b6f65c1075ebc25">minimum</a> &gt; signal.<a class="code hl_variable" href="structDecodeSignal.html#a4a6ba87142a9badbf0ca830e9e709cb7">maximum</a>)</div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span> <span class="keywordflow">throw</span> std::invalid_argument(<span class="stringliteral">&quot;Invalid signal numeric parameters: &quot;</span> + signal.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a>);</div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span> }</div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span> </div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> SignalBits GetSignalBits(<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal) {</div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> SignalBits bits;</div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> littleEndian = signal.<a class="code hl_variable" href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">byteOrder</a> == ByteOrder::Intel;</div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> <span class="keyword">const</span> std::uint64_t start = SignalStartCoordinate(signal.<a class="code hl_variable" href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">startBit</a>, littleEndian);</div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> <span class="keywordflow">for</span> (std::uint32_t index = 0U; index &lt; signal.<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a>; ++index) {</div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> <span class="keyword">const</span> std::uint64_t coordinate = start + index;</div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> <span class="keyword">const</span> std::uint64_t bit = littleEndian ? coordinate</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span> : coordinate / 8U * 8U + 7U - coordinate % 8U;</div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> bits.set(<span class="keyword">static_cast&lt;</span>std::size_t<span class="keyword">&gt;</span>(bit));</div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span> }</div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> <span class="keywordflow">return</span> bits;</div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> }</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> </div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> <span class="keywordtype">bool</span> AreMutuallyExclusive(<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;first, <span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;second) {</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> <span class="keywordflow">return</span> first.multiplexing.role == MultiplexRole::Branch &amp;&amp;</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> second.multiplexing.role == MultiplexRole::Branch &amp;&amp;</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> first.multiplexing.value != second.multiplexing.value;</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> }</div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span> </div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span> <span class="keywordtype">void</span> ValidateFrame(<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> &amp;frame) {</div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span> <span class="keyword">const</span> std::uint32_t maximumId = frame.<a class="code hl_variable" href="structDecodeFrame.html#a3ee2348d781f8f15aaf87e8dcf57ec41">isExtended</a> ? 0x1FFFFFFFU : 0x7FFU;</div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span> <span class="keywordflow">if</span> (frame.<a class="code hl_variable" href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">canId</a> &gt; maximumId)</div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span> <span class="keywordflow">throw</span> std::invalid_argument(<span class="stringliteral">&quot;Invalid normalized CAN ID: &quot;</span> + std::to_string(frame.<a class="code hl_variable" href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">canId</a>));</div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span> </div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span> std::unordered_set&lt;std::string&gt; names;</div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> *selector = <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal: frame.signals) {</div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span> <span class="keywordflow">if</span> (!names.insert(signal.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a>).second)</div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span> <span class="keywordflow">throw</span> std::invalid_argument(<span class="stringliteral">&quot;Duplicate runtime signal key: &quot;</span> + signal.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a>);</div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span> ValidateSignal(signal, frame.<a class="code hl_variable" href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">dlc</a>);</div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span> <span class="keywordflow">if</span> (signal.multiplexing.role == MultiplexRole::Selector) {</div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span> <span class="keywordflow">if</span> (selector != <span class="keyword">nullptr</span> || signal.<a class="code hl_variable" href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">valueType</a> != ValueType::Unsigned)</div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span> <span class="keywordflow">throw</span> std::invalid_argument(<span class="stringliteral">&quot;Multiplexing requires one unsigned selector per frame&quot;</span>);</div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span> selector = &amp;signal;</div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span> }</div>
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"> 69</span> }</div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span> </div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span> std::vector&lt;SignalBits&gt; layouts;</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span> layouts.reserve(frame.signals.size());</div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span> <span class="keywordflow">for</span> (std::size_t index = 0U; index &lt; frame.signals.size(); ++index) {</div>
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"> 74</span> <span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal = frame.signals[index];</div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> <span class="keywordflow">if</span> (signal.multiplexing.role == MultiplexRole::Branch &amp;&amp;</div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span> (selector == <span class="keyword">nullptr</span> ||</div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span> (selector-&gt;<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a> &lt; 64U &amp;&amp; signal.multiplexing.value &gt;= (std::uint64_t(1U) &lt;&lt; selector-&gt;<a class="code hl_variable" href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">length</a>))))</div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span> <span class="keywordflow">throw</span> std::invalid_argument(<span class="stringliteral">&quot;Missing selector or branch value outside selector range: &quot;</span> + signal.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a>);</div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"> 79</span> <span class="keyword">const</span> SignalBits bits = GetSignalBits(signal);</div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span> <span class="keywordflow">for</span> (std::size_t previous = 0U; previous &lt; index; ++previous) {</div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span> <span class="keywordflow">if</span> (!AreMutuallyExclusive(signal, frame.signals[previous]) &amp;&amp; (bits &amp; layouts[previous]).any())</div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span> <span class="keywordflow">throw</span> std::invalid_argument(<span class="stringliteral">&quot;Overlapping signals: &quot;</span> + signal.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a>);</div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span> }</div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"> 84</span> layouts.push_back(bits);</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span> }</div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span> }</div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"> 87</span>}<span class="comment">// namespace</span></div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span> </div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span>DecodeDatabase::Storage::Storage(<span class="keyword">const</span> std::vector&lt;DecodeFrame&gt; &amp;definitions)</div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span> : frames(definitions) {</div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span> <span class="comment">// Validate the complete snapshot before creating its lookup index.</span></div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeFrame.html">DecodeFrame</a> &amp;frame: frames)</div>
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"> 93</span> ValidateFrame(frame);</div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> frameIndexByKey.reserve(frames.size());</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> <span class="keywordflow">for</span> (std::size_t index = 0U; index &lt; frames.size(); ++index) {</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> <span class="keywordflow">if</span> (!frameIndexByKey.emplace(frames[index].GetKey(), index).second)</div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span> <span class="keywordflow">throw</span> std::invalid_argument(<span class="stringliteral">&quot;Duplicate runtime frame key&quot;</span>);</div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> }</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span>}</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> </div>
<div class="foldopen" id="foldopen00101" data-start="{" data-end="}">
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"><a class="line" href="classDecodeDatabase.html#a51a44cf7c3f23c98ec8781afe0097c0c"> 101</a></span>DecodeDatabase::DecodeDatabase(<span class="keyword">const</span> std::vector&lt;DecodeFrame&gt; &amp;frames)</div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> : storage(std::make_shared&lt;const Storage&gt;(frames)) {</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span>}</div>
</div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span> </div>
<div class="foldopen" id="foldopen00028" data-start="{" data-end="}">
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"><a class="line" href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8"> 28</a></span><span class="keyword">const</span> std::vector&lt;DecodeFrame&gt; &amp;<a class="code hl_function" href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">DecodeDatabase::GetFrames</a>()<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span> <span class="keyword">static</span> <span class="keyword">const</span> std::vector&lt;DecodeFrame&gt; empty;</div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span> <span class="keywordflow">return</span> storage ? storage-&gt;frames : empty;</div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span>}</div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span> </div>
<div class="foldopen" id="foldopen00105" data-start="{" data-end="}">
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"><a class="line" href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8"> 105</a></span><span class="keyword">const</span> std::vector&lt;DecodeFrame&gt; &amp;<a class="code hl_function" href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">DecodeDatabase::GetFrames</a>()<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> <span class="keyword">static</span> <span class="keyword">const</span> std::vector&lt;DecodeFrame&gt; empty;</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> <span class="keywordflow">return</span> storage ? storage-&gt;frames : empty;</div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span>}</div>
</div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span> </div>
<div class="foldopen" id="foldopen00033" data-start="{" data-end="}">
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"><a class="line" href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970"> 33</a></span>std::shared_ptr&lt;const DecodeFrame&gt; <a class="code hl_function" href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970">DecodeDatabase::FindFrame</a>(<span class="keyword">const</span> <a class="code hl_struct" href="structFrameKey.html">FrameKey</a> &amp;key)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span> <span class="keywordflow">if</span> (!storage)</div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span> <span class="keyword">const</span> std::unordered_map&lt;FrameKey, std::size_t, FrameKeyHasher&gt;::const_iterator it =</div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span> storage-&gt;frameIndexByKey.find(key);</div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span> <span class="keywordflow">if</span> (it == storage-&gt;frameIndexByKey.end())</div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span> <span class="keywordflow">return</span> std::shared_ptr&lt;const DecodeFrame&gt;(storage, &amp;storage-&gt;frames[it-&gt;second]);</div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span>}</div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> </div>
<div class="foldopen" id="foldopen00110" data-start="{" data-end="}">
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"><a class="line" href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970"> 110</a></span>std::shared_ptr&lt;const DecodeFrame&gt; <a class="code hl_function" href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970">DecodeDatabase::FindFrame</a>(<span class="keyword">const</span> <a class="code hl_struct" href="structFrameKey.html">FrameKey</a> &amp;key)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> <span class="keywordflow">if</span> (!storage)</div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> <span class="keyword">const</span> std::unordered_map&lt;FrameKey, std::size_t, FrameKeyHasher&gt;::const_iterator it =</div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span> storage-&gt;frameIndexByKey.find(key);</div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> <span class="keywordflow">if</span> (it == storage-&gt;frameIndexByKey.end())</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span> <span class="keywordflow">return</span> std::shared_ptr&lt;const DecodeFrame&gt;(storage, &amp;storage-&gt;frames[it-&gt;second]);</div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span>}</div>
</div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span> </div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span>std::shared_ptr&lt;const DecodeSignal&gt; DecodeDatabase::FindSignal(<span class="keyword">const</span> <a class="code hl_struct" href="structSignalKey.html">SignalKey</a> &amp;key)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span> <span class="keyword">const</span> std::shared_ptr&lt;const DecodeFrame&gt; frame = <a class="code hl_function" href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970">FindFrame</a>(key.frame);</div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span> <span class="keywordflow">if</span> (!frame)</div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal: frame-&gt;signals) {</div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span> <span class="keywordflow">if</span> (signal.name == key.name)</div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span> <span class="keywordflow">return</span> std::shared_ptr&lt;const DecodeSignal&gt;(frame, &amp;signal);</div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span> }</div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span>}</div>
<div class="ttc" id="aclassDecodeDatabase_html_a780d6e747a48b10a5eb0ab85448d2970"><div class="ttname"><a href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970">DecodeDatabase::FindFrame</a></div><div class="ttdeci">std::shared_ptr&lt; const DecodeFrame &gt; FindFrame(const FrameKey &amp;key) const</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8cpp_source.html#l00033">decode_database.cpp:33</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html_aa034c1510984a85f60ad6c0bd744d6e8"><div class="ttname"><a href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">DecodeDatabase::GetFrames</a></div><div class="ttdeci">const std::vector&lt; DecodeFrame &gt; &amp; GetFrames() const</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8cpp_source.html#l00028">decode_database.cpp:28</a></div></div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span> </div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span>std::shared_ptr&lt;const DecodeSignal&gt; DecodeDatabase::FindSignal(<span class="keyword">const</span> <a class="code hl_struct" href="structSignalKey.html">SignalKey</a> &amp;key)<span class="keyword"> const </span>{</div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span> <span class="keyword">const</span> std::shared_ptr&lt;const DecodeFrame&gt; frame = <a class="code hl_function" href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970">FindFrame</a>(key.frame);</div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span> <span class="keywordflow">if</span> (!frame)</div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code hl_struct" href="structDecodeSignal.html">DecodeSignal</a> &amp;signal: frame-&gt;signals) {</div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> <span class="keywordflow">if</span> (signal.<a class="code hl_variable" href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">name</a> == key.name)</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span> <span class="keywordflow">return</span> std::shared_ptr&lt;const DecodeSignal&gt;(frame, &amp;signal);</div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span> }</div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span> <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span>}</div>
<div class="ttc" id="aclassDecodeDatabase_html_a780d6e747a48b10a5eb0ab85448d2970"><div class="ttname"><a href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970">DecodeDatabase::FindFrame</a></div><div class="ttdeci">std::shared_ptr&lt; const DecodeFrame &gt; FindFrame(const FrameKey &amp;key) const</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8cpp_source.html#l00110">decode_database.cpp:110</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html_aa034c1510984a85f60ad6c0bd744d6e8"><div class="ttname"><a href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">DecodeDatabase::GetFrames</a></div><div class="ttdeci">const std::vector&lt; DecodeFrame &gt; &amp; GetFrames() const</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8cpp_source.html#l00105">decode_database.cpp:105</a></div></div>
<div class="ttc" id="adecode__database_8h_html"><div class="ttname"><a href="decode__database_8h.html">decode_database.h</a></div><div class="ttdoc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro)</div></div>
<div class="ttc" id="astructDecodeFrame_html"><div class="ttname"><a href="structDecodeFrame.html">DecodeFrame</a></div><div class="ttdoc">Runtime-ready frame definition.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00065">decode_database.h:65</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_a3ee2348d781f8f15aaf87e8dcf57ec41"><div class="ttname"><a href="structDecodeFrame.html#a3ee2348d781f8f15aaf87e8dcf57ec41">DecodeFrame::isExtended</a></div><div class="ttdeci">bool isExtended</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00068">decode_database.h:68</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_a51111ac13988be372d5673d12cf3e060"><div class="ttname"><a href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">DecodeFrame::dlc</a></div><div class="ttdeci">std::uint8_t dlc</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00069">decode_database.h:69</a></div></div>
<div class="ttc" id="astructDecodeFrame_html_a52e10215388db7df8b541b9d9909edcf"><div class="ttname"><a href="structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf">DecodeFrame::canId</a></div><div class="ttdeci">std::uint32_t canId</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00067">decode_database.h:67</a></div></div>
<div class="ttc" id="astructDecodeSignal_html"><div class="ttname"><a href="structDecodeSignal.html">DecodeSignal</a></div><div class="ttdoc">Runtime-ready signal definition.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00043">decode_database.h:43</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a0fb84e19a0ab3bd50b6f65c1075ebc25"><div class="ttname"><a href="structDecodeSignal.html#a0fb84e19a0ab3bd50b6f65c1075ebc25">DecodeSignal::minimum</a></div><div class="ttdeci">double minimum</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00052">decode_database.h:52</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a428c39913a366a8476dd291061354391"><div class="ttname"><a href="structDecodeSignal.html#a428c39913a366a8476dd291061354391">DecodeSignal::factor</a></div><div class="ttdeci">double factor</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00050">decode_database.h:50</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a4a6ba87142a9badbf0ca830e9e709cb7"><div class="ttname"><a href="structDecodeSignal.html#a4a6ba87142a9badbf0ca830e9e709cb7">DecodeSignal::maximum</a></div><div class="ttdeci">double maximum</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00053">decode_database.h:53</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a58cf5844f2272a23dcb9687d912e4780"><div class="ttname"><a href="structDecodeSignal.html#a58cf5844f2272a23dcb9687d912e4780">DecodeSignal::name</a></div><div class="ttdeci">std::string name</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00045">decode_database.h:45</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a92db637af4e224a0ae70173050dc3f74"><div class="ttname"><a href="structDecodeSignal.html#a92db637af4e224a0ae70173050dc3f74">DecodeSignal::offset</a></div><div class="ttdeci">double offset</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00051">decode_database.h:51</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_a9d37638129263b8902ba5be59baf39a8"><div class="ttname"><a href="structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8">DecodeSignal::valueType</a></div><div class="ttdeci">ValueType valueType</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00049">decode_database.h:49</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_aaf5d7527ddf65b6355c2b4f3626df22d"><div class="ttname"><a href="structDecodeSignal.html#aaf5d7527ddf65b6355c2b4f3626df22d">DecodeSignal::startBit</a></div><div class="ttdeci">std::uint32_t startBit</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00046">decode_database.h:46</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_abdc4c4bb4a67a6d61d6ca81e8a52833d"><div class="ttname"><a href="structDecodeSignal.html#abdc4c4bb4a67a6d61d6ca81e8a52833d">DecodeSignal::byteOrder</a></div><div class="ttdeci">ByteOrder byteOrder</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00048">decode_database.h:48</a></div></div>
<div class="ttc" id="astructDecodeSignal_html_acd4ef5ee30421d117b5756854302debb"><div class="ttname"><a href="structDecodeSignal.html#acd4ef5ee30421d117b5756854302debb">DecodeSignal::length</a></div><div class="ttdeci">std::uint32_t length</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00047">decode_database.h:47</a></div></div>
<div class="ttc" id="astructFrameKey_html"><div class="ttname"><a href="structFrameKey.html">FrameKey</a></div><div class="ttdoc">Stable frame identifier: normalized CAN ID and frame type.</div><div class="ttdef"><b>Definition</b> <a href="definition__key_8h_source.html#l00015">definition_key.h:15</a></div></div>
<div class="ttc" id="astructSignalKey_html"><div class="ttname"><a href="structSignalKey.html">SignalKey</a></div><div class="ttdef"><b>Definition</b> <a href="definition__key_8h_source.html#l00042">definition_key.h:42</a></div></div>
</div><!-- fragment --></div><!-- contents -->
+4 -4
View File
@@ -168,7 +168,7 @@ $(document).ready(function(){initNavTree('decode__database_8h_source.html','');
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"><a class="line" href="classDecodeDatabase.html"> 87</a></span><span class="keyword">class </span><a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a> {</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>() = <span class="keywordflow">default</span>;</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> <span class="keyword">explicit</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>(std::vector&lt;DecodeFrame&gt; frames);</div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span> <span class="keyword">explicit</span> <a class="code hl_class" href="classDecodeDatabase.html">DecodeDatabase</a>(<span class="keyword">const</span> std::vector&lt;DecodeFrame&gt; &amp;frames);</div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"> 96</span> </div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"> 98</span> <span class="keyword">const</span> std::vector&lt;DecodeFrame&gt; &amp;<a class="code hl_function" href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">GetFrames</a>() <span class="keyword">const</span>;</div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"> 100</span> std::shared_ptr&lt;const DecodeFrame&gt; <a class="code hl_function" href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970">FindFrame</a>(<span class="keyword">const</span> <a class="code hl_struct" href="structFrameKey.html">FrameKey</a> &amp;key) <span class="keyword">const</span>;</div>
@@ -179,7 +179,7 @@ $(document).ready(function(){initNavTree('decode__database_8h_source.html','');
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span> std::vector&lt;DecodeFrame&gt; frames;</div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span> std::unordered_map&lt;FrameKey, std::size_t, FrameKeyHasher&gt; frameIndexByKey;</div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span> </div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> <span class="keyword">explicit</span> Storage(std::vector&lt;DecodeFrame&gt; definitions);</div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> <span class="keyword">explicit</span> Storage(<span class="keyword">const</span> std::vector&lt;DecodeFrame&gt; &amp;definitions);</div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span> };</div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span> </div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span> std::shared_ptr&lt;const Storage&gt; storage;</div>
@@ -188,8 +188,8 @@ $(document).ready(function(){initNavTree('decode__database_8h_source.html','');
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span> </div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span><span class="preprocessor">#endif </span><span class="comment">/* DECODE_DATABASE_H */</span><span class="preprocessor"></span></div>
<div class="ttc" id="aclassDecodeDatabase_html"><div class="ttname"><a href="classDecodeDatabase.html">DecodeDatabase</a></div><div class="ttdoc">Immutable runtime snapshot. Copies share storage; reload replaces a snapshot. Owning lookup handles a...</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00087">decode_database.h:87</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html_a780d6e747a48b10a5eb0ab85448d2970"><div class="ttname"><a href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970">DecodeDatabase::FindFrame</a></div><div class="ttdeci">std::shared_ptr&lt; const DecodeFrame &gt; FindFrame(const FrameKey &amp;key) const</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8cpp_source.html#l00033">decode_database.cpp:33</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html_aa034c1510984a85f60ad6c0bd744d6e8"><div class="ttname"><a href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">DecodeDatabase::GetFrames</a></div><div class="ttdeci">const std::vector&lt; DecodeFrame &gt; &amp; GetFrames() const</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8cpp_source.html#l00028">decode_database.cpp:28</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html_a780d6e747a48b10a5eb0ab85448d2970"><div class="ttname"><a href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970">DecodeDatabase::FindFrame</a></div><div class="ttdeci">std::shared_ptr&lt; const DecodeFrame &gt; FindFrame(const FrameKey &amp;key) const</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8cpp_source.html#l00110">decode_database.cpp:110</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html_aa034c1510984a85f60ad6c0bd744d6e8"><div class="ttname"><a href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">DecodeDatabase::GetFrames</a></div><div class="ttdeci">const std::vector&lt; DecodeFrame &gt; &amp; GetFrames() const</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8cpp_source.html#l00105">decode_database.cpp:105</a></div></div>
<div class="ttc" id="adecode__database_8h_html_aaeb92d42f5a6e27b8ba19f18d69d142b"><div class="ttname"><a href="decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142b">ByteOrder</a></div><div class="ttdeci">ByteOrder</div><div class="ttdoc">Signal byte order used for runtime decoding.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00027">decode_database.h:27</a></div></div>
<div class="ttc" id="adecode__database_8h_html_ad9971b6ef33e02ba2c75d19c1d2518a1"><div class="ttname"><a href="decode__database_8h.html#ad9971b6ef33e02ba2c75d19c1d2518a1">ValueType</a></div><div class="ttdeci">ValueType</div><div class="ttdoc">Signal numeric type.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00035">decode_database.h:35</a></div></div>
<div class="ttc" id="astructDecodeFrame_html"><div class="ttname"><a href="structDecodeFrame.html">DecodeFrame</a></div><div class="ttdoc">Runtime-ready frame definition.</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00065">decode_database.h:65</a></div></div>
@@ -144,6 +144,8 @@ Files</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><a href="signal__info_8h_source.html"><span class="icondoc"></span></a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="signal__info_8h.html">signal_info.h</a></td></tr>
<tr class="memdesc:signal__info_8h"><td class="mdescLeft">&#160;</td><td class="mdescRight">Created: 2026-03-13 Author: Deeaitch (Dim. Himro) <br /></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><a href="signal__layout_8h_source.html"><span class="icondoc"></span></a>&#160;</td><td class="memItemRight" valign="bottom"><b>signal_layout.h</b></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><a href="text__utils_8h_source.html"><span class="icondoc"></span></a>&#160;</td><td class="memItemRight" valign="bottom"><b>text_utils.h</b></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><a href="tree__node_8cpp_source.html"><span class="icondoc"></span></a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="tree__node_8cpp.html">tree_node.cpp</a></td></tr>
@@ -18,6 +18,7 @@ var dir_4270bfced15e0e73154b13468c7c9ad9 =
[ "frame_info.h", "frame__info_8h.html", "frame__info_8h" ],
[ "multiplexing.h", "multiplexing_8h_source.html", null ],
[ "signal_info.h", "signal__info_8h.html", "signal__info_8h" ],
[ "signal_layout.h", "signal__layout_8h_source.html", null ],
[ "text_utils.h", "text__utils_8h_source.html", null ],
[ "tree_node.cpp", "tree__node_8cpp.html", null ],
[ "tree_node.h", "tree__node_8h.html", "tree__node_8h" ],
@@ -106,6 +106,8 @@ Files</h2></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><a href="dbc__tree__model__test_8cpp_source.html"><span class="icondoc"></span></a>&#160;</td><td class="memItemRight" valign="bottom"><b>dbc_tree_model_test.cpp</b></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><a href="dbc__validation__test_8cpp_source.html"><span class="icondoc"></span></a>&#160;</td><td class="memItemRight" valign="bottom"><b>dbc_validation_test.cpp</b></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><a href="tests_2main_8cpp_source.html"><span class="icondoc"></span></a>&#160;</td><td class="memItemRight" valign="bottom"><b>main.cpp</b></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top"><a href="tree__node__test_8cpp_source.html"><span class="icondoc"></span></a>&#160;</td><td class="memItemRight" valign="bottom"><b>tree_node_test.cpp</b></td></tr>
@@ -5,6 +5,7 @@ var dir_59425e443f801f1f2fd8bbe4959a3ccf =
[ "dbc_lifetime_test.cpp", "dbc__lifetime__test_8cpp_source.html", null ],
[ "dbc_parser_test.cpp", "dbc__parser__test_8cpp_source.html", null ],
[ "dbc_tree_model_test.cpp", "dbc__tree__model__test_8cpp_source.html", null ],
[ "dbc_validation_test.cpp", "dbc__validation__test_8cpp_source.html", null ],
[ "tests/main.cpp", "tests_2main_8cpp_source.html", null ],
[ "tree_node_test.cpp", "tree__node__test_8cpp_source.html", null ]
];
+2 -2
View File
@@ -230,13 +230,13 @@ $(document).ready(function(){initNavTree('examples_2main_8cpp_source.html','');
<div class="ttc" id="aclassDbcDecodeBuilder_html"><div class="ttname"><a href="classDbcDecodeBuilder.html">DbcDecodeBuilder</a></div><div class="ttdoc">Converts parsed DBC data into runtime decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decode__builder_8h_source.html#l00021">dbc_decode_builder.h:21</a></div></div>
<div class="ttc" id="aclassDbcDecodeBuilder_html_a2bc6386dfb5e58976c42e22c19ec471b"><div class="ttname"><a href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b">DbcDecodeBuilder::Build</a></div><div class="ttdeci">DecodeDatabase Build(const DbcDatabase &amp;source) const</div><div class="ttdoc">Build runtime decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decode__builder_8cpp_source.html#l00015">dbc_decode_builder.cpp:15</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html"><div class="ttname"><a href="classDbcDecoder.html">DbcDecoder</a></div><div class="ttdoc">Runtime CAN decoder using prebuilt decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00084">dbc_decoder.h:84</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_a345951ffe5d943a70d3a1ea1f39e74f7"><div class="ttname"><a href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a></div><div class="ttdeci">DecodedFrameValue Decode(const DecodeDatabase &amp;database, const RawCanFrame &amp;frame) const</div><div class="ttdoc">Decode one raw CAN frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00022">dbc_decoder.cpp:22</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_a345951ffe5d943a70d3a1ea1f39e74f7"><div class="ttname"><a href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a></div><div class="ttdeci">DecodedFrameValue Decode(const DecodeDatabase &amp;database, const RawCanFrame &amp;frame) const</div><div class="ttdoc">Decode one raw CAN frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00023">dbc_decoder.cpp:23</a></div></div>
<div class="ttc" id="aclassDbcParser_html"><div class="ttname"><a href="classDbcParser.html">DbcParser</a></div><div class="ttdoc">Minimal DBC parser.</div><div class="ttdef"><b>Definition</b> <a href="dbc__parser_8h_source.html#l00033">dbc_parser.h:33</a></div></div>
<div class="ttc" id="aclassDbcParser_html_aef72826942c9095d653fafa435855e56"><div class="ttname"><a href="classDbcParser.html#aef72826942c9095d653fafa435855e56">DbcParser::ParseFile</a></div><div class="ttdeci">DbcDatabase ParseFile(const std::string &amp;filePath) const</div><div class="ttdoc">Parse DBC file.</div><div class="ttdef"><b>Definition</b> <a href="dbc__parser_8cpp_source.html#l00031">dbc_parser.cpp:31</a></div></div>
<div class="ttc" id="aclassDbcTreeBuilder_html"><div class="ttname"><a href="classDbcTreeBuilder.html">DbcTreeBuilder</a></div><div class="ttdoc">Builds a simple tree from parsed DBC database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__tree__builder_8h_source.html#l00023">dbc_tree_builder.h:23</a></div></div>
<div class="ttc" id="aclassDbcTreeBuilder_html_a7e57d067d831b14b383947fd125edd4b"><div class="ttname"><a href="classDbcTreeBuilder.html#a7e57d067d831b14b383947fd125edd4b">DbcTreeBuilder::Build</a></div><div class="ttdeci">std::unique_ptr&lt; TreeNode &gt; Build(const DbcDatabase &amp;database) const</div><div class="ttdoc">Build tree representation of parsed DBC data.</div><div class="ttdef"><b>Definition</b> <a href="dbc__tree__builder_8cpp_source.html#l00014">dbc_tree_builder.cpp:14</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html"><div class="ttname"><a href="classDecodeDatabase.html">DecodeDatabase</a></div><div class="ttdoc">Immutable runtime snapshot. Copies share storage; reload replaces a snapshot. Owning lookup handles a...</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00087">decode_database.h:87</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html_aa034c1510984a85f60ad6c0bd744d6e8"><div class="ttname"><a href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">DecodeDatabase::GetFrames</a></div><div class="ttdeci">const std::vector&lt; DecodeFrame &gt; &amp; GetFrames() const</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8cpp_source.html#l00028">decode_database.cpp:28</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html_aa034c1510984a85f60ad6c0bd744d6e8"><div class="ttname"><a href="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8">DecodeDatabase::GetFrames</a></div><div class="ttdeci">const std::vector&lt; DecodeFrame &gt; &amp; GetFrames() const</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8cpp_source.html#l00105">decode_database.cpp:105</a></div></div>
<div class="ttc" id="aclassTreeNode_html"><div class="ttname"><a href="classTreeNode.html">TreeNode</a></div><div class="ttdoc">Tree node for later use in model/view or other hierarchy consumers.</div><div class="ttdef"><b>Definition</b> <a href="tree__node_8h_source.html#l00035">tree_node.h:35</a></div></div>
<div class="ttc" id="aclassTreeNode_html_a226518612d0d00b5988a2c44fc21d3f1"><div class="ttname"><a href="classTreeNode.html#a226518612d0d00b5988a2c44fc21d3f1">TreeNode::GetSignal</a></div><div class="ttdeci">const SignalInfo * GetSignal() const</div><div class="ttdoc">Get signal payload if node is signal.</div><div class="ttdef"><b>Definition</b> <a href="tree__node_8cpp_source.html#l00064">tree_node.cpp:64</a></div></div>
<div class="ttc" id="aclassTreeNode_html_a4727ff801a2d1b9323c5ae50a35457a6"><div class="ttname"><a href="classTreeNode.html#a4727ff801a2d1b9323c5ae50a35457a6">TreeNode::GetChild</a></div><div class="ttdeci">const TreeNode * GetChild(std::size_t index) const</div><div class="ttdoc">Get child by index.</div><div class="ttdef"><b>Definition</b> <a href="tree__node_8cpp_source.html#l00038">tree_node.cpp:38</a></div></div>
+20 -18
View File
@@ -114,24 +114,26 @@ $(document).ready(function(){initNavTree('files.html',''); initResizable(); });
<tr id="row_0_15_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="frame__info_8h_source.html"><span class="icondoc"></span></a><a class="el" href="frame__info_8h.html" target="_self">frame_info.h</a></td><td class="desc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro) </td></tr>
<tr id="row_0_16_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="multiplexing_8h_source.html"><span class="icondoc"></span></a><b>multiplexing.h</b></td><td class="desc"></td></tr>
<tr id="row_0_17_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="signal__info_8h_source.html"><span class="icondoc"></span></a><a class="el" href="signal__info_8h.html" target="_self">signal_info.h</a></td><td class="desc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro) </td></tr>
<tr id="row_0_18_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="text__utils_8h_source.html"><span class="icondoc"></span></a><b>text_utils.h</b></td><td class="desc"></td></tr>
<tr id="row_0_19_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="tree__node_8cpp_source.html"><span class="icondoc"></span></a><a class="el" href="tree__node_8cpp.html" target="_self">tree_node.cpp</a></td><td class="desc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro) </td></tr>
<tr id="row_0_20_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="tree__node_8h_source.html"><span class="icondoc"></span></a><a class="el" href="tree__node_8h.html" target="_self">tree_node.h</a></td><td class="desc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro) </td></tr>
<tr id="row_0_21_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="typefactory_8h_source.html"><span class="icondoc"></span></a><b>typefactory.h</b></td><td class="desc"></td></tr>
<tr id="row_0_22_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="value__descriptions_8h_source.html"><span class="icondoc"></span></a><b>value_descriptions.h</b></td><td class="desc"></td></tr>
<tr id="row_1_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_1_" class="arrow" onclick="toggleFolder('1_')">&#9660;</span><span id="img_1_" class="iconfopen" onclick="toggleFolder('1_')">&#160;</span><a class="el" href="dir_d28a4824dc47e487b107a5db32ef43c4.html" target="_self">examples</a></td><td class="desc"></td></tr>
<tr id="row_1_0_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="examples_2main_8cpp_source.html"><span class="icondoc"></span></a><a class="el" href="examples_2main_8cpp.html" target="_self">main.cpp</a></td><td class="desc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro) </td></tr>
<tr id="row_2_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_2_" class="arrow" onclick="toggleFolder('2_')">&#9660;</span><span id="img_2_" class="iconfopen" onclick="toggleFolder('2_')">&#160;</span><a class="el" href="dir_0f63d6441a2c250919e1e8723011eb2f.html" target="_self">qt</a></td><td class="desc"></td></tr>
<tr id="row_2_0_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="dbc__tree__model_8cpp_source.html"><span class="icondoc"></span></a><b>dbc_tree_model.cpp</b></td><td class="desc"></td></tr>
<tr id="row_2_1_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="dbc__tree__model_8h_source.html"><span class="icondoc"></span></a><b>dbc_tree_model.h</b></td><td class="desc"></td></tr>
<tr id="row_3_" class="odd"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_3_" class="arrow" onclick="toggleFolder('3_')">&#9660;</span><span id="img_3_" class="iconfopen" onclick="toggleFolder('3_')">&#160;</span><a class="el" href="dir_59425e443f801f1f2fd8bbe4959a3ccf.html" target="_self">tests</a></td><td class="desc"></td></tr>
<tr id="row_3_0_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="dbc__coverage__test_8cpp_source.html"><span class="icondoc"></span></a><b>dbc_coverage_test.cpp</b></td><td class="desc"></td></tr>
<tr id="row_3_1_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="dbc__decoder__test_8cpp_source.html"><span class="icondoc"></span></a><b>dbc_decoder_test.cpp</b></td><td class="desc"></td></tr>
<tr id="row_3_2_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="dbc__lifetime__test_8cpp_source.html"><span class="icondoc"></span></a><b>dbc_lifetime_test.cpp</b></td><td class="desc"></td></tr>
<tr id="row_3_3_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="dbc__parser__test_8cpp_source.html"><span class="icondoc"></span></a><b>dbc_parser_test.cpp</b></td><td class="desc"></td></tr>
<tr id="row_3_4_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="dbc__tree__model__test_8cpp_source.html"><span class="icondoc"></span></a><b>dbc_tree_model_test.cpp</b></td><td class="desc"></td></tr>
<tr id="row_3_5_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="tests_2main_8cpp_source.html"><span class="icondoc"></span></a><b>main.cpp</b></td><td class="desc"></td></tr>
<tr id="row_3_6_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="tree__node__test_8cpp_source.html"><span class="icondoc"></span></a><b>tree_node_test.cpp</b></td><td class="desc"></td></tr>
<tr id="row_0_18_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="signal__layout_8h_source.html"><span class="icondoc"></span></a><b>signal_layout.h</b></td><td class="desc"></td></tr>
<tr id="row_0_19_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="text__utils_8h_source.html"><span class="icondoc"></span></a><b>text_utils.h</b></td><td class="desc"></td></tr>
<tr id="row_0_20_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="tree__node_8cpp_source.html"><span class="icondoc"></span></a><a class="el" href="tree__node_8cpp.html" target="_self">tree_node.cpp</a></td><td class="desc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro) </td></tr>
<tr id="row_0_21_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="tree__node_8h_source.html"><span class="icondoc"></span></a><a class="el" href="tree__node_8h.html" target="_self">tree_node.h</a></td><td class="desc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro) </td></tr>
<tr id="row_0_22_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="typefactory_8h_source.html"><span class="icondoc"></span></a><b>typefactory.h</b></td><td class="desc"></td></tr>
<tr id="row_0_23_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="value__descriptions_8h_source.html"><span class="icondoc"></span></a><b>value_descriptions.h</b></td><td class="desc"></td></tr>
<tr id="row_1_" class="odd"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_1_" class="arrow" onclick="toggleFolder('1_')">&#9660;</span><span id="img_1_" class="iconfopen" onclick="toggleFolder('1_')">&#160;</span><a class="el" href="dir_d28a4824dc47e487b107a5db32ef43c4.html" target="_self">examples</a></td><td class="desc"></td></tr>
<tr id="row_1_0_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="examples_2main_8cpp_source.html"><span class="icondoc"></span></a><a class="el" href="examples_2main_8cpp.html" target="_self">main.cpp</a></td><td class="desc">Created: 2026-03-13 Author: Deeaitch (Dim. Himro) </td></tr>
<tr id="row_2_" class="odd"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_2_" class="arrow" onclick="toggleFolder('2_')">&#9660;</span><span id="img_2_" class="iconfopen" onclick="toggleFolder('2_')">&#160;</span><a class="el" href="dir_0f63d6441a2c250919e1e8723011eb2f.html" target="_self">qt</a></td><td class="desc"></td></tr>
<tr id="row_2_0_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="dbc__tree__model_8cpp_source.html"><span class="icondoc"></span></a><b>dbc_tree_model.cpp</b></td><td class="desc"></td></tr>
<tr id="row_2_1_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="dbc__tree__model_8h_source.html"><span class="icondoc"></span></a><b>dbc_tree_model.h</b></td><td class="desc"></td></tr>
<tr id="row_3_" class="even"><td class="entry"><span style="width:0px;display:inline-block;">&#160;</span><span id="arr_3_" class="arrow" onclick="toggleFolder('3_')">&#9660;</span><span id="img_3_" class="iconfopen" onclick="toggleFolder('3_')">&#160;</span><a class="el" href="dir_59425e443f801f1f2fd8bbe4959a3ccf.html" target="_self">tests</a></td><td class="desc"></td></tr>
<tr id="row_3_0_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="dbc__coverage__test_8cpp_source.html"><span class="icondoc"></span></a><b>dbc_coverage_test.cpp</b></td><td class="desc"></td></tr>
<tr id="row_3_1_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="dbc__decoder__test_8cpp_source.html"><span class="icondoc"></span></a><b>dbc_decoder_test.cpp</b></td><td class="desc"></td></tr>
<tr id="row_3_2_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="dbc__lifetime__test_8cpp_source.html"><span class="icondoc"></span></a><b>dbc_lifetime_test.cpp</b></td><td class="desc"></td></tr>
<tr id="row_3_3_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="dbc__parser__test_8cpp_source.html"><span class="icondoc"></span></a><b>dbc_parser_test.cpp</b></td><td class="desc"></td></tr>
<tr id="row_3_4_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="dbc__tree__model__test_8cpp_source.html"><span class="icondoc"></span></a><b>dbc_tree_model_test.cpp</b></td><td class="desc"></td></tr>
<tr id="row_3_5_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="dbc__validation__test_8cpp_source.html"><span class="icondoc"></span></a><b>dbc_validation_test.cpp</b></td><td class="desc"></td></tr>
<tr id="row_3_6_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="tests_2main_8cpp_source.html"><span class="icondoc"></span></a><b>main.cpp</b></td><td class="desc"></td></tr>
<tr id="row_3_7_" class="even"><td class="entry"><span style="width:32px;display:inline-block;">&#160;</span><a href="tree__node__test_8cpp_source.html"><span class="icondoc"></span></a><b>tree_node_test.cpp</b></td><td class="desc"></td></tr>
</table>
</div><!-- directory -->
</div><!-- contents -->
+1 -1
View File
@@ -115,7 +115,7 @@ $(document).ready(function(){initNavTree('functions.html',''); initResizable();
<h3><a id="index_d" name="index_d"></a>- d -</h3><ul>
<li>data&#160;:&#160;<a class="el" href="structRawCanFrame.html#a0acb487612104c99c9907344c035df83">RawCanFrame</a></li>
<li>Decode()&#160;:&#160;<a class="el" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder</a></li>
<li>DecodeDatabase()&#160;:&#160;<a class="el" href="classDecodeDatabase.html#aa935a3a0d334f932d6a8c89a3818286a">DecodeDatabase</a></li>
<li>DecodeDatabase()&#160;:&#160;<a class="el" href="classDecodeDatabase.html#a51a44cf7c3f23c98ec8781afe0097c0c">DecodeDatabase</a></li>
<li>definition&#160;:&#160;<a class="el" href="structDecodedFrameValue.html#a33e971ba10030506007aa201c89f351d">DecodedFrameValue</a>, <a class="el" href="structDecodedSignalValue.html#a828b5ef7faefc14fbf5dbd46249bcad2">DecodedSignalValue</a></li>
<li>Dispatch()&#160;:&#160;<a class="el" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">DbcStatementDispatcher</a></li>
<li>dlc&#160;:&#160;<a class="el" href="structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060">DecodeFrame</a>, <a class="el" href="structFrameInfo.html#aa2b198ea0f55e560c123d35e7b3ecab9">FrameInfo</a></li>
+1 -1
View File
@@ -97,7 +97,7 @@ $(document).ready(function(){initNavTree('functions_func.html',''); initResizabl
<li>create()&#160;:&#160;<a class="el" href="classTypeFactory.html#a3f43b03d6e3a0fd503fdec01ecf62e9f">TypeFactory&lt; ClassId, BaseClass, Args &gt;</a></li>
<li>creator()&#160;:&#160;<a class="el" href="classTypeFactory.html#ad82f537569ece3d3a4a376523fa94473">TypeFactory&lt; ClassId, BaseClass, Args &gt;</a></li>
<li>Decode()&#160;:&#160;<a class="el" href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder</a></li>
<li>DecodeDatabase()&#160;:&#160;<a class="el" href="classDecodeDatabase.html#aa935a3a0d334f932d6a8c89a3818286a">DecodeDatabase</a></li>
<li>DecodeDatabase()&#160;:&#160;<a class="el" href="classDecodeDatabase.html#a51a44cf7c3f23c98ec8781afe0097c0c">DecodeDatabase</a></li>
<li>Dispatch()&#160;:&#160;<a class="el" href="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed">DbcStatementDispatcher</a></li>
<li>FindFrame()&#160;:&#160;<a class="el" href="classDbcDecoder.html#a4005c4311f57b7faf21c0cb31463039c">DbcDecoder</a>, <a class="el" href="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970">DecodeDatabase</a></li>
<li>GetChild()&#160;:&#160;<a class="el" href="classTreeNode.html#a4727ff801a2d1b9323c5ae50a35457a6">TreeNode</a></li>
+8 -3
View File
@@ -137,6 +137,7 @@
<section title="Tree and optional model tests" ref="md_tests_2README.html#autotoc_md140"/>
<section title="Additional regression coverage" ref="md_tests_2README.html#autotoc_md141"/>
<section title="Definition lifetime and reload coverage" ref="md_tests_2README.html#autotoc_md142"/>
<section title="Database validation coverage" ref="md_tests_2README.html#autotoc_md143"/>
</section>
<section title="Classes" ref="annotated.html">
<section title="Class List" ref="annotated.html">
@@ -185,7 +186,7 @@
<section title="DbcValueDescriptionHandler" ref="classDbcValueDescriptionHandler.html">
</section>
<section title="DecodeDatabase" ref="classDecodeDatabase.html">
<section title="DecodeDatabase" ref="classDecodeDatabase.html#aa935a3a0d334f932d6a8c89a3818286a"/>
<section title="DecodeDatabase" ref="classDecodeDatabase.html#a51a44cf7c3f23c98ec8781afe0097c0c"/>
<section title="GetFrames" ref="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8"/>
<section title="FindFrame" ref="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970"/>
</section>
@@ -438,7 +439,7 @@
<section title="public" ref="structDecodeFrame.html#a7f4e71bbdec3f424b625e724e3dfbf14"/>
</section>
<section title="DecodeDatabase" ref="classDecodeDatabase.html">
<section title="DecodeDatabase" ref="classDecodeDatabase.html#aa935a3a0d334f932d6a8c89a3818286a"/>
<section title="DecodeDatabase" ref="classDecodeDatabase.html#a51a44cf7c3f23c98ec8781afe0097c0c"/>
<section title="GetFrames" ref="classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8"/>
<section title="FindFrame" ref="classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970"/>
</section>
@@ -483,6 +484,7 @@
<section title="comment" ref="structSignalInfo.html#ac99ba7563a5dad01e39c4257216953f5"/>
</section>
</section>
<section title="signal_layout.h" ref="signal__layout_8h_source.html"/>
<section title="text_utils.h" ref="text__utils_8h_source.html"/>
<section title="tree_node.cpp" ref="tree__node_8cpp.html"/>
<section title="tree_node.h" ref="tree__node_8h.html">
@@ -524,6 +526,7 @@
<section title="dbc_lifetime_test.cpp" ref="dbc__lifetime__test_8cpp_source.html"/>
<section title="dbc_parser_test.cpp" ref="dbc__parser__test_8cpp_source.html"/>
<section title="dbc_tree_model_test.cpp" ref="dbc__tree__model__test_8cpp_source.html"/>
<section title="dbc_validation_test.cpp" ref="dbc__validation__test_8cpp_source.html"/>
<section title="tests/main.cpp" ref="tests_2main_8cpp_source.html"/>
<section title="tree_node_test.cpp" ref="tree__node__test_8cpp_source.html"/>
</section>
@@ -593,7 +596,7 @@
<keyword name="creator(const std::string &amp;id) const" id="TypeFactory&lt; std::string, DbcStatementHandler &gt;::creator_ad82f537569ece3d3a4a376523fa94473" ref="classTypeFactory.html#ad82f537569ece3d3a4a376523fa94473"/>
<keyword name="data" id="RawCanFrame::data_a0acb487612104c99c9907344c035df83" ref="structRawCanFrame.html#a0acb487612104c99c9907344c035df83"/>
<keyword name="Decode(const DecodeDatabase &amp;database, const RawCanFrame &amp;frame) const" id="DbcDecoder::Decode_a345951ffe5d943a70d3a1ea1f39e74f7" ref="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7"/>
<keyword name="DecodeDatabase(std::vector&lt; DecodeFrame &gt; frames)" id="DecodeDatabase::DecodeDatabase_aa935a3a0d334f932d6a8c89a3818286a" ref="classDecodeDatabase.html#aa935a3a0d334f932d6a8c89a3818286a"/>
<keyword name="DecodeDatabase(const std::vector&lt; DecodeFrame &gt; &amp;frames)" id="DecodeDatabase::DecodeDatabase_a51a44cf7c3f23c98ec8781afe0097c0c" ref="classDecodeDatabase.html#a51a44cf7c3f23c98ec8781afe0097c0c"/>
<keyword name="definition" id="DecodedSignalValue::definition_a828b5ef7faefc14fbf5dbd46249bcad2" ref="structDecodedSignalValue.html#a828b5ef7faefc14fbf5dbd46249bcad2"/>
<keyword name="definition" id="DecodedFrameValue::definition_a33e971ba10030506007aa201c89f351d" ref="structDecodedFrameValue.html#a33e971ba10030506007aa201c89f351d"/>
<keyword name="Dispatch(const std::string &amp;line, DbcParseContext &amp;context) const" id="DbcStatementDispatcher::Dispatch_a495c2d5c7ebb8103b1987cdd87c142ed" ref="classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed"/>
@@ -758,6 +761,7 @@
<file>dbc__tree__model_8cpp_source.html</file>
<file>dbc__tree__model_8h_source.html</file>
<file>dbc__tree__model__test_8cpp_source.html</file>
<file>dbc__validation__test_8cpp_source.html</file>
<file>decode__database_8cpp_source.html</file>
<file>decode__database_8h.html</file>
<file>decode__database_8h_source.html</file>
@@ -915,6 +919,7 @@
<file>search/variables_f.js</file>
<file>signal__info_8h.html</file>
<file>signal__info_8h_source.html</file>
<file>signal__layout_8h_source.html</file>
<file>splitbar.png</file>
<file>splitbard.png</file>
<file>structDbcDatabase-members.html</file>
+15 -6
View File
@@ -369,7 +369,16 @@ Purpose</h1>
<hr />
<h1><a class="anchor" id="autotoc_md60"></a>
&lt;tt&gt;DecodeDatabase&lt;/tt&gt;</h1>
<p>Immutable runtime snapshot with a private frame index. Build it with <code>DbcDecodeBuilder::Build(parsed)</code> or construct it from <code>std::vector&lt;<a class="el" href="structDecodeFrame.html" title="Runtime-ready frame definition.">DecodeFrame</a>&gt;</code>. Construction rejects duplicate frame keys and duplicate signal names within a frame with <code>std::invalid_argument</code>, including manually supplied metadata.</p>
<p>Immutable runtime snapshot with a private frame index. Build it with <code>DbcDecodeBuilder::Build(parsed)</code> or construct it from <code>std::vector&lt;<a class="el" href="structDecodeFrame.html" title="Runtime-ready frame definition.">DecodeFrame</a>&gt;</code>. Construction validates all definitions before publishing the snapshot and throws <code>std::invalid_argument</code> for invalid metadata, including manually supplied data:</p>
<ul>
<li>Normalized CAN IDs must fit 11 bits for standard frames or 29 bits for extended frames. DBC's bit-31 encoding flag must already be removed.</li>
<li>Frame keys must be unique; signal names must be unique within their frame.</li>
<li>Signal lengths must be 1–64 bits, with Intel/Motorola layouts entirely inside the declared payload. Bit coordinates use overflow-safe 64-bit arithmetic.</li>
<li>Byte order, numeric type, and multiplexing role must be valid enum values.</li>
<li>Factor, offset, minimum, and maximum must be finite; minimum must not exceed maximum. Zero and negative factors are allowed.</li>
<li><a class="el" href="structMultiplexing.html">Multiplexing</a> requires one unsigned selector when branches are present, with branch values in its raw range. Signals may overlap only when they are branches selected by different raw values, including mixed byte orders.</li>
</ul>
<p><code>dlc</code> remains a byte count in the storage range 0–255; construction imposes no additional CAN/CAN FD payload limit. A zero-byte frame may contain no signals. Both <code><a class="el" href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b" title="Build runtime decode database.">DbcDecodeBuilder::Build</a></code> and the direct constructor apply these rules. Construction copies the input, including nested metadata, even for rvalue input. Saved mutable aliases into that input cannot modify definitions or invalidate the lookup index. Database copies still share the frozen snapshot; a failed construction or replacement leaves the previous snapshot and its lookups intact.</p>
<ul>
<li><code>GetFrames()</code> returns a borrowed <code>const std::vector&lt;<a class="el" href="structDecodeFrame.html" title="Runtime-ready frame definition.">DecodeFrame</a>&gt;&amp;</code>.</li>
<li><code>FindFrame(FrameKey)</code> returns <code>std::shared_ptr&lt;const <a class="el" href="structDecodeFrame.html" title="Runtime-ready frame definition.">DecodeFrame</a>&gt;</code>.</li>
@@ -449,12 +458,12 @@ Raw value representation and precision</h2>
</table>
<p>Short-payload status takes precedence over signal errors; inspect each signal's status for the individual cause. <code>valid</code> retains its existing meaning of a matched definition and does not imply <code>status == FrameDecodeStatus::Valid</code>.</p>
<p>Payload policy uses <code>dlc</code> as a byte count, including for CAN FD; it is not the encoded wire DLC. A shorter payload is never padded: all signals whose bytes are available still decode, even if other signals fail. A longer payload is accepted; bytes beyond <code>dlc</code> are ignored. Signal bit layouts must fit the declared <code>dlc</code>, so extra bytes cannot rescue an invalid definition. Empty payloads and zero-byte frame definitions follow the same rules. Results include every signal in definition order, preserving successful values and definition handles on partial failures.</p>
<p>The decoder applies factor and offset; it does not clamp physical values to the declared minimum and maximum. Non-finite conversion results (NaN or positive/ negative infinity), including overflow with finite factor/offset, produce <code>PhysicalConversionFailed</code>. The exact raw value and non-finite <code>physicalValue</code> remain available, while signal <code>valid</code> is false. Non-finite factor/offset in manually constructed definitions follow this same conversion-result check. Physical conversion failure of a selector does not prevent raw branch selection.</p>
<p>The decoder applies factor and offset; it does not clamp physical values to the declared minimum and maximum. Non-finite conversion results (NaN or positive/ negative infinity), including overflow with finite factor/offset, produce <code>PhysicalConversionFailed</code>. The exact raw value and non-finite <code>physicalValue</code> remain available, while signal <code>valid</code> is false. Non-finite numeric parameters are rejected during database construction. Finite parameters can still overflow during conversion; conversion failure of a selector does not prevent raw branch selection.</p>
<h2><a class="anchor" id="autotoc_md70"></a>
Definition ownership and reload</h2>
<p><code><a class="el" href="structDecodedFrameValue.html#a33e971ba10030506007aa201c89f351d">DecodedFrameValue::definition</a></code> and <code><a class="el" href="structDecodedSignalValue.html#a828b5ef7faefc14fbf5dbd46249bcad2">DecodedSignalValue::definition</a></code> are owning <code>std::shared_ptr&lt;const ...&gt;</code> handles. Each handle retains the immutable runtime snapshot. Definitions remain valid until the last database copy, lookup handle, or decoded result owning that snapshot is released. An independently copied signal result retains its definition even after the parent frame result is removed. Copying or moving results preserves ownership.</p>
<p>Reload by assigning a newly built database. Stored results continue to describe the old DBC, including its units, scaling, comments, and <code>VAL_</code> descriptions; subsequent decoding uses the new DBC. Removed definitions cannot be found in the new database, but old results safely retain their old definitions. Keeping even one signal handle retains the whole old snapshot; release stored results when that metadata is no longer needed.</p>
<p><code>GetFrames()</code> is a borrowed view. References, iterators, and raw pointers obtained from it or from a handle's <code>.get()</code> do not retain ownership. Keep an owning handle or an unchanged database copy while using them. Do not retain mutable aliases into a vector moved into the database constructor. The raw string pointer from <code>GetValueDescription()</code> follows the same rule: keep the signal definition handle alive while using the string.</p>
<p><code>GetFrames()</code> is a borrowed view. References, iterators, and raw pointers obtained from it or from a handle's <code>.get()</code> do not retain ownership. Keep an owning handle or an unchanged database copy while using them. Constructor input is copied and may be changed independently afterward. The raw string pointer from <code>GetValueDescription()</code> follows the same rule: keep the signal definition handle alive while using the string.</p>
<p>Parsed <code><a class="el" href="structDbcDatabase.html" title="Parsed DBC content stored in a simple internal form.">DbcDatabase</a></code>/<code><a class="el" href="structFrameInfo.html" title="Describes one CAN frame from a DBC file.">FrameInfo</a></code>/<code><a class="el" href="structSignalInfo.html" title="Describes one signal inside a DBC frame.">SignalInfo</a></code> remain ordinary mutable value containers: borrowed pointers follow standard vector invalidation rules. Builders copy their metadata, so parsed input may be changed or destroyed after building. Tree nodes own metadata copies; the Qt model owns its tree and invalidates model indexes on reset. Runtime handles do not depend on the parsed database or tree. Synchronize replacement of a shared database variable with decoding; immutable snapshots do not make concurrent assignment to the same object safe.</p>
<h2><a class="anchor" id="autotoc_md71"></a>
Stable frame and signal identifiers</h2>
@@ -472,7 +481,7 @@ Stable frame and signal identifiers</h2>
<div class="ttc" id="aclassDbcDecodeBuilder_html"><div class="ttname"><a href="classDbcDecodeBuilder.html">DbcDecodeBuilder</a></div><div class="ttdoc">Converts parsed DBC data into runtime decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decode__builder_8h_source.html#l00021">dbc_decode_builder.h:21</a></div></div>
<div class="ttc" id="aclassDbcDecodeBuilder_html_a2bc6386dfb5e58976c42e22c19ec471b"><div class="ttname"><a href="classDbcDecodeBuilder.html#a2bc6386dfb5e58976c42e22c19ec471b">DbcDecodeBuilder::Build</a></div><div class="ttdeci">DecodeDatabase Build(const DbcDatabase &amp;source) const</div><div class="ttdoc">Build runtime decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decode__builder_8cpp_source.html#l00015">dbc_decode_builder.cpp:15</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html"><div class="ttname"><a href="classDbcDecoder.html">DbcDecoder</a></div><div class="ttdoc">Runtime CAN decoder using prebuilt decode database.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00084">dbc_decoder.h:84</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_a345951ffe5d943a70d3a1ea1f39e74f7"><div class="ttname"><a href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a></div><div class="ttdeci">DecodedFrameValue Decode(const DecodeDatabase &amp;database, const RawCanFrame &amp;frame) const</div><div class="ttdoc">Decode one raw CAN frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00022">dbc_decoder.cpp:22</a></div></div>
<div class="ttc" id="aclassDbcDecoder_html_a345951ffe5d943a70d3a1ea1f39e74f7"><div class="ttname"><a href="classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7">DbcDecoder::Decode</a></div><div class="ttdeci">DecodedFrameValue Decode(const DecodeDatabase &amp;database, const RawCanFrame &amp;frame) const</div><div class="ttdoc">Decode one raw CAN frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8cpp_source.html#l00023">dbc_decoder.cpp:23</a></div></div>
<div class="ttc" id="aclassDecodeDatabase_html"><div class="ttname"><a href="classDecodeDatabase.html">DecodeDatabase</a></div><div class="ttdoc">Immutable runtime snapshot. Copies share storage; reload replaces a snapshot. Owning lookup handles a...</div><div class="ttdef"><b>Definition</b> <a href="decode__database_8h_source.html#l00087">decode_database.h:87</a></div></div>
<div class="ttc" id="astructDecodedFrameValue_html"><div class="ttname"><a href="structDecodedFrameValue.html">DecodedFrameValue</a></div><div class="ttdoc">Fully decoded frame.</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00071">dbc_decoder.h:71</a></div></div>
<div class="ttc" id="astructDecodedFrameValue_html_a4f51c31110dba1f73a763c596372beb0"><div class="ttname"><a href="structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0">DecodedFrameValue::valid</a></div><div class="ttdeci">bool valid</div><div class="ttdef"><b>Definition</b> <a href="dbc__decoder_8h_source.html#l00075">dbc_decoder.h:75</a></div></div>
@@ -622,11 +631,11 @@ Basic multiplexing</h1>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone"><code>InsufficientPayload</code> </td><td class="markdownTableBodyNone">Selected or unconditional signal bytes are missing </td></tr>
<tr class="markdownTableRowOdd">
<td class="markdownTableBodyNone"><code>InvalidDefinition</code> </td><td class="markdownTableBodyNone">Invalid length, byte order, numeric type, multiplexing role, layout outside declared DLC, or missing/invalid selector in manually built runtime metadata </td></tr>
<td class="markdownTableBodyNone"><code>InvalidDefinition</code> </td><td class="markdownTableBodyNone">Defensive decoder check failed; invalid definitions are rejected during database construction </td></tr>
<tr class="markdownTableRowEven">
<td class="markdownTableBodyNone"><code>PhysicalConversionFailed</code> </td><td class="markdownTableBodyNone">Raw value is available, but the converted physical value is NaN or infinity </td></tr>
</table>
<p>All statuses except <code>Valid</code> have <code>valid == false</code> and <code>GetValueDescription()</code> returns nullptr. <code>PhysicalConversionFailed</code> preserves extracted raw data and the non-finite conversion result; other invalid statuses have no decoded numeric data. Check <code>status</code> to distinguish inactive branches from errors. Consumers constructing runtime metadata manually must obey the same non-overlap rules as the parser. Extended and nested multiplexing are outside this stage and are explicitly rejected, rather than silently decoded as unconditional signals.</p>
<p>All statuses except <code>Valid</code> have <code>valid == false</code> and <code>GetValueDescription()</code> returns nullptr. <code>PhysicalConversionFailed</code> preserves extracted raw data and the non-finite conversion result; other invalid statuses have no decoded numeric data. Check <code>status</code> to distinguish inactive branches from errors. Consumers constructing runtime metadata manually receive the same selector and non-overlap validation as parsed files. Extended and nested multiplexing are outside this stage and are explicitly rejected, rather than silently decoded as unconditional signals.</p>
<hr />
<h1><a class="anchor" id="autotoc_md89"></a>
Comments</h1>
+5
View File
@@ -101,6 +101,8 @@ Unreleased</h1>
<h3><a class="anchor" id="autotoc_md3"></a>
Added</h3>
<ul>
<li>Issue #16: construction-time validation for both manual runtime definitions and <code><a class="el" href="classDbcDecodeBuilder.html" title="Converts parsed DBC data into runtime decode database.">DbcDecodeBuilder</a></code> input: normalized CAN IDs, duplicate keys, signal lengths and positions, enums, finite numeric parameters, ordered ranges, selectors, branch ranges, and overlaps.</li>
<li>Regression tests for both construction paths, numeric and bit boundaries, mixed byte orders, exclusive overlaps, mutable input aliases, and failed reloads.</li>
<li><code>FrameDecodeStatus</code> distinguishes unknown frames, insufficient payloads, signal errors, and successful decoding; frame <code>valid</code> still means matched.</li>
<li><code>SignalDecodeStatus::PhysicalConversionFailed</code> reports NaN/Inf results, retaining exact raw values and the non-finite physical result.</li>
<li>Regression tests for payload-length policy, partial results, invalid runtime metadata, physical overflow/non-finite parameters, and raw branch selection when selector physical conversion fails.</li>
@@ -108,6 +110,9 @@ Added</h3>
<h3><a class="anchor" id="autotoc_md4"></a>
Changed</h3>
<ul>
<li>Runtime construction rejects invalid definitions with <code>std::invalid_argument</code> before publishing a snapshot. Decoder tests now expect construction failures for malformed definitions; finite arithmetic overflow remains a decode status.</li>
<li>Shared overflow-safe layout validation across parsing, construction, and decoding. Intel extraction also widens bit coordinates before arithmetic.</li>
<li><code><a class="el" href="classDecodeDatabase.html" title="Immutable runtime snapshot. Copies share storage; reload replaces a snapshot. Owning lookup handles a...">DecodeDatabase</a></code> now accepts definitions by const reference and copies them, even for rvalues, preventing retained mutable aliases from modifying the frozen snapshot or invalidating its index.</li>
<li>Short payloads decode available signals without padding; longer payloads ignore bytes beyond the declared DLC. Short frame status takes precedence over signal errors, with per-signal causes retained in definition order.</li>
<li>Runtime signal validation checks enum values and bit layouts against declared DLC using overflow-safe coordinates. Extra bytes cannot rescue invalid layouts.</li>
<li>Documented frame/signal status meanings, value availability, and payload policy.</li>
+8 -5
View File
@@ -101,7 +101,7 @@ $(document).ready(function(){initNavTree('md_tests_2README.html',''); initResiza
<div class="line">qmake6 ../dbc.pro</div>
<div class="line">make -j</div>
<div class="line">make check</div>
</div><!-- fragment --><p>Or run <code>./tests/dbc_tests</code> directly. Parser, decoder, lifetime, and additional coverage suites run, and the executable returns nonzero when any suite fails. Decoder cases appear as individual QtTest data rows; parser checks are grouped into named test slots. Checks also run in release builds.</p>
</div><!-- fragment --><p>Or run <code>./tests/dbc_tests</code> directly. Parser, decoder, lifetime, validation, and additional coverage suites run, and the executable returns nonzero when any suite fails. Decoder cases appear as individual QtTest data rows; parser checks are grouped into named test slots. Checks also run in release builds.</p>
<p>To build tests separately against an existing core build:</p>
<div class="fragment"><div class="line">mkdir /tmp/dbc-tests-build</div>
<div class="line">cd /tmp/dbc-tests-build</div>
@@ -109,10 +109,10 @@ $(document).ready(function(){initNavTree('md_tests_2README.html',''); initResiza
<div class="line"> DBC_CORE_BUILD_DIR=/absolute/path/to/build/core</div>
<div class="line">make</div>
<div class="line">make check</div>
</div><!-- fragment --><p><code>parser_tests.pri</code> and <code>decoder_tests.pri</code> include the original test sources; <code>tests.pro</code> also includes <code><a class="el" href="dbc__coverage__test_8cpp_source.html">dbc_coverage_test.cpp</a></code> and <code><a class="el" href="dbc__lifetime__test_8cpp_source.html">dbc_lifetime_test.cpp</a></code>. <code>../core/core.pri</code> supplies the library include path and linkage.</p>
</div><!-- fragment --><p><code>parser_tests.pri</code> and <code>decoder_tests.pri</code> include the original test sources; <code>tests.pro</code> also includes <code><a class="el" href="dbc__coverage__test_8cpp_source.html">dbc_coverage_test.cpp</a></code>, <code><a class="el" href="dbc__lifetime__test_8cpp_source.html">dbc_lifetime_test.cpp</a></code>, and <code><a class="el" href="dbc__validation__test_8cpp_source.html">dbc_validation_test.cpp</a></code>. <code>../core/core.pri</code> supplies the library include path and linkage.</p>
<h1><a class="anchor" id="autotoc_md138"></a>
Decoder coverage</h1>
<p>Coverage includes Motorola bit numbering within and across bytes, unaligned signals, signed values, scaling, 64-bit extraction, signed/unsigned boundary values (including <code>INT64_MIN</code>, <code>INT64_MAX</code>, and <code>UINT64_MAX</code>), numeric output, invalid lengths, insufficient payloads, and Intel regression cases. Frame validity means the definition was found; frame status reports unknown frames, short payloads, and signal errors. Tests exercise empty/short/exact/long payloads, ignored trailing bytes, signals outside declared DLC, invalid enum metadata and overflowing start bits, and preservation of successful signals. Physical conversion checks cover NaN/Inf parameters, multiplication/addition overflow, finite limits, signed/unsigned raw retention, and raw selector activation after physical conversion failure.</p>
<p>Coverage includes Motorola bit numbering within and across bytes, unaligned signals, signed values, scaling, 64-bit extraction, signed/unsigned boundary values (including <code>INT64_MIN</code>, <code>INT64_MAX</code>, and <code>UINT64_MAX</code>), numeric output, invalid lengths, insufficient payloads, and Intel regression cases. Frame validity means the definition was found; frame status reports unknown frames, short payloads, and signal errors. Tests exercise empty/short/exact/long payloads, ignored trailing bytes, signals outside declared DLC, invalid enum metadata and overflowing start bits rejected at construction, and preservation of successful signals on partial payloads. Physical conversion checks cover NaN/Inf parameters rejected at construction, multiplication/addition overflow, finite limits, signed/unsigned raw retention, and raw selector activation after physical conversion failure.</p>
<h1><a class="anchor" id="autotoc_md139"></a>
Parser coverage</h1>
<p>Structured diagnostic tests cover severity, code, supplied path, and physical line numbers for skipped syntax and immediate/deferred errors; warnings preceding an error are retained, and failed parses return an empty database. Common headers and namespace symbol lists stay quiet. Tests also check file-open errors, fresh parse sessions, and compatibility with the legacy throwing API. The diagnostic audit also covers 15 unsupported-statement variants, all namespace termination forms, CRLF and missing final newlines, relative paths with spaces, first-error stopping, deferred diagnostic ordering, duplicate definitions/values, selector ranges, overlaps, and preservation of supported decoding and metadata. On Linux, reading a directory exercises the distinct <code>FileReadError</code> path.</p>
@@ -125,12 +125,15 @@ Tree and optional model tests</h1>
<p>Basic multiplexing coverage includes selector declarations after branches, Intel/Motorola branch overlap, signed active values and VAL_ lookup, unconditional signals, inactive branches, missing selector/branch payloads, exact UINT64_MAX selector matching, malformed runtime selectors, source locations, and rejection of invalid markers, selector references/ranges, overlaps, and SG_MUL_VAL_.</p>
<h1><a class="anchor" id="autotoc_md141"></a>
Additional regression coverage</h1>
<p><code><a class="el" href="dbc__coverage__test_8cpp_source.html">dbc_coverage_test.cpp</a></code> runs as part of <code>dbc_tests</code>. It covers signed boundaries below 64 bits, deterministic extraction comparisons for both byte orders across lengths 1–64, frame lookup failures, exact decode statuses, malformed runtime multiplexing, PGN boundaries, comment handling, file formatting, metadata copying and source lifetime, physical conversion, and <a class="el" href="classTypeFactory.html" title="Registry-based factory for creating objects by runtime identifier.">TypeFactory</a> registration/creation. Direct resolver tests construct ambiguous databases through the public metadata API, verify source locations, and check that ambiguous targets receive no values.</p>
<p><code><a class="el" href="dbc__coverage__test_8cpp_source.html">dbc_coverage_test.cpp</a></code> runs as part of <code>dbc_tests</code>. It covers signed boundaries below 64 bits, deterministic extraction comparisons for both byte orders across lengths 1–64, frame lookup failures, exact decode statuses, construction rejection of malformed runtime multiplexing, PGN boundaries, comment handling, file formatting, metadata copying and source lifetime, physical conversion, and <a class="el" href="classTypeFactory.html" title="Registry-based factory for creating objects by runtime identifier.">TypeFactory</a> registration/creation. Direct resolver tests construct ambiguous databases through the public metadata API, verify source locations, and check that ambiguous targets receive no values.</p>
<p>All QtTest targets use Qt 6.8.2 and <code>QVERIFY_THROWS_EXCEPTION</code>. Exception tests explicitly discard <code>nodiscard</code> results when only the exception is being checked. The standalone tree test requires only a C++17 compiler.</p>
<h1><a class="anchor" id="autotoc_md142"></a>
Definition lifetime and reload coverage</h1>
<p><code><a class="el" href="dbc__lifetime__test_8cpp_source.html">dbc_lifetime_test.cpp</a></code> checks retained definitions and value-description strings across reload, clear, and destruction; independently saved signal results; copied/moved results and database copies; owning lookup handles; and release of the old snapshot after its final owner is removed. Compile-time checks enforce const access to runtime metadata. Reload fixtures change ordering, frame names, scaling, units, and descriptions, remove definitions, and rename signals.</p>
<p>Key tests check equality and hashing, standard/extended separation, the same signal name in different frames, and missing lookups. Constructor tests reject duplicate runtime keys, including manually supplied parsed metadata. Failed reload leaves the active database intact; empty reload clears it. Invalid/unknown results and insufficient payloads retain their documented ownership and status behavior. Inactive branches and unavailable selectors also retain definitions across reload. </p>
<p>Key tests check equality and hashing, standard/extended separation, the same signal name in different frames, and missing lookups. Constructor tests reject duplicate runtime keys, including manually supplied parsed metadata. Failed reload leaves the active database intact; empty reload clears it. Invalid/unknown results and insufficient payloads retain their documented ownership and status behavior. Inactive branches and unavailable selectors also retain definitions across reload.</p>
<h1><a class="anchor" id="autotoc_md143"></a>
Database validation coverage</h1>
<p><code><a class="el" href="dbc__validation__test_8cpp_source.html">dbc_validation_test.cpp</a></code> checks direct construction and manually assembled <code><a class="el" href="structDbcDatabase.html" title="Parsed DBC content stored in a simple internal form.">DbcDatabase</a></code> input to <code><a class="el" href="classDbcDecodeBuilder.html" title="Converts parsed DBC data into runtime decode database.">DbcDecodeBuilder</a></code>: standard/extended CAN ID limits, encoded/reserved ID bits, duplicate keys, lengths 0/1–64/65/UINT32_MAX, Intel/Motorola payload boundaries and overflowing start bits, invalid enums, NaN and both infinities in every numeric parameter, and reversed physical ranges. Selector tests include missing, duplicate, and signed selectors, branch ranges, UINT64_MAX selection, mixed-order overlaps, and exclusive branches sharing bits. Valid definitions cover the full byte-count storage range, including zero-byte frames without signals and 255-byte frames. Existing extraction tests cover lengths 1–64. Snapshot tests mutate retained frame, signal, and description aliases after rvalue construction, and verify unchanged lookups and metadata. Failed constructor/builder replacement preserves the active snapshot; clear removes its index while saved handles remain alive. </p>
</div></div><!-- contents -->
</div><!-- PageDoc -->
</div><!-- doc-content -->
+3 -2
View File
@@ -149,7 +149,8 @@ var NAVTREE =
[ "Parser coverage", "md_tests_2README.html#autotoc_md139", null ],
[ "Tree and optional model tests", "md_tests_2README.html#autotoc_md140", null ],
[ "Additional regression coverage", "md_tests_2README.html#autotoc_md141", null ],
[ "Definition lifetime and reload coverage", "md_tests_2README.html#autotoc_md142", null ]
[ "Definition lifetime and reload coverage", "md_tests_2README.html#autotoc_md142", null ],
[ "Database validation coverage", "md_tests_2README.html#autotoc_md143", null ]
] ],
[ "Classes", "annotated.html", [
[ "Class List", "annotated.html", "annotated_dup" ],
@@ -174,7 +175,7 @@ var NAVTREE =
var NAVTREEINDEX =
[
"annotated.html",
"structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978"
"structDecodedSignalValue.html"
];
var SYNCONMSG = 'click to disable panel synchronisation';
+5 -5
View File
@@ -23,9 +23,9 @@ var NAVTREEINDEX0 =
"classDbcUnsupportedMultiplexingHandler.html":[3,0,16],
"classDbcValueDescriptionHandler.html":[3,0,17],
"classDecodeDatabase.html":[3,0,18],
"classDecodeDatabase.html#a51a44cf7c3f23c98ec8781afe0097c0c":[3,0,18,0],
"classDecodeDatabase.html#a780d6e747a48b10a5eb0ab85448d2970":[3,0,18,2],
"classDecodeDatabase.html#aa034c1510984a85f60ad6c0bd744d6e8":[3,0,18,1],
"classDecodeDatabase.html#aa935a3a0d334f932d6a8c89a3818286a":[3,0,18,0],
"classTreeNode.html":[3,0,32],
"classTreeNode.html#a226518612d0d00b5988a2c44fc21d3f1":[3,0,32,12],
"classTreeNode.html#a4727ff801a2d1b9323c5ae50a35457a6":[3,0,32,7],
@@ -79,6 +79,7 @@ var NAVTREEINDEX0 =
"dbc__tree__model_8cpp_source.html":[4,0,2,0],
"dbc__tree__model_8h_source.html":[4,0,2,1],
"dbc__tree__model__test_8cpp_source.html":[4,0,3,4],
"dbc__validation__test_8cpp_source.html":[4,0,3,5],
"decode__database_8cpp_source.html":[4,0,0,12],
"decode__database_8h.html":[4,0,0,13],
"decode__database_8h.html#aaeb92d42f5a6e27b8ba19f18d69d142b":[4,0,0,13,3],
@@ -208,10 +209,12 @@ var NAVTREEINDEX0 =
"md_tests_2README.html#autotoc_md140":[2,2],
"md_tests_2README.html#autotoc_md141":[2,3],
"md_tests_2README.html#autotoc_md142":[2,4],
"md_tests_2README.html#autotoc_md143":[2,5],
"multiplexing_8h_source.html":[4,0,0,16],
"pages.html":[],
"signal__info_8h.html":[4,0,0,17],
"signal__info_8h_source.html":[4,0,0,17],
"signal__layout_8h_source.html":[4,0,0,18],
"structDbcDatabase.html":[3,0,1],
"structDbcDatabase.html#a2cade5d0234ee816132127542f8c612b":[3,0,1,0],
"structDbcDiagnostic.html":[3,0,4],
@@ -246,8 +249,5 @@ var NAVTREEINDEX0 =
"structDecodedFrameValue.html#a33e971ba10030506007aa201c89f351d":[3,0,19,0],
"structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0":[3,0,19,3],
"structDecodedFrameValue.html#a645f433798d48a2787e7f00dfbb7dff9":[3,0,19,4],
"structDecodedFrameValue.html#adae123ac7fbb4a5c314b64b01109f4a8":[3,0,19,2],
"structDecodedSignalValue.html":[3,0,20],
"structDecodedSignalValue.html#a33df0fcd92b23b3e08539906fc6b4c4a":[3,0,20,2],
"structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28":[3,0,20,3]
"structDecodedFrameValue.html#adae123ac7fbb4a5c314b64b01109f4a8":[3,0,19,2]
};
+16 -13
View File
@@ -1,5 +1,8 @@
var NAVTREEINDEX1 =
{
"structDecodedSignalValue.html":[3,0,20],
"structDecodedSignalValue.html#a33df0fcd92b23b3e08539906fc6b4c4a":[3,0,20,2],
"structDecodedSignalValue.html#a503c90b4b1a610b8252c45e466367c28":[3,0,20,3],
"structDecodedSignalValue.html#a6847d05b3cb00d5e0f6c611968f57978":[3,0,20,4],
"structDecodedSignalValue.html#a828b5ef7faefc14fbf5dbd46249bcad2":[3,0,20,1],
"structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686":[3,0,20,5],
@@ -38,17 +41,17 @@ var NAVTREEINDEX1 =
"structSignalInfo.html#af363b1563fb4c7cc8973f9a80c06846c":[3,0,29,3],
"structSignalKey.html":[3,0,30],
"structSignalKeyHasher.html":[3,0,31],
"tests_2main_8cpp_source.html":[4,0,3,5],
"text__utils_8h_source.html":[4,0,0,18],
"tree__node_8cpp.html":[4,0,0,19],
"tree__node_8cpp_source.html":[4,0,0,19],
"tree__node_8h.html":[4,0,0,20],
"tree__node_8h.html#acac9cbaeea226ed297804c012dc12b16":[4,0,0,20,1],
"tree__node_8h.html#acac9cbaeea226ed297804c012dc12b16a085fea7abdc5d904fe69a3081efd7398":[4,0,0,20,1,2],
"tree__node_8h.html#acac9cbaeea226ed297804c012dc12b16a3bb3e8c8a24891ba0f7608bcc96f8b0a":[4,0,0,20,1,1],
"tree__node_8h.html#acac9cbaeea226ed297804c012dc12b16afa03eb688ad8aa1db593d33dabd89bad":[4,0,0,20,1,0],
"tree__node_8h_source.html":[4,0,0,20],
"tree__node__test_8cpp_source.html":[4,0,3,6],
"typefactory_8h_source.html":[4,0,0,21],
"value__descriptions_8h_source.html":[4,0,0,22]
"tests_2main_8cpp_source.html":[4,0,3,6],
"text__utils_8h_source.html":[4,0,0,19],
"tree__node_8cpp.html":[4,0,0,20],
"tree__node_8cpp_source.html":[4,0,0,20],
"tree__node_8h.html":[4,0,0,21],
"tree__node_8h.html#acac9cbaeea226ed297804c012dc12b16":[4,0,0,21,1],
"tree__node_8h.html#acac9cbaeea226ed297804c012dc12b16a085fea7abdc5d904fe69a3081efd7398":[4,0,0,21,1,2],
"tree__node_8h.html#acac9cbaeea226ed297804c012dc12b16a3bb3e8c8a24891ba0f7608bcc96f8b0a":[4,0,0,21,1,1],
"tree__node_8h.html#acac9cbaeea226ed297804c012dc12b16afa03eb688ad8aa1db593d33dabd89bad":[4,0,0,21,1,0],
"tree__node_8h_source.html":[4,0,0,21],
"tree__node__test_8cpp_source.html":[4,0,3,7],
"typefactory_8h_source.html":[4,0,0,22],
"value__descriptions_8h_source.html":[4,0,0,23]
};
+7 -6
View File
@@ -4,10 +4,11 @@ var searchData=
['val_5f_20tt_1',['Signal value descriptions (&lt;tt&gt;VAL_&lt;/tt&gt;)',['../md_README.html#autotoc_md115',1,'']]],
['valid_2',['valid',['../structDecodedSignalValue.html#aac0ed361af545cde48d0e6f41a859686',1,'DecodedSignalValue::valid'],['../structDecodedFrameValue.html#a4f51c31110dba1f73a763c596372beb0',1,'DecodedFrameValue::valid']]],
['validation_20and_20parse_20errors_3',['validation and parse errors',['../md_README.html#autotoc_md81',1,'Frame validation and parse errors'],['../md_README.html#autotoc_md85',1,'Signal validation and parse errors']]],
['value_20descriptions_20tt_20val_5f_20tt_4',['Signal value descriptions (&lt;tt&gt;VAL_&lt;/tt&gt;)',['../md_README.html#autotoc_md115',1,'']]],
['value_20representation_20and_20precision_5',['Raw value representation and precision',['../md_README.html#autotoc_md67',1,'']]],
['valuedescriptions_6',['valuedescriptions',['../structDecodeSignal.html#a822155d9bf4ed5f3300c9e9befe606ff',1,'DecodeSignal::valueDescriptions'],['../structSignalInfo.html#a43f47d0433d0cc39076bd7278b46af9c',1,'SignalInfo::valueDescriptions']]],
['valuetype_7',['valuetype',['../structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8',1,'DecodeSignal::valueType'],['../decode__database_8h.html#ad9971b6ef33e02ba2c75d19c1d2518a1',1,'ValueType:&#160;decode_database.h']]],
['valuetype_20tt_8',['&lt;tt&gt;ValueType&lt;/tt&gt;',['../md_README.html#autotoc_md52',1,'']]],
['variants_20in_20qt_20creator_9',['Configure all build variants in Qt Creator',['../md_README.html#autotoc_md136',1,'']]]
['validation_20coverage_4',['Database validation coverage',['../md_tests_2README.html#autotoc_md143',1,'']]],
['value_20descriptions_20tt_20val_5f_20tt_5',['Signal value descriptions (&lt;tt&gt;VAL_&lt;/tt&gt;)',['../md_README.html#autotoc_md115',1,'']]],
['value_20representation_20and_20precision_6',['Raw value representation and precision',['../md_README.html#autotoc_md67',1,'']]],
['valuedescriptions_7',['valuedescriptions',['../structDecodeSignal.html#a822155d9bf4ed5f3300c9e9befe606ff',1,'DecodeSignal::valueDescriptions'],['../structSignalInfo.html#a43f47d0433d0cc39076bd7278b46af9c',1,'SignalInfo::valueDescriptions']]],
['valuetype_8',['valuetype',['../structDecodeSignal.html#a9d37638129263b8902ba5be59baf39a8',1,'DecodeSignal::valueType'],['../decode__database_8h.html#ad9971b6ef33e02ba2c75d19c1d2518a1',1,'ValueType:&#160;decode_database.h']]],
['valuetype_20tt_9',['&lt;tt&gt;ValueType&lt;/tt&gt;',['../md_README.html#autotoc_md52',1,'']]],
['variants_20in_20qt_20creator_10',['Configure all build variants in Qt Creator',['../md_README.html#autotoc_md136',1,'']]]
];
+3 -3
View File
@@ -2,16 +2,16 @@ var searchData=
[
['can_20id_20normalization_0',['CAN ID Normalization',['../md_README.html#autotoc_md91',1,'']]],
['canid_1',['canid',['../structDecodeFrame.html#a52e10215388db7df8b541b9d9909edcf',1,'DecodeFrame::canId'],['../structFrameInfo.html#af470b0742c05bfbffc31c51a68f5c05e',1,'FrameInfo::canId'],['../structRawCanFrame.html#a2d0e7fa0e3d5c20bbed55ed8f7888ff4',1,'RawCanFrame::canId']]],
['changed_2',['changed',['../md_changelog.html#autotoc_md19',1,'Changed'],['../md_changelog.html#autotoc_md15',1,'Changed'],['../md_changelog.html#autotoc_md10',1,'Changed'],['../md_changelog.html#autotoc_md7',1,'Changed'],['../md_changelog.html#autotoc_md4',1,'Changed']]],
['changed_2',['changed',['../md_changelog.html#autotoc_md4',1,'Changed'],['../md_changelog.html#autotoc_md7',1,'Changed'],['../md_changelog.html#autotoc_md10',1,'Changed'],['../md_changelog.html#autotoc_md15',1,'Changed'],['../md_changelog.html#autotoc_md19',1,'Changed']]],
['changelog_3',['Changelog',['../md_changelog.html',1,'']]],
['code_20coverage_4',['Measuring code coverage',['../md_README.html#autotoc_md133',1,'']]],
['comment_5',['comment',['../structSignalInfo.html#ac99ba7563a5dad01e39c4257216953f5',1,'SignalInfo::comment'],['../structFrameInfo.html#ace75121294f9d89b762080ab5643293c',1,'FrameInfo::comment'],['../structDecodeFrame.html#a25819ef907a32391af5c9f7cae9cdb22',1,'DecodeFrame::comment'],['../structDecodeSignal.html#ae28c905d4a2bc86419c2a8361bfea473',1,'DecodeSignal::comment']]],
['comment_5',['comment',['../structDecodeSignal.html#ae28c905d4a2bc86419c2a8361bfea473',1,'DecodeSignal::comment'],['../structDecodeFrame.html#a25819ef907a32391af5c9f7cae9cdb22',1,'DecodeFrame::comment'],['../structFrameInfo.html#ace75121294f9d89b762080ab5643293c',1,'FrameInfo::comment'],['../structSignalInfo.html#ac99ba7563a5dad01e39c4257216953f5',1,'SignalInfo::comment']]],
['comments_6',['Comments',['../md_README.html#autotoc_md89',1,'']]],
['configure_20all_20build_20variants_20in_20qt_20creator_7',['Configure all build variants in Qt Creator',['../md_README.html#autotoc_md136',1,'']]],
['configure_20the_20gcc_20coverage_20build_20in_20qt_20creator_8',['Configure the GCC coverage build in Qt Creator',['../md_README.html#autotoc_md135',1,'']]],
['contains_9',['contains',['../classTypeFactory.html#a1a119ad2956abe146213c6ca124d8dd4',1,'TypeFactory']]],
['core_20without_20qt_20libraries_10',['Build core without Qt libraries',['../md_README.html#autotoc_md126',1,'']]],
['coverage_11',['coverage',['../md_tests_2README.html#autotoc_md141',1,'Additional regression coverage'],['../md_tests_2README.html#autotoc_md138',1,'Decoder coverage'],['../md_tests_2README.html#autotoc_md142',1,'Definition lifetime and reload coverage'],['../md_README.html#autotoc_md133',1,'Measuring code coverage'],['../md_tests_2README.html#autotoc_md139',1,'Parser coverage']]],
['coverage_11',['coverage',['../md_tests_2README.html#autotoc_md141',1,'Additional regression coverage'],['../md_tests_2README.html#autotoc_md143',1,'Database validation coverage'],['../md_tests_2README.html#autotoc_md138',1,'Decoder coverage'],['../md_tests_2README.html#autotoc_md142',1,'Definition lifetime and reload coverage'],['../md_README.html#autotoc_md133',1,'Measuring code coverage'],['../md_tests_2README.html#autotoc_md139',1,'Parser coverage']]],
['coverage_20build_20in_20qt_20creator_12',['Configure the GCC coverage build in Qt Creator',['../md_README.html#autotoc_md135',1,'']]],
['create_13',['create',['../classTypeFactory.html#a3f43b03d6e3a0fd503fdec01ecf62e9f',1,'TypeFactory']]],
['creator_14',['creator',['../md_README.html#autotoc_md136',1,'Configure all build variants in Qt Creator'],['../md_README.html#autotoc_md135',1,'Configure the GCC coverage build in Qt Creator'],['../classTypeFactory.html#ad82f537569ece3d3a4a376523fa94473',1,'TypeFactory::creator()']]],
+66 -65
View File
@@ -3,69 +3,70 @@ var searchData=
['data_0',['data',['../structRawCanFrame.html#a0acb487612104c99c9907344c035df83',1,'RawCanFrame']]],
['data_20structures_1',['Parsed Data Structures',['../md_README.html#autotoc_md37',1,'']]],
['database_2',['Build runtime decode database',['../md_README.html#autotoc_md102',1,'']]],
['dbc_3',['Parse DBC',['../md_README.html#autotoc_md100',1,'']]],
['dbc_20parser_20and_20runtime_20decode_20module_20documentation_4',['DBC Parser and Runtime Decode Module Documentation',['../md_README.html',1,'']]],
['dbc_20syntax_5',['Supported DBC Syntax',['../md_README.html#autotoc_md78',1,'']]],
['dbc_5fdatabase_2eh_6',['dbc_database.h',['../dbc__database_8h.html',1,'']]],
['dbc_5fdecode_5fbuilder_2ecpp_7',['dbc_decode_builder.cpp',['../dbc__decode__builder_8cpp.html',1,'']]],
['dbc_5fdecode_5fbuilder_2eh_8',['dbc_decode_builder.h',['../dbc__decode__builder_8h.html',1,'']]],
['dbc_5fdecoder_2ecpp_9',['dbc_decoder.cpp',['../dbc__decoder_8cpp.html',1,'']]],
['dbc_5fdecoder_2eh_10',['dbc_decoder.h',['../dbc__decoder_8h.html',1,'']]],
['dbc_5fparser_2ecpp_11',['dbc_parser.cpp',['../dbc__parser_8cpp.html',1,'']]],
['dbc_5fparser_2eh_12',['dbc_parser.h',['../dbc__parser_8h.html',1,'']]],
['dbc_5ftree_5fbuilder_2ecpp_13',['dbc_tree_builder.cpp',['../dbc__tree__builder_8cpp.html',1,'']]],
['dbc_5ftree_5fbuilder_2eh_14',['dbc_tree_builder.h',['../dbc__tree__builder_8h.html',1,'']]],
['dbccommenthandler_15',['DbcCommentHandler',['../classDbcCommentHandler.html',1,'']]],
['dbcdatabase_16',['DbcDatabase',['../structDbcDatabase.html',1,'']]],
['dbcdatabase_20tt_17',['&lt;tt&gt;DbcDatabase&lt;/tt&gt;',['../md_README.html#autotoc_md42',1,'']]],
['dbcdecodebuilder_18',['DbcDecodeBuilder',['../classDbcDecodeBuilder.html',1,'']]],
['dbcdecoder_19',['DbcDecoder',['../classDbcDecoder.html',1,'']]],
['dbcdecoder_20tt_20',['&lt;tt&gt;DbcDecoder&lt;/tt&gt;',['../md_README.html#autotoc_md73',1,'']]],
['dbcdiagnostic_21',['DbcDiagnostic',['../structDbcDiagnostic.html',1,'']]],
['dbcdiagnosticerror_22',['DbcDiagnosticError',['../classDbcDiagnosticError.html',1,'']]],
['dbcframehandler_23',['DbcFrameHandler',['../classDbcFrameHandler.html',1,'']]],
['dbcheaderhandler_24',['DbcHeaderHandler',['../classDbcHeaderHandler.html',1,'']]],
['dbcparsecontext_25',['DbcParseContext',['../structDbcParseContext.html',1,'']]],
['dbcparser_26',['DbcParser',['../classDbcParser.html',1,'']]],
['dbcparseresult_27',['DbcParseResult',['../structDbcParseResult.html',1,'']]],
['dbcsignalhandler_28',['DbcSignalHandler',['../classDbcSignalHandler.html',1,'']]],
['dbcstatementdispatcher_29',['DbcStatementDispatcher',['../classDbcStatementDispatcher.html',1,'']]],
['dbcstatementhandler_30',['DbcStatementHandler',['../classDbcStatementHandler.html',1,'']]],
['dbctreebuilder_31',['DbcTreeBuilder',['../classDbcTreeBuilder.html',1,'']]],
['dbctreemodel_32',['DbcTreeModel',['../classDbcTreeModel.html',1,'']]],
['dbcunsupportedmultiplexinghandler_33',['DbcUnsupportedMultiplexingHandler',['../classDbcUnsupportedMultiplexingHandler.html',1,'']]],
['dbcvaluedescriptionhandler_34',['DbcValueDescriptionHandler',['../classDbcValueDescriptionHandler.html',1,'']]],
['debian_20ubuntu_35',['GCC, gcov, and LCOV on Debian/Ubuntu',['../md_README.html#autotoc_md134',1,'']]],
['decode_36',['Decode',['../classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7',1,'DbcDecoder']]],
['decode_20a_20raw_20frame_37',['Decode a raw frame',['../md_README.html#autotoc_md103',1,'']]],
['decode_20database_38',['Build runtime decode database',['../md_README.html#autotoc_md102',1,'']]],
['decode_20flow_39',['Decode Flow',['../md_README.html#autotoc_md95',1,'']]],
['decode_20layer_40',['Runtime Decode Layer',['../md_README.html#autotoc_md47',1,'']]],
['decode_20layer_20exists_41',['Why the Runtime Decode Layer Exists',['../md_README.html#autotoc_md33',1,'']]],
['decode_20module_20documentation_42',['DBC Parser and Runtime Decode Module Documentation',['../md_README.html',1,'']]],
['decode_20path_43',['2. Runtime decode path',['../md_README.html#autotoc_md31',1,'']]],
['decode_20strategy_44',['Unified Decode Strategy',['../md_README.html#autotoc_md105',1,'']]],
['decode_5fdatabase_2eh_45',['decode_database.h',['../decode__database_8h.html',1,'']]],
['decodedatabase_46',['decodedatabase',['../classDecodeDatabase.html',1,'DecodeDatabase'],['../classDecodeDatabase.html#aa935a3a0d334f932d6a8c89a3818286a',1,'DecodeDatabase::DecodeDatabase()']]],
['decodedatabase_20tt_47',['&lt;tt&gt;DecodeDatabase&lt;/tt&gt;',['../md_README.html#autotoc_md60',1,'']]],
['decodedframevalue_48',['DecodedFrameValue',['../structDecodedFrameValue.html',1,'']]],
['decodedframevalue_20tt_49',['&lt;tt&gt;DecodedFrameValue&lt;/tt&gt;',['../md_README.html#autotoc_md69',1,'']]],
['decodedsignalvalue_50',['DecodedSignalValue',['../structDecodedSignalValue.html',1,'']]],
['decodedsignalvalue_20tt_51',['&lt;tt&gt;DecodedSignalValue&lt;/tt&gt;',['../md_README.html#autotoc_md65',1,'']]],
['decodeframe_52',['DecodeFrame',['../structDecodeFrame.html',1,'']]],
['decodeframe_20tt_53',['&lt;tt&gt;DecodeFrame&lt;/tt&gt;',['../md_README.html#autotoc_md56',1,'']]],
['decoder_20coverage_54',['Decoder coverage',['../md_tests_2README.html#autotoc_md138',1,'']]],
['decoder_20layer_55',['Decoder Layer',['../md_README.html#autotoc_md62',1,'']]],
['decodesignal_56',['DecodeSignal',['../structDecodeSignal.html',1,'']]],
['decodesignal_20tt_57',['&lt;tt&gt;DecodeSignal&lt;/tt&gt;',['../md_README.html#autotoc_md54',1,'']]],
['definition_58',['definition',['../structDecodedFrameValue.html#a33e971ba10030506007aa201c89f351d',1,'DecodedFrameValue::definition'],['../structDecodedSignalValue.html#a828b5ef7faefc14fbf5dbd46249bcad2',1,'DecodedSignalValue::definition'],['../md_README.html#autotoc_md79',1,'Frame definition'],['../md_README.html#autotoc_md83',1,'Signal definition']]],
['definition_20lifetime_20and_20reload_20coverage_59',['Definition lifetime and reload coverage',['../md_tests_2README.html#autotoc_md142',1,'']]],
['definition_20ownership_20and_20reload_60',['Definition ownership and reload',['../md_README.html#autotoc_md70',1,'']]],
['demo_61',['Build and run the demo',['../md_README.html#autotoc_md129',1,'']]],
['descriptions_20tt_20val_5f_20tt_62',['Signal value descriptions (&lt;tt&gt;VAL_&lt;/tt&gt;)',['../md_README.html#autotoc_md115',1,'']]],
['diagnostics_63',['Structured diagnostics',['../md_README.html#autotoc_md76',1,'']]],
['dispatch_64',['Dispatch',['../classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed',1,'DbcStatementDispatcher']]],
['dlc_65',['dlc',['../structFrameInfo.html#aa2b198ea0f55e560c123d35e7b3ecab9',1,'FrameInfo::dlc'],['../structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060',1,'DecodeFrame::dlc']]],
['documentation_66',['documentation',['../md_README.html',1,'DBC Parser and Runtime Decode Module Documentation'],['../md_changelog.html#autotoc_md22',1,'Documentation'],['../md_README.html#autotoc_md130',1,'Generate API documentation']]],
['documentation_20and_20maintenance_67',['documentation and maintenance',['../md_changelog.html#autotoc_md25',1,'Documentation and maintenance'],['../md_changelog.html#autotoc_md17',1,'Documentation and maintenance']]]
['database_20validation_20coverage_3',['Database validation coverage',['../md_tests_2README.html#autotoc_md143',1,'']]],
['dbc_4',['Parse DBC',['../md_README.html#autotoc_md100',1,'']]],
['dbc_20parser_20and_20runtime_20decode_20module_20documentation_5',['DBC Parser and Runtime Decode Module Documentation',['../md_README.html',1,'']]],
['dbc_20syntax_6',['Supported DBC Syntax',['../md_README.html#autotoc_md78',1,'']]],
['dbc_5fdatabase_2eh_7',['dbc_database.h',['../dbc__database_8h.html',1,'']]],
['dbc_5fdecode_5fbuilder_2ecpp_8',['dbc_decode_builder.cpp',['../dbc__decode__builder_8cpp.html',1,'']]],
['dbc_5fdecode_5fbuilder_2eh_9',['dbc_decode_builder.h',['../dbc__decode__builder_8h.html',1,'']]],
['dbc_5fdecoder_2ecpp_10',['dbc_decoder.cpp',['../dbc__decoder_8cpp.html',1,'']]],
['dbc_5fdecoder_2eh_11',['dbc_decoder.h',['../dbc__decoder_8h.html',1,'']]],
['dbc_5fparser_2ecpp_12',['dbc_parser.cpp',['../dbc__parser_8cpp.html',1,'']]],
['dbc_5fparser_2eh_13',['dbc_parser.h',['../dbc__parser_8h.html',1,'']]],
['dbc_5ftree_5fbuilder_2ecpp_14',['dbc_tree_builder.cpp',['../dbc__tree__builder_8cpp.html',1,'']]],
['dbc_5ftree_5fbuilder_2eh_15',['dbc_tree_builder.h',['../dbc__tree__builder_8h.html',1,'']]],
['dbccommenthandler_16',['DbcCommentHandler',['../classDbcCommentHandler.html',1,'']]],
['dbcdatabase_17',['DbcDatabase',['../structDbcDatabase.html',1,'']]],
['dbcdatabase_20tt_18',['&lt;tt&gt;DbcDatabase&lt;/tt&gt;',['../md_README.html#autotoc_md42',1,'']]],
['dbcdecodebuilder_19',['DbcDecodeBuilder',['../classDbcDecodeBuilder.html',1,'']]],
['dbcdecoder_20',['DbcDecoder',['../classDbcDecoder.html',1,'']]],
['dbcdecoder_20tt_21',['&lt;tt&gt;DbcDecoder&lt;/tt&gt;',['../md_README.html#autotoc_md73',1,'']]],
['dbcdiagnostic_22',['DbcDiagnostic',['../structDbcDiagnostic.html',1,'']]],
['dbcdiagnosticerror_23',['DbcDiagnosticError',['../classDbcDiagnosticError.html',1,'']]],
['dbcframehandler_24',['DbcFrameHandler',['../classDbcFrameHandler.html',1,'']]],
['dbcheaderhandler_25',['DbcHeaderHandler',['../classDbcHeaderHandler.html',1,'']]],
['dbcparsecontext_26',['DbcParseContext',['../structDbcParseContext.html',1,'']]],
['dbcparser_27',['DbcParser',['../classDbcParser.html',1,'']]],
['dbcparseresult_28',['DbcParseResult',['../structDbcParseResult.html',1,'']]],
['dbcsignalhandler_29',['DbcSignalHandler',['../classDbcSignalHandler.html',1,'']]],
['dbcstatementdispatcher_30',['DbcStatementDispatcher',['../classDbcStatementDispatcher.html',1,'']]],
['dbcstatementhandler_31',['DbcStatementHandler',['../classDbcStatementHandler.html',1,'']]],
['dbctreebuilder_32',['DbcTreeBuilder',['../classDbcTreeBuilder.html',1,'']]],
['dbctreemodel_33',['DbcTreeModel',['../classDbcTreeModel.html',1,'']]],
['dbcunsupportedmultiplexinghandler_34',['DbcUnsupportedMultiplexingHandler',['../classDbcUnsupportedMultiplexingHandler.html',1,'']]],
['dbcvaluedescriptionhandler_35',['DbcValueDescriptionHandler',['../classDbcValueDescriptionHandler.html',1,'']]],
['debian_20ubuntu_36',['GCC, gcov, and LCOV on Debian/Ubuntu',['../md_README.html#autotoc_md134',1,'']]],
['decode_37',['Decode',['../classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7',1,'DbcDecoder']]],
['decode_20a_20raw_20frame_38',['Decode a raw frame',['../md_README.html#autotoc_md103',1,'']]],
['decode_20database_39',['Build runtime decode database',['../md_README.html#autotoc_md102',1,'']]],
['decode_20flow_40',['Decode Flow',['../md_README.html#autotoc_md95',1,'']]],
['decode_20layer_41',['Runtime Decode Layer',['../md_README.html#autotoc_md47',1,'']]],
['decode_20layer_20exists_42',['Why the Runtime Decode Layer Exists',['../md_README.html#autotoc_md33',1,'']]],
['decode_20module_20documentation_43',['DBC Parser and Runtime Decode Module Documentation',['../md_README.html',1,'']]],
['decode_20path_44',['2. Runtime decode path',['../md_README.html#autotoc_md31',1,'']]],
['decode_20strategy_45',['Unified Decode Strategy',['../md_README.html#autotoc_md105',1,'']]],
['decode_5fdatabase_2eh_46',['decode_database.h',['../decode__database_8h.html',1,'']]],
['decodedatabase_47',['decodedatabase',['../classDecodeDatabase.html',1,'DecodeDatabase'],['../classDecodeDatabase.html#a51a44cf7c3f23c98ec8781afe0097c0c',1,'DecodeDatabase::DecodeDatabase()']]],
['decodedatabase_20tt_48',['&lt;tt&gt;DecodeDatabase&lt;/tt&gt;',['../md_README.html#autotoc_md60',1,'']]],
['decodedframevalue_49',['DecodedFrameValue',['../structDecodedFrameValue.html',1,'']]],
['decodedframevalue_20tt_50',['&lt;tt&gt;DecodedFrameValue&lt;/tt&gt;',['../md_README.html#autotoc_md69',1,'']]],
['decodedsignalvalue_51',['DecodedSignalValue',['../structDecodedSignalValue.html',1,'']]],
['decodedsignalvalue_20tt_52',['&lt;tt&gt;DecodedSignalValue&lt;/tt&gt;',['../md_README.html#autotoc_md65',1,'']]],
['decodeframe_53',['DecodeFrame',['../structDecodeFrame.html',1,'']]],
['decodeframe_20tt_54',['&lt;tt&gt;DecodeFrame&lt;/tt&gt;',['../md_README.html#autotoc_md56',1,'']]],
['decoder_20coverage_55',['Decoder coverage',['../md_tests_2README.html#autotoc_md138',1,'']]],
['decoder_20layer_56',['Decoder Layer',['../md_README.html#autotoc_md62',1,'']]],
['decodesignal_57',['DecodeSignal',['../structDecodeSignal.html',1,'']]],
['decodesignal_20tt_58',['&lt;tt&gt;DecodeSignal&lt;/tt&gt;',['../md_README.html#autotoc_md54',1,'']]],
['definition_59',['definition',['../structDecodedFrameValue.html#a33e971ba10030506007aa201c89f351d',1,'DecodedFrameValue::definition'],['../structDecodedSignalValue.html#a828b5ef7faefc14fbf5dbd46249bcad2',1,'DecodedSignalValue::definition'],['../md_README.html#autotoc_md79',1,'Frame definition'],['../md_README.html#autotoc_md83',1,'Signal definition']]],
['definition_20lifetime_20and_20reload_20coverage_60',['Definition lifetime and reload coverage',['../md_tests_2README.html#autotoc_md142',1,'']]],
['definition_20ownership_20and_20reload_61',['Definition ownership and reload',['../md_README.html#autotoc_md70',1,'']]],
['demo_62',['Build and run the demo',['../md_README.html#autotoc_md129',1,'']]],
['descriptions_20tt_20val_5f_20tt_63',['Signal value descriptions (&lt;tt&gt;VAL_&lt;/tt&gt;)',['../md_README.html#autotoc_md115',1,'']]],
['diagnostics_64',['Structured diagnostics',['../md_README.html#autotoc_md76',1,'']]],
['dispatch_65',['Dispatch',['../classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed',1,'DbcStatementDispatcher']]],
['dlc_66',['dlc',['../structDecodeFrame.html#a51111ac13988be372d5673d12cf3e060',1,'DecodeFrame::dlc'],['../structFrameInfo.html#aa2b198ea0f55e560c123d35e7b3ecab9',1,'FrameInfo::dlc']]],
['documentation_67',['documentation',['../md_README.html',1,'DBC Parser and Runtime Decode Module Documentation'],['../md_changelog.html#autotoc_md22',1,'Documentation'],['../md_README.html#autotoc_md130',1,'Generate API documentation']]],
['documentation_20and_20maintenance_68',['documentation and maintenance',['../md_changelog.html#autotoc_md17',1,'Documentation and maintenance'],['../md_changelog.html#autotoc_md25',1,'Documentation and maintenance']]]
];
+1 -1
View File
@@ -1,6 +1,6 @@
var searchData=
[
['decode_0',['Decode',['../classDbcDecoder.html#a345951ffe5d943a70d3a1ea1f39e74f7',1,'DbcDecoder']]],
['decodedatabase_1',['DecodeDatabase',['../classDecodeDatabase.html#aa935a3a0d334f932d6a8c89a3818286a',1,'DecodeDatabase']]],
['decodedatabase_1',['DecodeDatabase',['../classDecodeDatabase.html#a51a44cf7c3f23c98ec8781afe0097c0c',1,'DecodeDatabase']]],
['dispatch_2',['Dispatch',['../classDbcStatementDispatcher.html#a495c2d5c7ebb8103b1987cdd87c142ed',1,'DbcStatementDispatcher']]]
];
+129
View File
@@ -0,0 +1,129 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>DBC Framework: signal_layout.h Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectalign">
<div id="projectname">DBC Framework
</div>
<div id="projectbrief">DBC parsing and CAN signal decoding framework</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.8 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function() { init_codefold(0); });
/* @license-end */
</script>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
<div id="nav-tree">
<div id="nav-tree-contents">
<div id="nav-sync" class="sync"></div>
</div>
</div>
<div id="splitbar" style="-moz-user-select:none;"
class="ui-resizable-handle">
</div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('signal__layout_8h_source.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div class="header">
<div class="headertitle"><div class="title">signal_layout.h</div></div>
</div><!--header-->
<div class="contents">
<div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">// SPDX-License-Identifier: MIT</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="preprocessor">#ifndef SIGNAL_LAYOUT_H</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="preprocessor">#define SIGNAL_LAYOUT_H</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span> </div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="preprocessor">#include &lt;cstdint&gt;</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span> </div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="keyword">inline</span> std::uint64_t SignalStartCoordinate(std::uint32_t startBit, <span class="keywordtype">bool</span> littleEndian) {</div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span> <span class="keywordflow">return</span> littleEndian ? std::uint64_t(startBit)</div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span> : std::uint64_t(startBit / 8U) * 8U + 7U - startBit % 8U;</div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span>}</div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span> </div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="keyword">inline</span> <span class="keywordtype">bool</span> IsValidSignalLayout(std::uint32_t startBit, std::uint32_t length,</div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span> <span class="keywordtype">bool</span> littleEndian, std::uint8_t dlc) {</div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> <span class="keywordflow">return</span> length &gt;= 1U &amp;&amp; length &lt;= 64U &amp;&amp;</div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> SignalStartCoordinate(startBit, littleEndian) + length &lt;= std::uint64_t(dlc) * 8U;</div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span>}</div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> </div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#endif</span></div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
<ul>
<li class="navelem"><a class="el" href="dir_4270bfced15e0e73154b13468c7c9ad9.html">core</a></li><li class="navelem"><b>signal_layout.h</b></li>
<li class="footer">Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.8 </li>
</ul>
</div>
</body>
</html>
+2 -2
View File
@@ -141,7 +141,7 @@ Public Attributes</h2></td></tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8cpp_source.html#l00513">513</a> of file <a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8cpp_source.html#l00510">510</a> of file <a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a>.</p>
</div>
</div>
@@ -161,7 +161,7 @@ Public Attributes</h2></td></tr>
</table>
</div><div class="memdoc">
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8cpp_source.html#l00436">436</a> of file <a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a>.</p>
<p class="definition">Definition at line <a class="el" href="dbc__statement__handler_8cpp_source.html#l00433">433</a> of file <a class="el" href="dbc__statement__handler_8cpp_source.html">dbc_statement_handler.cpp</a>.</p>
</div>
</div>
+4 -4
View File
@@ -135,7 +135,7 @@ Public Attributes</h2></td></tr>
<p class="definition">Definition at line <a class="el" href="dbc__decoder_8h_source.html#l00072">72</a> of file <a class="el" href="dbc__decoder_8h_source.html">dbc_decoder.h</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__decoder_8cpp_source.html#l00022">DbcDecoder::Decode()</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__decoder_8cpp_source.html#l00023">DbcDecoder::Decode()</a>.</p>
</div>
</div>
@@ -154,7 +154,7 @@ Public Attributes</h2></td></tr>
<p class="definition">Definition at line <a class="el" href="dbc__decoder_8h_source.html#l00073">73</a> of file <a class="el" href="dbc__decoder_8h_source.html">dbc_decoder.h</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__decoder_8cpp_source.html#l00022">DbcDecoder::Decode()</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__decoder_8cpp_source.html#l00023">DbcDecoder::Decode()</a>.</p>
</div>
</div>
@@ -190,7 +190,7 @@ Public Attributes</h2></td></tr>
<p class="definition">Definition at line <a class="el" href="dbc__decoder_8h_source.html#l00075">75</a> of file <a class="el" href="dbc__decoder_8h_source.html">dbc_decoder.h</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__decoder_8cpp_source.html#l00022">DbcDecoder::Decode()</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__decoder_8cpp_source.html#l00023">DbcDecoder::Decode()</a>.</p>
</div>
</div>
@@ -209,7 +209,7 @@ Public Attributes</h2></td></tr>
<p class="definition">Definition at line <a class="el" href="dbc__decoder_8h_source.html#l00076">76</a> of file <a class="el" href="dbc__decoder_8h_source.html">dbc_decoder.h</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__decoder_8cpp_source.html#l00022">DbcDecoder::Decode()</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__decoder_8cpp_source.html#l00023">DbcDecoder::Decode()</a>.</p>
</div>
</div>
+3 -3
View File
@@ -174,7 +174,7 @@ Public Attributes</h2></td></tr>
<p class="definition">Definition at line <a class="el" href="dbc__decoder_8h_source.html#l00053">53</a> of file <a class="el" href="dbc__decoder_8h_source.html">dbc_decoder.h</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__decoder_8cpp_source.html#l00022">DbcDecoder::Decode()</a>, and <a class="el" href="dbc__decoder_8h_source.html#l00061">GetValueDescription()</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__decoder_8cpp_source.html#l00023">DbcDecoder::Decode()</a>, and <a class="el" href="dbc__decoder_8h_source.html#l00061">GetValueDescription()</a>.</p>
</div>
</div>
@@ -193,7 +193,7 @@ Public Attributes</h2></td></tr>
<p class="definition">Definition at line <a class="el" href="dbc__decoder_8h_source.html#l00054">54</a> of file <a class="el" href="dbc__decoder_8h_source.html">dbc_decoder.h</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__decoder_8cpp_source.html#l00022">DbcDecoder::Decode()</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__decoder_8cpp_source.html#l00023">DbcDecoder::Decode()</a>.</p>
</div>
</div>
@@ -248,7 +248,7 @@ Public Attributes</h2></td></tr>
<p class="definition">Definition at line <a class="el" href="dbc__decoder_8h_source.html#l00057">57</a> of file <a class="el" href="dbc__decoder_8h_source.html">dbc_decoder.h</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__decoder_8cpp_source.html#l00022">DbcDecoder::Decode()</a>, and <a class="el" href="dbc__decoder_8h_source.html#l00061">GetValueDescription()</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__decoder_8cpp_source.html#l00023">DbcDecoder::Decode()</a>, and <a class="el" href="dbc__decoder_8h_source.html#l00061">GetValueDescription()</a>.</p>
</div>
</div>
+3 -3
View File
@@ -131,7 +131,7 @@ Public Attributes</h2></td></tr>
<p class="definition">Definition at line <a class="el" href="dbc__decoder_8h_source.html#l00025">25</a> of file <a class="el" href="dbc__decoder_8h_source.html">dbc_decoder.h</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__decoder_8cpp_source.html#l00022">DbcDecoder::Decode()</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__decoder_8cpp_source.html#l00023">DbcDecoder::Decode()</a>.</p>
</div>
</div>
@@ -150,7 +150,7 @@ Public Attributes</h2></td></tr>
<p class="definition">Definition at line <a class="el" href="dbc__decoder_8h_source.html#l00026">26</a> of file <a class="el" href="dbc__decoder_8h_source.html">dbc_decoder.h</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__decoder_8cpp_source.html#l00022">DbcDecoder::Decode()</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__decoder_8cpp_source.html#l00023">DbcDecoder::Decode()</a>.</p>
</div>
</div>
@@ -169,7 +169,7 @@ Public Attributes</h2></td></tr>
<p class="definition">Definition at line <a class="el" href="dbc__decoder_8h_source.html#l00027">27</a> of file <a class="el" href="dbc__decoder_8h_source.html">dbc_decoder.h</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__decoder_8cpp_source.html#l00022">DbcDecoder::Decode()</a>.</p>
<p class="reference">Referenced by <a class="el" href="dbc__decoder_8cpp_source.html#l00023">DbcDecoder::Decode()</a>.</p>
</div>
</div>
+11 -8
View File
@@ -107,14 +107,17 @@ $(document).ready(function(){initNavTree('tests_2main_8cpp_source.html',''); ini
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span> </div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="keywordtype">int</span> RunLifetimeTests(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv);</div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span> </div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv) {</div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span> QCoreApplication application(argc, argv);</div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span> <span class="keyword">const</span> <span class="keywordtype">int</span> parserResult = RunParserTests(argc, argv);</div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span> <span class="keyword">const</span> <span class="keywordtype">int</span> decoderResult = RunDecoderTests(argc, argv);</div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span> <span class="keyword">const</span> <span class="keywordtype">int</span> coverageResult = RunCoverageTests(argc, argv);</div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> <span class="keyword">const</span> <span class="keywordtype">int</span> lifetimeResult = RunLifetimeTests(argc, argv);</div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> <span class="keywordflow">return</span> parserResult | decoderResult | coverageResult | lifetimeResult;</div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span>}</div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="keywordtype">int</span> RunValidationTests(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv);</div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span> </div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> **argv) {</div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span> QCoreApplication application(argc, argv);</div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span> <span class="keyword">const</span> <span class="keywordtype">int</span> parserResult = RunParserTests(argc, argv);</div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span> <span class="keyword">const</span> <span class="keywordtype">int</span> decoderResult = RunDecoderTests(argc, argv);</div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> <span class="keyword">const</span> <span class="keywordtype">int</span> coverageResult = RunCoverageTests(argc, argv);</div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span> <span class="keyword">const</span> <span class="keywordtype">int</span> lifetimeResult = RunLifetimeTests(argc, argv);</div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> <span class="keyword">const</span> <span class="keywordtype">int</span> validationResult = RunValidationTests(argc, argv);</div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span> <span class="keywordflow">return</span> validationResult | parserResult | decoderResult | coverageResult | lifetimeResult;</div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span>}</div>
</div><!-- fragment --></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
+27 -8
View File
@@ -24,7 +24,7 @@ make -j
make check
```
Or run `./tests/dbc_tests` directly. Parser, decoder, lifetime, and additional coverage
Or run `./tests/dbc_tests` directly. Parser, decoder, lifetime, validation, and additional coverage
suites run, and the executable returns nonzero when any suite fails. Decoder cases appear as
individual QtTest data rows; parser checks are grouped into named test slots.
Checks also run in release builds.
@@ -41,7 +41,8 @@ make check
```
`parser_tests.pri` and `decoder_tests.pri` include the original test sources;
`tests.pro` also includes `dbc_coverage_test.cpp` and `dbc_lifetime_test.cpp`.
`tests.pro` also includes `dbc_coverage_test.cpp`, `dbc_lifetime_test.cpp`, and
`dbc_validation_test.cpp`.
`../core/core.pri` supplies the library include path and linkage.
## Decoder coverage
@@ -52,10 +53,11 @@ signals, signed values, scaling, 64-bit extraction, signed/unsigned boundary val
payloads, and Intel regression cases. Frame validity means the definition was
found; frame status reports unknown frames, short payloads, and signal errors.
Tests exercise empty/short/exact/long payloads, ignored trailing bytes, signals
outside declared DLC, invalid enum metadata and overflowing start bits, and
preservation of successful signals. Physical conversion checks cover NaN/Inf
parameters, multiplication/addition overflow, finite limits, signed/unsigned raw
retention, and raw selector activation after physical conversion failure.
outside declared DLC, invalid enum metadata and overflowing start bits rejected
at construction, and preservation of successful signals on partial payloads.
Physical conversion checks cover NaN/Inf parameters rejected at construction,
multiplication/addition overflow, finite limits, signed/unsigned raw retention,
and raw selector activation after physical conversion failure.
## Parser coverage
@@ -116,8 +118,9 @@ of invalid markers, selector references/ranges, overlaps, and SG_MUL_VAL_.
`dbc_coverage_test.cpp` runs as part of `dbc_tests`. It covers signed boundaries
below 64 bits, deterministic extraction comparisons for both byte orders across
lengths 1–64, frame lookup failures, exact decode statuses, malformed runtime
multiplexing, PGN boundaries, comment handling, file formatting, metadata copying
lengths 1–64, frame lookup failures, exact decode statuses, construction rejection
of malformed runtime multiplexing, PGN boundaries, comment handling, file
formatting, metadata copying
and source lifetime, physical conversion, and TypeFactory registration/creation.
Direct resolver tests construct ambiguous databases through the public metadata
API, verify source locations, and check that ambiguous targets receive no values.
@@ -141,3 +144,19 @@ duplicate runtime keys, including manually supplied parsed metadata. Failed relo
leaves the active database intact; empty reload clears it. Invalid/unknown results
and insufficient payloads retain their documented ownership and status behavior.
Inactive branches and unavailable selectors also retain definitions across reload.
## Database validation coverage
`dbc_validation_test.cpp` checks direct construction and manually assembled
`DbcDatabase` input to `DbcDecodeBuilder`: standard/extended CAN ID limits,
encoded/reserved ID bits, duplicate keys, lengths 0/1–64/65/UINT32_MAX,
Intel/Motorola payload boundaries and overflowing start bits, invalid enums,
NaN and both infinities in every numeric parameter, and reversed physical ranges.
Selector tests include missing, duplicate, and signed selectors, branch ranges,
UINT64_MAX selection, mixed-order overlaps, and exclusive branches sharing bits.
Valid definitions cover the full byte-count storage range, including zero-byte
frames without signals and 255-byte frames. Existing extraction tests cover
lengths 1–64. Snapshot tests mutate retained frame, signal, and description aliases
after rvalue construction, and verify unchanged lookups and metadata. Failed
constructor/builder replacement preserves the active snapshot; clear removes its
index while saved handles remain alive.
+6 -13
View File
@@ -104,6 +104,7 @@ void CoverageTest::frameLookup() {
QVERIFY(absent.definition == nullptr);
QVERIFY(absent.signals.empty());
DecodeSignal signal;
signal.length = 8U;
DecodeDatabase database = SingleSignal(signal);
QVERIFY(decoder.FindFrame(database, 18U, false) == nullptr);
QVERIFY(decoder.FindFrame(database, 17U, true) == nullptr);
@@ -227,6 +228,10 @@ void CoverageTest::invalidSignalStatus() {
signal.startBit = start;
signal.length = length;
signal.byteOrder = order == 0 ? ByteOrder::Intel : ByteOrder::Motorola;
if (status == int(SignalDecodeStatus::InvalidDefinition)) {
QVERIFY_THROWS_EXCEPTION(std::invalid_argument, (void) SingleSignal(signal));
return;
}
const DecodeDatabase database = SingleSignal(signal);
RawCanFrame raw;
raw.canId = 17U;
@@ -272,19 +277,7 @@ void CoverageTest::malformedRuntimeMultiplexing() {
if (kind == 1) definitions[0].signals[0].valueType = ValueType::Signed;
if (kind == 2) definitions[0].signals[0].length = 65U;
if (kind == 3) definitions[0].signals[1].multiplexing.value = 2U;
const DecodeDatabase database(std::move(definitions));
RawCanFrame raw;
raw.canId = 17U;
raw.data = {1U, 42U, 99U};
const DecodedFrameValue result = DbcDecoder().Decode(database, raw);
QCOMPARE(int(result.signals[1].status), int(SignalDecodeStatus::InvalidDefinition));
QVERIFY(!result.signals[1].valid);
QVERIFY(result.signals[2].valid);
QCOMPARE(std::get<std::uint64_t>(result.signals[2].rawValue), std::uint64_t(99));
if (kind != 3) {
QCOMPARE(int(result.signals[0].status), int(SignalDecodeStatus::InvalidDefinition));
if (kind == 0) QCOMPARE(int(result.signals[3].status), int(SignalDecodeStatus::InvalidDefinition));
}
QVERIFY_THROWS_EXCEPTION(std::invalid_argument, (void) DecodeDatabase(definitions));
}
void CoverageTest::pgn_data() {
+19 -27
View File
@@ -4,6 +4,7 @@
#include <cmath>
#include <limits>
#include <sstream>
#include <stdexcept>
struct DecodeCase {
const char *name;
@@ -77,6 +78,10 @@ void DbcDecoderTest::decode() {
definition.canId = 0x123U;
definition.dlc = 8U;
definition.signals.push_back(signal);
if (test.length == 0U || test.length > 64U || test.startBit > 64U) {
QVERIFY_THROWS_EXCEPTION(std::invalid_argument, (void) DecodeDatabase({definition}));
return;
}
const DecodeDatabase database({definition});
RawCanFrame frame;
@@ -253,22 +258,7 @@ void DbcDecoderTest::invalidDefinitions() {
case 7: bad.multiplexing.role = MultiplexRole::Branch; break;
}
definition.signals = {bad, good};
const DecodeDatabase database({definition});
RawCanFrame raw;
raw.data = {0xFFU, 0xFFU}; // Extra bytes must not rescue an invalid definition.
const DecodedFrameValue result = DbcDecoder().Decode(database, raw);
QVERIFY(result.valid);
QCOMPARE(result.status, FrameDecodeStatus::SignalErrors);
QCOMPARE(result.signals[0].status, SignalDecodeStatus::InvalidDefinition);
QVERIFY(!result.signals[0].valid && !result.signals[0].GetValueDescription());
QCOMPARE(result.signals[1].status, SignalDecodeStatus::Valid);
QCOMPARE(std::get<std::uint64_t>(result.signals[1].rawValue), std::uint64_t(15U));
QCOMPARE(result.signals[1].physicalValue, 15.0);
raw.data.clear();
const DecodedFrameValue shortResult = DbcDecoder().Decode(database, raw);
QCOMPARE(shortResult.status, FrameDecodeStatus::InsufficientPayload);
QCOMPARE(shortResult.signals[0].status, SignalDecodeStatus::InvalidDefinition);
QCOMPARE(shortResult.signals[1].status, SignalDecodeStatus::InsufficientPayload);
QVERIFY_THROWS_EXCEPTION(std::invalid_argument, (void) DecodeDatabase({definition}));
}
}
@@ -313,6 +303,10 @@ void DbcDecoderTest::physicalConversion() {
definition.signals.push_back(signal);
RawCanFrame raw;
raw.data = {0x32U};
if (!std::isfinite(factor) || !std::isfinite(offset)) {
QVERIFY_THROWS_EXCEPTION(std::invalid_argument, (void) DecodeDatabase({definition}));
continue;
}
const DecodedFrameValue result = DbcDecoder().Decode(DecodeDatabase({definition}), raw);
QVERIFY(result.valid);
QCOMPARE(result.status, finite ? FrameDecodeStatus::Valid : FrameDecodeStatus::SignalErrors);
@@ -340,25 +334,25 @@ void DbcDecoderTest::selectorConversionFailure() {
definition.dlc = 1U;
DecodeSignal selector;
selector.name = "Selector";
selector.length = 1U;
selector.length = 2U;
selector.multiplexing.role = MultiplexRole::Selector;
selector.factor = std::numeric_limits<double>::infinity();
selector.factor = std::numeric_limits<double>::max();
DecodeSignal branch;
branch.name = "Branch";
branch.startBit = 1U;
branch.length = 7U;
branch.startBit = 2U;
branch.length = 6U;
branch.multiplexing.role = MultiplexRole::Branch;
branch.multiplexing.value = 1U;
branch.multiplexing.value = 2U;
definition.signals = {branch, selector};
RawCanFrame raw;
raw.data = {85U};
raw.data = {170U};
const DecodedFrameValue result = DbcDecoder().Decode(DecodeDatabase({definition}), raw);
QCOMPARE(result.status, FrameDecodeStatus::SignalErrors);
QVERIFY(result.signals[0].valid);
QCOMPARE(result.signals[0].physicalValue, 42.0);
QCOMPARE(result.signals[1].status, SignalDecodeStatus::PhysicalConversionFailed);
QCOMPARE(std::get<std::uint64_t>(result.signals[1].rawValue), std::uint64_t(1U));
raw.data = {84U};
QCOMPARE(std::get<std::uint64_t>(result.signals[1].rawValue), std::uint64_t(2U));
raw.data = {168U};
selector.factor = 1.0;
definition.signals = {branch, selector};
const DecodedFrameValue inactive = DbcDecoder().Decode(DecodeDatabase({definition}), raw);
@@ -378,9 +372,7 @@ void DbcDecoderTest::zeroDlc() {
DecodeSignal signal;
signal.length = 8U;
definition.signals.push_back(signal);
const DecodedFrameValue invalid = DbcDecoder().Decode(DecodeDatabase({definition}), raw);
QCOMPARE(invalid.status, FrameDecodeStatus::SignalErrors);
QCOMPARE(invalid.signals[0].status, SignalDecodeStatus::InvalidDefinition);
QVERIFY_THROWS_EXCEPTION(std::invalid_argument, (void) DecodeDatabase({definition}));
}
int RunDecoderTests(int argc, char **argv) {
+2
View File
@@ -175,6 +175,8 @@ void DbcLifetimeTest::duplicateKeys() {
QVERIFY_THROWS_EXCEPTION(std::invalid_argument, (void) DecodeDatabase({frame, frame}));
DecodeSignal signal;
signal.name = "State";
signal.length = 1U;
frame.dlc = 1U;
frame.signals = {signal, signal};
QVERIFY_THROWS_EXCEPTION(std::invalid_argument, (void) DecodeDatabase({frame}));
DbcDatabase parsed;
+2 -9
View File
@@ -603,16 +603,9 @@ void DbcParserTest::multiplexingBoundaries() {
"Adjacent large integers remain distinct");
std::vector<DecodeFrame> definitions = runtime.GetFrames();
definitions[0].signals[1].length = 0U;
runtime = DecodeDatabase(definitions);
result = DbcDecoder().Decode(runtime, raw);
CHECK(result.signals[0].status == SignalDecodeStatus::InvalidDefinition &&
result.signals[1].status == SignalDecodeStatus::InvalidDefinition,
"Malformed runtime selector distinguished from payload errors");
QVERIFY_THROWS_EXCEPTION(std::invalid_argument, runtime = DecodeDatabase(definitions));
definitions[0].signals.pop_back();
runtime = DecodeDatabase(definitions);
result = DbcDecoder().Decode(runtime, raw);
CHECK(result.signals[0].status == SignalDecodeStatus::InvalidDefinition,
"Missing runtime selector");
QVERIFY_THROWS_EXCEPTION(std::invalid_argument, runtime = DecodeDatabase(definitions));
fixture.Write("BO_ 1 Frame: 2 ECU\n\n"
"SG_ Branch m2 : 8|8@1+ (1,0) [0|255] \"\" ECU\n"
"SG_ Mode M : 0|1@1+ (1,0) [0|1] \"\" ECU\n");
+348
View File
@@ -0,0 +1,348 @@
// SPDX-License-Identifier: MIT
#include "dbc_decode_builder.h"
#include "dbc_decoder.h"
#include <QtTest>
#include <limits>
#include <stdexcept>
#include <utility>
namespace {
DecodeFrame ValidFrame() {
DecodeFrame frame;
frame.canId = 0x123U;
frame.dlc = 8U;
DecodeSignal signal;
signal.name = "Value";
signal.length = 8U;
frame.signals.push_back(signal);
return frame;
}
DbcDatabase ParsedDefinitions(const std::vector<DecodeFrame> &frames) {
DbcDatabase database;
for (const DecodeFrame &frame: frames) {
FrameInfo target;
target.canId = frame.canId;
target.isExtended = frame.isExtended;
target.dlc = frame.dlc;
for (const DecodeSignal &signal: frame.signals) {
SignalInfo copy;
copy.name = signal.name;
copy.startBit = signal.startBit;
copy.length = signal.length;
copy.isLittleEndian = signal.byteOrder == ByteOrder::Intel;
copy.isSigned = signal.valueType == ValueType::Signed;
copy.factor = signal.factor;
copy.offset = signal.offset;
copy.minimum = signal.minimum;
copy.maximum = signal.maximum;
copy.multiplexing = signal.multiplexing;
target.signals.push_back(copy);
}
database.frames.push_back(target);
}
return database;
}
}// namespace
class DbcValidationTest : public QObject {
Q_OBJECT
private Q_SLOTS:
void invalidMetadata_data();
void invalidMetadata();
void numericParameters_data();
void numericParameters();
void validBoundaries();
void multiplexingBoundaries();
void independentSnapshot();
void failedReplacement();
};
void DbcValidationTest::invalidMetadata_data() {
QTest::addColumn<int>("kind");
QTest::newRow("standard-id") << 0;
QTest::newRow("extended-id") << 1;
QTest::newRow("encoded-id") << 2;
QTest::newRow("duplicate-frame") << 3;
QTest::newRow("duplicate-signal") << 4;
QTest::newRow("zero-length") << 5;
QTest::newRow("65-bits") << 6;
QTest::newRow("length-overflow") << 7;
QTest::newRow("intel-start-overflow") << 8;
QTest::newRow("motorola-start-overflow") << 9;
QTest::newRow("intel-outside-payload") << 10;
QTest::newRow("motorola-outside-payload") << 11;
QTest::newRow("zero-payload") << 12;
QTest::newRow("inverted-range") << 13;
QTest::newRow("byte-order") << 14;
QTest::newRow("value-type") << 15;
QTest::newRow("multiplex-role") << 16;
QTest::newRow("missing-selector") << 17;
QTest::newRow("signed-selector") << 18;
QTest::newRow("two-selectors") << 19;
QTest::newRow("branch-range") << 20;
QTest::newRow("unconditional-overlap") << 21;
QTest::newRow("mixed-order-overlap") << 22;
QTest::newRow("same-branch-overlap") << 23;
QTest::newRow("selector-branch-overlap") << 24;
QTest::newRow("maximum-can-id") << 25;
}
void DbcValidationTest::invalidMetadata() {
QFETCH(int, kind);
std::vector<DecodeFrame> frames = {ValidFrame()};
DecodeFrame &frame = frames[0];
DecodeSignal &signal = frame.signals[0];
DecodeSignal other = signal;
other.name = "Other";
switch (kind) {
case 0:
frame.canId = 0x800U;
break;
case 1:
frame.isExtended = true;
frame.canId = 0x20000000U;
break;
case 2:
frame.isExtended = true;
frame.canId = 0x80000123U;
break;
case 3:
frames.push_back(frame);
break;
case 4:
frame.signals.push_back(signal);
break;
case 5:
signal.length = 0U;
break;
case 6:
signal.length = 65U;
break;
case 7:
signal.length = std::numeric_limits<std::uint32_t>::max();
break;
case 8:
signal.startBit = std::numeric_limits<std::uint32_t>::max();
break;
case 9:
signal.byteOrder = ByteOrder::Motorola;
signal.startBit = std::numeric_limits<std::uint32_t>::max();
break;
case 10:
signal.startBit = 57U;
break;
case 11:
signal.byteOrder = ByteOrder::Motorola;
signal.startBit = 56U;
break;
case 12:
frame.dlc = 0U;
break;
case 13:
signal.minimum = 2.0;
signal.maximum = 1.0;
break;
case 14:
signal.byteOrder = static_cast<ByteOrder>(99);
break;
case 15:
signal.valueType = static_cast<ValueType>(99);
break;
case 16:
signal.multiplexing.role = static_cast<MultiplexRole>(99);
break;
case 17:
signal.multiplexing.role = MultiplexRole::Branch;
break;
case 18:
signal.multiplexing.role = MultiplexRole::Selector;
signal.valueType = ValueType::Signed;
break;
case 19:
signal.multiplexing.role = MultiplexRole::Selector;
other.multiplexing.role = MultiplexRole::Selector;
other.startBit = 8U;
frame.signals.push_back(other);
break;
case 20:
case 23:
case 24:
signal.multiplexing.role = MultiplexRole::Selector;
other.multiplexing.role = MultiplexRole::Branch;
other.startBit = kind == 24 ? 0U : 8U;
other.multiplexing.value = kind == 20 ? 256U : 1U;
frame.signals.push_back(other);
if (kind == 23) {
other.name = "Third";
frame.signals.push_back(other);
}
break;
case 21:
frame.signals.push_back(other);
break;
case 22:
other.byteOrder = ByteOrder::Motorola;
other.startBit = 7U;
frame.signals.push_back(other);
break;
case 25:
frame.canId = std::numeric_limits<std::uint32_t>::max();
break;
}
QVERIFY_THROWS_EXCEPTION(std::invalid_argument, (void) DecodeDatabase(frames));
// Parsed metadata uses bools for byte order and signedness, so invalid enum
// values exist only in direct runtime definitions.
if (kind != 14 && kind != 15)
QVERIFY_THROWS_EXCEPTION(std::invalid_argument, (void) DbcDecodeBuilder().Build(ParsedDefinitions(frames)));
}
void DbcValidationTest::numericParameters_data() {
QTest::addColumn<int>("field");
QTest::addColumn<double>("value");
const double values[] = {std::numeric_limits<double>::quiet_NaN(),
std::numeric_limits<double>::infinity(),
-std::numeric_limits<double>::infinity()};
for (int field = 0; field < 4; ++field) {
for (int index = 0; index < 3; ++index) {
const QByteArray name = QByteArray::number(field) + "-" + QByteArray::number(index);
QTest::newRow(name.constData()) << field << values[index];
}
}
}
void DbcValidationTest::numericParameters() {
QFETCH(int, field);
QFETCH(double, value);
DecodeFrame frame = ValidFrame();
DecodeSignal &signal = frame.signals[0];
switch (field) {
case 0:
signal.factor = value;
break;
case 1:
signal.offset = value;
break;
case 2:
signal.minimum = value;
break;
case 3:
signal.maximum = value;
break;
}
QVERIFY_THROWS_EXCEPTION(std::invalid_argument, (void) DecodeDatabase({frame}));
QVERIFY_THROWS_EXCEPTION(std::invalid_argument, (void) DbcDecodeBuilder().Build(ParsedDefinitions({frame})));
}
void DbcValidationTest::validBoundaries() {
for (ByteOrder order: {ByteOrder::Intel, ByteOrder::Motorola}) {
for (std::uint8_t dlc: {std::uint8_t(8U), std::uint8_t(64U), std::uint8_t(255U)}) {
DecodeFrame standard = ValidFrame();
standard.canId = 0x7FFU;
standard.dlc = dlc;
DecodeSignal &signal = standard.signals[0];
signal.byteOrder = order;
signal.startBit = (std::uint32_t(dlc) - 8U) * 8U + (order == ByteOrder::Intel ? 0U : 7U);
signal.length = 64U;
signal.factor = -2.0;
signal.offset = std::numeric_limits<double>::max();
signal.minimum = -std::numeric_limits<double>::max();
signal.maximum = std::numeric_limits<double>::max();
DecodeFrame extended = standard;
extended.isExtended = true;
DecodeFrame maximum = extended;
maximum.canId = 0x1FFFFFFFU;
const std::vector<DecodeFrame> frames = {standard, extended, maximum};
const DecodeDatabase direct(frames);
const DecodeDatabase built = DbcDecodeBuilder().Build(ParsedDefinitions(frames));
for (const DecodeFrame &frame: frames) {
QVERIFY(direct.FindFrame(frame.GetKey()));
QVERIFY(built.FindSignal(SignalKey(frame.GetKey(), "Value")));
}
}
}
DecodeFrame empty;
empty.canId = 0U;
QVERIFY(DecodeDatabase({empty}).FindFrame(empty.GetKey()));
QVERIFY(DbcDecodeBuilder().Build(DbcDatabase()).GetFrames().empty());
}
void DbcValidationTest::multiplexingBoundaries() {
DecodeFrame frame = ValidFrame();
frame.dlc = 9U;
DecodeSignal &selector = frame.signals[0];
selector.length = 64U;
selector.multiplexing.role = MultiplexRole::Selector;
DecodeSignal first;
first.name = "First";
first.startBit = 64U;
first.length = 8U;
first.multiplexing.role = MultiplexRole::Branch;
first.multiplexing.value = std::numeric_limits<std::uint64_t>::max();
DecodeSignal second = first;
second.name = "Second";
second.byteOrder = ByteOrder::Motorola;
second.startBit = 71U;
second.multiplexing.value = 0U;
frame.signals.push_back(first);
frame.signals.push_back(second);
const DecodeDatabase direct({frame});
const DecodeDatabase built = DbcDecodeBuilder().Build(ParsedDefinitions({frame}));
RawCanFrame raw;
raw.canId = frame.canId;
raw.data.assign(9U, 255U);
for (const DecodeDatabase &database: {direct, built}) {
const DecodedFrameValue result = DbcDecoder().Decode(database, raw);
QCOMPARE(result.signals[1].status, SignalDecodeStatus::Valid);
QCOMPARE(result.signals[2].status, SignalDecodeStatus::Inactive);
}
}
void DbcValidationTest::independentSnapshot() {
std::vector<DecodeFrame> frames = {ValidFrame()};
DecodeFrame &alias = frames[0];
DecodeSignal &signalAlias = alias.signals[0];
signalAlias.valueDescriptions.emplace(std::uint64_t(1U), "One");
std::string &descriptionAlias = signalAlias.valueDescriptions.begin()->second;
const FrameKey key = alias.GetKey();
const DecodeDatabase database(std::move(frames));
alias.canId = 456U;
signalAlias.name = "Changed";
signalAlias.startBit = std::numeric_limits<std::uint32_t>::max();
descriptionAlias = "Changed";
const std::shared_ptr<const DecodeFrame> saved = database.FindFrame(key);
QVERIFY(saved);
QCOMPARE(saved->canId, key.canId);
QVERIFY(!database.FindFrame(FrameKey(456U, false)));
const std::shared_ptr<const DecodeSignal> signal = database.FindSignal(SignalKey(key, "Value"));
QVERIFY(signal);
QCOMPARE(signal->startBit, 0U);
QCOMPARE(signal->valueDescriptions.begin()->second, std::string("One"));
}
void DbcValidationTest::failedReplacement() {
const DecodeFrame valid = ValidFrame();
DecodeDatabase database({valid});
const std::shared_ptr<const DecodeFrame> original = database.FindFrame(valid.GetKey());
DecodeFrame invalid = valid;
invalid.canId = 0x800U;
QVERIFY_THROWS_EXCEPTION(std::invalid_argument, database = DecodeDatabase({invalid}));
QCOMPARE(database.FindFrame(valid.GetKey()).get(), original.get());
invalid = valid;
invalid.signals[0].factor = std::numeric_limits<double>::infinity();
QVERIFY_THROWS_EXCEPTION(std::invalid_argument,
database = DbcDecodeBuilder().Build(ParsedDefinitions({invalid})));
QCOMPARE(database.FindFrame(valid.GetKey()).get(), original.get());
QCOMPARE(database.GetFrames().size(), std::size_t(1U));
database = DecodeDatabase();
QVERIFY(database.GetFrames().empty());
QVERIFY(!database.FindFrame(valid.GetKey()));
QVERIFY(original);
}
int RunValidationTests(int argc, char **argv) {
DbcValidationTest tests;
return QTest::qExec(&tests, argc, argv);
}
#include "dbc_validation_test.moc"
+4 -1
View File
@@ -7,11 +7,14 @@ int RunCoverageTests(int argc, char **argv);
int RunLifetimeTests(int argc, char **argv);
int RunValidationTests(int argc, char **argv);
int main(int argc, char **argv) {
QCoreApplication application(argc, argv);
const int parserResult = RunParserTests(argc, argv);
const int decoderResult = RunDecoderTests(argc, argv);
const int coverageResult = RunCoverageTests(argc, argv);
const int lifetimeResult = RunLifetimeTests(argc, argv);
return parserResult | decoderResult | coverageResult | lifetimeResult;
const int validationResult = RunValidationTests(argc, argv);
return validationResult | parserResult | decoderResult | coverageResult | lifetimeResult;
}
+1 -1
View File
@@ -8,5 +8,5 @@ CONFIG -= app_bundle
include(../core/core.pri)
include(parser_tests.pri)
include(decoder_tests.pri)
SOURCES += main.cpp dbc_coverage_test.cpp dbc_lifetime_test.cpp
SOURCES += main.cpp dbc_coverage_test.cpp dbc_lifetime_test.cpp dbc_validation_test.cpp
CONFIG -= debug_and_release debug_and_release_target