NeXus  1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
NeXusFile.hpp
Go to the documentation of this file.
1 #ifndef NEXUSFILE_HPP
2 #define NEXUSFILE_HPP 1
3 
4 #include <map>
5 #include <string>
6 #include <utility>
7 #include <vector>
8 #include "napi.h"
9 
10 #ifdef _WIN32
11 
12 #ifndef _MSC_VER
13 # define NXDLL_EXPORT
14 #else
15 # if IN_NEXUS_CPP_LIBRARY
16 # define NXDLL_EXPORT __declspec(dllexport)
17 # else
18 # define NXDLL_EXPORT __declspec(dllimport)
19 # endif
20 #endif /* _MSC_VER */
21 
22 #else /* _WIN32 */
23 # define NXDLL_EXPORT
24 #endif /* _WIN32 */
25 
33 namespace NeXus {
48  enum NXnumtype {
50  FLOAT64 = NX_FLOAT64,
51  INT8 = NX_INT8,
52  UINT8 = NX_UINT8,
53  // BOOLEAN = NX_BOOLEAN, // NX_BOOLEAN is currently broken
54  INT16 = NX_INT16,
55  UINT16 = NX_UINT16,
56  INT32 = NX_INT32,
57  UINT32 = NX_UINT32,
58  INT64 = NX_INT64,
59  UINT64 = NX_UINT64,
60  CHAR = NX_CHAR,
61  BINARY = NX_BINARY
62  };
63 
73  CHUNK = NX_CHUNK,
74  NONE = NX_COMP_NONE,
75  LZW = NX_COMP_LZW,
76  RLE = NX_COMP_RLE,
77  HUF = NX_COMP_HUF
78  };
79 
83  typedef std::multimap<std::string, std::string> TypeMap;
84 
88  struct Info{
92  std::vector<int64_t> dims;
93  };
94 
96  struct AttrInfo{
100  unsigned length;
102  std::string name;
103  };
104 
110  {
111  private:
113  NXhandle m_file_id;
115  bool m_close_handle;
116 
117  public:
121  std::pair<std::string, std::string> getNextEntry();
125  AttrInfo getNextAttr();
126 
127  private:
132  void compress(NXcompression comp);
133 
137  void initGroupDir();
138 
142  void initAttrDir();
143 
151  void walkFileForTypeMap(const std::string path, const std::string class_name, TypeMap &tmap);
152 
159  const std::string makeCurrentPath(const std::string currpath, const std::string subpath);
160 
166  void initOpenFile(const std::string& filename, const NXaccess access = NXACC_READ);
167 
168  public:
175  File(const std::string& filename, const NXaccess access = NXACC_READ);
176 
183  File(const char *filename, const NXaccess access = NXACC_READ);
184 
191  File(NXhandle handle, bool close_handle = false);
192 
194  ~File();
195 
197  void close();
198 
200  void flush();
201 
202  template<typename NumT>
203  void malloc(NumT*& data, const Info& info);
204 
205  template<typename NumT>
206  void free(NumT*& data);
207 
216  void makeGroup(const std::string& name, const std::string& class_name,
217  bool open_group = false);
218 
225  void openGroup(const std::string& name, const std::string& class_name);
226 
234  void openPath(const std::string& path);
235 
243  void openGroupPath(const std::string& path);
249  std::string getPath();
250 
254  void closeGroup();
255 
260  void makeData(const std::string& name, NXnumtype type,
261  const std::vector<int>& dims, bool open_data = false);
262 
271  void makeData(const std::string& name, NXnumtype type,
272  const std::vector<int64_t>& dims, bool open_data = false);
273 
282  template <typename NumT>
283  void makeData(const std::string& name, const NXnumtype type,
284  const NumT length, bool open_data = false);
285 
292  void writeData(const std::string& name, const std::string& value);
293 
300  void writeData(const std::string& name, const char* value);
301 
309  template <typename NumT>
310  void writeData(const std::string& name, const std::vector<NumT>& value);
311 
319  template <typename NumT>
320  void writeData(const std::string& name, const NumT& value);
321 
330  template <typename NumT>
331  void writeData(const std::string& name, const std::vector<NumT>& value,
332  const std::vector<int>& dims);
333 
342  template <typename NumT>
343  void writeData(const std::string& name, const std::vector<NumT>& value,
344  const std::vector<int64_t>& dims);
345 
352  template <typename NumT>
353  void writeExtendibleData(const std::string& name, std::vector<NumT>& value);
354 
362  template <typename NumT>
363  void writeExtendibleData(const std::string& name, std::vector<NumT>& value, const int64_t chunk);
364 
373  template <typename NumT>
374  void writeExtendibleData(const std::string& name, std::vector<NumT>& value,
375  std::vector<int64_t>& dims, std::vector<int64_t> & chunk);
376 
377 
385  template <typename NumT>
386  void writeUpdatedData(const std::string& name, std::vector<NumT>& value);
387 
396  template <typename NumT>
397  void writeUpdatedData(const std::string& name, std::vector<NumT>& value,
398  std::vector<int64_t>& dims);
399 
405  void makeCompData(const std::string& name, const NXnumtype type,
406  const std::vector<int>& dims, const NXcompression comp,
407  const std::vector<int>& bufsize, bool open_data = false);
408 
419  void makeCompData(const std::string& name, const NXnumtype type,
420  const std::vector<int64_t>& dims, const NXcompression comp,
421  const std::vector<int64_t>& bufsize, bool open_data = false);
422 
429  template <typename NumT>
430  void writeCompData(const std::string & name,
431  const std::vector<NumT> & value,
432  const std::vector<int> & dims, const NXcompression comp,
433  const std::vector<int> & bufsize);
434 
445  template <typename NumT>
446  void writeCompData(const std::string & name,
447  const std::vector<NumT> & value,
448  const std::vector<int64_t> & dims, const NXcompression comp,
449  const std::vector<int64_t> & bufsize);
450 
454  void openData(const std::string& name);
455 
459  void closeData();
460 
464  void putData(const void* data);
465 
470  template <typename NumT>
471  void putData(const std::vector<NumT>& data);
472 
479  void putAttr(const AttrInfo& info, const void* data);
480 
488  template <typename NumT>
489  void putAttr(const std::string& name, const NumT value);
490 
497  void putAttr(const char* name, const char* value);
498 
505  void putAttr(const std::string& name, const std::string value);
506 
511  void putSlab(void* data, std::vector<int>& start,
512  std::vector<int>& size);
513 
521  void putSlab(void* data, std::vector<int64_t>& start,
522  std::vector<int64_t>& size);
523 
528  template <typename NumT>
529  void putSlab(std::vector<NumT>& data, std::vector<int>& start,
530  std::vector<int>& size);
531 
540  template <typename NumT>
541  void putSlab(std::vector<NumT>& data, std::vector<int64_t>& start,
542  std::vector<int64_t>& size);
543 
547  template <typename NumT>
548  void putSlab(std::vector<NumT>& data, int start, int size);
549 
558  template <typename NumT>
559  void putSlab(std::vector<NumT>& data, int64_t start, int64_t size);
560 
564  NXlink getDataID();
565 
571  void makeLink(NXlink& link);
572 
579  void makeNamedLink(const std::string& name, NXlink& link);
580 
585  void openSourceGroup();
586 
592  void getData(void* data);
593 
602  template <typename NumT>
603  std::vector<NumT> * getData();
604 
613  template <typename NumT>
614  void getData(std::vector<NumT>& data);
615 
622  void getDataCoerce(std::vector<int> &data);
623 
629  void getDataCoerce(std::vector<double> &data);
630 
634  bool isDataInt();
635 
646  template <typename NumT>
647  void readData(const std::string & dataName, std::vector<NumT>& data);
648 
657  template <typename NumT>
658  void readData(const std::string & dataName, NumT & data);
659 
669  void readData(const std::string & dataName, std::string & data);
670 
674  std::string getStrData();
675 
679  Info getInfo();
680 
684  std::map<std::string, std::string> getEntries();
685 
691  void getEntries(std::map<std::string, std::string> & result);
692 
697  void getSlab(void* data, const std::vector<int>& start,
698  const std::vector<int>& size);
699 
708  void getSlab(void* data, const std::vector<int64_t>& start,
709  const std::vector<int64_t>& size);
710 
715  std::vector<AttrInfo> getAttrInfos();
716 
721  bool hasAttr(const std::string & name);
722 
731  void getAttr(const AttrInfo& info, void* data, int length = -1);
732 
741  template <typename NumT>
742  NumT getAttr(const AttrInfo& info);
743 
744 
752  template <typename NumT>
753  void getAttr(const std::string& name, NumT& value);
754 
755 
763  std::string getStrAttr(const AttrInfo & info);
764 
768  NXlink getGroupID();
769 
778  bool sameID(NXlink& first, NXlink& second);
779 
785  void printLink(NXlink & link);
786 
794  void setNumberFormat(NXnumtype& type, const std::string& format);
795 
803  std::string inquireFile(const int buff_length = NX_MAXPATHLEN);
804 
814  std::string isExternalGroup(const std::string& name,
815  const std::string& type,
816  const unsigned buff_length = NX_MAXNAMELEN);
817 
825  void linkExternal(const std::string& name, const std::string& type,
826  const std::string& url);
831  bool isDataSetOpen();
832 
838  TypeMap *getTypeMap();
839  };
840 
845  template <typename NumT>
846  NXDLL_EXPORT NXnumtype getType(NumT number = NumT());
847 
848 
849 };
850 
851 #include "NeXusStream.hpp"
852 
853 #endif