Directory: | cvmfs/ |
---|---|
File: | cvmfs/util/pointer.h |
Date: | 2025-07-13 02:35:07 |
Exec | Total | Coverage | |
---|---|---|---|
Lines: | 34 | 34 | 100.0% |
Branches: | 7 | 8 | 87.5% |
Line | Branch | Exec | Source |
---|---|---|---|
1 | /** | ||
2 | * This file is part of the CernVM File System. | ||
3 | */ | ||
4 | |||
5 | #ifndef CVMFS_UTIL_POINTER_H_ | ||
6 | #define CVMFS_UTIL_POINTER_H_ | ||
7 | |||
8 | #include <cstdlib> | ||
9 | |||
10 | #include "util/single_copy.h" | ||
11 | |||
12 | #ifdef CVMFS_NAMESPACE_GUARD | ||
13 | namespace CVMFS_NAMESPACE_GUARD { | ||
14 | #endif | ||
15 | |||
16 | /** | ||
17 | * Type Trait: | ||
18 | * "Static" assertion that a template parameter is a pointer | ||
19 | */ | ||
20 | template<typename T> | ||
21 | struct IsPointer { | ||
22 | static const bool value = false; | ||
23 | }; | ||
24 | template<typename T> | ||
25 | struct IsPointer<T *> { | ||
26 | static const bool value = true; | ||
27 | }; | ||
28 | |||
29 | |||
30 | template<class T, class DerivedT> | ||
31 | class UniquePtrBase : SingleCopy { | ||
32 | public: | ||
33 | inline UniquePtrBase() : ref_(NULL) { } | ||
34 | 7546348 | inline explicit UniquePtrBase(T *ref) : ref_(ref) { } | |
35 | 4489443 | inline ~UniquePtrBase() { Free(); } | |
36 | |||
37 | 39506842 | inline T *operator->() const { return ref_; } | |
38 | // NOLINTNEXTLINE(misc-unconventional-assign-operator) | ||
39 | 1382321 | inline DerivedT &operator=(T *ref) { | |
40 |
2/2✓ Branch 0 taken 1335645 times.
✓ Branch 1 taken 3185 times.
|
1382321 | if (ref_ != ref) { |
41 | 1375954 | Free(); | |
42 | 1375564 | ref_ = ref; | |
43 | } | ||
44 | 1381931 | return *(static_cast<DerivedT *>(this)); | |
45 | } | ||
46 | 12582281 | inline T *weak_ref() const { return ref_; } | |
47 | 4258156 | inline bool IsValid() const { return (ref_ != NULL); } | |
48 | 772846 | inline T *Release() { | |
49 | 775098 | T *r = ref_; | |
50 | 775098 | ref_ = NULL; | |
51 | 775098 | return r; | |
52 | } | ||
53 | 1267336 | inline void Destroy() { | |
54 | 1267336 | Free(); | |
55 | 1267831 | ref_ = NULL; | |
56 | 1267831 | } | |
57 | |||
58 | protected: | ||
59 | 12691686 | void Free() { static_cast<DerivedT *>(this)->Free(); } | |
60 | T *ref_; | ||
61 | }; | ||
62 | |||
63 | |||
64 | template<class T> | ||
65 | class UniquePtr : public UniquePtrBase<T, UniquePtr<T> > { | ||
66 | friend class UniquePtrBase<T, UniquePtr<T> >; | ||
67 | |||
68 | private: | ||
69 | typedef UniquePtrBase<T, UniquePtr<T> > BaseT; | ||
70 | |||
71 | public: | ||
72 | using BaseT::operator=; | ||
73 | 143954 | inline UniquePtr() : BaseT(NULL) { } | |
74 | 6042585 | inline explicit UniquePtr(T *ref) : BaseT(ref) { } | |
75 | 700854 | inline T &operator*() const { return *BaseT::ref_; } | |
76 | |||
77 | protected: | ||
78 |
2/2✓ Branch 0 taken 3652235 times.
✓ Branch 1 taken 3402103 times.
|
8922392 | void Free() { delete BaseT::ref_; } |
79 | }; | ||
80 | |||
81 | |||
82 | template<> | ||
83 | class UniquePtr<void> : public UniquePtrBase<void, UniquePtr<void> > { | ||
84 | private: | ||
85 | typedef UniquePtrBase<void, UniquePtr<void> > BaseT; | ||
86 | |||
87 | public: | ||
88 | friend class UniquePtrBase<void, UniquePtr<void> >; | ||
89 | using BaseT::operator=; | ||
90 | 11 | inline UniquePtr() : BaseT(NULL) { } | |
91 | 76 | inline explicit UniquePtr(void *ref) : BaseT(ref) { } | |
92 | |||
93 | protected: | ||
94 | 84 | void Free() { | |
95 |
2/2✓ Branch 1 taken 73 times.
✓ Branch 2 taken 11 times.
|
84 | if (IsValid()) { |
96 | 73 | free(BaseT::ref_); | |
97 | } | ||
98 | 84 | } | |
99 | }; | ||
100 | |||
101 | template<> | ||
102 | class UniquePtr<unsigned char> | ||
103 | : public UniquePtrBase<unsigned char, UniquePtr<unsigned char> > { | ||
104 | private: | ||
105 | typedef UniquePtrBase<unsigned char, UniquePtr<unsigned char> > BaseT; | ||
106 | |||
107 | public: | ||
108 | friend class UniquePtrBase<unsigned char, UniquePtr<unsigned char> >; | ||
109 | using BaseT::operator=; | ||
110 | inline UniquePtr() : BaseT(NULL) { } | ||
111 | 92 | inline explicit UniquePtr(unsigned char *ref) : BaseT(ref) { } | |
112 | |||
113 | protected: | ||
114 | 92 | void Free() { | |
115 |
1/2✓ Branch 1 taken 92 times.
✗ Branch 2 not taken.
|
92 | if (IsValid()) { |
116 | 92 | free(BaseT::ref_); | |
117 | } | ||
118 | 92 | } | |
119 | }; | ||
120 | |||
121 | |||
122 | #ifdef CVMFS_NAMESPACE_GUARD | ||
123 | } // namespace CVMFS_NAMESPACE_GUARD | ||
124 | #endif | ||
125 | |||
126 | #endif // CVMFS_UTIL_POINTER_H_ | ||
127 |