/*! @file

    @id $Id$
*/
//       1         2         3         4         5         6         7         8
// 45678901234567890123456789012345678901234567890123456789012345678901234567890

#include <xml-cxx/xml.hxx>
#include <iostream>
#include <sstream>

//! Class with built in xml::Serialize as member, no inheritance
class A {
  public:
    A(): _ser("a") {
      _ser.persist(a, "a");
      _ser.persist(txt, "txt");
    }
    int a;
    std::string txt;
    xml::Serialize _ser;
};

//! Class that inherits xml::Serialize
class B: public xml::Serialize {
  public:
    int a;
    std::string txt;
  protected:
    void initXmlMembers() {
      className("b");
      persist(a, "a");
      persist(txt, "txt");
    }
};

//! Class with external xml::Serialize
class C {
  public:
    int a;
    std::string txt;
};

int main(int, char**) {
  { // Serialization as a member
    std::stringstream ss("<a>\n"
                         "\t<a>1234</a>\n"
                         "\t<txt>Dies ist ein Serialisierungs-Test</txt>\n"
                         "</a>");
    A a;
    a._ser.loadXml(ss);
    if (a.a==1234) a.a=4321;
    a._ser.saveXml(std::cout)<<std::endl;
  } { // Inherited Serialization
    std::stringstream ss("<b>\n"
                         "\t<a>1234</a>\n"
                         "\t<txt>Dies ist ein Serialisierungs-Test</txt>\n"
                         "</b>");
    B b;
    b.loadXml(ss);
    if (b.a==1234) b.a=4321;
    b.saveXml(std::cout)<<std::endl;
  } { // External xml::Serialize: "ser" must live in no longer than "c"!
    std::stringstream ss("<c>\n"
                         "\t<a>1234</a>\n"
                         "\t<txt>Dies ist ein Serialisierungs-Test</txt>\n"
                         "</c>");
    C c;
    xml::Serialize ser(xml::Serialize("c")
                       .persist(c.a, "a")
                       .persist(c.txt, "txt"));
    ser.loadXml(ss);
    if (c.a==1234) c.a=4321;
    ser.saveXml(std::cout)<<std::endl;
  } { // Use xml::Serialize to store anything, e.g. local variables
      // Important: "ser" must live in no longer than the variables!
    std::stringstream ss("<d>\n"
                         "\t<a>1234</a>\n"
                         "\t<txt>Dies ist ein Serialisierungs-Test</txt>\n"
                         "</d>");
    int a;
    std::string txt;
    xml::Serialize ser(xml::Serialize("d")
                       .persist(a, "a")
                       .persist(txt, "txt"));
    ser.loadXml(ss);
    if (a==1234) a=4321;
    ser.saveXml(std::cout)<<std::endl;
  }
  return 0;
}
