Belle II Software  release-06-01-15
pointer.h
1 /*
2  * pointer.h - smart pointer and array classes
3  *
4  * this file is part of PJFry library
5  * Copyright 2011 Valery Yundin
6  */
7 
8 #ifndef QUL_POINTER_H
9 #define QUL_POINTER_H
10 
11 #include <memory>
12 #include <cstring>
13 
14 class SRefCnt {
15 public:
16  SRefCnt() : count(0) { }
17 
18 protected:
19  int count;
20 };
21 
22 template <typename T>
23 class SPtr {
24 public:
25  T* operator-> () const { return pObj; }
26  bool operator== (const T* pobj) const { return pobj == pObj; }
27  bool operator!= (const T* pobj) const { return pobj != pObj; }
28 
29  bool operator== (const SPtr<T>& spobj) const { return spobj.pObj == pObj; }
30  bool operator!= (const SPtr<T>& spobj) const { return spobj.pObj != pObj; }
31 
32  SPtr(T* pobj = 0) : pObj(pobj)
33  {
34  if (pObj) { pObj->count++; }
35  }
36  SPtr(const SPtr& ptr) : pObj(ptr.pObj)
37  {
38  if (pObj) { pObj->count++; }
39  }
40 
41  SPtr& operator= (const SPtr& ptr)
42  {
43  if (this == &ptr) { return *this; }
44  if (pObj && --(pObj->count) == 0) { delete pObj; }
45  if ((pObj = ptr.pObj)) { pObj->count++; }
46  return *this;
47  }
48 
49  ~SPtr()
50  {
51  if (pObj && --(pObj->count) == 0) { delete pObj; }
52  }
53 
54 private:
55  T* pObj;
56 };
57 
58 template <typename T, int N> class DArray;
59 // Iterator for DArray class
60 template <typename T, int N>
61 class NIter {
62  friend class DArray<T, N>;
63 public:
64  inline T& operator* () { return ptr[idx % N]; }
65  inline T* operator-> () { return &ptr[idx % N]; }
66  inline NIter& operator++ () { idx++; return *this;}
67  inline NIter& operator+= (int n) { idx += n; return *this;}
68 
69  inline bool operator== (const NIter& iter) { return idx == iter.idx && ptr == iter.ptr; }
70  inline bool operator!= (const NIter& iter) { return idx != iter.idx || ptr != iter.ptr; }
71 
72  NIter(T* begin, int last) : ptr(begin), idx(last) {}
73 private:
74  T* ptr;
75  int idx;
76 };
77 
78 // DArray - static array with stack-like iterator
79 template <typename T, int N>
80 class DArray {
81 public:
82  DArray() : last(N), len(0) {}
83 
84  typedef NIter<T, N> iterator;
85  iterator begin() { return iterator(elems, last); }
86  iterator end() { return iterator(elems, last + len); }
87 
88  T& insert(const T& el)
89  {
90  len = (len == N ? len : len + 1);
91  last = ((last - 1) + N) % N;
92  elems[last] = el;
93  return elems[last];
94  }
95 
96 #ifdef USE_SMART_INSERT
97  void remove(iterator& it)
98  {
99 // assert(it.ptr==elems);
100  int i = it.idx % N;
101  elems[i] = T();
102  if (i >= last) {
103  memmove(&elems[last + 1], &elems[last], (i - last)*sizeof(T));
104  memset(&elems[last], 0, sizeof(T));
105  last = (last + 1) % N;
106  } else {
107  memmove(&elems[i], &elems[i + 1], (last - i - 1)*sizeof(T));
108  memset(&elems[last - 1], 0, sizeof(T));
109  }
110  len = len - 1;
111  }
112 #endif
113 
114  void reset()
115  {
116 #ifndef USE_DIRTY_RESET
117  for (int i = 0; i < len; i++) {
118  elems[i] = T();
119  }
120 #endif
121  last = N;
122  len = 0;
123  }
124 
125  static const int size = N;
126  const T& operator [](const int idx) const { return elems[idx]; }
127  T& operator [](const int idx) { return elems[idx]; }
128 
129 private:
130  T elems[N];
131  int last;
132  int len;
133 };
134 
135 // CArray - simple array with trivial iterator
136 template <typename T, int N>
137 class CArray {
138 public:
139  typedef std::auto_ptr<CArray> Ptr;
140 
141  CArray(T dval = T())
142  {
143  for (iterator i = begin(); i != end(); ++i) {
144  *i = dval;
145  }
146  }
147 
148  typedef T* iterator;
149  iterator begin() { return &elems[0]; }
150  iterator end() { return &elems[N]; }
151 
152 
153  static const int size = N;
154 
155  const T& operator [](const int idx) const { return elems[idx]; }
156  T& operator [](const int idx) { return elems[idx]; }
157 
158 private:
159  T elems[N];
160 };
161 
162 #endif /* QUL_POINTER_H */
163 
164 /*
165 class Test: public SRefCnt
166 {
167  public:
168  friend class SPtr<Test>;
169  typedef SPtr<Test> Ptr;
170 
171  static Ptr create(int x) { return Ptr(new Test(x)); };
172 
173  ~Test() { };
174 
175  private:
176  Test() { };
177 };
178 
179 */
Definition: pointer.h:80
Definition: pointer.h:61
Definition: pointer.h:23
bool operator==(const DecayNode &node1, const DecayNode &node2)
Compare two Decay Nodes: They are equal if All daughter decay nodes are equal or one of the daughter ...
Definition: DecayNode.cc:48
bool operator!=(const DecayNode &node1, const DecayNode &node2)
Not equal: See operator==.
Definition: DecayNode.cc:65
B2Vector3< DataType > operator*(DataType a, const B2Vector3< DataType > &p)
non-memberfunction Scaling of 3-vectors with a real number
Definition: B2Vector3.h:514