diff --git a/bazaar/PolyXML/PolyXML.h b/bazaar/PolyXML/PolyXML.h index a939ca48d..f8f89647a 100644 --- a/bazaar/PolyXML/PolyXML.h +++ b/bazaar/PolyXML/PolyXML.h @@ -160,6 +160,67 @@ template void PolyXMLArrayMap::Xmlize(XmlIO xml) } } +//////////////////////////////////////////////////////////////////////////////////////////////// +// PolyXMLArrayMapPtr class -- add support for streaming polymorphic maps of smart pointers of objects +template class PolyXMLArrayMapPtr : public ArrayMap > +{ + public: + // Xmlizer + void Xmlize(XmlIO xml); + + void Add(const K &key, const Ptr &data) { ArrayMap >::Add(key, data); } +}; + +template void PolyXMLArrayMapPtr::Xmlize(XmlIO xml) +{ + if(xml.IsStoring()) + { + for(int i = 0; i < PolyXMLArrayMapPtr::GetCount(); i++) + { + // skip unlinked elements + if(ArrayMap >::IsUnlinked(i)) + continue; + Ptr &data = PolyXMLArrayMapPtr::operator[](i); + K const &key = PolyXMLArrayMapPtr::GetKey(i); + + // skip data marked as erase too + if(data->IsErased()) + continue; + String tag = data->IsA(); + XmlizeStore(xml.Add("key"), key); + XmlizeStore(xml.Add(tag), *data); + } + } + else + { + PolyXMLArrayMapPtr::Clear(); + for(int i = 0; i < xml->GetCount() - 1 && xml->Node(i).IsTag("key");) + { + if(xml->Node(i).IsTag()) + { + K key; + Upp::Xmlize(xml.At(i++), key); + String tag = xml->Node(i).GetTag(); + Ptr data = T::CreatePtr(tag); + if(data) + { + data->Xmlize(xml.At(i++)); + Add(key, data); + } + else + { + // unknown class -- gather raw xml node + String rawXml = AsXML(xml.At(i).Node()); + + // creates an unknown class and stores raw xml on it + Ptr raw = (T *)new PolyXMLUnknown(tag, rawXml); + Add(key, raw); + } + } + } + } +} + END_UPP_NAMESPACE; #endif