HDF5: bug fix and improvements
[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 #include "H5BasicData.hxx"
18
19 namespace org_modules_hdf5
20 {
21
22 class H5CompoundData : public H5BasicData<char>
23 {
24     const unsigned int nfields;
25     const std::string * fieldsname;
26     H5Data ** fieldsvalue;
27
28 public:
29
30     H5CompoundData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, const hsize_t _arank, const hsize_t * _adims, const unsigned int _nfields, std::string * _fieldsname, H5Data ** _fieldsvalue, char * _data, const bool _dataOwner) : H5BasicData(_parent, _totalSize, _dataSize, _ndims, _dims, _arank, _adims, _data, -1, 0, _dataOwner), nfields(_nfields), fieldsname(_fieldsname), fieldsvalue(_fieldsvalue)
31     {
32
33     }
34
35     virtual ~H5CompoundData()
36     {
37         delete[] fieldsname;
38         for (unsigned int i = 0; i < nfields; i++)
39         {
40             delete fieldsvalue[i];
41         }
42         delete[] fieldsvalue;
43     }
44
45     H5Data & getData(const std::string fieldname) const
46     {
47         for (unsigned int i = 0; i < nfields; i++)
48         {
49             if (fieldname == fieldsname[i])
50             {
51                 return *fieldsvalue[i];
52             }
53         }
54
55         throw H5Exception(__LINE__, __FILE__, _("Invalid field name: %s"), fieldname.c_str());
56     }
57
58     virtual std::string dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel) const
59     {
60         return H5DataConverter::dump(alreadyVisited, indentLevel, ndims, dims, *this, false);
61     }
62
63     virtual void printData(std::ostream & os, const unsigned int pos, const unsigned int indentLevel) const
64     {
65         os << "{" << std::endl;
66         std::string indent = H5Object::getIndentString(indentLevel + 2);
67         for (unsigned int i = 0; i < nfields - 1; i++)
68         {
69             os << indent;
70             fieldsvalue[i]->printData(os, pos, indentLevel + 2);
71             os << ", " << std::endl;
72         }
73         os << indent;
74         fieldsvalue[nfields - 1]->printData(os, pos, indentLevel + 2);
75         os << std::endl << H5Object::getIndentString(indentLevel + 1) << "}";
76     }
77
78     virtual void toScilab(void * pvApiCtx, const int lhsPosition, int * parentList = 0, const int listPosition = 0) const
79     {
80         // TODO: gerer le cas ndims=0 (cas SCALAR)
81
82         static int structdims[2] = { 1, 1 };
83         const char ** _fieldsname = new const char *[nfields + 2];
84         SciErr err;
85         int * scilabStruct = 0;
86
87         _fieldsname[0] = "st";
88         _fieldsname[1] = "dims";
89         for (int i = 0; i < nfields; i++)
90         {
91             _fieldsname[i + 2] = fieldsname[i].c_str();
92         }
93
94         if (parentList)
95         {
96             err = createMListInList(pvApiCtx, lhsPosition, parentList, listPosition, nfields + 1, &scilabStruct);
97         }
98         else
99         {
100             err = createMList(pvApiCtx, lhsPosition, nfields + 2, &scilabStruct);
101         }
102
103         if (err.iErr)
104         {
105             delete[] _fieldsname;
106             throw H5Exception(__LINE__, __FILE__, _("Cannot create a struct on the stack"));
107         }
108
109         err = createMatrixOfStringInList(pvApiCtx, lhsPosition, scilabStruct, 1, 1, nfields + 2, _fieldsname);
110         delete[] _fieldsname;
111         if (err.iErr)
112         {
113             throw H5Exception(__LINE__, __FILE__, _("Cannot create a struct on the stack"));
114         }
115
116         err = createMatrixOfInteger32InList(pvApiCtx, lhsPosition, scilabStruct, 2, 1, 2, structdims);
117         if (err.iErr)
118         {
119             throw H5Exception(__LINE__, __FILE__, _("Cannot create a struct on the stack"));
120         }
121
122         for (int i = 0; i < nfields; i++)
123         {
124             fieldsvalue[i]->toScilab(pvApiCtx, lhsPosition, scilabStruct, i + 3);
125         }
126     }
127 };
128 }
129
130 #endif // __H5COMPOUNDDATA_HXX__