Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef TPERSIST_INCLUDED
Toshihiro Shimizu 890ddd
#define TPERSIST_INCLUDED
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//#include "tsmartpointer.h"
Toshihiro Shimizu 890ddd
//#include "tpixel.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "tcommon.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#undef DVAPI
Toshihiro Shimizu 890ddd
#undef DVVAR
Toshihiro Shimizu 890ddd
#ifdef TSTREAM_EXPORTS
Toshihiro Shimizu 890ddd
#define DVAPI DV_EXPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_EXPORT_VAR
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
#define DVAPI DV_IMPORT_API
Toshihiro Shimizu 890ddd
#define DVVAR DV_IMPORT_VAR
Toshihiro Shimizu 890ddd
#endif
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
class TPersistDeclaration;
Toshihiro Shimizu 890ddd
class TIStream;
Toshihiro Shimizu 890ddd
class TOStream;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
//! This is an abstract class for load and save data from and to the file system (i.e files on the disk)
Toshihiro Shimizu 890ddd
class DVAPI TPersist
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	virtual ~TPersist(){};
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		This is a pure virtual function and must be overridden with a method that implements 
Toshihiro Shimizu 890ddd
		the object loading from a stream (i.e take the object's features from a formatted data stream). 
Toshihiro Shimizu 890ddd
		For example the TStageObject class use his implementation to take the values of the parameters 
Toshihiro Shimizu 890ddd
		that characterizes a stage object as name, coordinates, etc... from a file.
Toshihiro Shimizu 890ddd
		\a is is an input file stream
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
	virtual void loadData(TIStream &is) = 0;
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		This is a pure virtual function and must be overridden with a method that implements 
Toshihiro Shimizu 890ddd
		the object saving to a data stream (i.e put the object's features on a formatted data stream). 
Toshihiro Shimizu 890ddd
		For example the TStageObject class use his implementation to save the values of the parameters 
Toshihiro Shimizu 890ddd
		that characterizes a stage object as name, coordinates, etc... on a file
Toshihiro Shimizu 890ddd
		\a os is an output file stream.
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
	virtual void saveData(TOStream &os) = 0;
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		Returns the string identifier of the object. For example a TXsheet object is identified by "xsheet", 
Toshihiro Shimizu 890ddd
		a TStageObjectTree is identified by PegbarTree.
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
	inline string getStreamTag() const;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		This pure virtual method is used to define a global pointer to the object.
Toshihiro Shimizu 890ddd
		This method is overridden with the macro PERSIST_DECLARATION(T).
Toshihiro Shimizu 890ddd
	\n	For example:
Toshihiro Shimizu 890ddd
		\code
Toshihiro Shimizu 890ddd
class DVAPI TStageObjectTree : public TPersist {
Toshihiro Shimizu 890ddd
PERSIST_DECLARATION(TStageObjectTree)
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
...
Toshihiro Shimizu 890ddd
		
Toshihiro Shimizu 890ddd
		\endcode 
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
	virtual const TPersistDeclaration *getDeclaration() const = 0;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
	typedef TPersist *CreateProc();
Toshihiro Shimizu 890ddd
	static void declare(CreateProc *);
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		If the object identified by \a name doesn't exist,
Toshihiro Shimizu 890ddd
		this method creates it through TPersistDeclarationT class template.
Toshihiro Shimizu 890ddd
		\sa getDeclaration()
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
	static TPersist *create(const string &name);
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
		This class is used to store and retrieve the id associated to an object.
Toshihiro Shimizu 890ddd
		\sa TPersist::getStreamTag().
Toshihiro Shimizu 890ddd
		The class is istantiated by the macro  PERSIST_DECLARATION(T).
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
class DVAPI TPersistDeclaration
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
	string m_id;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	TPersistDeclaration(const string &id);
Toshihiro Shimizu 890ddd
	virtual ~TPersistDeclaration() {}
Toshihiro Shimizu 890ddd
	string getId() const { return m_id; };
Toshihiro Shimizu 890ddd
	virtual TPersist *create() const = 0;
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
inline string TPersist::getStreamTag() const { return getDeclaration()->getId(); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
		This template class is used to create an istance of the class \a T.
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
template <class t=""></class>
Toshihiro Shimizu 890ddd
class TPersistDeclarationT : public TPersistDeclaration
Toshihiro Shimizu 890ddd
{
Toshihiro Shimizu 890ddd
public:
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		This is the constructor. Its argument is the id of the object.
Toshihiro Shimizu 890ddd
		\sa TPersist::getStreamTag()
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
	TPersistDeclarationT(const string &id) : TPersistDeclaration(id) {}
Toshihiro Shimizu 890ddd
	/*!
Toshihiro Shimizu 890ddd
		Returns a pointer to a newly created object of type TPersist.
Toshihiro Shimizu 890ddd
		This template class is called by the macro PERSIST_DECLARATION(T).
Toshihiro Shimizu 890ddd
		A class that calls PERSIST_DECLARATION(T) must inherits TPersist.
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
	TPersist *create() const { return new T; };
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*!	\file tpersist.h  
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
		This macro must be included at the beginning of a class declaration,
Toshihiro Shimizu 890ddd
		and permits to create a new object of type T with the use of template 
Toshihiro Shimizu 890ddd
		class TPersistDeclarationT
Toshihiro Shimizu 890ddd
	*/
Toshihiro Shimizu 890ddd
#define PERSIST_DECLARATION(T)                        \
Toshihiro Shimizu 890ddd
private:                                              \
Toshihiro Shimizu 890ddd
	static TPersistDeclarationT<t> m_declaration;     \</t>
Toshihiro Shimizu 890ddd
                                                      \
Toshihiro Shimizu 890ddd
public:                                               \
Toshihiro Shimizu 890ddd
	const TPersistDeclaration *getDeclaration() const \
Toshihiro Shimizu 890ddd
	{                                                 \
Toshihiro Shimizu 890ddd
		return &m_declaration;                        \
Toshihiro Shimizu 890ddd
	}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#define PERSIST_IDENTIFIER(T, I) \
Toshihiro Shimizu 890ddd
	TPersistDeclarationT<t> T::m_declaration(I);</t>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//===================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#endif