cgv
data_view.h
1 #pragma once
2 
3 #include <cgv/type/info/type_ptr.h>
4 #include <cgv/type/func/transfer_const.h>
5 #include <cgv/type/func/drop_pointer.h>
6 #include <cgv/data/data_format.h>
7 
8 #include "lib_begin.h"
9 
10 namespace cgv {
11  namespace data {
12 
15 class CGV_API data_view_base
16 {
17 protected:
18  const data_format* format;
21  unsigned int dim;
22  unsigned int step_sizes[4];
24  data_view_base(const data_format* _format, unsigned int _dim,
25  const unsigned int* _step_sizes);
26 public:
30  data_view_base(const data_format* _format = 0);
32  virtual ~data_view_base();
34  void manage_format(bool enable = true);
36  const data_format* get_format() const;
38  void set_format(const data_format* _format);
40  unsigned int get_dim() const;
42  unsigned int get_step_size(unsigned int dim) const;
43 };
44 
47 template <class D, typename P = unsigned char*>
48 class CGV_API data_view_impl : public data_view_base
49 {
50 protected:
54  data_view_impl(const data_format* _format, P _data_ptr,
55  unsigned int _dim, const unsigned int* _step_sizes);
56 public:
58  data_view_impl(const data_format* _format = 0, typename cgv::type::func::transfer_const<P,void*>::type _data_ptr = 0);
60  bool empty() const;
62  template <typename S>
63  typename cgv::type::func::transfer_const<P,S*>::type get_ptr() const {
64  return (typename cgv::type::func::transfer_const<P,S*>::type)(data_ptr);
65  }
67  template <typename S>
68  typename cgv::type::func::transfer_const<P, S*>::type get_ptr(int i) const {
69  return (typename cgv::type::func::transfer_const<P, S*>::type)(data_ptr + i*step_sizes[0]);
70  }
72  template <typename S>
73  typename cgv::type::func::transfer_const<P, S*>::type get_ptr(int i, int j) const {
74  return (typename cgv::type::func::transfer_const<P, S*>::type)(data_ptr + i*step_sizes[0] + j*step_sizes[1]);
75  }
77  template <typename S>
78  typename cgv::type::func::transfer_const<P, S*>::type get_ptr(int i, int j, int k) const {
79  return (typename cgv::type::func::transfer_const<P, S*>::type)(data_ptr + i*step_sizes[0] + j*step_sizes[1] + k*step_sizes[2]);
80  }
82  template <typename S>
83  typename cgv::type::func::transfer_const<P, S*>::type get_ptr(int i, int j, int k, int l) const {
84  return (typename cgv::type::func::transfer_const<P, S*>::type)(data_ptr + i*step_sizes[0] + j*step_sizes[1] + k*step_sizes[2] + l*step_sizes[3]);
85  }
87  template <typename S>
88  S get(int ci) const {
89  return format->get<S>(ci, data_ptr);
90  }
92  template <typename S> S get(int ci, int i) const {
93  return format->get<S>(ci, get_ptr<cgv::type::func::drop_pointer<P>::type>(i));
94  }
96  template <typename S> S get(int ci, int i, int j) const {
97  return format->get<S>(ci, get_ptr<cgv::type::func::drop_pointer<P>::type>(i, j));
98  }
100  template <typename S> S get(int ci, int i, int j, int k) const {
101  return format->get<S>(ci, get_ptr<cgv::type::func::drop_pointer<P>::type>(i,j,k));
102  }
104  template <typename S> S get(int ci, int i, int j, int k, int l) const {
105  return format->get<S>(ci, get_ptr<cgv::type::func::drop_pointer<P>::type>(i, j, k, l));
106  }
108  D operator () (unsigned int i) const;
110  D operator () (unsigned int i, unsigned int j) const;
112  D operator () (unsigned int i, unsigned int j, unsigned int k) const;
114  D operator () (unsigned int i, unsigned int j, unsigned int k, unsigned int l) const;
115 
121  D permute(const std::string& permutation) const;
123  D transpose() const { return permute("ji"); }
124 
126  template <typename S>
127  typename cgv::type::func::transfer_const<P,S*>::type
128  step_i(S* ptr, int n=1) const { return static_cast<typename cgv::type::func::transfer_const<P,S*>::type>(static_cast<P>(ptr)+n*step_sizes[0]); }
130  template <typename S>
131  typename cgv::type::func::transfer_const<P,S*>::type
132  step_j(S* ptr, int n=1) const { return static_cast<typename cgv::type::func::transfer_const<P,S*>::type>(static_cast<P>(ptr)+n*step_sizes[1]); }
134  template <typename S>
135  typename cgv::type::func::transfer_const<P,S*>::type
136  step_k(S* ptr, int n=1) const { return static_cast<typename cgv::type::func::transfer_const<P,S*>::type>(static_cast<P>(ptr)+n*step_sizes[2]); }
138  template <typename S>
139  typename cgv::type::func::transfer_const<P,S*>::type
140  step_l(S* ptr, int n=1) const { return static_cast<typename cgv::type::func::transfer_const<P,S*>::type>(static_cast<P>(ptr)+step_sizes[3]); }
141 };
142 
143 class CGV_API const_data_view;
144 
154 class CGV_API data_view : public data_view_impl<data_view, unsigned char*>
155 {
156 protected:
158  friend class data_view_impl<data_view, unsigned char*>;
159  friend class const_data_view;
161  bool owns_ptr;
163  data_view(const data_format* _format, unsigned char* _data_ptr,
164  unsigned int _dim, const unsigned int* _step_sizes);
165 public:
167  data_view();
169  ~data_view();
174  data_view(const data_format* _format);
177  data_view(const data_format* _format, void* _data_ptr);
182  data_view(const data_format* _format, unsigned char* _data_ptr, bool manage_ptr);
185  data_view& operator = (const data_view& dv);
189  void set_ptr(unsigned char* ptr, bool manage_ptr);
192  void set_ptr(void* ptr);
194  template <typename T>
195  bool set(int ci, const T& v) {
196  return format->set(ci, data_ptr, v);
197  }
199  void reflect_horizontally();
201  static bool compose(data_view& composed_dv, const std::vector<data_view>& dvs);
203  static bool combine_components(data_view& dv, const std::vector<data_view>::iterator first, const std::vector<data_view>::iterator last);
204 };
205 
210 class CGV_API const_data_view : public data_view_impl<const_data_view, const unsigned char*>
211 {
212 protected:
214  friend class data_view_impl<const_data_view, const unsigned char*>;
216  const_data_view(const data_format* _format, const unsigned char* _data_ptr,
217  unsigned int _dim, const unsigned int* _step_sizes);
218 public:
220  const_data_view();
222  const_data_view(const data_view& dv);
225  const_data_view(const data_format* _format, const void* _data_ptr);
227  const_data_view& operator = (const const_data_view& dv);
229  void set_ptr(const void* ptr);
230 };
231 
232  }
233 }
234 
235 #include <cgv/config/lib_end.h>
cgv::data::data_view_impl::step_k
cgv::type::func::transfer_const< P, S * >::type step_k(S *ptr, int n=1) const
return a pointer that points to the n-th next location if index k is increase by n
Definition: data_view.h:136
cgv::data::data_view_impl::get_ptr
cgv::type::func::transfer_const< P, S * >::type get_ptr(int i) const
return a pointer to type S for i-th data entry
Definition: data_view.h:68
cgv::data::data_view_impl::get
S get(int ci, int i, int j, int k, int l) const
constant access to the ci-th component of (i,j,k,l)-th data entry
Definition: data_view.h:104
cgv::data::data_view_impl::get
S get(int ci, int i, int j, int k) const
constant access to the ci-th component of (i,j,k)-th data entry
Definition: data_view.h:100
cgv::data::const_data_view
Definition: data_view.h:211
cgv::data::data_view_impl
Definition: data_view.h:49
cgv::data::data_view::owns_ptr
bool owns_ptr
a flag telling whether the data ptr is owned by the view
Definition: data_view.h:161
cgv::data::data_view_impl::step_l
cgv::type::func::transfer_const< P, S * >::type step_l(S *ptr, int n=1) const
return a pointer that points to the n-th next location if index l is increase by n
Definition: data_view.h:140
cgv::data::data_view_impl::get_ptr
cgv::type::func::transfer_const< P, S * >::type get_ptr(int i, int j, int k, int l) const
return a pointer to type S for (i,j,k,l)-th data entry
Definition: data_view.h:83
cgv::data::data_view
Definition: data_view.h:155
cgv::data::data_view_base
Definition: data_view.h:16
cgv::data::data_view_impl::step_j
cgv::type::func::transfer_const< P, S * >::type step_j(S *ptr, int n=1) const
return a pointer that points to the n-th next location if index j is increase by n
Definition: data_view.h:132
cgv::data::data_view_impl::data_ptr
P data_ptr
data pointer of type unsigned char or const unsigned char
Definition: data_view.h:52
cgv::data::data_view_impl::get_ptr
cgv::type::func::transfer_const< P, S * >::type get_ptr() const
return a data pointer to type S
Definition: data_view.h:63
cgv::data::data_view_impl::get
S get(int ci, int i) const
constant access to the ci-th component of i-th data entry
Definition: data_view.h:92
cgv::data::data_format
Definition: data_format.h:18
cgv::data::data_view::set
bool set(int ci, const T &v)
write access to the i-th component, return whether write was successful
Definition: data_view.h:195
cgv::data::data_view_impl::get
S get(int ci) const
constant access to the ci-th component
Definition: data_view.h:88
cgv::data::data_view_impl::transpose
D transpose() const
transpose is equivalent to permute("ji")
Definition: data_view.h:123
cgv::data::data_view_impl::step_i
cgv::type::func::transfer_const< P, S * >::type step_i(S *ptr, int n=1) const
return a pointer that points to the n-th next location if index i is increase by n
Definition: data_view.h:128
cgv::data::data_view_base::owns_format
bool owns_format
whether to own the data format
Definition: data_view.h:20
cgv::data::data_view_impl::get
S get(int ci, int i, int j) const
constant access to the ci-th component of (i,j)-th data entry
Definition: data_view.h:96
cgv::data::data_view_impl::get_ptr
cgv::type::func::transfer_const< P, S * >::type get_ptr(int i, int j) const
return a pointer to type S for (i,j)-th data entry
Definition: data_view.h:73
cgv::data::data_view_impl::get_ptr
cgv::type::func::transfer_const< P, S * >::type get_ptr(int i, int j, int k) const
return a pointer to type S for (i,j,k)-th data entry
Definition: data_view.h:78
cgv
the cgv namespace
Definition: vr_calib.cxx:9