| /* A very simple string class. | |
| Copyright (C) 2015-2026 Free Software Foundation, Inc. | |
| This program is free software; you can redistribute it and/or modify it | |
| under the terms of the GNU General Public License as published by the | |
| Free Software Foundation; either version 3, or (at your option) any | |
| later version. | |
| This program is distributed in the hope that it will be useful, | |
| but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| GNU General Public License for more details. | |
| You should have received a copy of the GNU General Public License | |
| along with this program; see the file COPYING3. If not see | |
| <http://www.gnu.org/licenses/>. | |
| In other words, you are welcome to use, share and improve this program. | |
| You are forbidden to forbid anyone else to use, share and improve | |
| what you give them. Help stamp out software-hoarding! */ | |
| #ifndef LIBCPP_LABEL_TEXT_H | |
| #define LIBCPP_LABEL_TEXT_H | |
| /* A struct for the result of range_label::get_text: a NUL-terminated buffer | |
| of localized text, and a flag to determine if the caller should "free" the | |
| buffer. */ | |
| class label_text | |
| { | |
| public: | |
| label_text () | |
| : m_buffer (NULL), m_owned (false) | |
| {} | |
| ~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.release (); | |
| } | |
| /* Move assignment. */ | |
| label_text & operator= (label_text &&other) | |
| { | |
| if (m_owned) | |
| free (m_buffer); | |
| m_buffer = other.m_buffer; | |
| m_owned = other.m_owned; | |
| other.release (); | |
| 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); | |
| } | |
| /* Create a label_text instance that takes ownership of BUFFER. */ | |
| static label_text take (char *buffer) | |
| { | |
| return label_text (buffer, true); | |
| } | |
| void release () | |
| { | |
| m_buffer = NULL; | |
| m_owned = false; | |
| } | |
| const char *get () const | |
| { | |
| return m_buffer; | |
| } | |
| bool is_owner () const | |
| { | |
| return m_owned; | |
| } | |
| private: | |
| char *m_buffer; | |
| bool m_owned; | |
| label_text (char *buffer, bool owned) | |
| : m_buffer (buffer), m_owned (owned) | |
| {} | |
| }; | |
| #endif /* !LIBCPP_LABEL_TEXT_H */ |