After further investigation, here’s a better implementation. @matkatmusic offered me some help on discord by suggesting using Array instead of raw pointers. I also realized var has Array related methods so I have landed on this implementation (using C++ 17 syntax):
template <typename T>
struct VariantConverter<Vector3D<T>>
{
static Vector3D<T> fromVar (const var& v)
{
if (auto * arr = v.getArray();
arr != nullptr && arr->size() == NUM_VECTOR_ELEMENTS)
return { v[X_INDEX], v[Y_INDEX], v[Z_INDEX] };
return {};
}
static var toVar (const Vector3D<T> & t)
{
Array<T, DummyCriticalSection, NUM_VECTOR_ELEMENTS> arr;
arr.set (X_INDEX, t.x);
arr.set (Y_INDEX, t.y);
arr.set (Z_INDEX, t.z);
return { std::move (arr) };
}
static constexpr size_t NUM_VECTOR_ELEMENTS = 3;
static constexpr size_t X_INDEX = 0;
static constexpr size_t Y_INDEX = 1;
static constexpr size_t Z_INDEX = 2;
};
