ultimatepp/bazaar/PolyXML/src.tpp/WithPolyXML$en-us.tpp
micio 7b5f333a45 PolyXMKL - Topics updates
git-svn-id: svn://ultimatepp.org/upp/trunk@1892 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2010-01-14 07:56:41 +00:00

105 lines
No EOL
4.2 KiB
C++

topic "WithPolyXML";
[2 $$0,0#00000000000000000000000000000000:Default]
[i448;a25;kKO9;2 $$1,0#37138531426314131252341829483380:class]
[l288;2 $$2,2#27521748481378242620020725143825:desc]
[0 $$3,0#96390100711032703541132217272105:end]
[H6;0 $$4,0#05600065144404261032431302351956:begin]
[i448;a25;kKO9;2 $$5,0#37138531426314131252341829483370:item]
[l288;a4;*@5;1 $$6,6#70004532496200323422659154056402:requirement]
[l288;i1121;b17;O9;~~~.1408;2 $$7,0#10431211400427159095818037425705:param]
[i448;b42;O9;2 $$8,8#61672508125594000341940100500538:tparam]
[b42;2 $$9,9#13035079074754324216151401829390:normal]
[{_}%EN-US
[ {{10000@(113.42.0) [s0; [*@7;4 WithPolyXML]]}}&]
[s1;@(0.0.255)3%- &]
[s1;:noref:%- [@(0.0.255)3 template][3 _<][@(0.0.255)3 class][3 _][*@4;3 T][3 >]&]
[s1;:WithPolyXML`:`:class:%- [@(0.0.255) class]_[* WithPolyXML]_:_[@(0.0.255) public]_[*@3 Wit
hFactory]<[*@4 T]>_&]
[s8; [*C@4 T]-|Type of base class of polymorphic hyerarchy.&]
[s0; This template class implements the base behaviour of polymorphic
classes that needs to be streamed in XML format.&]
[s3; &]
[s1;@(0.0.255)3%- &]
[s1;:noref:%- [@(0.0.255)3 template][3 _<][@(0.0.255)3 class][3 _][*@4;3 T][3 >]&]
[s1;:PolyXMLArray`:`:class:%- [@(0.0.255) class]_[* PolyXMLArray]_:_[@(0.0.255) public]_[*@3 A
rray]<[_^WithPolyXML^ WithPolyXML]<[*@4 T]>_>_&]
[s8; [*C@4 T]-|Type of base class of polymorphic hyerarchy.&]
[s0; This template class implements the base behaviour of an XML`-streamable
polymorphic container.&]
[s2; &]
[s3;%- &]
[s0; &]
[ {{10000F(128)G(128)@1 [s0; [* Basic usage]]}}&]
[s3;%- &]
[s9; To implement the polymorphic XML behaviour in your base class,
just derive from [* WithPolyXML ]template :&]
[s0; &]
[s2; [* class MyBaseClass : public WithPolyXML<MyBaseClass>]&]
[s2; [* `{]&]
[s2; [* -|-|public:]&]
[s2; [* -|-|-|virtual void Xmlize(XmlIO xml);]&]
[s2; [* `};]&]
[s9; Then you can derive your class hyerarchy from base, as usual
:&]
[s0; &]
[s2; [* class MyDerivedClass : public MyBaseClass]&]
[s2; [* `{]&]
[s2; [* -|-|public:]&]
[s2; [* -|-|-|virtual void Xmlize(XmlIO xml);]&]
[s2; [* `};]&]
[s9; &]
[s9; The [* Xmlize()] virtual member function must be defined in each
class in the hyerarchy; its purpose is to XML`-ize [* ONLY ]the
direct members of the class. Because of that, in each derived
class you must call [* AT FIRST] the parent`'s class [* Xmlize()]
from inside it; here an example:&]
[s0; &]
[s2; [* void MyBaseClass`::Xmlize(XmlIO xml)]&]
[s2; [* `{]&]
[s2; [* -|-|xml]&]
[s2; [* -|-|-|(`"FirstBaseMember`", FirstBaseMember)]&]
[s2; [* -|-|-|(`"SecondBaseMember`", SecondBaseMember)]&]
[s2; [* -|-|;]&]
[s2; [* `}]&]
[s2;* &]
[s2; [* void MyDerivedClass`::Xmlize(XmlIO xml)]&]
[s2; [* `{]&]
[s2; [* -|-|MyBaseClass`::Xmlize(XmlIO xml);]&]
[s2; [* -|-|xml]&]
[s2; [* -|-|-|(`"FirstDerivedMember`", FirstDerivedMember)]&]
[s2; [* -|-|-|(`"SecondDerivedMember`", SeconDeriveddMember)]&]
[s2; [* -|-|;]&]
[s2; [* `}]&]
[s9; Don`'t forget to register your classes by [* REGISTERCLASS] macro,
see [* WithFactory ]help topic about it.&]
[s9; Then, you must declare the class container :&]
[s0; &]
[s2; [* class MyXMLContainer : public PolyXMLArray<MyXMLContainer>]&]
[s2; [* `{]&]
[s2; [* `}];&]
[s0; &]
[s0; That`'s all. Now you can construct your classes, add them to
container which behaviour is identical to Array`'s one, and stream
the container in XML format :&]
[s0; &]
[s0; Create classes and container :&]
[s2; [* MyBaseClass `* baseClass `= new MyBaseClass;]&]
[s2; [* MyBaseClass `* derivedClass `= MyBaseClass`::CreatePtr(`"MyDerivedClass`");]&]
[s2; [* MyXMLContainer myContainer;]&]
[s2; [* myContainer.Add(baseClass);]&]
[s2; [* myContainer.Add(derivedClass);]&]
[s0; &]
[s0; Stream container into a string :&]
[s2; [* String s `= StoreAsXML(myContainer, `"aTagName`");]&]
[s0; &]
[s0; Reload container from a string :&]
[s2; [* myContainer.Clear();]&]
[s2; [* bool res `= LoadFromXML(myContainer, s);]&]
[s0; &]
[s0; Store container into an xml file :&]
[s2; [* bool res `= StoreAsXMLFile(myContainer, `"aTagName`", `"a/file/path.xml`");]&]
[s0; &]
[s0; Reload container from an xml file :&]
[s2; [* myContainer.Clear();]&]
[s2; [* bool res `= LoadFromXMLFile(myContainer, `"a/file/path.xml`")]&]
[s0; ]