@@ -37,6 +37,7 @@ distribution.
3737#include < filesystem>
3838
3939#include " DataDefs.h"
40+ #include " LuaWrapper.h"
4041
4142namespace std {
4243 class condition_variable ;
@@ -113,6 +114,7 @@ namespace DFHack
113114 };
114115
115116 class DFHACK_EXPORT container_identity : public constructed_identity {
117+ protected:
116118 const type_identity *item;
117119 const enum_identity *ienum;
118120
@@ -418,6 +420,25 @@ namespace df
418420 ct.insert (ct.begin ()+idx, *(typename T::value_type*)item);
419421 return true ;
420422 }
423+ virtual bool lua_insert2 (lua_State* state, int fname_idx, void * ptr, int idx, int val_index) const
424+ {
425+ using VT = typename T::value_type;
426+ VT tmp{};
427+ auto id = (type_identity*)lua_touserdata (state, DFHack::LuaWrapper::UPVAL_ITEM_ID);
428+ auto pitem = DFHack::LuaWrapper::get_object_internal (state, id, val_index, false );
429+ bool useTemporary = (!pitem && id->isPrimitive ());
430+
431+ if (useTemporary)
432+ {
433+ pitem = &tmp;
434+ id->lua_write (state, fname_idx, pitem, val_index);
435+ }
436+
437+ if (id != item || !pitem)
438+ DFHack::LuaWrapper::field_error (state, fname_idx, " incompatible object type" , " insert" );
439+
440+ return insert (ptr, idx, pitem);
441+ }
421442
422443 protected:
423444 virtual int item_count (void *ptr, CountMode) const { return (int )((T*)ptr)->size (); }
0 commit comments