diff options
author | Stanislaw Halik <sthalik@misaki.pl> | 2022-10-06 06:13:05 +0200 |
---|---|---|
committer | Stanislaw Halik <sthalik@misaki.pl> | 2022-10-06 06:13:05 +0200 |
commit | 9b2b5c5fd5880f35e2e952bb89fc709f4b814364 (patch) | |
tree | c84f3d560f915fcdd046b18f37ed2987d91f72e1 /serialize/magnum-vector.hpp | |
parent | 3d89b33c5f01465372f293abd970160f652824ef (diff) |
a
Diffstat (limited to 'serialize/magnum-vector.hpp')
-rw-r--r-- | serialize/magnum-vector.hpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/serialize/magnum-vector.hpp b/serialize/magnum-vector.hpp new file mode 100644 index 00000000..39924a9b --- /dev/null +++ b/serialize/magnum-vector.hpp @@ -0,0 +1,41 @@ +#include <cstdio> +#include <string> +#include <exception> +#include <Magnum/Magnum.h> +#include <Magnum/Math/Vector2.h> +#include <nlohmann/json.hpp> + +namespace nlohmann { + +template<typename t> +struct adl_serializer<Magnum::Math::Vector2<t>> final { + static void to_json(json& j, const Magnum::Math::Vector2<t>& x); + static void from_json(const json& j, Magnum::Math::Vector2<t>& x); +}; + +template<typename t> +void adl_serializer<Magnum::Math::Vector2<t>>::to_json(json& j, const Magnum::Math::Vector2<t>& val) +{ + char buf[64]; + snprintf(buf, sizeof(buf), "%d x %d", val[0], val[1]); + j = buf; +} + +template<typename t> +void adl_serializer<Magnum::Math::Vector2<t>>::from_json(const json& j, Magnum::Math::Vector2<t>& val) +{ + std::string str = j; + int x = 0, y = 0, n = 0; + int ret = std::sscanf(str.c_str(), "%d x %d%n", &x, &y, &n); + if (ret != 2 || (std::size_t)n != str.size()) + { + std::string msg; msg.reserve(64 + str.size()); + msg += "failed to parse string '"; + msg += str; + msg += "' as Magnum::Vector2i"; + throw std::invalid_argument(msg); + } + val = { x, y }; +} + +} // namespace nlohmann |