1
1
/*
2
2
* Copyright 2006 Milan Digital Audio LLC
3
- * Copyright 2009-2023 GrandOrgue contributors (see AUTHORS)
3
+ * Copyright 2009-2024 GrandOrgue contributors (see AUTHORS)
4
4
* License GPL-2.0 or later
5
5
* (https://www.gnu.org/licenses/old-licenses/gpl-2.0.html).
6
6
*/
@@ -16,16 +16,34 @@ template <class T> class ptr_vector : protected std::vector<T *> {
16
16
ptr_vector (const ptr_vector &);
17
17
const ptr_vector operator =(const ptr_vector &);
18
18
19
+ template <
20
+ typename T1,
21
+ std::enable_if_t <std::is_array<T1>::value, bool > = true >
22
+ inline static void delete0 (T1 *e) {
23
+ delete[] e;
24
+ }
25
+
26
+ template <
27
+ typename T1,
28
+ std::enable_if_t <!std::is_array<T1>::value, bool > = true >
29
+ inline static void delete0 (T1 *e) {
30
+ delete e;
31
+ }
32
+
33
+ inline static void delete1 (T *e) {
34
+ if (e)
35
+ delete0 (e);
36
+ }
37
+
19
38
public:
20
39
ptr_vector (unsigned new_size = 0 ) : std::vector<T *>(new_size) {
21
40
for (unsigned i = 0 ; i < new_size; i++)
22
- at (i) = 0 ;
41
+ at (i) = nullptr ;
23
42
}
24
43
25
44
~ptr_vector () {
26
- for (unsigned i = 0 ; i < size (); i++)
27
- if (at (i))
28
- delete at (i);
45
+ for (auto &e : (*this ))
46
+ delete1 (e);
29
47
}
30
48
31
49
T *&operator [](unsigned pos) { return at (pos); }
@@ -43,11 +61,10 @@ template <class T> class ptr_vector : protected std::vector<T *> {
43
61
void resize (unsigned new_size) {
44
62
unsigned oldsize = size ();
45
63
for (unsigned i = new_size; i < oldsize; i++)
46
- if (at (i))
47
- delete at (i);
64
+ delete1 (at (i));
48
65
std::vector<T *>::resize (new_size);
49
66
for (unsigned i = oldsize; i < new_size; i++)
50
- at (i) = 0 ;
67
+ at (i) = nullptr ;
51
68
}
52
69
53
70
void push_back (T *ptr) { std::vector<T *>::push_back (ptr); }
0 commit comments