|
19 | 19 |
|
20 | 20 | #pragma once |
21 | 21 |
|
| 22 | +#include <memory> |
22 | 23 | #include <sstream> |
23 | 24 | #include <string> |
24 | 25 | #include <type_traits> |
@@ -131,33 +132,38 @@ class Status { |
131 | 132 | /** Create a success status. */ |
132 | 133 | Status() noexcept : state_(nullptr) {} |
133 | 134 | /** Destructor. */ |
134 | | - ~Status() noexcept { |
135 | | - if (state_ != nullptr) { |
136 | | - deleteState(); |
137 | | - } |
138 | | - } |
| 135 | + ~Status() noexcept = default; |
139 | 136 | /** |
140 | 137 | * @brief Constructs a status with the specified error code and message. |
141 | 138 | * @param code The error code of the status. |
142 | 139 | * @param msg The error message of the status. |
143 | 140 | */ |
144 | 141 | Status(StatusCode code, std::string msg) { |
145 | | - state_ = new State; |
| 142 | + state_ = std::make_unique<State>(); |
146 | 143 | state_->code = code; |
147 | 144 | state_->msg = std::move(msg); |
148 | 145 | } |
149 | 146 | /** Copy the specified status. */ |
150 | | - Status(const Status& s) |
151 | | - : state_((s.state_ == nullptr) ? nullptr : new State(*s.state_)) {} |
152 | | - /** Move the specified status. */ |
153 | | - Status(Status&& s) noexcept : state_(s.state_) { s.state_ = nullptr; } |
154 | | - /** Move assignment operator. */ |
155 | | - Status& operator=(Status&& s) noexcept { |
156 | | - delete state_; |
157 | | - state_ = s.state_; |
158 | | - s.state_ = nullptr; |
| 147 | + Status(const Status& s) { |
| 148 | + if (s.state_) { |
| 149 | + state_ = std::make_unique<State>(*s.state_); |
| 150 | + } |
| 151 | + } |
| 152 | + /** Copy assignment operator. */ |
| 153 | + Status& operator=(const Status& s) { |
| 154 | + if (this != &s) { |
| 155 | + if (s.state_) { |
| 156 | + state_ = std::make_unique<State>(*s.state_); |
| 157 | + } else { |
| 158 | + state_.reset(); |
| 159 | + } |
| 160 | + } |
159 | 161 | return *this; |
160 | 162 | } |
| 163 | + /** Move the specified status. */ |
| 164 | + Status(Status&& s) noexcept = default; |
| 165 | + /** Move assignment operator. */ |
| 166 | + Status& operator=(Status&& s) noexcept = default; |
161 | 167 |
|
162 | 168 | /** Returns a success status. */ |
163 | 169 | static Status OK() { return {}; } |
@@ -262,16 +268,11 @@ class Status { |
262 | 268 | } |
263 | 269 |
|
264 | 270 | private: |
265 | | - void deleteState() { |
266 | | - delete state_; |
267 | | - state_ = nullptr; |
268 | | - } |
269 | | - |
270 | 271 | struct State { |
271 | 272 | StatusCode code; |
272 | 273 | std::string msg; |
273 | 274 | }; |
274 | | - State* state_; |
| 275 | + std::unique_ptr<State> state_; |
275 | 276 | }; |
276 | 277 |
|
277 | 278 | } // namespace graphar |
|
0 commit comments