aboutsummaryrefslogtreecommitdiff
path: root/src/IO.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/IO.hh')
-rw-r--r--src/IO.hh188
1 files changed, 188 insertions, 0 deletions
diff --git a/src/IO.hh b/src/IO.hh
new file mode 100644
index 0000000..330a8d1
--- /dev/null
+++ b/src/IO.hh
@@ -0,0 +1,188 @@
+#ifndef __IO_HH_
+#define __IO_HH_
+#include "Arch.h"
+
+class IObase {
+public:
+ //-----------------------Public Enums....................
+ enum AccessMode {Read=0,Write=1,Create=1,Append=2};
+ enum DataType {Byte=0,Int8=0,Int16=1,Int32=2,Int64=3,
+ Float32=4,Float64=5,
+ uInt8=6,uChar=6,uInt16=7,uInt32=8,uInt64=9,
+ Char=10,Char8=10,String=10,Unicode=11,Char16=11, // special string types
+ Error=-1};
+protected:
+ //-----------------------State variables.................
+ int index,nitems;
+ AccessMode accessmode;
+ char filename[256];
+public:
+ //------------------------core stuff.....................
+ IObase(CONST char *fname,AccessMode access);
+ virtual ~IObase() {}
+ virtual int isValid() { return 0; }
+ // could use overloading to differentiate type here... (but I'm going simple)
+ virtual int write(DataType typeID,int rank,CONST int *dims,void *data)=0;
+ virtual int readInfo(DataType &typeID,int &rank,int *dims,int maxdims=3)=0;
+ virtual int read(void *data)=0;
+ virtual int seek(int dataset_index)=0;
+ virtual int nDatasets()=0;
+ virtual int writeAnnotation(CONST char *annotation)=0;
+ virtual int readAnnotationInfo(int number,int &length)=0; // returns length (-1 if none left)
+ virtual int readAnnotation(int number,char *annotation,int maxsize=128)=0;
+ virtual int nAnnotations()=0;
+
+ virtual int writeAttribute(CONST char *name,IObase::DataType typeID,Long length,void *data)=0;
+ // returns number
+ virtual int readAttributeInfo(int number,char *name,IObase::DataType &typeID,Long &nelem,int maxnamelen=128)=0;
+ virtual int readAttributeInfo(CONST char *name,IObase::DataType &typeID,Long &nelem)=0; // returns number
+
+#ifdef T3E
+ /********** Kludge for T3E support*/
+ inline int readAttributeInfo(int number,char *name,IObase::DataType &typeID,int &nelem,int maxnamelen=128){
+ register Long n=nelem;
+ register int r=this->readAttributeInfo(number,name,typeID,n,maxnamelen);
+ nelem=n;
+ return r;
+}
+ inline int readAttributeInfo(CONST char *name,IObase::DataType &typeID,int &nelem){
+ register Long n=nelem;
+ register int r=this->readAttributeInfo(name,typeID,n);
+ nelem=n;
+ return r;
+}
+ // returns number
+#endif
+
+ virtual int readAttribute(int number,void *data)=0;
+ // virtual Long readAttribute(char *name,void *data);
+ virtual int nAttributes()=0;
+
+ //-----------------Chunking Features (for MPI/HPF)................
+ virtual int reserveChunk(IObase::DataType typeID,int rank,CONST int *dims)=0;
+
+ virtual int writeChunk(CONST int *chunkdims,CONST int *chunkorigin,void *data)=0;
+ // virtual int writeStridedChunk()=0;
+ // virtual int writeHPF(int processorID,int *proclayout,IObase::HPFlayout *arraylayout,void *data)=0;
+ virtual int readChunk(CONST int *chunkdims,CONST int *chunkorigin,void *data)=0;
+ // virtual int readStrided()=0;
+ // virtual int readHPF(int processorID,int *proclayout,IObase::HPFlayout *arraylayout,void *data)=0;
+ //-----------------Streaming interface (for PANDA, Sockets & MPIO).........
+ virtual int reserveStream(IObase::DataType typeID,int rank,CONST int *dims)=0;
+ virtual int writeStream(void *data,int length)=0;
+ virtual int readStream(void *data,int length)=0;
+ //-----------------------Utilities........................
+ // unfortunately you can cast enums to int but not the reverse
+ static DataType Int2DataType(int dt);
+ static int sizeOf(DataType dt);
+ static int nElements(int rank,CONST int *dims); // returns number of elements in dataset
+ static int nBytes(DataType dt,int rank,CONST int *dims); // returns number of bytes (good for malloc)
+ CONST char *name() { return filename; }
+ virtual int pause() { return 0; }
+ virtual int resume() { return 0; }
+};
+
+//===================Fortran77 Interface
+#define f_io_close F77NAME(io_close_,io_close,IO_CLOSE)
+#define f_io_isvalid F77NAME(io_isvalid_,io_isvalid,IO_ISVALID)
+#define f_io_sizeof F77NAME(io_sizeof_,io_sizeof,IO_SIZEOF)
+#define f_io_nbytes F77NAME(io_nbytes_,io_nbytes,IO_NBYTES)
+#define f_io_nelements F77NAME(io_nelements_,io_nelements,IO_NELEMENTS)
+#define f_io_write F77NAME(io_write_,io_write,IO_WRITE)
+#define f_io_readinfo F77NAME(io_readinfo_,io_readinfo,IO_READINFO)
+#define f_io_read F77NAME(io_read_,io_read,IO_READ)
+#define f_io_seek F77NAME(io_seek_,io_seek,IO_SEEK)
+#define f_io_numdata F77NAME(io_numdata_,io_numdata,IO_NUMDATA)
+#define f_io_writenote F77NAME(io_writenote_,io_writenote,IO_WRITENOTE)
+#define f_io_readnote F77NAME(io_readnote_,io_readnote,IO_READNOTE)
+#define f_io_numnote F77NAME(io_numnote_,io_numnote,IO_NUMNOTE)
+#define f_io_writeatt F77NAME(io_writeatt_,io_writeatt,IO_WRITEATT)
+#define f_io_attinfo F77NAME(io_attinfo_,io_attinfo,IO_ATTINFO)
+#define f_io_iattinfo F77NAME(io_iattinfo_,io_iattinfo,IO_IATTINFO)
+#define f_io_readatt F77NAME(io_readatt_,io_readatt,IO_READATT)
+#define f_io_numatt F77NAME(io_numatt_,io_numatt,IO_NUMATT)
+#define f_io_reserveck F77NAME(io_reserveck_,io_reserveck,IO_RESERVECK)
+#define f_io_writeck F77NAME(io_writeck_,io_writeck,IO_WRITECK)
+#define f_io_readck F77NAME(io_readck_,io_readck,IO_READCK)
+#define f_io_writestrm F77NAME(io_writestrm_,io_writestrm,IO_WRITESTRM)
+#define f_io_readstrm F77NAME(io_readstrm_,io_readstrm,IO_READSTRM)
+#define f_io_pause F77NAME(io_pause_,io_pause,IO_PAUSE)
+#define f_io_resume F77NAME(io_resume_,io_resume,IO_RESUME)
+extern "C"{
+//================Ansi C interface
+#include "IOProtos.h"
+//==== f77 interface
+#ifdef CRAY
+ // Cray fortran uses an _fcd data structure to pass strings. This is in preparation
+ // for using this on Crays, but since nobody is using them yet, I've left the code for
+ // these versions of the routines blank. It'll be filled in later if the need arises
+#include <fortran.h>
+ int f_io_close (Long8 *deviceID);
+ int f_io_isvalid (Long8 *deviceID);
+ int f_io_sizeof (int *datatype);
+ int f_io_nelements (int *rank,int *dims);
+ int f_io_nbytes (int *datatype,int *rank,int *dims);
+ int f_io_write (Long8 *deviceID,int *typeID,int *rank,int *dims,void *data);
+ int f_io_readinfo (Long8 *deviceID,int *typeID,int *rank,int *dims,int *maxdims);
+ int f_io_read (Long8 *deviceID,void *data);
+ int f_io_seek (Long8 *deviceID,int *dataset_index);
+ int f_io_numdata (Long8 *deviceID);
+ int f_io_writenote (Long8 *deviceID,_fcd fcannotation);
+ int f_io_noteinfo (Long8 *deviceID,int *number,int *length);
+ int f_io_readnote (Long8 *deviceID,int *number,_fcd fcannotation);
+ int f_io_numnote (Long8 *deviceID);
+
+ int f_io_writeatt (Long8 *deviceID,_fcd fcname,
+ int *datatype,Long *nelements,void *data);
+ int f_io_attinfo (Long8 *deviceID,_fcd fcname,
+ int *datatype,Long *nelements);
+ int f_io_iattinfo (Long8 *deviceID,int *index,_fcd fcname,
+ int *datatype,Long *nelements);
+ int f_io_readatt (Long8 *deviceID,int *number,void *data);
+ int f_io_numatt (Long8 *deviceID);
+ int f_io_reserveck(Long8 *deviceID,int *typeID,int *rank,int *dims);
+ int f_io_writeck(Long8 *deviceID,int *chunkdims,int *chunkorigin,void *data);
+ int f_io_readck(Long8 *deviceID,int *chunkdims,int *chunkorigin,void *data);
+ int f_io_writestrm(Long8 *deviceID,void *data,int *length);
+ int f_io_readstrm(Long8 *deviceID,void *data,int *length);
+ int f_io_pause(Long8 *deviceID);
+ int f_io_resume(Long8 *deviceID);
+#else
+ int f_io_close (Long8 *deviceID);
+ int f_io_isvalid (Long8 *deviceID);
+ int f_io_sizeof (int *datatype);
+ int f_io_nelements (int *rank,int *dims);
+ int f_io_nbytes (int *datatype,int *rank,int *dims);
+ int f_io_write (Long8 *deviceID,int *typeID,int *rank,int *dims,void *data);
+ int f_io_readinfo (Long8 *deviceID,int *typeID,int *rank,int *dims,int *maxdims);
+ int f_io_read (Long8 *deviceID,void *data);
+ int f_io_seek (Long8 *deviceID,int *dataset_index);
+ int f_io_numdata (Long8 *deviceID);
+
+ int f_io_writenote (Long8 *deviceID,char *annotation,int size);
+ int f_io_noteinfo (Long8 *deviceID,int *number,int length);
+ int f_io_readnote (Long8 *deviceID,int *number,char *annotation,int maxsize);
+ int f_io_numnote (Long8 *deviceID);
+
+ int f_io_writeatt (Long8 *deviceID,char *name,
+ int *datatype,Long *nelements,void *data,int namesize);
+ int f_io_attinfo (Long8 *deviceID,char *name,
+ int *datatype,Long *nelements,int namesize);
+ int f_io_iattinfo (Long8 *deviceID,int *index,char *name,
+ int *datatype,Long *nelements,int namesize);
+ int f_io_readatt (Long8 *deviceID,int *number,void *data);
+ int f_io_numatt (Long8 *deviceID);
+ int f_io_reserveck(Long8 *deviceID,int *typeID,int *rank,int *dims);
+ int f_io_writeck(Long8 *deviceID,int *chunkdims,int *chunkorigin,void *data);
+ int f_io_readck(Long8 *deviceID,int *chunkdims,int *chunkorigin,void *data);
+ int f_io_writestrm(Long8 *deviceID,void *data,int *length);
+ int f_io_readstrm(Long8 *deviceID,void *data,int *length);
+ int f_io_pause(Long8 *deviceID);
+ int f_io_resume(Long8 *deviceID);
+#endif
+}
+
+#endif
+
+
+