KrisLibrary  1.0.0
ArrayMapping.h
1 #ifndef ARRAY_MAPPING_H
2 #define ARRAY_MAPPING_H
3 
4 #include <vector>
5 
21 {
22  inline ArrayMapping();
23 
24  inline bool IsOffset() const { return mapping.empty(); }
25  inline int Size() const { return (IsOffset() ? imax : (int)mapping.size()); }
26  inline void SetOffset(int offset,int imax);
27 
28  inline int Map(int i) const;
29  inline int InvMap(int imap) const;
30  template <class A>
31  inline void Map(const A& x,A& mapx) const;
32  template <class A>
33  inline void InvMap(const A& mapx,A& x) const;
34 
35  std::vector<int> mapping;
36  int imax;
37  int offset;
38 };
39 
40 
41 ArrayMapping::ArrayMapping()
42  :imax(0),offset(0)
43 {}
44 
45 void ArrayMapping::SetOffset(int _offset,int _imax)
46 {
47  mapping.clear();
48  offset=_offset;
49  imax=_imax;
50 }
51 
52 int ArrayMapping::Map(int i) const
53 {
54  return (IsOffset() ? i+offset : mapping[i]);
55 }
56 
57 int ArrayMapping::InvMap(int imap) const
58 {
59  if(IsOffset())
60  return imap-offset;
61  else {
62  for(size_t i=0;i<mapping.size();i++)
63  if(mapping[i] == imap) return (int)i;
64  abort();
65  return -1;
66  }
67 }
68 
69 template <class A>
70 void ArrayMapping::Map(const A& x,A& mapx) const
71 {
72  if(mapping.empty()) {
73  for(int i=0;i<imax;i++)
74  mapx[i+offset] = x[i];
75  }
76  else {
77  for(int i=0;i<(int)mapping.size();i++)
78  mapx[mapping[i]] = x[i];
79  }
80 }
81 
82 template <class A>
83 void ArrayMapping::InvMap(const A& mapx,A& x) const
84 {
85  if(IsOffset()) {
86  for(int i=0;i<imax;i++)
87  x[i] = mapx[i+offset];
88  }
89  else {
90  for(int i=0;i<(int)mapping.size();i++)
91  x[i] = mapx[mapping[i]];
92  }
93 }
94 
95 
96 
97 #endif
An invertible mapping from indices in [0,imax), which operates in two modes: offset mode adds an offs...
Definition: ArrayMapping.h:20