19#ifndef SCRIPT_INTERFACE_PACKED_VARIANT_HPP
20#define SCRIPT_INTERFACE_PACKED_VARIANT_HPP
27#include <unordered_map>
44 return reinterpret_cast<ObjectId>(p);
55 None, bool, int, std::size_t, double, std::string,
ObjectId,
58 std::vector<boost::recursive_variant_>,
59 std::unordered_map<int, boost::recursive_variant_>,
60 std::unordered_map<std::string, boost::recursive_variant_>>::type;
62using PackedMap = std::vector<std::pair<std::string, PackedVariant>>;
73 mutable std::unordered_map<ObjectId, ObjectRef> m_objects;
77 auto const &
objects()
const {
return m_objects; }
81 std::vector<PackedVariant> ret(vec.size());
83 boost::transform(vec, ret.begin(), [
this](
const Variant &v) {
84 return boost::apply_visitor(*this, v);
92 auto operator()(
const std::unordered_map<K, Variant> &map)
const {
93 std::unordered_map<K, PackedVariant> ret{};
95 for (
auto const &it : map) {
96 ret.insert({it.first, boost::apply_visitor(*
this, it.second)});
105 auto const oid =
object_id(so_ptr.get());
106 m_objects[oid] = so_ptr;
113 return std::forward<T>(val);
123 std::unordered_map<ObjectId, ObjectRef>
const &
objects;
129 auto operator()(
const std::vector<PackedVariant> &vec)
const {
130 std::vector<Variant> ret(vec.size());
132 boost::transform(vec, ret.begin(), [
this](
const PackedVariant &v) {
133 return boost::apply_visitor(*this, v);
140 template <
typename K>
141 auto operator()(
const std::unordered_map<K, PackedVariant> &map)
const {
142 std::unordered_map<K, Variant> ret{};
144 for (
auto const &it : map) {
145 ret.insert({it.first, boost::apply_visitor(*
this, it.second)});
153 return std::forward<T>(val);
182 std::unordered_map<ObjectId, ObjectRef>
const &objects) {
195 boost::transform(v, ret.begin(), [](
auto const &kv) {
196 return std::pair<std::string, PackedVariant>{kv.first, pack(kv.second)};
210 std::unordered_map<ObjectId, ObjectRef>
const &objects) {
214 v, std::inserter(ret, ret.end()),
215 [&objects](
auto const &kv) -> std::pair<std::string, Variant> {
216 return {kv.first, unpack(kv.second, objects)};
Type to indicate no value in Variant.
Base class for interface handles.
PackedVariant pack(const Variant &v)
Transform a Variant to a PackedVariant.
std::shared_ptr< ObjectHandle > ObjectRef
std::unordered_map< std::string, Variant > VariantMap
boost::make_recursive_variant< None, bool, int, std::size_t, double, std::string, ObjectRef, Utils::Vector3b, Utils::Vector3i, Utils::Vector2d, Utils::Vector3d, Utils::Vector4d, std::vector< int >, std::vector< double >, std::vector< boost::recursive_variant_ >, std::unordered_map< int, boost::recursive_variant_ >, std::unordered_map< std::string, boost::recursive_variant_ > >::type Variant
Possible types for parameters.
std::vector< std::pair< std::string, PackedVariant > > PackedMap
Variant unpack(const PackedVariant &v, std::unordered_map< ObjectId, ObjectRef > const &objects)
Unpack a PackedVariant.
boost::make_recursive_variant< None, bool, int, std::size_t, double, std::string, ObjectId, Utils::Vector3b, Utils::Vector3i, Utils::Vector2d, Utils::Vector3d, Utils::Vector4d, std::vector< int >, std::vector< double >, std::vector< boost::recursive_variant_ >, std::unordered_map< int, boost::recursive_variant_ >, std::unordered_map< std::string, boost::recursive_variant_ > >::type PackedVariant
Packed version of Variant.
ObjectId object_id(const ObjectHandle *p)
Id for object.
Utils::Vector< bool, 3 > Vector3b
Visitor that converts a Variant to a PackedVariant.
auto operator()(const std::unordered_map< K, Variant > &map) const
PackedVariant operator()(const ObjectRef &so_ptr) const
PackedVariant operator()(T &&val) const
auto operator()(const std::vector< Variant > &vec) const
auto const & objects() const
Map of objects whose references were replaced by ids.
Visitor that converts a PackedVariant to a Variant.
auto operator()(const std::vector< PackedVariant > &vec) const
UnpackVisitor(std::unordered_map< ObjectId, ObjectRef > const &objects)
Variant operator()(const ObjectId &id) const
Variant operator()(T &&val) const
auto operator()(const std::unordered_map< K, PackedVariant > &map) const
std::unordered_map< ObjectId, ObjectRef > const & objects