1 module dhdf5.file;
2 
3 import std..string: toStringz;
4 
5 import hdf5.hdf5;
6 
7 struct H5File
8 {
9 	enum Access
10 	{
11 		ReadOnly  = H5F_ACC_RDONLY, /*absence of rdwr => rd-only */
12 		ReadWrite = H5F_ACC_RDWR,   /*open for read and write    */
13 		Trunc     = H5F_ACC_TRUNC,  /*overwrite existing files   */
14 		Exclude   = H5F_ACC_EXCL,   /*fail if file already exists*/
15 		Create    = H5F_ACC_CREAT,  /*create non-existing files  */
16 	};
17 
18 	this(string filename, Access mode, hid_t fapl_id = H5P_DEFAULT, hid_t fcpl_id = H5P_DEFAULT)
19 	{
20 		final switch(mode)
21 		{
22 			case Access.Trunc:
23 			case Access.Exclude:
24 			{
25 				_file = H5Fcreate(filename.toStringz, mode, fcpl_id, fapl_id);
26 				break;
27 			}
28 			case Access.ReadOnly:
29 			case Access.ReadWrite:
30 			{
31 				_file = H5Fopen(filename.toStringz, mode, fapl_id);
32 				break;
33 			}
34 			case Access.Create:
35 				assert (0, "Flag H5F_ACC_CREAT is not supported.");
36 		}
37 		assert(_file >= 0);
38 	}
39 
40 	~this()
41 	{
42 		if (_file != -1)
43 		{
44 			H5Fclose(_file);
45 			_file = -1;
46 		}
47 	}
48 
49 	auto tid() const pure @safe
50 	{
51 		return _file;
52 	}
53 
54 private:
55 	hid_t _file = -1;
56 }