Bug 13689 fixed: There were errors in reading enum from hdf5 files
[scilab.git] / scilab / modules / hdf5 / src / cpp / H5EnumData.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.1-en.txt
10  *
11  */
12
13 #ifndef __H5ENUMDATA_HXX__
14 #define __H5ENUMDATA_HXX__
15
16 #include <map>
17 #include <string>
18 #include <vector>
19
20 #include "H5Data.hxx"
21
22 namespace org_modules_hdf5
23 {
24
25 template<typename T>
26 class H5EnumData : public H5BasicData<T>
27 {
28     typedef std::map<T, std::string> MapType;
29     const unsigned int nmembers;
30     const std::string * names;
31     MapType map;
32
33 public:
34
35     H5EnumData(H5Object & _parent, const hsize_t _totalSize, const hsize_t _dataSize, const hsize_t _ndims, const hsize_t * _dims, T * _data, hid_t enumType, hid_t nativeType, const unsigned int _nmembers, const std::string * _names, const hsize_t _stride, const size_t _offset, const bool _dataOwner) : H5BasicData<T>(_parent, _totalSize, _dataSize, _ndims, _dims, _data, _stride, _offset, _dataOwner), nmembers(_nmembers), names(_names)
36     {
37         hid_t super = H5Tget_super(enumType);
38         for (unsigned long long i = 0; i < nmembers; ++i)
39         {
40             T value = 0;
41             H5Tget_member_value(enumType, i, &value);
42             H5Tconvert(super, nativeType, 1, &value, 0, H5P_DEFAULT);
43             map.insert(std::pair<T, std::string>(value, names[i]));
44         }
45     }
46
47     virtual ~H5EnumData()
48     {
49         if (names)
50         {
51             delete[] names;
52         }
53     }
54
55     virtual void printData(std::ostream & os, const unsigned int pos, const unsigned int indentLevel) const
56     {
57         typename MapType::const_iterator i = map.find(static_cast<T *>(H5BasicData<T>::getData())[pos]);
58         os << i->second;
59     }
60 };
61 }
62
63 #endif // __H5ENUMDATA_HXX__