Salome HOME
a59c04ecc482325903128c3ccf19f60e10c41712
[modules/kernel.git] / src / HDFPersist / HDFdataset.cc
1 using namespace std;
2 extern "C"
3 {
4 #include "hdfi.h"
5 #include <string.h>
6 }
7 #include "HDFdataset.hxx"
8 #include "HDFcontainerObject.hxx"
9 #include "HDFexception.hxx"
10
11 #include <iostream.h>
12
13 HDFdataset::HDFdataset(char *name, HDFcontainerObject *father,hdf_type type, 
14                        hdf_size dim[], int dimsize)
15   : HDFinternalObject(name)
16 {
17   int i;
18
19   _father = father;
20   _fid = _father->GetId();
21   _father->AddSon(this);
22   _type = type;
23   _ndim = dimsize;
24   _dim = new hdf_size[dimsize];
25   _size = 1;
26   for (i=0;i<dimsize;i++)
27     {
28       _dim[i] = dim[i];
29       _size = _size * _dim[i];
30     }
31 }
32
33 HDFdataset::HDFdataset(char *name,HDFcontainerObject *father)
34   : HDFinternalObject(name)
35 {
36   _father = father;
37   _fid = _father->GetId();
38   _father->AddSon(this);
39   _type = HDF_NONE;
40   _ndim = -1;
41   _dim = 0;
42   _size = -1;
43 }
44
45 HDFdataset::~HDFdataset()
46 {
47   delete [] _dim;
48 }
49
50 void HDFdataset::CreateOnDisk()
51 {
52   if ((_id = HDFdatasetCreate(_fid,_name,_type,_dim,_ndim)) < 0)
53     throw HDFexception("Can't create dataset");
54 }
55
56 void HDFdataset::OpenOnDisk()
57 {
58   if ((_id = HDFdatasetOpen(_fid,_name)) < 0)
59     throw HDFexception("Can't open dataset");
60 }
61
62 void HDFdataset::CloseOnDisk()
63 {
64   hdf_err ret;
65
66   if ((ret = HDFdatasetClose(_id)) < 0)
67     throw HDFexception("Can't close dataset");
68   _id = -1;
69 }
70
71 void HDFdataset::WriteOnDisk(void *values)
72 {
73   hdf_err ret;
74
75   if ((ret = HDFdatasetWrite(_id,values)) < 0)
76     throw HDFexception("Can't write dataset");
77  
78 }
79
80 void HDFdataset::ReadFromDisk(void *values)
81 {
82   hdf_err ret;
83
84   if ((ret = HDFdatasetRead(_id,values)) < 0)
85       throw HDFexception("Can't read dataset");
86 }
87
88 HDFcontainerObject *HDFdataset::GetFather()
89 {
90   return _father;
91 }
92
93 hdf_type HDFdataset::GetType()
94 {
95   if (_type == HDF_NONE)
96     if ((_type = HDFdatasetGetType(_id)) == HDF_NONE)
97       throw HDFexception("Can't determine the type of data in the dataset");
98   
99   return _type;
100 }
101
102 int HDFdataset::nDim()
103 {
104   if (_ndim == -1)
105     if ((_ndim = HDFdatasetGetnDim(_id)) < 0)
106       throw HDFexception("Can't determine the dataset dimensions number");
107
108   return _ndim;
109 }
110
111 void HDFdataset::GetDim(hdf_size dim[])
112 {
113   int i;
114   int ndim;
115   hdf_err ret;
116
117   if (_dim == 0)
118     {
119       if (_ndim == -1)
120         ndim = HDFdatasetGetnDim(_id);
121       else
122         ndim = _ndim;
123       _dim = new hdf_size[ndim];
124       if ((ret == HDFdatasetGetDim(_id,_dim)) < 0)
125         throw HDFexception("Can't determine the size dimensions of the dataset ");
126     }
127
128   for (i=0;i<_ndim;i++)
129     dim[i] = _dim[i];
130 }
131
132 int HDFdataset::GetSize()
133 {
134   int size_type;
135
136   if (_size == -1)
137     {
138       if ((_size = HDFdatasetGetSize(_id)) < 0)
139         throw HDFexception("Can't determine the size of the dataset");
140       
141       if (_type == HDF_NONE)
142         if ((_type = HDFdatasetGetType(_id)) == HDF_NONE)
143           throw HDFexception("Can't determine the size of the dataset");
144       
145       switch (_type)
146         {
147         case HDF_INT32 : 
148           size_type = 4;
149           break;
150           
151         case HDF_INT64 :
152         case HDF_FLOAT64 :
153           size_type = 8;
154           break;
155           
156         default :
157           size_type = 1;
158         }
159       _size = _size / size_type;
160     }
161
162   return _size;
163 }
164
165 hdf_object_type HDFdataset::GetObjectType()
166 {
167   return HDF_DATASET;
168 }