Kaynağa Gözat

Merge pull request #62814 from KoBeWi/strint

Restore numeric from String constructors
Rémi Verschelde 2 yıl önce
ebeveyn
işleme
cfb9cae23a

+ 2 - 0
core/variant/variant_construct.cpp

@@ -68,11 +68,13 @@ void Variant::_register_variant_constructors() {
 	add_constructor<VariantConstructor<int64_t, int64_t>>(sarray("from"));
 	add_constructor<VariantConstructor<int64_t, double>>(sarray("from"));
 	add_constructor<VariantConstructor<int64_t, bool>>(sarray("from"));
+	add_constructor<VariantConstructorFromString<int64_t>>(sarray("from"));
 
 	add_constructor<VariantConstructNoArgs<double>>(sarray());
 	add_constructor<VariantConstructor<double, double>>(sarray("from"));
 	add_constructor<VariantConstructor<double, int64_t>>(sarray("from"));
 	add_constructor<VariantConstructor<double, bool>>(sarray("from"));
+	add_constructor<VariantConstructorFromString<double>>(sarray("from"));
 
 	add_constructor<VariantConstructNoArgs<String>>(sarray());
 	add_constructor<VariantConstructor<String, String>>(sarray("from"));

+ 58 - 0
core/variant/variant_construct.h

@@ -222,6 +222,64 @@ public:
 	}
 };
 
+template <class T>
+class VariantConstructorFromString {
+public:
+	static void construct(Variant &r_ret, const Variant **p_args, Callable::CallError &r_error) {
+		if (p_args[0]->get_type() != Variant::STRING) {
+			r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT;
+			r_error.argument = 0;
+			r_error.expected = Variant::STRING;
+			return;
+		}
+
+		VariantTypeChanger<T>::change(&r_ret);
+		const String &src_str = *VariantGetInternalPtr<String>::get_ptr(p_args[0]);
+
+		if (r_ret.get_type() == Variant::Type::INT) {
+			r_ret = src_str.to_int();
+		} else if (r_ret.get_type() == Variant::Type::FLOAT) {
+			r_ret = src_str.to_float();
+		}
+	}
+
+	static inline void validated_construct(Variant *r_ret, const Variant **p_args) {
+		VariantTypeChanger<T>::change(r_ret);
+		const String &src_str = *VariantGetInternalPtr<String>::get_ptr(p_args[0]);
+		T ret = Variant();
+		if (r_ret->get_type() == Variant::Type::INT) {
+			ret = src_str.to_int();
+		} else if (r_ret->get_type() == Variant::Type::FLOAT) {
+			ret = src_str.to_float();
+		}
+		*r_ret = ret;
+	}
+
+	static void ptr_construct(void *base, const void **p_args) {
+		String src_str = PtrToArg<String>::convert(p_args[0]);
+		T dst_var = Variant();
+		Variant type_test = Variant(dst_var);
+		if (type_test.get_type() == Variant::Type::INT) {
+			dst_var = src_str.to_int();
+		} else if (type_test.get_type() == Variant::Type::FLOAT) {
+			dst_var = src_str.to_float();
+		}
+		PtrConstruct<T>::construct(dst_var, base);
+	}
+
+	static int get_argument_count() {
+		return 1;
+	}
+
+	static Variant::Type get_argument_type(int p_arg) {
+		return Variant::STRING;
+	}
+
+	static Variant::Type get_base_type() {
+		return GetTypeInfo<T>::VARIANT_TYPE;
+	}
+};
+
 class VariantConstructorCallableArgs {
 public:
 	static void construct(Variant &r_ret, const Variant **p_args, Callable::CallError &r_error) {

+ 7 - 0
doc/classes/float.xml

@@ -26,6 +26,13 @@
 				Constructs a [float] as a copy of the given [float].
 			</description>
 		</constructor>
+		<constructor name="float">
+			<return type="float" />
+			<param index="0" name="from" type="String" />
+			<description>
+				Converts a [String] to a [float], following the same rules as [method String.to_float].
+			</description>
+		</constructor>
 		<constructor name="float">
 			<return type="float" />
 			<param index="0" name="from" type="bool" />

+ 7 - 0
doc/classes/int.xml

@@ -52,6 +52,13 @@
 				Constructs an [int] as a copy of the given [int].
 			</description>
 		</constructor>
+		<constructor name="int">
+			<return type="int" />
+			<param index="0" name="from" type="String" />
+			<description>
+				Converts a [String] to an [int], following the same rules as [method String.to_int].
+			</description>
+		</constructor>
 		<constructor name="int">
 			<return type="int" />
 			<param index="0" name="from" type="bool" />