Files
cariflex/tools/EVerest-main/lib/everest/iso15118/include/iso15118/message/variant.hpp
Eric F d398a6ced2 Add extracted tools: CitrineOS, OpenOCPP, ShapeShifter
- CitrineOS core extracted (CSMS OCPP 2.0.1)
- OpenOCPP extracted (firmware OCPP 1.6J/2.0.1)
- ShapeShifter library installed (pip install -e)
- ShapeShifter specification extracted
- EVerest extracted

TODO updated with progress
2026-06-08 00:38:27 -04:00

62 lines
1.7 KiB
C++

// SPDX-License-Identifier: Apache-2.0
// Copyright 2023 Pionix GmbH and Contributors to EVerest
#pragma once
#include <cstddef>
#include <cstdint>
#include <memory>
#include <stdexcept>
#include <string>
// FIXME (aw): we only need the payload types from sdp.hpp, this could be shared in a separate header file
#include <iso15118/io/sdp.hpp>
#include <iso15118/io/stream_view.hpp>
#include "type.hpp"
namespace iso15118::message_20 {
class Variant {
public:
using CustomDeleter = void (*)(void*);
Variant(io::v2gtp::PayloadType, const io::StreamInputView&);
template <typename MessageType> Variant(const MessageType& in) {
static_assert(TypeTrait<MessageType>::type != Type::None, "Unhandled type!");
data = new MessageType;
*static_cast<MessageType*>(data) = in;
custom_deleter = [](void* ptr) { delete static_cast<MessageType*>(ptr); };
type = message_20::TypeTrait<MessageType>::type;
}
~Variant();
Type get_type() const;
const std::string& get_error() const;
template <typename T> const T& get() const {
static_assert(TypeTrait<T>::type != Type::None, "Unhandled type!");
if (TypeTrait<T>::type != type) {
throw std::runtime_error("Illegal message type access");
}
return *static_cast<T*>(data);
}
template <typename T> T const* get_if() const {
static_assert(TypeTrait<T>::type != Type::None, "Unhandled type!");
if (TypeTrait<T>::type != type) {
return nullptr;
}
return static_cast<T*>(data);
}
private:
CustomDeleter custom_deleter{nullptr};
void* data{nullptr};
Type type{Type::None};
std::string error;
};
} // namespace iso15118::message_20