quickerNES/core/abstract_file.h

108 lines
2.9 KiB
C++

// Abstract file access interfaces
#ifndef ABSTRACT_FILE_H
#define ABSTRACT_FILE_H
#undef BLARGG_CONFIG_H
#include "Data_Reader.h"
// Supports writing
class Data_Writer {
public:
Data_Writer() { }
virtual ~Data_Writer() { }
// Write 'n' bytes. NULL on success, otherwise error string.
virtual const char *write( const void*, long n ) = 0;
private:
// noncopyable
Data_Writer( const Data_Writer& );
Data_Writer& operator = ( const Data_Writer& );
};
// Write data to memory
class Mem_Writer : public Data_Writer {
char* data_;
long size_;
long allocated;
enum { expanding, fixed, ignore_excess } mode;
public:
// Keep all written data in expanding block of memory
Mem_Writer();
// Write to fixed-size block of memory. If ignore_excess is false, returns
// error if more than 'size' data is written, otherwise ignores any excess.
Mem_Writer( void*, long size, int ignore_excess = 0 );
const char *write( const void*, long );
// Pointer to beginning of written data
char* data() { return data_; }
// Number of bytes written
long size() const { return size_; }
~Mem_Writer();
};
// Auto_File to use in place of Data_Reader&/Data_Writer&, allowing a normal
// file path to be used in addition to a Data_Reader/Data_Writer.
class Auto_File_Reader {
public:
Auto_File_Reader() : data( 0 ), path( 0 ) { }
Auto_File_Reader( Data_Reader& r ) : data( &r ), path( 0 ) { }
Auto_File_Reader( Auto_File_Reader const& );
Auto_File_Reader& operator = ( Auto_File_Reader const& );
~Auto_File_Reader();
const char* open();
int operator ! () const { return !data; }
Data_Reader* operator -> () const { return data; }
Data_Reader& operator * () const { return *data; }
private:
/* mutable */ Data_Reader* data;
const char* path;
};
class Auto_File_Writer {
public:
Auto_File_Writer() : data( 0 ), path( 0 ) { }
Auto_File_Writer( Data_Writer& r ) : data( &r ), path( 0 ) { }
Auto_File_Writer( Auto_File_Writer const& );
Auto_File_Writer& operator = ( Auto_File_Writer const& );
~Auto_File_Writer();
const char* open();
const char* open_comp( int level = -1 ); // compress output if possible
int operator ! () const { return !data; }
Data_Writer* operator -> () const { return data; }
Data_Writer& operator * () const { return *data; }
private:
/* mutable */ Data_Writer* data;
const char* path;
};
inline Auto_File_Reader& Auto_File_Reader::operator = ( Auto_File_Reader const& r )
{
data = r.data;
path = r.path;
((Auto_File_Reader*) &r)->data = 0;
return *this;
}
inline Auto_File_Reader::Auto_File_Reader( Auto_File_Reader const& r ) { *this = r; }
inline Auto_File_Writer& Auto_File_Writer::operator = ( Auto_File_Writer const& r )
{
data = r.data;
path = r.path;
((Auto_File_Writer*) &r)->data = 0;
return *this;
}
inline Auto_File_Writer::Auto_File_Writer( Auto_File_Writer const& r ) { *this = r; }
#endif