Directory: | cvmfs/ |
---|---|
File: | cvmfs/util/pointer.h |
Date: | 2025-09-28 02:35:26 |
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 | 4736669 | inline explicit UniquePtrBase(T *ref) : ref_(ref) { } | |
35 | 2682855 | inline ~UniquePtrBase() { Free(); } | |
36 | |||
37 | 33887604 | inline T *operator->() const { return ref_; } | |
38 | // NOLINTNEXTLINE(misc-unconventional-assign-operator) | ||
39 | 927179 | inline DerivedT &operator=(T *ref) { | |
40 |
2/2✓ Branch 0 taken 863478 times.
✓ Branch 1 taken 4294 times.
|
927179 | if (ref_ != ref) { |
41 | 918687 | Free(); | |
42 | 918222 | ref_ = ref; | |
43 | } | ||
44 | 926714 | return *(static_cast<DerivedT *>(this)); | |
45 | } | ||
46 | 9360001 | inline T *weak_ref() const { return ref_; } | |
47 | 2911630 | inline bool IsValid() const { return (ref_ != NULL); } | |
48 | 373628 | inline T *Release() { | |
49 | 376046 | T *r = ref_; | |
50 | 376046 | ref_ = NULL; | |
51 | 376046 | return r; | |
52 | } | ||
53 | 768871 | inline void Destroy() { | |
54 | 768871 | Free(); | |
55 | 769276 | ref_ = NULL; | |
56 | 769276 | } | |
57 | |||
58 | protected: | ||
59 | 7960913 | 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 | 193135 | inline UniquePtr() : BaseT(NULL) { } | |
74 | 3666823 | inline explicit UniquePtr(T *ref) : BaseT(ref) { } | |
75 | 300390 | inline T &operator*() const { return *BaseT::ref_; } | |
76 | |||
77 | protected: | ||
78 |
2/2✓ Branch 0 taken 2079654 times.
✓ Branch 1 taken 2204151 times.
|
5517549 | 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 | 39 | inline UniquePtr() : BaseT(NULL) { } | |
91 | 107 | inline explicit UniquePtr(void *ref) : BaseT(ref) { } | |
92 | |||
93 | protected: | ||
94 | 143 | void Free() { | |
95 |
2/2✓ Branch 1 taken 104 times.
✓ Branch 2 taken 39 times.
|
143 | if (IsValid()) { |
96 | 104 | free(BaseT::ref_); | |
97 | } | ||
98 | 143 | } | |
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 | 81 | inline explicit UniquePtr(unsigned char *ref) : BaseT(ref) { } | |
112 | |||
113 | protected: | ||
114 | 81 | void Free() { | |
115 |
1/2✓ Branch 1 taken 81 times.
✗ Branch 2 not taken.
|
81 | if (IsValid()) { |
116 | 81 | free(BaseT::ref_); | |
117 | } | ||
118 | 81 | } | |
119 | }; | ||
120 | |||
121 | |||
122 | #ifdef CVMFS_NAMESPACE_GUARD | ||
123 | } // namespace CVMFS_NAMESPACE_GUARD | ||
124 | #endif | ||
125 | |||
126 | #endif // CVMFS_UTIL_POINTER_H_ | ||
127 |