mirror of
https://github.com/vcmi/vcmi.git
synced 2025-02-03 13:01:33 +02:00
Partial support for serializing std::shared_ptr. Should fix #1281.
This commit is contained in:
parent
22e14d31cb
commit
608a080971
@ -853,6 +853,8 @@ public:
|
||||
bool reverseEndianess; //if source has different endianess than us, we reverse bytes
|
||||
|
||||
std::map<ui32, void*> loadedPointers;
|
||||
std::map<const void*, boost::any> loadedSharedPointers;
|
||||
|
||||
bool smartPointerSerialization;
|
||||
|
||||
CISer()
|
||||
@ -1066,7 +1068,35 @@ public:
|
||||
{
|
||||
T *internalPtr;
|
||||
*this >> internalPtr;
|
||||
data.reset(internalPtr);
|
||||
|
||||
if(internalPtr)
|
||||
{
|
||||
auto itr = loadedSharedPointers.find(internalPtr);
|
||||
if(itr != loadedSharedPointers.end())
|
||||
{
|
||||
// This pointers is already loaded. The "data" needs to be pointed to it,
|
||||
// so their shared state is actually shared.
|
||||
try
|
||||
{
|
||||
data = boost::any_cast<std::shared_ptr<T>>(itr->second);
|
||||
}
|
||||
catch(std::exception &e)
|
||||
{
|
||||
logGlobal->errorStream() << e.what();
|
||||
logGlobal->errorStream() << boost::format("Failed to cast stored shared ptr. Real type: %s. Needed type %s. FIXME FIXME FIXME")
|
||||
% itr->second.type().name() % typeid(std::shared_ptr<T>).name();
|
||||
//TODO scenario with inheritance -> we can have stored ptr to base and load ptr to derived (or vice versa)
|
||||
assert(0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
data = std::shared_ptr<T>(internalPtr);
|
||||
loadedSharedPointers[internalPtr] = data;
|
||||
}
|
||||
}
|
||||
else
|
||||
data.reset();
|
||||
}
|
||||
template <typename T>
|
||||
void loadSerializable(unique_ptr<T> &data)
|
||||
|
Loading…
x
Reference in New Issue
Block a user