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