master
h 81 lines 1.54 KB
Raw
1 #ifndef ML_STRING_WRAPPER_H
2 #define ML_STRING_WRAPPER_H
3
4 #include "libnetdata/libnetdata.h"
5
6 #include <algorithm>
7
8 class StringWrapper {
9 public:
10 StringWrapper() noexcept : Inner(nullptr)
11 {
12 }
13
14 explicit StringWrapper(const char *S) noexcept : Inner(string_strdupz(S))
15 {
16 }
17
18 explicit StringWrapper(STRING *S) noexcept : Inner(string_dup(S))
19 {
20 }
21
22 StringWrapper(const StringWrapper &Other) noexcept : Inner(string_dup(Other.Inner))
23 {
24 }
25
26 StringWrapper &operator=(const StringWrapper &Other) noexcept
27 {
28 if (this != &Other) {
29 STRING *Tmp = string_dup(Other.Inner);
30 string_freez(Inner);
31 Inner = Tmp;
32 }
33 return *this;
34 }
35
36 StringWrapper(StringWrapper &&Other) noexcept : Inner(Other.Inner)
37 {
38 Other.Inner = nullptr;
39 }
40
41 StringWrapper &operator=(StringWrapper &&Other) noexcept
42 {
43 if (this != &Other) {
44 string_freez(Inner);
45 Inner = Other.Inner;
46 Other.Inner = nullptr;
47 }
48 return *this;
49 }
50
51 ~StringWrapper()
52 {
53 string_freez(Inner);
54 }
55
56 STRING *inner() const noexcept
57 {
58 return Inner;
59 }
60
61 operator const char *() const noexcept
62 {
63 return string2str(Inner);
64 }
65
66 void swap(StringWrapper &Other) noexcept
67 {
68 std::swap(Inner, Other.Inner);
69 }
70
71 private:
72 STRING *Inner;
73 };
74
75 // Free swap function
76 inline void swap(StringWrapper &LHS, StringWrapper &RHS) noexcept
77 {
78 LHS.swap(RHS);
79 }
80
81 #endif /* ML_STRING_WRAPPER_H */