llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-libcxx

Author: Mark de Wever (mordante)

<details>
<summary>Changes</summary>

The new documentation will look like
https://discourse.llvm.org/t/rfc-improving-the-feature-test-macro-status-page/78327/5?u=mordante

---
Full diff: https://github.com/llvm/llvm-project/pull/139774.diff


2 Files Affected:

- (added) libcxx/test/libcxx/feature_test_macro/documentation.sh.py (+187) 
- (modified) libcxx/utils/generate_feature_test_macro_components.py (+161-1) 


``````````diff
diff --git a/libcxx/test/libcxx/feature_test_macro/documentation.sh.py 
b/libcxx/test/libcxx/feature_test_macro/documentation.sh.py
new file mode 100644
index 0000000000000..1c35e0eafc771
--- /dev/null
+++ b/libcxx/test/libcxx/feature_test_macro/documentation.sh.py
@@ -0,0 +1,187 @@
+# 
===----------------------------------------------------------------------===##
+#
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+#
+# 
===----------------------------------------------------------------------===##
+
+# RUN: %{python} %s %{libcxx-dir}/utils 
%{libcxx-dir}/test/libcxx/feature_test_macro/test_data.json
+
+import sys
+import unittest
+
+UTILS = sys.argv[1]
+TEST_DATA = sys.argv[2]
+del sys.argv[1:3]
+
+sys.path.append(UTILS)
+from generate_feature_test_macro_components import FeatureTestMacros
+
+
+class Test(unittest.TestCase):
+    def setUp(self):
+        self.ftm = FeatureTestMacros(TEST_DATA, ["charconv"])
+        self.maxDiff = None  # This causes the diff to be printed when the 
test fails
+
+    def test_implementeation(self):
+        expected = """\
+.. _FeatureTestMacroTable:
+
+==========================
+Feature Test Macro Support
+==========================
+
+.. contents::
+   :local:
+
+Overview
+========
+
+This page documents libc++'s implementation status of the Standard library
+feature test macros. This page does not list all details, that information can
+be found at the `isoccp
+<https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations#library-feature-test-macros>`__.
+
+.. _feature-status:
+
+Status
+======
+
+.. list-table:: Current Status
+  :widths: auto
+  :header-rows: 1
+  :align: left
+
+  * - Macro Name
+    - Libc++ Value
+    - Standard Value
+    - 
+    - Paper
+  * - | **C++17**
+    - | 
+    - | 
+    - | 
+    - | 
+  * - | ``__cpp_lib_any``
+    - | 201606L
+    - | 201606L
+    - | ✅
+    - | 
+  * - | ``__cpp_lib_clamp``
+    - | 201603L
+    - | 201603L
+    - | ✅
+    - | 
+  * - | ``__cpp_lib_parallel_algorithm``
+    - | 201603L
+    - | 201603L
+    - | ✅
+    - | 
+  * - | ``__cpp_lib_to_chars``
+    - | *unimplemented*
+    - | 201611L
+    - | ❌
+    - | 
+  * - | ``__cpp_lib_variant``
+    - | 202102L
+    - | 202102L
+    - | ✅
+    - | ``std::visit`` for classes derived from ``std::variant``
+  * - | ``__cpp_lib_zz_missing_FTM_in_older_standard``
+    - | *unimplemented*
+    - | 2017L
+    - | ❌
+    - | Some FTM missing a paper in an older Standard mode, which should 
result in the FTM never being defined.
+  * - | **C++20**
+    - | 
+    - | 
+    - | 
+    - | 
+  * - | ``__cpp_lib_barrier``
+    - | 201907L
+    - | 201907L
+    - | ✅
+    - | 
+  * - | ``__cpp_lib_format``
+      | 
+      | 
+      | 
+      | 
+    - | *unimplemented*
+      | 
+      | 
+      | 
+      | 
+    - | 201907L
+      | 
+      | 202106L
+      | 202110L
+      | 
+    - | ✅
+      | ❌
+      | ✅
+      | ❌
+      | ✅
+    - | `P0645R10 <https://wg21.link/P0645R10>`__ Text Formatting
+      | `P1361R2 <https://wg21.link/P1361R2>`__ Integration of chrono with 
text formatting
+      | `P2216R3 <https://wg21.link/P2216R3>`__ std::format improvements
+      | `P2372R3 <https://wg21.link/P2372R3>`__ Fixing locale handling in 
chrono formatters
+      | `P2418R2 <https://wg21.link/P2418R2>`__ FAdd support for 
std::generator-like types to std::format
+  * - | ``__cpp_lib_variant``
+    - | *unimplemented*
+    - | 202106L
+    - | ❌
+    - | Fully constexpr ``std::variant``
+  * - | ``__cpp_lib_zz_missing_FTM_in_older_standard``
+    - | *unimplemented*
+    - | 2020L
+    - | ✅
+    - | 
+  * - | **C++23**
+    - | 
+    - | 
+    - | 
+    - | 
+  * - | ``__cpp_lib_format``
+    - | *unimplemented*
+    - | 202207L
+    - | ❌
+    - | `P2419R2 <https://wg21.link/P2419R2>`__ Clarify handling of encodings 
in localized formatting of chrono types
+  * - | **C++26**
+    - | 
+    - | 
+    - | 
+    - | 
+  * - | ``__cpp_lib_barrier``
+    - | 299900L
+    - | 299900L
+    - | ✅
+    - | 
+  * - | ``__cpp_lib_format``
+      | 
+    - | *unimplemented*
+      | 
+    - | 202306L
+      | 202311L
+    - | ✅
+      | ✅
+    - | `P2637R3 <https://wg21.link/P2637R3>`__ Member Visit
+      | `P2918R2 <https://wg21.link/P2918R2>`__ Runtime format strings II
+  * - | ``__cpp_lib_variant``
+    - | *unimplemented*
+    - | 202306L
+    - | ✅
+    - | Member visit
+  * - | ``__cpp_lib_zz_missing_FTM_in_older_standard``
+    - | *unimplemented*
+    - | 2026L
+    - | ✅
+    - | 
+
+"""
+        self.assertEqual(self.ftm.documentation, expected)
+
+
+if __name__ == "__main__":
+    unittest.main()
diff --git a/libcxx/utils/generate_feature_test_macro_components.py 
b/libcxx/utils/generate_feature_test_macro_components.py
index 7256e56145233..472158eadcb91 100755
--- a/libcxx/utils/generate_feature_test_macro_components.py
+++ b/libcxx/utils/generate_feature_test_macro_components.py
@@ -2125,6 +2125,97 @@ def generate_version_header_implementation(
 {tests}\
 """
 
+#
+# The templates used to create a FTM documentation
+#
+
+ftm_documentation = """.. _FeatureTestMacroTable:
+
+==========================
+Feature Test Macro Support
+==========================
+
+.. contents::
+   :local:
+
+Overview
+========
+
+This page documents libc++'s implementation status of the Standard library
+feature test macros. This page does not list all details, that information can
+be found at the `isoccp
+<https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations#library-feature-test-macros>`__.
+
+.. _feature-status:
+
+Status
+======
+
+.. list-table:: Current Status
+  :widths: auto
+  :header-rows: 1
+  :align: left
+
+  * - Macro Name
+    - Libc++ Value
+    - Standard Value
+    - 
+    - Paper
+{status_list_table}
+"""
+
+def create_table_row(data: List[List[str]]) -> str:
+    """Creates an RST list-table row from the contents of `data`.
+
+    Data contains one or more elements for a single row for a RST list-table.
+    When the list contains more than one element, the data is considered to be
+    a multi-row entry. The for a table cell is stored like
+    cell = data[row][column].
+
+    All rows in the table need to have the same number of columns. (This also
+    holds true for the "Standard version header rows".)
+
+    A row for an RST list-table has the following structure:
+      * - column 1
+        - column 2
+        - column 3
+
+    Note the output is indented.
+
+    Alternatively it is possible to have cells that "span" multiple rows. This
+    is not a real span since all cells are created, however creating an empty
+    cell gives the wanted visual effect. These rows have the following
+    structure: A row for an RST list-table has the following structure:
+      * - | row 1, column 1
+          | row 2, column 1
+        - | row 1, column 2
+          | row 2, column 2
+        - | row 1, column 3
+          | row 2, column 3
+
+    Note it is allowed to use the following for a single row:
+      * - | column 1
+        - | column 2
+        - | column 3
+
+    However the algorithm does not do that.
+    """
+
+    result = ""
+
+    cell = "*"  # The marker for the first cell in the row
+    multi_row = "| " if len(data) > 0 else ""
+    # As described above the rows and columns are traversed column first.
+    for c in range(len(data[0])):
+        column = "-"  # The marker for the columns
+        for r in range(len(data)):
+            result += f"  {cell} {column} {multi_row}{data[r][c]}\n"
+            cell = " "
+            column = " "
+
+    return result
+
+
 class FeatureTestMacros:
     """Provides all feature-test macro (FTM) output components.
 
@@ -2284,7 +2375,6 @@ def implemented_ftms(self) -> Dict[Ftm, Dict[Std, 
Optional[Value]]]:
 
         return get_ftms(self.__data, self.std_dialects, True)
 
-
     def is_implemented(self, ftm: Ftm, std: Std) -> bool:
         """Has the FTM `ftm` been implemented in the dialect `std`?"""
 
@@ -2555,6 +2645,72 @@ def generate_header_test_directory(self, path: os.path) 
-> None:
                 f.write(self.generate_header_test_file(header))
 
 
+    @functools.cached_property
+    def status_list_table(self) -> str:
+        """Creates the rst status table using a list-table."""
+
+        result = ""
+        for std in self.std_dialects:
+            result += create_table_row(
+                [[f'**{std.replace("c++", "C++")}**', "", "", "", ""]]
+            )
+
+            for feature in self.__data:
+                if std not in feature["values"].keys():
+                    continue
+
+                row = list()
+
+                ftm = feature["name"]
+                libcxx_value = (
+                    f"{self.standard_ftms[ftm][std]}"
+                    if self.is_implemented(ftm, std)
+                    else "*unimplemented*"
+                )
+
+                values = feature["values"][std]
+                assert len(values) > 0, f"{feature['name']}[{std}] has no 
entries"
+                for value in values:
+                    std_value = f"{value}L"
+                    papers = list(values[value])
+                    assert (
+                        len(papers) > 0
+                    ), f"{feature['name']}[{std}][{value}] has no entries"
+
+                    for paper in papers:
+                        number = "" if not "number" in paper.keys() else 
paper["number"]
+                        title = "" if not "title" in paper.keys() else 
paper["title"]
+                        implemented = paper["implemented"]
+
+                        row += [
+                            [
+                                f"``{ftm}``" if ftm else "",
+                                libcxx_value,
+                                std_value,
+                                "✅" if implemented else "❌",
+                                (
+                                    f"`{number} 
<https://wg21.link/{number}>`__ {title}"
+                                    if number
+                                    else f"{title}"
+                                ),
+                            ]
+                        ]
+                        ftm = ""
+                        libcxx_value = ""
+                        std_value = ""
+
+                result += create_table_row(row)
+
+        return result
+
+
+    @functools.cached_property
+    def documentation(self) -> str:
+        """Generates the FTM documentation."""
+
+        return 
ftm_documentation.format(status_list_table=self.status_list_table)
+
+
 def main():
     produce_version_header()
     produce_tests()
@@ -2573,6 +2729,10 @@ def main():
 
         ftm.generate_header_test_directory(macro_test_path)
 
+        documentation_path = os.path.join(docs_path, 
"FeatureTestMacroTable.rst")
+        with open(documentation_path, "w", newline="\n") as f:
+             f.write(ftm.documentation)
+
 
 if __name__ == "__main__":
     main()

``````````

</details>


https://github.com/llvm/llvm-project/pull/139774
_______________________________________________
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to