aboutsummaryrefslogtreecommitdiff
path: root/src/IO.hh
blob: f88d49d69c148e0e95d9f9a774b1e49947949db2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#ifndef __IO_HH_
#define __IO_HH_
#include "Arch.h"
#include "IEEEIOWinDllApi.h"

class IEEEIO_API 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,const 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,const 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,const 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(const 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
#if defined(CRAY) && defined(T3E)
  // 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,const 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,const 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,const void *data);
  int f_io_readck(Long8 *deviceID,int *chunkdims,int *chunkorigin,void *data); 
  int f_io_writestrm(Long8 *deviceID,const 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,const 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,const 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,const void *data);
  int f_io_readck(Long8 *deviceID,int *chunkdims,int *chunkorigin,void *data);
  int f_io_writestrm(Long8 *deviceID,const 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