瀏覽代碼

LibWeb: Add comparison operators to CSS numeric types (except Length)

This is to make it easier to bounds-check their values during parsing.
Length is left out because many length units are relative to the
context in which they are used, and so we cannot easily compare `10px`
and `1em`, for example.
Sam Atkins 2 年之前
父節點
當前提交
fbfce2e73e

+ 12 - 0
Userland/Libraries/LibWeb/CSS/Angle.h

@@ -38,6 +38,18 @@ public:
         return m_type == other.m_type && m_value == other.m_value;
     }
 
+    int operator<=>(Angle const& other) const
+    {
+        auto this_degrees = to_degrees();
+        auto other_degrees = other.to_degrees();
+
+        if (this_degrees < other_degrees)
+            return -1;
+        if (this_degrees > other_degrees)
+            return 1;
+        return 0;
+    }
+
 private:
     StringView unit_name() const;
 

+ 12 - 0
Userland/Libraries/LibWeb/CSS/Frequency.h

@@ -35,6 +35,18 @@ public:
         return m_type == other.m_type && m_value == other.m_value;
     }
 
+    int operator<=>(Frequency const& other) const
+    {
+        auto this_hertz = to_hertz();
+        auto other_hertz = other.to_hertz();
+
+        if (this_hertz < other_hertz)
+            return -1;
+        if (this_hertz > other_hertz)
+            return 1;
+        return 0;
+    }
+
 private:
     StringView unit_name() const;
 

+ 10 - 1
Userland/Libraries/LibWeb/CSS/Number.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Sam Atkins <atkinssj@serenityos.org>
+ * Copyright (c) 2022-2023, Sam Atkins <atkinssj@serenityos.org>
  *
  * SPDX-License-Identifier: BSD-2-Clause
  */
@@ -82,6 +82,15 @@ public:
         return m_type == other.m_type && m_value == other.m_value;
     }
 
+    int operator<=>(Number const& other) const
+    {
+        if (m_value < other.m_value)
+            return -1;
+        if (m_value > other.m_value)
+            return 1;
+        return 0;
+    }
+
 private:
     double m_value { 0 };
     Type m_type;

+ 10 - 1
Userland/Libraries/LibWeb/CSS/Percentage.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Sam Atkins <atkinssj@serenityos.org>
+ * Copyright (c) 2022-2023, Sam Atkins <atkinssj@serenityos.org>
  *
  * SPDX-License-Identifier: BSD-2-Clause
  */
@@ -38,6 +38,15 @@ public:
 
     bool operator==(Percentage const& other) const { return m_value == other.m_value; }
 
+    int operator<=>(Percentage const& other) const
+    {
+        if (m_value < other.m_value)
+            return -1;
+        if (m_value > other.m_value)
+            return 1;
+        return 0;
+    }
+
 private:
     double m_value;
 };

+ 13 - 1
Userland/Libraries/LibWeb/CSS/Resolution.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2022, Sam Atkins <atkinssj@serenityos.org>
+ * Copyright (c) 2022-2023, Sam Atkins <atkinssj@serenityos.org>
  *
  * SPDX-License-Identifier: BSD-2-Clause
  */
@@ -32,6 +32,18 @@ public:
         return m_type == other.m_type && m_value == other.m_value;
     }
 
+    int operator<=>(Resolution const& other) const
+    {
+        auto this_dots_per_pixel = to_dots_per_pixel();
+        auto other_dots_per_pixel = other.to_dots_per_pixel();
+
+        if (this_dots_per_pixel < other_dots_per_pixel)
+            return -1;
+        if (this_dots_per_pixel > other_dots_per_pixel)
+            return 1;
+        return 0;
+    }
+
 private:
     StringView unit_name() const;
 

+ 12 - 0
Userland/Libraries/LibWeb/CSS/Time.h

@@ -37,6 +37,18 @@ public:
         return m_type == other.m_type && m_value == other.m_value;
     }
 
+    int operator<=>(Time const& other) const
+    {
+        auto this_seconds = to_seconds();
+        auto other_seconds = other.to_seconds();
+
+        if (this_seconds < other_seconds)
+            return -1;
+        if (this_seconds > other_seconds)
+            return 1;
+        return 0;
+    }
+
 private:
     StringView unit_name() const;