diff options
author | tradke <tradke@21a6bef8-4479-4f54-8f8d-0db94a2919ef> | 2000-09-13 13:49:13 +0000 |
---|---|---|
committer | tradke <tradke@21a6bef8-4479-4f54-8f8d-0db94a2919ef> | 2000-09-13 13:49:13 +0000 |
commit | 8fe367ecf2cbda79960a68a052fdb84916427c0e (patch) | |
tree | 45c017765ab7f0eb6caf97540fc76ffd3bffba59 /src/IO.cc | |
parent | c490022d592551af7c29bc960cbbc09daf45972d (diff) |
Importing latest stuff from development repository
git-svn-id: http://svn.cactuscode.org/arrangements/CactusExternal/FlexIO/trunk@2 21a6bef8-4479-4f54-8f8d-0db94a2919ef
Diffstat (limited to 'src/IO.cc')
-rw-r--r-- | src/IO.cc | 371 |
1 files changed, 371 insertions, 0 deletions
diff --git a/src/IO.cc b/src/IO.cc new file mode 100644 index 0000000..a6c8eab --- /dev/null +++ b/src/IO.cc @@ -0,0 +1,371 @@ + +#include <stdio.h> +#include <string.h> +#include <limits.h> +#include "IO.hh" + +IObase::IObase(CONST char *fname,AccessMode access):index(0),nitems(0),accessmode(access){ + strcpy(filename,fname); +} + +IObase::DataType IObase::Int2DataType(int dt){ + if(dt==Byte) + return Byte; + else if(dt==Int16) + return Int16; + else if(dt==Int32) + return Int32; + else if(dt==Int64) + return Int64; + else if(dt==Float32) + return Float32; + else if(dt==Float64) + return Float64; + else if(dt==uInt8) + return uInt8; + else if(dt==uInt16) + return uInt16; + else if(dt==uInt32) + return uInt32; + else if(dt==uInt64) + return uInt64; + else if(dt==Char8) + return Char8; + else if(dt==Char16) + return Char16; + else return Error; +} + +int IObase::sizeOf(IObase::DataType dt){ + switch(dt){ + case Int8: + case uInt8: + case Char8: + return 1; + case Int16: + case uInt16: + case Char16: + return 2; + case Int32: + case uInt32: + case Float32: + return 4; + case Int64: + case uInt64: + case Float64: + return 8; + default: + return 0; + } +} + +int IObase::nElements(int rank,CONST int *dims){ + int nelem,i; + for(i=0,nelem=1;i<rank;i++) nelem*=dims[i]; + return nelem; +} + +int IObase::nBytes(IObase::DataType dt, int rank,CONST int *dims){ + return nElements(rank,dims)*sizeOf(dt); +} + +int f_io_close(Long8 *deviceID){ + IObase *dev=(IObase*)(*deviceID); + delete dev; + *deviceID=0; + return 1; +} + +int f_io_isvalid(Long8 *deviceID){ + if(!deviceID || !*deviceID) return 0; + IObase *dev=(IObase*)(*deviceID); + return dev->isValid(); +} + +int f_io_sizeof(int *type){ + return IObase::sizeOf(IObase::Int2DataType(*type)); +} + +int f_io_nelements(int *rank,int *dims){ + return IObase::nElements(*rank,dims); +} + +int f_io_nbytes(int *type,int *rank,int *dims){ + return IObase::nBytes(IObase::Int2DataType(*type),*rank,dims); +} + +int f_io_write(Long8 *deviceID,int *typeID,int *rank,int *dims,void *data){ + IObase *dev=(IObase*)(*deviceID); + dev->write(dev->Int2DataType(*typeID),*rank,dims,data); + return 1; +} + +int f_io_readinfo(Long8 *deviceID,int *typeID,int *rank,int *dims,int *maxdims){ + IObase *dev=(IObase*)(*deviceID); + IObase::DataType tid; + if(*maxdims<0) *maxdims=0; + int r=dev->readInfo(tid,*rank,dims,*maxdims); + //int r=dev->readInfo(tid,*rank,dims); + *typeID=tid; + return r; +} + +int f_io_numdata(Long8 *deviceID){ + IObase *dev=(IObase*)(*deviceID); + return dev->nDatasets(); +} +int f_io_read(Long8 *deviceID,void *data){ + IObase *dev=(IObase*)(*deviceID); + return dev->read(data); +} + +int f_io_seek(Long8 *deviceID,int *dataset_index){ + IObase *dev=(IObase*)(*deviceID); + return dev->seek(*dataset_index); +} +//--------------Annotations +int f_io_writenote(Long8 *deviceID,char *annotation,int size){ + IObase *dev=(IObase*)(*deviceID); + annotation[size]='\0'; // Yeah! its unsafe I know..!! (but it works!) + return dev->writeAnnotation(annotation); +} + +int f_io_readnote(Long8 *deviceID,int *index,char *annotation,int maxsize){ + IObase *dev=(IObase*)(*deviceID); + return dev->readAnnotation(*index,annotation,maxsize); +} + +int f_io_noteinfo(Long8 *deviceID,int *index,int *length){ + IObase *dev=(IObase*)(*deviceID); + return dev->readAnnotationInfo(*index,*length); +} + +int f_io_numnote(Long8 *deviceID){ + IObase *dev=(IObase*)(*deviceID); + return dev->nAnnotations(); +} + +//---------------Attributes +int f_io_writeatt(Long8 *deviceID,char *name, + int *datatype,Long *nelements,void *data,int namesize){ + IObase *dev=(IObase*)(*deviceID); + name[namesize]='\0'; // cap name (to be certain).. unsafe but it works + // should copy into a flexarray which will be destroyed on return + IObase::DataType typeID = IObase::Int2DataType(*datatype); + return dev->writeAttribute(name,typeID,*nelements,data); +} + +int f_io_attinfo(Long8 *deviceID,char *name, + int *datatype,Long *nelements,int namesize){ + IObase *dev=(IObase*)(*deviceID); + IObase::DataType typeID; + if(namesize>0) + name[namesize]='\0'; + int i=dev->readAttributeInfo(name,typeID,*nelements); + *datatype=typeID; + return i; +} + +int f_io_iattinfo(Long8 *deviceID,int *index,char *name, + int *datatype,Long *nelements,int namesize){ + int i; + IObase *dev=(IObase*)(*deviceID); + IObase::DataType typeID; + for(i=0;i<namesize;i++) name[i]='\0'; + //printf("io_iattinfo(): Namesize=%u Name=[%s]\n",namesize,name); + i=dev->readAttributeInfo(*index,name,typeID,*nelements,namesize); + // need to zero the array + //printf("io_iattinfo(): Newname=[%s]\n",name); + *datatype=typeID; + //printf("io_iattinfo(): attribs are index=%u type=%u nelements=%u namesize=%u\n", + // *index,*datatype,*nelements,namesize); + return i; +} + +int f_io_readatt(Long8 *deviceID,int *number,void *data){ + IObase *dev=(IObase*)(*deviceID); + return dev->readAttribute(*number,data); +} + +int f_io_numatt(Long8 *deviceID){ + IObase *dev=(IObase*)(*deviceID); + return dev->nAttributes(); +} + +//==========F77 Chunking interface-------------------- +int f_io_reserveck(Long8 *deviceID,int *typeID,int *rank,int *dims){ + IObase *dev=(IObase*)(*deviceID); + return dev->reserveChunk(dev->Int2DataType(*typeID),*rank,dims); +} + +int f_io_writeck(Long8 *deviceID,int *chunkdims,int *chunkorigin,void *data){ + IObase *dev=(IObase*)(*deviceID); + return dev->writeChunk(chunkdims,chunkorigin,data); +} + +int f_io_readck(Long8 *deviceID,int *chunkdims,int *chunkorigin,void *data){ + IObase *dev=(IObase*)(*deviceID); + return dev->readChunk(chunkdims,chunkorigin,data); +} +int f_io_writestrm(Long8 *deviceID,void *data,int *length){ + IObase *dev=(IObase*)(deviceID); + return dev->writeStream(data,*length); +} + +int f_io_readstrm(Long8 *deviceID,void *data,int *length){ + IObase *dev=(IObase*)(deviceID); + return dev->readStream(data,*length); +} + +int f_io_pause(Long8 *deviceID){ + IObase *dev=(IObase*)(deviceID); + return dev->pause(); +} + +int f_io_resume(Long8 *deviceID){ + IObase *dev=(IObase*)(deviceID); + return dev->resume(); +} + +//====================C Interface======================== +int IOclose(IOFile deviceID){ + IObase *dev=(IObase*)(deviceID); + delete dev; + deviceID=0; + return 1; +} + +int IOisValid(IOFile deviceID){ + if(!deviceID) return 0; + IObase *dev=(IObase*)(deviceID); + return dev->isValid(); +} + +int IOsizeOf(int type){ + return IObase::sizeOf(IObase::Int2DataType(type)); +} + +int IOnElements(int rank,int *dims){ + return IObase::nElements(rank,dims); +} + +int IOnBytes(int type,int rank,int *dims){ + return IObase::nBytes(IObase::Int2DataType(type),rank,dims); +} + +int IOwrite(IOFile deviceID,int typeID,int rank,int *dims,void *data){ + IObase *dev=(IObase*)(deviceID); + return dev->write(dev->Int2DataType(typeID),rank,dims,data); +} + +int IOreadInfo(IOFile deviceID,int *typeID,int *rank,int *dims,int maxdims){ + IObase *dev=(IObase*)(deviceID); + IObase::DataType tid; + int r=dev->readInfo(tid,*rank,dims,maxdims); + *typeID=tid; + return r; +} + +int IOread(IOFile deviceID,void *data){ + IObase *dev=(IObase*)(deviceID); + return dev->read(data); +} + +int IOseek(IOFile deviceID,int dataset_index){ + IObase *dev=(IObase*)(deviceID); + return dev->seek(dataset_index); +} + +int IOnDatasets(IOFile deviceID){ + IObase *dev=(IObase*)(deviceID); + return dev->nDatasets(); +} + +int IOwriteAnnotation(IOFile deviceID,char *annotation){ + IObase *dev=(IObase*)(deviceID); + //annotation[size]='\0'; // Yeah! its unsafe I know..!! (but it works!) + return dev->writeAnnotation(annotation); +} + +int IOreadAnnotation(IOFile deviceID,int index,char *annotation,int maxsize){ + IObase *dev=(IObase*)(deviceID); + return dev->readAnnotation(index,annotation,maxsize); +} + +int IOreadAnnotationInfo(IOFile deviceID,int index,int *size){ + IObase *dev=(IObase*)(deviceID); + return dev->readAnnotationInfo(index,*size); +} + +int IOnAnnotations(IOFile deviceID){ + IObase *dev=(IObase*)(deviceID); + return dev->nAnnotations(); +} + +int IOwriteAttribute(IOFile deviceID,char *name,int type,Long length,void *data){ + IObase *dev=(IObase*)(deviceID); + IObase::DataType typeID = IObase::Int2DataType(type); + return dev->writeAttribute(name,typeID,length,data); +} + +int IOreadIndexedAttributeInfo(IOFile deviceID,int number,char *name, + int *type,Long *nelem,int maxnamelen){ + IObase *dev=(IObase*)(deviceID); + IObase::DataType typeID; + int i=dev->readAttributeInfo(number,name,typeID,*nelem,maxnamelen); + *type=typeID; // convert from enum + return i; +} + +int IOreadAttributeInfo(IOFile deviceID,char *name,int *type,Long *nelem){ + IObase *dev=(IObase*)(deviceID); + IObase::DataType typeID; + int i=dev->readAttributeInfo(name,typeID,*nelem); + *type=typeID; // convert from enum + return i; +} + +int IOreadAttribute(IOFile deviceID,int number,void *data){ + IObase *dev=(IObase*)(deviceID); + return dev->readAttribute(number,data); +} + +int IOnAttributes(IOFile deviceID){ + IObase *dev=(IObase*)(deviceID); + return dev->nAttributes(); +} + +//=============C Chunking interface--------------- +int IOreserveChunk(IOFile deviceID,int typeID,int rank,int *dims){ + IObase *dev=(IObase*)(deviceID); + return dev->reserveChunk(dev->Int2DataType(typeID),rank,dims); +} + +int IOwriteChunk(IOFile deviceID,int *chunkdims,int *chunkorigin,void *data){ + IObase *dev=(IObase*)(deviceID); + return dev->writeChunk(chunkdims,chunkorigin,data); +} + +int IOreadChunk(IOFile deviceID,int *chunkdims,int *chunkorigin,void *data){ + IObase *dev=(IObase*)(deviceID); + return dev->readChunk(chunkdims,chunkorigin,data); +} + +int IOwriteStream(IOFile deviceID,void *data,int length){ + IObase *dev=(IObase*)(deviceID); + return dev->writeStream(data,length); +} + +int IOreadStream(IOFile deviceID,void *data,int length){ + IObase *dev=(IObase*)(deviceID); + return dev->readStream(data,length); +} +int IOpause(IOFile deviceID){ + IObase *dev=(IObase*)(deviceID); + return dev->pause(); +} + +int IOresume(IOFile deviceID){ + IObase *dev=(IObase*)(deviceID); + return dev->resume(); +} |