2
0
Эх сурвалжийг харах

Merge pull request #51582 from AnilBK/ustring-macro-replacements

ustring: Replace macros with inline functions.
Rémi Verschelde 4 жил өмнө
parent
commit
87b80a84f0
1 өөрчлөгдсөн 54 нэмэгдсэн , 41 устгасан
  1. 54 41
      core/string/ustring.cpp

+ 54 - 41
core/string/ustring.cpp

@@ -54,11 +54,27 @@
 #define snprintf _snprintf_s
 #endif
 
-#define MAX_DECIMALS 32
-#define UPPERCASE(m_c) (((m_c) >= 'a' && (m_c) <= 'z') ? ((m_c) - ('a' - 'A')) : (m_c))
-#define LOWERCASE(m_c) (((m_c) >= 'A' && (m_c) <= 'Z') ? ((m_c) + ('a' - 'A')) : (m_c))
-#define IS_DIGIT(m_d) ((m_d) >= '0' && (m_d) <= '9')
-#define IS_HEX_DIGIT(m_d) (((m_d) >= '0' && (m_d) <= '9') || ((m_d) >= 'a' && (m_d) <= 'f') || ((m_d) >= 'A' && (m_d) <= 'F'))
+static const int MAX_DECIMALS = 32;
+
+static _FORCE_INLINE_ bool is_digit(char32_t c) {
+	return (c >= '0' && c <= '9');
+}
+
+static _FORCE_INLINE_ bool is_hex_digit(char32_t c) {
+	return (is_digit(c) || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F'));
+}
+
+static _FORCE_INLINE_ bool is_upper_case(char32_t c) {
+	return (c >= 'A' && c <= 'Z');
+}
+
+static _FORCE_INLINE_ bool is_lower_case(char32_t c) {
+	return (c >= 'a' && c <= 'z');
+}
+
+static _FORCE_INLINE_ char32_t lower_case(char32_t c) {
+	return (is_upper_case(c) ? (c + ('a' - 'A')) : c);
+}
 
 const char CharString::_null = 0;
 const char16_t Char16String::_null = 0;
@@ -738,6 +754,7 @@ bool String::operator<=(const String &p_str) const {
 bool String::operator>(const String &p_str) const {
 	return p_str < *this;
 }
+
 bool String::operator>=(const String &p_str) const {
 	return !(*this < p_str);
 }
@@ -871,8 +888,8 @@ signed char String::naturalnocasecmp_to(const String &p_str) const {
 		while (*this_str) {
 			if (!*that_str) {
 				return 1;
-			} else if (IS_DIGIT(*this_str)) {
-				if (!IS_DIGIT(*that_str)) {
+			} else if (is_digit(*this_str)) {
+				if (!is_digit(*that_str)) {
 					return -1;
 				}
 
@@ -881,10 +898,10 @@ signed char String::naturalnocasecmp_to(const String &p_str) const {
 				const char32_t *that_substr = that_str;
 
 				// Compare lengths of both numerical sequences, ignoring leading zeros
-				while (IS_DIGIT(*this_str)) {
+				while (is_digit(*this_str)) {
 					this_str++;
 				}
-				while (IS_DIGIT(*that_str)) {
+				while (is_digit(*that_str)) {
 					that_str++;
 				}
 				while (*this_substr == '0') {
@@ -912,7 +929,7 @@ signed char String::naturalnocasecmp_to(const String &p_str) const {
 					this_substr++;
 					that_substr++;
 				}
-			} else if (IS_DIGIT(*that_str)) {
+			} else if (is_digit(*that_str)) {
 				return 1;
 			} else {
 				if (_find_upper(*this_str) < _find_upper(*that_str)) { //more than
@@ -962,26 +979,25 @@ String String::capitalize() const {
 String String::camelcase_to_underscore(bool lowercase) const {
 	const char32_t *cstr = get_data();
 	String new_string;
-	const char A = 'A', Z = 'Z';
-	const char a = 'a', z = 'z';
 	int start_index = 0;
 
 	for (int i = 1; i < this->size(); i++) {
-		bool is_upper = cstr[i] >= A && cstr[i] <= Z;
-		bool is_number = cstr[i] >= '0' && cstr[i] <= '9';
+		bool is_upper = is_upper_case(cstr[i]);
+		bool is_number = is_digit(cstr[i]);
+
 		bool are_next_2_lower = false;
 		bool is_next_lower = false;
 		bool is_next_number = false;
-		bool was_precedent_upper = cstr[i - 1] >= A && cstr[i - 1] <= Z;
-		bool was_precedent_number = cstr[i - 1] >= '0' && cstr[i - 1] <= '9';
+		bool was_precedent_upper = is_upper_case(cstr[i - 1]);
+		bool was_precedent_number = is_digit(cstr[i - 1]);
 
 		if (i + 2 < this->size()) {
-			are_next_2_lower = cstr[i + 1] >= a && cstr[i + 1] <= z && cstr[i + 2] >= a && cstr[i + 2] <= z;
+			are_next_2_lower = is_lower_case(cstr[i + 1]) && is_lower_case(cstr[i + 2]);
 		}
 
 		if (i + 1 < this->size()) {
-			is_next_lower = cstr[i + 1] >= a && cstr[i + 1] <= z;
-			is_next_number = cstr[i + 1] >= '0' && cstr[i + 1] <= '9';
+			is_next_lower = is_lower_case(cstr[i + 1]);
+			is_next_number = is_digit(cstr[i + 1]);
 		}
 
 		const bool cond_a = is_upper && !was_precedent_upper && !was_precedent_number;
@@ -2198,9 +2214,9 @@ int64_t String::hex_to_int() const {
 	int64_t hex = 0;
 
 	while (*s) {
-		char32_t c = LOWERCASE(*s);
+		char32_t c = lower_case(*s);
 		int64_t n;
-		if (c >= '0' && c <= '9') {
+		if (is_digit(c)) {
 			n = c - '0';
 		} else if (c >= 'a' && c <= 'f') {
 			n = (c - 'a') + 10;
@@ -2239,7 +2255,7 @@ int64_t String::bin_to_int() const {
 	int64_t binary = 0;
 
 	while (*s) {
-		char32_t c = LOWERCASE(*s);
+		char32_t c = lower_case(*s);
 		int64_t n;
 		if (c == '0' || c == '1') {
 			n = c - '0';
@@ -2269,7 +2285,7 @@ int64_t String::to_int() const {
 
 	for (int i = 0; i < to; i++) {
 		char32_t c = operator[](i);
-		if (c >= '0' && c <= '9') {
+		if (is_digit(c)) {
 			bool overflow = (integer > INT64_MAX / 10) || (integer == INT64_MAX / 10 && ((sign == 1 && c > '7') || (sign == -1 && c > '8')));
 			ERR_FAIL_COND_V_MSG(overflow, sign == 1 ? INT64_MAX : INT64_MIN, "Cannot represent " + *this + " as 64-bit integer, provided value is " + (sign == 1 ? "too big." : "too small."));
 			integer *= 10;
@@ -2298,7 +2314,7 @@ int64_t String::to_int(const char *p_str, int p_len) {
 
 	for (int i = 0; i < to; i++) {
 		char c = p_str[i];
-		if (c >= '0' && c <= '9') {
+		if (is_digit(c)) {
 			bool overflow = (integer > INT64_MAX / 10) || (integer == INT64_MAX / 10 && ((sign == 1 && c > '7') || (sign == -1 && c > '8')));
 			ERR_FAIL_COND_V_MSG(overflow, sign == 1 ? INT64_MAX : INT64_MIN, "Cannot represent " + String(p_str).substr(0, to) + " as integer, provided value is " + (sign == 1 ? "too big." : "too small."));
 			integer *= 10;
@@ -2329,7 +2345,7 @@ int64_t String::to_int(const wchar_t *p_str, int p_len) {
 
 	for (int i = 0; i < to; i++) {
 		wchar_t c = p_str[i];
-		if (c >= '0' && c <= '9') {
+		if (is_digit(c)) {
 			bool overflow = (integer > INT64_MAX / 10) || (integer == INT64_MAX / 10 && ((sign == 1 && c > '7') || (sign == -1 && c > '8')));
 			ERR_FAIL_COND_V_MSG(overflow, sign == 1 ? INT64_MAX : INT64_MIN, "Cannot represent " + String(p_str).substr(0, to) + " as integer, provided value is " + (sign == 1 ? "too big." : "too small."));
 			integer *= 10;
@@ -2449,7 +2465,7 @@ static double built_in_strtod(const C *string, /* A decimal ASCII floating-point
 	decPt = -1;
 	for (mantSize = 0;; mantSize += 1) {
 		c = *p;
-		if (!IS_DIGIT(c)) {
+		if (!is_digit(c)) {
 			if ((c != '.') || (decPt >= 0)) {
 				break;
 			}
@@ -2524,11 +2540,11 @@ static double built_in_strtod(const C *string, /* A decimal ASCII floating-point
 			}
 			expSign = false;
 		}
-		if (!IS_DIGIT(char32_t(*p))) {
+		if (!is_digit(char32_t(*p))) {
 			p = pExp;
 			goto done;
 		}
-		while (IS_DIGIT(char32_t(*p))) {
+		while (is_digit(char32_t(*p))) {
 			exp = exp * 10 + (*p - '0');
 			p += 1;
 		}
@@ -2614,7 +2630,7 @@ int64_t String::to_int(const char32_t *p_str, int p_len, bool p_clamp) {
 		char32_t c = *(str++);
 		switch (reading) {
 			case READING_SIGN: {
-				if (c >= '0' && c <= '9') {
+				if (is_digit(c)) {
 					reading = READING_INT;
 					// let it fallthrough
 				} else if (c == '-') {
@@ -2631,7 +2647,7 @@ int64_t String::to_int(const char32_t *p_str, int p_len, bool p_clamp) {
 				[[fallthrough]];
 			}
 			case READING_INT: {
-				if (c >= '0' && c <= '9') {
+				if (is_digit(c)) {
 					if (integer > INT64_MAX / 10) {
 						String number("");
 						str = p_str;
@@ -3800,12 +3816,12 @@ bool String::is_valid_identifier() const {
 
 	for (int i = 0; i < len; i++) {
 		if (i == 0) {
-			if (str[0] >= '0' && str[0] <= '9') {
+			if (is_digit(str[0])) {
 				return false; // no start with number plz
 			}
 		}
 
-		bool valid_char = (str[i] >= '0' && str[i] <= '9') || (str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z') || str[i] == '_';
+		bool valid_char = is_digit(str[i]) || is_lower_case(str[i]) || is_upper_case(str[i]) || str[i] == '_';
 
 		if (!valid_char) {
 			return false;
@@ -3830,10 +3846,7 @@ String String::uri_encode() const {
 	String res;
 	for (int i = 0; i < temp.length(); ++i) {
 		char ord = temp[i];
-		if (ord == '.' || ord == '-' || ord == '_' || ord == '~' ||
-				(ord >= 'a' && ord <= 'z') ||
-				(ord >= 'A' && ord <= 'Z') ||
-				(ord >= '0' && ord <= '9')) {
+		if (ord == '.' || ord == '-' || ord == '_' || ord == '~' || is_lower_case(ord) || is_upper_case(ord) || is_digit(ord)) {
 			res += ord;
 		} else {
 			char h_Val[3];
@@ -3855,9 +3868,9 @@ String String::uri_decode() const {
 	for (int i = 0; i < src.length(); ++i) {
 		if (src[i] == '%' && i + 2 < src.length()) {
 			char ord1 = src[i + 1];
-			if ((ord1 >= '0' && ord1 <= '9') || (ord1 >= 'A' && ord1 <= 'Z')) {
+			if (is_digit(ord1) || is_upper_case(ord1)) {
 				char ord2 = src[i + 2];
-				if ((ord2 >= '0' && ord2 <= '9') || (ord2 >= 'A' && ord2 <= 'Z')) {
+				if (is_digit(ord2) || is_upper_case(ord2)) {
 					char bytes[3] = { (char)ord1, (char)ord2, 0 };
 					res += (char)strtol(bytes, nullptr, 16);
 					i += 2;
@@ -3963,7 +3976,7 @@ static _FORCE_INLINE_ int _xml_unescape(const char32_t *p_src, int p_src_len, ch
 						char32_t ct = p_src[i];
 						if (ct == ';') {
 							break;
-						} else if (ct >= '0' && ct <= '9') {
+						} else if (is_digit(ct)) {
 							ct = ct - '0';
 						} else if (ct >= 'a' && ct <= 'f') {
 							ct = (ct - 'a') + 10;
@@ -4191,7 +4204,7 @@ bool String::is_valid_hex_number(bool p_with_prefix) const {
 
 	for (int i = from; i < len; i++) {
 		char32_t c = operator[](i);
-		if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')) {
+		if (is_hex_digit(c)) {
 			continue;
 		}
 		return false;
@@ -4219,7 +4232,7 @@ bool String::is_valid_float() const {
 	bool numbers_found = false;
 
 	for (int i = from; i < len; i++) {
-		if (operator[](i) >= '0' && operator[](i) <= '9') {
+		if (is_digit(operator[](i))) {
 			if (exponent_found) {
 				exponent_values_found = true;
 			} else {