@@ -42,12 +42,17 @@ enum class StringOwnership {
42
42
class OwnedString {
43
43
const char *Data;
44
44
size_t Length;
45
- StringOwnership Ownership;
45
+ StringOwnership Ownership = StringOwnership::Unowned ;
46
46
47
- OwnedString (const char * Data, size_t Length, StringOwnership Ownership)
48
- : Length(Length), Ownership(Ownership) {
49
- assert (Length >= 0 && " expected length to be non-negative" );
47
+ void release () {
48
+ if (Ownership == StringOwnership::Copied)
49
+ free (const_cast <char *>(Data));
50
+ }
50
51
52
+ void initialize (const char * Data, size_t Length, StringOwnership Ownership) {
53
+ this ->Length = Length;
54
+ this ->Ownership = Ownership;
55
+ assert (Length >= 0 && " expected length to be non-negative" );
51
56
if (Ownership == StringOwnership::Copied && Data) {
52
57
char *substring = static_cast <char *>(malloc (Length + 1 ));
53
58
assert (substring && " expected successful malloc of copy" );
@@ -60,20 +65,48 @@ class OwnedString {
60
65
else
61
66
this ->Data = Data;
62
67
}
63
-
68
+ OwnedString (const char * Data, size_t Length, StringOwnership Ownership) {
69
+ initialize (Data, Length, Ownership);
70
+ }
64
71
public:
65
- OwnedString () : OwnedString(nullptr , 0 , StringOwnership::Unowned) {}
72
+ OwnedString (): OwnedString(nullptr , 0 , StringOwnership::Unowned) {}
66
73
67
- OwnedString (const char *Data, size_t Length)
68
- : OwnedString(Data, Length, StringOwnership::Unowned) {}
74
+ OwnedString (const char *Data, size_t Length):
75
+ OwnedString (Data, Length, StringOwnership::Unowned) {}
69
76
70
77
OwnedString (StringRef Str) : OwnedString(Str.data(), Str.size()) {}
71
78
72
79
OwnedString (const char *Data) : OwnedString(StringRef(Data)) {}
73
80
74
- OwnedString (const OwnedString &Other)
75
- : OwnedString(Other.Data, Other.Length, Other.Ownership) {}
76
-
81
+ OwnedString (const OwnedString &Other):
82
+ OwnedString (Other.Data, Other.Length, Other.Ownership) {}
83
+
84
+ OwnedString (OwnedString &&Other): Data(Other.Data), Length(Other.Length),
85
+ Ownership (Other.Ownership) {
86
+ Other.Data = nullptr ;
87
+ Other.Ownership = StringOwnership::Unowned;
88
+ }
89
+
90
+ OwnedString& operator =(const OwnedString &Other) {
91
+ if (&Other != this ) {
92
+ release ();
93
+ initialize (Other.Data , Other.Length , Other.Ownership );
94
+ }
95
+ return *this ;
96
+ }
97
+
98
+ OwnedString& operator =(OwnedString &&Other) {
99
+ if (&Other != this ) {
100
+ release ();
101
+ this ->Data = Other.Data ;
102
+ this ->Length = Other.Length ;
103
+ this ->Ownership = Other.Ownership ;
104
+ Other.Ownership = StringOwnership::Unowned;
105
+ Other.Data = nullptr ;
106
+ }
107
+ return *this ;
108
+ }
109
+
77
110
OwnedString copy () {
78
111
return OwnedString (Data, Length, StringOwnership::Copied);
79
112
}
@@ -99,8 +132,7 @@ class OwnedString {
99
132
}
100
133
101
134
~OwnedString () {
102
- if (Ownership == StringOwnership::Copied)
103
- free (const_cast <char *>(Data));
135
+ release ();
104
136
}
105
137
};
106
138
0 commit comments