/*
....[@@@..[@@@..............[@.................. MUD++ is a written from
....[@..[@..[@..[@..[@..[@@@@@....[@......[@.... scratch multi-user swords and
....[@..[@..[@..[@..[@..[@..[@..[@@@@@..[@@@@@.. sorcery game written in C++.
....[@......[@..[@..[@..[@..[@....[@......[@.... This server is an ongoing
....[@......[@..[@@@@@..[@@@@@.................. development project.  All 
................................................ contributions are welcome. 
....Copyright(C).1995.Melvin.Smith.............. Enjoy. 
------------------------------------------------------------------------------
Melvin Smith (aka Fusion)         msmith@falcon.mercer.peachnet.edu 
MUD++ development mailing list    mudpp-list@spice.com
------------------------------------------------------------------------------
persistent.h
*/

#ifndef _PERSISTENT_H
#define _PERSISTENT_H

#include "io.h"
#include "string.h"

// Any object that can write or read itself to and from a stream 

class Streamable 
{
	public:
		virtual ~Streamable() {}

		// Interface for all 'Streamable' objects
		// Child classes must implement all pure virtual
		// functions and fulfill the requirement of a 'Streamable'

		virtual int readFrom( InFile & ) = 0;
		virtual int readFrom( const String & filename );
		virtual int writeTo( OutFile & ) const = 0;
		virtual int writeTo( const String & filename ) const;
		virtual int readProtoFrom( InFile & ) = 0;
		virtual int readProtoFrom( const String & filename );
		virtual int writeProtoTo( OutFile & ) const = 0;
		virtual int writeProtoTo( const String & filename ) const;
};


// Invoke virtual readFrom( InFile ) of child class.

inline int Streamable::readFrom( const String & filename )
{
	InFile in( filename.chars() );
	return readFrom( in );	
}


// Invoke virtual writeTo( OutFile ) of child class.

inline int Streamable::writeTo( const String & filename ) const
{
	OutFile out( filename.chars() );
	return writeTo( out );	
}


// Invoke virtual readProtoFrom( InFile ) of child class.

inline int Streamable::readProtoFrom( const String & filename )
{
	InFile in( filename.chars() );
	return readProtoFrom( in );	
}


// Invoke virtual writeProtoTo( OutFile ) of child class.

inline int Streamable::writeProtoTo( const String & filename ) const
{
	OutFile out( filename.chars() );
	return writeProtoTo( out );	
}

#endif