BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
pointer.h
Go to the documentation of this file.
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 <cstring>
12# include <memory>
13
14class SRefCnt {
15public:
16 SRefCnt() : count( 0 ) {}
17
18protected:
19 int count;
20};
21
22template <typename T> class SPtr {
23public:
24 T* operator->() const { return pObj; }
25 bool operator==( const T* pobj ) const { return pobj == pObj; }
26 bool operator!=( const T* pobj ) const { return pobj != pObj; }
27
28 bool operator==( const SPtr<T>& spobj ) const { return spobj.pObj == pObj; }
29 bool operator!=( const SPtr<T>& spobj ) const { return spobj.pObj != pObj; }
30
31 SPtr( T* pobj = 0 ) : pObj( pobj ) {
32 if ( pObj ) { pObj->count++; }
33 }
34 SPtr( const SPtr& ptr ) : pObj( ptr.pObj ) {
35 if ( pObj ) { pObj->count++; }
36 }
37
38 SPtr& operator=( const SPtr& ptr ) {
39 if ( this == &ptr ) { return *this; }
40 if ( pObj && --( pObj->count ) == 0 ) { delete pObj; }
41 if ( ( pObj = ptr.pObj ) ) { pObj->count++; }
42 return *this;
43 }
44
46 if ( pObj && --( pObj->count ) == 0 ) { delete pObj; }
47 }
48
49private:
50 T* pObj;
51};
52
53template <typename T, int N> class DArray;
54// Iterator for DArray class
55template <typename T, int N> class NIter {
56 friend class DArray<T, N>;
57
58public:
59 inline T& operator*() { return ptr[idx % N]; }
60 inline T* operator->() { return &ptr[idx % N]; }
61 inline NIter& operator++() {
62 idx++;
63 return *this;
64 }
65 inline NIter& operator+=( int n ) {
66 idx += n;
67 return *this;
68 }
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
75private:
76 T* ptr;
77 int idx;
78};
79
80// DArray - static array with stack-like iterator
81template <typename T, int N> class DArray {
82public:
83 DArray() : last( N ), len( 0 ) {}
84
86 iterator begin() { return iterator( elems, last ); }
87 iterator end() { return iterator( elems, last + len ); }
88
89 T& insert( const T& el ) {
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 // assert(it.ptr==elems);
99 int i = it.idx % N;
100 elems[i] = T();
101 if ( i >= last )
102 {
103 memmove( &elems[last + 1], &elems[last], ( i - last ) * sizeof( T ) );
104 memset( &elems[last], 0, sizeof( T ) );
105 last = ( last + 1 ) % N;
106 }
107 else
108 {
109 memmove( &elems[i], &elems[i + 1], ( last - i - 1 ) * sizeof( T ) );
110 memset( &elems[last - 1], 0, sizeof( T ) );
111 }
112 len = len - 1;
113 }
114# endif
115
116 void reset() {
117# ifndef USE_DIRTY_RESET
118 for ( int i = 0; i < len; i++ ) { elems[i] = T(); }
119# endif
120 last = N;
121 len = 0;
122 }
123
124 static const int size = N;
125 const T& operator[]( const int idx ) const { return elems[idx]; }
126 T& operator[]( const int idx ) { return elems[idx]; }
127
128private:
129 T elems[N];
130 int last;
131 int len;
132};
133
134// CArray - simple array with trivial iterator
135template <typename T, int N> class CArray {
136public:
137 typedef std::auto_ptr<CArray> Ptr;
138
139 CArray( T dval = T() ) {
140 for ( iterator i = begin(); i != end(); ++i ) { *i = dval; }
141 }
142
143 typedef T* iterator;
144 iterator begin() { return &elems[0]; }
145 iterator end() { return &elems[N]; }
146
147 static const int size = N;
148
149 const T& operator[]( const int idx ) const { return elems[idx]; }
150 T& operator[]( const int idx ) { return elems[idx]; }
151
152private:
153 T elems[N];
154};
155
156#endif /* QUL_POINTER_H */
157
158/*
159class Test: public SRefCnt
160{
161 public:
162 friend class SPtr<Test>;
163 typedef SPtr<Test> Ptr;
164
165 static Ptr create(int x) { return Ptr(new Test(x)); };
166
167 ~Test() { };
168
169 private:
170 Test() { };
171};
172
173*/
const Int_t n
EvtStreamInputIterator< typename Generator::result_type > iter(Generator gen, int N=0)
T & operator[](const int idx)
Definition pointer.h:150
iterator end()
Definition pointer.h:145
static const int size
Definition pointer.h:147
CArray(T dval=T())
Definition pointer.h:139
iterator begin()
Definition pointer.h:144
std::auto_ptr< CArray > Ptr
Definition pointer.h:137
const T & operator[](const int idx) const
Definition pointer.h:149
NIter< Entry5, N > iterator
Definition pointer.h:85
const T & operator[](const int idx) const
Definition pointer.h:125
static const int size
Definition pointer.h:124
void reset()
Definition pointer.h:116
iterator begin()
Definition pointer.h:86
DArray()
Definition pointer.h:83
T & insert(const T &el)
Definition pointer.h:89
iterator end()
Definition pointer.h:87
T & operator[](const int idx)
Definition pointer.h:126
T & operator*()
Definition pointer.h:59
bool operator==(const NIter &iter)
Definition pointer.h:70
NIter(T *begin, int last)
Definition pointer.h:73
T * operator->()
Definition pointer.h:60
bool operator!=(const NIter &iter)
Definition pointer.h:71
NIter & operator+=(int n)
Definition pointer.h:65
NIter & operator++()
Definition pointer.h:61
bool operator!=(const T *pobj) const
Definition pointer.h:26
bool operator!=(const SPtr< T > &spobj) const
Definition pointer.h:29
SPtr(const SPtr &ptr)
Definition pointer.h:34
SPtr(T *pobj=0)
Definition pointer.h:31
SPtr & operator=(const SPtr &ptr)
Definition pointer.h:38
bool operator==(const SPtr< T > &spobj) const
Definition pointer.h:28
T * operator->() const
Definition pointer.h:24
~SPtr()
Definition pointer.h:45
bool operator==(const T *pobj) const
Definition pointer.h:25
int count
Definition pointer.h:19
SRefCnt()
Definition pointer.h:16