]> git.ipfire.org Git - thirdparty/vala.git/commitdiff
glib-2.0: Add float.parse/try_parse() e5d50c5dfd38ee9f9b7f889b8d15254376a193d9
authorRico Tzschichholz <ricotz@ubuntu.com>
Thu, 16 Aug 2018 06:16:44 +0000 (08:16 +0200)
committerRico Tzschichholz <ricotz@ubuntu.com>
Thu, 16 Aug 2018 06:22:34 +0000 (08:22 +0200)
https://gitlab.gnome.org/GNOME/vala/issues/649

tests/basic-types/floats.vala
vapi/glib-2.0.vapi

index e0e8aef6b0877593d8fd1e9a9e5d799af6ddd654..903a4c1bf388019dc258295ed599e09d5a629649 100644 (file)
@@ -45,6 +45,9 @@ void test_double () {
        string s = d.to_string ();
        assert (s == "42");
 
+       d = double.parse ("47.11mm");
+       assert (d == 47.11);
+
        unowned string unparsed;
        double.try_parse ("3.45mm", out d, out unparsed);
        assert (d == 3.45);
@@ -63,6 +66,75 @@ void test_double () {
        assert (d2 == 10);
 }
 
+void test_float () {
+       // declaration and initialization
+       float f = 42f;
+       assert (f == 42f);
+
+       // assignment
+       f = 23f;
+       assert (f == 23f);
+
+       // access
+       float g = f;
+       assert (g == 23f);
+
+       // +
+       f = 42f + 23f;
+       assert (f == 65f);
+
+       // -
+       f = 42f - 23f;
+       assert (f == 19f);
+
+       // *
+       f = 42f * 23f;
+       assert (f == 966f);
+
+       // /
+       f = 42f / 23f;
+       assert (f > 1.8);
+       assert (f < 1.9);
+
+       // equality and relational
+       f = 42f;
+       assert (f == 42f);
+       assert (f != 50f);
+       assert (f < 42.5f);
+       assert (!(f < 41.5f));
+       assert (f <= 42f);
+       assert (!(f <= 41.5f));
+       assert (f >= 42f);
+       assert (!(f >= 42.5f));
+       assert (f > 41.5f);
+       assert (!(f > 42.5f));
+
+       // to_string
+       string s = f.to_string ();
+       assert (s == "42");
+
+       f = float.parse ("47.11mm");
+       assert (f == 47.11f);
+
+       unowned string unparsed;
+       float.try_parse ("3.45mm", out f, out unparsed);
+       assert (f == 3.45f);
+       assert (unparsed == "mm");
+
+       // ensure that MIN and MAX are valid values
+       f = float.MIN;
+       assert (f == float.MIN);
+       assert (f < float.MAX);
+       f = float.MAX;
+       assert (f == float.MAX);
+       assert (f > float.MIN);
+
+       // nullable
+       float? f2 = 10f;
+       assert (f2 == 10f);
+}
+
 void main () {
        test_double ();
+       test_float ();
 }
index 29b05dd0d2697803ec8a66772742ac211bfcde33..c46dabc16310f85e2fdafc2ae7addc4ca5b78961 100644 (file)
@@ -856,6 +856,25 @@ public struct float {
        public float clamp (float low, float high);
        [CCode (cname = "fabsf")]
        public float abs ();
+
+       [CCode (cname = "strtof", cheader_filename = "stdlib.h")]
+       static float strtof (string nptr, out char* endptr);
+
+       public static float parse (string str) {
+               return strtof (str, null);
+       }
+
+       public static bool try_parse (string str, out float result = null, out unowned string unparsed = null) {
+               char* endptr;
+               result = strtof (str, out endptr);
+               if (endptr == (char*) str + str.length) {
+                       unparsed = "";
+                       return true;
+               } else {
+                       unparsed = (string) endptr;
+                       return false;
+               }
+       }
 }
 
 [SimpleType]