Scopira  20080306
directio.h
1 
2 /*
3  * Copyright (c) 2004-2007 National Research Council
4  *
5  * All rights reserved.
6  *
7  * This material is confidential and proprietary information of
8  * National Research Council Canada ("Confidential Information").
9  * This Confidential Information may only be used and reproduced
10  * in accordance with the terms of the license agreement.
11  *
12  */
13 
14 #ifndef __INCLUDED_SCOPIRA_BASEKIT_DIRECTIO_H__
15 #define __INCLUDED_SCOPIRA_BASEKIT_DIRECTIO_H__
16 
17 #include <vector>
18 
19 #include <scopira/tool/platform.h>
20 #include <scopira/tool/export.h>
21 #include <scopira/tool/fileflow.h>
22 #include <scopira/tool/array.h>
23 #include <scopira/basekit/narray.h>
24 
25 namespace scopira
26 {
27  namespace basekit
28  {
29  struct directio_header_t;
30 
31  SCOPIRA_EXPORT bool save_directio_file_impl(const std::string &filename, short numdimen, const size_t *dimen, size_t elemsize, const char *id, const void *data);
32  SCOPIRA_EXPORT bool load_directio_file_impl(const std::string &filename, short numdimen, size_t *dimen, size_t elemsize, const char *id, void * &outary);
33  SCOPIRA_EXPORT bool bind_direct_file_impl(scopira::tool::fileflow *f, scopira::tool::byte_t * &baseary, size_t len, narray_delete_i * &func, bool readonly);
34  SCOPIRA_EXPORT bool create_directio_file_impl(const std::string &filename, short numdimen, size_t *dimen, size_t elemsize, const char *id);
35  SCOPIRA_EXPORT bool bind_directio_file_impl(const std::string &filename, short numdimen, size_t *dimen, size_t elemsize, const char *id, bool readonly, void * &outary, narray_delete_i * &outfunc);
36  SCOPIRA_EXPORT void sync_directio_file(narray_delete_i *d);
37 
38  // traits stuff
39  template <class T> class directio_traints { public: typedef T data_type; };
40  template <> class directio_traints<float> { public: static const char * get_name(void) { return "float32"; } };
41  template <> class directio_traints<double> { public: static const char * get_name(void) { return "float64"; } };
42  template <> class directio_traints<char> { public: static const char * get_name(void) { return "int8"; } };
43  template <> class directio_traints<short> { public: static const char * get_name(void) { return "int16"; } };
44  template <> class directio_traints<int> { public: static const char * get_name(void) { return "int32"; } };
45 
59  SCOPIRA_EXPORT bool query_directio_file(const std::string &filename,
60  std::string &elementtype, std::vector<size_t> &dimen);
61 
72  template <class T, int DIM>
73  bool load_directio_file(const std::string &filename,
75  nindex<DIM> d;
76 
77  void *baseary;
78  if (!load_directio_file_impl(filename, DIM, d.c_array(), sizeof(T), directio_traints<T>::get_name(), baseary))
79  return false;
80  out.resize_direct(d, reinterpret_cast<T*>(baseary), normal_narray_delete);
81  return true;
82  }
83 
94  template <class T, int DIM>
95  bool save_directio_file(const std::string &filename,
97  return save_directio_file_impl(filename, DIM, in.dimen().c_array(), sizeof(T), directio_traints<T>::get_name(), in.c_array());
98  }
99 
108  template <class T, int DIM>
110  scopira::basekit::nindex<DIM> sz, scopira::basekit::narray<T,DIM> &out, bool readonly = false, scopira::tool::fileflow::offset_t skipb = 0)
111  {
112  scopira::tool::byte_t *baseary;
113  narray_delete_i *func;
114  out.resize(nindex<DIM>(0));
115  if (!bind_direct_file_impl(f, baseary, sz.product()*sizeof(T)+skipb, func, readonly))
116  return false;
117  baseary += skipb;
118  out.resize_direct(sz, reinterpret_cast<T*>(baseary), func);
119  return true;
120  }
121 
136  template <class T, int DIM>
137  bool inline create_directio_file(const std::string &filename, nindex<DIM> sz)
138  {
139  return create_directio_file_impl(filename, DIM, sz.c_array(), sizeof(T), directio_traints<T>::get_name());
140  }
158  template <class T, int DIM>
159  bool bind_directio_file(const std::string &filename, narray<T,DIM> &out, bool readonly = false) {
160  nindex<DIM> d;
161 
162  void *baseary;
163  narray_delete_i *func;
164  if (!bind_directio_file_impl(filename, DIM, d.c_array(), sizeof(T), directio_traints<T>::get_name(), readonly, baseary, func))
165  return false;
166  out.resize_direct(d, reinterpret_cast<T*>(baseary), func);
167  return true;
168  }
169  template <class T, int DIM>
170  inline void sync_directio_file(const narray<T,DIM> &out) {
171  sync_directio_file(out.get_direct());
172  }
173 
174 
175  class base_directio_slice;
176  template <class T, int DIM> class directio_slice;
177  }
178 }
179 
186 {
187  public:
193  SCOPIRA_EXPORT bool failed(void) const { return dm_file.failed(); }
194 
201  size_t size_rows(void) const {
202  assert(dm_dimen.size()>0);
203  return dm_dimen[dm_dimen.size()-1];
204  }
205 
206  // add custom load_array(void* ) with auto dm_baseoffset for external slice loading?
207 
208  protected:
210  SCOPIRA_EXPORT base_directio_slice(void);
211 
218  SCOPIRA_EXPORT bool open_file(const std::string &filename, bool readonly,
219  size_t dimlen, size_t elemsize, const char *elemname);
220 
221  protected:
222  SCOPIRA_EXPORT void verify_dimen(const char *elemname, size_t subprod);
223  SCOPIRA_EXPORT size_t seek_slice(size_t r, size_t elemsize); // returns rowsize IN elements
224 
225  protected:
226  scopira::tool::fileflow dm_file;
227  scopira::tool::fileflow::offset_t dm_baseoffset;
228  scopira::tool::basic_array<size_t> dm_dimen; //this contains all the dimen of the file, including the last dimention
229  const char *dm_elemname;
230  size_t dm_dimenprod;
231 };
232 
238 template <class T, int DIM> class scopira::basekit::directio_slice : public scopira::basekit::base_directio_slice
239 {
240  public:
242  directio_slice(void) { }
243 
250  bool open_file(const std::string &filename, bool readonly) {
251  return base_directio_slice::open_file(filename, readonly, DIM, sizeof(T), directio_traints<T>::get_name());
252  }
253 
260  assert(DIM == dm_dimen.size());
262 
263  for (int i=0; i<ret.size(); ++i)
264  ret[i] = dm_dimen[i];
265  return ret;
266  }
267 
274  assert(DIM == dm_dimen.size());
275  scopira::basekit::nindex<DIM-1> ret;
276 
277  for (int i=0; i<ret.size(); ++i)
278  ret[i] = dm_dimen[i];
279  return ret;
280  }
281 
288  verify_dimen(directio_traints<T>::get_name(), out.dimen().product());
289  size_t numelem = seek_slice(r, sizeof(T));
290  return dm_file.read_array(out.c_array(), numelem) == numelem;
291  }
292 
299  verify_dimen(directio_traints<T>::get_name(), out.dimen().product());
300  size_t numelem = seek_slice(r, sizeof(T));
301  return dm_file.write_array(out.c_array(), numelem) == numelem;
302  }
303 };
304 
305 #endif
306 
bool open_file(const std::string &filename, bool readonly)
Definition: directio.h:250
bool failed(void) const
Definition: directio.h:193
directio_slice(void)
ctor
Definition: directio.h:242
Definition: archiveflow.h:20
Definition: narray.h:69
Definition: directio.h:39
size_t * c_array(void)
Definition: array.h:632
const index_type & dimen(void) const
gets the size of this array
Definition: narray.h:867
Definition: narray.h:96
narray_delete_i * normal_narray_delete
bool bind_directio_file(const std::string &filename, narray< T, DIM > &out, bool readonly=false)
Definition: directio.h:159
void resize_direct(index_type sz, T *direct_ary, scopira::basekit::narray_delete_i *delfunc=null_narray_delete)
Definition: narray.h:1373
size_t product(void) const
Return the product of this coord.
Definition: narray.h:713
Definition: directio.h:176
Definition: fileflow.h:60
scopira::basekit::nindex< DIM > dimen(void) const
Definition: directio.h:259
bool open_file(const std::string &filename, bool readonly, size_t dimlen, size_t elemsize, const char *elemname)
Definition: narray.h:50
scopira::basekit::nindex< DIM-1 > slice_dimen(void) const
Definition: directio.h:273
scopira::basekit::narray_delete_i * get_direct(void) const
gets the direct status/handler. non-null for direct mode
Definition: narray.h:923
bool load_directio_file(const std::string &filename, scopira::basekit::narray< T, DIM > &out)
Definition: directio.h:73
bool load_slice(size_t r, scopira::basekit::narray< T, DIM-1 > &out)
Definition: directio.h:287
const T * c_array(void) const
raw c-array style access
Definition: narray.h:843
Definition: directio.h:185
bool bind_direct_file(scopira::tool::fileflow *f, scopira::basekit::nindex< DIM > sz, scopira::basekit::narray< T, DIM > &out, bool readonly=false, scopira::tool::fileflow::offset_t skipb=0)
Definition: directio.h:109
size_t size_rows(void) const
Definition: directio.h:201
bool query_directio_file(const std::string &filename, std::string &elementtype, std::vector< size_t > &dimen)
bool create_directio_file(const std::string &filename, nindex< DIM > sz)
Definition: directio.h:137
bool save_slice(size_t r, scopira::basekit::narray< T, DIM-1 > &out)
Definition: directio.h:298
bool save_directio_file(const std::string &filename, const scopira::basekit::narray< T, DIM > &in)
Definition: directio.h:95
void resize(size_t len)
Definition: narray.h:877