xref: /freebsd/lib/libutil++/libutil++.hh (revision 22ce7be762ea7b03a2c40ad52932023c69e1400f)
1b3127a2dSJohn Baldwin /*-
2b3127a2dSJohn Baldwin  * SPDX-License-Identifier: BSD-2-Clause
3b3127a2dSJohn Baldwin  *
4b3127a2dSJohn Baldwin  * Copyright (c) 2025 Chelsio Communications, Inc.
5b3127a2dSJohn Baldwin  * Written by: John Baldwin <jhb@FreeBSD.org>
6b3127a2dSJohn Baldwin  */
7b3127a2dSJohn Baldwin 
8b3127a2dSJohn Baldwin #ifndef __LIBUTILPP_HH__
9b3127a2dSJohn Baldwin #define	__LIBUTILPP_HH__
10b3127a2dSJohn Baldwin 
11*22ce7be7SJohn Baldwin #include <netdb.h>
12*22ce7be7SJohn Baldwin 
13b3127a2dSJohn Baldwin #include <cstdarg>
14b3127a2dSJohn Baldwin #include <cstdio>
15b3127a2dSJohn Baldwin #include <cstdlib>
16b3127a2dSJohn Baldwin #include <memory>
17b3127a2dSJohn Baldwin 
18b3127a2dSJohn Baldwin namespace freebsd {
19b3127a2dSJohn Baldwin 	/*
20b3127a2dSJohn Baldwin 	 * FILE_up is a std::unique_ptr<> for FILE objects which uses
21b3127a2dSJohn Baldwin 	 * fclose() to destroy the wrapped pointer.
22b3127a2dSJohn Baldwin 	 */
23b3127a2dSJohn Baldwin 	struct fclose_deleter {
24b3127a2dSJohn Baldwin 		void operator() (std::FILE *fp) const
25b3127a2dSJohn Baldwin 		{
26b3127a2dSJohn Baldwin 			std::fclose(fp);
27b3127a2dSJohn Baldwin 		}
28b3127a2dSJohn Baldwin 	};
29b3127a2dSJohn Baldwin 
30b3127a2dSJohn Baldwin 	using FILE_up = std::unique_ptr<std::FILE, fclose_deleter>;
31b3127a2dSJohn Baldwin 
32b3127a2dSJohn Baldwin 	/*
33*22ce7be7SJohn Baldwin 	 * addrinfo_up is a std::unique_ptr<> which uses
34*22ce7be7SJohn Baldwin 	 * freeaddrinfo() to destroy the wrapped pointer.  It is
35*22ce7be7SJohn Baldwin 	 * intended to wrap arrays allocated by getaddrinfo().
36*22ce7be7SJohn Baldwin 	 */
37*22ce7be7SJohn Baldwin 	struct freeaddrinfo_deleter {
38*22ce7be7SJohn Baldwin 		void operator() (struct addrinfo *ai) const
39*22ce7be7SJohn Baldwin 		{
40*22ce7be7SJohn Baldwin 			freeaddrinfo(ai);
41*22ce7be7SJohn Baldwin 		}
42*22ce7be7SJohn Baldwin 	};
43*22ce7be7SJohn Baldwin 
44*22ce7be7SJohn Baldwin 	using addrinfo_up = std::unique_ptr<addrinfo, freeaddrinfo_deleter>;
45*22ce7be7SJohn Baldwin 
46*22ce7be7SJohn Baldwin 	/*
47b3127a2dSJohn Baldwin 	 * malloc_up<T> is a std::unique_ptr<> which uses free() to
48b3127a2dSJohn Baldwin 	 * destroy the wrapped pointer.  This can be used to wrap
49b3127a2dSJohn Baldwin 	 * pointers allocated implicitly by malloc() such as those
50b3127a2dSJohn Baldwin 	 * returned by strdup().
51b3127a2dSJohn Baldwin 	 */
52b3127a2dSJohn Baldwin 	template <class T>
53b3127a2dSJohn Baldwin 	struct free_deleter {
54b3127a2dSJohn Baldwin 		void operator() (T *p) const
55b3127a2dSJohn Baldwin 		{
56b3127a2dSJohn Baldwin 			std::free(p);
57b3127a2dSJohn Baldwin 		}
58b3127a2dSJohn Baldwin 	};
59b3127a2dSJohn Baldwin 
60b3127a2dSJohn Baldwin 	template <class T>
61b3127a2dSJohn Baldwin 	using malloc_up = std::unique_ptr<T, free_deleter<T>>;
62b3127a2dSJohn Baldwin 
63b3127a2dSJohn Baldwin 	/*
64b3127a2dSJohn Baldwin 	 * Returns a std::string containing the same output as
65b3127a2dSJohn Baldwin 	 * sprintf().  Throws std::bad_alloc if an error occurs.
66b3127a2dSJohn Baldwin 	 */
67b3127a2dSJohn Baldwin 	std::string stringf(const char *fmt, ...) __printflike(1, 2);
68b3127a2dSJohn Baldwin 	std::string stringf(const char *fmt, std::va_list ap);
69b3127a2dSJohn Baldwin }
70b3127a2dSJohn Baldwin 
71b3127a2dSJohn Baldwin #endif /* !__LIBUTILPP_HH__ */
72