HDF5 (WIP): first objects and h5dump implementation:
[scilab.git] / scilab / modules / hdf5 / src / cpp / H5CompoundData.hxx
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #ifndef __H5COMPOUNDDATA_HXX__
14 #define __H5COMPOUNDDATA_HXX__
15
16 #include "H5Data.hxx"
17
18 namespace org_modules_hdf5
19 {
20
21     class H5CompoundData : public H5BasicData<char>
22     {
23         const unsigned int nfields;
24         const std::string * fieldsname;
25         H5Data ** fieldsvalue;
26         
27     public:
28         
29         H5CompoundData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, const unsigned int _nfields, std::string * _fieldsname, H5Data ** _fieldsvalue, char * _data, const bool _dataOwner) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _data, -1, 0, _dataOwner), nfields(_nfields), fieldsname(_fieldsname), fieldsvalue(_fieldsvalue)  
30             {
31
32             }
33
34         virtual ~H5CompoundData()
35             {
36                 delete[] fieldsname;
37                 delete[] fieldsvalue;
38             }
39
40         H5Data & getData(const std::string fieldname)
41             {
42                 for (unsigned int i = 0; i < nfields; i++)
43                 {
44                     if (fieldname == fieldsname[i])
45                     {
46                         return *fieldsvalue[i];
47                     }
48                 }
49
50                 throw H5Exception(__LINE__, __FILE__, _("Invalid field name: %s"), fieldname.c_str());
51             }
52
53         virtual void toScilab(void * pvApiCtx, const int lhsPosition, int * parentList = 0, const int listPosition = 0) const
54             {
55                 static int structdims[2] = { 1, 1 };
56                 const char ** _fieldsname = new const char *[nfields + 2];
57                 SciErr err;
58                 int * scilabStruct = 0;
59
60                 _fieldsname[0] = "st";
61                 _fieldsname[1] = "dims";
62                 for (int i = 0; i < nfields; i++)
63                 {
64                     _fieldsname[i + 2] = fieldsname[i].c_str();
65                 }
66                 
67                 
68                 if (parentList)
69                 {
70                     err = createMListInList(pvApiCtx, lhsPosition, parentList, listPosition, nfields + 1, &scilabStruct);
71                 }
72                 else
73                 {
74                     err = createMList(pvApiCtx, lhsPosition, nfields + 1, &scilabStruct);
75                 }
76
77                 if (err.iErr)
78                 {
79                     delete[] _fieldsname;
80                     throw H5Exception(__LINE__, __FILE__, _("Cannot create a struct on the stack"));
81                 }
82
83                 err = createMatrixOfStringInList(pvApiCtx, lhsPosition, scilabStruct, 1, 1, nfields + 2, _fieldsname);
84                 delete[] _fieldsname;
85                 if (err.iErr)
86                 {
87                     throw H5Exception(__LINE__, __FILE__, _("Cannot create a struct on the stack"));
88                 }
89
90                 err = createMatrixOfInteger32InList(pvApiCtx, lhsPosition, scilabStruct, 2, 1, 2, structdims);
91                 if (err.iErr)
92                 {
93                     throw H5Exception(__LINE__, __FILE__, _("Cannot create a struct on the stack"));
94                 }
95
96                 for (int i = 0; i < nfields; i++)
97                 {
98                     fieldsvalue[i]->toScilab(pvApiCtx, lhsPosition, scilabStruct, i + 3);
99                 }
100             }
101     };
102 }
103
104 #endif // __H5COMPOUNDDATA_HXX__