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