#pragma once
#ifndef LIBALMOND_SERIALIZE_H
#define LIBALMOND_SERIALIZE_H

#include <MandelUtil.h>
#include "Gradient.h"

#include <string>

namespace tinyxml2
{
    class XMLElement;
    class XMLDocument;
}


namespace alm
{
    struct ImageView;


    template<typename T>
    void serialize(tinyxml2::XMLElement* elem, const T&);

    template<typename T>
    std::string toXml(const T&);

    template<typename T>
    T deserialize(tinyxml2::XMLElement* xml);

    template<typename T>
    T fromXml(const std::string& xml);


    // specializations
    template<>
    void serialize<Gradient>(tinyxml2::XMLElement* elem, const Gradient&);
    template<>
    Gradient deserialize<Gradient>(tinyxml2::XMLElement* xml);
    template<>
    std::string toXml<Gradient>(const Gradient&);
    template<>
    Gradient fromXml<Gradient>(const std::string& xml);


    template<>
    void serialize<mnd::MandelViewport>(tinyxml2::XMLElement* elem, const mnd::MandelViewport&);
    template<>
    mnd::MandelViewport deserialize<mnd::MandelViewport>(tinyxml2::XMLElement* xml);

    template<>
    void serialize<mnd::MandelInfo>(tinyxml2::XMLElement* elem, const mnd::MandelInfo&);
    template<>
    mnd::MandelInfo deserialize<mnd::MandelInfo>(tinyxml2::XMLElement* xml);

    template<>
    void serialize<ImageView>(tinyxml2::XMLElement* elem, const ImageView&);
    template<>
    ImageView deserialize<ImageView>(tinyxml2::XMLElement* xml);
    template<>
    std::string toXml<ImageView>(const ImageView&);
    template<>
    ImageView fromXml<ImageView>(const std::string& xml);
}


struct alm::ImageView
{
    mnd::MandelInfo view;
    Gradient gradient;
};

#endif // LIBALMOND_SERIALIZE_H