]>
Commit | Line | Data |
---|---|---|
5cc8c731 | 1 | /* std::unique_ptr specializations for GDB. |
da804164 | 2 | |
1d506c26 | 3 | Copyright (C) 2016-2024 Free Software Foundation, Inc. |
da804164 PA |
4 | |
5 | This file is part of GDB. | |
6 | ||
7 | This program is free software; you can redistribute it and/or modify | |
8 | it under the terms of the GNU General Public License as published by | |
9 | the Free Software Foundation; either version 3 of the License, or | |
10 | (at your option) any later version. | |
11 | ||
12 | This program is distributed in the hope that it will be useful, | |
13 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
15 | GNU General Public License for more details. | |
16 | ||
17 | You should have received a copy of the GNU General Public License | |
18 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ | |
19 | ||
1a5c2598 TT |
20 | #ifndef COMMON_GDB_UNIQUE_PTR_H |
21 | #define COMMON_GDB_UNIQUE_PTR_H | |
da804164 PA |
22 | |
23 | #include <memory> | |
820ed8af | 24 | #include <string> |
2bb7589d | 25 | #include "gdbsupport/gdb-xfree.h" |
da804164 PA |
26 | |
27 | namespace gdb | |
28 | { | |
5cc8c731 | 29 | /* Define gdb::unique_xmalloc_ptr, a std::unique_ptr that manages |
da804164 PA |
30 | xmalloc'ed memory. */ |
31 | ||
5cc8c731 | 32 | /* The deleter for std::unique_xmalloc_ptr. Uses xfree. */ |
da804164 PA |
33 | template <typename T> |
34 | struct xfree_deleter | |
35 | { | |
36 | void operator() (T *ptr) const { xfree (ptr); } | |
37 | }; | |
38 | ||
e7c9de26 PA |
39 | /* Same, for arrays. */ |
40 | template <typename T> | |
41 | struct xfree_deleter<T[]> | |
42 | { | |
43 | void operator() (T *ptr) const { xfree (ptr); } | |
44 | }; | |
45 | ||
5cc8c731 PA |
46 | /* Import the standard unique_ptr to our namespace with a custom |
47 | deleter. */ | |
da804164 PA |
48 | |
49 | template<typename T> using unique_xmalloc_ptr | |
50 | = std::unique_ptr<T, xfree_deleter<T>>; | |
51 | ||
31930bd3 TT |
52 | /* A no-op deleter. */ |
53 | template<typename T> | |
54 | struct noop_deleter | |
55 | { | |
56 | void operator() (T *ptr) const { } | |
57 | }; | |
58 | ||
da804164 PA |
59 | } /* namespace gdb */ |
60 | ||
b02f78f9 PA |
61 | /* Dup STR and return a unique_xmalloc_ptr for the result. */ |
62 | ||
63 | static inline gdb::unique_xmalloc_ptr<char> | |
64 | make_unique_xstrdup (const char *str) | |
65 | { | |
66 | return gdb::unique_xmalloc_ptr<char> (xstrdup (str)); | |
67 | } | |
68 | ||
be77dd73 TT |
69 | /* Dup the first N characters of STR and return a unique_xmalloc_ptr |
70 | for the result. The result is always \0-terminated. */ | |
71 | ||
72 | static inline gdb::unique_xmalloc_ptr<char> | |
73 | make_unique_xstrndup (const char *str, size_t n) | |
74 | { | |
75 | return gdb::unique_xmalloc_ptr<char> (xstrndup (str, n)); | |
76 | } | |
77 | ||
a8ff7b9f | 78 | /* An overload of operator+= for adding gdb::unique_xmalloc_ptr<char> to a |
820ed8af AB |
79 | std::string. */ |
80 | ||
81 | static inline std::string & | |
82 | operator+= (std::string &lhs, const gdb::unique_xmalloc_ptr<char> &rhs) | |
83 | { | |
84 | return lhs += rhs.get (); | |
85 | } | |
86 | ||
87 | /* An overload of operator+ for adding gdb::unique_xmalloc_ptr<char> to a | |
88 | std::string. */ | |
89 | ||
90 | static inline std::string | |
91 | operator+ (const std::string &lhs, const gdb::unique_xmalloc_ptr<char> &rhs) | |
92 | { | |
93 | return lhs + rhs.get (); | |
94 | } | |
95 | ||
1a5c2598 | 96 | #endif /* COMMON_GDB_UNIQUE_PTR_H */ |