Vulcan
Aerospace Engineering Utilities Built on Janus
Loading...
Searching...
No Matches
YamlConvert.hpp
Go to the documentation of this file.
1
10
11#pragma once
12
13#include <janus/core/JanusTypes.hpp>
14#include <janus/math/Quaternion.hpp>
15#include <yaml-cpp/yaml.h>
16
17namespace YAML {
18
19// =============================================================================
20// janus::Vec3<T> - stored as [x, y, z]
21// =============================================================================
22
24template <typename T> struct convert<janus::Vec3<T>> {
26 static Node encode(const janus::Vec3<T> &v) {
27 Node node;
28 node.push_back(v.x());
29 node.push_back(v.y());
30 node.push_back(v.z());
31 return node;
32 }
33
35 static bool decode(const Node &node, janus::Vec3<T> &v) {
36 if (!node.IsSequence() || node.size() != 3) {
37 return false;
38 }
39 try {
40 v = janus::Vec3<T>{node[0].as<T>(), node[1].as<T>(),
41 node[2].as<T>()};
42 return true;
43 } catch (const YAML::Exception &) {
44 return false;
45 }
46 }
47};
48
49// =============================================================================
50// janus::Quaternion<T> - stored as [w, x, y, z] (scalar-first)
51// =============================================================================
52
54template <typename T> struct convert<janus::Quaternion<T>> {
56 static Node encode(const janus::Quaternion<T> &q) {
57 Node node;
58 node.push_back(q.w);
59 node.push_back(q.x);
60 node.push_back(q.y);
61 node.push_back(q.z);
62 return node;
63 }
64
66 static bool decode(const Node &node, janus::Quaternion<T> &q) {
67 if (!node.IsSequence() || node.size() != 4) {
68 return false;
69 }
70 try {
71 q = janus::Quaternion<T>{node[0].as<T>(), // w
72 node[1].as<T>(), // x
73 node[2].as<T>(), // y
74 node[3].as<T>()}; // z
75 return true;
76 } catch (const YAML::Exception &) {
77 return false;
78 }
79 }
80};
81
82// =============================================================================
83// janus::Mat3<T> - stored as [[row0], [row1], [row2]] or flat [9 elements]
84// =============================================================================
85
87template <typename T> struct convert<janus::Mat3<T>> {
89 static Node encode(const janus::Mat3<T> &m) {
90 Node node;
91 for (int i = 0; i < 3; ++i) {
92 Node row;
93 for (int j = 0; j < 3; ++j) {
94 row.push_back(m(i, j));
95 }
96 node.push_back(row);
97 }
98 return node;
99 }
100
102 static bool decode(const Node &node, janus::Mat3<T> &m) {
103 if (!node.IsSequence()) {
104 return false;
105 }
106
107 try {
108 // Nested format: [[r00, r01, r02], [r10, r11, r12], [r20, r21,
109 // r22]]
110 if (node.size() == 3 && node[0].IsSequence()) {
111 for (int i = 0; i < 3; ++i) {
112 if (node[i].size() != 3) {
113 return false;
114 }
115 for (int j = 0; j < 3; ++j) {
116 m(i, j) = node[i][j].as<T>();
117 }
118 }
119 return true;
120 }
121
122 // Flat format: [r00, r01, r02, r10, r11, r12, r20, r21, r22]
123 // (row-major)
124 if (node.size() == 9) {
125 for (int i = 0; i < 3; ++i) {
126 for (int j = 0; j < 3; ++j) {
127 m(i, j) = node[i * 3 + j].as<T>();
128 }
129 }
130 return true;
131 }
132 } catch (const YAML::Exception &) {
133 return false;
134 }
135
136 return false;
137 }
138};
139
140// =============================================================================
141// Emitter operators for Janus types (required for YAML::Emitter << type)
142// =============================================================================
143
145template <typename T>
146inline Emitter &operator<<(Emitter &emitter, const janus::Vec3<T> &v) {
147 emitter << YAML::Flow << YAML::BeginSeq;
148 emitter << v.x() << v.y() << v.z();
149 emitter << YAML::EndSeq;
150 return emitter;
151}
152
154template <typename T>
155inline Emitter &operator<<(Emitter &emitter, const janus::Quaternion<T> &q) {
156 emitter << YAML::Flow << YAML::BeginSeq;
157 emitter << q.w << q.x << q.y << q.z;
158 emitter << YAML::EndSeq;
159 return emitter;
160}
161
163template <typename T>
164inline Emitter &operator<<(Emitter &emitter, const janus::Mat3<T> &m) {
165 emitter << YAML::BeginSeq;
166 for (int i = 0; i < 3; ++i) {
167 emitter << YAML::Flow << YAML::BeginSeq;
168 emitter << m(i, 0) << m(i, 1) << m(i, 2);
169 emitter << YAML::EndSeq;
170 }
171 emitter << YAML::EndSeq;
172 return emitter;
173}
174
175} // namespace YAML
Definition YamlConvert.hpp:17
Emitter & operator<<(Emitter &emitter, const janus::Vec3< T > &v)
Emit Vec3 to YAML stream.
Definition YamlConvert.hpp:146
static Node encode(const janus::Mat3< T > &m)
Encode Mat3 to nested YAML sequence.
Definition YamlConvert.hpp:89
static bool decode(const Node &node, janus::Mat3< T > &m)
Decode YAML sequence to Mat3 (nested or flat).
Definition YamlConvert.hpp:102
static bool decode(const Node &node, janus::Quaternion< T > &q)
Decode YAML sequence to Quaternion.
Definition YamlConvert.hpp:66
static Node encode(const janus::Quaternion< T > &q)
Encode Quaternion to YAML sequence [w, x, y, z].
Definition YamlConvert.hpp:56
static Node encode(const janus::Vec3< T > &v)
Encode Vec3 to YAML sequence [x, y, z].
Definition YamlConvert.hpp:26
static bool decode(const Node &node, janus::Vec3< T > &v)
Decode YAML sequence to Vec3.
Definition YamlConvert.hpp:35