1
0
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:
Michał W. Urbańczyk 2013-05-30 10:44:39 +00:00
parent 22e14d31cb
commit 608a080971

View File

@ -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)