diff options
Diffstat (limited to 'libcpp/include/line-map.h')
-rw-r--r-- | libcpp/include/line-map.h | 46 |
1 files changed, 38 insertions, 8 deletions
diff --git a/libcpp/include/line-map.h b/libcpp/include/line-map.h index 8033572..c6379ce 100644 --- a/libcpp/include/line-map.h +++ b/libcpp/include/line-map.h @@ -22,6 +22,8 @@ along with this program; see the file COPYING3. If not see #ifndef LIBCPP_LINE_MAP_H #define LIBCPP_LINE_MAP_H +#include <utility> + #ifndef GTY #define GTY(x) /* nothing */ #endif @@ -1836,43 +1838,71 @@ class label_text { public: label_text () - : m_buffer (NULL), m_caller_owned (false) + : m_buffer (NULL), m_owned (false) {} - void maybe_free () + ~label_text () + { + if (m_owned) + free (m_buffer); + } + + /* Move ctor. */ + label_text (label_text &&other) + : m_buffer (other.m_buffer), m_owned (other.m_owned) + { + other.moved_from (); + } + + /* Move assignment. */ + label_text & operator= (label_text &&other) { - if (m_caller_owned) + if (m_owned) free (m_buffer); + m_buffer = other.m_buffer; + m_owned = other.m_owned; + other.moved_from (); + return *this; } + /* Delete the copy ctor and copy-assignment operator. */ + label_text (const label_text &) = delete; + label_text & operator= (const label_text &) = delete; + /* Create a label_text instance that borrows BUFFER from a longer-lived owner. */ static label_text borrow (const char *buffer) { - return label_text (const_cast <char *> (buffer), false); + return std::move (label_text (const_cast <char *> (buffer), false)); } /* Create a label_text instance that takes ownership of BUFFER. */ static label_text take (char *buffer) { - return label_text (buffer, true); + return std::move (label_text (buffer, true)); } /* Take ownership of the buffer, copying if necessary. */ char *take_or_copy () { - if (m_caller_owned) + if (m_owned) return m_buffer; else return xstrdup (m_buffer); } + void moved_from () + { + m_buffer = NULL; + m_owned = false; + } + char *m_buffer; - bool m_caller_owned; + bool m_owned; private: label_text (char *buffer, bool owned) - : m_buffer (buffer), m_caller_owned (owned) + : m_buffer (buffer), m_owned (owned) {} }; |