Fix bugs and it is now possible to read hyperslabs
[scilab.git] / scilab / modules / hdf5 / src / cpp / H5Dataset.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 __H5DATASET_HXX__
14 #define __H5DATASET_HXX__
15
16 #include "H5Object.hxx"
17 #include "H5Data.hxx"
18 #include "H5Dataspace.hxx"
19 #include "H5Type.hxx"
20 #include "H5AttributesList.hxx"
21
22 #define __HDF5_SCILAB_NAME_LENGTH__ 256
23
24 namespace org_modules_hdf5
25 {
26 class H5Dataset : public H5Object
27 {
28     hid_t dataset;
29
30 public :
31
32     H5Dataset(H5Object & _parent, const std::string & _name);
33     H5Dataset(H5Object & _parent, hid_t _dataset, const std::string & _name);
34
35     virtual ~H5Dataset();
36
37     hid_t getH5Id() const
38     {
39         return dataset;
40     }
41
42     virtual bool isDataset() const
43     {
44         return true;
45     }
46
47     H5Data & getData();
48     H5Data & getData(H5Dataspace & space, hsize_t * dims);
49     H5Dataspace & getSpace();
50     H5Type & getDataType();
51
52     virtual void getAccessibleAttribute(const std::string & name, const int pos, void * pvApiCtx) const;
53
54     virtual std::string dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel) const;
55     virtual std::string toString(const unsigned int indentLevel) const;
56     virtual std::string ls() const;
57     virtual void ls(std::vector<std::string> & name, std::vector<std::string> & type) const;
58     virtual void printLsInfo(std::ostringstream & os) const;
59
60     class H5Layout : public H5Object
61     {
62
63     public :
64
65         H5Layout(H5Object & _parent) : H5Object(_parent) { }
66
67         virtual hsize_t getStorageSize() const
68         {
69             return H5Dget_storage_size(parent.getH5Id());
70         }
71
72         virtual haddr_t getIOffset() const
73         {
74             return H5Dget_offset(parent.getH5Id());
75         }
76
77         virtual int getExternalCount() const
78         {
79             hid_t plist = H5Dget_create_plist(parent.getH5Id());
80             int count = H5Pget_external_count(plist);
81
82             H5Pclose(plist);
83             return count;
84         }
85
86         virtual ~H5Layout() { }
87     };
88
89     class H5CompactLayout : public H5Layout
90     {
91
92     public :
93
94         H5CompactLayout(H5Object & _parent) : H5Layout(_parent) { }
95
96         virtual ~H5CompactLayout() { }
97
98         virtual std::string dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel = 0) const
99         {
100             std::ostringstream os;
101             std::string indent = H5Object::getIndentString(indentLevel);
102             std::string indent1 = H5Object::getIndentString(indentLevel + 1);
103
104             os << indent << "STORAGE_LAYOUT {" << std::endl
105                << indent1 << "COMPACT" << std::endl
106                << indent1 << "SIZE " << getStorageSize() << std::endl
107                << indent << "}" << std::endl;
108
109             return os.str();
110         }
111     };
112
113     class H5ChunkedLayout : public H5Layout
114     {
115
116     public :
117
118         H5ChunkedLayout(H5Object & _parent) : H5Layout(_parent) { }
119
120         virtual ~H5ChunkedLayout() { }
121
122         virtual std::string dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel = 0) const
123         {
124             std::ostringstream os;
125             std::string indent = H5Object::getIndentString(indentLevel);
126             std::string indent1 = H5Object::getIndentString(indentLevel + 1);
127             // TODO: chunked est a finir (cf h5dump.c::2758)
128             os << indent << "STORAGE_LAYOUT {" << std::endl
129                << indent1 << "CHUNKED" << std::endl
130                << indent1 << "SIZE " << getStorageSize() << std::endl
131                << indent << "}" << std::endl;
132
133             return os.str();
134         }
135     };
136
137     class H5ContiguousLayout : public H5Layout
138     {
139
140     public :
141
142         H5ContiguousLayout(H5Object & _parent) : H5Layout(_parent) { }
143
144         virtual ~H5ContiguousLayout() { }
145
146         virtual std::string dump(std::map<haddr_t, std::string> & alreadyVisited, const unsigned int indentLevel = 0) const
147         {
148             std::ostringstream os;
149             std::string indent = H5Object::getIndentString(indentLevel);
150             std::string indent1 = H5Object::getIndentString(indentLevel + 1);
151             unsigned int extCount = (unsigned int)getExternalCount();
152
153             os << indent << "STORAGE_LAYOUT {" << std::endl
154                << indent1 << "CONTIGUOUS" << std::endl;
155
156             if (extCount)
157             {
158                 hid_t plist = H5Dget_create_plist(parent.getH5Id());
159                 for (unsigned int i = 0; i < extCount; i++)
160                 {
161                     off_t offset;
162                     hsize_t size;
163                     char name[__HDF5_SCILAB_NAME_LENGTH__];
164                     H5Pget_external(plist, i, __HDF5_SCILAB_NAME_LENGTH__, name, &offset, &size);
165                     os << indent1 << "FILENAME " << name << " SIZE " << size << " OFFSET " << offset << std::endl;
166                 }
167                 H5Pclose(plist);
168             }
169             else
170             {
171                 os << indent1 << "SIZE " << getStorageSize() << std::endl
172                    << indent1 << "OFFSET " << getIOffset() << std::endl;
173             }
174
175             os << indent << "}" << std::endl;
176
177             return os.str();
178         }
179     };
180
181     H5Layout & getLayout();
182
183     static hid_t create(H5Object & loc, const std::string & name, const hid_t type, const hid_t targettype, const hid_t space, void * data);
184
185 private:
186
187     void init();
188 };
189 }
190
191 #endif // __H5DATASET_HXX__