HDF5: can now extract info and data from objects
[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 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)
31     {
32
33     }
34
35     virtual ~H5CompoundData()
36     {
37         delete[] fieldsname;
38         delete[] fieldsvalue;
39     }
40
41     H5Data & getData(const std::string fieldname) const
42     {
43         for (unsigned int i = 0; i < nfields; i++)
44         {
45             if (fieldname == fieldsname[i])
46             {
47                 return *fieldsvalue[i];
48             }
49         }
50
51         throw H5Exception(__LINE__, __FILE__, _("Invalid field name: %s"), fieldname.c_str());
52     }
53
54     virtual std::string dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel) const
55     {
56         return H5DataConverter::dump(alreadyVisited, indentLevel, ndims, dims, *this, false);
57     }
58
59     virtual void printData(std::ostream & os, const unsigned int pos, const unsigned int indentLevel) const
60     {
61         os << "{" << std::endl;
62         std::string indent = H5Object::getIndentString(indentLevel + 2);
63         for (unsigned int i = 0; i < nfields - 1; i++)
64         {
65             os << indent;
66             fieldsvalue[i]->printData(os, pos, indentLevel + 2);
67             os << ", " << std::endl;
68         }
69         os << indent;
70         fieldsvalue[nfields - 1]->printData(os, pos, indentLevel + 2);
71         os << std::endl << H5Object::getIndentString(indentLevel + 1) << "}";
72     }
73
74     virtual void toScilab(void * pvApiCtx, const int lhsPosition, int * parentList = 0, const int listPosition = 0) const
75     {
76         static int structdims[2] = { 1, 1 };
77         const char ** _fieldsname = new const char *[nfields + 2];
78         SciErr err;
79         int * scilabStruct = 0;
80
81         _fieldsname[0] = "st";
82         _fieldsname[1] = "dims";
83         for (int i = 0; i < nfields; i++)
84         {
85             _fieldsname[i + 2] = fieldsname[i].c_str();
86         }
87
88         if (parentList)
89         {
90             err = createMListInList(pvApiCtx, lhsPosition, parentList, listPosition, nfields + 1, &scilabStruct);
91         }
92         else
93         {
94             err = createMList(pvApiCtx, lhsPosition, nfields + 2, &scilabStruct);
95         }
96
97         if (err.iErr)
98         {
99             delete[] _fieldsname;
100             throw H5Exception(__LINE__, __FILE__, _("Cannot create a struct on the stack"));
101         }
102
103         err = createMatrixOfStringInList(pvApiCtx, lhsPosition, scilabStruct, 1, 1, nfields + 2, _fieldsname);
104         delete[] _fieldsname;
105         if (err.iErr)
106         {
107             throw H5Exception(__LINE__, __FILE__, _("Cannot create a struct on the stack"));
108         }
109
110         err = createMatrixOfInteger32InList(pvApiCtx, lhsPosition, scilabStruct, 2, 1, 2, structdims);
111         if (err.iErr)
112         {
113             throw H5Exception(__LINE__, __FILE__, _("Cannot create a struct on the stack"));
114         }
115
116         for (int i = 0; i < nfields; i++)
117         {
118             fieldsvalue[i]->toScilab(pvApiCtx, lhsPosition, scilabStruct, i + 3);
119         }
120     }
121 };
122 }
123
124 #endif // __H5COMPOUNDDATA_HXX__