/**************************************************************************/ /* ustring.h */ /**************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ /* https://godotengine.org */ /**************************************************************************/ /* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ /* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ /* */ /* Permission is hereby granted, free of charge, to any person obtaining */ /* a copy of this software and associated documentation files (the */ /* "Software"), to deal in the Software without restriction, including */ /* without limitation the rights to use, copy, modify, merge, publish, */ /* distribute, sublicense, and/or sell copies of the Software, and to */ /* permit persons to whom the Software is furnished to do so, subject to */ /* the following conditions: */ /* */ /* The above copyright notice and this permission notice shall be */ /* included in all copies or substantial portions of the Software. */ /* */ /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ /* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ /* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ /* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ /* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /**************************************************************************/ #ifndef USTRING_GODOT_H #define USTRING_GODOT_H // Note: _GODOT suffix added to header guard to avoid conflict with ICU header. #include "core/string/char_utils.h" #include "core/templates/cowdata.h" #include "core/templates/vector.h" #include "core/typedefs.h" #include "core/variant/array.h" /*************************************************************************/ /* CharProxy */ /*************************************************************************/ template <typename T> class CharProxy { … }; /*************************************************************************/ /* Char16String */ /*************************************************************************/ class Char16String { … }; /*************************************************************************/ /* CharString */ /*************************************************************************/ class CharString { … }; /*************************************************************************/ /* String */ /*************************************************************************/ struct StrRange { … }; class String { … }; bool operator==(const char *p_chr, const String &p_str); bool operator==(const wchar_t *p_chr, const String &p_str); bool operator!=(const char *p_chr, const String &p_str); bool operator!=(const wchar_t *p_chr, const String &p_str); String operator+(const char *p_chr, const String &p_str); String operator+(const wchar_t *p_chr, const String &p_str); String operator+(char32_t p_chr, const String &p_str); String itos(int64_t p_val); String uitos(uint64_t p_val); String rtos(double p_val); String rtoss(double p_val); //scientific version struct NoCaseComparator { … }; struct NaturalNoCaseComparator { … }; struct FileNoCaseComparator { … }; template <typename L, typename R> _FORCE_INLINE_ bool is_str_less(const L *l_ptr, const R *r_ptr) { … } /* end of namespace */ // Tool translate (TTR and variants) for the editor UI, // and doc translate for the class reference (DTR). #ifdef TOOLS_ENABLED // Gets parsed. String TTR(const String &p_text, const String &p_context = ""); String TTRN(const String &p_text, const String &p_text_plural, int p_n, const String &p_context = ""); String DTR(const String &p_text, const String &p_context = ""); String DTRN(const String &p_text, const String &p_text_plural, int p_n, const String &p_context = ""); // Use for C strings. #define TTRC(m_value) … // Use to avoid parsing (for use later with C strings). #define TTRGET(m_value) … #else #define TTRC … #define TTRGET … #endif // Use this to mark property names for editor translation. // Often for dynamic properties defined in _get_property_list(). // Property names defined directly inside EDITOR_DEF, GLOBAL_DEF, and ADD_PROPERTY macros don't need this. #define PNAME(m_value) … // Similar to PNAME, but to mark groups, i.e. properties with PROPERTY_USAGE_GROUP. // Groups defined directly inside ADD_GROUP macros don't need this. // The arguments are the same as ADD_GROUP. m_prefix is only used for extraction. #define GNAME(m_value, m_prefix) … // Runtime translate for the public node API. String RTR(const String &p_text, const String &p_context = ""); String RTRN(const String &p_text, const String &p_text_plural, int p_n, const String &p_context = ""); /** * "Extractable TRanslate". Used for strings that can appear inside an exported * project (such as the ones in nodes like `FileDialog`), which are made possible * to add in the POT generator. A translation context can optionally be specified * to disambiguate between identical source strings in translations. * When placeholders are desired, use vformat(ETR("Example: %s"), some_string)`. * If a string mentions a quantity (and may therefore need a dynamic plural form), * use `ETRN()` instead of `ETR()`. * * NOTE: This function is for string extraction only, and will just return the * string it was given. The translation itself should be done internally by nodes * with `atr()` instead. */ _FORCE_INLINE_ String ETR(const String &p_text, const String &p_context = "") { … } /** * "Extractable TRanslate for N items". Used for strings that can appear inside an * exported project (such as the ones in nodes like `FileDialog`), which are made * possible to add in the POT generator. A translation context can optionally be * specified to disambiguate between identical source strings in translations. * Use `ETR()` if the string doesn't need dynamic plural form. When placeholders * are desired, use `vformat(ETRN("%d item", "%d items", some_integer), some_integer)`. * The placeholder must be present in both strings to avoid run-time warnings in `vformat()`. * * NOTE: This function is for string extraction only, and will just return the * string it was given. The translation itself should be done internally by nodes * with `atr()` instead. */ _FORCE_INLINE_ String ETRN(const String &p_text, const String &p_text_plural, int p_n, const String &p_context = "") { … } bool select_word(const String &p_s, int p_col, int &r_beg, int &r_end); _FORCE_INLINE_ void sarray_add_str(Vector<String> &arr) { … } _FORCE_INLINE_ void sarray_add_str(Vector<String> &arr, const String &p_str) { … } template <typename... P> _FORCE_INLINE_ void sarray_add_str(Vector<String> &arr, const String &p_str, P... p_args) { … } template <typename... P> _FORCE_INLINE_ Vector<String> sarray(P... p_args) { … } #endif // USTRING_GODOT_H