DBC Framework
DBC parsing and CAN signal decoding framework
Loading...
Searching...
No Matches
decode_database.cpp
1// SPDX-License-Identifier: MIT
2// Copyright (c) 2026 Dim Himro
3
4#include "decode_database.h"
5#include <stdexcept>
6#include <unordered_set>
7#include <utility>
8
9DecodeDatabase::Storage::Storage(std::vector<DecodeFrame> definitions)
10 : frames(std::move(definitions)) {
11 frameIndexByKey.reserve(frames.size());
12 for (std::size_t index = 0U; index < frames.size(); ++index) {
13 const DecodeFrame &frame = frames[index];
14 if (!frameIndexByKey.emplace(frame.GetKey(), index).second)
15 throw std::invalid_argument("Duplicate runtime frame key");
16 std::unordered_set<std::string> names;
17 for (const DecodeSignal &signal: frame.signals) {
18 if (!names.insert(signal.name).second)
19 throw std::invalid_argument("Duplicate runtime signal key");
20 }
21 }
22}
23
24DecodeDatabase::DecodeDatabase(std::vector<DecodeFrame> frames)
25 : storage(std::make_shared<const Storage>(std::move(frames))) {
26}
27
28const std::vector<DecodeFrame> &DecodeDatabase::GetFrames() const {
29 static const std::vector<DecodeFrame> empty;
30 return storage ? storage->frames : empty;
31}
32
33std::shared_ptr<const DecodeFrame> DecodeDatabase::FindFrame(const FrameKey &key) const {
34 if (!storage)
35 return nullptr;
36 const std::unordered_map<FrameKey, std::size_t, FrameKeyHasher>::const_iterator it =
37 storage->frameIndexByKey.find(key);
38 if (it == storage->frameIndexByKey.end())
39 return nullptr;
40 return std::shared_ptr<const DecodeFrame>(storage, &storage->frames[it->second]);
41}
42
43std::shared_ptr<const DecodeSignal> DecodeDatabase::FindSignal(const SignalKey &key) const {
44 const std::shared_ptr<const DecodeFrame> frame = FindFrame(key.frame);
45 if (!frame)
46 return nullptr;
47 for (const DecodeSignal &signal: frame->signals) {
48 if (signal.name == key.name)
49 return std::shared_ptr<const DecodeSignal>(frame, &signal);
50 }
51 return nullptr;
52}
std::shared_ptr< const DecodeFrame > FindFrame(const FrameKey &key) const
const std::vector< DecodeFrame > & GetFrames() const
Created: 2026-03-13 Author: Deeaitch (Dim. Himro)
Runtime-ready frame definition.
Runtime-ready signal definition.
Stable frame identifier: normalized CAN ID and frame type.