FERS 1.0.0
The Flexible Extensible Radar Simulator
Loading...
Searching...
No Matches
xml_serializer_utils.h
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-2.0-only
2//
3// Copyright (c) 2026-present FERS Contributors (see AUTHORS.md).
4//
5// See the GNU GPLv2 LICENSE file in the FERS project root for more information.
6
7/**
8 * @file xml_serializer_utils.h
9 * @brief Core utility layer for serializing FERS XML scenario files.
10 *
11 * This file provides the internal mechanisms and data structures required to serialize
12 * individual simulation objects into their corresponding XML elements. It defines
13 * a context-driven serialization approach, converting global simulation state into
14 * textual XML data.
15 */
16
17#pragma once
18
19#include <array>
20#include <charconv>
21#include <iomanip>
22#include <limits>
23#include <sstream>
24#include <string>
25#include <type_traits>
26#include <vector>
27
28#include "core/parameters.h"
30
31namespace antenna
32{
33 class Antenna;
34}
35namespace core
36{
37 class World;
38}
39namespace fers_signal
40{
41 class RadarSignal;
42}
43namespace math
44{
45 class Path;
46 class RotationPath;
47}
48namespace radar
49{
50 class Platform;
51 class Receiver;
52 class Target;
53 class Transmitter;
54 struct SchedulePeriod;
55}
56namespace timing
57{
58 class PrototypeTiming;
59}
60
62{
63 /**
64 * @brief Adds a child element with the specified text content.
65 * @param parent The parent XML element.
66 * @param name The name of the child element to create.
67 * @param text The text content to set for the child element.
68 */
69 void addChildWithText(const XmlElement& parent, const std::string& name, const std::string& text);
70
71 /**
72 * @brief Adds a child element with the specified numeric content.
73 * @tparam T The numeric type (automatically deduced).
74 * @param parent The parent XML element.
75 * @param name The name of the child element to create.
76 * @param value The numeric value to set for the child element.
77 */
78 template <typename T>
79 void addChildWithNumber(const XmlElement& parent, const std::string& name, T value)
80 {
81 if constexpr (std::is_floating_point_v<T>)
82 {
83 std::array<char, 64> buffer{};
84 if (auto [ptr, ec] = std::to_chars(buffer.data(), buffer.data() + buffer.size(), value); ec == std::errc())
85 {
86 const auto length = static_cast<std::string::size_type>(ptr - buffer.data());
87 addChildWithText(parent, name, std::string(buffer.data(), length));
88 }
89 else
90 {
91 // This only executes if std::to_chars(...) returns ec != std::errc()
92 // which will practically never happen unless the output buffer is too small
93 // to hold the formatted value, or the standard library implementation fails
94 // to support/format the given floating-point value.
95 std::stringstream ss;
96 ss << std::setprecision(std::numeric_limits<T>::max_digits10) << value;
97 addChildWithText(parent, name, ss.str());
98 }
99 }
100 else
101 {
102 addChildWithText(parent, name, std::to_string(value));
103 }
104 }
105
106 /**
107 * @brief Sets a boolean attribute on an XML element.
108 * @param element The XML element to modify.
109 * @param name The name of the attribute to set.
110 * @param value The boolean value to set.
111 */
112 void setAttributeFromBool(const XmlElement& element, const std::string& name, bool value);
113
114 /**
115 * @brief Serializes a schedule (active periods) into a parent XML element.
116 * @param schedule The schedule periods to serialize.
117 * @param parent The parent XML element.
118 */
119 void serializeSchedule(const std::vector<radar::SchedulePeriod>& schedule, const XmlElement& parent);
120
121 /**
122 * @brief Serializes a Parameters object into a parent XML element.
123 * @param parent The parent XML element.
124 * @param p The parameter struct to serialize.
125 */
126 void serializeParameters(const XmlElement& parent, const params::Parameters& p);
127
128 /**
129 * @brief Serializes a waveform into a parent XML element.
130 * @param waveform The waveform object to serialize.
131 * @param parent The parent XML element.
132 */
133 void serializeWaveform(const fers_signal::RadarSignal& waveform, const XmlElement& parent);
134
135 /**
136 * @brief Serializes a timing object into a parent XML element.
137 * @param timing The timing object to serialize.
138 * @param parent The parent XML element.
139 */
140 void serializeTiming(const timing::PrototypeTiming& timing, const XmlElement& parent);
141
142 /**
143 * @brief Serializes an antenna into a parent XML element.
144 * @param antenna The antenna object to serialize.
145 * @param parent The parent XML element.
146 */
147 void serializeAntenna(const antenna::Antenna& antenna, const XmlElement& parent);
148
149 /**
150 * @brief Serializes a motion path into a parent XML element.
151 * @param path The motion path object to serialize.
152 * @param parent The parent XML element.
153 */
154 void serializeMotionPath(const math::Path& path, const XmlElement& parent);
155
156 /**
157 * @brief Serializes a rotation path into a parent XML element.
158 * @param rotPath The rotation path object to serialize.
159 * @param parent The parent XML element.
160 */
161 void serializeRotation(const math::RotationPath& rotPath, const XmlElement& parent);
162
163 /**
164 * @brief Serializes a transmitter into a parent XML element.
165 * @param tx The transmitter object to serialize.
166 * @param parent The parent XML element.
167 */
168 void serializeTransmitter(const radar::Transmitter& tx, const XmlElement& parent);
169
170 /**
171 * @brief Serializes a receiver into a parent XML element.
172 * @param rx The receiver object to serialize.
173 * @param parent The parent XML element.
174 */
175 void serializeReceiver(const radar::Receiver& rx, const XmlElement& parent);
176
177 /**
178 * @brief Serializes a monostatic radar setup containing both a transmitter and receiver.
179 * @param tx The transmitter object.
180 * @param rx The receiver object.
181 * @param parent The parent XML element.
182 */
183 void serializeMonostatic(const radar::Transmitter& tx, const radar::Receiver& rx, const XmlElement& parent);
184
185 /**
186 * @brief Serializes a target into a parent XML element.
187 * @param target The target object to serialize.
188 * @param parent The parent XML element.
189 */
190 void serializeTarget(const radar::Target& target, const XmlElement& parent);
191
192 /**
193 * @brief Serializes a platform and its attached components into a parent XML element.
194 * @param platform The platform object to serialize.
195 * @param world The simulation world containing global state.
196 * @param parent The parent XML element.
197 */
198 void serializePlatform(const radar::Platform& platform, const core::World& world, const XmlElement& parent);
199}
Class representing a node in an XML document.
Abstract base class representing an antenna.
The World class manages the simulator environment.
Definition world.h:39
Class representing a radar signal with associated properties.
Represents a path with coordinates and allows for various interpolation methods.
Definition path.h:30
Manages rotational paths with different interpolation techniques.
Represents a simulation platform with motion and rotation paths.
Definition platform.h:32
Manages radar signal reception and response processing.
Definition receiver.h:37
Base class for radar targets.
Definition target.h:118
Represents a radar transmitter system.
Definition transmitter.h:33
Manages timing properties such as frequency, offsets, and synchronization.
Wrapper for managing XML documents and elements using libxml2.
Definition coord.h:18
void serializeMotionPath(const math::Path &path, const XmlElement &parent)
Serializes a motion path into a parent XML element.
void addChildWithNumber(const XmlElement &parent, const std::string &name, T value)
Adds a child element with the specified numeric content.
void addChildWithText(const XmlElement &parent, const std::string &name, const std::string &text)
Adds a child element with the specified text content.
void serializeReceiver(const radar::Receiver &rx, const XmlElement &parent)
Serializes a receiver into a parent XML element.
void serializeAntenna(const antenna::Antenna &antenna, const XmlElement &parent)
Serializes an antenna into a parent XML element.
void serializeMonostatic(const radar::Transmitter &tx, const radar::Receiver &rx, const XmlElement &parent)
Serializes a monostatic radar setup containing both a transmitter and receiver.
void serializeRotation(const math::RotationPath &rotPath, const XmlElement &parent)
Serializes a rotation path into a parent XML element.
void serializeSchedule(const std::vector< radar::SchedulePeriod > &schedule, const XmlElement &parent)
Serializes a schedule (active periods) into a parent XML element.
void serializePlatform(const radar::Platform &platform, const core::World &world, const XmlElement &parent)
Serializes a platform and its attached components into a parent XML element.
void serializeTransmitter(const radar::Transmitter &tx, const XmlElement &parent)
Serializes a transmitter into a parent XML element.
void serializeTarget(const radar::Target &target, const XmlElement &parent)
Serializes a target into a parent XML element.
void serializeTiming(const timing::PrototypeTiming &timing, const XmlElement &parent)
Serializes a timing object into a parent XML element.
void serializeWaveform(const fers_signal::RadarSignal &waveform, const XmlElement &parent)
Serializes a waveform into a parent XML element.
void setAttributeFromBool(const XmlElement &element, const std::string &name, const bool value)
Sets a boolean attribute on an XML element.
void serializeParameters(const XmlElement &parent, const params::Parameters &p)
Serializes a Parameters object into a parent XML element.
Defines the Parameters struct and provides methods for managing simulation parameters.
Struct to hold simulation parameters.
Definition parameters.h:51