mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-08-09 22:03:45 -06:00
Bazaar/PolyXML : added support for streaming maps of Ptr<T> where T is polymorphic hyerarchy
git-svn-id: svn://ultimatepp.org/upp/trunk@3850 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
parent
50b8051167
commit
b0f045daa9
1 changed files with 61 additions and 0 deletions
|
|
@ -160,6 +160,67 @@ template<class K, class T> void PolyXMLArrayMap<K, T>::Xmlize(XmlIO xml)
|
|||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// PolyXMLArrayMapPtr class -- add support for streaming polymorphic maps of smart pointers of objects
|
||||
template<class K, class T> class PolyXMLArrayMapPtr : public ArrayMap<K, Ptr<T> >
|
||||
{
|
||||
public:
|
||||
// Xmlizer
|
||||
void Xmlize(XmlIO xml);
|
||||
|
||||
void Add(const K &key, const Ptr<T> &data) { ArrayMap<K, Ptr<T> >::Add(key, data); }
|
||||
};
|
||||
|
||||
template<class K, class T> void PolyXMLArrayMapPtr<K, T>::Xmlize(XmlIO xml)
|
||||
{
|
||||
if(xml.IsStoring())
|
||||
{
|
||||
for(int i = 0; i < PolyXMLArrayMapPtr::GetCount(); i++)
|
||||
{
|
||||
// skip unlinked elements
|
||||
if(ArrayMap<K, Ptr<T> >::IsUnlinked(i))
|
||||
continue;
|
||||
Ptr<T> &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<K, T>::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<T> 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<T> raw = (T *)new PolyXMLUnknown<T>(tag, rawXml);
|
||||
Add(key, raw);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
END_UPP_NAMESPACE;
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue