versor  3.0
C++11 library for Geometric algebra
vsr_set.h
1 
2 #ifndef VSR_SET_H_INCLUDED
3 #define VSR_SET_H_INCLUDED
4 
5 #include <vector>
6 
7 namespace vsr {
8 
9  using std::vector;
10 
11  //vector of data
12  template<typename T>
13  class Set {
14 
15  protected:
16 
17  vector<T> mData;
18  //vector<T> mTmp; ///< Stack for in-place calculations
19  unsigned long mActiveId;
20 
21  public:
22 
23 
24  unsigned long& activeId() { return mActiveId; }
25  unsigned long activeId() const { return mActiveId; }
26 
27 
28  Set& insert(T s) { mData.insert( mData.begin(), s); }
29  Set& pop() { mData.pop_back(); }
30  Set& add(T s) { mData.push_back(s); mActiveId = mData.size(); return *this; }
31 
32  /* template<typename ... S> */
33  /* Set ( S ... s ) { S ts[] = {s...}; mData = vector<T>{ts, ts + sizeof(ts) / sizeof(S) */
34 
35  Set& add(const Set& s) { for(int i = 0; i < s.size(); ++i) add(s[i]); }
36  Set& erase(int idx) { mData.erase( mData.begin() + idx ); }
37  Set& erase(int b, int e) { mData.erase( mData.begin() + b, mData.begin() + e ); }
38 
39  Set& clear() { vector<T>().swap(mData); return *this; }
40 
41  T& active() { return mData[mActiveId-1]; }
42  T active() const { return mData[mActiveId-1]; }
43 
44  T& operator [] (int i) { return mData[i]; }
45  T operator [] (int i) const { return mData[i]; }
46 
47  unsigned long size() const { return mData.size(); }
48  unsigned long num() const { return mData.size(); }
49 
50  T * ptr() { return &(mData[0]); }
51  T& last() { return mData[mActiveId-1]; }
52 
53  typename vector<T>::iterator begin() { return mData.begin(); }
54  typename vector<T>::iterator end() { return mData.end(); }
55 
56  vector<T>& data(){ return mData; }
57  vector<T> data() const { return mData; }
58 
59 
60 
61  };
62 
63  //pointer to data T in container
64  template<typename T>
65  class Data {
66 
67  protected:
68 
69  T * mData;
70  int mNum;
71  size_t mOffset; // data's memory spacing
72  size_t mStride; // data's memory length
73 
74  public:
75 
76  T& data(int idx) { return mData[idx ]; }
77  T data(int idx) const { return mData[idx ]; }
78 
79  T * ptr() { return mData; }
80  void ptr( T * d ) { mData = d; }
81 
82  template<typename S>
83  void setOffset() { mOffset = sizeof(S) - mStride; }
84 
85  Data(int N=0) : mNum(N), mData(NULL) {
86  mStride = sizeof(T);
87  setOffset<T>();
88  }
89 
90  void num(int N) { mNum = N; }
91  int num() const { return mNum; }
92 
93  void alloc( int N){
94  mNum = N;
95  if (mData) delete[] mData;
96  mData = new T[mNum];
97  }
98 
99 
100  };
101 
102 
103  template<typename T>
104  class DoubleData : public Data<T> {
105 
106  protected:
107 
108  T * mPrev;
109 
110  public:
111 
112  void swap(){
113  T * tmp = mPrev; mPrev = this->mData; this->mData = tmp;
114  }
115 
116  T& prev(int idx) { return mPrev[idx]; }
117  T prev(int idx) const { return mPrev[idx]; }
118 
119  DoubleData(int N=0) : Data<T>(N) {}
120 
121  void alloc(int N){
122  Data<T>::alloc(N);
123  if (mPrev) delete[] mPrev;
124  mPrev = new T[this->mNum];
125  }
126 
127  void copy(){
128  if (!mPrev) mPrev = new T[this->mNum];
129  std::copy( this->mData, this->mData+this->mNum, mPrev);
130  }
131  };
132 
133  //N Copies of type T Arrays
134  template<int N, typename T>
135  class NData : public Data<T> {
136  protected:
137  NData<N-1, T> mNext;
138 
139  public:
140  void resize(int n) { this->mNum = n; alloc(); }
141  void alloc(){
142  Data<T>::alloc();
143  mNext.alloc();
144  }
145  void copy(){
146  std::copy( this->mData, this->mData + this->mNum, mNext.ptr() );
147  }
148  };
149  template<typename T>
150  class NData<1,T> : public Data<T>{
151  public:
152  void resize(int N) { this->mNum = N; alloc(); }
153  void alloc(){
154  Data<T>::alloc();
155  }
156 
157  };
158 
159 } //vsr::
160 #endif
Definition: vsr_set.h:13
Definition: vsr_set.h:104
the versor library namespace
Definition: vsr_algebra.h:29
Definition: vsr_set.h:65
Definition: vsr_set.h:135