GCC Code Coverage Report


Directory: cvmfs/
File: cvmfs/util/pointer.h
Date: 2026-05-24 02:35:55
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 12929799 inline explicit UniquePtrBase(T *ref) : ref_(ref) { }
35 7489280 inline ~UniquePtrBase() { Free(); }
36
37 63174182 inline T *operator->() const { return ref_; }
38 // NOLINTNEXTLINE(misc-unconventional-assign-operator)
39 2654811 inline DerivedT &operator=(T *ref) {
40
2/2
✓ Branch 0 taken 2601397 times.
✓ Branch 1 taken 4633 times.
2654811 if (ref_ != ref) {
41 2645475 Free();
42 2644675 ref_ = ref;
43 }
44 2654011 return *(static_cast<DerivedT *>(this));
45 }
46 12338966 inline T *weak_ref() const { return ref_; }
47 7311315 inline bool IsValid() const { return (ref_ != NULL); }
48 1094559 inline T *Release() {
49 1098734 T *r = ref_;
50 1098734 ref_ = NULL;
51 1098734 return r;
52 }
53 2528453 inline void Destroy() {
54 2528453 Free();
55 2528993 ref_ = NULL;
56 2528993 }
57
58 protected:
59 23064963 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 174445 inline UniquePtr() : BaseT(NULL) { }
74 10115223 inline explicit UniquePtr(T *ref) : BaseT(ref) { }
75 1000508 inline T &operator*() const { return *BaseT::ref_; }
76
77 protected:
78
2/2
✓ Branch 0 taken 6286905 times.
✓ Branch 1 taken 6255483 times.
15536511 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 10 inline UniquePtr() : BaseT(NULL) { }
91 65 inline explicit UniquePtr(void *ref) : BaseT(ref) { }
92
93 protected:
94 72 void Free() {
95
2/2
✓ Branch 1 taken 62 times.
✓ Branch 2 taken 10 times.
72 if (IsValid()) {
96 62 free(BaseT::ref_);
97 }
98 72 }
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 97 inline explicit UniquePtr(unsigned char *ref) : BaseT(ref) { }
112
113 protected:
114 97 void Free() {
115
1/2
✓ Branch 1 taken 97 times.
✗ Branch 2 not taken.
97 if (IsValid()) {
116 97 free(BaseT::ref_);
117 }
118 97 }
119 };
120
121
122 #ifdef CVMFS_NAMESPACE_GUARD
123 } // namespace CVMFS_NAMESPACE_GUARD
124 #endif
125
126 #endif // CVMFS_UTIL_POINTER_H_
127