only use stream for serialisation
Some checks failed
Linux arm64 / Build (push) Failing after 12s

This commit is contained in:
2025-03-13 16:08:53 +01:00
parent 205c09a338
commit a04dc67213
11 changed files with 148 additions and 60 deletions

View File

@@ -1,55 +1,68 @@
#pragma once
#include <map>
#include <sp/common/Templates.h>
#include <ostream>
#include <sp/protocol/Field.h>
#include <sp/protocol/message/OstreamFieldIterator.h>
#include <string>
#include <vector>
namespace sp {
template <typename T, std::enable_if_t<details::is_general_t<T>::value, bool> = true>
inline std::string PrintData(const T& a_Data);
template <typename T, std::enable_if_t<details::is_primitive<T>::value, bool> = true>
inline std::string PrintData(T a_Data) {
return std::to_string(a_Data);
std::ostream& operator<<(std::ostream& a_Stream, const PrintableField<T>& a_Field) {
return a_Stream << std::to_string(a_Field.GetValue());
}
template <>
inline std::string PrintData(const std::string& a_Data) {
return "\"" + a_Data + "\"";
inline std::ostream& operator<<(std::ostream& a_Stream, const PrintableField<long unsigned int>& a_Field) {
return a_Stream << a_Field.GetValue();
}
template <typename K, typename V>
std::string PrintData(const std::pair<K, V>& a_Data);
inline std::ostream& operator<<(std::ostream& a_Stream, const PrintableField<std::string>& a_Field) {
return a_Stream << "\"" << a_Field.GetValue() << "\"";
}
template <typename K, typename V>
std::string PrintData(const std::map<K, V>& a_Data);
std::ostream& operator<<(std::ostream& a_Stream, const PrintableField<std::pair<K, V>>& a_Data);
template <typename K, typename V>
std::ostream& operator<<(std::ostream& a_Stream, const PrintableField<std::map<K, V>>& a_Data);
template <typename T>
std::string PrintData(const std::vector<T>& a_Data);
std::ostream& operator<<(std::ostream& a_Stream, const PrintableField<std::vector<T>>& a_Data);
template <typename K, typename V>
std::string PrintData(const std::pair<K, V>& a_Data) {
return "{" + PrintData(a_Data.first) + " => " + PrintData(a_Data.second) + "}";
std::ostream& operator<<(std::ostream& a_Stream, const PrintableField<std::pair<K, V>>& a_Data) {
return a_Stream << PrintableField<K>(a_Data.GetValue().first) << " => " << PrintableField<V>(a_Data.GetValue().second);
}
template <typename K, typename V>
std::string PrintData(const std::map<K, V>& a_Data) {
std::string result = "{";
for (const auto& pair : a_Data) {
result += PrintData(pair) + ", ";
}
return result.substr(0, result.size() - 2) + "}";
std::ostream& operator<<(std::ostream& a_Stream, const PrintableField<std::map<K, V>>& a_Data) {
a_Stream << "{";
std::copy(a_Data.GetValue().begin(), a_Data.GetValue().end(), OstreamFieldIterator<std::pair<K, V>>(std::cout, ", "));
return a_Stream << "}";
}
template <typename K, typename V>
std::ostream& operator<<(std::ostream& a_Stream, const PrintableField<std::unordered_map<K, V>>& a_Data) {
a_Stream << "{";
std::copy(a_Data.GetValue().begin(), a_Data.GetValue().end(), OstreamFieldIterator<std::pair<K, V>>(std::cout, ", "));
return a_Stream << "}";
}
template <typename T>
std::string PrintData(const std::vector<T>& a_Data) {
std::string result = "{";
for (const T& value : a_Data) {
result += PrintData(value) + ", ";
}
return result.substr(0, result.size() - 2) + "}";
std::ostream& operator<<(std::ostream& a_Stream, const PrintableField<std::vector<T>>& a_Data) {
a_Stream << "{";
std::copy(a_Data.GetValue().begin(), a_Data.GetValue().end(), OstreamFieldIterator<T>(std::cout, ", "));
return a_Stream << "}";
}
} // namespace sp
} // namespace sp