--- /srv/rebuilderd/tmp/rebuilderdB1OwMC/inputs/libdune-common-doc_2.10.0-4_all.deb +++ /srv/rebuilderd/tmp/rebuilderdB1OwMC/out/libdune-common-doc_2.10.0-4_all.deb ├── file list │ @@ -1,3 +1,3 @@ │ -rw-r--r-- 0 0 0 4 2024-11-22 14:28:16.000000 debian-binary │ --rw-r--r-- 0 0 0 28164 2024-11-22 14:28:16.000000 control.tar.xz │ --rw-r--r-- 0 0 0 3146868 2024-11-22 14:28:16.000000 data.tar.xz │ +-rw-r--r-- 0 0 0 28132 2024-11-22 14:28:16.000000 control.tar.xz │ +-rw-r--r-- 0 0 0 3151396 2024-11-22 14:28:16.000000 data.tar.xz ├── control.tar.xz │ ├── control.tar │ │ ├── ./md5sums │ │ │ ├── ./md5sums │ │ │ │┄ Files differ │ │ │ ├── line order │ │ │ │ @@ -19,15 +19,14 @@ │ │ │ │ usr/share/doc/libdune-common-doc/changelog.Debian.gz │ │ │ │ usr/share/doc/libdune-common-doc/changelog.gz │ │ │ │ usr/share/doc/libdune-common-doc/copyright │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00002.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00008.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00008_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00011.html │ │ │ │ -usr/share/doc/libdune-common-doc/doxygen/a00011_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00014.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00014_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00017.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00017_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00020.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00020_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00023.html │ │ │ │ @@ -45,17 +44,19 @@ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00041.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00041_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00044.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00044_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00047.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00047_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00050.html │ │ │ │ +usr/share/doc/libdune-common-doc/doxygen/a00050_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00053.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00053_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00056.html │ │ │ │ +usr/share/doc/libdune-common-doc/doxygen/a00056_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00059.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00059_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00062.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00062_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00065.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00065_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00068.html │ │ │ │ @@ -81,21 +82,22 @@ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00098.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00098_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00101.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00101_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00104.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00104_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00107.html │ │ │ │ -usr/share/doc/libdune-common-doc/doxygen/a00107_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00110.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00110_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00113.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00113_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00116.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00116_source.html │ │ │ │ +usr/share/doc/libdune-common-doc/doxygen/a00119.html │ │ │ │ +usr/share/doc/libdune-common-doc/doxygen/a00119_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00122.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00122_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00125.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00125_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00128.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00128_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00131.html │ │ │ │ @@ -119,20 +121,21 @@ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00158.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00158_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00161.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00161_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00164.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00164_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00167.html │ │ │ │ +usr/share/doc/libdune-common-doc/doxygen/a00167_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00170.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00170_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00173.html │ │ │ │ +usr/share/doc/libdune-common-doc/doxygen/a00173_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00176.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00176_source.html │ │ │ │ -usr/share/doc/libdune-common-doc/doxygen/a00179.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00182.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00182_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00185.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00185_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00188.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00188_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00191.html │ │ │ │ @@ -168,18 +171,18 @@ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00236.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00236_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00239.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00239_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00242.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00242_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00245.html │ │ │ │ +usr/share/doc/libdune-common-doc/doxygen/a00245_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00248.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00248_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00251.html │ │ │ │ -usr/share/doc/libdune-common-doc/doxygen/a00251_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00254.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00254_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00257.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00257_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00260.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00260_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00263.html │ │ │ │ @@ -191,39 +194,40 @@ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00272.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00272_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00275.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00275_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00278.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00278_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00281.html │ │ │ │ +usr/share/doc/libdune-common-doc/doxygen/a00281_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00284.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00284_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00287.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00287_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00290.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00290_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00293.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00293_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00296.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00296_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00299.html │ │ │ │ -usr/share/doc/libdune-common-doc/doxygen/a00299_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00302.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00302_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00305.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00305_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00308.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00308_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00311.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00311_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00314.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00314_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00317.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00317_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00320.html │ │ │ │ +usr/share/doc/libdune-common-doc/doxygen/a00320_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00323.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00323_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00326.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00326_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00329.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00329_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00332.html │ │ │ │ @@ -238,15 +242,14 @@ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00347.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00347_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00350.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00350_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00353.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00353_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00356.html │ │ │ │ -usr/share/doc/libdune-common-doc/doxygen/a00356_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00359.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00359_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00362.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00362_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00365.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00365_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00368.html │ │ │ │ @@ -255,37 +258,34 @@ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00371_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00374.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00374_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00377.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00377_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00380.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00383.html │ │ │ │ -usr/share/doc/libdune-common-doc/doxygen/a00383_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00386.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00386_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00389.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00389_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00392.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00392_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00395.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00395_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00398.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00398_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00401.html │ │ │ │ -usr/share/doc/libdune-common-doc/doxygen/a00401_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00404.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00404_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00407.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00407_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00410.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00410_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00413.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00413_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00416.html │ │ │ │ -usr/share/doc/libdune-common-doc/doxygen/a00416_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00419.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00419_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00422.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00422_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00425.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00425_source.html │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00428.html ├── data.tar.xz │ ├── data.tar │ │ ├── file list │ │ │ @@ -26,282 +26,282 @@ │ │ │ -rw-r--r-- 0 root (0) root (0) 2825 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/buildsystem/html/search.html │ │ │ -rw-r--r-- 0 root (0) root (0) 12803 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/buildsystem/html/searchindex.js │ │ │ -rw-r--r-- 0 root (0) root (0) 2433 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/changelog.Debian.gz │ │ │ -rw-r--r-- 0 root (0) root (0) 10768 2024-10-04 18:52:15.000000 ./usr/share/doc/libdune-common-doc/changelog.gz │ │ │ -rw-r--r-- 0 root (0) root (0) 9815 2023-01-12 15:06:30.000000 ./usr/share/doc/libdune-common-doc/copyright │ │ │ drwxr-xr-x 0 root (0) root (0) 0 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/ │ │ │ -rw-r--r-- 0 root (0) root (0) 3044 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00002.html │ │ │ --rw-r--r-- 0 root (0) root (0) 6780 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00008.html │ │ │ --rw-r--r-- 0 root (0) root (0) 8262 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00008_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 39912 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00011.html │ │ │ --rw-r--r-- 0 root (0) root (0) 14840 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00011_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 3817 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00014.html │ │ │ --rw-r--r-- 0 root (0) root (0) 6524 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00014_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 4365 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00017.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5135 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00017_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 6806 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00020.html │ │ │ --rw-r--r-- 0 root (0) root (0) 12869 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00020_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 21234 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00023.html │ │ │ --rw-r--r-- 0 root (0) root (0) 71204 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00023_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 13604 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00026.html │ │ │ --rw-r--r-- 0 root (0) root (0) 28674 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00026_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 7773 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00029.html │ │ │ --rw-r--r-- 0 root (0) root (0) 22676 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00029_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 17881 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00032.html │ │ │ --rw-r--r-- 0 root (0) root (0) 79928 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00032_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 8322 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00035.html │ │ │ --rw-r--r-- 0 root (0) root (0) 40739 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00035_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5048 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00038.html │ │ │ --rw-r--r-- 0 root (0) root (0) 23174 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00038_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 7344 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00041.html │ │ │ --rw-r--r-- 0 root (0) root (0) 18649 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00041_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 7264 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00044.html │ │ │ --rw-r--r-- 0 root (0) root (0) 14137 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00044_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 7355 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00047.html │ │ │ --rw-r--r-- 0 root (0) root (0) 9907 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00047_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 4978 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00050.html │ │ │ --rw-r--r-- 0 root (0) root (0) 14827 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00053.html │ │ │ --rw-r--r-- 0 root (0) root (0) 23435 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00053_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 8438 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00056.html │ │ │ --rw-r--r-- 0 root (0) root (0) 13174 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00059.html │ │ │ --rw-r--r-- 0 root (0) root (0) 35626 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00059_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 12424 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00062.html │ │ │ --rw-r--r-- 0 root (0) root (0) 91584 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00062_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5881 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00065.html │ │ │ --rw-r--r-- 0 root (0) root (0) 13121 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00065_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 13246 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00068.html │ │ │ --rw-r--r-- 0 root (0) root (0) 83988 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00068_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 6400 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00071.html │ │ │ --rw-r--r-- 0 root (0) root (0) 151816 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00071_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5662 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00074.html │ │ │ --rw-r--r-- 0 root (0) root (0) 50072 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00074_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5664 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00077.html │ │ │ --rw-r--r-- 0 root (0) root (0) 39917 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00077_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5660 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00080.html │ │ │ --rw-r--r-- 0 root (0) root (0) 39763 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00080_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 6381 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00083.html │ │ │ --rw-r--r-- 0 root (0) root (0) 10393 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00083_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 4899 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00086.html │ │ │ --rw-r--r-- 0 root (0) root (0) 13459 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00086_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5441 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00089.html │ │ │ --rw-r--r-- 0 root (0) root (0) 9255 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00089_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 6997 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00092.html │ │ │ --rw-r--r-- 0 root (0) root (0) 54427 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00092_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5397 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00095.html │ │ │ --rw-r--r-- 0 root (0) root (0) 14949 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00095_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 7918 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00098.html │ │ │ --rw-r--r-- 0 root (0) root (0) 127860 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00098_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5274 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00101.html │ │ │ --rw-r--r-- 0 root (0) root (0) 11329 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00101_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 33482 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00104.html │ │ │ --rw-r--r-- 0 root (0) root (0) 357624 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00104_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 13870 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00107.html │ │ │ --rw-r--r-- 0 root (0) root (0) 20197 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00107_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 14004 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00110.html │ │ │ --rw-r--r-- 0 root (0) root (0) 86151 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00110_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 81299 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00113.html │ │ │ --rw-r--r-- 0 root (0) root (0) 145525 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00113_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 9860 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00116.html │ │ │ --rw-r--r-- 0 root (0) root (0) 20795 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00116_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 24038 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00122.html │ │ │ --rw-r--r-- 0 root (0) root (0) 42062 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00122_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 6712 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00125.html │ │ │ --rw-r--r-- 0 root (0) root (0) 11002 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00125_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 7782 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00128.html │ │ │ --rw-r--r-- 0 root (0) root (0) 12395 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00128_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5124 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00131.html │ │ │ --rw-r--r-- 0 root (0) root (0) 29705 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00131_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5346 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00134.html │ │ │ --rw-r--r-- 0 root (0) root (0) 33491 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00134_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 6818 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00137.html │ │ │ --rw-r--r-- 0 root (0) root (0) 100135 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00137_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 8689 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00140.html │ │ │ --rw-r--r-- 0 root (0) root (0) 15574 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00140_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 21360 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00143.html │ │ │ --rw-r--r-- 0 root (0) root (0) 122172 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00143_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 3371 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00146.html │ │ │ --rw-r--r-- 0 root (0) root (0) 88030 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00146_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5766 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00149.html │ │ │ --rw-r--r-- 0 root (0) root (0) 16720 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00149_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 11653 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00152.html │ │ │ --rw-r--r-- 0 root (0) root (0) 55283 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00152_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5602 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00155.html │ │ │ --rw-r--r-- 0 root (0) root (0) 9345 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00155_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5324 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00158.html │ │ │ --rw-r--r-- 0 root (0) root (0) 10218 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00158_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 13584 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00161.html │ │ │ --rw-r--r-- 0 root (0) root (0) 94213 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00161_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 8835 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00164.html │ │ │ --rw-r--r-- 0 root (0) root (0) 10531 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00164_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 9164 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00167.html │ │ │ --rw-r--r-- 0 root (0) root (0) 6555 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00170.html │ │ │ --rw-r--r-- 0 root (0) root (0) 18101 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00170_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 3948 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00173.html │ │ │ --rw-r--r-- 0 root (0) root (0) 8169 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00176.html │ │ │ --rw-r--r-- 0 root (0) root (0) 63827 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00176_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 3898 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00179.html │ │ │ --rw-r--r-- 0 root (0) root (0) 4992 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00182.html │ │ │ --rw-r--r-- 0 root (0) root (0) 31443 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00182_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 7591 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00185.html │ │ │ --rw-r--r-- 0 root (0) root (0) 138694 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00185_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 6676 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00188.html │ │ │ --rw-r--r-- 0 root (0) root (0) 58446 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00188_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 11466 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00191.html │ │ │ --rw-r--r-- 0 root (0) root (0) 291478 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00191_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 9111 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00194.html │ │ │ --rw-r--r-- 0 root (0) root (0) 53122 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00194_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 3471 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00197.html │ │ │ --rw-r--r-- 0 root (0) root (0) 10170 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00197_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5637 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00200.html │ │ │ --rw-r--r-- 0 root (0) root (0) 33707 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00200_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 6031 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00203.html │ │ │ --rw-r--r-- 0 root (0) root (0) 51849 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00203_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 8504 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00206.html │ │ │ --rw-r--r-- 0 root (0) root (0) 45745 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00206_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 6490 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00209.html │ │ │ --rw-r--r-- 0 root (0) root (0) 34021 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00209_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 6914 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00212.html │ │ │ --rw-r--r-- 0 root (0) root (0) 47730 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00212_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 7456 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00215.html │ │ │ --rw-r--r-- 0 root (0) root (0) 33695 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00215_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 11615 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00218.html │ │ │ --rw-r--r-- 0 root (0) root (0) 103142 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00218_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 3657 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00221.html │ │ │ --rw-r--r-- 0 root (0) root (0) 4978 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00221_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 6611 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00224.html │ │ │ --rw-r--r-- 0 root (0) root (0) 19944 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00224_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 13224 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00227.html │ │ │ --rw-r--r-- 0 root (0) root (0) 179116 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00227_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 19994 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00230.html │ │ │ --rw-r--r-- 0 root (0) root (0) 180715 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00230_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 6822 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00233.html │ │ │ --rw-r--r-- 0 root (0) root (0) 40313 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00233_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 9140 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00236.html │ │ │ --rw-r--r-- 0 root (0) root (0) 173678 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00236_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 8765 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00239.html │ │ │ --rw-r--r-- 0 root (0) root (0) 72000 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00239_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 3648 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00242.html │ │ │ --rw-r--r-- 0 root (0) root (0) 4981 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00242_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 23464 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00245.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5979 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00248.html │ │ │ --rw-r--r-- 0 root (0) root (0) 21113 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00248_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 3365 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00251.html │ │ │ --rw-r--r-- 0 root (0) root (0) 10369 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00251_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 4958 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00254.html │ │ │ --rw-r--r-- 0 root (0) root (0) 6603 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00254_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 4309 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00257.html │ │ │ --rw-r--r-- 0 root (0) root (0) 17896 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00257_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 26302 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00260.html │ │ │ --rw-r--r-- 0 root (0) root (0) 62033 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00260_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 7493 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00263.html │ │ │ --rw-r--r-- 0 root (0) root (0) 31465 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00263_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5355 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00266.html │ │ │ --rw-r--r-- 0 root (0) root (0) 41537 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00266_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5621 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00269.html │ │ │ --rw-r--r-- 0 root (0) root (0) 7109 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00269_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 4767 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00272.html │ │ │ --rw-r--r-- 0 root (0) root (0) 14347 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00272_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 30299 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00275.html │ │ │ --rw-r--r-- 0 root (0) root (0) 192703 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00275_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5246 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00278.html │ │ │ --rw-r--r-- 0 root (0) root (0) 9924 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00278_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 4124 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00281.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5081 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00284.html │ │ │ --rw-r--r-- 0 root (0) root (0) 7897 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00284_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 22052 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00287.html │ │ │ --rw-r--r-- 0 root (0) root (0) 46229 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00287_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 24240 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00290.html │ │ │ --rw-r--r-- 0 root (0) root (0) 39035 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00290_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5059 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00293.html │ │ │ --rw-r--r-- 0 root (0) root (0) 23627 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00293_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 6157 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00296.html │ │ │ --rw-r--r-- 0 root (0) root (0) 19958 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00296_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 20534 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00299.html │ │ │ --rw-r--r-- 0 root (0) root (0) 80039 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00299_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 17515 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00302.html │ │ │ --rw-r--r-- 0 root (0) root (0) 45457 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00302_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 7123 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00305.html │ │ │ --rw-r--r-- 0 root (0) root (0) 23204 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00305_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 8193 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00308.html │ │ │ --rw-r--r-- 0 root (0) root (0) 41652 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00308_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 12793 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00311.html │ │ │ --rw-r--r-- 0 root (0) root (0) 124302 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00311_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 6186 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00314.html │ │ │ --rw-r--r-- 0 root (0) root (0) 17740 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00314_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 10744 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00317.html │ │ │ --rw-r--r-- 0 root (0) root (0) 109175 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00317_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 4910 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00320.html │ │ │ --rw-r--r-- 0 root (0) root (0) 17901 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00323.html │ │ │ --rw-r--r-- 0 root (0) root (0) 167128 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00323_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 16770 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00326.html │ │ │ --rw-r--r-- 0 root (0) root (0) 48541 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00326_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 24717 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00329.html │ │ │ --rw-r--r-- 0 root (0) root (0) 122775 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00329_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5604 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00332.html │ │ │ --rw-r--r-- 0 root (0) root (0) 9237 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00332_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 10990 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00335.html │ │ │ --rw-r--r-- 0 root (0) root (0) 22882 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00335_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 4127 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00338.html │ │ │ --rw-r--r-- 0 root (0) root (0) 10468 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00341.html │ │ │ --rw-r--r-- 0 root (0) root (0) 33173 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00341_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 6661 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00344.html │ │ │ --rw-r--r-- 0 root (0) root (0) 52850 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00344_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 6286 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00347.html │ │ │ --rw-r--r-- 0 root (0) root (0) 21544 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00347_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 6585 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00350.html │ │ │ --rw-r--r-- 0 root (0) root (0) 44036 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00350_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 8833 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00353.html │ │ │ --rw-r--r-- 0 root (0) root (0) 15784 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00353_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5653 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00356.html │ │ │ --rw-r--r-- 0 root (0) root (0) 7232 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00356_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 9498 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00359.html │ │ │ --rw-r--r-- 0 root (0) root (0) 250587 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00359_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5114 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00362.html │ │ │ --rw-r--r-- 0 root (0) root (0) 9510 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00362_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 7194 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00365.html │ │ │ --rw-r--r-- 0 root (0) root (0) 151467 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00365_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 9720 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00368.html │ │ │ --rw-r--r-- 0 root (0) root (0) 240953 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00368_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 8730 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00371.html │ │ │ --rw-r--r-- 0 root (0) root (0) 61448 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00371_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 3383 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00374.html │ │ │ --rw-r--r-- 0 root (0) root (0) 51919 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00374_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 60433 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00377.html │ │ │ --rw-r--r-- 0 root (0) root (0) 122588 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00377_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 9720 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00008.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 240953 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00008_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 4124 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00011.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5881 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00014.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 13121 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00014_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 13246 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00017.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 83988 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00017_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5397 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00020.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 14949 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00020_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 6997 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00023.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 54427 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00023_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5664 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00026.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 39917 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00026_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 12424 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00029.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 91584 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00029_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5662 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00032.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 50072 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00032_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 6381 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00035.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 10393 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00035_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 4899 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00038.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 13459 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00038_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 6400 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00041.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 151816 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00041_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 13174 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00044.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 35626 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00044_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5660 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00047.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 39763 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00047_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5441 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00050.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 9255 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00050_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 4958 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00053.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 6603 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00053_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 13584 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00056.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 94213 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00056_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 7773 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00059.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 22676 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00059_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 14994 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00062.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 142940 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00062_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 4654 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00065.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 7264 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00065_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5325 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00068.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 22981 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00068_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 4365 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00071.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5135 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00071_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5114 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00074.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 9510 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00074_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 6818 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00077.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 100135 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00077_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 6780 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00080.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 8262 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00080_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 8835 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00083.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 10531 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00083_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 17515 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00086.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 45457 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00086_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 30299 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00089.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 192703 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00089_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5048 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00092.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 23174 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00092_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 14004 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00095.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 86151 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00095_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 11653 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00098.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 55283 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00098_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 7194 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00101.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 151467 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00101_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 7344 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00104.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 18649 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00104_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 3948 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00107.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5604 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00110.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 9237 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00110_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5324 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00113.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 10218 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00113_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5124 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00116.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 29705 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00116_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5621 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00119.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 7109 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00119_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 7264 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00122.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 14137 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00122_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 6661 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00125.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 52850 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00125_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 8169 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00128.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 63827 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00128_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 8195 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00131.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 144459 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00131_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 22052 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00134.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 46229 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00134_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5246 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00137.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 9924 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00137_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 14429 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00140.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 51306 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00140_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 21234 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00143.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 71204 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00143_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5653 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00146.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 7232 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00146_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 3365 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00149.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 10369 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00149_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 8322 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00152.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 40739 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00152_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 6383 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00155.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 16095 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00155_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 6855 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00158.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 112076 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00158_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 9860 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00161.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 20795 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00161_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 6712 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00164.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 11002 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00164_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 24038 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00167.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 42062 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00167_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 3817 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00170.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 6524 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00170_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 33482 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00173.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 357624 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00173_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 81299 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00176.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 145525 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00176_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 13870 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00182.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 20197 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00182_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 24240 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00185.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 39035 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00185_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 6555 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00188.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 18101 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00188_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 6157 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00191.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 19958 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00191_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 6585 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00194.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 44036 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00194_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 21360 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00197.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 122172 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00197_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 9498 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00200.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 250587 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00200_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 14827 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00203.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 23435 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00203_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 10744 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00206.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 109175 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00206_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 4992 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00209.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 31443 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00209_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 7123 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00212.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 23204 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00212_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 7493 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00215.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 31465 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00215_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5979 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00218.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 21113 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00218_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 4393 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00221.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 7511 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00221_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 17881 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00224.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 79928 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00224_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 7782 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00227.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 12395 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00227_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5274 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00230.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 11329 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00230_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5081 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00233.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 7897 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00233_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5059 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00236.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 23627 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00236_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 8730 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00239.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 61448 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00239_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 24717 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00242.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 122775 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00242_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 16770 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00245.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 48541 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00245_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 4767 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00248.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 14347 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00248_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 8438 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00251.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 39912 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00254.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 14840 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00254_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5213 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00257.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 15231 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00257_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 3371 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00260.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 88030 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00260_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 6186 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00263.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 17740 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00263_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 8193 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00266.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 41652 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00266_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 17901 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00269.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 167128 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00269_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 3371 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00272.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 7706 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00272_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5637 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00275.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 33707 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00275_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 8765 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00278.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 72000 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00278_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 6822 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00281.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 40313 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00281_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 6490 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00284.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 34021 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00284_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 3657 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00287.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 4978 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00287_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 6611 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00290.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 19944 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00290_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 9111 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00293.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 53122 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00293_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 9140 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00296.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 173678 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00296_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 23464 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00299.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 6914 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00302.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 47730 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00302_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 7591 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00305.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 138694 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00305_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 6031 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00308.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 51849 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00308_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 7456 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00311.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 33695 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00311_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 13224 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00314.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 179116 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00314_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 3648 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00317.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 4981 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00317_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 19994 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00320.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 180715 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00320_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 6676 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00323.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 58446 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00323_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 8504 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00326.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 45745 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00326_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 11466 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00329.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 291478 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00329_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 3471 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00332.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 10170 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00332_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 11615 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00335.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 103142 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00335_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 9164 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00338.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5042 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00341.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 6949 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00341_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 20534 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00344.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 80039 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00344_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 8689 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00347.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 15574 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00347_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 3383 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00350.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 51919 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00350_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 7355 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00353.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 9907 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00353_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 4978 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00356.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5355 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00359.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 41537 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00359_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 26302 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00362.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 62033 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00362_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 13604 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00365.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 28674 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00365_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 60433 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00368.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 122588 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00368_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 6806 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00371.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 12869 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00371_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 7918 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00374.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 127860 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00374_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5602 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00377.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 9345 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00377_source.html │ │ │ -rw-r--r-- 0 root (0) root (0) 6924 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00380.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5204 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00383.html │ │ │ --rw-r--r-- 0 root (0) root (0) 29990 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00383_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5042 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00386.html │ │ │ --rw-r--r-- 0 root (0) root (0) 6949 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00386_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 3471 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00389.html │ │ │ --rw-r--r-- 0 root (0) root (0) 9186 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00389_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 3473 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00392.html │ │ │ --rw-r--r-- 0 root (0) root (0) 14821 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00392_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 3371 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00395.html │ │ │ --rw-r--r-- 0 root (0) root (0) 7706 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00395_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 14429 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00398.html │ │ │ --rw-r--r-- 0 root (0) root (0) 51306 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00398_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 6383 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00401.html │ │ │ --rw-r--r-- 0 root (0) root (0) 16095 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00401_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 4654 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00404.html │ │ │ --rw-r--r-- 0 root (0) root (0) 7264 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00404_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 8195 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00407.html │ │ │ --rw-r--r-- 0 root (0) root (0) 144459 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00407_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5213 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00410.html │ │ │ --rw-r--r-- 0 root (0) root (0) 15231 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00410_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 14994 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00413.html │ │ │ --rw-r--r-- 0 root (0) root (0) 142940 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00413_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 7720 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00416.html │ │ │ --rw-r--r-- 0 root (0) root (0) 10467 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00416_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 4393 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00419.html │ │ │ --rw-r--r-- 0 root (0) root (0) 7511 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00419_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 6855 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00422.html │ │ │ --rw-r--r-- 0 root (0) root (0) 112076 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00422_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5325 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00425.html │ │ │ --rw-r--r-- 0 root (0) root (0) 22981 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00425_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 4127 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00383.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 6286 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00386.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 21544 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00386_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 8833 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00389.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 15784 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00389_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 4309 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00392.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 17896 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00392_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 3471 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00395.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 9186 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00395_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 3473 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00398.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 14821 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00398_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 4910 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00401.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5204 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00404.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 29990 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00404_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 10468 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00407.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 33173 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00407_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 12793 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00410.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 124302 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00410_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 10990 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00413.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 22882 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00413_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 3898 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00416.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5766 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00419.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 16720 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00419_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 7720 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00422.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 10467 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00422_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5346 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00425.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 33491 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00425_source.html │ │ │ -rw-r--r-- 0 root (0) root (0) 5173 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00428.html │ │ │ -rw-r--r-- 0 root (0) root (0) 49335 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00428_source.html │ │ │ -rw-r--r-- 0 root (0) root (0) 7896 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00431.html │ │ │ -rw-r--r-- 0 root (0) root (0) 5292 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00432.html │ │ │ -rw-r--r-- 0 root (0) root (0) 262467 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00433.html │ │ │ -rw-r--r-- 0 root (0) root (0) 27946 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00433.png │ │ │ -rw-r--r-- 0 root (0) root (0) 39664 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00434.html │ │ │ @@ -1145,20 +1145,20 @@ │ │ │ -rw-r--r-- 0 root (0) root (0) 3701 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a03341.html │ │ │ -rw-r--r-- 0 root (0) root (0) 5804 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a03344.html │ │ │ -rw-r--r-- 0 root (0) root (0) 9948 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a03345.html │ │ │ -rw-r--r-- 0 root (0) root (0) 49073 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a03348.html │ │ │ -rw-r--r-- 0 root (0) root (0) 3215 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a04592.html │ │ │ -rw-r--r-- 0 root (0) root (0) 3042 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a04594.html │ │ │ -rw-r--r-- 0 root (0) root (0) 3042 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a04597.html │ │ │ --rw-r--r-- 0 root (0) root (0) 8165 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a04600.html │ │ │ --rw-r--r-- 0 root (0) root (0) 81796 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a04600_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 23574 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a04603.html │ │ │ --rw-r--r-- 0 root (0) root (0) 44261 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a04603_source.html │ │ │ --rw-r--r-- 0 root (0) root (0) 4102 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a04606.html │ │ │ --rw-r--r-- 0 root (0) root (0) 5555 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a04606_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 4102 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a04600.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 5555 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a04600_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 8165 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a04603.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 81796 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a04603_source.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 23574 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a04606.html │ │ │ +-rw-r--r-- 0 root (0) root (0) 44261 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a04606_source.html │ │ │ -rw-r--r-- 0 root (0) root (0) 48344 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a04609.html │ │ │ -rw-r--r-- 0 root (0) root (0) 136622 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/a04609_source.html │ │ │ -rw-r--r-- 0 root (0) root (0) 133563 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/annotated.html │ │ │ -rw-r--r-- 0 root (0) root (0) 676 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/bc_s.png │ │ │ -rw-r--r-- 0 root (0) root (0) 635 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/bc_sd.png │ │ │ -rw-r--r-- 0 root (0) root (0) 49857 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/classes.html │ │ │ -rw-r--r-- 0 root (0) root (0) 132 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/closed.png │ │ │ @@ -1185,15 +1185,15 @@ │ │ │ -rw-r--r-- 0 root (0) root (0) 2402 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_be46aaae597ce098e36afa8d6ef4f49b_dep.png │ │ │ -rw-r--r-- 0 root (0) root (0) 4890 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_cf308425303dd5c426fac7b7f2967d96.html │ │ │ -rw-r--r-- 0 root (0) root (0) 1621 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_cf308425303dd5c426fac7b7f2967d96_dep.png │ │ │ -rw-r--r-- 0 root (0) root (0) 49658 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_e151556194dc695299293609645e9437.html │ │ │ -rw-r--r-- 0 root (0) root (0) 11161 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_e151556194dc695299293609645e9437_dep.png │ │ │ -rw-r--r-- 0 root (0) root (0) 3668 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_e68e8157741866f444e17edd764ebbae.html │ │ │ -rw-r--r-- 0 root (0) root (0) 45631 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/doxygen.css │ │ │ --rw-r--r-- 0 root (0) root (0) 165823 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/dune-common.tag.gz │ │ │ +-rw-r--r-- 0 root (0) root (0) 165855 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/dune-common.tag.gz │ │ │ -rw-r--r-- 0 root (0) root (0) 7704 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/dynsections.js │ │ │ -rw-r--r-- 0 root (0) root (0) 56072 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/files.html │ │ │ -rw-r--r-- 0 root (0) root (0) 1145 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/form_0.png │ │ │ -rw-r--r-- 0 root (0) root (0) 1167 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/form_0_dark.png │ │ │ -rw-r--r-- 0 root (0) root (0) 1153 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/form_1.png │ │ │ -rw-r--r-- 0 root (0) root (0) 403 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/form_10.png │ │ │ -rw-r--r-- 0 root (0) root (0) 422 2024-11-22 14:28:16.000000 ./usr/share/doc/libdune-common-doc/doxygen/form_10_dark.png │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00008.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: visibility.hh File Reference │ │ │ +dune-common: densematrix.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,70 +70,73 @@ │ │ │ │ │ │ │ │ │
│ │ │
│ │ │ -Macros
│ │ │ -
visibility.hh File Reference
│ │ │ +Classes | │ │ │ +Namespaces | │ │ │ +Functions
│ │ │ +
densematrix.hh File Reference
│ │ │ │ │ │
│ │ │ │ │ │ -

Definition of macros controlling symbol visibility at the ABI level. │ │ │ +

Implements a matrix constructed from a given type representing a field and a compile-time given number of rows and columns. │ │ │ More...

│ │ │ - │ │ │ +
#include <cmath>
│ │ │ +#include <cstddef>
│ │ │ +#include <iostream>
│ │ │ +#include <type_traits>
│ │ │ +#include <utility>
│ │ │ +#include <vector>
│ │ │ +#include <dune/common/boundschecking.hh>
│ │ │ +#include <dune/common/classname.hh>
│ │ │ +#include <dune/common/exceptions.hh>
│ │ │ +#include <dune/common/fvector.hh>
│ │ │ +#include <dune/common/math.hh>
│ │ │ +#include <dune/common/precision.hh>
│ │ │ +#include <dune/common/simd/simd.hh>
│ │ │ +#include <dune/common/typetraits.hh>
│ │ │ +#include <dune/common/scalarvectorview.hh>
│ │ │ +
│ │ │

Go to the source code of this file.

│ │ │ │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +

│ │ │ -Macros

#define DUNE_EXPORT   implementation_defined
 Export a symbol as part of the public ABI.
 
#define DUNE_PRIVATE   implementation_defined
 Mark a symbol as being for internal use within the current DSO only.
 

│ │ │ +Classes

struct  Dune::FieldTraits< DenseMatrix< M > >
 
class  Dune::FMatrixError
 Error thrown if operations of a FieldMatrix fail. More...
 
class  Dune::DenseMatrix< MAT >
 A dense n x m matrix. More...
 
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +

│ │ │ +Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::DenseMatrixHelp
 
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │

│ │ │ +Functions

template<typename MAT , typename V1 , typename V2 >
static void Dune::DenseMatrixHelp::multAssign (const DenseMatrix< MAT > &matrix, const DenseVector< V1 > &x, DenseVector< V2 > &ret)
 calculates ret = matrix * x
 
template<typename MAT >
std::ostream & Dune::operator<< (std::ostream &s, const DenseMatrix< MAT > &a)
 Sends the matrix to an output stream.
 
│ │ │

Detailed Description

│ │ │ -

Definition of macros controlling symbol visibility at the ABI level.

│ │ │ -

Macro Definition Documentation

│ │ │ - │ │ │ -

◆ DUNE_EXPORT

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
#define DUNE_EXPORT   implementation_defined
│ │ │ -
│ │ │ - │ │ │ -

Export a symbol as part of the public ABI.

│ │ │ -

Mark a class, function or static variable as visible outside the current DSO. For now, this is mostly important for templated global variables and functions that contain static variables.

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ -

◆ DUNE_PRIVATE

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
#define DUNE_PRIVATE   implementation_defined
│ │ │ -
│ │ │ - │ │ │ -

Mark a symbol as being for internal use within the current DSO only.

│ │ │ -

Mark a class, function or static variable as inaccessible from outside the current DSO. Doing so will decrease the size of the symbol table, but you have to be sure that the symbol will never have to be accessed from another library or the main executable!

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ -
│ │ │ +

Implements a matrix constructed from a given type representing a field and a compile-time given number of rows and columns.

│ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,35 +1,57 @@ │ │ │ │ dune-common 2.10 │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ * _d_u_n_e │ │ │ │ * _c_o_m_m_o_n │ │ │ │ -_M_a_c_r_o_s │ │ │ │ -visibility.hh File Reference │ │ │ │ -Definition of macros controlling symbol visibility at the ABI level. _M_o_r_e_._._. │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ +densematrix.hh File Reference │ │ │ │ +_C_o_m_m_o_n » _D_e_n_s_e_ _M_a_t_r_i_x_ _a_n_d_ _V_e_c_t_o_r_ _T_e_m_p_l_a_t_e_ _L_i_b_r_a_r_y │ │ │ │ +Implements a matrix constructed from a given type representing a field and a │ │ │ │ +compile-time given number of rows and columns. _M_o_r_e_._._. │ │ │ │ +#include │ │ │ │ +#include │ │ │ │ +#include │ │ │ │ +#include │ │ │ │ +#include │ │ │ │ +#include │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_b_o_u_n_d_s_c_h_e_c_k_i_n_g_._h_h> │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_c_l_a_s_s_n_a_m_e_._h_h> │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_f_v_e_c_t_o_r_._h_h> │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_m_a_t_h_._h_h> │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_r_e_c_i_s_i_o_n_._h_h> │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_i_m_d_/_s_i_m_d_._h_h> │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_c_a_l_a_r_v_e_c_t_o_r_v_i_e_w_._h_h> │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ -MMaaccrrooss │ │ │ │ -#define  _D_U_N_E___E_X_P_O_R_T   implementation_defined │ │ │ │ -  Export a symbol as part of the public ABI. │ │ │ │ +CCllaasssseess │ │ │ │ +struct   _D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _D_e_n_s_e_M_a_t_r_i_x_<_ _M_ _>_ _> │ │ │ │   │ │ │ │ -#define  _D_U_N_E___P_R_I_V_A_T_E   implementation_defined │ │ │ │ -  Mark a symbol as being for internal use within the current DSO only. │ │ │ │ + class   _D_u_n_e_:_:_F_M_a_t_r_i_x_E_r_r_o_r │ │ │ │ +  Error thrown if operations of a _F_i_e_l_d_M_a_t_r_i_x fail. _M_o_r_e_._._. │ │ │ │ +  │ │ │ │ + class   _D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_<_ _M_A_T_ _> │ │ │ │ +  A dense n x m matrix. _M_o_r_e_._._. │ │ │ │ +  │ │ │ │ +NNaammeessppaacceess │ │ │ │ +namespace   _D_u_n_e │ │ │ │ +  _D_u_n_e namespace. │ │ │ │ +  │ │ │ │ +namespace   _D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_H_e_l_p │ │ │ │ +  │ │ │ │ +FFuunnccttiioonnss │ │ │ │ +template │ │ │ │ + static void  _D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_H_e_l_p_:_:_m_u_l_t_A_s_s_i_g_n (const _D_e_n_s_e_M_a_t_r_i_x< MAT > │ │ │ │ + &matrix, const _D_e_n_s_e_V_e_c_t_o_r< V1 > &x, _D_e_n_s_e_V_e_c_t_o_r< V2 > &ret) │ │ │ │ +  calculates ret = matrix * x │ │ │ │ +  │ │ │ │ +template │ │ │ │ +std::ostream &  _D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< (std::ostream &s, const _D_e_n_s_e_M_a_t_r_i_x< MAT > &a) │ │ │ │ +  Sends the matrix to an output stream. │ │ │ │   │ │ │ │ ********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ -Definition of macros controlling symbol visibility at the ABI level. │ │ │ │ -********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ -********** _?◆_? DDUUNNEE__EEXXPPOORRTT ********** │ │ │ │ -#define DUNE_EXPORT   implementation_defined │ │ │ │ -Export a symbol as part of the public ABI. │ │ │ │ -Mark a class, function or static variable as visible outside the current DSO. │ │ │ │ -For now, this is mostly important for templated global variables and functions │ │ │ │ -that contain static variables. │ │ │ │ -********** _?◆_? DDUUNNEE__PPRRIIVVAATTEE ********** │ │ │ │ -#define DUNE_PRIVATE   implementation_defined │ │ │ │ -Mark a symbol as being for internal use within the current DSO only. │ │ │ │ -Mark a class, function or static variable as inaccessible from outside the │ │ │ │ -current DSO. Doing so will decrease the size of the symbol table, but you have │ │ │ │ -to be sure that the symbol will never have to be accessed from another library │ │ │ │ -or the main executable! │ │ │ │ +Implements a matrix constructed from a given type representing a field and a │ │ │ │ +compile-time given number of rows and columns. │ │ │ │ =============================================================================== │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00008_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: visibility.hh Source File │ │ │ +dune-common: densematrix.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -74,48 +74,1304 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
visibility.hh
│ │ │ +
densematrix.hh
│ │ │
│ │ │
│ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │
3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
│ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ -
5#ifndef DUNE_COMMON_VISIBILITY_HH
│ │ │ -
6#define DUNE_COMMON_VISIBILITY_HH
│ │ │ +
5#ifndef DUNE_DENSEMATRIX_HH
│ │ │ +
6#define DUNE_DENSEMATRIX_HH
│ │ │
7
│ │ │ -
12#ifdef DOXYGEN
│ │ │ -
13
│ │ │ -
15
│ │ │ -
20#define DUNE_EXPORT implementation_defined
│ │ │ -
21
│ │ │ -
23
│ │ │ -
28#define DUNE_PRIVATE implementation_defined
│ │ │ +
8#include <cmath>
│ │ │ +
9#include <cstddef>
│ │ │ +
10#include <iostream>
│ │ │ +
11#include <type_traits>
│ │ │ +
12#include <utility>
│ │ │ +
13#include <vector>
│ │ │ +
14
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
19#include <dune/common/math.hh>
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
24
│ │ │ +
25namespace Dune
│ │ │ +
26{
│ │ │ +
27
│ │ │ +
28 template<typename M> class DenseMatrix;
│ │ │
29
│ │ │ -
30#else // DOXYGEN
│ │ │ -
31
│ │ │ -
32#if __GNUC__ >= 4
│ │ │ -
33// GCC and Clang both define __GNUC__ to 4 and they both support the visibility
│ │ │ -
34// attribute
│ │ │ -
35#define DUNE_EXPORT __attribute__((visibility("default")))
│ │ │ -
36#define DUNE_PRIVATE __attribute__((visibility("hidden")))
│ │ │ -
37#else
│ │ │ -
38// We don't know about the active compiler, so just turn the visibility macros to no-ops.
│ │ │ -
39#define DUNE_EXPORT
│ │ │ -
40#define DUNE_PRIVATE
│ │ │ -
41#endif
│ │ │ -
42
│ │ │ -
43#endif // DOXYGEN
│ │ │ -
44
│ │ │ -
45#endif // DUNE_COMMON_VISIBILITY
│ │ │ +
30 template<typename M>
│ │ │ +
│ │ │ + │ │ │ +
32 {
│ │ │ + │ │ │ + │ │ │ +
35 };
│ │ │ +
│ │ │ +
36
│ │ │ +
37 template<class K, int N, int M> class FieldMatrix;
│ │ │ +
38 template<class K, int N> class FieldVector;
│ │ │ +
39
│ │ │ +
58 template< class DenseMatrix, class RHS >
│ │ │ + │ │ │ +
60
│ │ │ +
61#ifndef DOXYGEN
│ │ │ +
62 namespace Impl
│ │ │ +
63 {
│ │ │ +
64
│ │ │ +
65 template< class DenseMatrix, class RHS, class = void >
│ │ │ + │ │ │ +
67 {};
│ │ │ +
68
│ │ │ +
69 template< class DenseMatrix, class RHS >
│ │ │ +
70 class DenseMatrixAssigner< DenseMatrix, RHS, std::enable_if_t< Dune::IsNumber< RHS >::value > >
│ │ │ +
71 {
│ │ │ +
72 public:
│ │ │ +
73 static void apply ( DenseMatrix &denseMatrix, const RHS &rhs )
│ │ │ +
74 {
│ │ │ +
75 typedef typename DenseMatrix::field_type field_type;
│ │ │ +
76 std::fill( denseMatrix.begin(), denseMatrix.end(), static_cast< field_type >( rhs ) );
│ │ │ +
77 }
│ │ │ +
78 };
│ │ │ +
79
│ │ │ +
80 template< class DenseMatrix, class RHS >
│ │ │ +
81 class DenseMatrixAssigner< DenseMatrix, RHS, std::enable_if_t< !std::is_same< typename RHS::const_iterator, void >::value
│ │ │ +
82 && std::is_convertible< typename RHS::const_iterator::value_type, typename DenseMatrix::iterator::value_type >::value > >
│ │ │ +
83 {
│ │ │ +
84 public:
│ │ │ +
85 static void apply ( DenseMatrix &denseMatrix, const RHS &rhs )
│ │ │ +
86 {
│ │ │ +
87 DUNE_ASSERT_BOUNDS(rhs.N() == denseMatrix.N());
│ │ │ +
88 DUNE_ASSERT_BOUNDS(rhs.M() == denseMatrix.M());
│ │ │ +
89 typename DenseMatrix::iterator tIt = std::begin(denseMatrix);
│ │ │ +
90 typename RHS::const_iterator sIt = std::begin(rhs);
│ │ │ +
91 for(; sIt != std::end(rhs); ++tIt, ++sIt)
│ │ │ +
92 std::copy(std::begin(*sIt), std::end(*sIt), std::begin(*tIt));
│ │ │ +
93 }
│ │ │ +
94 };
│ │ │ +
95
│ │ │ +
96 } // namespace Impl
│ │ │ +
97
│ │ │ +
98
│ │ │ +
99
│ │ │ +
100 template< class DenseMatrix, class RHS >
│ │ │ +
101 struct DenseMatrixAssigner
│ │ │ +
102 : public Impl::DenseMatrixAssigner< DenseMatrix, RHS >
│ │ │ +
103 {};
│ │ │ +
104
│ │ │ +
105
│ │ │ +
106 namespace Impl
│ │ │ +
107 {
│ │ │ +
108
│ │ │ +
109 template< class DenseMatrix, class RHS >
│ │ │ +
110 std::true_type hasDenseMatrixAssigner ( DenseMatrix &, const RHS &, decltype( Dune::DenseMatrixAssigner< DenseMatrix, RHS >::apply( std::declval< DenseMatrix & >(), std::declval< const RHS & >() ) ) * = nullptr );
│ │ │ +
111
│ │ │ +
112 std::false_type hasDenseMatrixAssigner ( ... );
│ │ │ +
113
│ │ │ +
114 } // namespace Impl
│ │ │ +
115
│ │ │ +
116 template< class DenseMatrix, class RHS >
│ │ │ +
117 struct HasDenseMatrixAssigner
│ │ │ +
118 : public decltype( Impl::hasDenseMatrixAssigner( std::declval< DenseMatrix & >(), std::declval< const RHS & >() ) )
│ │ │ +
119 {};
│ │ │ +
120
│ │ │ +
121#endif // #ifndef DOXYGEN
│ │ │ +
122
│ │ │ +
123
│ │ │ +
124
│ │ │ +
126 class FMatrixError : public MathError {};
│ │ │ +
127
│ │ │ +
138 template<typename MAT>
│ │ │ +
│ │ │ + │ │ │ +
140 {
│ │ │ + │ │ │ +
142
│ │ │ +
143 // Curiously recurring template pattern
│ │ │ +
144 constexpr MAT & asImp() { return static_cast<MAT&>(*this); }
│ │ │ +
145 constexpr const MAT & asImp() const { return static_cast<const MAT&>(*this); }
│ │ │ +
146
│ │ │ +
147 template <class>
│ │ │ +
148 friend class DenseMatrix;
│ │ │ +
149
│ │ │ +
150 public:
│ │ │ +
151 //===== type definitions and constants
│ │ │ +
152
│ │ │ +
154 typedef typename Traits::derived_type derived_type;
│ │ │ +
155
│ │ │ +
157 typedef typename Traits::value_type value_type;
│ │ │ +
158
│ │ │ +
160 typedef typename Traits::value_type field_type;
│ │ │ +
161
│ │ │ +
163 typedef typename Traits::value_type block_type;
│ │ │ +
164
│ │ │ +
166 typedef typename Traits::size_type size_type;
│ │ │ +
167
│ │ │ +
169 typedef typename Traits::row_type row_type;
│ │ │ +
170
│ │ │ +
172 typedef typename Traits::row_reference row_reference;
│ │ │ +
173
│ │ │ +
175 typedef typename Traits::const_row_reference const_row_reference;
│ │ │ +
176
│ │ │ +
178 constexpr static int blocklevel = 1;
│ │ │ +
179
│ │ │ +
180 private:
│ │ │ +
183 using simd_index_type = Simd::Rebind<std::size_t, value_type>;
│ │ │ +
184
│ │ │ +
185 public:
│ │ │ +
186 //===== access to components
│ │ │ +
187
│ │ │ +
│ │ │ + │ │ │ +
190 {
│ │ │ +
191 return asImp().mat_access(i);
│ │ │ +
192 }
│ │ │ +
│ │ │ +
193
│ │ │ +
│ │ │ + │ │ │ +
195 {
│ │ │ +
196 return asImp().mat_access(i);
│ │ │ +
197 }
│ │ │ +
│ │ │ +
198
│ │ │ +
│ │ │ + │ │ │ +
201 {
│ │ │ +
202 return rows();
│ │ │ +
203 }
│ │ │ +
│ │ │ +
204
│ │ │ +
205 //===== iterator interface to rows of the matrix
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
213 typedef typename std::remove_reference<row_reference>::type::Iterator ColIterator;
│ │ │ +
214
│ │ │ +
│ │ │ + │ │ │ +
217 {
│ │ │ +
218 return Iterator(*this,0);
│ │ │ +
219 }
│ │ │ +
│ │ │ +
220
│ │ │ +
│ │ │ + │ │ │ +
223 {
│ │ │ +
224 return Iterator(*this,rows());
│ │ │ +
225 }
│ │ │ +
│ │ │ +
226
│ │ │ +
│ │ │ + │ │ │ +
230 {
│ │ │ +
231 return Iterator(*this,rows()-1);
│ │ │ +
232 }
│ │ │ +
│ │ │ +
233
│ │ │ +
│ │ │ + │ │ │ +
237 {
│ │ │ +
238 return Iterator(*this,-1);
│ │ │ +
239 }
│ │ │ +
│ │ │ +
240
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
248 typedef typename std::remove_reference<const_row_reference>::type::ConstIterator ConstColIterator;
│ │ │ +
249
│ │ │ +
│ │ │ + │ │ │ +
252 {
│ │ │ +
253 return ConstIterator(*this,0);
│ │ │ +
254 }
│ │ │ +
│ │ │ +
255
│ │ │ +
│ │ │ + │ │ │ +
258 {
│ │ │ +
259 return ConstIterator(*this,rows());
│ │ │ +
260 }
│ │ │ +
│ │ │ +
261
│ │ │ +
│ │ │ + │ │ │ +
265 {
│ │ │ +
266 return ConstIterator(*this,rows()-1);
│ │ │ +
267 }
│ │ │ +
│ │ │ +
268
│ │ │ +
│ │ │ + │ │ │ +
272 {
│ │ │ +
273 return ConstIterator(*this,-1);
│ │ │ +
274 }
│ │ │ +
│ │ │ +
275
│ │ │ +
276 //===== assignment
│ │ │ +
277
│ │ │ +
278 template< class RHS, class = std::enable_if_t< HasDenseMatrixAssigner< MAT, RHS >::value > >
│ │ │ +
│ │ │ +
279 derived_type &operator= ( const RHS &rhs )
│ │ │ +
280 {
│ │ │ + │ │ │ +
282 return asImp();
│ │ │ +
283 }
│ │ │ +
│ │ │ +
284
│ │ │ +
285 //===== vector space arithmetic
│ │ │ +
286
│ │ │ +
288 template <class Other>
│ │ │ +
│ │ │ + │ │ │ +
290 {
│ │ │ +
291 DUNE_ASSERT_BOUNDS(rows() == x.rows());
│ │ │ +
292 for (size_type i=0; i<rows(); i++)
│ │ │ +
293 (*this)[i] += x[i];
│ │ │ +
294 return asImp();
│ │ │ +
295 }
│ │ │ +
│ │ │ +
296
│ │ │ +
│ │ │ + │ │ │ +
299 {
│ │ │ +
300 MAT result;
│ │ │ +
301 using idx_type = typename decltype(result)::size_type;
│ │ │ +
302
│ │ │ +
303 for (idx_type i = 0; i < rows(); ++i)
│ │ │ +
304 for (idx_type j = 0; j < cols(); ++j)
│ │ │ +
305 result[i][j] = - asImp()[i][j];
│ │ │ +
306
│ │ │ +
307 return result;
│ │ │ +
308 }
│ │ │ +
│ │ │ +
309
│ │ │ +
311 template <class Other>
│ │ │ +
│ │ │ + │ │ │ +
313 {
│ │ │ +
314 DUNE_ASSERT_BOUNDS(rows() == x.rows());
│ │ │ +
315 for (size_type i=0; i<rows(); i++)
│ │ │ +
316 (*this)[i] -= x[i];
│ │ │ +
317 return asImp();
│ │ │ +
318 }
│ │ │ +
│ │ │ +
319
│ │ │ +
│ │ │ + │ │ │ +
322 {
│ │ │ +
323 for (size_type i=0; i<rows(); i++)
│ │ │ +
324 (*this)[i] *= k;
│ │ │ +
325 return asImp();
│ │ │ +
326 }
│ │ │ +
│ │ │ +
327
│ │ │ +
│ │ │ + │ │ │ +
330 {
│ │ │ +
331 for (size_type i=0; i<rows(); i++)
│ │ │ +
332 (*this)[i] /= k;
│ │ │ +
333 return asImp();
│ │ │ +
334 }
│ │ │ +
│ │ │ +
335
│ │ │ +
337 template <class Other>
│ │ │ +
│ │ │ + │ │ │ +
339 {
│ │ │ +
340 DUNE_ASSERT_BOUNDS(rows() == x.rows());
│ │ │ +
341 for( size_type i = 0; i < rows(); ++i )
│ │ │ +
342 (*this)[ i ].axpy( a, x[ i ] );
│ │ │ +
343 return asImp();
│ │ │ +
344 }
│ │ │ +
│ │ │ +
345
│ │ │ +
347 template <class Other>
│ │ │ +
│ │ │ +
348 bool operator== (const DenseMatrix<Other>& x) const
│ │ │ +
349 {
│ │ │ +
350 DUNE_ASSERT_BOUNDS(rows() == x.rows());
│ │ │ +
351 for (size_type i=0; i<rows(); i++)
│ │ │ +
352 if ((*this)[i]!=x[i])
│ │ │ +
353 return false;
│ │ │ +
354 return true;
│ │ │ +
355 }
│ │ │ +
│ │ │ +
357 template <class Other>
│ │ │ +
│ │ │ +
358 bool operator!= (const DenseMatrix<Other>& x) const
│ │ │ +
359 {
│ │ │ +
360 return !operator==(x);
│ │ │ +
361 }
│ │ │ +
│ │ │ +
362
│ │ │ +
363
│ │ │ +
364 //===== linear maps
│ │ │ +
365
│ │ │ +
367 template<class X, class Y>
│ │ │ +
│ │ │ +
368 void mv (const X& x, Y& y) const
│ │ │ +
369 {
│ │ │ +
370 auto&& xx = Impl::asVector(x);
│ │ │ +
371 auto&& yy = Impl::asVector(y);
│ │ │ +
372 DUNE_ASSERT_BOUNDS((void*)(&x) != (void*)(&y));
│ │ │ +
373 DUNE_ASSERT_BOUNDS(xx.N() == M());
│ │ │ +
374 DUNE_ASSERT_BOUNDS(yy.N() == N());
│ │ │ +
375
│ │ │ +
376 using y_field_type = typename FieldTraits<Y>::field_type;
│ │ │ +
377 for (size_type i=0; i<rows(); ++i)
│ │ │ +
378 {
│ │ │ +
379 yy[i] = y_field_type(0);
│ │ │ +
380 for (size_type j=0; j<cols(); j++)
│ │ │ +
381 yy[i] += (*this)[i][j] * xx[j];
│ │ │ +
382 }
│ │ │ +
383 }
│ │ │ +
│ │ │ +
384
│ │ │ +
386 template< class X, class Y >
│ │ │ +
│ │ │ +
387 void mtv ( const X &x, Y &y ) const
│ │ │ +
388 {
│ │ │ +
389 auto&& xx = Impl::asVector(x);
│ │ │ +
390 auto&& yy = Impl::asVector(y);
│ │ │ +
391 DUNE_ASSERT_BOUNDS((void*)(&x) != (void*)(&y));
│ │ │ +
392 DUNE_ASSERT_BOUNDS(xx.N() == N());
│ │ │ +
393 DUNE_ASSERT_BOUNDS(yy.N() == M());
│ │ │ +
394
│ │ │ +
395 using y_field_type = typename FieldTraits<Y>::field_type;
│ │ │ +
396 for(size_type i = 0; i < cols(); ++i)
│ │ │ +
397 {
│ │ │ +
398 yy[i] = y_field_type(0);
│ │ │ +
399 for(size_type j = 0; j < rows(); ++j)
│ │ │ +
400 yy[i] += (*this)[j][i] * xx[j];
│ │ │ +
401 }
│ │ │ +
402 }
│ │ │ +
│ │ │ +
403
│ │ │ +
405 template<class X, class Y>
│ │ │ +
│ │ │ +
406 void umv (const X& x, Y& y) const
│ │ │ +
407 {
│ │ │ +
408 auto&& xx = Impl::asVector(x);
│ │ │ +
409 auto&& yy = Impl::asVector(y);
│ │ │ +
410 DUNE_ASSERT_BOUNDS(xx.N() == M());
│ │ │ +
411 DUNE_ASSERT_BOUNDS(yy.N() == N());
│ │ │ +
412 for (size_type i=0; i<rows(); ++i)
│ │ │ +
413 for (size_type j=0; j<cols(); j++)
│ │ │ +
414 yy[i] += (*this)[i][j] * xx[j];
│ │ │ +
415 }
│ │ │ +
│ │ │ +
416
│ │ │ +
418 template<class X, class Y>
│ │ │ +
│ │ │ +
419 void umtv (const X& x, Y& y) const
│ │ │ +
420 {
│ │ │ +
421 auto&& xx = Impl::asVector(x);
│ │ │ +
422 auto&& yy = Impl::asVector(y);
│ │ │ +
423 DUNE_ASSERT_BOUNDS(xx.N() == N());
│ │ │ +
424 DUNE_ASSERT_BOUNDS(yy.N() == M());
│ │ │ +
425 for(size_type i = 0; i<rows(); ++i)
│ │ │ +
426 for (size_type j=0; j<cols(); j++)
│ │ │ +
427 yy[j] += (*this)[i][j]*xx[i];
│ │ │ +
428 }
│ │ │ +
│ │ │ +
429
│ │ │ +
431 template<class X, class Y>
│ │ │ +
│ │ │ +
432 void umhv (const X& x, Y& y) const
│ │ │ +
433 {
│ │ │ +
434 auto&& xx = Impl::asVector(x);
│ │ │ +
435 auto&& yy = Impl::asVector(y);
│ │ │ +
436 DUNE_ASSERT_BOUNDS(xx.N() == N());
│ │ │ +
437 DUNE_ASSERT_BOUNDS(yy.N() == M());
│ │ │ +
438 for (size_type i=0; i<rows(); i++)
│ │ │ +
439 for (size_type j=0; j<cols(); j++)
│ │ │ +
440 yy[j] += conjugateComplex((*this)[i][j])*xx[i];
│ │ │ +
441 }
│ │ │ +
│ │ │ +
442
│ │ │ +
444 template<class X, class Y>
│ │ │ +
│ │ │ +
445 void mmv (const X& x, Y& y) const
│ │ │ +
446 {
│ │ │ +
447 auto&& xx = Impl::asVector(x);
│ │ │ +
448 auto&& yy = Impl::asVector(y);
│ │ │ +
449 DUNE_ASSERT_BOUNDS(xx.N() == M());
│ │ │ +
450 DUNE_ASSERT_BOUNDS(yy.N() == N());
│ │ │ +
451 for (size_type i=0; i<rows(); i++)
│ │ │ +
452 for (size_type j=0; j<cols(); j++)
│ │ │ +
453 yy[i] -= (*this)[i][j] * xx[j];
│ │ │ +
454 }
│ │ │ +
│ │ │ +
455
│ │ │ +
457 template<class X, class Y>
│ │ │ +
│ │ │ +
458 void mmtv (const X& x, Y& y) const
│ │ │ +
459 {
│ │ │ +
460 auto&& xx = Impl::asVector(x);
│ │ │ +
461 auto&& yy = Impl::asVector(y);
│ │ │ +
462 DUNE_ASSERT_BOUNDS(xx.N() == N());
│ │ │ +
463 DUNE_ASSERT_BOUNDS(yy.N() == M());
│ │ │ +
464 for (size_type i=0; i<rows(); i++)
│ │ │ +
465 for (size_type j=0; j<cols(); j++)
│ │ │ +
466 yy[j] -= (*this)[i][j]*xx[i];
│ │ │ +
467 }
│ │ │ +
│ │ │ +
468
│ │ │ +
470 template<class X, class Y>
│ │ │ +
│ │ │ +
471 void mmhv (const X& x, Y& y) const
│ │ │ +
472 {
│ │ │ +
473 auto&& xx = Impl::asVector(x);
│ │ │ +
474 auto&& yy = Impl::asVector(y);
│ │ │ +
475 DUNE_ASSERT_BOUNDS(xx.N() == N());
│ │ │ +
476 DUNE_ASSERT_BOUNDS(yy.N() == M());
│ │ │ +
477 for (size_type i=0; i<rows(); i++)
│ │ │ +
478 for (size_type j=0; j<cols(); j++)
│ │ │ +
479 yy[j] -= conjugateComplex((*this)[i][j])*xx[i];
│ │ │ +
480 }
│ │ │ +
│ │ │ +
481
│ │ │ +
483 template<class X, class Y>
│ │ │ +
│ │ │ +
484 void usmv (const typename FieldTraits<Y>::field_type & alpha,
│ │ │ +
485 const X& x, Y& y) const
│ │ │ +
486 {
│ │ │ +
487 auto&& xx = Impl::asVector(x);
│ │ │ +
488 auto&& yy = Impl::asVector(y);
│ │ │ +
489 DUNE_ASSERT_BOUNDS(xx.N() == M());
│ │ │ +
490 DUNE_ASSERT_BOUNDS(yy.N() == N());
│ │ │ +
491 for (size_type i=0; i<rows(); i++)
│ │ │ +
492 for (size_type j=0; j<cols(); j++)
│ │ │ +
493 yy[i] += alpha * (*this)[i][j] * xx[j];
│ │ │ +
494 }
│ │ │ +
│ │ │ +
495
│ │ │ +
497 template<class X, class Y>
│ │ │ +
│ │ │ +
498 void usmtv (const typename FieldTraits<Y>::field_type & alpha,
│ │ │ +
499 const X& x, Y& y) const
│ │ │ +
500 {
│ │ │ +
501 auto&& xx = Impl::asVector(x);
│ │ │ +
502 auto&& yy = Impl::asVector(y);
│ │ │ +
503 DUNE_ASSERT_BOUNDS(xx.N() == N());
│ │ │ +
504 DUNE_ASSERT_BOUNDS(yy.N() == M());
│ │ │ +
505 for (size_type i=0; i<rows(); i++)
│ │ │ +
506 for (size_type j=0; j<cols(); j++)
│ │ │ +
507 yy[j] += alpha*(*this)[i][j]*xx[i];
│ │ │ +
508 }
│ │ │ +
│ │ │ +
509
│ │ │ +
511 template<class X, class Y>
│ │ │ +
│ │ │ +
512 void usmhv (const typename FieldTraits<Y>::field_type & alpha,
│ │ │ +
513 const X& x, Y& y) const
│ │ │ +
514 {
│ │ │ +
515 auto&& xx = Impl::asVector(x);
│ │ │ +
516 auto&& yy = Impl::asVector(y);
│ │ │ +
517 DUNE_ASSERT_BOUNDS(xx.N() == N());
│ │ │ +
518 DUNE_ASSERT_BOUNDS(yy.N() == M());
│ │ │ +
519 for (size_type i=0; i<rows(); i++)
│ │ │ +
520 for (size_type j=0; j<cols(); j++)
│ │ │ +
521 yy[j] +=
│ │ │ +
522 alpha*conjugateComplex((*this)[i][j])*xx[i];
│ │ │ +
523 }
│ │ │ +
│ │ │ +
524
│ │ │ +
525 //===== norms
│ │ │ +
526
│ │ │ +
│ │ │ + │ │ │ +
529 {
│ │ │ +
530 typename FieldTraits<value_type>::real_type sum=(0.0);
│ │ │ +
531 for (size_type i=0; i<rows(); ++i) sum += (*this)[i].two_norm2();
│ │ │ +
532 return fvmeta::sqrt(sum);
│ │ │ +
533 }
│ │ │ +
│ │ │ +
534
│ │ │ +
│ │ │ + │ │ │ +
537 {
│ │ │ +
538 typename FieldTraits<value_type>::real_type sum=(0.0);
│ │ │ +
539 for (size_type i=0; i<rows(); ++i) sum += (*this)[i].two_norm2();
│ │ │ +
540 return sum;
│ │ │ +
541 }
│ │ │ +
│ │ │ +
542
│ │ │ +
544 template <typename vt = value_type,
│ │ │ +
545 typename std::enable_if<!HasNaN<vt>::value, int>::type = 0>
│ │ │ +
│ │ │ + │ │ │ +
547 using real_type = typename FieldTraits<vt>::real_type;
│ │ │ +
548 using std::max;
│ │ │ +
549
│ │ │ +
550 real_type norm = 0;
│ │ │ +
551 for (auto const &x : *this) {
│ │ │ +
552 real_type const a = x.one_norm();
│ │ │ +
553 norm = max(a, norm);
│ │ │ +
554 }
│ │ │ +
555 return norm;
│ │ │ +
556 }
│ │ │ +
│ │ │ +
557
│ │ │ +
559 template <typename vt = value_type,
│ │ │ +
560 typename std::enable_if<!HasNaN<vt>::value, int>::type = 0>
│ │ │ +
│ │ │ + │ │ │ +
562 using real_type = typename FieldTraits<vt>::real_type;
│ │ │ +
563 using std::max;
│ │ │ +
564
│ │ │ +
565 real_type norm = 0;
│ │ │ +
566 for (auto const &x : *this) {
│ │ │ +
567 real_type const a = x.one_norm_real();
│ │ │ +
568 norm = max(a, norm);
│ │ │ +
569 }
│ │ │ +
570 return norm;
│ │ │ +
571 }
│ │ │ +
│ │ │ +
572
│ │ │ +
574 template <typename vt = value_type,
│ │ │ +
575 typename std::enable_if<HasNaN<vt>::value, int>::type = 0>
│ │ │ +
│ │ │ + │ │ │ +
577 using real_type = typename FieldTraits<vt>::real_type;
│ │ │ +
578 using std::max;
│ │ │ +
579
│ │ │ +
580 real_type norm = 0;
│ │ │ +
581 real_type isNaN = 1;
│ │ │ +
582 for (auto const &x : *this) {
│ │ │ +
583 real_type const a = x.one_norm();
│ │ │ +
584 norm = max(a, norm);
│ │ │ +
585 isNaN += a;
│ │ │ +
586 }
│ │ │ +
587 return norm * (isNaN / isNaN);
│ │ │ +
588 }
│ │ │ +
│ │ │ +
589
│ │ │ +
591 template <typename vt = value_type,
│ │ │ +
592 typename std::enable_if<HasNaN<vt>::value, int>::type = 0>
│ │ │ +
│ │ │ + │ │ │ +
594 using real_type = typename FieldTraits<vt>::real_type;
│ │ │ +
595 using std::max;
│ │ │ +
596
│ │ │ +
597 real_type norm = 0;
│ │ │ +
598 real_type isNaN = 1;
│ │ │ +
599 for (auto const &x : *this) {
│ │ │ +
600 real_type const a = x.one_norm_real();
│ │ │ +
601 norm = max(a, norm);
│ │ │ +
602 isNaN += a;
│ │ │ +
603 }
│ │ │ +
604 return norm * (isNaN / isNaN);
│ │ │ +
605 }
│ │ │ +
│ │ │ +
606
│ │ │ +
607 //===== solve
│ │ │ +
608
│ │ │ +
613 template <class V1, class V2>
│ │ │ +
614 void solve (V1& x, const V2& b, bool doPivoting = true) const;
│ │ │ +
615
│ │ │ +
620 void invert(bool doPivoting = true);
│ │ │ +
621
│ │ │ +
623 field_type determinant (bool doPivoting = true) const;
│ │ │ +
624
│ │ │ +
626 template<typename M2>
│ │ │ +
│ │ │ + │ │ │ +
628 {
│ │ │ +
629 DUNE_ASSERT_BOUNDS(M.rows() == M.cols());
│ │ │ +
630 DUNE_ASSERT_BOUNDS(M.rows() == rows());
│ │ │ +
631 AutonomousValue<MAT> C(asImp());
│ │ │ +
632
│ │ │ +
633 for (size_type i=0; i<rows(); i++)
│ │ │ +
634 for (size_type j=0; j<cols(); j++) {
│ │ │ +
635 (*this)[i][j] = 0;
│ │ │ +
636 for (size_type k=0; k<rows(); k++)
│ │ │ +
637 (*this)[i][j] += M[i][k]*C[k][j];
│ │ │ +
638 }
│ │ │ +
639
│ │ │ +
640 return asImp();
│ │ │ +
641 }
│ │ │ +
│ │ │ +
642
│ │ │ +
644 template<typename M2>
│ │ │ +
│ │ │ + │ │ │ +
646 {
│ │ │ +
647 DUNE_ASSERT_BOUNDS(M.rows() == M.cols());
│ │ │ +
648 DUNE_ASSERT_BOUNDS(M.cols() == cols());
│ │ │ +
649 AutonomousValue<MAT> C(asImp());
│ │ │ +
650
│ │ │ +
651 for (size_type i=0; i<rows(); i++)
│ │ │ +
652 for (size_type j=0; j<cols(); j++) {
│ │ │ +
653 (*this)[i][j] = 0;
│ │ │ +
654 for (size_type k=0; k<cols(); k++)
│ │ │ +
655 (*this)[i][j] += C[i][k]*M[k][j];
│ │ │ +
656 }
│ │ │ +
657 return asImp();
│ │ │ +
658 }
│ │ │ +
│ │ │ +
659
│ │ │ +
660#if 0
│ │ │ +
662 template<int l>
│ │ │ +
663 DenseMatrix<K,l,cols> leftmultiplyany (const FieldMatrix<K,l,rows>& M) const
│ │ │ +
664 {
│ │ │ + │ │ │ +
666
│ │ │ +
667 for (size_type i=0; i<l; i++) {
│ │ │ +
668 for (size_type j=0; j<cols(); j++) {
│ │ │ +
669 C[i][j] = 0;
│ │ │ +
670 for (size_type k=0; k<rows(); k++)
│ │ │ +
671 C[i][j] += M[i][k]*(*this)[k][j];
│ │ │ +
672 }
│ │ │ +
673 }
│ │ │ +
674 return C;
│ │ │ +
675 }
│ │ │ +
676
│ │ │ +
678 template<int l>
│ │ │ +
679 FieldMatrix<K,rows,l> rightmultiplyany (const FieldMatrix<K,cols,l>& M) const
│ │ │ +
680 {
│ │ │ +
681 FieldMatrix<K,rows,l> C;
│ │ │ +
682
│ │ │ +
683 for (size_type i=0; i<rows(); i++) {
│ │ │ +
684 for (size_type j=0; j<l; j++) {
│ │ │ +
685 C[i][j] = 0;
│ │ │ +
686 for (size_type k=0; k<cols(); k++)
│ │ │ +
687 C[i][j] += (*this)[i][k]*M[k][j];
│ │ │ +
688 }
│ │ │ +
689 }
│ │ │ +
690 return C;
│ │ │ +
691 }
│ │ │ +
692#endif
│ │ │ +
693
│ │ │ +
694 //===== sizes
│ │ │ +
695
│ │ │ +
│ │ │ +
697 constexpr size_type N () const
│ │ │ +
698 {
│ │ │ +
699 return rows();
│ │ │ +
700 }
│ │ │ +
│ │ │ +
701
│ │ │ +
│ │ │ +
703 constexpr size_type M () const
│ │ │ +
704 {
│ │ │ +
705 return cols();
│ │ │ +
706 }
│ │ │ +
│ │ │ +
707
│ │ │ +
│ │ │ +
709 constexpr size_type rows() const
│ │ │ +
710 {
│ │ │ +
711 return asImp().mat_rows();
│ │ │ +
712 }
│ │ │ +
│ │ │ +
713
│ │ │ +
│ │ │ +
715 constexpr size_type cols() const
│ │ │ +
716 {
│ │ │ +
717 return asImp().mat_cols();
│ │ │ +
718 }
│ │ │ +
│ │ │ +
719
│ │ │ +
720 //===== query
│ │ │ +
721
│ │ │ +
│ │ │ +
723 bool exists ([[maybe_unused]] size_type i, [[maybe_unused]] size_type j) const
│ │ │ +
724 {
│ │ │ +
725 DUNE_ASSERT_BOUNDS(i >= 0 && i < rows());
│ │ │ +
726 DUNE_ASSERT_BOUNDS(j >= 0 && j < cols());
│ │ │ +
727 return true;
│ │ │ +
728 }
│ │ │ +
│ │ │ +
729
│ │ │ +
730 protected:
│ │ │ +
731
│ │ │ +
732#ifndef DOXYGEN
│ │ │ +
733 struct ElimPivot
│ │ │ +
734 {
│ │ │ +
735 ElimPivot(std::vector<simd_index_type> & pivot);
│ │ │ +
736
│ │ │ +
737 void swap(std::size_t i, simd_index_type j);
│ │ │ +
738
│ │ │ +
739 template<typename T>
│ │ │ +
740 void operator()(const T&, int, int)
│ │ │ +
741 {}
│ │ │ +
742
│ │ │ +
743 std::vector<simd_index_type> & pivot_;
│ │ │ +
744 };
│ │ │ +
745
│ │ │ +
746 template<typename V>
│ │ │ +
747 struct Elim
│ │ │ +
748 {
│ │ │ +
749 Elim(V& rhs);
│ │ │ +
750
│ │ │ +
751 void swap(std::size_t i, simd_index_type j);
│ │ │ +
752
│ │ │ +
753 void operator()(const typename V::field_type& factor, int k, int i);
│ │ │ +
754
│ │ │ +
755 V* rhs_;
│ │ │ +
756 };
│ │ │ +
757
│ │ │ +
758 struct ElimDet
│ │ │ +
759 {
│ │ │ +
760 ElimDet(field_type& sign) : sign_(sign)
│ │ │ +
761 { sign_ = 1; }
│ │ │ +
762
│ │ │ +
763 void swap(std::size_t i, simd_index_type j)
│ │ │ +
764 {
│ │ │ +
765 sign_ *=
│ │ │ +
766 Simd::cond(simd_index_type(i) == j, field_type(1), field_type(-1));
│ │ │ +
767 }
│ │ │ +
768
│ │ │ +
769 void operator()(const field_type&, int, int)
│ │ │ +
770 {}
│ │ │ +
771
│ │ │ +
772 field_type& sign_;
│ │ │ +
773 };
│ │ │ +
774#endif // DOXYGEN
│ │ │ +
775
│ │ │ +
777
│ │ │ +
815 template<class Func, class Mask>
│ │ │ +
816 static void luDecomposition(DenseMatrix<MAT>& A, Func func,
│ │ │ +
817 Mask &nonsingularLanes, bool throwEarly, bool doPivoting);
│ │ │ +
818 };
│ │ │ +
│ │ │ +
819
│ │ │ +
820#ifndef DOXYGEN
│ │ │ +
821 template<typename MAT>
│ │ │ +
822 DenseMatrix<MAT>::ElimPivot::ElimPivot(std::vector<simd_index_type> & pivot)
│ │ │ +
823 : pivot_(pivot)
│ │ │ +
824 {
│ │ │ +
825 typedef typename std::vector<size_type>::size_type size_type;
│ │ │ +
826 for(size_type i=0; i < pivot_.size(); ++i) pivot_[i]=i;
│ │ │ +
827 }
│ │ │ +
828
│ │ │ +
829 template<typename MAT>
│ │ │ +
830 void DenseMatrix<MAT>::ElimPivot::swap(std::size_t i, simd_index_type j)
│ │ │ +
831 {
│ │ │ +
832 pivot_[i] =
│ │ │ +
833 Simd::cond(Simd::Scalar<simd_index_type>(i) == j, pivot_[i], j);
│ │ │ +
834 }
│ │ │ +
835
│ │ │ +
836 template<typename MAT>
│ │ │ +
837 template<typename V>
│ │ │ +
838 DenseMatrix<MAT>::Elim<V>::Elim(V& rhs)
│ │ │ +
839 : rhs_(&rhs)
│ │ │ +
840 {}
│ │ │ +
841
│ │ │ +
842 template<typename MAT>
│ │ │ +
843 template<typename V>
│ │ │ +
844 void DenseMatrix<MAT>::Elim<V>::swap(std::size_t i, simd_index_type j)
│ │ │ +
845 {
│ │ │ +
846 using std::swap;
│ │ │ +
847
│ │ │ +
848 // see the comment in luDecomposition()
│ │ │ +
849 for(std::size_t l = 0; l < Simd::lanes(j); ++l)
│ │ │ +
850 swap(Simd::lane(l, (*rhs_)[ i ]),
│ │ │ +
851 Simd::lane(l, (*rhs_)[Simd::lane(l, j)]));
│ │ │ +
852 }
│ │ │ +
853
│ │ │ +
854 template<typename MAT>
│ │ │ +
855 template<typename V>
│ │ │ +
856 void DenseMatrix<MAT>::
│ │ │ +
857 Elim<V>::operator()(const typename V::field_type& factor, int k, int i)
│ │ │ +
858 {
│ │ │ +
859 (*rhs_)[k] -= factor*(*rhs_)[i];
│ │ │ +
860 }
│ │ │ +
861
│ │ │ +
862 template<typename MAT>
│ │ │ +
863 template<typename Func, class Mask>
│ │ │ +
864 inline void DenseMatrix<MAT>::
│ │ │ +
865 luDecomposition(DenseMatrix<MAT>& A, Func func, Mask &nonsingularLanes,
│ │ │ +
866 bool throwEarly, bool doPivoting)
│ │ │ +
867 {
│ │ │ +
868 using std::max;
│ │ │ +
869 using std::swap;
│ │ │ +
870
│ │ │ +
871 typedef typename FieldTraits<value_type>::real_type real_type;
│ │ │ +
872
│ │ │ +
873 // LU decomposition of A in A
│ │ │ +
874 for (size_type i=0; i<A.rows(); i++) // loop over all rows
│ │ │ +
875 {
│ │ │ +
876 real_type pivmax = fvmeta::absreal(A[i][i]);
│ │ │ +
877
│ │ │ +
878 if (doPivoting)
│ │ │ +
879 {
│ │ │ +
880 // compute maximum of column
│ │ │ +
881 simd_index_type imax=i;
│ │ │ +
882 for (size_type k=i+1; k<A.rows(); k++)
│ │ │ +
883 {
│ │ │ +
884 auto abs = fvmeta::absreal(A[k][i]);
│ │ │ +
885 auto mask = abs > pivmax;
│ │ │ +
886 pivmax = Simd::cond(mask, abs, pivmax);
│ │ │ +
887 imax = Simd::cond(mask, simd_index_type(k), imax);
│ │ │ +
888 }
│ │ │ +
889 // swap rows
│ │ │ +
890 for (size_type j=0; j<A.rows(); j++)
│ │ │ +
891 {
│ │ │ +
892 // This is a swap operation where the second operand is scattered,
│ │ │ +
893 // and on top of that is also extracted from deep within a
│ │ │ +
894 // moderately complicated data structure (a DenseMatrix), where we
│ │ │ +
895 // can't assume much on the memory layout. On intel processors,
│ │ │ +
896 // the only instruction that might help us here is vgather, but it
│ │ │ +
897 // is unclear whether that is even faster than a software
│ │ │ +
898 // implementation, and we would also need vscatter which does not
│ │ │ +
899 // exist. So break vectorization here and do it manually.
│ │ │ +
900 for(std::size_t l = 0; l < Simd::lanes(A[i][j]); ++l)
│ │ │ +
901 swap(Simd::lane(l, A[i][j]),
│ │ │ +
902 Simd::lane(l, A[Simd::lane(l, imax)][j]));
│ │ │ +
903 }
│ │ │ +
904 func.swap(i, imax); // swap the pivot or rhs
│ │ │ +
905 }
│ │ │ +
906
│ │ │ +
907 // singular ?
│ │ │ +
908 nonsingularLanes = nonsingularLanes && (pivmax != real_type(0));
│ │ │ +
909 if (throwEarly) {
│ │ │ +
910 if(!Simd::allTrue(nonsingularLanes))
│ │ │ +
911 DUNE_THROW(FMatrixError, "matrix is singular");
│ │ │ +
912 }
│ │ │ +
913 else { // !throwEarly
│ │ │ +
914 if(!Simd::anyTrue(nonsingularLanes))
│ │ │ +
915 return;
│ │ │ +
916 }
│ │ │ +
917
│ │ │ +
918 // eliminate
│ │ │ +
919 for (size_type k=i+1; k<A.rows(); k++)
│ │ │ +
920 {
│ │ │ +
921 // in the simd case, A[i][i] may be close to zero in some lanes. Pray
│ │ │ +
922 // that the result is no worse than a quiet NaN.
│ │ │ +
923 field_type factor = A[k][i]/A[i][i];
│ │ │ +
924 A[k][i] = factor;
│ │ │ +
925 for (size_type j=i+1; j<A.rows(); j++)
│ │ │ +
926 A[k][j] -= factor*A[i][j];
│ │ │ +
927 func(factor, k, i);
│ │ │ +
928 }
│ │ │ +
929 }
│ │ │ +
930 }
│ │ │ +
931
│ │ │ +
932 template<typename MAT>
│ │ │ +
933 template <class V1, class V2>
│ │ │ +
934 inline void DenseMatrix<MAT>::solve(V1& x, const V2& b, bool doPivoting) const
│ │ │ +
935 {
│ │ │ +
936 using real_type = typename FieldTraits<value_type>::real_type;
│ │ │ +
937 // never mind those ifs, because they get optimized away
│ │ │ +
938 if (rows()!=cols())
│ │ │ +
939 DUNE_THROW(FMatrixError, "Can't solve for a " << rows() << "x" << cols() << " matrix!");
│ │ │ +
940
│ │ │ +
941 if (rows()==1) {
│ │ │ +
942
│ │ │ +
943#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ +
944 if (Simd::anyTrue(fvmeta::absreal((*this)[0][0])
│ │ │ + │ │ │ +
946 DUNE_THROW(FMatrixError,"matrix is singular");
│ │ │ +
947#endif
│ │ │ +
948 x[0] = b[0]/(*this)[0][0];
│ │ │ +
949
│ │ │ +
950 }
│ │ │ +
951 else if (rows()==2) {
│ │ │ +
952
│ │ │ +
953 field_type detinv = (*this)[0][0]*(*this)[1][1]-(*this)[0][1]*(*this)[1][0];
│ │ │ +
954#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ +
955 if (Simd::anyTrue(fvmeta::absreal(detinv)
│ │ │ + │ │ │ +
957 DUNE_THROW(FMatrixError,"matrix is singular");
│ │ │ +
958#endif
│ │ │ +
959 detinv = real_type(1.0)/detinv;
│ │ │ +
960
│ │ │ +
961 x[0] = detinv*((*this)[1][1]*b[0]-(*this)[0][1]*b[1]);
│ │ │ +
962 x[1] = detinv*((*this)[0][0]*b[1]-(*this)[1][0]*b[0]);
│ │ │ +
963
│ │ │ +
964 }
│ │ │ +
965 else if (rows()==3) {
│ │ │ +
966
│ │ │ +
967 field_type d = determinant(doPivoting);
│ │ │ +
968#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ +
969 if (Simd::anyTrue(fvmeta::absreal(d)
│ │ │ + │ │ │ +
971 DUNE_THROW(FMatrixError,"matrix is singular");
│ │ │ +
972#endif
│ │ │ +
973
│ │ │ +
974 x[0] = (b[0]*(*this)[1][1]*(*this)[2][2] - b[0]*(*this)[2][1]*(*this)[1][2]
│ │ │ +
975 - b[1] *(*this)[0][1]*(*this)[2][2] + b[1]*(*this)[2][1]*(*this)[0][2]
│ │ │ +
976 + b[2] *(*this)[0][1]*(*this)[1][2] - b[2]*(*this)[1][1]*(*this)[0][2]) / d;
│ │ │ +
977
│ │ │ +
978 x[1] = ((*this)[0][0]*b[1]*(*this)[2][2] - (*this)[0][0]*b[2]*(*this)[1][2]
│ │ │ +
979 - (*this)[1][0] *b[0]*(*this)[2][2] + (*this)[1][0]*b[2]*(*this)[0][2]
│ │ │ +
980 + (*this)[2][0] *b[0]*(*this)[1][2] - (*this)[2][0]*b[1]*(*this)[0][2]) / d;
│ │ │ +
981
│ │ │ +
982 x[2] = ((*this)[0][0]*(*this)[1][1]*b[2] - (*this)[0][0]*(*this)[2][1]*b[1]
│ │ │ +
983 - (*this)[1][0] *(*this)[0][1]*b[2] + (*this)[1][0]*(*this)[2][1]*b[0]
│ │ │ +
984 + (*this)[2][0] *(*this)[0][1]*b[1] - (*this)[2][0]*(*this)[1][1]*b[0]) / d;
│ │ │ +
985
│ │ │ +
986 }
│ │ │ +
987 else {
│ │ │ +
988
│ │ │ +
989 V1& rhs = x; // use x to store rhs
│ │ │ +
990 rhs = b; // copy data
│ │ │ +
991 Elim<V1> elim(rhs);
│ │ │ +
992 AutonomousValue<MAT> A(asImp());
│ │ │ +
993 Simd::Mask<typename FieldTraits<value_type>::real_type>
│ │ │ +
994 nonsingularLanes(true);
│ │ │ +
995
│ │ │ +
996 AutonomousValue<MAT>::luDecomposition(A, elim, nonsingularLanes, true, doPivoting);
│ │ │ +
997
│ │ │ +
998 // backsolve
│ │ │ +
999 for(int i=rows()-1; i>=0; i--) {
│ │ │ +
1000 for (size_type j=i+1; j<rows(); j++)
│ │ │ +
1001 rhs[i] -= A[i][j]*x[j];
│ │ │ +
1002 x[i] = rhs[i]/A[i][i];
│ │ │ +
1003 }
│ │ │ +
1004 }
│ │ │ +
1005 }
│ │ │ +
1006
│ │ │ +
1007 template<typename MAT>
│ │ │ +
1008 inline void DenseMatrix<MAT>::invert(bool doPivoting)
│ │ │ +
1009 {
│ │ │ +
1010 using real_type = typename FieldTraits<MAT>::real_type;
│ │ │ +
1011 using std::swap;
│ │ │ +
1012
│ │ │ +
1013 // never mind those ifs, because they get optimized away
│ │ │ +
1014 if (rows()!=cols())
│ │ │ +
1015 DUNE_THROW(FMatrixError, "Can't invert a " << rows() << "x" << cols() << " matrix!");
│ │ │ +
1016
│ │ │ +
1017 if (rows()==1) {
│ │ │ +
1018
│ │ │ +
1019#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ +
1020 if (Simd::anyTrue(fvmeta::absreal((*this)[0][0])
│ │ │ + │ │ │ +
1022 DUNE_THROW(FMatrixError,"matrix is singular");
│ │ │ +
1023#endif
│ │ │ +
1024 (*this)[0][0] = real_type( 1 ) / (*this)[0][0];
│ │ │ +
1025
│ │ │ +
1026 }
│ │ │ +
1027 else if (rows()==2) {
│ │ │ +
1028
│ │ │ +
1029 field_type detinv = (*this)[0][0]*(*this)[1][1]-(*this)[0][1]*(*this)[1][0];
│ │ │ +
1030#ifdef DUNE_FMatrix_WITH_CHECKING
│ │ │ +
1031 if (Simd::anyTrue(fvmeta::absreal(detinv)
│ │ │ + │ │ │ +
1033 DUNE_THROW(FMatrixError,"matrix is singular");
│ │ │ +
1034#endif
│ │ │ +
1035 detinv = real_type( 1 ) / detinv;
│ │ │ +
1036
│ │ │ +
1037 field_type temp=(*this)[0][0];
│ │ │ +
1038 (*this)[0][0] = (*this)[1][1]*detinv;
│ │ │ +
1039 (*this)[0][1] = -(*this)[0][1]*detinv;
│ │ │ +
1040 (*this)[1][0] = -(*this)[1][0]*detinv;
│ │ │ +
1041 (*this)[1][1] = temp*detinv;
│ │ │ +
1042
│ │ │ +
1043 }
│ │ │ +
1044 else if (rows()==3)
│ │ │ +
1045 {
│ │ │ +
1046 using K = field_type;
│ │ │ +
1047 // code generated by maple
│ │ │ +
1048 K t4 = (*this)[0][0] * (*this)[1][1];
│ │ │ +
1049 K t6 = (*this)[0][0] * (*this)[1][2];
│ │ │ +
1050 K t8 = (*this)[0][1] * (*this)[1][0];
│ │ │ +
1051 K t10 = (*this)[0][2] * (*this)[1][0];
│ │ │ +
1052 K t12 = (*this)[0][1] * (*this)[2][0];
│ │ │ +
1053 K t14 = (*this)[0][2] * (*this)[2][0];
│ │ │ +
1054
│ │ │ +
1055 K det = (t4*(*this)[2][2]-t6*(*this)[2][1]-t8*(*this)[2][2]+
│ │ │ +
1056 t10*(*this)[2][1]+t12*(*this)[1][2]-t14*(*this)[1][1]);
│ │ │ +
1057 K t17 = K(1.0)/det;
│ │ │ +
1058
│ │ │ +
1059 K matrix01 = (*this)[0][1];
│ │ │ +
1060 K matrix00 = (*this)[0][0];
│ │ │ +
1061 K matrix10 = (*this)[1][0];
│ │ │ +
1062 K matrix11 = (*this)[1][1];
│ │ │ +
1063
│ │ │ +
1064 (*this)[0][0] = ((*this)[1][1] * (*this)[2][2] - (*this)[1][2] * (*this)[2][1])*t17;
│ │ │ +
1065 (*this)[0][1] = -((*this)[0][1] * (*this)[2][2] - (*this)[0][2] * (*this)[2][1])*t17;
│ │ │ +
1066 (*this)[0][2] = (matrix01 * (*this)[1][2] - (*this)[0][2] * (*this)[1][1])*t17;
│ │ │ +
1067 (*this)[1][0] = -((*this)[1][0] * (*this)[2][2] - (*this)[1][2] * (*this)[2][0])*t17;
│ │ │ +
1068 (*this)[1][1] = (matrix00 * (*this)[2][2] - t14) * t17;
│ │ │ +
1069 (*this)[1][2] = -(t6-t10) * t17;
│ │ │ +
1070 (*this)[2][0] = (matrix10 * (*this)[2][1] - matrix11 * (*this)[2][0]) * t17;
│ │ │ +
1071 (*this)[2][1] = -(matrix00 * (*this)[2][1] - t12) * t17;
│ │ │ +
1072 (*this)[2][2] = (t4-t8) * t17;
│ │ │ +
1073 }
│ │ │ +
1074 else {
│ │ │ +
1075 using std::swap;
│ │ │ +
1076
│ │ │ +
1077 AutonomousValue<MAT> A(asImp());
│ │ │ +
1078 std::vector<simd_index_type> pivot(rows());
│ │ │ +
1079 Simd::Mask<typename FieldTraits<value_type>::real_type>
│ │ │ +
1080 nonsingularLanes(true);
│ │ │ +
1081 AutonomousValue<MAT>::luDecomposition(A, ElimPivot(pivot), nonsingularLanes, true, doPivoting);
│ │ │ +
1082 auto& L=A;
│ │ │ +
1083 auto& U=A;
│ │ │ +
1084
│ │ │ +
1085 // initialize inverse
│ │ │ +
1086 *this=field_type();
│ │ │ +
1087
│ │ │ +
1088 for(size_type i=0; i<rows(); ++i)
│ │ │ +
1089 (*this)[i][i]=1;
│ │ │ +
1090
│ │ │ +
1091 // L Y = I; multiple right hand sides
│ │ │ +
1092 for (size_type i=0; i<rows(); i++)
│ │ │ +
1093 for (size_type j=0; j<i; j++)
│ │ │ +
1094 for (size_type k=0; k<rows(); k++)
│ │ │ +
1095 (*this)[i][k] -= L[i][j]*(*this)[j][k];
│ │ │ +
1096
│ │ │ +
1097 // U A^{-1} = Y
│ │ │ +
1098 for (size_type i=rows(); i>0;) {
│ │ │ +
1099 --i;
│ │ │ +
1100 for (size_type k=0; k<rows(); k++) {
│ │ │ +
1101 for (size_type j=i+1; j<rows(); j++)
│ │ │ +
1102 (*this)[i][k] -= U[i][j]*(*this)[j][k];
│ │ │ +
1103 (*this)[i][k] /= U[i][i];
│ │ │ +
1104 }
│ │ │ +
1105 }
│ │ │ +
1106
│ │ │ +
1107 for(size_type i=rows(); i>0; ) {
│ │ │ +
1108 --i;
│ │ │ +
1109 for(std::size_t l = 0; l < Simd::lanes((*this)[0][0]); ++l)
│ │ │ +
1110 {
│ │ │ +
1111 std::size_t pi = Simd::lane(l, pivot[i]);
│ │ │ +
1112 if(i!=pi)
│ │ │ +
1113 for(size_type j=0; j<rows(); ++j)
│ │ │ +
1114 swap(Simd::lane(l, (*this)[j][pi]),
│ │ │ +
1115 Simd::lane(l, (*this)[j][ i]));
│ │ │ +
1116 }
│ │ │ +
1117 }
│ │ │ +
1118 }
│ │ │ +
1119 }
│ │ │ +
1120
│ │ │ +
1121 // implementation of the determinant
│ │ │ +
1122 template<typename MAT>
│ │ │ +
1123 inline typename DenseMatrix<MAT>::field_type
│ │ │ +
1124 DenseMatrix<MAT>::determinant(bool doPivoting) const
│ │ │ +
1125 {
│ │ │ +
1126 // never mind those ifs, because they get optimized away
│ │ │ +
1127 if (rows()!=cols())
│ │ │ +
1128 DUNE_THROW(FMatrixError, "There is no determinant for a " << rows() << "x" << cols() << " matrix!");
│ │ │ +
1129
│ │ │ +
1130 if (rows()==1)
│ │ │ +
1131 return (*this)[0][0];
│ │ │ +
1132
│ │ │ +
1133 if (rows()==2)
│ │ │ +
1134 return (*this)[0][0]*(*this)[1][1] - (*this)[0][1]*(*this)[1][0];
│ │ │ +
1135
│ │ │ +
1136 if (rows()==3) {
│ │ │ +
1137 // code generated by maple
│ │ │ +
1138 field_type t4 = (*this)[0][0] * (*this)[1][1];
│ │ │ +
1139 field_type t6 = (*this)[0][0] * (*this)[1][2];
│ │ │ +
1140 field_type t8 = (*this)[0][1] * (*this)[1][0];
│ │ │ +
1141 field_type t10 = (*this)[0][2] * (*this)[1][0];
│ │ │ +
1142 field_type t12 = (*this)[0][1] * (*this)[2][0];
│ │ │ +
1143 field_type t14 = (*this)[0][2] * (*this)[2][0];
│ │ │ +
1144
│ │ │ +
1145 return (t4*(*this)[2][2]-t6*(*this)[2][1]-t8*(*this)[2][2]+
│ │ │ +
1146 t10*(*this)[2][1]+t12*(*this)[1][2]-t14*(*this)[1][1]);
│ │ │ +
1147
│ │ │ +
1148 }
│ │ │ +
1149
│ │ │ +
1150 AutonomousValue<MAT> A(asImp());
│ │ │ +
1151 field_type det;
│ │ │ +
1152 Simd::Mask<typename FieldTraits<value_type>::real_type>
│ │ │ +
1153 nonsingularLanes(true);
│ │ │ +
1154
│ │ │ +
1155 AutonomousValue<MAT>::luDecomposition(A, ElimDet(det), nonsingularLanes, false, doPivoting);
│ │ │ +
1156 det = Simd::cond(nonsingularLanes, det, field_type(0));
│ │ │ +
1157
│ │ │ +
1158 for (size_type i = 0; i < rows(); ++i)
│ │ │ +
1159 det *= A[i][i];
│ │ │ +
1160 return det;
│ │ │ +
1161 }
│ │ │ +
1162
│ │ │ +
1163#endif // DOXYGEN
│ │ │ +
1164
│ │ │ +
│ │ │ +
1165 namespace DenseMatrixHelp {
│ │ │ +
1166
│ │ │ +
1168 template <typename MAT, typename V1, typename V2>
│ │ │ +
│ │ │ +
1169 static inline void multAssign(const DenseMatrix<MAT> &matrix, const DenseVector<V1> & x, DenseVector<V2> & ret)
│ │ │ +
1170 {
│ │ │ +
1171 DUNE_ASSERT_BOUNDS(x.size() == matrix.cols());
│ │ │ +
1172 DUNE_ASSERT_BOUNDS(ret.size() == matrix.rows());
│ │ │ +
1173 typedef typename DenseMatrix<MAT>::size_type size_type;
│ │ │ +
1174
│ │ │ +
1175 for(size_type i=0; i<matrix.rows(); ++i)
│ │ │ +
1176 {
│ │ │ +
1177 ret[i] = 0.0;
│ │ │ +
1178 for(size_type j=0; j<matrix.cols(); ++j)
│ │ │ +
1179 {
│ │ │ +
1180 ret[i] += matrix[i][j]*x[j];
│ │ │ +
1181 }
│ │ │ +
1182 }
│ │ │ +
1183 }
│ │ │ +
│ │ │ +
1184
│ │ │ +
1185#if 0
│ │ │ +
1187 template <typename K, int rows, int cols>
│ │ │ +
1188 static inline void multAssignTransposed( const FieldMatrix<K,rows,cols> &matrix, const FieldVector<K,rows> & x, FieldVector<K,cols> & ret)
│ │ │ +
1189 {
│ │ │ +
1190 typedef typename FieldMatrix<K,rows,cols>::size_type size_type;
│ │ │ +
1191
│ │ │ +
1192 for(size_type i=0; i<cols(); ++i)
│ │ │ +
1193 {
│ │ │ +
1194 ret[i] = 0.0;
│ │ │ +
1195 for(size_type j=0; j<rows(); ++j)
│ │ │ +
1196 ret[i] += matrix[j][i]*x[j];
│ │ │ +
1197 }
│ │ │ +
1198 }
│ │ │ +
1199
│ │ │ +
1201 template <typename K, int rows, int cols>
│ │ │ +
1202 static inline FieldVector<K,rows> mult(const FieldMatrix<K,rows,cols> &matrix, const FieldVector<K,cols> & x)
│ │ │ +
1203 {
│ │ │ +
1204 FieldVector<K,rows> ret;
│ │ │ +
1205 multAssign(matrix,x,ret);
│ │ │ +
1206 return ret;
│ │ │ +
1207 }
│ │ │ +
1208
│ │ │ +
1210 template <typename K, int rows, int cols>
│ │ │ +
1211 static inline FieldVector<K,cols> multTransposed(const FieldMatrix<K,rows,cols> &matrix, const FieldVector<K,rows> & x)
│ │ │ +
1212 {
│ │ │ +
1213 FieldVector<K,cols> ret;
│ │ │ +
1214 multAssignTransposed( matrix, x, ret );
│ │ │ +
1215 return ret;
│ │ │ +
1216 }
│ │ │ +
1217#endif
│ │ │ +
1218
│ │ │ +
1219 } // end namespace DenseMatrixHelp
│ │ │ +
│ │ │ +
1220
│ │ │ +
1222 template<typename MAT>
│ │ │ +
│ │ │ +
1223 std::ostream& operator<< (std::ostream& s, const DenseMatrix<MAT>& a)
│ │ │ +
1224 {
│ │ │ +
1225 for (typename DenseMatrix<MAT>::size_type i=0; i<a.rows(); i++)
│ │ │ +
1226 s << a[i] << std::endl;
│ │ │ +
1227 return s;
│ │ │ +
1228 }
│ │ │ +
│ │ │ +
1229
│ │ │ +
1232} // end namespace Dune
│ │ │ +
1233
│ │ │ +
1234#endif
│ │ │ +
Macro for wrapping boundary checks.
│ │ │ +
Various precision settings for calculations with FieldMatrix and FieldVector.
│ │ │ +
Implements a scalar vector view wrapper around an existing scalar.
│ │ │ +
Traits for type conversions and type information.
│ │ │ +
A free function to provide the demangled class name of a given object or type as a string.
│ │ │ +
Some useful basic math stuff.
│ │ │ +
Implements a vector constructed from a given type representing a field and a compile-time given size.
│ │ │ +
A few common exception classes.
│ │ │ +
#define DUNE_ASSERT_BOUNDS(cond)
If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do nothing.
Definition boundschecking.hh:30
│ │ │ +
typename AutonomousValueType< T >::type AutonomousValue
Type free of internal references that T can be converted to.
Definition typetraits.hh:588
│ │ │ +
std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
Definition bigunsignedint.hh:278
│ │ │ +
#define DUNE_THROW(E, m)
Definition exceptions.hh:218
│ │ │ +
bool anyTrue(const Mask &mask)
Whether any entry is true
Definition simd/interface.hh:429
│ │ │ +
V cond(M &&mask, const V &ifTrue, const V &ifFalse)
Like the ?: operator.
Definition simd/interface.hh:386
│ │ │ +
bool allTrue(const Mask &mask)
Whether all entries are true
Definition simd/interface.hh:439
│ │ │ +
typename Overloads::RebindType< std::decay_t< S >, std::decay_t< V > >::type Rebind
Construct SIMD type with different scalar type.
Definition simd/interface.hh:253
│ │ │ +
constexpr std::size_t lanes()
Number of lanes in a SIMD type.
Definition simd/interface.hh:305
│ │ │ +
decltype(auto) lane(std::size_t l, V &&v)
Extract an element of a SIMD type.
Definition simd/interface.hh:324
│ │ │ +
Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v)
implements Simd::mask()
Definition defaults.hh:153
│ │ │ +
STL namespace.
│ │ │ +
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ +
void swap(T &v1, T &v2, bool mask)
Definition simd.hh:472
│ │ │ +
int sign(const T &val)
Return the sign of the value.
Definition math.hh:180
│ │ │ +
K conjugateComplex(const K &x)
compute conjugate complex of x
Definition math.hh:164
│ │ │ +
static void multAssign(const DenseMatrix< MAT > &matrix, const DenseVector< V1 > &x, DenseVector< V2 > &ret)
calculates ret = matrix * x
Definition densematrix.hh:1169
│ │ │ +
A dense n x m matrix.
Definition densematrix.hh:140
│ │ │ +
ConstIterator const_iterator
typedef for stl compliant access
Definition densematrix.hh:244
│ │ │ +
derived_type operator-() const
Matrix negation.
Definition densematrix.hh:298
│ │ │ +
void solve(V1 &x, const V2 &b, bool doPivoting=true) const
Solve system A x = b.
│ │ │ +
void mv(const X &x, Y &y) const
y = A x
Definition densematrix.hh:368
│ │ │ +
Traits::value_type field_type
export the type representing the field
Definition densematrix.hh:160
│ │ │ +
derived_type & axpy(const field_type &a, const DenseMatrix< Other > &x)
vector space axpy operation (*this += a x)
Definition densematrix.hh:338
│ │ │ +
ConstIterator beforeEnd() const
Definition densematrix.hh:264
│ │ │ +
derived_type & operator=(const RHS &rhs)
Definition densematrix.hh:279
│ │ │ +
void mmtv(const X &x, Y &y) const
y -= A^T x
Definition densematrix.hh:458
│ │ │ +
FieldTraits< vt >::real_type infinity_norm_real() const
simplified infinity norm (uses Manhattan norm for complex values)
Definition densematrix.hh:561
│ │ │ +
std::remove_reference< const_row_reference >::type::ConstIterator ConstColIterator
rename the iterators for easier access
Definition densematrix.hh:248
│ │ │ +
ConstIterator beforeBegin() const
Definition densematrix.hh:271
│ │ │ +
void invert(bool doPivoting=true)
Compute inverse.
│ │ │ +
static void luDecomposition(DenseMatrix< MAT > &A, Func func, Mask &nonsingularLanes, bool throwEarly, bool doPivoting)
do an LU-Decomposition on matrix A
│ │ │ +
Traits::value_type block_type
export the type representing the components
Definition densematrix.hh:163
│ │ │ +
void mtv(const X &x, Y &y) const
y = A^T x
Definition densematrix.hh:387
│ │ │ +
constexpr size_type cols() const
number of columns
Definition densematrix.hh:715
│ │ │ +
size_type size() const
size method (number of rows)
Definition densematrix.hh:200
│ │ │ +
constexpr size_type M() const
number of columns
Definition densematrix.hh:703
│ │ │ +
MAT & rightmultiply(const DenseMatrix< M2 > &M)
Multiplies M from the right to this matrix.
Definition densematrix.hh:645
│ │ │ +
Iterator end()
end iterator
Definition densematrix.hh:222
│ │ │ +
Iterator beforeBegin()
Definition densematrix.hh:236
│ │ │ +
derived_type & operator/=(const field_type &k)
vector space division by scalar
Definition densematrix.hh:329
│ │ │ +
derived_type & operator*=(const field_type &k)
vector space multiplication with scalar
Definition densematrix.hh:321
│ │ │ +
Iterator beforeEnd()
Definition densematrix.hh:229
│ │ │ +
Traits::value_type value_type
export the type representing the field
Definition densematrix.hh:157
│ │ │ +
void usmv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y &y) const
y += alpha A x
Definition densematrix.hh:484
│ │ │ +
void usmhv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y &y) const
y += alpha A^H x
Definition densematrix.hh:512
│ │ │ +
void mmv(const X &x, Y &y) const
y -= A x
Definition densematrix.hh:445
│ │ │ +
constexpr size_type rows() const
number of rows
Definition densematrix.hh:709
│ │ │ +
MAT & leftmultiply(const DenseMatrix< M2 > &M)
Multiplies M from the left to this matrix.
Definition densematrix.hh:627
│ │ │ +
void usmtv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y &y) const
y += alpha A^T x
Definition densematrix.hh:498
│ │ │ +
derived_type & operator-=(const DenseMatrix< Other > &x)
vector space subtraction
Definition densematrix.hh:312
│ │ │ +
bool operator!=(const DenseMatrix< Other > &x) const
Binary matrix incomparison.
Definition densematrix.hh:358
│ │ │ +
void mmhv(const X &x, Y &y) const
y -= A^H x
Definition densematrix.hh:471
│ │ │ +
Traits::derived_type derived_type
type of derived matrix class
Definition densematrix.hh:154
│ │ │ +
row_reference operator[](size_type i)
random access
Definition densematrix.hh:189
│ │ │ +
bool exists(size_type i, size_type j) const
return true when (i,j) is in pattern
Definition densematrix.hh:723
│ │ │ +
Iterator RowIterator
rename the iterators for easier access
Definition densematrix.hh:211
│ │ │ +
static constexpr int blocklevel
The number of block levels we contain. This is the leaf, that is, 1.
Definition densematrix.hh:178
│ │ │ +
FieldTraits< value_type >::real_type frobenius_norm() const
frobenius norm: sqrt(sum over squared values of entries)
Definition densematrix.hh:528
│ │ │ +
void umv(const X &x, Y &y) const
y += A x
Definition densematrix.hh:406
│ │ │ +
DenseIterator< const DenseMatrix, const row_type, const_row_reference > ConstIterator
Iterator class for sequential access.
Definition densematrix.hh:242
│ │ │ +
FieldTraits< vt >::real_type infinity_norm() const
infinity norm (row sum norm, how to generalize for blocks?)
Definition densematrix.hh:546
│ │ │ +
Traits::row_type row_type
The type used to represent a row (must fulfill the Dune::DenseVector interface)
Definition densematrix.hh:169
│ │ │ +
constexpr size_type N() const
number of rows
Definition densematrix.hh:697
│ │ │ +
Traits::size_type size_type
The type used for the index access and size operation.
Definition densematrix.hh:166
│ │ │ +
Traits::const_row_reference const_row_reference
The type used to represent a reference to a constant row (usually const row_type &)
Definition densematrix.hh:175
│ │ │ +
FieldTraits< value_type >::real_type frobenius_norm2() const
square of frobenius norm, need for block recursion
Definition densematrix.hh:536
│ │ │ +
std::remove_reference< row_reference >::type::Iterator ColIterator
rename the iterators for easier access
Definition densematrix.hh:213
│ │ │ +
Traits::row_reference row_reference
The type used to represent a reference to a row (usually row_type &)
Definition densematrix.hh:172
│ │ │ +
bool operator==(const DenseMatrix< Other > &x) const
Binary matrix comparison.
Definition densematrix.hh:348
│ │ │ +
Iterator iterator
typedef for stl compliant access
Definition densematrix.hh:209
│ │ │ +
ConstIterator ConstRowIterator
rename the iterators for easier access
Definition densematrix.hh:246
│ │ │ +
DenseIterator< DenseMatrix, row_type, row_reference > Iterator
Iterator class for sequential access.
Definition densematrix.hh:207
│ │ │ +
void umtv(const X &x, Y &y) const
y += A^T x
Definition densematrix.hh:419
│ │ │ +
ConstIterator begin() const
begin iterator
Definition densematrix.hh:251
│ │ │ +
field_type determinant(bool doPivoting=true) const
calculates the determinant of this matrix
│ │ │ +
Iterator begin()
begin iterator
Definition densematrix.hh:216
│ │ │ +
void umhv(const X &x, Y &y) const
y += A^H x
Definition densematrix.hh:432
│ │ │ +
derived_type & operator+=(const DenseMatrix< Other > &x)
vector space addition
Definition densematrix.hh:289
│ │ │ +
ConstIterator end() const
end iterator
Definition densematrix.hh:257
│ │ │ +
const FieldTraits< typenameDenseMatVecTraits< M >::value_type >::real_type real_type
Definition densematrix.hh:34
│ │ │ +
const FieldTraits< typenameDenseMatVecTraits< M >::value_type >::field_type field_type
Definition densematrix.hh:33
│ │ │ +
A dense n x m matrix.
Definition fmatrix.hh:117
│ │ │ +
Base::size_type size_type
Definition fmatrix.hh:127
│ │ │ +
vector space out of a tensor product of fields.
Definition fvector.hh:91
│ │ │ +
you have to specialize this structure for any type that should be assignable to a DenseMatrix
Definition densematrix.hh:59
│ │ │ +
Error thrown if operations of a FieldMatrix fail.
Definition densematrix.hh:126
│ │ │ +
Interface for a class of dense vectors over a given field.
Definition densevector.hh:229
│ │ │ +
size_type size() const
size method
Definition densevector.hh:336
│ │ │ +
Generic iterator class for dense vector and matrix implementations.
Definition densevector.hh:131
│ │ │ +
Default exception class for mathematical errors.
Definition exceptions.hh:241
│ │ │ +
Definition ftraits.hh:26
│ │ │ +
T field_type
export the type representing the field
Definition ftraits.hh:28
│ │ │ +
T real_type
export the type representing the real type of the field
Definition ftraits.hh:30
│ │ │ +
Definition matvectraits.hh:31
│ │ │ +
static ctype absolute_limit()
return threshold to declare matrix singular
Definition precision.hh:28
│ │ │ +
Include file for users of the SIMD abstraction layer.
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,44 +1,1521 @@ │ │ │ │ dune-common 2.10 │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ * _d_u_n_e │ │ │ │ * _c_o_m_m_o_n │ │ │ │ -visibility.hh │ │ │ │ +densematrix.hh │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ LICENSE.md in module root │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ -5#ifndef DUNE_COMMON_VISIBILITY_HH │ │ │ │ -6#define DUNE_COMMON_VISIBILITY_HH │ │ │ │ +5#ifndef DUNE_DENSEMATRIX_HH │ │ │ │ +6#define DUNE_DENSEMATRIX_HH │ │ │ │ 7 │ │ │ │ -12#ifdef DOXYGEN │ │ │ │ -13 │ │ │ │ -15 │ │ │ │ -_2_0#define DUNE_EXPORT implementation_defined │ │ │ │ -21 │ │ │ │ -23 │ │ │ │ -_2_8#define DUNE_PRIVATE implementation_defined │ │ │ │ +8#include │ │ │ │ +9#include │ │ │ │ +10#include │ │ │ │ +11#include │ │ │ │ +12#include │ │ │ │ +13#include │ │ │ │ +14 │ │ │ │ +15#include <_d_u_n_e_/_c_o_m_m_o_n_/_b_o_u_n_d_s_c_h_e_c_k_i_n_g_._h_h> │ │ │ │ +16#include <_d_u_n_e_/_c_o_m_m_o_n_/_c_l_a_s_s_n_a_m_e_._h_h> │ │ │ │ +17#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ +18#include <_d_u_n_e_/_c_o_m_m_o_n_/_f_v_e_c_t_o_r_._h_h> │ │ │ │ +19#include <_d_u_n_e_/_c_o_m_m_o_n_/_m_a_t_h_._h_h> │ │ │ │ +20#include <_d_u_n_e_/_c_o_m_m_o_n_/_p_r_e_c_i_s_i_o_n_._h_h> │ │ │ │ +21#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_i_m_d_/_s_i_m_d_._h_h> │ │ │ │ +22#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ +23#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_c_a_l_a_r_v_e_c_t_o_r_v_i_e_w_._h_h> │ │ │ │ +24 │ │ │ │ +25namespace _D_u_n_e │ │ │ │ +26{ │ │ │ │ +27 │ │ │ │ +28 template class DenseMatrix; │ │ │ │ 29 │ │ │ │ -30#else // DOXYGEN │ │ │ │ -31 │ │ │ │ -32#if __GNUC__ >= 4 │ │ │ │ -33// GCC and Clang both define __GNUC__ to 4 and they both support the │ │ │ │ -visibility │ │ │ │ -34// attribute │ │ │ │ -35#define DUNE_EXPORT __attribute__((visibility("default"))) │ │ │ │ -36#define DUNE_PRIVATE __attribute__((visibility("hidden"))) │ │ │ │ -37#else │ │ │ │ -38// We don't know about the active compiler, so just turn the visibility │ │ │ │ -macros to no-ops. │ │ │ │ -39#define DUNE_EXPORT │ │ │ │ -40#define DUNE_PRIVATE │ │ │ │ -41#endif │ │ │ │ -42 │ │ │ │ -43#endif // DOXYGEN │ │ │ │ -44 │ │ │ │ -45#endif // DUNE_COMMON_VISIBILITY │ │ │ │ +30 template │ │ │ │ +_3_1 struct _F_i_e_l_d_T_r_a_i_t_s< _D_e_n_s_e_M_a_t_r_i_x > │ │ │ │ +32 { │ │ │ │ +_3_3 typedef const typename _F_i_e_l_d_T_r_a_i_t_s_<_ _t_y_p_e_n_a_m_e_ _D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_M_>_:_: │ │ │ │ +_v_a_l_u_e___t_y_p_e >_:_:_f_i_e_l_d___t_y_p_e _f_i_e_l_d___t_y_p_e; │ │ │ │ +_3_4 typedef const typename _F_i_e_l_d_T_r_a_i_t_s_<_ _t_y_p_e_n_a_m_e_ _D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_M_>_:_: │ │ │ │ +_v_a_l_u_e___t_y_p_e >_:_:_r_e_a_l___t_y_p_e _r_e_a_l___t_y_p_e; │ │ │ │ +35 }; │ │ │ │ +36 │ │ │ │ +37 template class _F_i_e_l_d_M_a_t_r_i_x; │ │ │ │ +38 template class _F_i_e_l_d_V_e_c_t_o_r; │ │ │ │ +39 │ │ │ │ +58 template< class DenseMatrix, class RHS > │ │ │ │ +_5_9 struct _D_e_n_s_e_M_a_t_r_i_x_A_s_s_i_g_n_e_r; │ │ │ │ +60 │ │ │ │ +61#ifndef DOXYGEN │ │ │ │ +62 namespace Impl │ │ │ │ +63 { │ │ │ │ +64 │ │ │ │ +65 template< class DenseMatrix, class RHS, class = void > │ │ │ │ +66 class _D_e_n_s_e_M_a_t_r_i_x_A_s_s_i_g_n_e_r │ │ │ │ +67 {}; │ │ │ │ +68 │ │ │ │ +69 template< class DenseMatrix, class RHS > │ │ │ │ +70 class _D_e_n_s_e_M_a_t_r_i_x_A_s_s_i_g_n_e_r< _D_e_n_s_e_M_a_t_r_i_x, RHS, _s_t_d::enable_if_t< Dune:: │ │ │ │ +IsNumber< RHS >::value > > │ │ │ │ +71 { │ │ │ │ +72 public: │ │ │ │ +73 static void apply ( _D_e_n_s_e_M_a_t_r_i_x &denseMatrix, const RHS &rhs ) │ │ │ │ +74 { │ │ │ │ +75 typedef typename _D_e_n_s_e_M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e field_type; │ │ │ │ +76 std::fill( denseMatrix._b_e_g_i_n(), denseMatrix._e_n_d(), static_cast< field_type > │ │ │ │ +( rhs ) ); │ │ │ │ +77 } │ │ │ │ +78 }; │ │ │ │ +79 │ │ │ │ +80 template< class DenseMatrix, class RHS > │ │ │ │ +81 class DenseMatrixAssigner< DenseMatrix, RHS, _s_t_d::enable_if_t< !std:: │ │ │ │ +is_same< typename RHS::const_iterator, void >::value │ │ │ │ +82 && std::is_convertible< typename RHS::const_iterator::value_type, typename │ │ │ │ +DenseMatrix::iterator::value_type >::value > > │ │ │ │ +83 { │ │ │ │ +84 public: │ │ │ │ +85 static void apply ( DenseMatrix &denseMatrix, const RHS &rhs ) │ │ │ │ +86 { │ │ │ │ +87 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(rhs.N() == denseMatrix.N()); │ │ │ │ +88 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(rhs.M() == denseMatrix.M()); │ │ │ │ +89 typename DenseMatrix::iterator tIt = std::begin(denseMatrix); │ │ │ │ +90 typename RHS::const_iterator sIt = std::begin(rhs); │ │ │ │ +91 for(; sIt != std::end(rhs); ++tIt, ++sIt) │ │ │ │ +92 std::copy(std::begin(*sIt), std::end(*sIt), std::begin(*tIt)); │ │ │ │ +93 } │ │ │ │ +94 }; │ │ │ │ +95 │ │ │ │ +96 } // namespace Impl │ │ │ │ +97 │ │ │ │ +98 │ │ │ │ +99 │ │ │ │ +100 template< class DenseMatrix, class RHS > │ │ │ │ +101 struct DenseMatrixAssigner │ │ │ │ +102 : public Impl::DenseMatrixAssigner< DenseMatrix, RHS > │ │ │ │ +103 {}; │ │ │ │ +104 │ │ │ │ +105 │ │ │ │ +106 namespace Impl │ │ │ │ +107 { │ │ │ │ +108 │ │ │ │ +109 template< class DenseMatrix, class RHS > │ │ │ │ +110 std::true_type hasDenseMatrixAssigner ( DenseMatrix &, const RHS &, │ │ │ │ +decltype( _D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_A_s_s_i_g_n_e_r_<_ _D_e_n_s_e_M_a_t_r_i_x_,_ _R_H_S_ _>_:_:_a_p_p_l_y( std::declval< │ │ │ │ +DenseMatrix & >(), std::declval< const RHS & >() ) ) * = nullptr ); │ │ │ │ +111 │ │ │ │ +112 std::false_type hasDenseMatrixAssigner ( ... ); │ │ │ │ +113 │ │ │ │ +114 } // namespace Impl │ │ │ │ +115 │ │ │ │ +116 template< class DenseMatrix, class RHS > │ │ │ │ +117 struct HasDenseMatrixAssigner │ │ │ │ +118 : public decltype( Impl::hasDenseMatrixAssigner( std::declval< DenseMatrix │ │ │ │ +& >(), std::declval< const RHS & >() ) ) │ │ │ │ +119 {}; │ │ │ │ +120 │ │ │ │ +121#endif // #ifndef DOXYGEN │ │ │ │ +122 │ │ │ │ +123 │ │ │ │ +124 │ │ │ │ +_1_2_6 class _F_M_a_t_r_i_x_E_r_r_o_r : public _M_a_t_h_E_r_r_o_r {}; │ │ │ │ +127 │ │ │ │ +138 template │ │ │ │ +_1_3_9 class _D_e_n_s_e_M_a_t_r_i_x │ │ │ │ +140 { │ │ │ │ +141 typedef _D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s_<_M_A_T_> _T_r_a_i_t_s; │ │ │ │ +142 │ │ │ │ +143 // Curiously recurring template pattern │ │ │ │ +144 constexpr MAT & asImp() { return static_cast(*this); } │ │ │ │ +145 constexpr const MAT & asImp() const { return static_cast │ │ │ │ +(*this); } │ │ │ │ +146 │ │ │ │ +147 template │ │ │ │ +_1_4_8 friend class _D_e_n_s_e_M_a_t_r_i_x; │ │ │ │ +149 │ │ │ │ +150 public: │ │ │ │ +151 //===== type definitions and constants │ │ │ │ +152 │ │ │ │ +_1_5_4 typedef typename Traits::derived_type _d_e_r_i_v_e_d___t_y_p_e; │ │ │ │ +155 │ │ │ │ +_1_5_7 typedef typename Traits::value_type _v_a_l_u_e___t_y_p_e; │ │ │ │ +158 │ │ │ │ +_1_6_0 typedef typename Traits::value_type _f_i_e_l_d___t_y_p_e; │ │ │ │ +161 │ │ │ │ +_1_6_3 typedef typename Traits::value_type _b_l_o_c_k___t_y_p_e; │ │ │ │ +164 │ │ │ │ +_1_6_6 typedef typename Traits::size_type _s_i_z_e___t_y_p_e; │ │ │ │ +167 │ │ │ │ +_1_6_9 typedef typename Traits::row_type _r_o_w___t_y_p_e; │ │ │ │ +170 │ │ │ │ +_1_7_2 typedef typename Traits::row_reference _r_o_w___r_e_f_e_r_e_n_c_e; │ │ │ │ +173 │ │ │ │ +_1_7_5 typedef typename Traits::const_row_reference _c_o_n_s_t___r_o_w___r_e_f_e_r_e_n_c_e; │ │ │ │ +176 │ │ │ │ +_1_7_8 constexpr static int _b_l_o_c_k_l_e_v_e_l = 1; │ │ │ │ +179 │ │ │ │ +180 private: │ │ │ │ +183 using simd_index_type = _S_i_m_d_:_:_R_e_b_i_n_d_<_s_t_d_:_:_s_i_z_e___t_,_ _v_a_l_u_e___t_y_p_e_>; │ │ │ │ +184 │ │ │ │ +185 public: │ │ │ │ +186 //===== access to components │ │ │ │ +187 │ │ │ │ +_1_8_9 _r_o_w___r_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_[_]_ ( _s_i_z_e___t_y_p_e i ) │ │ │ │ +190 { │ │ │ │ +191 return asImp().mat_access(i); │ │ │ │ +192 } │ │ │ │ +193 │ │ │ │ +_1_9_4 _c_o_n_s_t___r_o_w___r_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_[_]_ ( _s_i_z_e___t_y_p_e i ) const │ │ │ │ +195 { │ │ │ │ +196 return asImp().mat_access(i); │ │ │ │ +197 } │ │ │ │ +198 │ │ │ │ +_2_0_0 _s_i_z_e___t_y_p_e _s_i_z_e() const │ │ │ │ +201 { │ │ │ │ +202 return _r_o_w_s(); │ │ │ │ +203 } │ │ │ │ +204 │ │ │ │ +205 //===== iterator interface to rows of the matrix │ │ │ │ +_2_0_7 typedef _D_e_n_s_e_I_t_e_r_a_t_o_r_<_D_e_n_s_e_M_a_t_r_i_x_,_r_o_w___t_y_p_e_,_r_o_w___r_e_f_e_r_e_n_c_e_> _I_t_e_r_a_t_o_r; │ │ │ │ +_2_0_9 typedef _I_t_e_r_a_t_o_r _i_t_e_r_a_t_o_r; │ │ │ │ +_2_1_1 typedef _I_t_e_r_a_t_o_r _R_o_w_I_t_e_r_a_t_o_r; │ │ │ │ +_2_1_3 typedef typename std::remove_reference::type::Iterator │ │ │ │ +_C_o_l_I_t_e_r_a_t_o_r; │ │ │ │ +214 │ │ │ │ +_2_1_6 _I_t_e_r_a_t_o_r _b_e_g_i_n () │ │ │ │ +217 { │ │ │ │ +218 return _I_t_e_r_a_t_o_r(*this,0); │ │ │ │ +219 } │ │ │ │ +220 │ │ │ │ +_2_2_2 _I_t_e_r_a_t_o_r _e_n_d () │ │ │ │ +223 { │ │ │ │ +224 return _I_t_e_r_a_t_o_r(*this,_r_o_w_s()); │ │ │ │ +225 } │ │ │ │ +226 │ │ │ │ +_2_2_9 _I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d () │ │ │ │ +230 { │ │ │ │ +231 return _I_t_e_r_a_t_o_r(*this,_r_o_w_s()-1); │ │ │ │ +232 } │ │ │ │ +233 │ │ │ │ +_2_3_6 _I_t_e_r_a_t_o_r _b_e_f_o_r_e_B_e_g_i_n () │ │ │ │ +237 { │ │ │ │ +238 return _I_t_e_r_a_t_o_r(*this,-1); │ │ │ │ +239 } │ │ │ │ +240 │ │ │ │ +_2_4_2 typedef _D_e_n_s_e_I_t_e_r_a_t_o_r_<_c_o_n_s_t_ _D_e_n_s_e_M_a_t_r_i_x_,_c_o_n_s_t_ _r_o_w___t_y_p_e_,_c_o_n_s_t___r_o_w___r_e_f_e_r_e_n_c_e_> │ │ │ │ +_C_o_n_s_t_I_t_e_r_a_t_o_r; │ │ │ │ +_2_4_4 typedef _C_o_n_s_t_I_t_e_r_a_t_o_r _c_o_n_s_t___i_t_e_r_a_t_o_r; │ │ │ │ +_2_4_6 typedef _C_o_n_s_t_I_t_e_r_a_t_o_r _C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r; │ │ │ │ +_2_4_8 typedef typename std::remove_reference::type:: │ │ │ │ +ConstIterator _C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r; │ │ │ │ +249 │ │ │ │ +_2_5_1 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_g_i_n () const │ │ │ │ +252 { │ │ │ │ +253 return _C_o_n_s_t_I_t_e_r_a_t_o_r(*this,0); │ │ │ │ +254 } │ │ │ │ +255 │ │ │ │ +_2_5_7 _C_o_n_s_t_I_t_e_r_a_t_o_r _e_n_d () const │ │ │ │ +258 { │ │ │ │ +259 return _C_o_n_s_t_I_t_e_r_a_t_o_r(*this,_r_o_w_s()); │ │ │ │ +260 } │ │ │ │ +261 │ │ │ │ +_2_6_4 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_f_o_r_e_E_n_d () const │ │ │ │ +265 { │ │ │ │ +266 return _C_o_n_s_t_I_t_e_r_a_t_o_r(*this,_r_o_w_s()-1); │ │ │ │ +267 } │ │ │ │ +268 │ │ │ │ +_2_7_1 _C_o_n_s_t_I_t_e_r_a_t_o_r _b_e_f_o_r_e_B_e_g_i_n () const │ │ │ │ +272 { │ │ │ │ +273 return _C_o_n_s_t_I_t_e_r_a_t_o_r(*this,-1); │ │ │ │ +274 } │ │ │ │ +275 │ │ │ │ +276 //===== assignment │ │ │ │ +277 │ │ │ │ +278 template< class RHS, class = std::enable_if_t< HasDenseMatrixAssigner< MAT, │ │ │ │ +RHS >::value > > │ │ │ │ +_2_7_9 _d_e_r_i_v_e_d___t_y_p_e &_o_p_e_r_a_t_o_r_=_ ( const RHS &rhs ) │ │ │ │ +280 { │ │ │ │ +281 _D_e_n_s_e_M_a_t_r_i_x_A_s_s_i_g_n_e_r_<_ _M_A_T_,_ _R_H_S_ _>_:_:_a_p_p_l_y( asImp(), rhs ); │ │ │ │ +282 return asImp(); │ │ │ │ +283 } │ │ │ │ +284 │ │ │ │ +285 //===== vector space arithmetic │ │ │ │ +286 │ │ │ │ +288 template │ │ │ │ +_2_8_9 _d_e_r_i_v_e_d___t_y_p_e &_o_p_e_r_a_t_o_r_+_=_ (const _D_e_n_s_e_M_a_t_r_i_x_<_O_t_h_e_r_>& x) │ │ │ │ +290 { │ │ │ │ +291 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(_r_o_w_s() == x._r_o_w_s()); │ │ │ │ +292 for (_s_i_z_e___t_y_p_e i=0; i<_r_o_w_s(); i++) │ │ │ │ +293 (*this)[i] += x[i]; │ │ │ │ +294 return asImp(); │ │ │ │ +295 } │ │ │ │ +296 │ │ │ │ +_2_9_8 _d_e_r_i_v_e_d___t_y_p_e _o_p_e_r_a_t_o_r_-_ () const │ │ │ │ +299 { │ │ │ │ +300 MAT result; │ │ │ │ +301 using idx_type = typename decltype(result)_:_:_s_i_z_e___t_y_p_e; │ │ │ │ +302 │ │ │ │ +303 for (idx_type i = 0; i < _r_o_w_s(); ++i) │ │ │ │ +304 for (idx_type j = 0; j < _c_o_l_s(); ++j) │ │ │ │ +305 result[i][j] = - asImp()[i][j]; │ │ │ │ +306 │ │ │ │ +307 return result; │ │ │ │ +308 } │ │ │ │ +309 │ │ │ │ +311 template │ │ │ │ +_3_1_2 _d_e_r_i_v_e_d___t_y_p_e &_o_p_e_r_a_t_o_r_-_=_ (const _D_e_n_s_e_M_a_t_r_i_x_<_O_t_h_e_r_>& x) │ │ │ │ +313 { │ │ │ │ +314 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(_r_o_w_s() == x._r_o_w_s()); │ │ │ │ +315 for (_s_i_z_e___t_y_p_e i=0; i<_r_o_w_s(); i++) │ │ │ │ +316 (*this)[i] -= x[i]; │ │ │ │ +317 return asImp(); │ │ │ │ +318 } │ │ │ │ +319 │ │ │ │ +_3_2_1 _d_e_r_i_v_e_d___t_y_p_e &_o_p_e_r_a_t_o_r_*_=_ (const _f_i_e_l_d___t_y_p_e& k) │ │ │ │ +322 { │ │ │ │ +323 for (_s_i_z_e___t_y_p_e i=0; i<_r_o_w_s(); i++) │ │ │ │ +324 (*this)[i] *= k; │ │ │ │ +325 return asImp(); │ │ │ │ +326 } │ │ │ │ +327 │ │ │ │ +_3_2_9 _d_e_r_i_v_e_d___t_y_p_e &_o_p_e_r_a_t_o_r_/_=_ (const _f_i_e_l_d___t_y_p_e& k) │ │ │ │ +330 { │ │ │ │ +331 for (_s_i_z_e___t_y_p_e i=0; i<_r_o_w_s(); i++) │ │ │ │ +332 (*this)[i] /= k; │ │ │ │ +333 return asImp(); │ │ │ │ +334 } │ │ │ │ +335 │ │ │ │ +337 template │ │ │ │ +_3_3_8 _d_e_r_i_v_e_d___t_y_p_e &_a_x_p_y (const _f_i_e_l_d___t_y_p_e &a, const _D_e_n_s_e_M_a_t_r_i_x_<_O_t_h_e_r_> &x ) │ │ │ │ +339 { │ │ │ │ +340 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(_r_o_w_s() == x._r_o_w_s()); │ │ │ │ +341 for( _s_i_z_e___t_y_p_e i = 0; i < _r_o_w_s(); ++i ) │ │ │ │ +342 (*this)[ i ].axpy( a, x[ i ] ); │ │ │ │ +343 return asImp(); │ │ │ │ +344 } │ │ │ │ +345 │ │ │ │ +347 template │ │ │ │ +_3_4_8 bool _o_p_e_r_a_t_o_r_=_=_ (const _D_e_n_s_e_M_a_t_r_i_x_<_O_t_h_e_r_>& x) const │ │ │ │ +349 { │ │ │ │ +350 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(_r_o_w_s() == x._r_o_w_s()); │ │ │ │ +351 for (_s_i_z_e___t_y_p_e i=0; i<_r_o_w_s(); i++) │ │ │ │ +352 if ((*this)[i]!=x[i]) │ │ │ │ +353 return false; │ │ │ │ +354 return true; │ │ │ │ +355 } │ │ │ │ +357 template │ │ │ │ +_3_5_8 bool _o_p_e_r_a_t_o_r_!_=_ (const _D_e_n_s_e_M_a_t_r_i_x_<_O_t_h_e_r_>& x) const │ │ │ │ +359 { │ │ │ │ +360 return !_o_p_e_r_a_t_o_r_=_=(x); │ │ │ │ +361 } │ │ │ │ +362 │ │ │ │ +363 │ │ │ │ +364 //===== linear maps │ │ │ │ +365 │ │ │ │ +367 template │ │ │ │ +_3_6_8 void _m_v (const X& x, Y& y) const │ │ │ │ +369 { │ │ │ │ +370 auto&& xx = Impl::asVector(x); │ │ │ │ +371 auto&& yy = Impl::asVector(y); │ │ │ │ +372 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S((void*)(&x) != (void*)(&y)); │ │ │ │ +373 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(xx.N() == _M()); │ │ │ │ +374 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(yy.N() == _N()); │ │ │ │ +375 │ │ │ │ +376 using y_field_type = typename _F_i_e_l_d_T_r_a_i_t_s_<_Y_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ +377 for (_s_i_z_e___t_y_p_e i=0; i<_r_o_w_s(); ++i) │ │ │ │ +378 { │ │ │ │ +379 yy[i] = y_field_type(0); │ │ │ │ +380 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s(); j++) │ │ │ │ +381 yy[i] += (*this)[i][j] * xx[j]; │ │ │ │ +382 } │ │ │ │ +383 } │ │ │ │ +384 │ │ │ │ +386 template< class X, class Y > │ │ │ │ +_3_8_7 void _m_t_v ( const X &x, Y &y ) const │ │ │ │ +388 { │ │ │ │ +389 auto&& xx = Impl::asVector(x); │ │ │ │ +390 auto&& yy = Impl::asVector(y); │ │ │ │ +391 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S((void*)(&x) != (void*)(&y)); │ │ │ │ +392 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(xx.N() == _N()); │ │ │ │ +393 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(yy.N() == _M()); │ │ │ │ +394 │ │ │ │ +395 using y_field_type = typename _F_i_e_l_d_T_r_a_i_t_s_<_Y_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ +396 for(_s_i_z_e___t_y_p_e i = 0; i < _c_o_l_s(); ++i) │ │ │ │ +397 { │ │ │ │ +398 yy[i] = y_field_type(0); │ │ │ │ +399 for(_s_i_z_e___t_y_p_e j = 0; j < _r_o_w_s(); ++j) │ │ │ │ +400 yy[i] += (*this)[j][i] * xx[j]; │ │ │ │ +401 } │ │ │ │ +402 } │ │ │ │ +403 │ │ │ │ +405 template │ │ │ │ +_4_0_6 void _u_m_v (const X& x, Y& y) const │ │ │ │ +407 { │ │ │ │ +408 auto&& xx = Impl::asVector(x); │ │ │ │ +409 auto&& yy = Impl::asVector(y); │ │ │ │ +410 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(xx.N() == _M()); │ │ │ │ +411 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(yy.N() == _N()); │ │ │ │ +412 for (_s_i_z_e___t_y_p_e i=0; i<_r_o_w_s(); ++i) │ │ │ │ +413 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s(); j++) │ │ │ │ +414 yy[i] += (*this)[i][j] * xx[j]; │ │ │ │ +415 } │ │ │ │ +416 │ │ │ │ +418 template │ │ │ │ +_4_1_9 void _u_m_t_v (const X& x, Y& y) const │ │ │ │ +420 { │ │ │ │ +421 auto&& xx = Impl::asVector(x); │ │ │ │ +422 auto&& yy = Impl::asVector(y); │ │ │ │ +423 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(xx.N() == _N()); │ │ │ │ +424 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(yy.N() == _M()); │ │ │ │ +425 for(_s_i_z_e___t_y_p_e i = 0; i<_r_o_w_s(); ++i) │ │ │ │ +426 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s(); j++) │ │ │ │ +427 yy[j] += (*this)[i][j]*xx[i]; │ │ │ │ +428 } │ │ │ │ +429 │ │ │ │ +431 template │ │ │ │ +_4_3_2 void _u_m_h_v (const X& x, Y& y) const │ │ │ │ +433 { │ │ │ │ +434 auto&& xx = Impl::asVector(x); │ │ │ │ +435 auto&& yy = Impl::asVector(y); │ │ │ │ +436 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(xx.N() == _N()); │ │ │ │ +437 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(yy.N() == _M()); │ │ │ │ +438 for (_s_i_z_e___t_y_p_e i=0; i<_r_o_w_s(); i++) │ │ │ │ +439 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s(); j++) │ │ │ │ +440 yy[j] += _c_o_n_j_u_g_a_t_e_C_o_m_p_l_e_x((*this)[i][j])*xx[i]; │ │ │ │ +441 } │ │ │ │ +442 │ │ │ │ +444 template │ │ │ │ +_4_4_5 void _m_m_v (const X& x, Y& y) const │ │ │ │ +446 { │ │ │ │ +447 auto&& xx = Impl::asVector(x); │ │ │ │ +448 auto&& yy = Impl::asVector(y); │ │ │ │ +449 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(xx.N() == _M()); │ │ │ │ +450 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(yy.N() == _N()); │ │ │ │ +451 for (_s_i_z_e___t_y_p_e i=0; i<_r_o_w_s(); i++) │ │ │ │ +452 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s(); j++) │ │ │ │ +453 yy[i] -= (*this)[i][j] * xx[j]; │ │ │ │ +454 } │ │ │ │ +455 │ │ │ │ +457 template │ │ │ │ +_4_5_8 void _m_m_t_v (const X& x, Y& y) const │ │ │ │ +459 { │ │ │ │ +460 auto&& xx = Impl::asVector(x); │ │ │ │ +461 auto&& yy = Impl::asVector(y); │ │ │ │ +462 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(xx.N() == _N()); │ │ │ │ +463 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(yy.N() == _M()); │ │ │ │ +464 for (_s_i_z_e___t_y_p_e i=0; i<_r_o_w_s(); i++) │ │ │ │ +465 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s(); j++) │ │ │ │ +466 yy[j] -= (*this)[i][j]*xx[i]; │ │ │ │ +467 } │ │ │ │ +468 │ │ │ │ +470 template │ │ │ │ +_4_7_1 void _m_m_h_v (const X& x, Y& y) const │ │ │ │ +472 { │ │ │ │ +473 auto&& xx = Impl::asVector(x); │ │ │ │ +474 auto&& yy = Impl::asVector(y); │ │ │ │ +475 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(xx.N() == _N()); │ │ │ │ +476 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(yy.N() == _M()); │ │ │ │ +477 for (_s_i_z_e___t_y_p_e i=0; i<_r_o_w_s(); i++) │ │ │ │ +478 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s(); j++) │ │ │ │ +479 yy[j] -= _c_o_n_j_u_g_a_t_e_C_o_m_p_l_e_x((*this)[i][j])*xx[i]; │ │ │ │ +480 } │ │ │ │ +481 │ │ │ │ +483 template │ │ │ │ +_4_8_4 void _u_s_m_v (const typename _F_i_e_l_d_T_r_a_i_t_s_<_Y_>_:_:_f_i_e_l_d___t_y_p_e & alpha, │ │ │ │ +485 const X& x, Y& y) const │ │ │ │ +486 { │ │ │ │ +487 auto&& xx = Impl::asVector(x); │ │ │ │ +488 auto&& yy = Impl::asVector(y); │ │ │ │ +489 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(xx.N() == _M()); │ │ │ │ +490 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(yy.N() == _N()); │ │ │ │ +491 for (_s_i_z_e___t_y_p_e i=0; i<_r_o_w_s(); i++) │ │ │ │ +492 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s(); j++) │ │ │ │ +493 yy[i] += alpha * (*this)[i][j] * xx[j]; │ │ │ │ +494 } │ │ │ │ +495 │ │ │ │ +497 template │ │ │ │ +_4_9_8 void _u_s_m_t_v (const typename _F_i_e_l_d_T_r_a_i_t_s_<_Y_>_:_:_f_i_e_l_d___t_y_p_e & alpha, │ │ │ │ +499 const X& x, Y& y) const │ │ │ │ +500 { │ │ │ │ +501 auto&& xx = Impl::asVector(x); │ │ │ │ +502 auto&& yy = Impl::asVector(y); │ │ │ │ +503 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(xx.N() == _N()); │ │ │ │ +504 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(yy.N() == _M()); │ │ │ │ +505 for (_s_i_z_e___t_y_p_e i=0; i<_r_o_w_s(); i++) │ │ │ │ +506 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s(); j++) │ │ │ │ +507 yy[j] += alpha*(*this)[i][j]*xx[i]; │ │ │ │ +508 } │ │ │ │ +509 │ │ │ │ +511 template │ │ │ │ +_5_1_2 void _u_s_m_h_v (const typename _F_i_e_l_d_T_r_a_i_t_s_<_Y_>_:_:_f_i_e_l_d___t_y_p_e & alpha, │ │ │ │ +513 const X& x, Y& y) const │ │ │ │ +514 { │ │ │ │ +515 auto&& xx = Impl::asVector(x); │ │ │ │ +516 auto&& yy = Impl::asVector(y); │ │ │ │ +517 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(xx.N() == _N()); │ │ │ │ +518 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(yy.N() == _M()); │ │ │ │ +519 for (_s_i_z_e___t_y_p_e i=0; i<_r_o_w_s(); i++) │ │ │ │ +520 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s(); j++) │ │ │ │ +521 yy[j] += │ │ │ │ +522 alpha*_c_o_n_j_u_g_a_t_e_C_o_m_p_l_e_x((*this)[i][j])*xx[i]; │ │ │ │ +523 } │ │ │ │ +524 │ │ │ │ +525 //===== norms │ │ │ │ +526 │ │ │ │ +_5_2_8 typename _F_i_e_l_d_T_r_a_i_t_s_<_v_a_l_u_e___t_y_p_e_>_:_:_r_e_a_l___t_y_p_e _f_r_o_b_e_n_i_u_s___n_o_r_m () const │ │ │ │ +529 { │ │ │ │ +530 typename _F_i_e_l_d_T_r_a_i_t_s_<_v_a_l_u_e___t_y_p_e_>_:_:_r_e_a_l___t_y_p_e sum=(0.0); │ │ │ │ +531 for (_s_i_z_e___t_y_p_e i=0; i<_r_o_w_s(); ++i) sum += (*this)[i].two_norm2(); │ │ │ │ +532 return fvmeta::sqrt(sum); │ │ │ │ +533 } │ │ │ │ +534 │ │ │ │ +_5_3_6 typename _F_i_e_l_d_T_r_a_i_t_s_<_v_a_l_u_e___t_y_p_e_>_:_:_r_e_a_l___t_y_p_e _f_r_o_b_e_n_i_u_s___n_o_r_m_2 () const │ │ │ │ +537 { │ │ │ │ +538 typename _F_i_e_l_d_T_r_a_i_t_s_<_v_a_l_u_e___t_y_p_e_>_:_:_r_e_a_l___t_y_p_e sum=(0.0); │ │ │ │ +539 for (_s_i_z_e___t_y_p_e i=0; i<_r_o_w_s(); ++i) sum += (*this)[i].two_norm2(); │ │ │ │ +540 return sum; │ │ │ │ +541 } │ │ │ │ +542 │ │ │ │ +544 template ::value, int>::type = 0> │ │ │ │ +_5_4_6 typename _F_i_e_l_d_T_r_a_i_t_s_<_v_t_>_:_:_r_e_a_l___t_y_p_e _i_n_f_i_n_i_t_y___n_o_r_m() const { │ │ │ │ +547 using real_type = typename _F_i_e_l_d_T_r_a_i_t_s_<_v_t_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ +548 using std::max; │ │ │ │ +549 │ │ │ │ +550 real_type norm = 0; │ │ │ │ +551 for (auto const &x : *this) { │ │ │ │ +552 real_type const a = x.one_norm(); │ │ │ │ +553 norm = max(a, norm); │ │ │ │ +554 } │ │ │ │ +555 return norm; │ │ │ │ +556 } │ │ │ │ +557 │ │ │ │ +559 template ::value, int>::type = 0> │ │ │ │ +_5_6_1 typename _F_i_e_l_d_T_r_a_i_t_s_<_v_t_>_:_:_r_e_a_l___t_y_p_e _i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l() const { │ │ │ │ +562 using real_type = typename _F_i_e_l_d_T_r_a_i_t_s_<_v_t_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ +563 using std::max; │ │ │ │ +564 │ │ │ │ +565 real_type norm = 0; │ │ │ │ +566 for (auto const &x : *this) { │ │ │ │ +567 real_type const a = x.one_norm_real(); │ │ │ │ +568 norm = max(a, norm); │ │ │ │ +569 } │ │ │ │ +570 return norm; │ │ │ │ +571 } │ │ │ │ +572 │ │ │ │ +574 template ::value, int>::type = 0> │ │ │ │ +_5_7_6 typename _F_i_e_l_d_T_r_a_i_t_s_<_v_t_>_:_:_r_e_a_l___t_y_p_e _i_n_f_i_n_i_t_y___n_o_r_m() const { │ │ │ │ +577 using real_type = typename _F_i_e_l_d_T_r_a_i_t_s_<_v_t_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ +578 using std::max; │ │ │ │ +579 │ │ │ │ +580 real_type norm = 0; │ │ │ │ +581 real_type isNaN = 1; │ │ │ │ +582 for (auto const &x : *this) { │ │ │ │ +583 real_type const a = x.one_norm(); │ │ │ │ +584 norm = max(a, norm); │ │ │ │ +585 isNaN += a; │ │ │ │ +586 } │ │ │ │ +587 return norm * (isNaN / isNaN); │ │ │ │ +588 } │ │ │ │ +589 │ │ │ │ +591 template ::value, int>::type = 0> │ │ │ │ +_5_9_3 typename _F_i_e_l_d_T_r_a_i_t_s_<_v_t_>_:_:_r_e_a_l___t_y_p_e _i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l() const { │ │ │ │ +594 using real_type = typename _F_i_e_l_d_T_r_a_i_t_s_<_v_t_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ +595 using std::max; │ │ │ │ +596 │ │ │ │ +597 real_type norm = 0; │ │ │ │ +598 real_type isNaN = 1; │ │ │ │ +599 for (auto const &x : *this) { │ │ │ │ +600 real_type const a = x.one_norm_real(); │ │ │ │ +601 norm = max(a, norm); │ │ │ │ +602 isNaN += a; │ │ │ │ +603 } │ │ │ │ +604 return norm * (isNaN / isNaN); │ │ │ │ +605 } │ │ │ │ +606 │ │ │ │ +607 //===== solve │ │ │ │ +608 │ │ │ │ +613 template │ │ │ │ +_6_1_4 void _s_o_l_v_e (V1& x, const V2& b, bool doPivoting = true) const; │ │ │ │ +615 │ │ │ │ +_6_2_0 void _i_n_v_e_r_t(bool doPivoting = true); │ │ │ │ +621 │ │ │ │ +_6_2_3 _f_i_e_l_d___t_y_p_e _d_e_t_e_r_m_i_n_a_n_t (bool doPivoting = true) const; │ │ │ │ +624 │ │ │ │ +626 template │ │ │ │ +_6_2_7 MAT& _l_e_f_t_m_u_l_t_i_p_l_y (const _D_e_n_s_e_M_a_t_r_i_x_<_M_2_>& _M) │ │ │ │ +628 { │ │ │ │ +629 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(_M.rows() == _M.cols()); │ │ │ │ +630 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(_M.rows() == _r_o_w_s()); │ │ │ │ +631 _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_<_M_A_T_> C(asImp()); │ │ │ │ +632 │ │ │ │ +633 for (_s_i_z_e___t_y_p_e i=0; i<_r_o_w_s(); i++) │ │ │ │ +634 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s(); j++) { │ │ │ │ +635 (*this)[i][j] = 0; │ │ │ │ +636 for (_s_i_z_e___t_y_p_e k=0; k<_r_o_w_s(); k++) │ │ │ │ +637 (*this)[i][j] += _M[i][k]*C[k][j]; │ │ │ │ +638 } │ │ │ │ +639 │ │ │ │ +640 return asImp(); │ │ │ │ +641 } │ │ │ │ +642 │ │ │ │ +644 template │ │ │ │ +_6_4_5 MAT& _r_i_g_h_t_m_u_l_t_i_p_l_y (const _D_e_n_s_e_M_a_t_r_i_x_<_M_2_>& _M) │ │ │ │ +646 { │ │ │ │ +647 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(_M.rows() == _M.cols()); │ │ │ │ +648 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(_M.cols() == _c_o_l_s()); │ │ │ │ +649 _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_<_M_A_T_> C(asImp()); │ │ │ │ +650 │ │ │ │ +651 for (_s_i_z_e___t_y_p_e i=0; i<_r_o_w_s(); i++) │ │ │ │ +652 for (_s_i_z_e___t_y_p_e j=0; j<_c_o_l_s(); j++) { │ │ │ │ +653 (*this)[i][j] = 0; │ │ │ │ +654 for (_s_i_z_e___t_y_p_e k=0; k<_c_o_l_s(); k++) │ │ │ │ +655 (*this)[i][j] += C[i][k]*_M[k][j]; │ │ │ │ +656 } │ │ │ │ +657 return asImp(); │ │ │ │ +658 } │ │ │ │ +659 │ │ │ │ +660#if 0 │ │ │ │ +662 template │ │ │ │ +663 _D_e_n_s_e_M_a_t_r_i_x_<_K_,_l_,_c_o_l_s_> leftmultiplyany (const _F_i_e_l_d_M_a_t_r_i_x_<_K_,_l_,_r_o_w_s_>& _M) │ │ │ │ +const │ │ │ │ +664 { │ │ │ │ +665 _F_i_e_l_d_M_a_t_r_i_x_<_K_,_l_,_c_o_l_s_> C; │ │ │ │ +666 │ │ │ │ +667 for (_s_i_z_e___t_y_p_e i=0; i │ │ │ │ +679 FieldMatrix rightmultiplyany (const FieldMatrix& _M) │ │ │ │ +const │ │ │ │ +680 { │ │ │ │ +681 FieldMatrix C; │ │ │ │ +682 │ │ │ │ +683 for (_s_i_z_e___t_y_p_e i=0; i<_r_o_w_s(); i++) { │ │ │ │ +684 for (_s_i_z_e___t_y_p_e j=0; j= 0 && i < _r_o_w_s()); │ │ │ │ +726 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(j >= 0 && j < _c_o_l_s()); │ │ │ │ +727 return true; │ │ │ │ +728 } │ │ │ │ +729 │ │ │ │ +730 protected: │ │ │ │ +731 │ │ │ │ +732#ifndef DOXYGEN │ │ │ │ +733 struct ElimPivot │ │ │ │ +734 { │ │ │ │ +735 ElimPivot(std::vector & pivot); │ │ │ │ +736 │ │ │ │ +737 void _s_w_a_p(std::size_t i, simd_index_type j); │ │ │ │ +738 │ │ │ │ +739 template │ │ │ │ +740 void operator()(const T&, int, int) │ │ │ │ +741 {} │ │ │ │ +742 │ │ │ │ +743 std::vector & pivot_; │ │ │ │ +744 }; │ │ │ │ +745 │ │ │ │ +746 template │ │ │ │ +747 struct Elim │ │ │ │ +748 { │ │ │ │ +749 Elim(V& rhs); │ │ │ │ +750 │ │ │ │ +751 void _s_w_a_p(std::size_t i, simd_index_type j); │ │ │ │ +752 │ │ │ │ +753 void operator()(const typename V::field_type& factor, int k, int i); │ │ │ │ +754 │ │ │ │ +755 V* rhs_; │ │ │ │ +756 }; │ │ │ │ +757 │ │ │ │ +758 struct ElimDet │ │ │ │ +759 { │ │ │ │ +760 ElimDet(field_type& sign) : sign_(_s_i_g_n) │ │ │ │ +761 { sign_ = 1; } │ │ │ │ +762 │ │ │ │ +763 void _s_w_a_p(std::size_t i, simd_index_type j) │ │ │ │ +764 { │ │ │ │ +765 sign_ *= │ │ │ │ +766 Simd::cond(simd_index_type(i) == j, field_type(1), field_type(-1)); │ │ │ │ +767 } │ │ │ │ +768 │ │ │ │ +769 void operator()(const field_type&, int, int) │ │ │ │ +770 {} │ │ │ │ +771 │ │ │ │ +772 field_type& sign_; │ │ │ │ +773 }; │ │ │ │ +774#endif // DOXYGEN │ │ │ │ +775 │ │ │ │ +777 │ │ │ │ +815 template │ │ │ │ +_8_1_6 static void _l_u_D_e_c_o_m_p_o_s_i_t_i_o_n(_D_e_n_s_e_M_a_t_r_i_x_<_M_A_T_>& A, Func func, │ │ │ │ +817 Mask &nonsingularLanes, bool throwEarly, bool doPivoting); │ │ │ │ +818 }; │ │ │ │ +819 │ │ │ │ +820#ifndef DOXYGEN │ │ │ │ +821 template │ │ │ │ +822 _D_e_n_s_e_M_a_t_r_i_x_<_M_A_T_>_:_:_E_l_i_m_P_i_v_o_t_:_:_E_l_i_m_P_i_v_o_t(std::vector & │ │ │ │ +pivot) │ │ │ │ +823 : pivot_(pivot) │ │ │ │ +824 { │ │ │ │ +825 typedef typename std::vector::size_type _s_i_z_e___t_y_p_e; │ │ │ │ +826 for(_s_i_z_e___t_y_p_e i=0; i < pivot_.size(); ++i) pivot_[i]=i; │ │ │ │ +827 } │ │ │ │ +828 │ │ │ │ +829 template │ │ │ │ +830 void DenseMatrix::ElimPivot::swap(std::size_t i, simd_index_type j) │ │ │ │ +831 { │ │ │ │ +832 pivot_[i] = │ │ │ │ +833 _S_i_m_d_:_:_c_o_n_d(Simd::Scalar(i) == j, pivot_[i], j); │ │ │ │ +834 } │ │ │ │ +835 │ │ │ │ +836 template │ │ │ │ +837 template │ │ │ │ +838 DenseMatrix::Elim::Elim(V& rhs) │ │ │ │ +839 : rhs_(&rhs) │ │ │ │ +840 {} │ │ │ │ +841 │ │ │ │ +842 template │ │ │ │ +843 template │ │ │ │ +844 void DenseMatrix::Elim::swap(std::size_t i, simd_index_type j) │ │ │ │ +845 { │ │ │ │ +846 using std::swap; │ │ │ │ +847 │ │ │ │ +848 // see the comment in luDecomposition() │ │ │ │ +849 for(std::size_t l = 0; l < _S_i_m_d_:_:_l_a_n_e_s(j); ++l) │ │ │ │ +850 _s_w_a_p(_S_i_m_d_:_:_l_a_n_e(l, (*rhs_)[ i ]), │ │ │ │ +851 _S_i_m_d_:_:_l_a_n_e(l, (*rhs_)[_S_i_m_d_:_:_l_a_n_e(l, j)])); │ │ │ │ +852 } │ │ │ │ +853 │ │ │ │ +854 template │ │ │ │ +855 template │ │ │ │ +856 void DenseMatrix:: │ │ │ │ +857 Elim::operator()(const typename V::field_type& factor, int k, int i) │ │ │ │ +858 { │ │ │ │ +859 (*rhs_)[k] -= factor*(*rhs_)[i]; │ │ │ │ +860 } │ │ │ │ +861 │ │ │ │ +862 template │ │ │ │ +863 template │ │ │ │ +864 inline void _D_e_n_s_e_M_a_t_r_i_x_<_M_A_T_>_:_: │ │ │ │ +865_ _l_u_D_e_c_o_m_p_o_s_i_t_i_o_n(DenseMatrix& A, Func func, Mask &nonsingularLanes, │ │ │ │ +866 bool throwEarly, bool doPivoting) │ │ │ │ +867 { │ │ │ │ +868 using std::max; │ │ │ │ +869 using std::swap; │ │ │ │ +870 │ │ │ │ +871 typedef typename _F_i_e_l_d_T_r_a_i_t_s_<_v_a_l_u_e___t_y_p_e_>_:_:_r_e_a_l___t_y_p_e real_type; │ │ │ │ +872 │ │ │ │ +873 // LU decomposition of A in A │ │ │ │ +874 for (size_type i=0; i pivmax; │ │ │ │ +886 pivmax = _S_i_m_d_:_:_c_o_n_d(mask, abs, pivmax); │ │ │ │ +887 imax = _S_i_m_d_:_:_c_o_n_d(mask, simd_index_type(k), imax); │ │ │ │ +888 } │ │ │ │ +889 // swap rows │ │ │ │ +890 for (size_type j=0; j │ │ │ │ +933 template │ │ │ │ +934 inline void _D_e_n_s_e_M_a_t_r_i_x_<_M_A_T_>_:_:_s_o_l_v_e(V1& x, const V2& b, bool doPivoting) │ │ │ │ +const │ │ │ │ +935 { │ │ │ │ +936 using real_type = typename _F_i_e_l_d_T_r_a_i_t_s_<_v_a_l_u_e___t_y_p_e_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ +937 // never mind those ifs, because they get optimized away │ │ │ │ +938 if (rows()!=cols()) │ │ │ │ +939 _D_U_N_E___T_H_R_O_W(FMatrixError, "Can't solve for a " << rows() << "x" << cols() << │ │ │ │ +" matrix!"); │ │ │ │ +940 │ │ │ │ +941 if (rows()==1) { │ │ │ │ +942 │ │ │ │ +943#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ +944 if (_S_i_m_d_:_:_a_n_y_T_r_u_e(fvmeta::absreal((*this)[0][0]) │ │ │ │ +945 < _F_M_a_t_r_i_x_P_r_e_c_i_s_i_o_n_<_>_:_:_a_b_s_o_l_u_t_e___l_i_m_i_t())) │ │ │ │ +946 _D_U_N_E___T_H_R_O_W(FMatrixError,"matrix is singular"); │ │ │ │ +947#endif │ │ │ │ +948 x[0] = b[0]/(*this)[0][0]; │ │ │ │ +949 │ │ │ │ +950 } │ │ │ │ +951 else if (rows()==2) { │ │ │ │ +952 │ │ │ │ +953 field_type detinv = (*this)[0][0]*(*this)[1][1]-(*this)[0][1]*(*this)[1] │ │ │ │ +[0]; │ │ │ │ +954#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ +955 if (_S_i_m_d_:_:_a_n_y_T_r_u_e(fvmeta::absreal(detinv) │ │ │ │ +956 < _F_M_a_t_r_i_x_P_r_e_c_i_s_i_o_n_<_>_:_:_a_b_s_o_l_u_t_e___l_i_m_i_t())) │ │ │ │ +957 _D_U_N_E___T_H_R_O_W(FMatrixError,"matrix is singular"); │ │ │ │ +958#endif │ │ │ │ +959 detinv = real_type(1.0)/detinv; │ │ │ │ +960 │ │ │ │ +961 x[0] = detinv*((*this)[1][1]*b[0]-(*this)[0][1]*b[1]); │ │ │ │ +962 x[1] = detinv*((*this)[0][0]*b[1]-(*this)[1][0]*b[0]); │ │ │ │ +963 │ │ │ │ +964 } │ │ │ │ +965 else if (rows()==3) { │ │ │ │ +966 │ │ │ │ +967 field_type d = determinant(doPivoting); │ │ │ │ +968#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ +969 if (_S_i_m_d_:_:_a_n_y_T_r_u_e(fvmeta::absreal(d) │ │ │ │ +970 < _F_M_a_t_r_i_x_P_r_e_c_i_s_i_o_n_<_>_:_:_a_b_s_o_l_u_t_e___l_i_m_i_t())) │ │ │ │ +971 _D_U_N_E___T_H_R_O_W(FMatrixError,"matrix is singular"); │ │ │ │ +972#endif │ │ │ │ +973 │ │ │ │ +974 x[0] = (b[0]*(*this)[1][1]*(*this)[2][2] - b[0]*(*this)[2][1]*(*this)[1][2] │ │ │ │ +975 - b[1] *(*this)[0][1]*(*this)[2][2] + b[1]*(*this)[2][1]*(*this)[0][2] │ │ │ │ +976 + b[2] *(*this)[0][1]*(*this)[1][2] - b[2]*(*this)[1][1]*(*this)[0][2]) / │ │ │ │ +d; │ │ │ │ +977 │ │ │ │ +978 x[1] = ((*this)[0][0]*b[1]*(*this)[2][2] - (*this)[0][0]*b[2]*(*this)[1][2] │ │ │ │ +979 - (*this)[1][0] *b[0]*(*this)[2][2] + (*this)[1][0]*b[2]*(*this)[0][2] │ │ │ │ +980 + (*this)[2][0] *b[0]*(*this)[1][2] - (*this)[2][0]*b[1]*(*this)[0][2]) / │ │ │ │ +d; │ │ │ │ +981 │ │ │ │ +982 x[2] = ((*this)[0][0]*(*this)[1][1]*b[2] - (*this)[0][0]*(*this)[2][1]*b[1] │ │ │ │ +983 - (*this)[1][0] *(*this)[0][1]*b[2] + (*this)[1][0]*(*this)[2][1]*b[0] │ │ │ │ +984 + (*this)[2][0] *(*this)[0][1]*b[1] - (*this)[2][0]*(*this)[1][1]*b[0]) / │ │ │ │ +d; │ │ │ │ +985 │ │ │ │ +986 } │ │ │ │ +987 else { │ │ │ │ +988 │ │ │ │ +989 V1& rhs = x; // use x to store rhs │ │ │ │ +990 rhs = b; // copy data │ │ │ │ +991 Elim elim(rhs); │ │ │ │ +992 AutonomousValue A(asImp()); │ │ │ │ +993 Simd::Mask::real_type> │ │ │ │ +994 nonsingularLanes(true); │ │ │ │ +995 │ │ │ │ +996 AutonomousValue::luDecomposition(A, elim, nonsingularLanes, true, │ │ │ │ +doPivoting); │ │ │ │ +997 │ │ │ │ +998 // backsolve │ │ │ │ +999 for(int i=rows()-1; i>=0; i--) { │ │ │ │ +1000 for (size_type j=i+1; j │ │ │ │ +1008 inline void _D_e_n_s_e_M_a_t_r_i_x_<_M_A_T_>_:_:_i_n_v_e_r_t(bool doPivoting) │ │ │ │ +1009 { │ │ │ │ +1010 using real_type = typename _F_i_e_l_d_T_r_a_i_t_s_<_M_A_T_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ +1011 using std::swap; │ │ │ │ +1012 │ │ │ │ +1013 // never mind those ifs, because they get optimized away │ │ │ │ +1014 if (rows()!=cols()) │ │ │ │ +1015 _D_U_N_E___T_H_R_O_W(FMatrixError, "Can't invert a " << rows() << "x" << cols() << " │ │ │ │ +matrix!"); │ │ │ │ +1016 │ │ │ │ +1017 if (rows()==1) { │ │ │ │ +1018 │ │ │ │ +1019#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ +1020 if (_S_i_m_d_:_:_a_n_y_T_r_u_e(fvmeta::absreal((*this)[0][0]) │ │ │ │ +1021 < _F_M_a_t_r_i_x_P_r_e_c_i_s_i_o_n_<_>_:_:_a_b_s_o_l_u_t_e___l_i_m_i_t())) │ │ │ │ +1022 _D_U_N_E___T_H_R_O_W(FMatrixError,"matrix is singular"); │ │ │ │ +1023#endif │ │ │ │ +1024 (*this)[0][0] = real_type( 1 ) / (*this)[0][0]; │ │ │ │ +1025 │ │ │ │ +1026 } │ │ │ │ +1027 else if (rows()==2) { │ │ │ │ +1028 │ │ │ │ +1029 field_type detinv = (*this)[0][0]*(*this)[1][1]-(*this)[0][1]*(*this)[1] │ │ │ │ +[0]; │ │ │ │ +1030#ifdef DUNE_FMatrix_WITH_CHECKING │ │ │ │ +1031 if (_S_i_m_d_:_:_a_n_y_T_r_u_e(fvmeta::absreal(detinv) │ │ │ │ +1032 < _F_M_a_t_r_i_x_P_r_e_c_i_s_i_o_n_<_>_:_:_a_b_s_o_l_u_t_e___l_i_m_i_t())) │ │ │ │ +1033 _D_U_N_E___T_H_R_O_W(FMatrixError,"matrix is singular"); │ │ │ │ +1034#endif │ │ │ │ +1035 detinv = real_type( 1 ) / detinv; │ │ │ │ +1036 │ │ │ │ +1037 field_type temp=(*this)[0][0]; │ │ │ │ +1038 (*this)[0][0] = (*this)[1][1]*detinv; │ │ │ │ +1039 (*this)[0][1] = -(*this)[0][1]*detinv; │ │ │ │ +1040 (*this)[1][0] = -(*this)[1][0]*detinv; │ │ │ │ +1041 (*this)[1][1] = temp*detinv; │ │ │ │ +1042 │ │ │ │ +1043 } │ │ │ │ +1044 else if (rows()==3) │ │ │ │ +1045 { │ │ │ │ +1046 using K = field_type; │ │ │ │ +1047 // code generated by maple │ │ │ │ +1048 K t4 = (*this)[0][0] * (*this)[1][1]; │ │ │ │ +1049 K t6 = (*this)[0][0] * (*this)[1][2]; │ │ │ │ +1050 K t8 = (*this)[0][1] * (*this)[1][0]; │ │ │ │ +1051 K t10 = (*this)[0][2] * (*this)[1][0]; │ │ │ │ +1052 K t12 = (*this)[0][1] * (*this)[2][0]; │ │ │ │ +1053 K t14 = (*this)[0][2] * (*this)[2][0]; │ │ │ │ +1054 │ │ │ │ +1055 K det = (t4*(*this)[2][2]-t6*(*this)[2][1]-t8*(*this)[2][2]+ │ │ │ │ +1056 t10*(*this)[2][1]+t12*(*this)[1][2]-t14*(*this)[1][1]); │ │ │ │ +1057 K t17 = K(1.0)/det; │ │ │ │ +1058 │ │ │ │ +1059 K matrix01 = (*this)[0][1]; │ │ │ │ +1060 K matrix00 = (*this)[0][0]; │ │ │ │ +1061 K matrix10 = (*this)[1][0]; │ │ │ │ +1062 K matrix11 = (*this)[1][1]; │ │ │ │ +1063 │ │ │ │ +1064 (*this)[0][0] = ((*this)[1][1] * (*this)[2][2] - (*this)[1][2] * (*this) │ │ │ │ +[2][1])*t17; │ │ │ │ +1065 (*this)[0][1] = -((*this)[0][1] * (*this)[2][2] - (*this)[0][2] * (*this) │ │ │ │ +[2][1])*t17; │ │ │ │ +1066 (*this)[0][2] = (matrix01 * (*this)[1][2] - (*this)[0][2] * (*this)[1] │ │ │ │ +[1])*t17; │ │ │ │ +1067 (*this)[1][0] = -((*this)[1][0] * (*this)[2][2] - (*this)[1][2] * (*this) │ │ │ │ +[2][0])*t17; │ │ │ │ +1068 (*this)[1][1] = (matrix00 * (*this)[2][2] - t14) * t17; │ │ │ │ +1069 (*this)[1][2] = -(t6-t10) * t17; │ │ │ │ +1070 (*this)[2][0] = (matrix10 * (*this)[2][1] - matrix11 * (*this)[2][0]) * │ │ │ │ +t17; │ │ │ │ +1071 (*this)[2][1] = -(matrix00 * (*this)[2][1] - t12) * t17; │ │ │ │ +1072 (*this)[2][2] = (t4-t8) * t17; │ │ │ │ +1073 } │ │ │ │ +1074 else { │ │ │ │ +1075 using std::swap; │ │ │ │ +1076 │ │ │ │ +1077 AutonomousValue A(asImp()); │ │ │ │ +1078 std::vector pivot(rows()); │ │ │ │ +1079 Simd::Mask::real_type> │ │ │ │ +1080 nonsingularLanes(true); │ │ │ │ +1081 AutonomousValue::luDecomposition(A, ElimPivot(pivot), │ │ │ │ +nonsingularLanes, true, doPivoting); │ │ │ │ +1082 auto& L=A; │ │ │ │ +1083 auto& U=A; │ │ │ │ +1084 │ │ │ │ +1085 // initialize inverse │ │ │ │ +1086 *this=field_type(); │ │ │ │ +1087 │ │ │ │ +1088 for(size_type i=0; i0;) { │ │ │ │ +1099 --i; │ │ │ │ +1100 for (size_type k=0; k0; ) { │ │ │ │ +1108 --i; │ │ │ │ +1109 for(std::size_t l = 0; l < _S_i_m_d_:_:_l_a_n_e_s((*this)[0][0]); ++l) │ │ │ │ +1110 { │ │ │ │ +1111 std::size_t pi = _S_i_m_d_:_:_l_a_n_e(l, pivot[i]); │ │ │ │ +1112 if(i!=pi) │ │ │ │ +1113 for(size_type j=0; j │ │ │ │ +1123 inline typename _D_e_n_s_e_M_a_t_r_i_x_<_M_A_T_>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ +1124 _D_e_n_s_e_M_a_t_r_i_x_<_M_A_T_>_:_:_d_e_t_e_r_m_i_n_a_n_t(bool doPivoting) const │ │ │ │ +1125 { │ │ │ │ +1126 // never mind those ifs, because they get optimized away │ │ │ │ +1127 if (rows()!=cols()) │ │ │ │ +1128 _D_U_N_E___T_H_R_O_W(FMatrixError, "There is no determinant for a " << rows() << "x" │ │ │ │ +<< cols() << " matrix!"); │ │ │ │ +1129 │ │ │ │ +1130 if (rows()==1) │ │ │ │ +1131 return (*this)[0][0]; │ │ │ │ +1132 │ │ │ │ +1133 if (rows()==2) │ │ │ │ +1134 return (*this)[0][0]*(*this)[1][1] - (*this)[0][1]*(*this)[1][0]; │ │ │ │ +1135 │ │ │ │ +1136 if (rows()==3) { │ │ │ │ +1137 // code generated by maple │ │ │ │ +1138 field_type t4 = (*this)[0][0] * (*this)[1][1]; │ │ │ │ +1139 field_type t6 = (*this)[0][0] * (*this)[1][2]; │ │ │ │ +1140 field_type t8 = (*this)[0][1] * (*this)[1][0]; │ │ │ │ +1141 field_type t10 = (*this)[0][2] * (*this)[1][0]; │ │ │ │ +1142 field_type t12 = (*this)[0][1] * (*this)[2][0]; │ │ │ │ +1143 field_type t14 = (*this)[0][2] * (*this)[2][0]; │ │ │ │ +1144 │ │ │ │ +1145 return (t4*(*this)[2][2]-t6*(*this)[2][1]-t8*(*this)[2][2]+ │ │ │ │ +1146 t10*(*this)[2][1]+t12*(*this)[1][2]-t14*(*this)[1][1]); │ │ │ │ +1147 │ │ │ │ +1148 } │ │ │ │ +1149 │ │ │ │ +1150 AutonomousValue A(asImp()); │ │ │ │ +1151 field_type det; │ │ │ │ +1152 Simd::Mask::real_type> │ │ │ │ +1153 nonsingularLanes(true); │ │ │ │ +1154 │ │ │ │ +1155 AutonomousValue::luDecomposition(A, ElimDet(det), nonsingularLanes, │ │ │ │ +false, doPivoting); │ │ │ │ +1156 det = _S_i_m_d_:_:_c_o_n_d(nonsingularLanes, det, field_type(0)); │ │ │ │ +1157 │ │ │ │ +1158 for (size_type i = 0; i < rows(); ++i) │ │ │ │ +1159 det *= A[i][i]; │ │ │ │ +1160 return det; │ │ │ │ +1161 } │ │ │ │ +1162 │ │ │ │ +1163#endif // DOXYGEN │ │ │ │ +1164 │ │ │ │ +_1_1_6_5 namespace DenseMatrixHelp { │ │ │ │ +1166 │ │ │ │ +1168 template │ │ │ │ +_1_1_6_9 static inline void _m_u_l_t_A_s_s_i_g_n(const _D_e_n_s_e_M_a_t_r_i_x_<_M_A_T_> &matrix, const │ │ │ │ +_D_e_n_s_e_V_e_c_t_o_r_<_V_1_> & x, _D_e_n_s_e_V_e_c_t_o_r_<_V_2_> & ret) │ │ │ │ +1170 { │ │ │ │ +1171 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(x._s_i_z_e() == matrix._c_o_l_s()); │ │ │ │ +1172 _D_U_N_E___A_S_S_E_R_T___B_O_U_N_D_S(ret._s_i_z_e() == matrix._r_o_w_s()); │ │ │ │ +1173 typedef typename _D_e_n_s_e_M_a_t_r_i_x_<_M_A_T_>_:_:_s_i_z_e___t_y_p_e size_type; │ │ │ │ +1174 │ │ │ │ +1175 for(size_type i=0; i │ │ │ │ +1188 static inline void multAssignTransposed( const _F_i_e_l_d_M_a_t_r_i_x_<_K_,_r_o_w_s_,_c_o_l_s_> │ │ │ │ +&matrix, const _F_i_e_l_d_V_e_c_t_o_r_<_K_,_r_o_w_s_> & x, _F_i_e_l_d_V_e_c_t_o_r_<_K_,_c_o_l_s_> & ret) │ │ │ │ +1189 { │ │ │ │ +1190 typedef typename _F_i_e_l_d_M_a_t_r_i_x_<_K_,_r_o_w_s_,_c_o_l_s_>_:_:_s_i_z_e___t_y_p_e size_type; │ │ │ │ +1191 │ │ │ │ +1192 for(size_type i=0; i │ │ │ │ +1202 static inline FieldVector mult(const FieldMatrix │ │ │ │ +&matrix, const FieldVector & x) │ │ │ │ +1203 { │ │ │ │ +1204 FieldVector ret; │ │ │ │ +1205 _m_u_l_t_A_s_s_i_g_n(matrix,x,ret); │ │ │ │ +1206 return ret; │ │ │ │ +1207 } │ │ │ │ +1208 │ │ │ │ +1210 template │ │ │ │ +1211 static inline FieldVector multTransposed(const │ │ │ │ +FieldMatrix &matrix, const FieldVector & x) │ │ │ │ +1212 { │ │ │ │ +1213 FieldVector ret; │ │ │ │ +1214 multAssignTransposed( matrix, x, ret ); │ │ │ │ +1215 return ret; │ │ │ │ +1216 } │ │ │ │ +1217#endif │ │ │ │ +1218 │ │ │ │ +1219 } // end namespace DenseMatrixHelp │ │ │ │ +1220 │ │ │ │ +1222 template │ │ │ │ +_1_2_2_3 std::ostream& _o_p_e_r_a_t_o_r_<_<_ (std::ostream& s, const _D_e_n_s_e_M_a_t_r_i_x_<_M_A_T_>& a) │ │ │ │ +1224 { │ │ │ │ +1225 for (typename _D_e_n_s_e_M_a_t_r_i_x_<_M_A_T_>_:_:_s_i_z_e___t_y_p_e i=0; i::type AutonomousValue │ │ │ │ +Type free of internal references that T can be converted to. │ │ │ │ +DDeeffiinniittiioonn typetraits.hh:588 │ │ │ │ +_D_u_n_e_:_:_o_p_e_r_a_t_o_r_<_< │ │ │ │ +std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x) │ │ │ │ +DDeeffiinniittiioonn bigunsignedint.hh:278 │ │ │ │ +_D_U_N_E___T_H_R_O_W │ │ │ │ +#define DUNE_THROW(E, m) │ │ │ │ +DDeeffiinniittiioonn exceptions.hh:218 │ │ │ │ +_D_u_n_e_:_:_S_i_m_d_:_:_a_n_y_T_r_u_e │ │ │ │ +bool anyTrue(const Mask &mask) │ │ │ │ +Whether any entry is true │ │ │ │ +DDeeffiinniittiioonn simd/interface.hh:429 │ │ │ │ +_D_u_n_e_:_:_S_i_m_d_:_:_c_o_n_d │ │ │ │ +V cond(M &&mask, const V &ifTrue, const V &ifFalse) │ │ │ │ +Like the ?: operator. │ │ │ │ +DDeeffiinniittiioonn simd/interface.hh:386 │ │ │ │ +_D_u_n_e_:_:_S_i_m_d_:_:_a_l_l_T_r_u_e │ │ │ │ +bool allTrue(const Mask &mask) │ │ │ │ +Whether all entries are true │ │ │ │ +DDeeffiinniittiioonn simd/interface.hh:439 │ │ │ │ +_D_u_n_e_:_:_S_i_m_d_:_:_R_e_b_i_n_d │ │ │ │ +typename Overloads::RebindType< std::decay_t< S >, std::decay_t< V > >::type │ │ │ │ +Rebind │ │ │ │ +Construct SIMD type with different scalar type. │ │ │ │ +DDeeffiinniittiioonn simd/interface.hh:253 │ │ │ │ +_D_u_n_e_:_:_S_i_m_d_:_:_l_a_n_e_s │ │ │ │ +constexpr std::size_t lanes() │ │ │ │ +Number of lanes in a SIMD type. │ │ │ │ +DDeeffiinniittiioonn simd/interface.hh:305 │ │ │ │ +_D_u_n_e_:_:_S_i_m_d_:_:_l_a_n_e │ │ │ │ +decltype(auto) lane(std::size_t l, V &&v) │ │ │ │ +Extract an element of a SIMD type. │ │ │ │ +DDeeffiinniittiioonn simd/interface.hh:324 │ │ │ │ +_D_u_n_e_:_:_S_i_m_d_:_:_O_v_e_r_l_o_a_d_s_:_:_m_a_s_k │ │ │ │ +Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v) │ │ │ │ +implements Simd::mask() │ │ │ │ +DDeeffiinniittiioonn defaults.hh:153 │ │ │ │ +_s_t_d │ │ │ │ +STL namespace. │ │ │ │ +_D_u_n_e │ │ │ │ +Dune namespace. │ │ │ │ +DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ +_D_u_n_e_:_:_s_w_a_p │ │ │ │ +void swap(T &v1, T &v2, bool mask) │ │ │ │ +DDeeffiinniittiioonn simd.hh:472 │ │ │ │ +_D_u_n_e_:_:_s_i_g_n │ │ │ │ +int sign(const T &val) │ │ │ │ +Return the sign of the value. │ │ │ │ +DDeeffiinniittiioonn math.hh:180 │ │ │ │ +_D_u_n_e_:_:_c_o_n_j_u_g_a_t_e_C_o_m_p_l_e_x │ │ │ │ +K conjugateComplex(const K &x) │ │ │ │ +compute conjugate complex of x │ │ │ │ +DDeeffiinniittiioonn math.hh:164 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_H_e_l_p_:_:_m_u_l_t_A_s_s_i_g_n │ │ │ │ +static void multAssign(const DenseMatrix< MAT > &matrix, const DenseVector< V1 │ │ │ │ +> &x, DenseVector< V2 > &ret) │ │ │ │ +calculates ret = matrix * x │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:1169 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x │ │ │ │ +A dense n x m matrix. │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:140 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ +ConstIterator const_iterator │ │ │ │ +typedef for stl compliant access │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:244 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_- │ │ │ │ +derived_type operator-() const │ │ │ │ +Matrix negation. │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:298 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_s_o_l_v_e │ │ │ │ +void solve(V1 &x, const V2 &b, bool doPivoting=true) const │ │ │ │ +Solve system A x = b. │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_m_v │ │ │ │ +void mv(const X &x, Y &y) const │ │ │ │ +y = A x │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:368 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ +Traits::value_type field_type │ │ │ │ +export the type representing the field │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:160 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_a_x_p_y │ │ │ │ +derived_type & axpy(const field_type &a, const DenseMatrix< Other > &x) │ │ │ │ +vector space axpy operation (*this += a x) │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:338 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ +ConstIterator beforeEnd() const │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:264 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ +derived_type & operator=(const RHS &rhs) │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:279 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_m_m_t_v │ │ │ │ +void mmtv(const X &x, Y &y) const │ │ │ │ +y -= A^T x │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:458 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_i_n_f_i_n_i_t_y___n_o_r_m___r_e_a_l │ │ │ │ +FieldTraits< vt >::real_type infinity_norm_real() const │ │ │ │ +simplified infinity norm (uses Manhattan norm for complex values) │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:561 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_C_o_n_s_t_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ +std::remove_reference< const_row_reference >::type::ConstIterator │ │ │ │ +ConstColIterator │ │ │ │ +rename the iterators for easier access │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:248 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_b_e_f_o_r_e_B_e_g_i_n │ │ │ │ +ConstIterator beforeBegin() const │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:271 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_i_n_v_e_r_t │ │ │ │ +void invert(bool doPivoting=true) │ │ │ │ +Compute inverse. │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_l_u_D_e_c_o_m_p_o_s_i_t_i_o_n │ │ │ │ +static void luDecomposition(DenseMatrix< MAT > &A, Func func, Mask │ │ │ │ +&nonsingularLanes, bool throwEarly, bool doPivoting) │ │ │ │ +do an LU-Decomposition on matrix A │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_b_l_o_c_k___t_y_p_e │ │ │ │ +Traits::value_type block_type │ │ │ │ +export the type representing the components │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:163 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_m_t_v │ │ │ │ +void mtv(const X &x, Y &y) const │ │ │ │ +y = A^T x │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:387 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_c_o_l_s │ │ │ │ +constexpr size_type cols() const │ │ │ │ +number of columns │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:715 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_s_i_z_e │ │ │ │ +size_type size() const │ │ │ │ +size method (number of rows) │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:200 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_M │ │ │ │ +constexpr size_type M() const │ │ │ │ +number of columns │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:703 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_r_i_g_h_t_m_u_l_t_i_p_l_y │ │ │ │ +MAT & rightmultiply(const DenseMatrix< M2 > &M) │ │ │ │ +Multiplies M from the right to this matrix. │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:645 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ +Iterator end() │ │ │ │ +end iterator │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:222 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_b_e_f_o_r_e_B_e_g_i_n │ │ │ │ +Iterator beforeBegin() │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:236 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_/_= │ │ │ │ +derived_type & operator/=(const field_type &k) │ │ │ │ +vector space division by scalar │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:329 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_*_= │ │ │ │ +derived_type & operator*=(const field_type &k) │ │ │ │ +vector space multiplication with scalar │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:321 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_b_e_f_o_r_e_E_n_d │ │ │ │ +Iterator beforeEnd() │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:229 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ +Traits::value_type value_type │ │ │ │ +export the type representing the field │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:157 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_u_s_m_v │ │ │ │ +void usmv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y &y) │ │ │ │ +const │ │ │ │ +y += alpha A x │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:484 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_u_s_m_h_v │ │ │ │ +void usmhv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y │ │ │ │ +&y) const │ │ │ │ +y += alpha A^H x │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:512 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_m_m_v │ │ │ │ +void mmv(const X &x, Y &y) const │ │ │ │ +y -= A x │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:445 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_r_o_w_s │ │ │ │ +constexpr size_type rows() const │ │ │ │ +number of rows │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:709 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_l_e_f_t_m_u_l_t_i_p_l_y │ │ │ │ +MAT & leftmultiply(const DenseMatrix< M2 > &M) │ │ │ │ +Multiplies M from the left to this matrix. │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:627 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_u_s_m_t_v │ │ │ │ +void usmtv(const typename FieldTraits< Y >::field_type &alpha, const X &x, Y │ │ │ │ +&y) const │ │ │ │ +y += alpha A^T x │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:498 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_-_= │ │ │ │ +derived_type & operator-=(const DenseMatrix< Other > &x) │ │ │ │ +vector space subtraction │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:312 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_!_= │ │ │ │ +bool operator!=(const DenseMatrix< Other > &x) const │ │ │ │ +Binary matrix incomparison. │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:358 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_m_m_h_v │ │ │ │ +void mmhv(const X &x, Y &y) const │ │ │ │ +y -= A^H x │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:471 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_d_e_r_i_v_e_d___t_y_p_e │ │ │ │ +Traits::derived_type derived_type │ │ │ │ +type of derived matrix class │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:154 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ +row_reference operator[](size_type i) │ │ │ │ +random access │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:189 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_e_x_i_s_t_s │ │ │ │ +bool exists(size_type i, size_type j) const │ │ │ │ +return true when (i,j) is in pattern │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:723 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ +Iterator RowIterator │ │ │ │ +rename the iterators for easier access │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:211 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_b_l_o_c_k_l_e_v_e_l │ │ │ │ +static constexpr int blocklevel │ │ │ │ +The number of block levels we contain. This is the leaf, that is, 1. │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:178 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_f_r_o_b_e_n_i_u_s___n_o_r_m │ │ │ │ +FieldTraits< value_type >::real_type frobenius_norm() const │ │ │ │ +frobenius norm: sqrt(sum over squared values of entries) │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:528 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_u_m_v │ │ │ │ +void umv(const X &x, Y &y) const │ │ │ │ +y += A x │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:406 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_C_o_n_s_t_I_t_e_r_a_t_o_r │ │ │ │ +DenseIterator< const DenseMatrix, const row_type, const_row_reference > │ │ │ │ +ConstIterator │ │ │ │ +Iterator class for sequential access. │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:242 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_i_n_f_i_n_i_t_y___n_o_r_m │ │ │ │ +FieldTraits< vt >::real_type infinity_norm() const │ │ │ │ +infinity norm (row sum norm, how to generalize for blocks?) │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:546 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_r_o_w___t_y_p_e │ │ │ │ +Traits::row_type row_type │ │ │ │ +The type used to represent a row (must fulfill the Dune::DenseVector interface) │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:169 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_N │ │ │ │ +constexpr size_type N() const │ │ │ │ +number of rows │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:697 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ +Traits::size_type size_type │ │ │ │ +The type used for the index access and size operation. │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:166 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_c_o_n_s_t___r_o_w___r_e_f_e_r_e_n_c_e │ │ │ │ +Traits::const_row_reference const_row_reference │ │ │ │ +The type used to represent a reference to a constant row (usually const │ │ │ │ +row_type &) │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:175 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_f_r_o_b_e_n_i_u_s___n_o_r_m_2 │ │ │ │ +FieldTraits< value_type >::real_type frobenius_norm2() const │ │ │ │ +square of frobenius norm, need for block recursion │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:536 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_C_o_l_I_t_e_r_a_t_o_r │ │ │ │ +std::remove_reference< row_reference >::type::Iterator ColIterator │ │ │ │ +rename the iterators for easier access │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:213 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_r_o_w___r_e_f_e_r_e_n_c_e │ │ │ │ +Traits::row_reference row_reference │ │ │ │ +The type used to represent a reference to a row (usually row_type &) │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:172 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ +bool operator==(const DenseMatrix< Other > &x) const │ │ │ │ +Binary matrix comparison. │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:348 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_i_t_e_r_a_t_o_r │ │ │ │ +Iterator iterator │ │ │ │ +typedef for stl compliant access │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:209 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_C_o_n_s_t_R_o_w_I_t_e_r_a_t_o_r │ │ │ │ +ConstIterator ConstRowIterator │ │ │ │ +rename the iterators for easier access │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:246 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_I_t_e_r_a_t_o_r │ │ │ │ +DenseIterator< DenseMatrix, row_type, row_reference > Iterator │ │ │ │ +Iterator class for sequential access. │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:207 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_u_m_t_v │ │ │ │ +void umtv(const X &x, Y &y) const │ │ │ │ +y += A^T x │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:419 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_b_e_g_i_n │ │ │ │ +ConstIterator begin() const │ │ │ │ +begin iterator │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:251 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_d_e_t_e_r_m_i_n_a_n_t │ │ │ │ +field_type determinant(bool doPivoting=true) const │ │ │ │ +calculates the determinant of this matrix │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_b_e_g_i_n │ │ │ │ +Iterator begin() │ │ │ │ +begin iterator │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:216 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_u_m_h_v │ │ │ │ +void umhv(const X &x, Y &y) const │ │ │ │ +y += A^H x │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:432 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_o_p_e_r_a_t_o_r_+_= │ │ │ │ +derived_type & operator+=(const DenseMatrix< Other > &x) │ │ │ │ +vector space addition │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:289 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_:_:_e_n_d │ │ │ │ +ConstIterator end() const │ │ │ │ +end iterator │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:257 │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _D_e_n_s_e_M_a_t_r_i_x_<_ _M_ _>_ _>_:_:_r_e_a_l___t_y_p_e │ │ │ │ +const FieldTraits< typenameDenseMatVecTraits< M >::value_type >::real_type │ │ │ │ +real_type │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:34 │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_<_ _D_e_n_s_e_M_a_t_r_i_x_<_ _M_ _>_ _>_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ +const FieldTraits< typenameDenseMatVecTraits< M >::value_type >::field_type │ │ │ │ +field_type │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:33 │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x │ │ │ │ +A dense n x m matrix. │ │ │ │ +DDeeffiinniittiioonn fmatrix.hh:117 │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_M_a_t_r_i_x_:_:_s_i_z_e___t_y_p_e │ │ │ │ +Base::size_type size_type │ │ │ │ +DDeeffiinniittiioonn fmatrix.hh:127 │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_V_e_c_t_o_r │ │ │ │ +vector space out of a tensor product of fields. │ │ │ │ +DDeeffiinniittiioonn fvector.hh:91 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_r_i_x_A_s_s_i_g_n_e_r │ │ │ │ +you have to specialize this structure for any type that should be assignable to │ │ │ │ +a DenseMatrix │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:59 │ │ │ │ +_D_u_n_e_:_:_F_M_a_t_r_i_x_E_r_r_o_r │ │ │ │ +Error thrown if operations of a FieldMatrix fail. │ │ │ │ +DDeeffiinniittiioonn densematrix.hh:126 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r │ │ │ │ +Interface for a class of dense vectors over a given field. │ │ │ │ +DDeeffiinniittiioonn densevector.hh:229 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_V_e_c_t_o_r_:_:_s_i_z_e │ │ │ │ +size_type size() const │ │ │ │ +size method │ │ │ │ +DDeeffiinniittiioonn densevector.hh:336 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_I_t_e_r_a_t_o_r │ │ │ │ +Generic iterator class for dense vector and matrix implementations. │ │ │ │ +DDeeffiinniittiioonn densevector.hh:131 │ │ │ │ +_D_u_n_e_:_:_M_a_t_h_E_r_r_o_r │ │ │ │ +Default exception class for mathematical errors. │ │ │ │ +DDeeffiinniittiioonn exceptions.hh:241 │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s │ │ │ │ +DDeeffiinniittiioonn ftraits.hh:26 │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ +T field_type │ │ │ │ +export the type representing the field │ │ │ │ +DDeeffiinniittiioonn ftraits.hh:28 │ │ │ │ +_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_:_:_r_e_a_l___t_y_p_e │ │ │ │ +T real_type │ │ │ │ +export the type representing the real type of the field │ │ │ │ +DDeeffiinniittiioonn ftraits.hh:30 │ │ │ │ +_D_u_n_e_:_:_D_e_n_s_e_M_a_t_V_e_c_T_r_a_i_t_s │ │ │ │ +DDeeffiinniittiioonn matvectraits.hh:31 │ │ │ │ +_D_u_n_e_:_:_F_M_a_t_r_i_x_P_r_e_c_i_s_i_o_n_:_:_a_b_s_o_l_u_t_e___l_i_m_i_t │ │ │ │ +static ctype absolute_limit() │ │ │ │ +return threshold to declare matrix singular │ │ │ │ +DDeeffiinniittiioonn precision.hh:28 │ │ │ │ +_s_i_m_d_._h_h │ │ │ │ +Include file for users of the SIMD abstraction layer. │ │ │ │ =============================================================================== │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00011.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: version.hh File Reference │ │ │ +dune-common: ios_state.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,675 +70,26 @@ │ │ │ │ │ │ │ │ │
│ │ │
│ │ │ -Macros
│ │ │ -
version.hh File Reference
│ │ │ +Namespaces
│ │ │ +
ios_state.cc File Reference
│ │ │ │ │ │
│ │ │ - │ │ │ -

Various macros to work with Dune module version numbers. │ │ │ -More...

│ │ │ -
#include <dune-common-config.hh>
│ │ │ -
│ │ │ -

Go to the source code of this file.

│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ +
#include <dune/common/ios_state.hh>
│ │ │ +

│ │ │ -Macros

#define DUNE_VERSION_JOIN(module, type)   module ## _VERSION_ ## type
 Constructs the preprocessor name used in config.h to hold version numbers.
 
#define DUNE_VERSION_EQUAL(module, major, minor)
 True if 'module' has the version major.minor.
 
#define DUNE_VERSION_EQUAL_REV(module, major, minor, revision)
 True if 'module' has the version major.minor.revision.
 
#define DUNE_VERSION_GTE(module, major, minor)
 True if 'module' has the version major.minor or greater.
 
#define DUNE_VERSION_LT(module, major, minor)    ! DUNE_VERSION_GTE(module,major,minor)
 True if 'module' has a version less than major.minor.
 
#define DUNE_VERSION_GT(module, major, minor)
 True if 'module' has a version greater than major.minor.
 
#define DUNE_VERSION_LTE(module, major, minor)    ! DUNE_VERSION_GT(module,major,minor)
 True if 'module' has a version less than or equal to major.minor.
 
#define DUNE_VERSION_GTE_REV(module, major, minor, revision)
 True if 'module' has the version major.minor.revision or greater.
 
#define DUNE_VERSION_LT_REV(module, major, minor, revision)    ! DUNE_VERSION_GTE_REV(module,major,minor,revision)
 True if 'module' has a version lower than major.minor.revision.
 
#define DUNE_VERSION_GT_REV(module, major, minor, revision)
 True if 'module' has a greater version than major.minor.revision.
 
#define DUNE_VERSION_LTE_REV(module, major, minor, revision)    ! DUNE_VERSION_GT_REV(module,major,minor,revision)
 True if 'module' has a version lower or equal to major.minor.revision.
 
#define DUNE_VERSION_ID(major, minor, revision)    ((unsigned int)((major << 24) + (minor << 16) + revision))
 Compute a unique uint id from the major, minor, and revision numbers.
 
#define DUNE_MODULE_VERSION_ID(module)    DUNE_VERSION_ID( DUNE_VERSION_JOIN(module,MAJOR), DUNE_VERSION_JOIN(module,MINOR), DUNE_VERSION_JOIN(module,REVISION) )
 Compute a unique uint id for the given module.
 
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │

│ │ │ +Namespaces

namespace  Dune
 Dune namespace.
 
│ │ │ -

Detailed Description

│ │ │ -

Various macros to work with Dune module version numbers.

│ │ │ -

Macro Definition Documentation

│ │ │ - │ │ │ -

◆ DUNE_MODULE_VERSION_ID

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
#define DUNE_MODULE_VERSION_ID( module)    DUNE_VERSION_ID( DUNE_VERSION_JOIN(module,MAJOR), DUNE_VERSION_JOIN(module,MINOR), DUNE_VERSION_JOIN(module,REVISION) )
│ │ │ -
│ │ │ - │ │ │ -

Compute a unique uint id for the given module.

│ │ │ -

For the DUNE core modules you need to use the following module names:

    │ │ │ -
  • DUNE_COMMON for dune-common
  • │ │ │ -
  • DUNE_GRID for dune-grid
  • │ │ │ -
  • DUNE_GEOMETRY for dune-geometry
  • │ │ │ -
  • DUNE_ISTL for dune-istl
  • │ │ │ -
  • DUNE_LOCALFUNCTIONS for dune-localfunctions
  • │ │ │ -
│ │ │ -

For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ -

◆ DUNE_VERSION_EQUAL

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
#define DUNE_VERSION_EQUAL( module,
 major,
 minor 
)
│ │ │ -
│ │ │ -Value:
((DUNE_VERSION_JOIN(module,MAJOR) == major) && \
│ │ │ -
(DUNE_VERSION_JOIN(module,MINOR) == minor))
│ │ │ -
#define DUNE_VERSION_JOIN(module, type)
Constructs the preprocessor name used in config.h to hold version numbers.
Definition version.hh:30
│ │ │ -
│ │ │ -

True if 'module' has the version major.minor.

│ │ │ -

For the DUNE core modules you need to use the following module names:

    │ │ │ -
  • DUNE_COMMON for dune-common
  • │ │ │ -
  • DUNE_GRID for dune-grid
  • │ │ │ -
  • DUNE_GEOMETRY for dune-geometry
  • │ │ │ -
  • DUNE_ISTL for dune-istl
  • │ │ │ -
  • DUNE_LOCALFUNCTIONS for dune-localfunctions
  • │ │ │ -
│ │ │ -

For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ -

◆ DUNE_VERSION_EQUAL_REV

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
#define DUNE_VERSION_EQUAL_REV( module,
 major,
 minor,
 revision 
)
│ │ │ -
│ │ │ -Value:
( DUNE_VERSION_EQUAL(module,major,minor) && \
│ │ │ -
(DUNE_VERSION_JOIN(module,REVISION) == revision))
│ │ │ -
#define DUNE_VERSION_EQUAL(module, major, minor)
True if 'module' has the version major.minor.
Definition version.hh:46
│ │ │ -
│ │ │ -

True if 'module' has the version major.minor.revision.

│ │ │ -

For the DUNE core modules you need to use the following module names:

    │ │ │ -
  • DUNE_COMMON for dune-common
  • │ │ │ -
  • DUNE_GRID for dune-grid
  • │ │ │ -
  • DUNE_GEOMETRY for dune-geometry
  • │ │ │ -
  • DUNE_ISTL for dune-istl
  • │ │ │ -
  • DUNE_LOCALFUNCTIONS for dune-localfunctions
  • │ │ │ -
│ │ │ -

For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ -

◆ DUNE_VERSION_GT

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
#define DUNE_VERSION_GT( module,
 major,
 minor 
)
│ │ │ -
│ │ │ -Value:
((DUNE_VERSION_JOIN(module,MAJOR) > major) \
│ │ │ -
|| ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) > minor)))
│ │ │ -
│ │ │ -

True if 'module' has a version greater than major.minor.

│ │ │ -

For the DUNE core modules you need to use the following module names:

    │ │ │ -
  • DUNE_COMMON for dune-common
  • │ │ │ -
  • DUNE_GRID for dune-grid
  • │ │ │ -
  • DUNE_GEOMETRY for dune-geometry
  • │ │ │ -
  • DUNE_ISTL for dune-istl
  • │ │ │ -
  • DUNE_LOCALFUNCTIONS for dune-localfunctions
  • │ │ │ -
│ │ │ -

For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ -

◆ DUNE_VERSION_GT_REV

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
#define DUNE_VERSION_GT_REV( module,
 major,
 minor,
 revision 
)
│ │ │ -
│ │ │ -Value:
((DUNE_VERSION_JOIN(module,MAJOR) > major) \
│ │ │ -
|| ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) > minor)) \
│ │ │ -
|| ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) == minor) \
│ │ │ -
&& (DUNE_VERSION_JOIN(module,REVISION) > revision)))
│ │ │ -
│ │ │ -

True if 'module' has a greater version than major.minor.revision.

│ │ │ -

For the DUNE core modules you need to use the following module names:

    │ │ │ -
  • DUNE_COMMON for dune-common
  • │ │ │ -
  • DUNE_GRID for dune-grid
  • │ │ │ -
  • DUNE_GEOMETRY for dune-geometry
  • │ │ │ -
  • DUNE_ISTL for dune-istl
  • │ │ │ -
  • DUNE_LOCALFUNCTIONS for dune-localfunctions
  • │ │ │ -
│ │ │ -

For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ -

◆ DUNE_VERSION_GTE

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
#define DUNE_VERSION_GTE( module,
 major,
 minor 
)
│ │ │ -
│ │ │ -Value:
((DUNE_VERSION_JOIN(module,MAJOR) > major) \
│ │ │ -
|| ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) >= minor)))
│ │ │ -
│ │ │ -

True if 'module' has the version major.minor or greater.

│ │ │ -

For the DUNE core modules you need to use the following module names:

    │ │ │ -
  • DUNE_COMMON for dune-common
  • │ │ │ -
  • DUNE_GRID for dune-grid
  • │ │ │ -
  • DUNE_GEOMETRY for dune-geometry
  • │ │ │ -
  • DUNE_ISTL for dune-istl
  • │ │ │ -
  • DUNE_LOCALFUNCTIONS for dune-localfunctions
  • │ │ │ -
│ │ │ -

For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ -

◆ DUNE_VERSION_GTE_REV

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
#define DUNE_VERSION_GTE_REV( module,
 major,
 minor,
 revision 
)
│ │ │ -
│ │ │ -Value:
((DUNE_VERSION_JOIN(module,MAJOR) > major) \
│ │ │ -
|| ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) > minor)) \
│ │ │ -
|| ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) == minor) \
│ │ │ -
&& (DUNE_VERSION_JOIN(module,REVISION) >= revision)))
│ │ │ -
│ │ │ -

True if 'module' has the version major.minor.revision or greater.

│ │ │ -

For the DUNE core modules you need to use the following module names:

    │ │ │ -
  • DUNE_COMMON for dune-common
  • │ │ │ -
  • DUNE_GRID for dune-grid
  • │ │ │ -
  • DUNE_GEOMETRY for dune-geometry
  • │ │ │ -
  • DUNE_ISTL for dune-istl
  • │ │ │ -
  • DUNE_LOCALFUNCTIONS for dune-localfunctions
  • │ │ │ -
│ │ │ -

For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ -

◆ DUNE_VERSION_ID

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
#define DUNE_VERSION_ID( major,
 minor,
 revision 
)    ((unsigned int)((major << 24) + (minor << 16) + revision))
│ │ │ -
│ │ │ - │ │ │ -

Compute a unique uint id from the major, minor, and revision numbers.

│ │ │ -

For the DUNE core modules you need to use the following module names:

    │ │ │ -
  • DUNE_COMMON for dune-common
  • │ │ │ -
  • DUNE_GRID for dune-grid
  • │ │ │ -
  • DUNE_GEOMETRY for dune-geometry
  • │ │ │ -
  • DUNE_ISTL for dune-istl
  • │ │ │ -
  • DUNE_LOCALFUNCTIONS for dune-localfunctions
  • │ │ │ -
│ │ │ -

For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ -

◆ DUNE_VERSION_JOIN

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
#define DUNE_VERSION_JOIN( module,
 type 
)   module ## _VERSION_ ## type
│ │ │ -
│ │ │ - │ │ │ -

Constructs the preprocessor name used in config.h to hold version numbers.

│ │ │ -

For the DUNE core modules you need to use the following module names:

    │ │ │ -
  • DUNE_COMMON for dune-common
  • │ │ │ -
  • DUNE_GRID for dune-grid
  • │ │ │ -
  • DUNE_GEOMETRY for dune-geometry
  • │ │ │ -
  • DUNE_ISTL for dune-istl
  • │ │ │ -
  • DUNE_LOCALFUNCTIONS for dune-localfunctions
  • │ │ │ -
│ │ │ -

For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

│ │ │ -
Parameters
│ │ │ - │ │ │ - │ │ │ - │ │ │ -
moduleThe name of the Dune module
typeThe version number type, one of MAJOR, MINOR, or REVISION
│ │ │ -
│ │ │ -
│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ -

◆ DUNE_VERSION_LT

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
#define DUNE_VERSION_LT( module,
 major,
 minor 
)    ! DUNE_VERSION_GTE(module,major,minor)
│ │ │ -
│ │ │ - │ │ │ -

True if 'module' has a version less than major.minor.

│ │ │ -

For the DUNE core modules you need to use the following module names:

    │ │ │ -
  • DUNE_COMMON for dune-common
  • │ │ │ -
  • DUNE_GRID for dune-grid
  • │ │ │ -
  • DUNE_GEOMETRY for dune-geometry
  • │ │ │ -
  • DUNE_ISTL for dune-istl
  • │ │ │ -
  • DUNE_LOCALFUNCTIONS for dune-localfunctions
  • │ │ │ -
│ │ │ -

For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ -

◆ DUNE_VERSION_LT_REV

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
#define DUNE_VERSION_LT_REV( module,
 major,
 minor,
 revision 
)    ! DUNE_VERSION_GTE_REV(module,major,minor,revision)
│ │ │ -
│ │ │ - │ │ │ -

True if 'module' has a version lower than major.minor.revision.

│ │ │ -

For the DUNE core modules you need to use the following module names:

    │ │ │ -
  • DUNE_COMMON for dune-common
  • │ │ │ -
  • DUNE_GRID for dune-grid
  • │ │ │ -
  • DUNE_GEOMETRY for dune-geometry
  • │ │ │ -
  • DUNE_ISTL for dune-istl
  • │ │ │ -
  • DUNE_LOCALFUNCTIONS for dune-localfunctions
  • │ │ │ -
│ │ │ -

For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ -

◆ DUNE_VERSION_LTE

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
#define DUNE_VERSION_LTE( module,
 major,
 minor 
)    ! DUNE_VERSION_GT(module,major,minor)
│ │ │ -
│ │ │ - │ │ │ -

True if 'module' has a version less than or equal to major.minor.

│ │ │ -

For the DUNE core modules you need to use the following module names:

    │ │ │ -
  • DUNE_COMMON for dune-common
  • │ │ │ -
  • DUNE_GRID for dune-grid
  • │ │ │ -
  • DUNE_GEOMETRY for dune-geometry
  • │ │ │ -
  • DUNE_ISTL for dune-istl
  • │ │ │ -
  • DUNE_LOCALFUNCTIONS for dune-localfunctions
  • │ │ │ -
│ │ │ -

For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ -

◆ DUNE_VERSION_LTE_REV

│ │ │ - │ │ │ -
│ │ │ -
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -
#define DUNE_VERSION_LTE_REV( module,
 major,
 minor,
 revision 
)    ! DUNE_VERSION_GT_REV(module,major,minor,revision)
│ │ │ -
│ │ │ - │ │ │ -

True if 'module' has a version lower or equal to major.minor.revision.

│ │ │ -

For the DUNE core modules you need to use the following module names:

    │ │ │ -
  • DUNE_COMMON for dune-common
  • │ │ │ -
  • DUNE_GRID for dune-grid
  • │ │ │ -
  • DUNE_GEOMETRY for dune-geometry
  • │ │ │ -
  • DUNE_ISTL for dune-istl
  • │ │ │ -
  • DUNE_LOCALFUNCTIONS for dune-localfunctions
  • │ │ │ -
│ │ │ -

For external DUNE modules, you should capitalize the name and replace '-' by underscores. For example for the module foo-bar you need to use FOO_BAR as module name in the context of this macro.

│ │ │ - │ │ │ -
│ │ │ -
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,306 +1,15 @@ │ │ │ │ dune-common 2.10 │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ * _d_u_n_e │ │ │ │ * _c_o_m_m_o_n │ │ │ │ -_M_a_c_r_o_s │ │ │ │ -version.hh File Reference │ │ │ │ -Various macros to work with Dune module version numbers. _M_o_r_e_._._. │ │ │ │ -#include │ │ │ │ -_G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ -MMaaccrrooss │ │ │ │ -#define  _D_U_N_E___V_E_R_S_I_O_N___J_O_I_N(module, type)   module ## _VERSION_ ## type │ │ │ │ -  Constructs the preprocessor name used in config.h to hold version │ │ │ │ - numbers. │ │ │ │ +_N_a_m_e_s_p_a_c_e_s │ │ │ │ +ios_state.cc File Reference │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_i_o_s___s_t_a_t_e_._h_h> │ │ │ │ +NNaammeessppaacceess │ │ │ │ +namespace   _D_u_n_e │ │ │ │ +  _D_u_n_e namespace. │ │ │ │   │ │ │ │ -#define  _D_U_N_E___V_E_R_S_I_O_N___E_Q_U_A_L(module, major, minor) │ │ │ │ -  True if 'module' has the version major.minor. │ │ │ │ -  │ │ │ │ -#define  _D_U_N_E___V_E_R_S_I_O_N___E_Q_U_A_L___R_E_V(module, major, minor, revision) │ │ │ │ -  True if 'module' has the version major.minor.revision. │ │ │ │ -  │ │ │ │ -#define  _D_U_N_E___V_E_R_S_I_O_N___G_T_E(module, major, minor) │ │ │ │ -  True if 'module' has the version major.minor or greater. │ │ │ │ -  │ │ │ │ -#define  _D_U_N_E___V_E_R_S_I_O_N___L_T(module, major, minor)    ! _D_U_N_E___V_E_R_S_I_O_N___G_T_E │ │ │ │ - (module,major,minor) │ │ │ │ -  True if 'module' has a version less than major.minor. │ │ │ │ -  │ │ │ │ -#define  _D_U_N_E___V_E_R_S_I_O_N___G_T(module, major, minor) │ │ │ │ -  True if 'module' has a version greater than major.minor. │ │ │ │ -  │ │ │ │ -#define  _D_U_N_E___V_E_R_S_I_O_N___L_T_E(module, major, minor)    ! _D_U_N_E___V_E_R_S_I_O_N___G_T │ │ │ │ - (module,major,minor) │ │ │ │ -  True if 'module' has a version less than or equal to major.minor. │ │ │ │ -  │ │ │ │ -#define  _D_U_N_E___V_E_R_S_I_O_N___G_T_E___R_E_V(module, major, minor, revision) │ │ │ │ -  True if 'module' has the version major.minor.revision or greater. │ │ │ │ -  │ │ │ │ -#define  _D_U_N_E___V_E_R_S_I_O_N___L_T___R_E_V(module, major, minor, revision)    ! │ │ │ │ - _D_U_N_E___V_E_R_S_I_O_N___G_T_E___R_E_V(module,major,minor,revision) │ │ │ │ -  True if 'module' has a version lower than major.minor.revision. │ │ │ │ -  │ │ │ │ -#define  _D_U_N_E___V_E_R_S_I_O_N___G_T___R_E_V(module, major, minor, revision) │ │ │ │ -  True if 'module' has a greater version than major.minor.revision. │ │ │ │ -  │ │ │ │ -#define  _D_U_N_E___V_E_R_S_I_O_N___L_T_E___R_E_V(module, major, minor, revision)    ! │ │ │ │ - _D_U_N_E___V_E_R_S_I_O_N___G_T___R_E_V(module,major,minor,revision) │ │ │ │ -  True if 'module' has a version lower or equal to major.minor.revision. │ │ │ │ -  │ │ │ │ -#define  _D_U_N_E___V_E_R_S_I_O_N___I_D(major, minor, revision)    ((unsigned int)((major << │ │ │ │ - 24) + (minor << 16) + revision)) │ │ │ │ -  Compute a unique uint id from the major, minor, and revision numbers. │ │ │ │ -  │ │ │ │ -#define  _D_U_N_E___M_O_D_U_L_E___V_E_R_S_I_O_N___I_D(module)    _D_U_N_E___V_E_R_S_I_O_N___I_D( _D_U_N_E___V_E_R_S_I_O_N___J_O_I_N │ │ │ │ - (module,MAJOR), _D_U_N_E___V_E_R_S_I_O_N___J_O_I_N(module,MINOR), _D_U_N_E___V_E_R_S_I_O_N___J_O_I_N │ │ │ │ - (module,REVISION) ) │ │ │ │ -  Compute a unique uint id for the given module. │ │ │ │ -  │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ -Various macros to work with Dune module version numbers. │ │ │ │ -********** MMaaccrroo DDeeffiinniittiioonn DDooccuummeennttaattiioonn ********** │ │ │ │ -********** _?◆_? DDUUNNEE__MMOODDUULLEE__VVEERRSSIIOONN__IIDD ********** │ │ │ │ -     _D_U_N_E___V_E_R_S_I_O_N___I_D │ │ │ │ - ( _D_U_N_E___V_E_R_S_I_O_N___J_O_I_N(module,MAJOR), │ │ │ │ -#define DUNE_MODULE_VERSION_ID (   module ) _D_U_N_E___V_E_R_S_I_O_N___J_O_I_N(module,MINOR), │ │ │ │ - _D_U_N_E___V_E_R_S_I_O_N___J_O_I_N(module,REVISION) │ │ │ │ - ) │ │ │ │ -Compute a unique uint id for the given module. │ │ │ │ -For the DUNE core modules you need to use the following module names: │ │ │ │ - * DUNE_COMMON for dune-common │ │ │ │ - * DUNE_GRID for dune-grid │ │ │ │ - * DUNE_GEOMETRY for dune-geometry │ │ │ │ - * DUNE_ISTL for dune-istl │ │ │ │ - * DUNE_LOCALFUNCTIONS for dune-localfunctions │ │ │ │ -For external DUNE modules, you should capitalize the name and replace '-' by │ │ │ │ -underscores. For example for the module foo-bar you need to use FOO_BAR as │ │ │ │ -module name in the context of this macro. │ │ │ │ -********** _?◆_? DDUUNNEE__VVEERRSSIIOONN__EEQQUUAALL ********** │ │ │ │ -#define DUNE_VERSION_EQUAL (   module, │ │ │ │ -   major, │ │ │ │ -   minor  │ │ │ │ - ) │ │ │ │ -VVaalluuee:: │ │ │ │ -((_D_U_N_E___V_E_R_S_I_O_N___J_O_I_N(module,MAJOR) == major) && \ │ │ │ │ -(_D_U_N_E___V_E_R_S_I_O_N___J_O_I_N(module,MINOR) == minor)) │ │ │ │ -_D_U_N_E___V_E_R_S_I_O_N___J_O_I_N │ │ │ │ -#define DUNE_VERSION_JOIN(module, type) │ │ │ │ -Constructs the preprocessor name used in config.h to hold version numbers. │ │ │ │ -DDeeffiinniittiioonn version.hh:30 │ │ │ │ -True if 'module' has the version major.minor. │ │ │ │ -For the DUNE core modules you need to use the following module names: │ │ │ │ - * DUNE_COMMON for dune-common │ │ │ │ - * DUNE_GRID for dune-grid │ │ │ │ - * DUNE_GEOMETRY for dune-geometry │ │ │ │ - * DUNE_ISTL for dune-istl │ │ │ │ - * DUNE_LOCALFUNCTIONS for dune-localfunctions │ │ │ │ -For external DUNE modules, you should capitalize the name and replace '-' by │ │ │ │ -underscores. For example for the module foo-bar you need to use FOO_BAR as │ │ │ │ -module name in the context of this macro. │ │ │ │ -********** _?◆_? DDUUNNEE__VVEERRSSIIOONN__EEQQUUAALL__RREEVV ********** │ │ │ │ -#define DUNE_VERSION_EQUAL_REV (   module, │ │ │ │ -   major, │ │ │ │ -   minor, │ │ │ │ -   revision  │ │ │ │ - ) │ │ │ │ -VVaalluuee:: │ │ │ │ -( _D_U_N_E___V_E_R_S_I_O_N___E_Q_U_A_L(module,major,minor) && \ │ │ │ │ -(_D_U_N_E___V_E_R_S_I_O_N___J_O_I_N(module,REVISION) == revision)) │ │ │ │ -_D_U_N_E___V_E_R_S_I_O_N___E_Q_U_A_L │ │ │ │ -#define DUNE_VERSION_EQUAL(module, major, minor) │ │ │ │ -True if 'module' has the version major.minor. │ │ │ │ -DDeeffiinniittiioonn version.hh:46 │ │ │ │ -True if 'module' has the version major.minor.revision. │ │ │ │ -For the DUNE core modules you need to use the following module names: │ │ │ │ - * DUNE_COMMON for dune-common │ │ │ │ - * DUNE_GRID for dune-grid │ │ │ │ - * DUNE_GEOMETRY for dune-geometry │ │ │ │ - * DUNE_ISTL for dune-istl │ │ │ │ - * DUNE_LOCALFUNCTIONS for dune-localfunctions │ │ │ │ -For external DUNE modules, you should capitalize the name and replace '-' by │ │ │ │ -underscores. For example for the module foo-bar you need to use FOO_BAR as │ │ │ │ -module name in the context of this macro. │ │ │ │ -********** _?◆_? DDUUNNEE__VVEERRSSIIOONN__GGTT ********** │ │ │ │ -#define DUNE_VERSION_GT (   module, │ │ │ │ -   major, │ │ │ │ -   minor  │ │ │ │ - ) │ │ │ │ -VVaalluuee:: │ │ │ │ -((_D_U_N_E___V_E_R_S_I_O_N___J_O_I_N(module,MAJOR) > major) \ │ │ │ │ -|| ((_D_U_N_E___V_E_R_S_I_O_N___J_O_I_N(module,MAJOR) == major) && (_D_U_N_E___V_E_R_S_I_O_N___J_O_I_N │ │ │ │ -(module,MINOR) > minor))) │ │ │ │ -True if 'module' has a version greater than major.minor. │ │ │ │ -For the DUNE core modules you need to use the following module names: │ │ │ │ - * DUNE_COMMON for dune-common │ │ │ │ - * DUNE_GRID for dune-grid │ │ │ │ - * DUNE_GEOMETRY for dune-geometry │ │ │ │ - * DUNE_ISTL for dune-istl │ │ │ │ - * DUNE_LOCALFUNCTIONS for dune-localfunctions │ │ │ │ -For external DUNE modules, you should capitalize the name and replace '-' by │ │ │ │ -underscores. For example for the module foo-bar you need to use FOO_BAR as │ │ │ │ -module name in the context of this macro. │ │ │ │ -********** _?◆_? DDUUNNEE__VVEERRSSIIOONN__GGTT__RREEVV ********** │ │ │ │ -#define DUNE_VERSION_GT_REV (   module, │ │ │ │ -   major, │ │ │ │ -   minor, │ │ │ │ -   revision  │ │ │ │ - ) │ │ │ │ -VVaalluuee:: │ │ │ │ -((_D_U_N_E___V_E_R_S_I_O_N___J_O_I_N(module,MAJOR) > major) \ │ │ │ │ -|| ((_D_U_N_E___V_E_R_S_I_O_N___J_O_I_N(module,MAJOR) == major) && (_D_U_N_E___V_E_R_S_I_O_N___J_O_I_N │ │ │ │ -(module,MINOR) > minor)) \ │ │ │ │ -|| ((_D_U_N_E___V_E_R_S_I_O_N___J_O_I_N(module,MAJOR) == major) && (_D_U_N_E___V_E_R_S_I_O_N___J_O_I_N │ │ │ │ -(module,MINOR) == minor) \ │ │ │ │ -&& (_D_U_N_E___V_E_R_S_I_O_N___J_O_I_N(module,REVISION) > revision))) │ │ │ │ -True if 'module' has a greater version than major.minor.revision. │ │ │ │ -For the DUNE core modules you need to use the following module names: │ │ │ │ - * DUNE_COMMON for dune-common │ │ │ │ - * DUNE_GRID for dune-grid │ │ │ │ - * DUNE_GEOMETRY for dune-geometry │ │ │ │ - * DUNE_ISTL for dune-istl │ │ │ │ - * DUNE_LOCALFUNCTIONS for dune-localfunctions │ │ │ │ -For external DUNE modules, you should capitalize the name and replace '-' by │ │ │ │ -underscores. For example for the module foo-bar you need to use FOO_BAR as │ │ │ │ -module name in the context of this macro. │ │ │ │ -********** _?◆_? DDUUNNEE__VVEERRSSIIOONN__GGTTEE ********** │ │ │ │ -#define DUNE_VERSION_GTE (   module, │ │ │ │ -   major, │ │ │ │ -   minor  │ │ │ │ - ) │ │ │ │ -VVaalluuee:: │ │ │ │ -((_D_U_N_E___V_E_R_S_I_O_N___J_O_I_N(module,MAJOR) > major) \ │ │ │ │ -|| ((_D_U_N_E___V_E_R_S_I_O_N___J_O_I_N(module,MAJOR) == major) && (_D_U_N_E___V_E_R_S_I_O_N___J_O_I_N │ │ │ │ -(module,MINOR) >= minor))) │ │ │ │ -True if 'module' has the version major.minor or greater. │ │ │ │ -For the DUNE core modules you need to use the following module names: │ │ │ │ - * DUNE_COMMON for dune-common │ │ │ │ - * DUNE_GRID for dune-grid │ │ │ │ - * DUNE_GEOMETRY for dune-geometry │ │ │ │ - * DUNE_ISTL for dune-istl │ │ │ │ - * DUNE_LOCALFUNCTIONS for dune-localfunctions │ │ │ │ -For external DUNE modules, you should capitalize the name and replace '-' by │ │ │ │ -underscores. For example for the module foo-bar you need to use FOO_BAR as │ │ │ │ -module name in the context of this macro. │ │ │ │ -********** _?◆_? DDUUNNEE__VVEERRSSIIOONN__GGTTEE__RREEVV ********** │ │ │ │ -#define DUNE_VERSION_GTE_REV (   module, │ │ │ │ -   major, │ │ │ │ -   minor, │ │ │ │ -   revision  │ │ │ │ - ) │ │ │ │ -VVaalluuee:: │ │ │ │ -((_D_U_N_E___V_E_R_S_I_O_N___J_O_I_N(module,MAJOR) > major) \ │ │ │ │ -|| ((_D_U_N_E___V_E_R_S_I_O_N___J_O_I_N(module,MAJOR) == major) && (_D_U_N_E___V_E_R_S_I_O_N___J_O_I_N │ │ │ │ -(module,MINOR) > minor)) \ │ │ │ │ -|| ((_D_U_N_E___V_E_R_S_I_O_N___J_O_I_N(module,MAJOR) == major) && (_D_U_N_E___V_E_R_S_I_O_N___J_O_I_N │ │ │ │ -(module,MINOR) == minor) \ │ │ │ │ -&& (_D_U_N_E___V_E_R_S_I_O_N___J_O_I_N(module,REVISION) >= revision))) │ │ │ │ -True if 'module' has the version major.minor.revision or greater. │ │ │ │ -For the DUNE core modules you need to use the following module names: │ │ │ │ - * DUNE_COMMON for dune-common │ │ │ │ - * DUNE_GRID for dune-grid │ │ │ │ - * DUNE_GEOMETRY for dune-geometry │ │ │ │ - * DUNE_ISTL for dune-istl │ │ │ │ - * DUNE_LOCALFUNCTIONS for dune-localfunctions │ │ │ │ -For external DUNE modules, you should capitalize the name and replace '-' by │ │ │ │ -underscores. For example for the module foo-bar you need to use FOO_BAR as │ │ │ │ -module name in the context of this macro. │ │ │ │ -********** _?◆_? DDUUNNEE__VVEERRSSIIOONN__IIDD ********** │ │ │ │ -#define DUNE_VERSION_ID (   major, │ │ │ │ -   minor, │ │ │ │ -   revision  │ │ │ │ - )     ((unsigned int)((major << 24) + (minor << 16) + │ │ │ │ - revision)) │ │ │ │ -Compute a unique uint id from the major, minor, and revision numbers. │ │ │ │ -For the DUNE core modules you need to use the following module names: │ │ │ │ - * DUNE_COMMON for dune-common │ │ │ │ - * DUNE_GRID for dune-grid │ │ │ │ - * DUNE_GEOMETRY for dune-geometry │ │ │ │ - * DUNE_ISTL for dune-istl │ │ │ │ - * DUNE_LOCALFUNCTIONS for dune-localfunctions │ │ │ │ -For external DUNE modules, you should capitalize the name and replace '-' by │ │ │ │ -underscores. For example for the module foo-bar you need to use FOO_BAR as │ │ │ │ -module name in the context of this macro. │ │ │ │ -********** _?◆_? DDUUNNEE__VVEERRSSIIOONN__JJOOIINN ********** │ │ │ │ -#define DUNE_VERSION_JOIN (   module, │ │ │ │ -   type  │ │ │ │ - )    module ## _VERSION_ ## type │ │ │ │ -Constructs the preprocessor name used in config.h to hold version numbers. │ │ │ │ -For the DUNE core modules you need to use the following module names: │ │ │ │ - * DUNE_COMMON for dune-common │ │ │ │ - * DUNE_GRID for dune-grid │ │ │ │ - * DUNE_GEOMETRY for dune-geometry │ │ │ │ - * DUNE_ISTL for dune-istl │ │ │ │ - * DUNE_LOCALFUNCTIONS for dune-localfunctions │ │ │ │ -For external DUNE modules, you should capitalize the name and replace '-' by │ │ │ │ -underscores. For example for the module foo-bar you need to use FOO_BAR as │ │ │ │ -module name in the context of this macro. │ │ │ │ - Parameters │ │ │ │ - module The name of the _D_u_n_e module │ │ │ │ - type The version number type, one of MAJOR, MINOR, or REVISION │ │ │ │ -********** _?◆_? DDUUNNEE__VVEERRSSIIOONN__LLTT ********** │ │ │ │ -#define DUNE_VERSION_LT (   module, │ │ │ │ -   major, │ │ │ │ -   minor  │ │ │ │ - )     ! _D_U_N_E___V_E_R_S_I_O_N___G_T_E(module,major,minor) │ │ │ │ -True if 'module' has a version less than major.minor. │ │ │ │ -For the DUNE core modules you need to use the following module names: │ │ │ │ - * DUNE_COMMON for dune-common │ │ │ │ - * DUNE_GRID for dune-grid │ │ │ │ - * DUNE_GEOMETRY for dune-geometry │ │ │ │ - * DUNE_ISTL for dune-istl │ │ │ │ - * DUNE_LOCALFUNCTIONS for dune-localfunctions │ │ │ │ -For external DUNE modules, you should capitalize the name and replace '-' by │ │ │ │ -underscores. For example for the module foo-bar you need to use FOO_BAR as │ │ │ │ -module name in the context of this macro. │ │ │ │ -********** _?◆_? DDUUNNEE__VVEERRSSIIOONN__LLTT__RREEVV ********** │ │ │ │ -#define DUNE_VERSION_LT_REV (   module, │ │ │ │ -   major, │ │ │ │ -   minor, │ │ │ │ -   revision  │ │ │ │ - )     ! _D_U_N_E___V_E_R_S_I_O_N___G_T_E___R_E_V │ │ │ │ - (module,major,minor,revision) │ │ │ │ -True if 'module' has a version lower than major.minor.revision. │ │ │ │ -For the DUNE core modules you need to use the following module names: │ │ │ │ - * DUNE_COMMON for dune-common │ │ │ │ - * DUNE_GRID for dune-grid │ │ │ │ - * DUNE_GEOMETRY for dune-geometry │ │ │ │ - * DUNE_ISTL for dune-istl │ │ │ │ - * DUNE_LOCALFUNCTIONS for dune-localfunctions │ │ │ │ -For external DUNE modules, you should capitalize the name and replace '-' by │ │ │ │ -underscores. For example for the module foo-bar you need to use FOO_BAR as │ │ │ │ -module name in the context of this macro. │ │ │ │ -********** _?◆_? DDUUNNEE__VVEERRSSIIOONN__LLTTEE ********** │ │ │ │ -#define DUNE_VERSION_LTE (   module, │ │ │ │ -   major, │ │ │ │ -   minor  │ │ │ │ - )     ! _D_U_N_E___V_E_R_S_I_O_N___G_T(module,major,minor) │ │ │ │ -True if 'module' has a version less than or equal to major.minor. │ │ │ │ -For the DUNE core modules you need to use the following module names: │ │ │ │ - * DUNE_COMMON for dune-common │ │ │ │ - * DUNE_GRID for dune-grid │ │ │ │ - * DUNE_GEOMETRY for dune-geometry │ │ │ │ - * DUNE_ISTL for dune-istl │ │ │ │ - * DUNE_LOCALFUNCTIONS for dune-localfunctions │ │ │ │ -For external DUNE modules, you should capitalize the name and replace '-' by │ │ │ │ -underscores. For example for the module foo-bar you need to use FOO_BAR as │ │ │ │ -module name in the context of this macro. │ │ │ │ -********** _?◆_? DDUUNNEE__VVEERRSSIIOONN__LLTTEE__RREEVV ********** │ │ │ │ -#define DUNE_VERSION_LTE_REV (   module, │ │ │ │ -   major, │ │ │ │ -   minor, │ │ │ │ -   revision  │ │ │ │ - )     ! _D_U_N_E___V_E_R_S_I_O_N___G_T___R_E_V │ │ │ │ - (module,major,minor,revision) │ │ │ │ -True if 'module' has a version lower or equal to major.minor.revision. │ │ │ │ -For the DUNE core modules you need to use the following module names: │ │ │ │ - * DUNE_COMMON for dune-common │ │ │ │ - * DUNE_GRID for dune-grid │ │ │ │ - * DUNE_GEOMETRY for dune-geometry │ │ │ │ - * DUNE_ISTL for dune-istl │ │ │ │ - * DUNE_LOCALFUNCTIONS for dune-localfunctions │ │ │ │ -For external DUNE modules, you should capitalize the name and replace '-' by │ │ │ │ -underscores. For example for the module foo-bar you need to use FOO_BAR as │ │ │ │ -module name in the context of this macro. │ │ │ │ =============================================================================== │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00014.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: vc.hh File Reference │ │ │ +dune-common: memory.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,29 +65,46 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
vc.hh File Reference
│ │ │ +
│ │ │ +Namespaces | │ │ │ +Functions
│ │ │ +
memory.hh File Reference
│ │ │
│ │ │
│ │ │ - │ │ │ -

Compatibility header for including <Vc/Vc> │ │ │ -More...

│ │ │ - │ │ │ +
#include <memory>
│ │ │ +#include <type_traits>
│ │ │ +#include <dune/common/typeutilities.hh>
│ │ │ +
│ │ │

Go to the source code of this file.

│ │ │ -

Detailed Description

│ │ │ -

Compatibility header for including <Vc/Vc>

│ │ │ -

Certain versions (1.3.2) of Vc (https://github.com/VcDevel/Vc) have a problem with certain compiler versions (g++ 7.2.0) in c++17 mode, see #88.

│ │ │ -
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +

│ │ │ +Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::Std
 Namespace for features backported from new C++ standards.
 
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +

│ │ │ +Functions

template<class T >
constexpr auto Dune::Std::to_address (T &&p) noexcept
 Obtain the address represented by p without forming a reference to the object pointed to by p.
 
│ │ │ + │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,15 +1,28 @@ │ │ │ │ dune-common 2.10 │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ * _d_u_n_e │ │ │ │ * _c_o_m_m_o_n │ │ │ │ -vc.hh File Reference │ │ │ │ -Compatibility header for including _M_o_r_e_._._. │ │ │ │ + * _s_t_d │ │ │ │ +_N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ +memory.hh File Reference │ │ │ │ +#include │ │ │ │ +#include │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ -Compatibility header for including │ │ │ │ -Certain versions (1.3.2) of Vc (_h_t_t_p_s_:_/_/_g_i_t_h_u_b_._c_o_m_/_V_c_D_e_v_e_l_/_V_c) have a problem │ │ │ │ -with certain compiler versions (g++ 7.2.0) in c++17 mode, see #88. │ │ │ │ +NNaammeessppaacceess │ │ │ │ +namespace   _D_u_n_e │ │ │ │ +  _D_u_n_e namespace. │ │ │ │ +  │ │ │ │ +namespace   _D_u_n_e_:_:_S_t_d │ │ │ │ +  Namespace for features backported from new C++ standards. │ │ │ │ +  │ │ │ │ +FFuunnccttiioonnss │ │ │ │ +template │ │ │ │ +constexpr auto  _D_u_n_e_:_:_S_t_d_:_:_t_o___a_d_d_r_e_s_s (T &&p) noexcept │ │ │ │ +  Obtain the address represented by p without forming a reference │ │ │ │ + to the object pointed to by p. │ │ │ │ +  │ │ │ │ =============================================================================== │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00014_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: vc.hh Source File │ │ │ +dune-common: memory.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,42 +70,82 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
vc.hh
│ │ │ +
memory.hh
│ │ │
│ │ │
│ │ │ -Go to the documentation of this file.
1// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
│ │ │ -
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ -
3#ifndef DUNE_COMMON_VC_HH
│ │ │ -
4#define DUNE_COMMON_VC_HH
│ │ │ -
5
│ │ │ -
15#if HAVE_VC
│ │ │ +Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ +
2// vi: set et ts=4 sw=2 sts=2:
│ │ │ +
3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
│ │ │ +
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ +
5#ifndef DUNE_COMMON_STD_MEMORY_HH
│ │ │ +
6#define DUNE_COMMON_STD_MEMORY_HH
│ │ │ +
7
│ │ │ +
8#include <memory>
│ │ │ +
9#include <type_traits>
│ │ │ +
10
│ │ │ + │ │ │ +
12
│ │ │ +
13namespace Dune::Std {
│ │ │ +
14
│ │ │ +
15#if __cpp_lib_to_address >= 201711L
│ │ │
16
│ │ │ -
17// include Vc's macro definitions
│ │ │ -
18#include <Vc/global.h>
│ │ │ -
19
│ │ │ -
20// undefine the macro that signals C++17 support, if set
│ │ │ -
21#ifdef Vc_CXX17
│ │ │ -
22#undef Vc_CXX17
│ │ │ -
23#endif
│ │ │ -
24
│ │ │ -
25// include the rest of Vc
│ │ │ -
26#include <Vc/Vc>
│ │ │ -
27
│ │ │ -
28#endif // HAVE_VC
│ │ │ +
17using std::to_address;
│ │ │ +
18
│ │ │ +
19#else
│ │ │ +
20
│ │ │ +
21namespace Impl {
│ │ │ +
22
│ │ │ +
23template <class T>
│ │ │ +
24constexpr T* toAddressImpl (T* p, Dune::PriorityTag<2>) noexcept
│ │ │ +
25{
│ │ │ +
26 static_assert(!std::is_function_v<T>);
│ │ │ +
27 return p;
│ │ │ +
28}
│ │ │
29
│ │ │ -
30#endif // DUNE_COMMON_VC_HH
│ │ │ +
30template <class T>
│ │ │ +
31constexpr auto toAddressImpl (const T& p, Dune::PriorityTag<1>) noexcept
│ │ │ +
32 -> decltype(std::pointer_traits<T>::to_address(p))
│ │ │ +
33{
│ │ │ +
34 return std::pointer_traits<T>::to_address(p);
│ │ │ +
35}
│ │ │ +
36
│ │ │ +
37template <class T>
│ │ │ +
38constexpr auto toAddressImpl (const T& p, Dune::PriorityTag<0>) noexcept
│ │ │ +
39{
│ │ │ +
40 return toAddressImpl(p.operator->(), Dune::PriorityTag<3>{});
│ │ │ +
41}
│ │ │ +
42
│ │ │ +
43} // end namespace Impl
│ │ │ +
44
│ │ │ +
46template <class T>
│ │ │ +
│ │ │ +
47constexpr auto to_address(T&& p) noexcept
│ │ │ +
48{
│ │ │ +
49 return Impl::toAddressImpl(std::forward<T>(p), Dune::PriorityTag<3>{});
│ │ │ +
50}
│ │ │ +
│ │ │ +
51
│ │ │ +
52#endif
│ │ │ +
53
│ │ │ +
54} // end namespace Dune::Std
│ │ │ +
55
│ │ │ +
56#endif // DUNE_COMMON_STD_MEMORY_HH
│ │ │ +
Utilities for type computations, constraining overloads, ...
│ │ │ +
Namespace for features backported from new C++ standards.
Definition default_accessor.hh:10
│ │ │ +
constexpr auto to_address(T &&p) noexcept
Obtain the address represented by p without forming a reference to the object pointed to by p.
Definition memory.hh:47
│ │ │ +
Helper class for tagging priorities.
Definition typeutilities.hh:73
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,32 +1,80 @@ │ │ │ │ dune-common 2.10 │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ * _d_u_n_e │ │ │ │ * _c_o_m_m_o_n │ │ │ │ -vc.hh │ │ │ │ + * _s_t_d │ │ │ │ +memory.hh │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ -1// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ +1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ +2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ +3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ LICENSE.md in module root │ │ │ │ -2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ -3#ifndef DUNE_COMMON_VC_HH │ │ │ │ -4#define DUNE_COMMON_VC_HH │ │ │ │ -5 │ │ │ │ -15#if HAVE_VC │ │ │ │ +4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ +5#ifndef DUNE_COMMON_STD_MEMORY_HH │ │ │ │ +6#define DUNE_COMMON_STD_MEMORY_HH │ │ │ │ +7 │ │ │ │ +8#include │ │ │ │ +9#include │ │ │ │ +10 │ │ │ │ +11#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ +12 │ │ │ │ +13namespace _D_u_n_e_:_:_S_t_d { │ │ │ │ +14 │ │ │ │ +15#if __cpp_lib_to_address >= 201711L │ │ │ │ 16 │ │ │ │ -17// include Vc's macro definitions │ │ │ │ -18#include │ │ │ │ -19 │ │ │ │ -20// undefine the macro that signals C++17 support, if set │ │ │ │ -21#ifdef Vc_CXX17 │ │ │ │ -22#undef Vc_CXX17 │ │ │ │ -23#endif │ │ │ │ -24 │ │ │ │ -25// include the rest of Vc │ │ │ │ -26#include │ │ │ │ -27 │ │ │ │ -28#endif // HAVE_VC │ │ │ │ +17using std::to_address; │ │ │ │ +18 │ │ │ │ +19#else │ │ │ │ +20 │ │ │ │ +21namespace Impl { │ │ │ │ +22 │ │ │ │ +23template │ │ │ │ +24constexpr T* toAddressImpl (T* p, _D_u_n_e_:_:_P_r_i_o_r_i_t_y_T_a_g_<_2_>) noexcept │ │ │ │ +25{ │ │ │ │ +26 static_assert(!std::is_function_v); │ │ │ │ +27 return p; │ │ │ │ +28} │ │ │ │ 29 │ │ │ │ -30#endif // DUNE_COMMON_VC_HH │ │ │ │ +30template │ │ │ │ +31constexpr auto toAddressImpl (const T& p, _D_u_n_e_:_:_P_r_i_o_r_i_t_y_T_a_g_<_1_>) noexcept │ │ │ │ +32 -> decltype(std::pointer_traits::to_address(p)) │ │ │ │ +33{ │ │ │ │ +34 return std::pointer_traits::to_address(p); │ │ │ │ +35} │ │ │ │ +36 │ │ │ │ +37template │ │ │ │ +38constexpr auto toAddressImpl (const T& p, _D_u_n_e_:_:_P_r_i_o_r_i_t_y_T_a_g_<_0_>) noexcept │ │ │ │ +39{ │ │ │ │ +40 return toAddressImpl(p.operator->(), _D_u_n_e_:_:_P_r_i_o_r_i_t_y_T_a_g_<_3_>{}); │ │ │ │ +41} │ │ │ │ +42 │ │ │ │ +43} // end namespace Impl │ │ │ │ +44 │ │ │ │ +46template │ │ │ │ +_4_7constexpr auto _t_o___a_d_d_r_e_s_s(T&& p) noexcept │ │ │ │ +48{ │ │ │ │ +49 return Impl::toAddressImpl(std::forward(p), _D_u_n_e_:_:_P_r_i_o_r_i_t_y_T_a_g_<_3_>{}); │ │ │ │ +50} │ │ │ │ +51 │ │ │ │ +52#endif │ │ │ │ +53 │ │ │ │ +54} // end namespace Dune::Std │ │ │ │ +55 │ │ │ │ +56#endif // DUNE_COMMON_STD_MEMORY_HH │ │ │ │ +_t_y_p_e_u_t_i_l_i_t_i_e_s_._h_h │ │ │ │ +Utilities for type computations, constraining overloads, ... │ │ │ │ +_D_u_n_e_:_:_S_t_d │ │ │ │ +Namespace for features backported from new C++ standards. │ │ │ │ +DDeeffiinniittiioonn default_accessor.hh:10 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_t_o___a_d_d_r_e_s_s │ │ │ │ +constexpr auto to_address(T &&p) noexcept │ │ │ │ +Obtain the address represented by p without forming a reference to the object │ │ │ │ +pointed to by p. │ │ │ │ +DDeeffiinniittiioonn memory.hh:47 │ │ │ │ +_D_u_n_e_:_:_P_r_i_o_r_i_t_y_T_a_g │ │ │ │ +Helper class for tagging priorities. │ │ │ │ +DDeeffiinniittiioonn typeutilities.hh:73 │ │ │ │ =============================================================================== │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00017.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: unused.hh File Reference │ │ │ +dune-common: mdspan.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,36 +65,78 @@ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │
│ │ │ -Macros
│ │ │ -
unused.hh File Reference
│ │ │ +Classes | │ │ │ +Namespaces | │ │ │ +Functions
│ │ │ +
mdspan.hh File Reference
│ │ │ │ │ │
│ │ │ - │ │ │ -

Definition of the DUNE_UNUSED_PARAMETER macro. │ │ │ -More...

│ │ │ - │ │ │ +
#include <array>
│ │ │ +#include <type_traits>
│ │ │ +#include <utility>
│ │ │ +#include <dune/common/indices.hh>
│ │ │ +#include <dune/common/std/default_accessor.hh>
│ │ │ +#include <dune/common/std/extents.hh>
│ │ │ +#include <dune/common/std/layout_right.hh>
│ │ │ +#include <dune/common/std/span.hh>
│ │ │ +
│ │ │

Go to the source code of this file.

│ │ │ │ │ │ - │ │ │ - │ │ │ - │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +

│ │ │ -Macros

#define DUNE_UNUSED_PARAMETER(param)   static_cast<void>(param)
 

│ │ │ +Classes

class  Dune::Std::mdspan< Element, Extents, LayoutPolicy, AccessorPolicy >
 A multi-dimensional non-owning array view. More...
 
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +

│ │ │ +Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::Std
 Namespace for features backported from new C++ standards.
 
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │

│ │ │ +Functions

template<class CArray , std::enable_if_t< std::is_array_v< CArray >, int > = 0, std::enable_if_t<(std::rank_v< CArray >==1), int > = 0>
 Dune::Std::mdspan (CArray &) -> mdspan< std::remove_all_extents_t< CArray >, Std::extents< std::size_t, std::extent_v< CArray, 0 > > >
 
template<class Pointer , std::enable_if_t< std::is_pointer_v< std::remove_reference_t< Pointer > >, int > = 0>
 Dune::Std::mdspan (Pointer &&) -> mdspan< std::remove_pointer_t< std::remove_reference_t< Pointer > >, Std::extents< std::size_t > >
 
template<class ElementType , class... II, std::enable_if_t<(... &&std::is_convertible_v< II, std::size_t >), int > = 0, std::enable_if_t<(sizeof...(II) > 0), int > = 0>
 Dune::Std::mdspan (ElementType *, II...) -> mdspan< ElementType, Std::dextents< std::size_t, sizeof...(II)> >
 
template<class ElementType , class SizeType , std::size_t N>
 Dune::Std::mdspan (ElementType *, Std::span< SizeType, N > &) -> mdspan< ElementType, Std::dextents< std::size_t, N > >
 
template<class ElementType , class SizeType , std::size_t N>
 Dune::Std::mdspan (ElementType *, const std::array< SizeType, N > &) -> mdspan< ElementType, Std::dextents< std::size_t, N > >
 
template<class ElementType , class IndexType , std::size_t... exts>
 Dune::Std::mdspan (ElementType *, const Std::extents< IndexType, exts... > &) -> mdspan< ElementType, Std::extents< IndexType, exts... > >
 
template<class ElementType , class Mapping , class Extents = typename Mapping::extents_type, class Layout = typename Mapping::layout_type>
 Dune::Std::mdspan (ElementType *, const Mapping &) -> mdspan< ElementType, Extents, Layout >
 
template<class Mapping , class Accessor , class DataHandle = typename Accessor::data_handle_type, class Element = typename Accessor::element_type, class Extents = typename Mapping::extents_type, class Layout = typename Mapping::layout_type>
 Dune::Std::mdspan (const DataHandle &, const Mapping &, const Accessor &) -> mdspan< Element, Extents, Layout, Accessor >
 
│ │ │ -

Detailed Description

│ │ │ -

Definition of the DUNE_UNUSED_PARAMETER macro.

│ │ │ -
│ │ │ + │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,17 +1,72 @@ │ │ │ │ dune-common 2.10 │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ * _d_u_n_e │ │ │ │ * _c_o_m_m_o_n │ │ │ │ -_M_a_c_r_o_s │ │ │ │ -unused.hh File Reference │ │ │ │ -Definition of the DUNE_UNUSED_PARAMETER macro. _M_o_r_e_._._. │ │ │ │ + * _s_t_d │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ +mdspan.hh File Reference │ │ │ │ +#include │ │ │ │ +#include │ │ │ │ +#include │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_i_n_d_i_c_e_s_._h_h> │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_d_e_f_a_u_l_t___a_c_c_e_s_s_o_r_._h_h> │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_e_x_t_e_n_t_s_._h_h> │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_l_a_y_o_u_t___r_i_g_h_t_._h_h> │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_s_p_a_n_._h_h> │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ -MMaaccrrooss │ │ │ │ -#define  _D_U_N_E___U_N_U_S_E_D___P_A_R_A_M_E_T_E_R(param)   static_cast(param) │ │ │ │ +CCllaasssseess │ │ │ │ +class   _D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_<_ _E_l_e_m_e_n_t_,_ _E_x_t_e_n_t_s_,_ _L_a_y_o_u_t_P_o_l_i_c_y_,_ _A_c_c_e_s_s_o_r_P_o_l_i_c_y_ _> │ │ │ │ +  A multi-dimensional non-owning array view. _M_o_r_e_._._. │ │ │ │ +  │ │ │ │ +NNaammeessppaacceess │ │ │ │ +namespace   _D_u_n_e │ │ │ │ +  _D_u_n_e namespace. │ │ │ │ +  │ │ │ │ +namespace   _D_u_n_e_:_:_S_t_d │ │ │ │ +  Namespace for features backported from new C++ standards. │ │ │ │ +  │ │ │ │ +FFuunnccttiioonnss │ │ │ │ +template, int > = 0, │ │ │ │ +std::enable_if_t<(std::rank_v< CArray >==1), int > = 0> │ │ │ │ +  _D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n (CArray &) -> _m_d_s_p_a_n< std::remove_all_extents_t< CArray >, │ │ │ │ + _S_t_d_:_:_e_x_t_e_n_t_s< std::size_t, std::extent_v< CArray, 0 > > > │ │ │ │ +  │ │ │ │ +template >, int > = 0> │ │ │ │ +  _D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n (Pointer &&) -> _m_d_s_p_a_n< std::remove_pointer_t< std:: │ │ │ │ + remove_reference_t< Pointer > >, _S_t_d_:_:_e_x_t_e_n_t_s< std::size_t > > │ │ │ │ +  │ │ │ │ +template), int > = 0, std::enable_if_t<(sizeof... │ │ │ │ +(II) > 0), int > = 0> │ │ │ │ +  _D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n (ElementType *, II...) -> _m_d_s_p_a_n< ElementType, _S_t_d_:_: │ │ │ │ + _d_e_x_t_e_n_t_s< std::size_t, sizeof...(II)> > │ │ │ │ +  │ │ │ │ +template │ │ │ │ +  _D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n (ElementType *, _S_t_d_:_:_s_p_a_n< SizeType, N > &) -> _m_d_s_p_a_n< │ │ │ │ + ElementType, _S_t_d_:_:_d_e_x_t_e_n_t_s< std::size_t, N > > │ │ │ │ +  │ │ │ │ +template │ │ │ │ +  _D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n (ElementType *, const std::array< SizeType, N > &) - │ │ │ │ + > _m_d_s_p_a_n< ElementType, _S_t_d_:_:_d_e_x_t_e_n_t_s< std::size_t, N > > │ │ │ │ +  │ │ │ │ +template │ │ │ │ +  _D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n (ElementType *, const _S_t_d_:_:_e_x_t_e_n_t_s< IndexType, exts... > &) │ │ │ │ + -> _m_d_s_p_a_n< ElementType, _S_t_d_:_:_e_x_t_e_n_t_s< IndexType, exts... > > │ │ │ │ +  │ │ │ │ +template │ │ │ │ +  _D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n (ElementType *, const Mapping &) -> _m_d_s_p_a_n< ElementType, │ │ │ │ + Extents, Layout > │ │ │ │ +  │ │ │ │ +template │ │ │ │ +  _D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n (const DataHandle &, const Mapping &, const Accessor &) - │ │ │ │ + > _m_d_s_p_a_n< Element, Extents, Layout, Accessor > │ │ │ │   │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ -Definition of the DUNE_UNUSED_PARAMETER macro. │ │ │ │ =============================================================================== │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00017_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: unused.hh Source File │ │ │ +dune-common: mdspan.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,30 +70,395 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
unused.hh
│ │ │ +
mdspan.hh
│ │ │
│ │ │
│ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │
3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
│ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ -
5#ifndef DUNE_COMMON_UNUSED_HH
│ │ │ -
6#define DUNE_COMMON_UNUSED_HH
│ │ │ +
5#ifndef DUNE_COMMON_STD_MDSPAN_HH
│ │ │ +
6#define DUNE_COMMON_STD_MDSPAN_HH
│ │ │
7
│ │ │ -
21#define DUNE_UNUSED_PARAMETER(param) static_cast<void>(param)
│ │ │ -
22#endif
│ │ │ +
8#include <array>
│ │ │ +
9#include <type_traits>
│ │ │ +
10#include <utility>
│ │ │ +
11#if __has_include(<version>)
│ │ │ +
12 #include <version>
│ │ │ +
13#endif
│ │ │ +
14
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
20
│ │ │ +
21namespace Dune::Std {
│ │ │ +
22
│ │ │ +
61template <class Element, class Extents, class LayoutPolicy = Std::layout_right,
│ │ │ +
62 class AccessorPolicy = Std::default_accessor<Element>>
│ │ │ +
│ │ │ +
63class mdspan
│ │ │ +
64{
│ │ │ +
65 static_assert(std::is_object_v<Element>);
│ │ │ +
66 static_assert(!std::is_abstract_v<Element>);
│ │ │ +
67 static_assert(!std::is_array_v<Element>);
│ │ │ +
68 static_assert(std::is_same_v<Element, typename AccessorPolicy::element_type>);
│ │ │ +
69
│ │ │ +
70public:
│ │ │ +
71 using element_type = Element;
│ │ │ +
72 using extents_type = Extents;
│ │ │ +
73 using layout_type = LayoutPolicy;
│ │ │ +
74 using accessor_type = AccessorPolicy;
│ │ │ +
75
│ │ │ +
76 using value_type = std::remove_cv_t<Element>;
│ │ │ +
77 using mapping_type = typename layout_type::template mapping<extents_type>;
│ │ │ +
78 using index_type = typename extents_type::index_type;
│ │ │ +
79 using size_type = typename extents_type::size_type;
│ │ │ +
80 using rank_type = typename extents_type::rank_type;
│ │ │ +
81 using data_handle_type = typename accessor_type::data_handle_type;
│ │ │ +
82 using reference = typename accessor_type::reference;
│ │ │ +
83
│ │ │ +
84private:
│ │ │ +
85 // [mdspan.layout.reqmts]
│ │ │ +
86 static_assert(std::is_nothrow_move_constructible_v<mapping_type>);
│ │ │ +
87 static_assert(std::is_nothrow_move_assignable_v<mapping_type>);
│ │ │ +
88 static_assert(std::is_nothrow_swappable_v<mapping_type>);
│ │ │ +
89
│ │ │ +
90 // [mdspan.accessor.reqmts]
│ │ │ +
91 static_assert(std::is_nothrow_move_constructible_v<accessor_type>);
│ │ │ +
92 static_assert(std::is_nothrow_move_assignable_v<accessor_type>);
│ │ │ +
93 static_assert(std::is_nothrow_swappable_v<accessor_type>);
│ │ │ +
94
│ │ │ +
95public:
│ │ │ +
98
│ │ │ +
100 template <class E = extents_type, class D = data_handle_type, class M = mapping_type, class A = accessor_type,
│ │ │ +
101 std::enable_if_t<(E::rank_dynamic() > 0), int> = 0,
│ │ │ +
102 std::enable_if_t<std::is_default_constructible_v<D>, int> = 0,
│ │ │ +
103 std::enable_if_t<std::is_default_constructible_v<M>, int> = 0,
│ │ │ +
104 std::enable_if_t<std::is_default_constructible_v<A>, int> = 0>
│ │ │ +
│ │ │ +
105 constexpr mdspan ()
│ │ │ +
106 : data_handle_{}
│ │ │ +
107 , mapping_{}
│ │ │ +
108 , accessor_{}
│ │ │ +
109 {}
│ │ │ +
│ │ │ +
110
│ │ │ +
112 template <class... IndexTypes,
│ │ │ +
113 class E = extents_type, class M = mapping_type, class A = accessor_type,
│ │ │ +
114 std::enable_if_t<(sizeof...(IndexTypes) == E::rank() || sizeof...(IndexTypes) == E::rank_dynamic()), int> = 0,
│ │ │ +
115 std::enable_if_t<(... && std::is_convertible_v<IndexTypes, index_type>), int> = 0,
│ │ │ +
116 std::enable_if_t<(... && std::is_nothrow_constructible_v<index_type, IndexTypes>), int> = 0,
│ │ │ +
117 std::enable_if_t<std::is_constructible_v<M, E>, int> = 0,
│ │ │ +
118 std::enable_if_t<std::is_default_constructible_v<A>, int> = 0>
│ │ │ +
│ │ │ +
119 explicit constexpr mdspan (data_handle_type p, IndexTypes... exts)
│ │ │ +
120 : mdspan(std::move(p), extents_type(index_type(std::move(exts))...))
│ │ │ +
121 {}
│ │ │ +
│ │ │ +
122
│ │ │ +
124 template <class IndexType, std::size_t N,
│ │ │ +
125 std::enable_if_t<std::is_convertible_v<const IndexType&, index_type>, int> = 0,
│ │ │ +
126 std::enable_if_t<std::is_nothrow_constructible_v<index_type,const IndexType&>, int> = 0,
│ │ │ +
127 std::enable_if_t<(N == extents_type::rank_dynamic() || N == extents_type::rank()), int> = 0>
│ │ │ +
128 #if __cpp_conditional_explicit >= 201806L
│ │ │ +
129 explicit(N != extents_type::rank_dynamic())
│ │ │ +
130 #endif
│ │ │ +
│ │ │ + │ │ │ +
132 : mdspan(std::move(p), extents_type(exts))
│ │ │ +
133 {}
│ │ │ +
│ │ │ +
134
│ │ │ +
136 template <class IndexType, std::size_t N,
│ │ │ +
137 std::enable_if_t<std::is_convertible_v<IndexType, index_type>, int> = 0,
│ │ │ +
138 std::enable_if_t<(N == extents_type::rank_dynamic() || N == extents_type::rank()), int> = 0>
│ │ │ +
139 #if __cpp_conditional_explicit >= 201806L
│ │ │ +
140 explicit(N != extents_type::rank_dynamic())
│ │ │ +
141 #endif
│ │ │ +
│ │ │ +
142 constexpr mdspan (data_handle_type p, const std::array<IndexType,N>& exts)
│ │ │ +
143 : mdspan(std::move(p), extents_type(exts))
│ │ │ +
144 {}
│ │ │ +
│ │ │ +
145
│ │ │ +
147 template <class M = mapping_type,
│ │ │ +
148 std::enable_if_t<std::is_constructible_v<M, const extents_type&>, int> = 0>
│ │ │ +
│ │ │ +
149 constexpr mdspan (data_handle_type p, const extents_type& e)
│ │ │ +
150 : mdspan(std::move(p), mapping_type(e))
│ │ │ +
151 {}
│ │ │ +
│ │ │ +
152
│ │ │ +
154 template <class A = accessor_type,
│ │ │ +
155 std::enable_if_t<std::is_default_constructible_v<A>, int> = 0>
│ │ │ +
│ │ │ +
156 constexpr mdspan (data_handle_type p, const mapping_type& m)
│ │ │ +
157 : mdspan(std::move(p), m, accessor_type{})
│ │ │ +
158 {}
│ │ │ +
│ │ │ +
159
│ │ │ +
│ │ │ +
161 constexpr mdspan (data_handle_type p, const mapping_type& m, const accessor_type& a)
│ │ │ +
162 : data_handle_(std::move(p))
│ │ │ +
163 , mapping_(m)
│ │ │ +
164 , accessor_(a)
│ │ │ +
165 {}
│ │ │ +
│ │ │ +
166
│ │ │ +
167
│ │ │ +
169 template <class OtherElementType, class OtherExtends, class OtherLayoutPolicy, class OtherAccessor,
│ │ │ +
170 std::enable_if_t<std::is_constructible_v<mapping_type, const typename OtherElementType::template mapping<OtherExtends>&>, int> = 0,
│ │ │ +
171 std::enable_if_t<std::is_constructible_v<accessor_type, const OtherAccessor&>, int> = 0>
│ │ │ +
172 #if __cpp_conditional_explicit >= 201806L
│ │ │ +
173 explicit(!std::is_convertible_v<const typename OtherElementType::template mapping<OtherExtends>&, mapping_type>
│ │ │ +
174 || !std::is_convertible_v<const OtherAccessor&, accessor_type>)
│ │ │ +
175 #endif
│ │ │ +
│ │ │ + │ │ │ + │ │ │ +
178 accessor_type(other.accessor()))
│ │ │ +
179 {}
│ │ │ +
│ │ │ +
180
│ │ │ +
182
│ │ │ +
183
│ │ │ +
186
│ │ │ +
191 template <class... Indices,
│ │ │ +
192 std::enable_if_t<(sizeof...(Indices) == extents_type::rank()), int> = 0,
│ │ │ +
193 std::enable_if_t<(... && std::is_convertible_v<Indices, index_type>), int> = 0,
│ │ │ +
194 std::enable_if_t<(... && std::is_nothrow_constructible_v<index_type,Indices>), int> = 0>
│ │ │ +
│ │ │ +
195 constexpr reference operator() (Indices... indices) const
│ │ │ +
196 {
│ │ │ +
197 return accessor_.access(data_handle_, mapping_(index_type(std::move(indices))...));
│ │ │ +
198 }
│ │ │ +
│ │ │ +
199
│ │ │ +
200#if __cpp_multidimensional_subscript >= 202110L
│ │ │ +
201
│ │ │ +
203 template <class... Indices,
│ │ │ +
204 std::enable_if_t<(sizeof...(Indices) == extents_type::rank()), int> = 0,
│ │ │ +
205 std::enable_if_t<(... && std::is_convertible_v<Indices, index_type>), int> = 0,
│ │ │ +
206 std::enable_if_t<(... && std::is_nothrow_constructible_v<index_type,Indices>), int> = 0>
│ │ │ +
207 constexpr reference operator[] (Indices... indices) const
│ │ │ +
208 {
│ │ │ +
209 return accessor_.access(data_handle_, mapping_(index_type(std::move(indices))...));
│ │ │ +
210 }
│ │ │ +
211
│ │ │ +
212#else // __cpp_multidimensional_subscript
│ │ │ +
213
│ │ │ +
216 template <class Index, class E = extents_type,
│ │ │ +
217 std::enable_if_t<std::is_convertible_v<Index,index_type>, int> = 0,
│ │ │ +
218 std::enable_if_t<(E::rank() == 1), int> = 0>
│ │ │ +
│ │ │ +
219 constexpr reference operator[] (Index index) const
│ │ │ +
220 {
│ │ │ +
221 return accessor_.access(data_handle_, mapping_(index_type(std::move(index))));
│ │ │ +
222 }
│ │ │ +
│ │ │ +
223
│ │ │ +
224#endif // __cpp_multidimensional_subscript
│ │ │ +
225
│ │ │ +
227 template <class Index,
│ │ │ +
228 std::enable_if_t<std::is_convertible_v<const Index&, index_type>, int> = 0,
│ │ │ +
229 std::enable_if_t<std::is_nothrow_constructible_v<index_type, const Index&>, int> = 0>
│ │ │ +
│ │ │ +
230 constexpr reference operator[] (Std::span<Index,extents_type::rank()> indices) const
│ │ │ +
231 {
│ │ │ +
232 return unpackIntegerSequence([&](auto... ii) -> reference {
│ │ │ +
233 return accessor_.access(data_handle_, mapping_(index_type(indices[ii])...)); },
│ │ │ +
234 std::make_index_sequence<extents_type::rank()>{});
│ │ │ +
235 }
│ │ │ +
│ │ │ +
236
│ │ │ +
238 template <class Index,
│ │ │ +
239 std::enable_if_t<std::is_convertible_v<const Index&, index_type>, int> = 0,
│ │ │ +
240 std::enable_if_t<std::is_nothrow_constructible_v<index_type, const Index&>, int> = 0>
│ │ │ +
│ │ │ +
241 constexpr reference operator[] (const std::array<Index,extents_type::rank()>& indices) const
│ │ │ +
242 {
│ │ │ +
243 return std::apply([&](auto... ii) -> reference {
│ │ │ +
244 return accessor_.access(data_handle_, mapping_(index_type(ii)...)); }, indices);
│ │ │ +
245 }
│ │ │ +
│ │ │ +
246
│ │ │ +
248
│ │ │ +
250 constexpr const extents_type& extents () const noexcept { return mapping_.extents(); }
│ │ │ +
251
│ │ │ +
253 constexpr const mapping_type& mapping () const noexcept { return mapping_; }
│ │ │ +
254
│ │ │ +
256 constexpr const accessor_type& accessor () const noexcept { return accessor_; }
│ │ │ +
257
│ │ │ +
259 constexpr const data_handle_type& data_handle () const noexcept { return data_handle_; };
│ │ │ +
260
│ │ │ +
261
│ │ │ +
264
│ │ │ +
266 static constexpr rank_type rank () noexcept { return extents_type::rank(); }
│ │ │ +
267
│ │ │ +
269 static constexpr rank_type rank_dynamic () noexcept { return extents_type::rank_dynamic(); }
│ │ │ +
270
│ │ │ +
272 static constexpr std::size_t static_extent (rank_type r) noexcept { return extents_type::static_extent(r); }
│ │ │ +
273
│ │ │ +
275 constexpr index_type extent (rank_type r) const noexcept { return extents().extent(r); }
│ │ │ +
276
│ │ │ +
│ │ │ +
278 constexpr size_type size () const noexcept
│ │ │ +
279 {
│ │ │ +
280 size_type s = 1;
│ │ │ +
281 for (rank_type r = 0; r < rank(); ++r)
│ │ │ +
282 s *= extent(r);
│ │ │ +
283 return s;
│ │ │ +
284 }
│ │ │ +
│ │ │ +
285
│ │ │ +
287 [[nodiscard]] constexpr bool empty () const noexcept { return size() == 0; }
│ │ │ +
288
│ │ │ +
290
│ │ │ +
291
│ │ │ +
293 static constexpr bool is_always_unique () { return mapping_type::is_always_unique(); }
│ │ │ +
294
│ │ │ +
296 static constexpr bool is_always_exhaustive () { return mapping_type::is_always_exhaustive(); }
│ │ │ +
297
│ │ │ +
299 static constexpr bool is_always_strided () { return mapping_type::is_always_strided(); }
│ │ │ +
300
│ │ │ +
302 constexpr bool is_unique () const { return mapping_.is_unique(); }
│ │ │ +
303
│ │ │ +
306 constexpr bool is_exhaustive () const { return mapping_.is_exhaustive(); }
│ │ │ +
307
│ │ │ +
313 constexpr bool is_strided () const { return mapping_.is_strided(); }
│ │ │ +
314
│ │ │ +
316 constexpr index_type stride (rank_type r) const { return mapping_.stride(r); }
│ │ │ +
317
│ │ │ +
318
│ │ │ +
│ │ │ +
320 friend constexpr void swap (mdspan& x, mdspan& y) noexcept
│ │ │ +
321 {
│ │ │ +
322 using std::swap;
│ │ │ +
323 swap(x.data_handle_, y.data_handle_);
│ │ │ +
324 swap(x.mapping_, y.mapping_);
│ │ │ +
325 swap(x.accessor_, y.accessor_);
│ │ │ +
326 }
│ │ │ +
│ │ │ +
327
│ │ │ +
328
│ │ │ +
329private:
│ │ │ +
330 data_handle_type data_handle_;
│ │ │ +
331 [[no_unique_address]] mapping_type mapping_;
│ │ │ +
332 [[no_unique_address]] accessor_type accessor_;
│ │ │ +
333};
│ │ │ +
│ │ │ +
334
│ │ │ +
335// deduction guides
│ │ │ +
336// @{
│ │ │ +
337
│ │ │ +
338template <class CArray,
│ │ │ +
339 std::enable_if_t<std::is_array_v<CArray>, int> = 0,
│ │ │ +
340 std::enable_if_t<(std::rank_v<CArray> == 1), int> = 0>
│ │ │ +
341mdspan (CArray&)
│ │ │ + │ │ │ +
343
│ │ │ +
344template <class Pointer,
│ │ │ +
345 std::enable_if_t<std::is_pointer_v<std::remove_reference_t<Pointer>>, int> = 0>
│ │ │ +
346mdspan (Pointer&&)
│ │ │ + │ │ │ +
348
│ │ │ +
349template <class ElementType, class... II,
│ │ │ +
350 std::enable_if_t<(... && std::is_convertible_v<II,std::size_t>), int> = 0,
│ │ │ +
351 std::enable_if_t<(sizeof...(II) > 0), int> = 0>
│ │ │ +
352mdspan (ElementType*, II...)
│ │ │ +
353 -> mdspan<ElementType, Std::dextents<std::size_t, sizeof...(II)>>;
│ │ │ +
354
│ │ │ +
355template <class ElementType, class SizeType, std::size_t N>
│ │ │ + │ │ │ + │ │ │ +
358
│ │ │ +
359template <class ElementType, class SizeType, std::size_t N>
│ │ │ +
360mdspan (ElementType*, const std::array<SizeType,N>&)
│ │ │ + │ │ │ +
362
│ │ │ +
363template <class ElementType, class IndexType, std::size_t... exts>
│ │ │ + │ │ │ +
365 -> mdspan<ElementType, Std::extents<IndexType,exts...>>;
│ │ │ +
366
│ │ │ +
367template <class ElementType, class Mapping,
│ │ │ +
368 class Extents = typename Mapping::extents_type,
│ │ │ +
369 class Layout = typename Mapping::layout_type>
│ │ │ +
370mdspan (ElementType*, const Mapping&)
│ │ │ + │ │ │ +
372
│ │ │ +
373template <class Mapping, class Accessor,
│ │ │ +
374 class DataHandle = typename Accessor::data_handle_type,
│ │ │ +
375 class Element = typename Accessor::element_type,
│ │ │ +
376 class Extents = typename Mapping::extents_type,
│ │ │ +
377 class Layout = typename Mapping::layout_type>
│ │ │ +
378mdspan (const DataHandle&, const Mapping&, const Accessor&)
│ │ │ + │ │ │ +
380
│ │ │ +
381// @}
│ │ │ +
382
│ │ │ +
383} // end namespace Dune::Std
│ │ │ +
384
│ │ │ +
385#endif // DUNE_COMMON_STD_MDSPAN_HH
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
decltype(auto) constexpr unpackIntegerSequence(F &&f, std::integer_sequence< I, i... > sequence)
Unpack an std::integer_sequence<I,i...> to std::integral_constant<I,i>...
Definition indices.hh:124
│ │ │ +
typename Impl::DExtentsImpl< IndexType, std::make_integer_sequence< std::size_t, R > >::type dextents
Alias of extents of given rank R and purely dynamic extents. See [mdspan.extents.dextents].
Definition extents.hh:259
│ │ │ +
STL namespace.
│ │ │ +
Namespace for features backported from new C++ standards.
Definition default_accessor.hh:10
│ │ │ +
Multidimensional index space with dynamic and static extents.
Definition extents.hh:54
│ │ │ +
A multi-dimensional non-owning array view.
Definition mdspan.hh:64
│ │ │ +
typename accessor_type::reference reference
Definition mdspan.hh:82
│ │ │ +
Element element_type
Definition mdspan.hh:71
│ │ │ +
constexpr mdspan(data_handle_type p, const mapping_type &m, const accessor_type &a)
Construct from the pointer to the data of the tensor, an index mapping, and an accessor.
Definition mdspan.hh:161
│ │ │ +
Extents extents_type
Definition mdspan.hh:72
│ │ │ +
static constexpr rank_type rank_dynamic() noexcept
Number of dimensions of the tensor.
Definition mdspan.hh:269
│ │ │ +
static constexpr bool is_always_unique()
Return true only if for every i and j where (i != j || ...) => mapping(i...) != mapping(j....
Definition mdspan.hh:293
│ │ │ +
typename extents_type::index_type index_type
Definition mdspan.hh:78
│ │ │ +
LayoutPolicy layout_type
Definition mdspan.hh:73
│ │ │ +
constexpr bool is_strided() const
Return true only if for every rank index r of extents there exists an integer sr such that,...
Definition mdspan.hh:313
│ │ │ +
constexpr mdspan(data_handle_type p, const mapping_type &m)
Construct from the pointer to the data of the tensor and an index mapping.
Definition mdspan.hh:156
│ │ │ +
typename extents_type::rank_type rank_type
Definition mdspan.hh:80
│ │ │ +
constexpr mdspan(data_handle_type p, const extents_type &e)
Construct from the pointer to the data of the tensor and its extents.
Definition mdspan.hh:149
│ │ │ +
std::remove_cv_t< Element > value_type
Definition mdspan.hh:76
│ │ │ +
static constexpr bool is_always_exhaustive()
Return true only if for all k in the range [0, mapping.required_span_size() ) there exists an i such ...
Definition mdspan.hh:296
│ │ │ +
constexpr reference operator[](Index index) const
Access specified element at position [i0] For a rank one mdspan, the operator[i] is added to support ...
Definition mdspan.hh:219
│ │ │ +
constexpr const extents_type & extents() const noexcept
Number of elements in all dimensions of the tensor,.
Definition mdspan.hh:250
│ │ │ +
constexpr index_type extent(rank_type r) const noexcept
Number of elements in the r'th dimension of the tensor.
Definition mdspan.hh:275
│ │ │ +
friend constexpr void swap(mdspan &x, mdspan &y) noexcept
Overloads the std::swap algorithm for std::mdspan. Exchanges the state of x with that of y.
Definition mdspan.hh:320
│ │ │ +
static constexpr bool is_always_strided()
Return true only if for every rank index r of extents there exists an integer sr such that,...
Definition mdspan.hh:299
│ │ │ +
constexpr size_type size() const noexcept
The number of elements accessible by this multi-dimensional span.
Definition mdspan.hh:278
│ │ │ +
typename accessor_type::data_handle_type data_handle_type
Definition mdspan.hh:81
│ │ │ +
constexpr bool empty() const noexcept
Checks if the size of the index space is zero.
Definition mdspan.hh:287
│ │ │ +
constexpr const accessor_type & accessor() const noexcept
The accessor policy object.
Definition mdspan.hh:256
│ │ │ +
AccessorPolicy accessor_type
Definition mdspan.hh:74
│ │ │ +
constexpr bool is_exhaustive() const
Return true only if for all k in the range [0, mapping.required_span_size() ) there exists an i such ...
Definition mdspan.hh:306
│ │ │ +
static constexpr rank_type rank() noexcept
Number of dimensions of the tensor.
Definition mdspan.hh:266
│ │ │ +
static constexpr std::size_t static_extent(rank_type r) noexcept
Number of elements in the r'th dimension of the tensor.
Definition mdspan.hh:272
│ │ │ +
constexpr const mapping_type & mapping() const noexcept
Index mapping of a layout policy.
Definition mdspan.hh:253
│ │ │ +
constexpr const data_handle_type & data_handle() const noexcept
The pointer to the underlying flat sequence.
Definition mdspan.hh:259
│ │ │ +
constexpr index_type stride(rank_type r) const
The stride along the specified dimension.
Definition mdspan.hh:316
│ │ │ +
constexpr bool is_unique() const
Return true only if for every i and j where (i != j || ...) => mapping(i...) != mapping(j....
Definition mdspan.hh:302
│ │ │ +
constexpr mdspan()
Default constructor value-initializes all members.
Definition mdspan.hh:105
│ │ │ +
typename extents_type::size_type size_type
Definition mdspan.hh:79
│ │ │ +
typename layout_type::template mapping< extents_type > mapping_type
Definition mdspan.hh:77
│ │ │ +
A contiguous sequence of elements with static or dynamic extent.
Definition span.hh:126
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,20 +1,522 @@ │ │ │ │ dune-common 2.10 │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ * _d_u_n_e │ │ │ │ * _c_o_m_m_o_n │ │ │ │ -unused.hh │ │ │ │ + * _s_t_d │ │ │ │ +mdspan.hh │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ LICENSE.md in module root │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ -5#ifndef DUNE_COMMON_UNUSED_HH │ │ │ │ -6#define DUNE_COMMON_UNUSED_HH │ │ │ │ +5#ifndef DUNE_COMMON_STD_MDSPAN_HH │ │ │ │ +6#define DUNE_COMMON_STD_MDSPAN_HH │ │ │ │ 7 │ │ │ │ -_2_1#define DUNE_UNUSED_PARAMETER(param) static_cast(param) │ │ │ │ -22#endif │ │ │ │ +8#include │ │ │ │ +9#include │ │ │ │ +10#include │ │ │ │ +11#if __has_include() │ │ │ │ +12 #include │ │ │ │ +13#endif │ │ │ │ +14 │ │ │ │ +15#include <_d_u_n_e_/_c_o_m_m_o_n_/_i_n_d_i_c_e_s_._h_h> │ │ │ │ +16#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_d_e_f_a_u_l_t___a_c_c_e_s_s_o_r_._h_h> │ │ │ │ +17#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_e_x_t_e_n_t_s_._h_h> │ │ │ │ +18#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_l_a_y_o_u_t___r_i_g_h_t_._h_h> │ │ │ │ +19#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_s_p_a_n_._h_h> │ │ │ │ +20 │ │ │ │ +21namespace _D_u_n_e_:_:_S_t_d { │ │ │ │ +22 │ │ │ │ +61template > │ │ │ │ +_6_3class _m_d_s_p_a_n │ │ │ │ +64{ │ │ │ │ +65 static_assert(std::is_object_v); │ │ │ │ +66 static_assert(!std::is_abstract_v); │ │ │ │ +67 static_assert(!std::is_array_v); │ │ │ │ +68 static_assert(std::is_same_v); │ │ │ │ +69 │ │ │ │ +70public: │ │ │ │ +_7_1 using _e_l_e_m_e_n_t___t_y_p_e = Element; │ │ │ │ +_7_2 using _e_x_t_e_n_t_s___t_y_p_e = Extents; │ │ │ │ +_7_3 using _l_a_y_o_u_t___t_y_p_e = LayoutPolicy; │ │ │ │ +_7_4 using _a_c_c_e_s_s_o_r___t_y_p_e = AccessorPolicy; │ │ │ │ +75 │ │ │ │ +_7_6 using _v_a_l_u_e___t_y_p_e = std::remove_cv_t; │ │ │ │ +_7_7 using _m_a_p_p_i_n_g___t_y_p_e = typename layout_type::template mapping; │ │ │ │ +_7_8 using _i_n_d_e_x___t_y_p_e = typename extents_type::index_type; │ │ │ │ +_7_9 using _s_i_z_e___t_y_p_e = typename extents_type::size_type; │ │ │ │ +_8_0 using _r_a_n_k___t_y_p_e = typename extents_type::rank_type; │ │ │ │ +_8_1 using _d_a_t_a___h_a_n_d_l_e___t_y_p_e = typename accessor_type::data_handle_type; │ │ │ │ +_8_2 using _r_e_f_e_r_e_n_c_e = typename accessor_type::reference; │ │ │ │ +83 │ │ │ │ +84private: │ │ │ │ +85 // [mdspan.layout.reqmts] │ │ │ │ +86 static_assert(std::is_nothrow_move_constructible_v); │ │ │ │ +87 static_assert(std::is_nothrow_move_assignable_v); │ │ │ │ +88 static_assert(std::is_nothrow_swappable_v); │ │ │ │ +89 │ │ │ │ +90 // [mdspan.accessor.reqmts] │ │ │ │ +91 static_assert(std::is_nothrow_move_constructible_v); │ │ │ │ +92 static_assert(std::is_nothrow_move_assignable_v); │ │ │ │ +93 static_assert(std::is_nothrow_swappable_v); │ │ │ │ +94 │ │ │ │ +95public: │ │ │ │ +98 │ │ │ │ +100 template 0), int> = 0, │ │ │ │ +102 std::enable_if_t, int> = 0, │ │ │ │ +103 std::enable_if_t, int> = 0, │ │ │ │ +104 std::enable_if_t, int> = 0> │ │ │ │ +_1_0_5 constexpr _m_d_s_p_a_n () │ │ │ │ +106 : data_handle_{} │ │ │ │ +107 , mapping_{} │ │ │ │ +108 , accessor_{} │ │ │ │ +109 {} │ │ │ │ +110 │ │ │ │ +112 template = 0, │ │ │ │ +115 std::enable_if_t<(... && std::is_convertible_v), │ │ │ │ +int> = 0, │ │ │ │ +116 std::enable_if_t<(... && std::is_nothrow_constructible_v), int> = 0, │ │ │ │ +117 std::enable_if_t, int> = 0, │ │ │ │ +118 std::enable_if_t, int> = 0> │ │ │ │ +_1_1_9 explicit constexpr _m_d_s_p_a_n (_d_a_t_a___h_a_n_d_l_e___t_y_p_e p, IndexTypes... exts) │ │ │ │ +120 : _m_d_s_p_a_n(std::move(p), _e_x_t_e_n_t_s___t_y_p_e(_i_n_d_e_x___t_y_p_e(std::move(exts))...)) │ │ │ │ +121 {} │ │ │ │ +122 │ │ │ │ +124 template , int> │ │ │ │ += 0, │ │ │ │ +126 std::enable_if_t, int> = 0, │ │ │ │ +127 std::enable_if_t<(N == extents_type::rank_dynamic() || N == extents_type:: │ │ │ │ +rank()), int> = 0> │ │ │ │ +128 #if __cpp_conditional_explicit >= 201806L │ │ │ │ +129 explicit(N != extents_type::rank_dynamic()) │ │ │ │ +130 #endif │ │ │ │ +_1_3_1 constexpr _m_d_s_p_a_n (_d_a_t_a___h_a_n_d_l_e___t_y_p_e p, _S_t_d_:_:_s_p_a_n_<_I_n_d_e_x_T_y_p_e_,_N_> exts) │ │ │ │ +132 : _m_d_s_p_a_n(std::move(p), _e_x_t_e_n_t_s___t_y_p_e(exts)) │ │ │ │ +133 {} │ │ │ │ +134 │ │ │ │ +136 template , int> = 0, │ │ │ │ +138 std::enable_if_t<(N == extents_type::rank_dynamic() || N == extents_type:: │ │ │ │ +rank()), int> = 0> │ │ │ │ +139 #if __cpp_conditional_explicit >= 201806L │ │ │ │ +140 explicit(N != extents_type::rank_dynamic()) │ │ │ │ +141 #endif │ │ │ │ +_1_4_2 constexpr _m_d_s_p_a_n (_d_a_t_a___h_a_n_d_l_e___t_y_p_e p, const std::array& exts) │ │ │ │ +143 : _m_d_s_p_a_n(std::move(p), _e_x_t_e_n_t_s___t_y_p_e(exts)) │ │ │ │ +144 {} │ │ │ │ +145 │ │ │ │ +147 template , int> = 0> │ │ │ │ +_1_4_9 constexpr _m_d_s_p_a_n (_d_a_t_a___h_a_n_d_l_e___t_y_p_e p, const _e_x_t_e_n_t_s___t_y_p_e& e) │ │ │ │ +150 : _m_d_s_p_a_n(_s_t_d::move(p), _m_a_p_p_i_n_g___t_y_p_e(e)) │ │ │ │ +151 {} │ │ │ │ +152 │ │ │ │ +154 template , int> = 0> │ │ │ │ +_1_5_6 constexpr _m_d_s_p_a_n (_d_a_t_a___h_a_n_d_l_e___t_y_p_e p, const _m_a_p_p_i_n_g___t_y_p_e& m) │ │ │ │ +157 : _m_d_s_p_a_n(_s_t_d::move(p), m, _a_c_c_e_s_s_o_r___t_y_p_e{}) │ │ │ │ +158 {} │ │ │ │ +159 │ │ │ │ +_1_6_1 constexpr _m_d_s_p_a_n (_d_a_t_a___h_a_n_d_l_e___t_y_p_e p, const _m_a_p_p_i_n_g___t_y_p_e& m, const │ │ │ │ +_a_c_c_e_s_s_o_r___t_y_p_e& a) │ │ │ │ +162 : data_handle_(_s_t_d::move(p)) │ │ │ │ +163 , mapping_(m) │ │ │ │ +164 , accessor_(a) │ │ │ │ +165 {} │ │ │ │ +166 │ │ │ │ +167 │ │ │ │ +169 template &>, int> = 0, │ │ │ │ +171 std::enable_if_t, int> = 0> │ │ │ │ +172 #if __cpp_conditional_explicit >= 201806L │ │ │ │ +173 explicit(!std::is_convertible_v&, _m_a_p_p_i_n_g___t_y_p_e> │ │ │ │ +174 || !std::is_convertible_v) │ │ │ │ +175 #endif │ │ │ │ +_1_7_6 constexpr _m_d_s_p_a_n (const │ │ │ │ +_m_d_s_p_a_n_<_O_t_h_e_r_E_l_e_m_e_n_t_T_y_p_e_,_O_t_h_e_r_E_x_t_e_n_d_s_,_O_t_h_e_r_L_a_y_o_u_t_P_o_l_i_c_y_,_O_t_h_e_r_A_c_c_e_s_s_o_r_>& other) │ │ │ │ +noexcept │ │ │ │ +177 : _m_d_s_p_a_n(_d_a_t_a___h_a_n_d_l_e___t_y_p_e(other._d_a_t_a___h_a_n_d_l_e()), _m_a_p_p_i_n_g___t_y_p_e(other._m_a_p_p_i_n_g │ │ │ │ +()), │ │ │ │ +178 _a_c_c_e_s_s_o_r___t_y_p_e(other._a_c_c_e_s_s_o_r())) │ │ │ │ +179 {} │ │ │ │ +180 │ │ │ │ +182 │ │ │ │ +183 │ │ │ │ +186 │ │ │ │ +191 template = 0, │ │ │ │ +193 std::enable_if_t<(... && std::is_convertible_v), int> │ │ │ │ += 0, │ │ │ │ +194 std::enable_if_t<(... && std:: │ │ │ │ +is_nothrow_constructible_v), int> = 0> │ │ │ │ +_1_9_5 constexpr _r_e_f_e_r_e_n_c_e operator() (Indices... indices) const │ │ │ │ +196 { │ │ │ │ +197 return accessor_.access(data_handle_, mapping_(_i_n_d_e_x___t_y_p_e(std::move │ │ │ │ +(indices))...)); │ │ │ │ +198 } │ │ │ │ +199 │ │ │ │ +200#if __cpp_multidimensional_subscript >= 202110L │ │ │ │ +201 │ │ │ │ +203 template = 0, │ │ │ │ +205 std::enable_if_t<(... && std::is_convertible_v), int> │ │ │ │ += 0, │ │ │ │ +206 std::enable_if_t<(... && std:: │ │ │ │ +is_nothrow_constructible_v), int> = 0> │ │ │ │ +207 constexpr _r_e_f_e_r_e_n_c_e operator[] (Indices... indices) const │ │ │ │ +208 { │ │ │ │ +209 return accessor_.access(data_handle_, mapping_(_i_n_d_e_x___t_y_p_e(std::move │ │ │ │ +(indices))...)); │ │ │ │ +210 } │ │ │ │ +211 │ │ │ │ +212#else // __cpp_multidimensional_subscript │ │ │ │ +213 │ │ │ │ +216 template , int> = 0, │ │ │ │ +218 std::enable_if_t<(E::rank() == 1), int> = 0> │ │ │ │ +_2_1_9 constexpr _r_e_f_e_r_e_n_c_e operator[] (Index index) const │ │ │ │ +220 { │ │ │ │ +221 return accessor_.access(data_handle_, mapping_(_i_n_d_e_x___t_y_p_e(std::move │ │ │ │ +(index)))); │ │ │ │ +222 } │ │ │ │ +223 │ │ │ │ +224#endif // __cpp_multidimensional_subscript │ │ │ │ +225 │ │ │ │ +227 template , int> = 0, │ │ │ │ +229 std::enable_if_t, │ │ │ │ +int> = 0> │ │ │ │ +_2_3_0 constexpr _r_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_[_]_ (_S_t_d_:_:_s_p_a_n │ │ │ │ +indices) const │ │ │ │ +231 { │ │ │ │ +232 return _u_n_p_a_c_k_I_n_t_e_g_e_r_S_e_q_u_e_n_c_e([&](auto... ii) -> _r_e_f_e_r_e_n_c_e { │ │ │ │ +233 return accessor_.access(data_handle_, mapping_(_i_n_d_e_x___t_y_p_e(indices │ │ │ │ +[ii])...)); }, │ │ │ │ +234 std::make_index_sequence{}); │ │ │ │ +235 } │ │ │ │ +236 │ │ │ │ +238 template , int> = 0, │ │ │ │ +240 std::enable_if_t, │ │ │ │ +int> = 0> │ │ │ │ +_2_4_1 constexpr _r_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_[_]_ (const std::array& indices) const │ │ │ │ +242 { │ │ │ │ +243 return std::apply([&](auto... ii) -> _r_e_f_e_r_e_n_c_e { │ │ │ │ +244 return accessor_.access(data_handle_, mapping_(_i_n_d_e_x___t_y_p_e(ii)...)); }, │ │ │ │ +indices); │ │ │ │ +245 } │ │ │ │ +246 │ │ │ │ +248 │ │ │ │ +_2_5_0 constexpr const _e_x_t_e_n_t_s___t_y_p_e& _e_x_t_e_n_t_s () const noexcept { return │ │ │ │ +mapping_.extents(); } │ │ │ │ +251 │ │ │ │ +_2_5_3 constexpr const _m_a_p_p_i_n_g___t_y_p_e& _m_a_p_p_i_n_g () const noexcept { return mapping_; │ │ │ │ +} │ │ │ │ +254 │ │ │ │ +_2_5_6 constexpr const _a_c_c_e_s_s_o_r___t_y_p_e& _a_c_c_e_s_s_o_r () const noexcept { return │ │ │ │ +accessor_; } │ │ │ │ +257 │ │ │ │ +_2_5_9 constexpr const _d_a_t_a___h_a_n_d_l_e___t_y_p_e& _d_a_t_a___h_a_n_d_l_e () const noexcept { return │ │ │ │ +data_handle_; }; │ │ │ │ +260 │ │ │ │ +261 │ │ │ │ +264 │ │ │ │ +_2_6_6 static constexpr _r_a_n_k___t_y_p_e _r_a_n_k () noexcept { return extents_type::rank(); │ │ │ │ +} │ │ │ │ +267 │ │ │ │ +_2_6_9 static constexpr _r_a_n_k___t_y_p_e _r_a_n_k___d_y_n_a_m_i_c () noexcept { return extents_type:: │ │ │ │ +rank_dynamic(); } │ │ │ │ +270 │ │ │ │ +_2_7_2 static constexpr std::size_t _s_t_a_t_i_c___e_x_t_e_n_t (_r_a_n_k___t_y_p_e r) noexcept { return │ │ │ │ +extents_type::static_extent(r); } │ │ │ │ +273 │ │ │ │ +_2_7_5 constexpr _i_n_d_e_x___t_y_p_e _e_x_t_e_n_t (_r_a_n_k___t_y_p_e r) const noexcept { return _e_x_t_e_n_t_s │ │ │ │ +().extent(r); } │ │ │ │ +276 │ │ │ │ +_2_7_8 constexpr _s_i_z_e___t_y_p_e _s_i_z_e () const noexcept │ │ │ │ +279 { │ │ │ │ +280 _s_i_z_e___t_y_p_e s = 1; │ │ │ │ +281 for (_r_a_n_k___t_y_p_e r = 0; r < _r_a_n_k(); ++r) │ │ │ │ +282 s *= _e_x_t_e_n_t(r); │ │ │ │ +283 return s; │ │ │ │ +284 } │ │ │ │ +285 │ │ │ │ +_2_8_7 [[nodiscard]] constexpr bool _e_m_p_t_y () const noexcept { return _s_i_z_e() == 0; │ │ │ │ +} │ │ │ │ +288 │ │ │ │ +290 │ │ │ │ +291 │ │ │ │ +_2_9_3 static constexpr bool _i_s___a_l_w_a_y_s___u_n_i_q_u_e () { return mapping_type:: │ │ │ │ +is_always_unique(); } │ │ │ │ +294 │ │ │ │ +_2_9_6 static constexpr bool _i_s___a_l_w_a_y_s___e_x_h_a_u_s_t_i_v_e () { return mapping_type:: │ │ │ │ +is_always_exhaustive(); } │ │ │ │ +297 │ │ │ │ +_2_9_9 static constexpr bool _i_s___a_l_w_a_y_s___s_t_r_i_d_e_d () { return mapping_type:: │ │ │ │ +is_always_strided(); } │ │ │ │ +300 │ │ │ │ +_3_0_2 constexpr bool _i_s___u_n_i_q_u_e () const { return mapping_.is_unique(); } │ │ │ │ +303 │ │ │ │ +_3_0_6 constexpr bool _i_s___e_x_h_a_u_s_t_i_v_e () const { return mapping_.is_exhaustive(); } │ │ │ │ +307 │ │ │ │ +_3_1_3 constexpr bool _i_s___s_t_r_i_d_e_d () const { return mapping_.is_strided(); } │ │ │ │ +314 │ │ │ │ +_3_1_6 constexpr _i_n_d_e_x___t_y_p_e _s_t_r_i_d_e (_r_a_n_k___t_y_p_e r) const { return mapping_.stride │ │ │ │ +(r); } │ │ │ │ +317 │ │ │ │ +318 │ │ │ │ +_3_2_0 friend constexpr void _s_w_a_p (_m_d_s_p_a_n& x, _m_d_s_p_a_n& y) noexcept │ │ │ │ +321 { │ │ │ │ +322 using std::swap; │ │ │ │ +323 _s_w_a_p(x.data_handle_, y.data_handle_); │ │ │ │ +324 _s_w_a_p(x.mapping_, y.mapping_); │ │ │ │ +325 _s_w_a_p(x.accessor_, y.accessor_); │ │ │ │ +326 } │ │ │ │ +327 │ │ │ │ +328 │ │ │ │ +329private: │ │ │ │ +330 _d_a_t_a___h_a_n_d_l_e___t_y_p_e data_handle_; │ │ │ │ +331 [[no_unique_address]] _m_a_p_p_i_n_g___t_y_p_e mapping_; │ │ │ │ +332 [[no_unique_address]] _a_c_c_e_s_s_o_r___t_y_p_e accessor_; │ │ │ │ +333}; │ │ │ │ +334 │ │ │ │ +335// deduction guides │ │ │ │ +336// @{ │ │ │ │ +337 │ │ │ │ +338template , int> = 0, │ │ │ │ +340 std::enable_if_t<(std::rank_v == 1), int> = 0> │ │ │ │ +_3_4_1_m_d_s_p_a_n (CArray&) │ │ │ │ +342 -> _m_d_s_p_a_n_<_s_t_d_:_:_r_e_m_o_v_e___a_l_l___e_x_t_e_n_t_s___t_<_C_A_r_r_a_y_>, _S_t_d_:_:_e_x_t_e_n_t_s_<_s_t_d_:_:_s_i_z_e___t_, │ │ │ │ +_s_t_d_:_:_e_x_t_e_n_t___v_<_C_A_r_r_a_y_,_0_>>>; │ │ │ │ +343 │ │ │ │ +344template >, int> │ │ │ │ += 0> │ │ │ │ +_3_4_6_m_d_s_p_a_n (Pointer&&) │ │ │ │ +347 -> _m_d_s_p_a_n_<_s_t_d_:_:_r_e_m_o_v_e___p_o_i_n_t_e_r___t_<_s_t_d_:_:_r_e_m_o_v_e___r_e_f_e_r_e_n_c_e___t_<_P_o_i_n_t_e_r_>>, _S_t_d_:_: │ │ │ │ +_e_x_t_e_n_t_s_<_s_t_d_:_:_s_i_z_e___t_>>; │ │ │ │ +348 │ │ │ │ +349template ), int> = 0, │ │ │ │ +351 std::enable_if_t<(sizeof...(II) > 0), int> = 0> │ │ │ │ +_3_5_2_m_d_s_p_a_n (ElementType*, II...) │ │ │ │ +353 -> _m_d_s_p_a_n>; │ │ │ │ +354 │ │ │ │ +355template │ │ │ │ +_3_5_6_m_d_s_p_a_n (ElementType*, _S_t_d_:_:_s_p_a_n_<_S_i_z_e_T_y_p_e_,_N_>&) │ │ │ │ +357 -> _m_d_s_p_a_n_<_E_l_e_m_e_n_t_T_y_p_e_,_ _S_t_d_:_:_d_e_x_t_e_n_t_s_<_s_t_d_:_:_s_i_z_e___t_,_ _N_>>; │ │ │ │ +358 │ │ │ │ +359template │ │ │ │ +_3_6_0_m_d_s_p_a_n (ElementType*, const std::array&) │ │ │ │ +361 -> _m_d_s_p_a_n_<_E_l_e_m_e_n_t_T_y_p_e_,_ _S_t_d_:_:_d_e_x_t_e_n_t_s_<_s_t_d_:_:_s_i_z_e___t_,_ _N_>>; │ │ │ │ +362 │ │ │ │ +363template │ │ │ │ +_3_6_4_m_d_s_p_a_n (ElementType*, const _S_t_d_:_:_e_x_t_e_n_t_s_<_I_n_d_e_x_T_y_p_e_,_e_x_t_s_._._._>&) │ │ │ │ +365 -> _m_d_s_p_a_n>; │ │ │ │ +366 │ │ │ │ +367template │ │ │ │ +_3_7_0_m_d_s_p_a_n (ElementType*, const Mapping&) │ │ │ │ +371 -> _m_d_s_p_a_n_<_E_l_e_m_e_n_t_T_y_p_e_,_ _E_x_t_e_n_t_s_,_ _L_a_y_o_u_t_>; │ │ │ │ +372 │ │ │ │ +373template │ │ │ │ +_3_7_8_m_d_s_p_a_n (const DataHandle&, const Mapping&, const Accessor&) │ │ │ │ +379 -> _m_d_s_p_a_n_<_E_l_e_m_e_n_t_,_ _E_x_t_e_n_t_s_,_ _L_a_y_o_u_t_,_ _A_c_c_e_s_s_o_r_>; │ │ │ │ +380 │ │ │ │ +381// @} │ │ │ │ +382 │ │ │ │ +383} // end namespace Dune::Std │ │ │ │ +384 │ │ │ │ +385#endif // DUNE_COMMON_STD_MDSPAN_HH │ │ │ │ +_d_e_f_a_u_l_t___a_c_c_e_s_s_o_r_._h_h │ │ │ │ +_e_x_t_e_n_t_s_._h_h │ │ │ │ +_l_a_y_o_u_t___r_i_g_h_t_._h_h │ │ │ │ +_s_p_a_n_._h_h │ │ │ │ +_i_n_d_i_c_e_s_._h_h │ │ │ │ +_D_u_n_e_:_:_u_n_p_a_c_k_I_n_t_e_g_e_r_S_e_q_u_e_n_c_e │ │ │ │ +decltype(auto) constexpr unpackIntegerSequence(F &&f, std::integer_sequence< I, │ │ │ │ +i... > sequence) │ │ │ │ +Unpack an std::integer_sequence to std::integral_constant... │ │ │ │ +DDeeffiinniittiioonn indices.hh:124 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_d_e_x_t_e_n_t_s │ │ │ │ +typename Impl::DExtentsImpl< IndexType, std::make_integer_sequence< std:: │ │ │ │ +size_t, R > >::type dextents │ │ │ │ +Alias of extents of given rank R and purely dynamic extents. See │ │ │ │ +[mdspan.extents.dextents]. │ │ │ │ +DDeeffiinniittiioonn extents.hh:259 │ │ │ │ +_s_t_d │ │ │ │ +STL namespace. │ │ │ │ +_D_u_n_e_:_:_S_t_d │ │ │ │ +Namespace for features backported from new C++ standards. │ │ │ │ +DDeeffiinniittiioonn default_accessor.hh:10 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_e_x_t_e_n_t_s │ │ │ │ +Multidimensional index space with dynamic and static extents. │ │ │ │ +DDeeffiinniittiioonn extents.hh:54 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n │ │ │ │ +A multi-dimensional non-owning array view. │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:64 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ +typename accessor_type::reference reference │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:82 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_e_l_e_m_e_n_t___t_y_p_e │ │ │ │ +Element element_type │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:71 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_m_d_s_p_a_n │ │ │ │ +constexpr mdspan(data_handle_type p, const mapping_type &m, const accessor_type │ │ │ │ +&a) │ │ │ │ +Construct from the pointer to the data of the tensor, an index mapping, and an │ │ │ │ +accessor. │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:161 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_e_x_t_e_n_t_s___t_y_p_e │ │ │ │ +Extents extents_type │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:72 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_r_a_n_k___d_y_n_a_m_i_c │ │ │ │ +static constexpr rank_type rank_dynamic() noexcept │ │ │ │ +Number of dimensions of the tensor. │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:269 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_i_s___a_l_w_a_y_s___u_n_i_q_u_e │ │ │ │ +static constexpr bool is_always_unique() │ │ │ │ +Return true only if for every i and j where (i != j || ...) => mapping(i...) != │ │ │ │ +mapping(j.... │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:293 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_i_n_d_e_x___t_y_p_e │ │ │ │ +typename extents_type::index_type index_type │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:78 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_l_a_y_o_u_t___t_y_p_e │ │ │ │ +LayoutPolicy layout_type │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:73 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_i_s___s_t_r_i_d_e_d │ │ │ │ +constexpr bool is_strided() const │ │ │ │ +Return true only if for every rank index r of extents there exists an integer │ │ │ │ +sr such that,... │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:313 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_m_d_s_p_a_n │ │ │ │ +constexpr mdspan(data_handle_type p, const mapping_type &m) │ │ │ │ +Construct from the pointer to the data of the tensor and an index mapping. │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:156 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_r_a_n_k___t_y_p_e │ │ │ │ +typename extents_type::rank_type rank_type │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:80 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_m_d_s_p_a_n │ │ │ │ +constexpr mdspan(data_handle_type p, const extents_type &e) │ │ │ │ +Construct from the pointer to the data of the tensor and its extents. │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:149 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ +std::remove_cv_t< Element > value_type │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:76 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_i_s___a_l_w_a_y_s___e_x_h_a_u_s_t_i_v_e │ │ │ │ +static constexpr bool is_always_exhaustive() │ │ │ │ +Return true only if for all k in the range [0, mapping.required_span_size() ) │ │ │ │ +there exists an i such ... │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:296 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ +constexpr reference operator[](Index index) const │ │ │ │ +Access specified element at position [i0] For a rank one mdspan, the operator │ │ │ │ +[i] is added to support ... │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:219 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_e_x_t_e_n_t_s │ │ │ │ +constexpr const extents_type & extents() const noexcept │ │ │ │ +Number of elements in all dimensions of the tensor,. │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:250 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_e_x_t_e_n_t │ │ │ │ +constexpr index_type extent(rank_type r) const noexcept │ │ │ │ +Number of elements in the r'th dimension of the tensor. │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:275 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_s_w_a_p │ │ │ │ +friend constexpr void swap(mdspan &x, mdspan &y) noexcept │ │ │ │ +Overloads the std::swap algorithm for std::mdspan. Exchanges the state of x │ │ │ │ +with that of y. │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:320 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_i_s___a_l_w_a_y_s___s_t_r_i_d_e_d │ │ │ │ +static constexpr bool is_always_strided() │ │ │ │ +Return true only if for every rank index r of extents there exists an integer │ │ │ │ +sr such that,... │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:299 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_s_i_z_e │ │ │ │ +constexpr size_type size() const noexcept │ │ │ │ +The number of elements accessible by this multi-dimensional span. │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:278 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_d_a_t_a___h_a_n_d_l_e___t_y_p_e │ │ │ │ +typename accessor_type::data_handle_type data_handle_type │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:81 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_e_m_p_t_y │ │ │ │ +constexpr bool empty() const noexcept │ │ │ │ +Checks if the size of the index space is zero. │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:287 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_a_c_c_e_s_s_o_r │ │ │ │ +constexpr const accessor_type & accessor() const noexcept │ │ │ │ +The accessor policy object. │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:256 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_a_c_c_e_s_s_o_r___t_y_p_e │ │ │ │ +AccessorPolicy accessor_type │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:74 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_i_s___e_x_h_a_u_s_t_i_v_e │ │ │ │ +constexpr bool is_exhaustive() const │ │ │ │ +Return true only if for all k in the range [0, mapping.required_span_size() ) │ │ │ │ +there exists an i such ... │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:306 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_r_a_n_k │ │ │ │ +static constexpr rank_type rank() noexcept │ │ │ │ +Number of dimensions of the tensor. │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:266 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_s_t_a_t_i_c___e_x_t_e_n_t │ │ │ │ +static constexpr std::size_t static_extent(rank_type r) noexcept │ │ │ │ +Number of elements in the r'th dimension of the tensor. │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:272 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_m_a_p_p_i_n_g │ │ │ │ +constexpr const mapping_type & mapping() const noexcept │ │ │ │ +Index mapping of a layout policy. │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:253 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_d_a_t_a___h_a_n_d_l_e │ │ │ │ +constexpr const data_handle_type & data_handle() const noexcept │ │ │ │ +The pointer to the underlying flat sequence. │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:259 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_s_t_r_i_d_e │ │ │ │ +constexpr index_type stride(rank_type r) const │ │ │ │ +The stride along the specified dimension. │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:316 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_i_s___u_n_i_q_u_e │ │ │ │ +constexpr bool is_unique() const │ │ │ │ +Return true only if for every i and j where (i != j || ...) => mapping(i...) != │ │ │ │ +mapping(j.... │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:302 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_m_d_s_p_a_n │ │ │ │ +constexpr mdspan() │ │ │ │ +Default constructor value-initializes all members. │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:105 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_s_i_z_e___t_y_p_e │ │ │ │ +typename extents_type::size_type size_type │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:79 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_m_d_s_p_a_n_:_:_m_a_p_p_i_n_g___t_y_p_e │ │ │ │ +typename layout_type::template mapping< extents_type > mapping_type │ │ │ │ +DDeeffiinniittiioonn mdspan.hh:77 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n │ │ │ │ +A contiguous sequence of elements with static or dynamic extent. │ │ │ │ +DDeeffiinniittiioonn span.hh:126 │ │ │ │ =============================================================================== │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00020.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: typeutilities.hh File Reference │ │ │ +dune-common: default_accessor.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,59 +65,43 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │
│ │ │ Classes | │ │ │ -Namespaces | │ │ │ -Typedefs
│ │ │ -
typeutilities.hh File Reference
│ │ │ +Namespaces
│ │ │ +
default_accessor.hh File Reference
│ │ │ │ │ │
│ │ │ - │ │ │ -

Utilities for type computations, constraining overloads, ... │ │ │ -More...

│ │ │ -
#include <cstddef>
│ │ │ -#include <type_traits>
│ │ │ -#include <tuple>
│ │ │ +
#include <type_traits>
│ │ │
│ │ │

Go to the source code of this file.

│ │ │ │ │ │ │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ + │ │ │ + │ │ │ │ │ │

│ │ │ Classes

struct  Dune::PriorityTag< priority >
 Helper class for tagging priorities. More...
 
struct  Dune::PriorityTag< 0 >
 Helper class for tagging priorities. More...
class  Dune::Std::default_accessor< Element >
 A type for indexed access to elements of mdspan. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ Namespaces

namespace  Dune
 Dune namespace.
 
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ + │ │ │ + │ │ │ + │ │ │

│ │ │ -Typedefs

template<class This , class... T>
using Dune::disableCopyMove = std::enable_if_t< not Impl::disableCopyMoveHelper< This, T... >::value, int >
 Helper to disable constructor as copy and move constructor.
 
namespace  Dune::Std
 Namespace for features backported from new C++ standards.
 
│ │ │ -

Detailed Description

│ │ │ -

Utilities for type computations, constraining overloads, ...

│ │ │ -
Author
Carsten Gräser
│ │ │ -
│ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ @@ -1 +1 @@ │ │ │ │ -utf-8 │ │ │ │ +us-ascii │ │ │ ├── html2text {} │ │ │ │ @@ -1,36 +1,24 @@ │ │ │ │ dune-common 2.10 │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ * _d_u_n_e │ │ │ │ * _c_o_m_m_o_n │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s │ │ │ │ -typeutilities.hh File Reference │ │ │ │ -Utilities for type computations, constraining overloads, ... _M_o_r_e_._._. │ │ │ │ -#include │ │ │ │ + * _s_t_d │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ +default_accessor.hh File Reference │ │ │ │ #include │ │ │ │ -#include │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ CCllaasssseess │ │ │ │ -struct   _D_u_n_e_:_:_P_r_i_o_r_i_t_y_T_a_g_<_ _p_r_i_o_r_i_t_y_ _> │ │ │ │ -  Helper class for tagging priorities. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_P_r_i_o_r_i_t_y_T_a_g_<_ _0_ _> │ │ │ │ -  Helper class for tagging priorities. _M_o_r_e_._._. │ │ │ │ +class   _D_u_n_e_:_:_S_t_d_:_:_d_e_f_a_u_l_t___a_c_c_e_s_s_o_r_<_ _E_l_e_m_e_n_t_ _> │ │ │ │ +  A type for indexed access to elements of mdspan. _M_o_r_e_._._. │ │ │ │   │ │ │ │ NNaammeessppaacceess │ │ │ │ namespace   _D_u_n_e │ │ │ │   _D_u_n_e namespace. │ │ │ │   │ │ │ │ -TTyyppeeddeeffss │ │ │ │ -template │ │ │ │ -using  _D_u_n_e_:_:_d_i_s_a_b_l_e_C_o_p_y_M_o_v_e = std::enable_if_t< not Impl:: │ │ │ │ - disableCopyMoveHelper< This, T... >::value, int > │ │ │ │ -  Helper to disable constructor as copy and move constructor. │ │ │ │ +namespace   _D_u_n_e_:_:_S_t_d │ │ │ │ +  Namespace for features backported from new C++ standards. │ │ │ │   │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ -Utilities for type computations, constraining overloads, ... │ │ │ │ - Author │ │ │ │ - Carsten Gräser │ │ │ │ =============================================================================== │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00020_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: typeutilities.hh Source File │ │ │ +dune-common: default_accessor.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,81 +70,80 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
typeutilities.hh
│ │ │ +
default_accessor.hh
│ │ │
│ │ │
│ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │
3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
│ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ -
5#ifndef DUNE_COMMON_TYPEUTILITIES_HH
│ │ │ -
6#define DUNE_COMMON_TYPEUTILITIES_HH
│ │ │ +
5#ifndef DUNE_COMMON_STD_DEFAULT_ACCESSOR_HH
│ │ │ +
6#define DUNE_COMMON_STD_DEFAULT_ACCESSOR_HH
│ │ │
7
│ │ │ -
8#include <cstddef>
│ │ │ -
9#include <type_traits>
│ │ │ -
10#include <tuple>
│ │ │ +
8#include <type_traits>
│ │ │ +
9
│ │ │ +
│ │ │ +
10namespace Dune::Std {
│ │ │
11
│ │ │ -
12
│ │ │ -
13namespace Dune {
│ │ │ -
14
│ │ │ -
22 namespace Impl
│ │ │ -
23 {
│ │ │ -
24
│ │ │ -
25 template<class This, class... T>
│ │ │ -
26 struct disableCopyMoveHelper : public std::is_base_of<This, std::tuple_element_t<0, std::tuple<std::decay_t<T>...>>>
│ │ │ -
27 {};
│ │ │ -
28
│ │ │ -
29 template<class This>
│ │ │ -
30 struct disableCopyMoveHelper<This> : public std::false_type
│ │ │ -
31 {};
│ │ │ -
32
│ │ │ -
33 } // namespace Impl
│ │ │ -
34
│ │ │ +
22template <class Element>
│ │ │ +
│ │ │ + │ │ │ +
24{
│ │ │ +
25public:
│ │ │ +
26 using element_type = Element;
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
30
│ │ │ +
31public:
│ │ │ +
32 // [mdspan.accessor.default.overview]
│ │ │ +
34 constexpr default_accessor () noexcept = default;
│ │ │
35
│ │ │ -
44 template<class This, class... T>
│ │ │ -
45 using disableCopyMove = std::enable_if_t< not Impl::disableCopyMoveHelper<This, T...>::value, int>;
│ │ │ +
37 template <class OtherElement,
│ │ │ +
38 std::enable_if_t<std::is_convertible_v<OtherElement(*)[], Element(*)[]>, int> = 0>
│ │ │ +
39 constexpr default_accessor (default_accessor<OtherElement>) noexcept {}
│ │ │ +
40
│ │ │ +
│ │ │ +
42 constexpr reference access (data_handle_type p, std::size_t i) const noexcept
│ │ │ +
43 {
│ │ │ +
44 return p[i];
│ │ │ +
45 }
│ │ │ +
│ │ │
46
│ │ │ -
47
│ │ │ -
48
│ │ │ -
71 template<std::size_t priority>
│ │ │ -
│ │ │ -
72 struct PriorityTag : public PriorityTag<priority-1>
│ │ │ -
73 {
│ │ │ -
74 static constexpr std::size_t value = priority;
│ │ │ -
75 };
│ │ │ -
│ │ │ -
76
│ │ │ -
85 template<>
│ │ │ -
│ │ │ -
86 struct PriorityTag<0>
│ │ │ -
87 {
│ │ │ -
88 static constexpr std::size_t value = 0;
│ │ │ -
89 };
│ │ │ -
│ │ │ -
90
│ │ │ -
91
│ │ │ -
92
│ │ │ -
93} // namespace Dune
│ │ │ -
94
│ │ │ -
95
│ │ │ -
96
│ │ │ -
97#endif // DUNE_COMMON_TYPEUTILITIES_HH
│ │ │ -
std::enable_if_t< not Impl::disableCopyMoveHelper< This, T... >::value, int > disableCopyMove
Helper to disable constructor as copy and move constructor.
Definition typeutilities.hh:45
│ │ │ -
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ -
Helper class for tagging priorities.
Definition typeutilities.hh:73
│ │ │ -
static constexpr std::size_t value
Definition typeutilities.hh:74
│ │ │ +
│ │ │ +
48 constexpr data_handle_type offset (data_handle_type p, std::size_t i) const noexcept
│ │ │ +
49 {
│ │ │ +
50 return p + i;
│ │ │ +
51 }
│ │ │ +
│ │ │ +
52};
│ │ │ +
│ │ │ +
53
│ │ │ +
54} // end namespace Dune::Std
│ │ │ +
│ │ │ +
55
│ │ │ +
56#endif // DUNE_COMMON_STD_DEFAULT_ACCESSOR_HH
│ │ │ +
STL namespace.
│ │ │ +
Namespace for features backported from new C++ standards.
Definition default_accessor.hh:10
│ │ │ +
A type for indexed access to elements of mdspan.
Definition default_accessor.hh:24
│ │ │ +
element_type * data_handle_type
Definition default_accessor.hh:27
│ │ │ +
element_type & reference
Definition default_accessor.hh:28
│ │ │ +
Element element_type
Definition default_accessor.hh:26
│ │ │ +
constexpr default_accessor() noexcept=default
Default constructor.
│ │ │ +
constexpr reference access(data_handle_type p, std::size_t i) const noexcept
Return a reference to the i'th element in the data range starting at p
Definition default_accessor.hh:42
│ │ │ +
constexpr data_handle_type offset(data_handle_type p, std::size_t i) const noexcept
Return a data handle to the i'th element in the data range starting at p
Definition default_accessor.hh:48
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,79 +1,86 @@ │ │ │ │ dune-common 2.10 │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ * _d_u_n_e │ │ │ │ * _c_o_m_m_o_n │ │ │ │ -typeutilities.hh │ │ │ │ + * _s_t_d │ │ │ │ +default_accessor.hh │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ LICENSE.md in module root │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ -5#ifndef DUNE_COMMON_TYPEUTILITIES_HH │ │ │ │ -6#define DUNE_COMMON_TYPEUTILITIES_HH │ │ │ │ +5#ifndef DUNE_COMMON_STD_DEFAULT_ACCESSOR_HH │ │ │ │ +6#define DUNE_COMMON_STD_DEFAULT_ACCESSOR_HH │ │ │ │ 7 │ │ │ │ -8#include │ │ │ │ -9#include │ │ │ │ -10#include │ │ │ │ +8#include │ │ │ │ +9 │ │ │ │ +_1_0namespace _D_u_n_e_:_:_S_t_d { │ │ │ │ 11 │ │ │ │ -12 │ │ │ │ -13namespace _D_u_n_e { │ │ │ │ -14 │ │ │ │ -22 namespace Impl │ │ │ │ -23 { │ │ │ │ -24 │ │ │ │ -25 template │ │ │ │ -26 struct disableCopyMoveHelper : public std::is_base_of...>>> │ │ │ │ -27 {}; │ │ │ │ -28 │ │ │ │ -29 template │ │ │ │ -30 struct disableCopyMoveHelper : public std::false_type │ │ │ │ -31 {}; │ │ │ │ -32 │ │ │ │ -33 } // namespace Impl │ │ │ │ -34 │ │ │ │ +22template │ │ │ │ +_2_3class _d_e_f_a_u_l_t___a_c_c_e_s_s_o_r │ │ │ │ +24{ │ │ │ │ +25public: │ │ │ │ +_2_6 using _e_l_e_m_e_n_t___t_y_p_e = Element; │ │ │ │ +_2_7 using _d_a_t_a___h_a_n_d_l_e___t_y_p_e = _e_l_e_m_e_n_t___t_y_p_e*; │ │ │ │ +_2_8 using _r_e_f_e_r_e_n_c_e = _e_l_e_m_e_n_t___t_y_p_e&; │ │ │ │ +_2_9 using _o_f_f_s_e_t___p_o_l_i_c_y = _d_e_f_a_u_l_t___a_c_c_e_s_s_o_r; │ │ │ │ +30 │ │ │ │ +31public: │ │ │ │ +32 // [mdspan.accessor.default.overview] │ │ │ │ +_3_4 constexpr _d_e_f_a_u_l_t___a_c_c_e_s_s_o_r () noexcept = default; │ │ │ │ 35 │ │ │ │ -44 template │ │ │ │ -_4_5 using _d_i_s_a_b_l_e_C_o_p_y_M_o_v_e = std::enable_if_t< not Impl:: │ │ │ │ -disableCopyMoveHelper::value, int>; │ │ │ │ +37 template , │ │ │ │ +int> = 0> │ │ │ │ +_3_9 constexpr _d_e_f_a_u_l_t___a_c_c_e_s_s_o_r (_d_e_f_a_u_l_t___a_c_c_e_s_s_o_r) noexcept {} │ │ │ │ +40 │ │ │ │ +_4_2 constexpr _r_e_f_e_r_e_n_c_e _a_c_c_e_s_s (_d_a_t_a___h_a_n_d_l_e___t_y_p_e p, std::size_t i) const │ │ │ │ +noexcept │ │ │ │ +43 { │ │ │ │ +44 return p[i]; │ │ │ │ +45 } │ │ │ │ 46 │ │ │ │ -47 │ │ │ │ -48 │ │ │ │ -71 template │ │ │ │ -_7_2 struct _P_r_i_o_r_i_t_y_T_a_g : public _P_r_i_o_r_i_t_y_T_a_g │ │ │ │ -73 { │ │ │ │ -_7_4 static constexpr std::size_t _v_a_l_u_e = priority; │ │ │ │ -75 }; │ │ │ │ -76 │ │ │ │ -85 template<> │ │ │ │ -_8_6 struct _P_r_i_o_r_i_t_y_T_a_g<0> │ │ │ │ -87 { │ │ │ │ -_8_8 static constexpr std::size_t _v_a_l_u_e = 0; │ │ │ │ -89 }; │ │ │ │ -90 │ │ │ │ -91 │ │ │ │ -92 │ │ │ │ -93} // namespace Dune │ │ │ │ -94 │ │ │ │ -95 │ │ │ │ -96 │ │ │ │ -97#endif // DUNE_COMMON_TYPEUTILITIES_HH │ │ │ │ -_D_u_n_e_:_:_d_i_s_a_b_l_e_C_o_p_y_M_o_v_e │ │ │ │ -std::enable_if_t< not Impl::disableCopyMoveHelper< This, T... >::value, int > │ │ │ │ -disableCopyMove │ │ │ │ -Helper to disable constructor as copy and move constructor. │ │ │ │ -DDeeffiinniittiioonn typeutilities.hh:45 │ │ │ │ -_D_u_n_e │ │ │ │ -Dune namespace. │ │ │ │ -DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ -_D_u_n_e_:_:_P_r_i_o_r_i_t_y_T_a_g │ │ │ │ -Helper class for tagging priorities. │ │ │ │ -DDeeffiinniittiioonn typeutilities.hh:73 │ │ │ │ -_D_u_n_e_:_:_P_r_i_o_r_i_t_y_T_a_g_:_:_v_a_l_u_e │ │ │ │ -static constexpr std::size_t value │ │ │ │ -DDeeffiinniittiioonn typeutilities.hh:74 │ │ │ │ +_4_8 constexpr _d_a_t_a___h_a_n_d_l_e___t_y_p_e _o_f_f_s_e_t (_d_a_t_a___h_a_n_d_l_e___t_y_p_e p, std::size_t i) const │ │ │ │ +noexcept │ │ │ │ +49 { │ │ │ │ +50 return p + i; │ │ │ │ +51 } │ │ │ │ +52}; │ │ │ │ +53 │ │ │ │ +54} // end namespace Dune::Std │ │ │ │ +55 │ │ │ │ +56#endif // DUNE_COMMON_STD_DEFAULT_ACCESSOR_HH │ │ │ │ +_s_t_d │ │ │ │ +STL namespace. │ │ │ │ +_D_u_n_e_:_:_S_t_d │ │ │ │ +Namespace for features backported from new C++ standards. │ │ │ │ +DDeeffiinniittiioonn default_accessor.hh:10 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_d_e_f_a_u_l_t___a_c_c_e_s_s_o_r │ │ │ │ +A type for indexed access to elements of mdspan. │ │ │ │ +DDeeffiinniittiioonn default_accessor.hh:24 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_d_e_f_a_u_l_t___a_c_c_e_s_s_o_r_:_:_d_a_t_a___h_a_n_d_l_e___t_y_p_e │ │ │ │ +element_type * data_handle_type │ │ │ │ +DDeeffiinniittiioonn default_accessor.hh:27 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_d_e_f_a_u_l_t___a_c_c_e_s_s_o_r_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ +element_type & reference │ │ │ │ +DDeeffiinniittiioonn default_accessor.hh:28 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_d_e_f_a_u_l_t___a_c_c_e_s_s_o_r_:_:_e_l_e_m_e_n_t___t_y_p_e │ │ │ │ +Element element_type │ │ │ │ +DDeeffiinniittiioonn default_accessor.hh:26 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_d_e_f_a_u_l_t___a_c_c_e_s_s_o_r_:_:_d_e_f_a_u_l_t___a_c_c_e_s_s_o_r │ │ │ │ +constexpr default_accessor() noexcept=default │ │ │ │ +Default constructor. │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_d_e_f_a_u_l_t___a_c_c_e_s_s_o_r_:_:_a_c_c_e_s_s │ │ │ │ +constexpr reference access(data_handle_type p, std::size_t i) const noexcept │ │ │ │ +Return a reference to the i'th element in the data range starting at p │ │ │ │ +DDeeffiinniittiioonn default_accessor.hh:42 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_d_e_f_a_u_l_t___a_c_c_e_s_s_o_r_:_:_o_f_f_s_e_t │ │ │ │ +constexpr data_handle_type offset(data_handle_type p, std::size_t i) const │ │ │ │ +noexcept │ │ │ │ +Return a data handle to the i'th element in the data range starting at p │ │ │ │ +DDeeffiinniittiioonn default_accessor.hh:48 │ │ │ │ =============================================================================== │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00023.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: typetraits.hh File Reference │ │ │ +dune-common: extents.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,144 +65,57 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │
│ │ │ Classes | │ │ │ Namespaces | │ │ │ -Typedefs | │ │ │ -Functions
│ │ │ -
typetraits.hh File Reference
│ │ │ +Typedefs
│ │ │ +
extents.hh File Reference
│ │ │ │ │ │
│ │ │ - │ │ │ -

Traits for type conversions and type information. │ │ │ -More...

│ │ │ -
#include <complex>
│ │ │ +
#include <array>
│ │ │ +#include <cassert>
│ │ │ +#include <limits>
│ │ │ #include <type_traits>
│ │ │ -#include <utility>
│ │ │ -#include <vector>
│ │ │ +#include <dune/common/indices.hh>
│ │ │ +#include <dune/common/std/span.hh>
│ │ │ +#include <dune/common/std/impl/fwd_layouts.hh>
│ │ │
│ │ │

Go to the source code of this file.

│ │ │ │ │ │ │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ + │ │ │ + │ │ │ │ │ │

│ │ │ Classes

struct  Dune::Empty
 Just an empty class. More...
 
struct  Dune::IsInteroperable< T1, T2 >
 Checks whether two types are interoperable. More...
 
struct  Dune::EnableIfInterOperable< T1, T2, Type >
 Enable typedef if two types are interoperable. More...
 
struct  Dune::AlwaysFalse< T >
 template which always yields a false value More...
 
struct  Dune::AlwaysTrue< T >
 template which always yields a true value More...
 
struct  Dune::IsCallable< F(Args...), R >
 Check if a type is callable with ()-operator and given arguments. More...
 
struct  Dune::IsNumber< T >
 Whether this type acts as a scalar in the context of (hierarchically blocked) containers. More...
 
struct  Dune::HasNaN< T >
 Whether this type has a value of NaN. More...
 
struct  Dune::IsIndexable< T, I >
 Type trait to determine whether an instance of T has an operator[](I), i.e. whether it can be indexed with an index of type I. More...
 
struct  Dune::IsIterable< T, typename >
 typetrait to check that a class has begin() and end() members More...
 
struct  Dune::IsTuple< T >
 Check if T is a std::tuple<...> More...
 
struct  Dune::IsTupleOrDerived< T >
 Check if T derived from a std::tuple<...> More...
 
struct  Dune::IsIntegralConstant< T >
 Check if T is an std::integral_constant<I, i> More...
 
struct  Dune::IsCompileTimeConstant< T >
 Check if T is an integral constant or any type derived from std::integral_constant. More...
 
struct  Dune::SizeOf< T >
 Compute size of variadic type list. More...
 
struct  Dune::AutonomousValueType< T >
 Type free of internal references that T can be converted to. More...
 
struct  Dune::AutonomousValueType< T & >
 Specialization to remove lvalue references. More...
 
struct  Dune::AutonomousValueType< T && >
 Specialization to remove rvalue references. More...
 
struct  Dune::AutonomousValueType< const T >
 Specialization to remove const qualifiers. More...
 
struct  Dune::AutonomousValueType< volatile T >
 Specialization to remove volatile qualifiers. More...
 
struct  Dune::AutonomousValueType< std::vector< bool >::reference >
 Specialization for the proxies of vector<bool> More...
 
struct  Dune::AutonomousValueType< volatile const T >
 Specialization to remove both const and volatile qualifiers. More...
class  Dune::Std::extents< IndexType, exts >
 Multidimensional index space with dynamic and static extents. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ + │ │ │ + │ │ │

│ │ │ Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::Std
 Namespace for features backported from new C++ standards.
 
│ │ │ │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -

│ │ │ Typedefs

template<class... Types>
using Dune::void_t = typename Impl::voider< Types... >::type
 Is void for all valid input types. The workhorse for C++11 SFINAE-techniques.
 
template<class Type >
using Dune::field_t = typename FieldTraits< Type >::field_type
 Convenient access to FieldTraits<Type>::field_type.
 
template<class Type >
using Dune::real_t = typename FieldTraits< Type >::real_type
 Convenient access to FieldTraits<Type>::real_type.
 
template<class T >
using Dune::AutonomousValue = typename AutonomousValueType< T >::type
 Type free of internal references that T can be converted to.
 
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │

│ │ │ -Functions

template<class T , T... t, std::size_t index>
constexpr auto Dune::integerSequenceEntry (std::integer_sequence< T, t... >, std::integral_constant< std::size_t, index > i)
 Get entry of std::integer_sequence.
 
template<class T >
constexpr AutonomousValue< T > Dune::autoCopy (T &&v)
 Autonomous copy of an expression's value for use in auto type deduction.
 
template<class IndexType , std::size_t R>
using Dune::Std::dextents = typename Impl::DExtentsImpl< IndexType, std::make_integer_sequence< std::size_t, R > >::type
 Alias of extents of given rank R and purely dynamic extents. See [mdspan.extents.dextents].
 
│ │ │ -

Detailed Description

│ │ │ -

Traits for type conversions and type information.

│ │ │ -
Author
Markus Blatt, Christian Engwer
│ │ │ -
│ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,125 +1,37 @@ │ │ │ │ dune-common 2.10 │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ * _d_u_n_e │ │ │ │ * _c_o_m_m_o_n │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ -typetraits.hh File Reference │ │ │ │ -Traits for type conversions and type information. _M_o_r_e_._._. │ │ │ │ -#include │ │ │ │ + * _s_t_d │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s │ │ │ │ +extents.hh File Reference │ │ │ │ +#include │ │ │ │ +#include │ │ │ │ +#include │ │ │ │ #include │ │ │ │ -#include │ │ │ │ -#include │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_i_n_d_i_c_e_s_._h_h> │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_s_p_a_n_._h_h> │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_i_m_p_l_/_f_w_d___l_a_y_o_u_t_s_._h_h> │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ CCllaasssseess │ │ │ │ -struct   _D_u_n_e_:_:_E_m_p_t_y │ │ │ │ -  Just an empty class. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_I_s_I_n_t_e_r_o_p_e_r_a_b_l_e_<_ _T_1_,_ _T_2_ _> │ │ │ │ -  Checks whether two types are interoperable. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_E_n_a_b_l_e_I_f_I_n_t_e_r_O_p_e_r_a_b_l_e_<_ _T_1_,_ _T_2_,_ _T_y_p_e_ _> │ │ │ │ -  Enable typedef if two types are interoperable. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_A_l_w_a_y_s_F_a_l_s_e_<_ _T_ _> │ │ │ │ -  template which always yields a false value _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_A_l_w_a_y_s_T_r_u_e_<_ _T_ _> │ │ │ │ -  template which always yields a true value _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_I_s_C_a_l_l_a_b_l_e_<_ _F_(_A_r_g_s_._._._)_,_ _R_ _> │ │ │ │ -  Check if a type is callable with ()-operator and given arguments. │ │ │ │ - _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_I_s_N_u_m_b_e_r_<_ _T_ _> │ │ │ │ -  Whether this type acts as a scalar in the context of (hierarchically │ │ │ │ - blocked) containers. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_H_a_s_N_a_N_<_ _T_ _> │ │ │ │ -  Whether this type has a value of NaN. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_I_s_I_n_d_e_x_a_b_l_e_<_ _T_,_ _I_ _> │ │ │ │ -  Type trait to determine whether an instance of T has an operator[](I), │ │ │ │ - i.e. whether it can be indexed with an index of type I. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_I_s_I_t_e_r_a_b_l_e_<_ _T_,_ _t_y_p_e_n_a_m_e_ _> │ │ │ │ -  typetrait to check that a class has begin() and end() members _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_I_s_T_u_p_l_e_<_ _T_ _> │ │ │ │ -  Check if T is a std::tuple<...> _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_I_s_T_u_p_l_e_O_r_D_e_r_i_v_e_d_<_ _T_ _> │ │ │ │ -  Check if T derived from a std::tuple<...> _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_I_s_I_n_t_e_g_r_a_l_C_o_n_s_t_a_n_t_<_ _T_ _> │ │ │ │ -  Check if T is an std::integral_constant _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_I_s_C_o_m_p_i_l_e_T_i_m_e_C_o_n_s_t_a_n_t_<_ _T_ _> │ │ │ │ -  Check if T is an integral constant or any type derived from std:: │ │ │ │ - integral_constant. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_S_i_z_e_O_f_<_ _T_ _> │ │ │ │ -  Compute size of variadic type list. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e_<_ _T_ _> │ │ │ │ -  Type free of internal references that T can be converted to. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e_<_ _T_ _&_ _> │ │ │ │ -  Specialization to remove lvalue references. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e_<_ _T_ _&_&_ _> │ │ │ │ -  Specialization to remove rvalue references. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e_<_ _c_o_n_s_t_ _T_ _> │ │ │ │ -  Specialization to remove const qualifiers. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e_<_ _v_o_l_a_t_i_l_e_ _T_ _> │ │ │ │ -  Specialization to remove volatile qualifiers. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e_<_ _s_t_d_:_:_v_e_c_t_o_r_<_ _b_o_o_l_ _>_:_:_r_e_f_e_r_e_n_c_e_ _> │ │ │ │ -  Specialization for the proxies of vector _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e_<_ _v_o_l_a_t_i_l_e_ _c_o_n_s_t_ _T_ _> │ │ │ │ -  Specialization to remove both const and volatile qualifiers. _M_o_r_e_._._. │ │ │ │ +class   _D_u_n_e_:_:_S_t_d_:_:_e_x_t_e_n_t_s_<_ _I_n_d_e_x_T_y_p_e_,_ _e_x_t_s_ _> │ │ │ │ +  Multidimensional index space with dynamic and static extents. _M_o_r_e_._._. │ │ │ │   │ │ │ │ NNaammeessppaacceess │ │ │ │ namespace   _D_u_n_e │ │ │ │   _D_u_n_e namespace. │ │ │ │   │ │ │ │ -TTyyppeeddeeffss │ │ │ │ -template │ │ │ │ -using  _D_u_n_e_:_:_v_o_i_d___t = typename Impl::voider< Types... >::type │ │ │ │ -  Is void for all valid input types. The workhorse for C++11 SFINAE- │ │ │ │ - techniques. │ │ │ │ -  │ │ │ │ -template │ │ │ │ -using  _D_u_n_e_:_:_f_i_e_l_d___t = typename _F_i_e_l_d_T_r_a_i_t_s< Type >::field_type │ │ │ │ -  Convenient access to _F_i_e_l_d_T_r_a_i_t_s_<_T_y_p_e_>_:_:_f_i_e_l_d___t_y_p_e. │ │ │ │ -  │ │ │ │ -template │ │ │ │ -using  _D_u_n_e_:_:_r_e_a_l___t = typename _F_i_e_l_d_T_r_a_i_t_s< Type >::real_type │ │ │ │ -  Convenient access to _F_i_e_l_d_T_r_a_i_t_s_<_T_y_p_e_>_:_:_r_e_a_l___t_y_p_e. │ │ │ │ +namespace   _D_u_n_e_:_:_S_t_d │ │ │ │ +  Namespace for features backported from new C++ standards. │ │ │ │   │ │ │ │ -template │ │ │ │ -using  _D_u_n_e_:_:_A_u_t_o_n_o_m_o_u_s_V_a_l_u_e = typename _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e< T >::type │ │ │ │ -  Type free of internal references that T can be converted to. │ │ │ │ -  │ │ │ │ -FFuunnccttiioonnss │ │ │ │ -template │ │ │ │ - constexpr auto  _D_u_n_e_:_:_i_n_t_e_g_e_r_S_e_q_u_e_n_c_e_E_n_t_r_y (std:: │ │ │ │ - integer_sequence< T, t... >, std:: │ │ │ │ - integral_constant< std::size_t, index > i) │ │ │ │ -  Get entry of std::integer_sequence. │ │ │ │ -  │ │ │ │ -template │ │ │ │ -constexpr _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e< T >  _D_u_n_e_:_:_a_u_t_o_C_o_p_y (T &&v) │ │ │ │ -  Autonomous copy of an expression's value for │ │ │ │ - use in auto type deduction. │ │ │ │ +TTyyppeeddeeffss │ │ │ │ +template │ │ │ │ +using  _D_u_n_e_:_:_S_t_d_:_:_d_e_x_t_e_n_t_s = typename Impl::DExtentsImpl< IndexType, std:: │ │ │ │ + make_integer_sequence< std::size_t, R > >::type │ │ │ │ +  Alias of extents of given rank R and purely dynamic extents. See │ │ │ │ + [mdspan.extents.dextents]. │ │ │ │   │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ -Traits for type conversions and type information. │ │ │ │ - Author │ │ │ │ - Markus Blatt, Christian Engwer │ │ │ │ =============================================================================== │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00023_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: typetraits.hh Source File │ │ │ +dune-common: extents.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,443 +70,289 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
typetraits.hh
│ │ │ +
extents.hh
│ │ │
│ │ │
│ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │
3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
│ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ -
5#ifndef DUNE_TYPETRAITS_HH
│ │ │ -
6#define DUNE_TYPETRAITS_HH
│ │ │ +
5#ifndef DUNE_COMMON_STD_EXTENTS_HH
│ │ │ +
6#define DUNE_COMMON_STD_EXTENTS_HH
│ │ │
7
│ │ │ -
8#include <complex>
│ │ │ -
9#include <type_traits>
│ │ │ -
10#include <utility>
│ │ │ -
11#include <vector>
│ │ │ -
12
│ │ │ -
13namespace Dune
│ │ │ -
14{
│ │ │ +
8#include <array>
│ │ │ +
9#include <cassert>
│ │ │ +
10#include <limits>
│ │ │ +
11#include <type_traits>
│ │ │ +
12#if __has_include(<version>)
│ │ │ +
13 #include <version>
│ │ │ +
14#endif
│ │ │
15
│ │ │ -
16 namespace Impl
│ │ │ -
17 {
│ │ │ + │ │ │ + │ │ │ + │ │ │
19
│ │ │ -
23 template <class...>
│ │ │ -
24 struct voider
│ │ │ -
25 {
│ │ │ -
26 using type = void;
│ │ │ -
27 };
│ │ │ -
28 }
│ │ │ -
29
│ │ │ -
31
│ │ │ -
39 template <class... Types>
│ │ │ -
40 using void_t = typename Impl::voider<Types...>::type;
│ │ │ -
41
│ │ │ -
55 struct Empty {};
│ │ │ +
20namespace Dune::Std {
│ │ │ +
21namespace Impl {
│ │ │ +
22
│ │ │ +
23template <class IndexType, std::size_t n>
│ │ │ +
24struct DynamicExtentsArray
│ │ │ +
25{
│ │ │ +
26 using type = std::array<IndexType,n>;
│ │ │ +
27};
│ │ │ +
28
│ │ │ +
29template <class IndexType>
│ │ │ +
30struct DynamicExtentsArray<IndexType,0>
│ │ │ +
31{
│ │ │ +
32 // empty type with minimal array-like interface
│ │ │ +
33 struct type {
│ │ │ +
34 IndexType operator[](std::size_t /*i*/) const { return 0; }
│ │ │ +
35 };
│ │ │ +
36};
│ │ │ +
37
│ │ │ +
38} // end namespace Impl
│ │ │ +
39
│ │ │ +
40
│ │ │ +
52template <class IndexType, std::size_t... exts>
│ │ │ +
│ │ │ + │ │ │ +
54{
│ │ │ +
55 static_assert(std::is_integral_v<IndexType>);
│ │ │
56
│ │ │ -
63 template<class T1, class T2>
│ │ │ -
│ │ │ - │ │ │ -
65 {
│ │ │ -
70 constexpr static bool value = std::is_convertible<T1,T2>::value || std::is_convertible<T2,T1>::value;
│ │ │ -
71 };
│ │ │ -
│ │ │ +
57private:
│ │ │ +
58 static constexpr std::size_t rank_ = sizeof...(exts);
│ │ │ +
59 static constexpr std::size_t rank_dynamic_ = ((exts == Std::dynamic_extent) + ... + 0);
│ │ │ +
60
│ │ │ +
61 // this type is used internally to extract the static extents by index
│ │ │ +
62 using array_type = std::array<std::size_t,rank_>;
│ │ │ +
63
│ │ │ +
64 // store at position i how many extents in {exts[0],...,exts[i]} are dynamic_extent
│ │ │ +
65 static constexpr std::array<std::size_t,rank_+1> make_dynamic_index()
│ │ │ +
66 {
│ │ │ +
67 std::array<std::size_t,rank_+1> di{{}};
│ │ │ +
68 for (std::size_t i = 0; i < rank_; ++i)
│ │ │ +
69 di[i+1] = di[i] + (array_type{exts...}[i] == Std::dynamic_extent);
│ │ │ +
70 return di;
│ │ │ +
71 }
│ │ │
72
│ │ │ -
78 template<class T1, class T2, class Type>
│ │ │ -
│ │ │ - │ │ │ -
80 : public std::enable_if<IsInteroperable<T1,T2>::value, Type>
│ │ │ -
81 {};
│ │ │ -
│ │ │ -
82
│ │ │ -
100
│ │ │ -
116
│ │ │ -
123 template<typename T>
│ │ │ -
124 struct AlwaysFalse : public std::false_type {};
│ │ │ -
125
│ │ │ -
133 template<typename T>
│ │ │ -
134 struct AlwaysTrue : public std::true_type {};
│ │ │ -
135
│ │ │ -
161 template<typename D, typename R = void>
│ │ │ - │ │ │ -
163
│ │ │ -
168 template<typename R, typename F, typename... Args>
│ │ │ -
│ │ │ -
169 struct IsCallable<F(Args...), R>
│ │ │ -
170 : public std::bool_constant<
│ │ │ -
171 std::is_invocable_r_v<R, F, Args...>
│ │ │ -
172 && !std::is_member_pointer_v<std::decay_t<F>>
│ │ │ -
173 > {};
│ │ │ -
│ │ │ -
174
│ │ │ -
177
│ │ │ -
192 template <typename T>
│ │ │ -
│ │ │ -
193 struct IsNumber
│ │ │ -
194 : public std::integral_constant<bool, std::is_arithmetic<T>::value> {
│ │ │ -
195 };
│ │ │ -
│ │ │ -
196
│ │ │ -
197#ifndef DOXYGEN
│ │ │ -
198
│ │ │ -
199 template <typename T>
│ │ │ -
200 struct IsNumber<std::complex<T>>
│ │ │ -
201 : public std::integral_constant<bool, IsNumber<T>::value> {
│ │ │ -
202 };
│ │ │ -
203
│ │ │ -
204#endif // DOXYGEN
│ │ │ +
73 // An index mapping computed by `make_dynamic_index()` to get the position of a dynamic
│ │ │ +
74 // extent in {exts...} within the array dynamic_extents.
│ │ │ +
75 static constexpr std::array<std::size_t,rank_+1> dynamic_index_{make_dynamic_index()};
│ │ │ +
76
│ │ │ +
77public:
│ │ │ +
78 using rank_type = std::size_t;
│ │ │ +
79 using index_type = IndexType;
│ │ │ +
80 using size_type = std::make_unsigned_t<index_type>;
│ │ │ +
81
│ │ │ +
85
│ │ │ +
87 static constexpr rank_type rank () noexcept { return rank_; }
│ │ │ +
88
│ │ │ +
90 static constexpr rank_type rank_dynamic () noexcept { return rank_dynamic_; }
│ │ │ +
91
│ │ │ +
│ │ │ +
93 static constexpr std::size_t static_extent (rank_type r) noexcept
│ │ │ +
94 {
│ │ │ +
95 assert(rank() > 0 && r < rank());
│ │ │ +
96 return array_type{exts...}[r];
│ │ │ +
97 }
│ │ │ +
│ │ │ +
98
│ │ │ +
│ │ │ +
100 constexpr index_type extent (rank_type r) const noexcept
│ │ │ +
101 {
│ │ │ +
102 assert(rank() > 0 && r < rank());
│ │ │ +
103 if (std::size_t e = static_extent(r); e != Std::dynamic_extent)
│ │ │ +
104 return index_type(e);
│ │ │ +
105 else
│ │ │ +
106 return dynamic_extents_[dynamic_index_[r]];
│ │ │ +
107 }
│ │ │ +
│ │ │ +
108
│ │ │ +
110
│ │ │ +
111public:
│ │ │ +
114
│ │ │ +
116 constexpr extents () noexcept = default;
│ │ │ +
117
│ │ │ +
120 template <class... IndexTypes,
│ │ │ +
121 std::enable_if_t<(... && std::is_convertible_v<IndexTypes,index_type>), int> = 0,
│ │ │ +
122 std::enable_if_t<(sizeof...(IndexTypes) == rank() || sizeof...(IndexTypes) == rank_dynamic()), int> = 0,
│ │ │ +
123 std::enable_if_t<(... && std::is_nothrow_constructible_v<index_type, IndexTypes>), int> = 0>
│ │ │ +
│ │ │ +
124 constexpr explicit extents (IndexTypes... e) noexcept
│ │ │ +
125 {
│ │ │ +
126 init_dynamic_extents<sizeof...(e)>(std::array<index_type,sizeof...(e)>{index_type(e)...});
│ │ │ +
127 }
│ │ │ +
│ │ │ +
128
│ │ │ +
131 template <class I, std::size_t N,
│ │ │ +
132 std::enable_if_t<std::is_convertible_v<I, index_type>, int> = 0,
│ │ │ +
133 std::enable_if_t<(N == rank() || N == rank_dynamic()), int> = 0>
│ │ │ +
134 #if __cpp_conditional_explicit >= 201806L
│ │ │ +
135 explicit(N != rank_dynamic())
│ │ │ +
136 #endif
│ │ │ +
│ │ │ +
137 constexpr extents (const std::array<I,N>& e) noexcept
│ │ │ +
138 {
│ │ │ +
139 init_dynamic_extents<N>(e);
│ │ │ +
140 }
│ │ │ +
│ │ │ +
141
│ │ │ +
144 template <class I, std::size_t N,
│ │ │ +
145 std::enable_if_t<std::is_convertible_v<I, index_type>, int> = 0,
│ │ │ +
146 std::enable_if_t<(N == rank() || N == rank_dynamic()), int> = 0,
│ │ │ +
147 std::enable_if_t<std::is_nothrow_constructible_v<index_type, const I&>, int> = 0>
│ │ │ +
148 #if __cpp_conditional_explicit >= 201806L
│ │ │ +
149 explicit(N != rank_dynamic())
│ │ │ +
150 #endif
│ │ │ +
│ │ │ +
151 constexpr extents (Std::span<I,N> e) noexcept
│ │ │ +
152 {
│ │ │ +
153 init_dynamic_extents<N>(e);
│ │ │ +
154 }
│ │ │ +
│ │ │ +
155
│ │ │ +
156 template <class I, std::size_t... e,
│ │ │ +
157 std::enable_if_t<(sizeof...(e) == rank()), int> = 0,
│ │ │ +
158 std::enable_if_t<((e == Std::dynamic_extent || exts == Std::dynamic_extent || e == exts) &&...), int> = 0>
│ │ │ +
159 #if __cpp_conditional_explicit >= 201806L
│ │ │ +
160 explicit(
│ │ │ +
161 (( (exts != Std::dynamic_extent) && (e == Std::dynamic_extent)) || ... ) ||
│ │ │ +
162 (std::numeric_limits<index_type>::max() < std::numeric_limits<I>::max()))
│ │ │ +
163 #endif
│ │ │ +
│ │ │ +
164 constexpr extents (const extents<I,e...>& other) noexcept
│ │ │ +
165 {
│ │ │ +
166 init_dynamic_extents<sizeof...(e)>(as_array(other));
│ │ │ +
167 }
│ │ │ +
│ │ │ +
168
│ │ │ +
170
│ │ │ +
171
│ │ │ +
173 template <class OtherIndexType, std::size_t... otherExts>
│ │ │ +
│ │ │ +
174 friend constexpr bool operator== (const extents& a, const extents<OtherIndexType, otherExts...>& b) noexcept
│ │ │ +
175 {
│ │ │ +
176 if (a.rank() != b.rank())
│ │ │ +
177 return false;
│ │ │ +
178 using I = std::common_type_t<index_type, OtherIndexType>;
│ │ │ +
179 for (rank_type i = 0; i < rank(); ++i)
│ │ │ +
180 if (I(a.extent(i)) != I(b.extent(i)))
│ │ │ +
181 return false;
│ │ │ +
182 return true;
│ │ │ +
183 }
│ │ │ +
│ │ │ +
184
│ │ │ +
185private:
│ │ │ +
186#ifndef DOXYGEN
│ │ │ +
187 // The product of all extents
│ │ │ +
188 constexpr size_type product () const noexcept
│ │ │ +
189 {
│ │ │ +
190 size_type prod = 1;
│ │ │ +
191 for (rank_type i = 0; i < rank(); ++i)
│ │ │ +
192 prod *= extent(i);
│ │ │ +
193 return prod;
│ │ │ +
194 }
│ │ │ +
195
│ │ │ +
196 // A representation of all extents as an array
│ │ │ +
197 template <class OtherIndexType, std::size_t... otherExts>
│ │ │ +
198 static constexpr std::array<index_type,sizeof...(otherExts)>
│ │ │ +
199 as_array (const Std::extents<OtherIndexType,otherExts...>& e) noexcept
│ │ │ +
200 {
│ │ │ +
201 return unpackIntegerSequence([&](auto... ii) {
│ │ │ +
202 return std::array<index_type,sizeof...(otherExts)>{index_type(e.extent(ii))...}; },
│ │ │ +
203 std::make_index_sequence<sizeof...(otherExts)>{});
│ │ │ +
204 }
│ │ │
205
│ │ │ -
207
│ │ │ -
210 template <typename T>
│ │ │ -
│ │ │ -
211 struct HasNaN
│ │ │ -
212 : public std::integral_constant<bool, std::is_floating_point<T>::value> {
│ │ │ -
213 };
│ │ │ -
│ │ │ -
214
│ │ │ -
215#ifndef DOXYGEN
│ │ │ -
216
│ │ │ -
217 template <typename T>
│ │ │ -
218 struct HasNaN<std::complex<T>>
│ │ │ -
219 : public std::integral_constant<bool, std::is_floating_point<T>::value> {
│ │ │ -
220 };
│ │ │ -
221
│ │ │ -
222#endif // DOXYGEN
│ │ │ -
223
│ │ │ -
224#ifndef DOXYGEN
│ │ │ +
206 // Copy only the dynamic extents from the container `e` into the `dynamic_extents_` storage
│ │ │ +
207 template <std::size_t N, class Container>
│ │ │ +
208 constexpr void init_dynamic_extents (const Container& e) noexcept
│ │ │ +
209 {
│ │ │ +
210 if constexpr(rank_dynamic() > 0) {
│ │ │ +
211 if constexpr(N == rank_dynamic()) {
│ │ │ +
212 assert(e.size() == rank_dynamic());
│ │ │ +
213 for (rank_type i = 0; i < rank_dynamic(); ++i)
│ │ │ +
214 dynamic_extents_[i] = e[i];
│ │ │ +
215 } else {
│ │ │ +
216 assert(e.size() == rank());
│ │ │ +
217 for (rank_type i = 0, j = 0; i < rank(); ++i) {
│ │ │ + │ │ │ +
219 dynamic_extents_[j++] = e[i];
│ │ │ +
220 }
│ │ │ +
221 }
│ │ │ +
222 }
│ │ │ +
223 }
│ │ │ +
224#endif // DOXYGEN
│ │ │
225
│ │ │ -
226 namespace Impl {
│ │ │ -
227
│ │ │ -
228 template<typename T, typename I, typename = int>
│ │ │ -
229 struct IsIndexable
│ │ │ -
230 : public std::false_type
│ │ │ -
231 {};
│ │ │ -
232
│ │ │ -
233 template<typename T, typename I>
│ │ │ -
234 struct IsIndexable<T,I,typename std::enable_if<(sizeof(std::declval<T>()[std::declval<I>()]) > 0),int>::type>
│ │ │ -
235 : public std::true_type
│ │ │ -
236 {};
│ │ │ -
237
│ │ │ -
238 }
│ │ │ -
239
│ │ │ -
240#endif // DOXYGEN
│ │ │ +
226private:
│ │ │ +
227 using dynamic_extents_type = typename Impl::DynamicExtentsArray<index_type,rank_dynamic()>::type;
│ │ │ +
228 [[no_unique_address]] dynamic_extents_type dynamic_extents_;
│ │ │ +
229
│ │ │ +
230 template <class, std::size_t...> friend class extents;
│ │ │ +
231 friend struct layout_left;
│ │ │ +
232 friend struct layout_right;
│ │ │ +
233 friend struct layout_stride;
│ │ │ +
234};
│ │ │ +
│ │ │ +
235
│ │ │ +
236
│ │ │ +
237namespace Impl {
│ │ │ +
238
│ │ │ +
239template <class IndexType, class Seq>
│ │ │ +
240struct DExtentsImpl;
│ │ │
241
│ │ │ -
243
│ │ │ -
247 template<typename T, typename I = std::size_t>
│ │ │ -
│ │ │ - │ │ │ -
249 : public Impl::IsIndexable<T,I>
│ │ │ -
250 {};
│ │ │ -
│ │ │ +
242template <class IndexType, std::size_t... I>
│ │ │ +
243struct DExtentsImpl<IndexType, std::integer_sequence<std::size_t,I...>>
│ │ │ +
244{
│ │ │ +
245 template <std::size_t>
│ │ │ +
246 using dynamic = std::integral_constant<std::size_t,Std::dynamic_extent>;
│ │ │ + │ │ │ +
248};
│ │ │ +
249
│ │ │ +
250} // end namespace Impl
│ │ │
251
│ │ │ -
252#ifndef DOXYGEN
│ │ │ -
253
│ │ │ -
254 namespace Impl {
│ │ │ -
255 // This function does nothing.
│ │ │ -
256 // By passing expressions to this function one can avoid
│ │ │ -
257 // "value computed is not used" warnings that may show up
│ │ │ -
258 // in a comma expression.
│ │ │ -
259 template<class...T>
│ │ │ -
260 void ignore(T&&... /*t*/)
│ │ │ -
261 {}
│ │ │ -
262 }
│ │ │ -
263
│ │ │ -
264#endif // DOXYGEN
│ │ │ -
265
│ │ │ -
269 // default version, gets picked if SFINAE fails
│ │ │ -
270 template<typename T, typename = void>
│ │ │ -
│ │ │ - │ │ │ -
272 : public std::false_type
│ │ │ -
273 {};
│ │ │ -
│ │ │ -
274
│ │ │ -
275#ifndef DOXYGEN
│ │ │ -
276 // version for types with begin() and end()
│ │ │ -
277 template<typename T>
│ │ │ -
278 struct IsIterable<T, decltype(Impl::ignore(
│ │ │ -
279 std::declval<T>().begin(),
│ │ │ -
280 std::declval<T>().end(),
│ │ │ -
281 std::declval<T>().begin() != std::declval<T>().end(),
│ │ │ -
282 decltype(std::declval<T>().begin()){std::declval<T>().end()},
│ │ │ -
283 ++(std::declval<std::add_lvalue_reference_t<decltype(std::declval<T>().begin())>>()),
│ │ │ -
284 *(std::declval<T>().begin())
│ │ │ -
285 ))>
│ │ │ -
286 : public std::true_type
│ │ │ -
287 {};
│ │ │ -
288#endif
│ │ │ -
289
│ │ │ -
290#ifndef DOXYGEN
│ │ │ -
291 // this is just a forward declaration
│ │ │ -
292 template <class> struct FieldTraits;
│ │ │ -
293#endif
│ │ │ -
294
│ │ │ -
296 template <class Type>
│ │ │ - │ │ │ -
298
│ │ │ -
300 template <class Type>
│ │ │ - │ │ │ -
302
│ │ │ -
303
│ │ │ -
304#ifndef DOXYGEN
│ │ │ -
305
│ │ │ -
306 // Implementation of IsTuple
│ │ │ -
307 namespace Impl {
│ │ │ -
308
│ │ │ -
309 template<class T>
│ │ │ -
310 struct IsTuple : public std::false_type
│ │ │ -
311 {};
│ │ │ -
312
│ │ │ -
313 template<class... T>
│ │ │ -
314 struct IsTuple<std::tuple<T...>> : public std::true_type
│ │ │ -
315 {};
│ │ │ -
316
│ │ │ -
317 } // namespace Impl
│ │ │ -
318
│ │ │ -
319#endif // DOXYGEN
│ │ │ -
320
│ │ │ -
326 template<class T>
│ │ │ -
│ │ │ -
327 struct IsTuple :
│ │ │ -
328 public Impl::IsTuple<T>
│ │ │ -
329 {};
│ │ │ -
│ │ │ -
330
│ │ │ -
331
│ │ │ -
332#ifndef DOXYGEN
│ │ │ -
333
│ │ │ -
334 // Implementation of IsTupleOrDerived
│ │ │ -
335 namespace Impl {
│ │ │ -
336
│ │ │ -
337 template<class... T, class Dummy>
│ │ │ -
338 std::true_type isTupleOrDerived(const std::tuple<T...>*, Dummy)
│ │ │ -
339 { return {}; }
│ │ │ -
340
│ │ │ -
341 template<class Dummy>
│ │ │ -
342 std::false_type isTupleOrDerived(const void*, Dummy)
│ │ │ -
343 { return {}; }
│ │ │ -
344
│ │ │ -
345 } // namespace Impl
│ │ │ -
346
│ │ │ -
347#endif // DOXYGEN
│ │ │ -
348
│ │ │ -
354 template<class T>
│ │ │ -
│ │ │ - │ │ │ -
356 public decltype(Impl::isTupleOrDerived(std::declval<T*>(), true))
│ │ │ -
357 {};
│ │ │ -
│ │ │ -
358
│ │ │ -
359
│ │ │ -
360#ifndef DOXYGEN
│ │ │ -
361
│ │ │ -
362 // Implementation of is IsIntegralConstant
│ │ │ -
363 namespace Impl {
│ │ │ -
364
│ │ │ -
365 template<class T>
│ │ │ -
366 struct IsIntegralConstant : public std::false_type
│ │ │ -
367 {};
│ │ │ -
368
│ │ │ -
369 template<class T, T t>
│ │ │ -
370 struct IsIntegralConstant<std::integral_constant<T, t>> : public std::true_type
│ │ │ -
371 {};
│ │ │ -
372
│ │ │ -
373 } // namespace Impl
│ │ │ -
374
│ │ │ -
375#endif // DOXYGEN
│ │ │ -
376
│ │ │ -
382 template<class T>
│ │ │ -
│ │ │ -
383 struct IsIntegralConstant : public Impl::IsIntegralConstant<std::decay_t<T>>
│ │ │ -
384 {};
│ │ │ -
│ │ │ -
385
│ │ │ -
386
│ │ │ -
387#ifndef DOXYGEN
│ │ │ -
388
│ │ │ -
389 namespace Impl {
│ │ │ -
390
│ │ │ - │ │ │ -
392 {
│ │ │ -
393 template <class T, T value>
│ │ │ -
394 static std::true_type check(std::integral_constant<T,value>);
│ │ │ -
395 static std::false_type check(...);
│ │ │ -
396 };
│ │ │ -
397
│ │ │ -
398 } // namespace Impl
│ │ │ -
399
│ │ │ -
400#endif // DOXYGEN
│ │ │ -
401
│ │ │ -
408 template<class T>
│ │ │ -
│ │ │ - │ │ │ -
410 : public decltype(Impl::IsCompileTimeConstant::check(std::declval<T>()))
│ │ │ -
411 {};
│ │ │ -
│ │ │ -
412
│ │ │ -
413
│ │ │ -
414
│ │ │ -
430 template<typename... T>
│ │ │ -
│ │ │ -
431 struct
│ │ │ -
432 [[deprecated("This class is deprecated and will be removed after Dune 2.10. Use sizeof...(T) instead.")]]
│ │ │ -
433 SizeOf
│ │ │ -
434 : public std::integral_constant<std::size_t,sizeof...(T)>
│ │ │ -
435 {};
│ │ │ -
│ │ │ -
436
│ │ │ -
437
│ │ │ -
438#ifndef DOXYGEN
│ │ │ -
439
│ │ │ -
440 namespace Impl {
│ │ │ -
441
│ │ │ -
442 template<class T, T...>
│ │ │ -
443 struct IntegerSequenceHelper;
│ │ │ -
444
│ │ │ -
445 // Helper struct to compute the i-th entry of a std::integer_sequence
│ │ │ -
446 //
│ │ │ -
447 // This could also be implemented using std::get<index>(std::make_tuple(t...)).
│ │ │ -
448 // However, the gcc-6 implementation of std::make_tuple increases the instantiation
│ │ │ -
449 // depth by 15 levels for each argument, such that the maximal instantiation depth
│ │ │ -
450 // is easily hit, especially with clang where it is set to 256.
│ │ │ -
451 template<class T, T head, T... tail>
│ │ │ -
452 struct IntegerSequenceHelper<T, head, tail...>
│ │ │ -
453 {
│ │ │ -
454
│ │ │ -
455 // get first entry
│ │ │ -
456 static constexpr auto get(std::integral_constant<std::size_t, 0>)
│ │ │ -
457 {
│ │ │ -
458 return std::integral_constant<T, head>();
│ │ │ -
459 }
│ │ │ -
460
│ │ │ -
461 // call get with first entry cut off and decremented index
│ │ │ -
462 template<std::size_t index,
│ │ │ -
463 std::enable_if_t<(index > 0) and (index < sizeof...(tail)+1), int> = 0>
│ │ │ -
464 static constexpr auto get(std::integral_constant<std::size_t, index>)
│ │ │ -
465 {
│ │ │ -
466 return IntegerSequenceHelper<T, tail...>::get(std::integral_constant<std::size_t, index-1>());
│ │ │ -
467 }
│ │ │ -
468
│ │ │ -
469 // use static assertion if index exceeds size
│ │ │ -
470 template<std::size_t index,
│ │ │ -
471 std::enable_if_t<(index >= sizeof...(tail)+1), int> = 0>
│ │ │ -
472 static constexpr auto get(std::integral_constant<std::size_t, index>)
│ │ │ -
473 {
│ │ │ -
474 static_assert(index < sizeof...(tail)+1, "index used in IntegerSequenceEntry exceed size");
│ │ │ -
475 }
│ │ │ -
476 };
│ │ │ -
477
│ │ │ -
478 } // end namespace Impl
│ │ │ -
479
│ │ │ -
480#endif // DOXYGEN
│ │ │ -
481
│ │ │ -
482
│ │ │ -
491 template<class T, T... t, std::size_t index>
│ │ │ -
│ │ │ -
492 constexpr auto integerSequenceEntry(std::integer_sequence<T, t...> /*seq*/, std::integral_constant<std::size_t, index> i)
│ │ │ -
493 {
│ │ │ -
494 static_assert(index < sizeof...(t), "index used in IntegerSequenceEntry exceed size");
│ │ │ -
495 return Impl::IntegerSequenceHelper<T, t...>::get(i);
│ │ │ -
496 }
│ │ │ -
│ │ │ -
497
│ │ │ -
498
│ │ │ -
505 template<class IntegerSequence, std::size_t index>
│ │ │ - │ │ │ -
507
│ │ │ -
508#ifndef DOXYGEN
│ │ │ -
509
│ │ │ -
510 template<class T, T... t, std::size_t i>
│ │ │ -
511 struct IntegerSequenceEntry<std::integer_sequence<T, t...>, i>
│ │ │ -
512 : public decltype(Impl::IntegerSequenceHelper<T, t...>::get(std::integral_constant<std::size_t, i>()))
│ │ │ -
513 {};
│ │ │ -
514
│ │ │ -
515#endif // DOXYGEN
│ │ │ -
516
│ │ │ -
530 template<class T>
│ │ │ -
531 struct AutonomousValueType { using type = T; };
│ │ │ -
532
│ │ │ -
534 template<class T>
│ │ │ - │ │ │ -
536
│ │ │ -
538 template<class T>
│ │ │ - │ │ │ -
540
│ │ │ -
542 template<class T>
│ │ │ - │ │ │ -
544
│ │ │ -
546 template<class T>
│ │ │ -
547 struct AutonomousValueType<volatile T> : AutonomousValueType<T> {};
│ │ │ -
548
│ │ │ -
550 template<>
│ │ │ -
│ │ │ -
551 struct AutonomousValueType<std::vector<bool>::reference>
│ │ │ -
552 {
│ │ │ -
553 using type = bool;
│ │ │ -
554 };
│ │ │ -
│ │ │ -
555
│ │ │ -
557 template<class T>
│ │ │ -
558 struct AutonomousValueType<volatile const T> : AutonomousValueType<T> {};
│ │ │ -
559
│ │ │ -
587 template<class T>
│ │ │ - │ │ │ -
589
│ │ │ -
671 template<class T>
│ │ │ -
│ │ │ - │ │ │ -
673 {
│ │ │ -
674 return v;
│ │ │ -
675 }
│ │ │ -
│ │ │ -
676
│ │ │ -
678}
│ │ │ -
679#endif
│ │ │ -
constexpr auto integerSequenceEntry(std::integer_sequence< T, t... >, std::integral_constant< std::size_t, index > i)
Get entry of std::integer_sequence.
Definition typetraits.hh:492
│ │ │ -
typename FieldTraits< Type >::real_type real_t
Convenient access to FieldTraits<Type>::real_type.
Definition typetraits.hh:301
│ │ │ -
constexpr AutonomousValue< T > autoCopy(T &&v)
Autonomous copy of an expression's value for use in auto type deduction.
Definition typetraits.hh:672
│ │ │ -
typename AutonomousValueType< T >::type AutonomousValue
Type free of internal references that T can be converted to.
Definition typetraits.hh:588
│ │ │ -
typename Impl::voider< Types... >::type void_t
Is void for all valid input types. The workhorse for C++11 SFINAE-techniques.
Definition typetraits.hh:40
│ │ │ -
typename FieldTraits< Type >::field_type field_t
Convenient access to FieldTraits<Type>::field_type.
Definition typetraits.hh:297
│ │ │ +
252
│ │ │ +
258template <class IndexType, std::size_t R>
│ │ │ +
259using dextents = typename Impl::DExtentsImpl<IndexType, std::make_integer_sequence<std::size_t,R>>::type;
│ │ │ +
260
│ │ │ +
261} // end namespace Dune::Std
│ │ │ +
262
│ │ │ +
263#endif // DUNE_COMMON_STD_EXTENTS_HH
│ │ │ + │ │ │ + │ │ │ + │ │ │ +
decltype(auto) constexpr unpackIntegerSequence(F &&f, std::integer_sequence< I, i... > sequence)
Unpack an std::integer_sequence<I,i...> to std::integral_constant<I,i>...
Definition indices.hh:124
│ │ │ +
typename Impl::DExtentsImpl< IndexType, std::make_integer_sequence< std::size_t, R > >::type dextents
Alias of extents of given rank R and purely dynamic extents. See [mdspan.extents.dextents].
Definition extents.hh:259
│ │ │
STL namespace.
│ │ │ -
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ -
constexpr std::integer_sequence< T, II... > tail(std::integer_sequence< T, I0, II... >)
For a sequence [head,tail...) return the tail sequence.
Definition integersequence.hh:58
│ │ │ -
constexpr std::integral_constant< T, I0 > head(std::integer_sequence< T, I0, II... >)
For a sequence [head,tail...) return the single head element.
Definition integersequence.hh:53
│ │ │ -
constexpr auto get(std::integer_sequence< T, II... >, std::integral_constant< std::size_t, pos >={})
Return the entry at position pos of the given sequence.
Definition integersequence.hh:22
│ │ │ -
Whether this type acts as a scalar in the context of (hierarchically blocked) containers.
Definition typetraits.hh:194
│ │ │ -
T field_type
export the type representing the field
Definition ftraits.hh:28
│ │ │ -
T real_type
export the type representing the real type of the field
Definition ftraits.hh:30
│ │ │ -
Just an empty class.
Definition typetraits.hh:55
│ │ │ -
Checks whether two types are interoperable.
Definition typetraits.hh:65
│ │ │ -
static constexpr bool value
True if either a conversion from T1 to T2 or vice versa exists.
Definition typetraits.hh:70
│ │ │ -
Enable typedef if two types are interoperable.
Definition typetraits.hh:81
│ │ │ -
template which always yields a false value
Definition typetraits.hh:124
│ │ │ -
template which always yields a true value
Definition typetraits.hh:134
│ │ │ -
Check if a type is callable with ()-operator and given arguments.
Definition typetraits.hh:162
│ │ │ -
Whether this type has a value of NaN.
Definition typetraits.hh:212
│ │ │ -
Type trait to determine whether an instance of T has an operator[](I), i.e. whether it can be indexed...
Definition typetraits.hh:250
│ │ │ -
typetrait to check that a class has begin() and end() members
Definition typetraits.hh:273
│ │ │ -
Check if T is a std::tuple<...>
Definition typetraits.hh:329
│ │ │ -
Check if T derived from a std::tuple<...>
Definition typetraits.hh:357
│ │ │ -
Check if T is an std::integral_constant<I, i>
Definition typetraits.hh:384
│ │ │ -
Check if T is an integral constant or any type derived from std::integral_constant.
Definition typetraits.hh:411
│ │ │ -
Compute size of variadic type list.
Definition typetraits.hh:435
│ │ │ -
Get entry of std::integer_sequence.
Definition typetraits.hh:506
│ │ │ -
Type free of internal references that T can be converted to.
Definition typetraits.hh:531
│ │ │ -
T type
Definition typetraits.hh:531
│ │ │ - │ │ │ +
Namespace for features backported from new C++ standards.
Definition default_accessor.hh:10
│ │ │ +
constexpr std::size_t dynamic_extent
A constant of type std::size_t that is used to differentiate std::span of static and dynamic extent.
Definition span.hh:26
│ │ │ +
Multidimensional index space with dynamic and static extents.
Definition extents.hh:54
│ │ │ +
static constexpr rank_type rank_dynamic() noexcept
The number of dimensions with dynamic extent.
Definition extents.hh:90
│ │ │ +
constexpr extents(const extents< I, e... > &other) noexcept
Definition extents.hh:164
│ │ │ +
std::size_t rank_type
Definition extents.hh:78
│ │ │ +
constexpr extents() noexcept=default
The default constructor requires that all exts are not Std::dynamic_extent.
│ │ │ +
static constexpr rank_type rank() noexcept
The total number of dimensions.
Definition extents.hh:87
│ │ │ +
friend struct layout_stride
Definition extents.hh:233
│ │ │ +
friend struct layout_left
Definition extents.hh:231
│ │ │ +
friend struct layout_right
Definition extents.hh:232
│ │ │ +
friend constexpr bool operator==(const extents &a, const extents< OtherIndexType, otherExts... > &b) noexcept
Compare two extents by their rank and all individual extents.
Definition extents.hh:174
│ │ │ +
std::make_unsigned_t< index_type > size_type
Definition extents.hh:80
│ │ │ +
static constexpr std::size_t static_extent(rank_type r) noexcept
Return the static extent of dimension r or Std::dynamic_extent
Definition extents.hh:93
│ │ │ +
friend class extents
Definition extents.hh:230
│ │ │ +
constexpr index_type extent(rank_type r) const noexcept
Return the extent of dimension i
Definition extents.hh:100
│ │ │ +
IndexType index_type
Definition extents.hh:79
│ │ │ +
A contiguous sequence of elements with static or dynamic extent.
Definition span.hh:126
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,501 +1,334 @@ │ │ │ │ dune-common 2.10 │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ * _d_u_n_e │ │ │ │ * _c_o_m_m_o_n │ │ │ │ -typetraits.hh │ │ │ │ + * _s_t_d │ │ │ │ +extents.hh │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ LICENSE.md in module root │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ -5#ifndef DUNE_TYPETRAITS_HH │ │ │ │ -6#define DUNE_TYPETRAITS_HH │ │ │ │ +5#ifndef DUNE_COMMON_STD_EXTENTS_HH │ │ │ │ +6#define DUNE_COMMON_STD_EXTENTS_HH │ │ │ │ 7 │ │ │ │ -8#include │ │ │ │ -9#include │ │ │ │ -10#include │ │ │ │ -11#include │ │ │ │ -12 │ │ │ │ -13namespace _D_u_n_e │ │ │ │ -14{ │ │ │ │ +8#include │ │ │ │ +9#include │ │ │ │ +10#include │ │ │ │ +11#include │ │ │ │ +12#if __has_include() │ │ │ │ +13 #include │ │ │ │ +14#endif │ │ │ │ 15 │ │ │ │ -16 namespace Impl │ │ │ │ -17 { │ │ │ │ +16#include <_d_u_n_e_/_c_o_m_m_o_n_/_i_n_d_i_c_e_s_._h_h> │ │ │ │ +17#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_s_p_a_n_._h_h> │ │ │ │ +18#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_i_m_p_l_/_f_w_d___l_a_y_o_u_t_s_._h_h> │ │ │ │ 19 │ │ │ │ -23 template │ │ │ │ -24 struct voider │ │ │ │ -25 { │ │ │ │ -26 using type = void; │ │ │ │ -27 }; │ │ │ │ -28 } │ │ │ │ -29 │ │ │ │ -31 │ │ │ │ -39 template │ │ │ │ -_4_0 using _v_o_i_d___t = typename Impl::voider::type; │ │ │ │ -41 │ │ │ │ -_5_5 struct _E_m_p_t_y {}; │ │ │ │ +20namespace _D_u_n_e_:_:_S_t_d { │ │ │ │ +21namespace Impl { │ │ │ │ +22 │ │ │ │ +23template │ │ │ │ +24struct DynamicExtentsArray │ │ │ │ +25{ │ │ │ │ +26 using type = std::array; │ │ │ │ +27}; │ │ │ │ +28 │ │ │ │ +29template │ │ │ │ +30struct DynamicExtentsArray │ │ │ │ +31{ │ │ │ │ +32 // empty type with minimal array-like interface │ │ │ │ +33 struct type { │ │ │ │ +34 IndexType operator[](std::size_t /*i*/) const { return 0; } │ │ │ │ +35 }; │ │ │ │ +36}; │ │ │ │ +37 │ │ │ │ +38} // end namespace Impl │ │ │ │ +39 │ │ │ │ +40 │ │ │ │ +52template │ │ │ │ +_5_3class _e_x_t_e_n_t_s │ │ │ │ +54{ │ │ │ │ +55 static_assert(std::is_integral_v); │ │ │ │ 56 │ │ │ │ -63 template │ │ │ │ -_6_4 struct _I_s_I_n_t_e_r_o_p_e_r_a_b_l_e │ │ │ │ -65 { │ │ │ │ -_7_0 constexpr static bool _v_a_l_u_e = std::is_convertible::value || std:: │ │ │ │ -is_convertible::value; │ │ │ │ -71 }; │ │ │ │ +57private: │ │ │ │ +58 static constexpr std::size_t rank_ = sizeof...(exts); │ │ │ │ +59 static constexpr std::size_t rank_dynamic_ = ((exts == _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t) │ │ │ │ ++ ... + 0); │ │ │ │ +60 │ │ │ │ +61 // this type is used internally to extract the static extents by index │ │ │ │ +62 using array_type = std::array; │ │ │ │ +63 │ │ │ │ +64 // store at position i how many extents in {exts[0],...,exts[i]} are │ │ │ │ +dynamic_extent │ │ │ │ +65 static constexpr std::array make_dynamic_index() │ │ │ │ +66 { │ │ │ │ +67 std::array di{{}}; │ │ │ │ +68 for (std::size_t i = 0; i < rank_; ++i) │ │ │ │ +69 di[i+1] = di[i] + (array_type{exts...}[i] == _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t); │ │ │ │ +70 return di; │ │ │ │ +71 } │ │ │ │ 72 │ │ │ │ -78 template │ │ │ │ -_7_9 struct _E_n_a_b_l_e_I_f_I_n_t_e_r_O_p_e_r_a_b_l_e │ │ │ │ -80 : public std::enable_if::value, Type> │ │ │ │ -81 {}; │ │ │ │ -82 │ │ │ │ -100 │ │ │ │ -116 │ │ │ │ -123 template │ │ │ │ -_1_2_4 struct _A_l_w_a_y_s_F_a_l_s_e : public std::false_type {}; │ │ │ │ -125 │ │ │ │ -133 template │ │ │ │ -_1_3_4 struct _A_l_w_a_y_s_T_r_u_e : public std::true_type {}; │ │ │ │ -135 │ │ │ │ -161 template │ │ │ │ -_1_6_2 struct _I_s_C_a_l_l_a_b_l_e; │ │ │ │ -163 │ │ │ │ -168 template │ │ │ │ -_1_6_9 struct _I_s_C_a_l_l_a_b_l_e │ │ │ │ -170 : public std::bool_constant< │ │ │ │ -171 std::is_invocable_r_v │ │ │ │ -172 && !std::is_member_pointer_v> │ │ │ │ -173 > {}; │ │ │ │ -174 │ │ │ │ -177 │ │ │ │ -192 template │ │ │ │ -_1_9_3 struct _I_s_N_u_m_b_e_r │ │ │ │ -194 : public std::integral_constant::value> { │ │ │ │ -195 }; │ │ │ │ -196 │ │ │ │ -197#ifndef DOXYGEN │ │ │ │ -198 │ │ │ │ -199 template │ │ │ │ -200 struct _I_s_N_u_m_b_e_r<_s_t_d::complex> │ │ │ │ -201 : public std::integral_constant::value> { │ │ │ │ -202 }; │ │ │ │ -203 │ │ │ │ -204#endif // DOXYGEN │ │ │ │ +73 // An index mapping computed by `make_dynamic_index()` to get the position │ │ │ │ +of a dynamic │ │ │ │ +74 // extent in {exts...} within the array dynamic_extents. │ │ │ │ +75 static constexpr std::array dynamic_index_ │ │ │ │ +{make_dynamic_index()}; │ │ │ │ +76 │ │ │ │ +77public: │ │ │ │ +_7_8 using _r_a_n_k___t_y_p_e = std::size_t; │ │ │ │ +_7_9 using _i_n_d_e_x___t_y_p_e = IndexType; │ │ │ │ +_8_0 using _s_i_z_e___t_y_p_e = std::make_unsigned_t; │ │ │ │ +81 │ │ │ │ +85 │ │ │ │ +_8_7 static constexpr _r_a_n_k___t_y_p_e _r_a_n_k () noexcept { return rank_; } │ │ │ │ +88 │ │ │ │ +_9_0 static constexpr _r_a_n_k___t_y_p_e _r_a_n_k___d_y_n_a_m_i_c () noexcept { return rank_dynamic_; │ │ │ │ +} │ │ │ │ +91 │ │ │ │ +_9_3 static constexpr std::size_t _s_t_a_t_i_c___e_x_t_e_n_t (_r_a_n_k___t_y_p_e r) noexcept │ │ │ │ +94 { │ │ │ │ +95 assert(_r_a_n_k() > 0 && r < _r_a_n_k()); │ │ │ │ +96 return array_type{exts...}[r]; │ │ │ │ +97 } │ │ │ │ +98 │ │ │ │ +_1_0_0 constexpr _i_n_d_e_x___t_y_p_e _e_x_t_e_n_t (_r_a_n_k___t_y_p_e r) const noexcept │ │ │ │ +101 { │ │ │ │ +102 assert(_r_a_n_k() > 0 && r < _r_a_n_k()); │ │ │ │ +103 if (std::size_t e = _s_t_a_t_i_c___e_x_t_e_n_t(r); e != _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t) │ │ │ │ +104 return _i_n_d_e_x___t_y_p_e(e); │ │ │ │ +105 else │ │ │ │ +106 return dynamic_extents_[dynamic_index_[r]]; │ │ │ │ +107 } │ │ │ │ +108 │ │ │ │ +110 │ │ │ │ +111public: │ │ │ │ +114 │ │ │ │ +_1_1_6 constexpr _e_x_t_e_n_t_s () noexcept = default; │ │ │ │ +117 │ │ │ │ +120 template ), │ │ │ │ +int> = 0, │ │ │ │ +122 _s_t_d::enable_if_t<(sizeof...(IndexTypes) == _r_a_n_k() || sizeof...(IndexTypes) │ │ │ │ +== _r_a_n_k___d_y_n_a_m_i_c()), int> = 0, │ │ │ │ +123 _s_t_d::enable_if_t<(... && _s_t_d::is_nothrow_constructible_v<_i_n_d_e_x___t_y_p_e, │ │ │ │ +IndexTypes>), int> = 0> │ │ │ │ +_1_2_4 constexpr explicit _e_x_t_e_n_t_s (IndexTypes... e) noexcept │ │ │ │ +125 { │ │ │ │ +126 init_dynamic_extents(std::array<_i_n_d_e_x___t_y_p_e,sizeof...(e)> │ │ │ │ +{_i_n_d_e_x___t_y_p_e(e)...}); │ │ │ │ +127 } │ │ │ │ +128 │ │ │ │ +131 template , int> = 0, │ │ │ │ +133 std::enable_if_t<(N == _r_a_n_k() || N == _r_a_n_k___d_y_n_a_m_i_c()), int> = 0> │ │ │ │ +134 #if __cpp_conditional_explicit >= 201806L │ │ │ │ +135 explicit(N != _r_a_n_k___d_y_n_a_m_i_c()) │ │ │ │ +136 #endif │ │ │ │ +_1_3_7 constexpr _e_x_t_e_n_t_s (const std::array& e) noexcept │ │ │ │ +138 { │ │ │ │ +139 init_dynamic_extents(e); │ │ │ │ +140 } │ │ │ │ +141 │ │ │ │ +144 template , int> = 0, │ │ │ │ +146 std::enable_if_t<(N == _r_a_n_k() || N == _r_a_n_k___d_y_n_a_m_i_c()), int> = 0, │ │ │ │ +147 std::enable_if_t, │ │ │ │ +int> = 0> │ │ │ │ +148 #if __cpp_conditional_explicit >= 201806L │ │ │ │ +149 explicit(N != _r_a_n_k___d_y_n_a_m_i_c()) │ │ │ │ +150 #endif │ │ │ │ +_1_5_1 constexpr _e_x_t_e_n_t_s (_S_t_d_:_:_s_p_a_n_<_I_,_N_> e) noexcept │ │ │ │ +152 { │ │ │ │ +153 init_dynamic_extents(e); │ │ │ │ +154 } │ │ │ │ +155 │ │ │ │ +156 template = 0, │ │ │ │ +158 std::enable_if_t<((e == _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t || exts == _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t │ │ │ │ +|| e == exts) &&...), int> = 0> │ │ │ │ +159 #if __cpp_conditional_explicit >= 201806L │ │ │ │ +160 explicit( │ │ │ │ +161 (( (exts != _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t) && (e == _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t)) || ... ) || │ │ │ │ +162 (std::numeric_limits::max() < std::numeric_limits::max())) │ │ │ │ +163 #endif │ │ │ │ +_1_6_4 constexpr _e_x_t_e_n_t_s (const _e_x_t_e_n_t_s_<_I_,_e_._._._>& other) noexcept │ │ │ │ +165 { │ │ │ │ +166 init_dynamic_extents(as_array(other)); │ │ │ │ +167 } │ │ │ │ +168 │ │ │ │ +170 │ │ │ │ +171 │ │ │ │ +173 template │ │ │ │ +_1_7_4 friend constexpr bool _o_p_e_r_a_t_o_r_=_=_ (const _e_x_t_e_n_t_s& a, const │ │ │ │ +_e_x_t_e_n_t_s_<_O_t_h_e_r_I_n_d_e_x_T_y_p_e_,_ _o_t_h_e_r_E_x_t_s_._._._>& b) noexcept │ │ │ │ +175 { │ │ │ │ +176 if (a.rank() != b.rank()) │ │ │ │ +177 return false; │ │ │ │ +178 using I = std::common_type_t; │ │ │ │ +179 for (_r_a_n_k___t_y_p_e i = 0; i < _r_a_n_k(); ++i) │ │ │ │ +180 if (I(a.extent(i)) != I(b.extent(i))) │ │ │ │ +181 return false; │ │ │ │ +182 return true; │ │ │ │ +183 } │ │ │ │ +184 │ │ │ │ +185private: │ │ │ │ +186#ifndef DOXYGEN │ │ │ │ +187 // The product of all extents │ │ │ │ +188 constexpr _s_i_z_e___t_y_p_e product () const noexcept │ │ │ │ +189 { │ │ │ │ +190 _s_i_z_e___t_y_p_e prod = 1; │ │ │ │ +191 for (_r_a_n_k___t_y_p_e i = 0; i < _r_a_n_k(); ++i) │ │ │ │ +192 prod *= _e_x_t_e_n_t(i); │ │ │ │ +193 return prod; │ │ │ │ +194 } │ │ │ │ +195 │ │ │ │ +196 // A representation of all extents as an array │ │ │ │ +197 template │ │ │ │ +198 static constexpr std::array<_i_n_d_e_x___t_y_p_e,sizeof...(otherExts)> │ │ │ │ +199 as_array (const _S_t_d_:_:_e_x_t_e_n_t_s_<_O_t_h_e_r_I_n_d_e_x_T_y_p_e_,_o_t_h_e_r_E_x_t_s_._._._>& e) noexcept │ │ │ │ +200 { │ │ │ │ +201 return _u_n_p_a_c_k_I_n_t_e_g_e_r_S_e_q_u_e_n_c_e([&](auto... ii) { │ │ │ │ +202 return std::array<_i_n_d_e_x___t_y_p_e,sizeof...(otherExts)>{_i_n_d_e_x___t_y_p_e(e._e_x_t_e_n_t │ │ │ │ +(ii))...}; }, │ │ │ │ +203 std::make_index_sequence{}); │ │ │ │ +204 } │ │ │ │ 205 │ │ │ │ -207 │ │ │ │ -210 template │ │ │ │ -_2_1_1 struct _H_a_s_N_a_N │ │ │ │ -212 : public std::integral_constant::value> { │ │ │ │ -213 }; │ │ │ │ -214 │ │ │ │ -215#ifndef DOXYGEN │ │ │ │ -216 │ │ │ │ -217 template │ │ │ │ -218 struct _H_a_s_N_a_N<_s_t_d::complex> │ │ │ │ -219 : public std::integral_constant::value> { │ │ │ │ -220 }; │ │ │ │ -221 │ │ │ │ -222#endif // DOXYGEN │ │ │ │ -223 │ │ │ │ -224#ifndef DOXYGEN │ │ │ │ +206 // Copy only the dynamic extents from the container `e` into the │ │ │ │ +`dynamic_extents_` storage │ │ │ │ +207 template │ │ │ │ +208 constexpr void init_dynamic_extents (const Container& e) noexcept │ │ │ │ +209 { │ │ │ │ +210 if constexpr(_r_a_n_k___d_y_n_a_m_i_c() > 0) { │ │ │ │ +211 if constexpr(N == _r_a_n_k___d_y_n_a_m_i_c()) { │ │ │ │ +212 assert(e.size() == _r_a_n_k___d_y_n_a_m_i_c()); │ │ │ │ +213 for (_r_a_n_k___t_y_p_e i = 0; i < _r_a_n_k___d_y_n_a_m_i_c(); ++i) │ │ │ │ +214 dynamic_extents_[i] = e[i]; │ │ │ │ +215 } else { │ │ │ │ +216 assert(e.size() == _r_a_n_k()); │ │ │ │ +217 for (_r_a_n_k___t_y_p_e i = 0, j = 0; i < _r_a_n_k(); ++i) { │ │ │ │ +218 if (_s_t_a_t_i_c___e_x_t_e_n_t(i) == _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t) │ │ │ │ +219 dynamic_extents_[j++] = e[i]; │ │ │ │ +220 } │ │ │ │ +221 } │ │ │ │ +222 } │ │ │ │ +223 } │ │ │ │ +224#endif // DOXYGEN │ │ │ │ 225 │ │ │ │ -226 namespace Impl { │ │ │ │ -227 │ │ │ │ -228 template │ │ │ │ -229 struct IsIndexable │ │ │ │ -230 : public std::false_type │ │ │ │ -231 {}; │ │ │ │ -232 │ │ │ │ -233 template │ │ │ │ -234 struct IsIndexable() │ │ │ │ -[std::declval()]) > 0),int>::type> │ │ │ │ -235 : public std::true_type │ │ │ │ -236 {}; │ │ │ │ -237 │ │ │ │ -238 } │ │ │ │ -239 │ │ │ │ -240#endif // DOXYGEN │ │ │ │ +226private: │ │ │ │ +227 using dynamic_extents_type = typename Impl:: │ │ │ │ +DynamicExtentsArray<_i_n_d_e_x___t_y_p_e,_r_a_n_k___d_y_n_a_m_i_c()>::type; │ │ │ │ +228 [[no_unique_address]] dynamic_extents_type dynamic_extents_; │ │ │ │ +229 │ │ │ │ +_2_3_0 template friend class _e_x_t_e_n_t_s; │ │ │ │ +_2_3_1 friend struct _l_a_y_o_u_t___l_e_f_t; │ │ │ │ +_2_3_2 friend struct _l_a_y_o_u_t___r_i_g_h_t; │ │ │ │ +_2_3_3 friend struct _l_a_y_o_u_t___s_t_r_i_d_e; │ │ │ │ +234}; │ │ │ │ +235 │ │ │ │ +236 │ │ │ │ +237namespace Impl { │ │ │ │ +238 │ │ │ │ +239template │ │ │ │ +240struct DExtentsImpl; │ │ │ │ 241 │ │ │ │ -243 │ │ │ │ -247 template │ │ │ │ -_2_4_8 struct _I_s_I_n_d_e_x_a_b_l_e │ │ │ │ -249 : public Impl::IsIndexable │ │ │ │ -250 {}; │ │ │ │ +242template │ │ │ │ +243struct DExtentsImpl> │ │ │ │ +244{ │ │ │ │ +245 template │ │ │ │ +246 using dynamic = std::integral_constant; │ │ │ │ +247 using type = _S_t_d_:_:_e_x_t_e_n_t_s_<_I_n_d_e_x_T_y_p_e_,_ _d_y_n_a_m_i_c_<_I_>_:_:_v_a_l_u_e...>; │ │ │ │ +248}; │ │ │ │ +249 │ │ │ │ +250} // end namespace Impl │ │ │ │ 251 │ │ │ │ -252#ifndef DOXYGEN │ │ │ │ -253 │ │ │ │ -254 namespace Impl { │ │ │ │ -255 // This function does nothing. │ │ │ │ -256 // By passing expressions to this function one can avoid │ │ │ │ -257 // "value computed is not used" warnings that may show up │ │ │ │ -258 // in a comma expression. │ │ │ │ -259 template │ │ │ │ -260 void ignore(T&&... /*t*/) │ │ │ │ -261 {} │ │ │ │ -262 } │ │ │ │ -263 │ │ │ │ -264#endif // DOXYGEN │ │ │ │ -265 │ │ │ │ -269 // default version, gets picked if SFINAE fails │ │ │ │ -270 template │ │ │ │ -_2_7_1 struct _I_s_I_t_e_r_a_b_l_e │ │ │ │ -272 : public std::false_type │ │ │ │ -273 {}; │ │ │ │ -274 │ │ │ │ -275#ifndef DOXYGEN │ │ │ │ -276 // version for types with begin() and end() │ │ │ │ -277 template │ │ │ │ -278 struct _I_s_I_t_e_r_a_b_l_e().begin(), │ │ │ │ -280 std::declval().end(), │ │ │ │ -281 std::declval().begin() != std::declval().end(), │ │ │ │ -282 decltype(std::declval().begin()){std::declval().end()}, │ │ │ │ -283 ++(std::declval │ │ │ │ -().begin())>>()), │ │ │ │ -284 *(std::declval().begin()) │ │ │ │ -285 ))> │ │ │ │ -286 : public std::true_type │ │ │ │ -287 {}; │ │ │ │ -288#endif │ │ │ │ -289 │ │ │ │ -290#ifndef DOXYGEN │ │ │ │ -291 // this is just a forward declaration │ │ │ │ -292 template struct FieldTraits; │ │ │ │ -293#endif │ │ │ │ -294 │ │ │ │ -296 template │ │ │ │ -_2_9_7 using _f_i_e_l_d___t = typename _F_i_e_l_d_T_r_a_i_t_s_<_T_y_p_e_>_:_:_f_i_e_l_d___t_y_p_e; │ │ │ │ -298 │ │ │ │ -300 template │ │ │ │ -_3_0_1 using _r_e_a_l___t = typename _F_i_e_l_d_T_r_a_i_t_s_<_T_y_p_e_>_:_:_r_e_a_l___t_y_p_e; │ │ │ │ -302 │ │ │ │ -303 │ │ │ │ -304#ifndef DOXYGEN │ │ │ │ -305 │ │ │ │ -306 // Implementation of IsTuple │ │ │ │ -307 namespace Impl { │ │ │ │ -308 │ │ │ │ -309 template │ │ │ │ -310 struct _I_s_T_u_p_l_e : public std::false_type │ │ │ │ -311 {}; │ │ │ │ -312 │ │ │ │ -313 template │ │ │ │ -314 struct _I_s_T_u_p_l_e<_s_t_d::tuple> : public std::true_type │ │ │ │ -315 {}; │ │ │ │ -316 │ │ │ │ -317 } // namespace Impl │ │ │ │ -318 │ │ │ │ -319#endif // DOXYGEN │ │ │ │ -320 │ │ │ │ -326 template │ │ │ │ -_3_2_7 struct _I_s_T_u_p_l_e : │ │ │ │ -328 public Impl::IsTuple │ │ │ │ -329 {}; │ │ │ │ -330 │ │ │ │ -331 │ │ │ │ -332#ifndef DOXYGEN │ │ │ │ -333 │ │ │ │ -334 // Implementation of IsTupleOrDerived │ │ │ │ -335 namespace Impl { │ │ │ │ -336 │ │ │ │ -337 template │ │ │ │ -338 std::true_type isTupleOrDerived(const std::tuple*, Dummy) │ │ │ │ -339 { return {}; } │ │ │ │ -340 │ │ │ │ -341 template │ │ │ │ -342 std::false_type isTupleOrDerived(const void*, Dummy) │ │ │ │ -343 { return {}; } │ │ │ │ -344 │ │ │ │ -345 } // namespace Impl │ │ │ │ -346 │ │ │ │ -347#endif // DOXYGEN │ │ │ │ -348 │ │ │ │ -354 template │ │ │ │ -_3_5_5 struct _I_s_T_u_p_l_e_O_r_D_e_r_i_v_e_d : │ │ │ │ -356 public decltype(Impl::isTupleOrDerived(std::declval(), true)) │ │ │ │ -357 {}; │ │ │ │ -358 │ │ │ │ -359 │ │ │ │ -360#ifndef DOXYGEN │ │ │ │ -361 │ │ │ │ -362 // Implementation of is IsIntegralConstant │ │ │ │ -363 namespace Impl { │ │ │ │ -364 │ │ │ │ -365 template │ │ │ │ -366 struct _I_s_I_n_t_e_g_r_a_l_C_o_n_s_t_a_n_t : public std::false_type │ │ │ │ -367 {}; │ │ │ │ -368 │ │ │ │ -369 template │ │ │ │ -370 struct IsIntegralConstant<_s_t_d::integral_constant> : public std:: │ │ │ │ -true_type │ │ │ │ -371 {}; │ │ │ │ -372 │ │ │ │ -373 } // namespace Impl │ │ │ │ -374 │ │ │ │ -375#endif // DOXYGEN │ │ │ │ -376 │ │ │ │ -382 template │ │ │ │ -_3_8_3 struct _I_s_I_n_t_e_g_r_a_l_C_o_n_s_t_a_n_t : public Impl::IsIntegralConstant> │ │ │ │ -384 {}; │ │ │ │ -385 │ │ │ │ -386 │ │ │ │ -387#ifndef DOXYGEN │ │ │ │ -388 │ │ │ │ -389 namespace Impl { │ │ │ │ -390 │ │ │ │ -391 struct _I_s_C_o_m_p_i_l_e_T_i_m_e_C_o_n_s_t_a_n_t │ │ │ │ -392 { │ │ │ │ -393 template │ │ │ │ -394 static std::true_type check(std::integral_constant); │ │ │ │ -395 static std::false_type check(...); │ │ │ │ -396 }; │ │ │ │ -397 │ │ │ │ -398 } // namespace Impl │ │ │ │ -399 │ │ │ │ -400#endif // DOXYGEN │ │ │ │ -401 │ │ │ │ -408 template │ │ │ │ -_4_0_9 struct _I_s_C_o_m_p_i_l_e_T_i_m_e_C_o_n_s_t_a_n_t │ │ │ │ -410 : public decltype(Impl::IsCompileTimeConstant::check(std::declval())) │ │ │ │ -411 {}; │ │ │ │ -412 │ │ │ │ -413 │ │ │ │ -414 │ │ │ │ -430 template │ │ │ │ -_4_3_1 struct │ │ │ │ -432 [[deprecated("This class is deprecated and will be removed after Dune 2.10. │ │ │ │ -Use sizeof...(T) instead.")]] │ │ │ │ -433 _S_i_z_e_O_f │ │ │ │ -434 : public std::integral_constant │ │ │ │ -435 {}; │ │ │ │ -436 │ │ │ │ -437 │ │ │ │ -438#ifndef DOXYGEN │ │ │ │ -439 │ │ │ │ -440 namespace Impl { │ │ │ │ -441 │ │ │ │ -442 template │ │ │ │ -443 struct IntegerSequenceHelper; │ │ │ │ -444 │ │ │ │ -445 // Helper struct to compute the i-th entry of a std::integer_sequence │ │ │ │ -446 // │ │ │ │ -447 // This could also be implemented using std::get(std::make_tuple │ │ │ │ -(t...)). │ │ │ │ -448 // However, the gcc-6 implementation of std::make_tuple increases the │ │ │ │ -instantiation │ │ │ │ -449 // depth by 15 levels for each argument, such that the maximal │ │ │ │ -instantiation depth │ │ │ │ -450 // is easily hit, especially with clang where it is set to 256. │ │ │ │ -451 template │ │ │ │ -452 struct IntegerSequenceHelper │ │ │ │ -453 { │ │ │ │ -454 │ │ │ │ -455 // get first entry │ │ │ │ -456 static constexpr auto _g_e_t(std::integral_constant) │ │ │ │ -457 { │ │ │ │ -458 return std::integral_constant(); │ │ │ │ -459 } │ │ │ │ -460 │ │ │ │ -461 // call get with first entry cut off and decremented index │ │ │ │ -462 template 0) and (index < sizeof...(tail)+1), int> = 0> │ │ │ │ -464 static constexpr auto get(std::integral_constant) │ │ │ │ -465 { │ │ │ │ -466 return IntegerSequenceHelper::get(std::integral_constant()); │ │ │ │ -467 } │ │ │ │ -468 │ │ │ │ -469 // use static assertion if index exceeds size │ │ │ │ -470 template= sizeof...(tail)+1), int> = 0> │ │ │ │ -472 static constexpr auto _g_e_t(std::integral_constant) │ │ │ │ -473 { │ │ │ │ -474 static_assert(index < sizeof...(tail)+1, "index used in │ │ │ │ -IntegerSequenceEntry exceed size"); │ │ │ │ -475 } │ │ │ │ -476 }; │ │ │ │ -477 │ │ │ │ -478 } // end namespace Impl │ │ │ │ -479 │ │ │ │ -480#endif // DOXYGEN │ │ │ │ -481 │ │ │ │ -482 │ │ │ │ -491 template │ │ │ │ -_4_9_2 constexpr auto _i_n_t_e_g_e_r_S_e_q_u_e_n_c_e_E_n_t_r_y(std::integer_sequence /*seq*/, │ │ │ │ -std::integral_constant i) │ │ │ │ -493 { │ │ │ │ -494 static_assert(index < sizeof...(t), "index used in IntegerSequenceEntry │ │ │ │ -exceed size"); │ │ │ │ -495 return Impl::IntegerSequenceHelper::get(i); │ │ │ │ -496 } │ │ │ │ -497 │ │ │ │ -498 │ │ │ │ -505 template │ │ │ │ -_5_0_6 struct _I_n_t_e_g_e_r_S_e_q_u_e_n_c_e_E_n_t_r_y; │ │ │ │ -507 │ │ │ │ -508#ifndef DOXYGEN │ │ │ │ -509 │ │ │ │ -510 template │ │ │ │ -511 struct _I_n_t_e_g_e_r_S_e_q_u_e_n_c_e_E_n_t_r_y<_s_t_d::integer_sequence, i> │ │ │ │ -512 : public decltype(Impl::IntegerSequenceHelper::get(std:: │ │ │ │ -integral_constant())) │ │ │ │ -513 {}; │ │ │ │ -514 │ │ │ │ -515#endif // DOXYGEN │ │ │ │ -516 │ │ │ │ -530 template │ │ │ │ -_5_3_1 struct _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e { using _t_y_p_e = T; }; │ │ │ │ -532 │ │ │ │ -534 template │ │ │ │ -_5_3_5 struct _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e : _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e_<_T_> {}; │ │ │ │ -536 │ │ │ │ -538 template │ │ │ │ -_5_3_9 struct _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e : _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e_<_T_> {}; │ │ │ │ -540 │ │ │ │ -542 template │ │ │ │ -_5_4_3 struct _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e : _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e {}; │ │ │ │ -544 │ │ │ │ -546 template │ │ │ │ -_5_4_7 struct _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e : _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e {}; │ │ │ │ -548 │ │ │ │ -550 template<> │ │ │ │ -_5_5_1 struct _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e<_s_t_d::vector::reference> │ │ │ │ -552 { │ │ │ │ -_5_5_3 using _t_y_p_e = bool; │ │ │ │ -554 }; │ │ │ │ -555 │ │ │ │ -557 template │ │ │ │ -_5_5_8 struct _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e : _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e {}; │ │ │ │ -559 │ │ │ │ -587 template │ │ │ │ -_5_8_8 using _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e = typename _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e_<_T_>_:_:_t_y_p_e; │ │ │ │ -589 │ │ │ │ -671 template │ │ │ │ -_6_7_2 constexpr _A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_<_T_> _a_u_t_o_C_o_p_y(T &&v) │ │ │ │ -673 { │ │ │ │ -674 return v; │ │ │ │ -675 } │ │ │ │ -676 │ │ │ │ -678} │ │ │ │ -679#endif │ │ │ │ -_D_u_n_e_:_:_i_n_t_e_g_e_r_S_e_q_u_e_n_c_e_E_n_t_r_y │ │ │ │ -constexpr auto integerSequenceEntry(std::integer_sequence< T, t... >, std:: │ │ │ │ -integral_constant< std::size_t, index > i) │ │ │ │ -Get entry of std::integer_sequence. │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:492 │ │ │ │ -_D_u_n_e_:_:_r_e_a_l___t │ │ │ │ -typename FieldTraits< Type >::real_type real_t │ │ │ │ -Convenient access to FieldTraits::real_type. │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:301 │ │ │ │ -_D_u_n_e_:_:_a_u_t_o_C_o_p_y │ │ │ │ -constexpr AutonomousValue< T > autoCopy(T &&v) │ │ │ │ -Autonomous copy of an expression's value for use in auto type deduction. │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:672 │ │ │ │ -_D_u_n_e_:_:_A_u_t_o_n_o_m_o_u_s_V_a_l_u_e │ │ │ │ -typename AutonomousValueType< T >::type AutonomousValue │ │ │ │ -Type free of internal references that T can be converted to. │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:588 │ │ │ │ -_D_u_n_e_:_:_v_o_i_d___t │ │ │ │ -typename Impl::voider< Types... >::type void_t │ │ │ │ -Is void for all valid input types. The workhorse for C++11 SFINAE-techniques. │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:40 │ │ │ │ -_D_u_n_e_:_:_f_i_e_l_d___t │ │ │ │ -typename FieldTraits< Type >::field_type field_t │ │ │ │ -Convenient access to FieldTraits::field_type. │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:297 │ │ │ │ +252 │ │ │ │ +258template │ │ │ │ +_2_5_9using _d_e_x_t_e_n_t_s = typename Impl::DExtentsImpl>::type; │ │ │ │ +260 │ │ │ │ +261} // end namespace Dune::Std │ │ │ │ +262 │ │ │ │ +263#endif // DUNE_COMMON_STD_EXTENTS_HH │ │ │ │ +_s_p_a_n_._h_h │ │ │ │ +_f_w_d___l_a_y_o_u_t_s_._h_h │ │ │ │ +_i_n_d_i_c_e_s_._h_h │ │ │ │ +_D_u_n_e_:_:_u_n_p_a_c_k_I_n_t_e_g_e_r_S_e_q_u_e_n_c_e │ │ │ │ +decltype(auto) constexpr unpackIntegerSequence(F &&f, std::integer_sequence< I, │ │ │ │ +i... > sequence) │ │ │ │ +Unpack an std::integer_sequence to std::integral_constant... │ │ │ │ +DDeeffiinniittiioonn indices.hh:124 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_d_e_x_t_e_n_t_s │ │ │ │ +typename Impl::DExtentsImpl< IndexType, std::make_integer_sequence< std:: │ │ │ │ +size_t, R > >::type dextents │ │ │ │ +Alias of extents of given rank R and purely dynamic extents. See │ │ │ │ +[mdspan.extents.dextents]. │ │ │ │ +DDeeffiinniittiioonn extents.hh:259 │ │ │ │ _s_t_d │ │ │ │ STL namespace. │ │ │ │ -_D_u_n_e │ │ │ │ -Dune namespace. │ │ │ │ -DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ -_D_u_n_e_:_:_t_a_i_l │ │ │ │ -constexpr std::integer_sequence< T, II... > tail(std::integer_sequence< T, I0, │ │ │ │ -II... >) │ │ │ │ -For a sequence [head,tail...) return the tail sequence. │ │ │ │ -DDeeffiinniittiioonn integersequence.hh:58 │ │ │ │ -_D_u_n_e_:_:_h_e_a_d │ │ │ │ -constexpr std::integral_constant< T, I0 > head(std::integer_sequence< T, I0, │ │ │ │ -II... >) │ │ │ │ -For a sequence [head,tail...) return the single head element. │ │ │ │ -DDeeffiinniittiioonn integersequence.hh:53 │ │ │ │ -_D_u_n_e_:_:_g_e_t │ │ │ │ -constexpr auto get(std::integer_sequence< T, II... >, std::integral_constant< │ │ │ │ -std::size_t, pos >={}) │ │ │ │ -Return the entry at position pos of the given sequence. │ │ │ │ -DDeeffiinniittiioonn integersequence.hh:22 │ │ │ │ -_D_u_n_e_:_:_I_s_N_u_m_b_e_r │ │ │ │ -Whether this type acts as a scalar in the context of (hierarchically blocked) │ │ │ │ -containers. │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:194 │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_:_:_f_i_e_l_d___t_y_p_e │ │ │ │ -T field_type │ │ │ │ -export the type representing the field │ │ │ │ -DDeeffiinniittiioonn ftraits.hh:28 │ │ │ │ -_D_u_n_e_:_:_F_i_e_l_d_T_r_a_i_t_s_:_:_r_e_a_l___t_y_p_e │ │ │ │ -T real_type │ │ │ │ -export the type representing the real type of the field │ │ │ │ -DDeeffiinniittiioonn ftraits.hh:30 │ │ │ │ -_D_u_n_e_:_:_E_m_p_t_y │ │ │ │ -Just an empty class. │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:55 │ │ │ │ -_D_u_n_e_:_:_I_s_I_n_t_e_r_o_p_e_r_a_b_l_e │ │ │ │ -Checks whether two types are interoperable. │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:65 │ │ │ │ -_D_u_n_e_:_:_I_s_I_n_t_e_r_o_p_e_r_a_b_l_e_:_:_v_a_l_u_e │ │ │ │ -static constexpr bool value │ │ │ │ -True if either a conversion from T1 to T2 or vice versa exists. │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:70 │ │ │ │ -_D_u_n_e_:_:_E_n_a_b_l_e_I_f_I_n_t_e_r_O_p_e_r_a_b_l_e │ │ │ │ -Enable typedef if two types are interoperable. │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:81 │ │ │ │ -_D_u_n_e_:_:_A_l_w_a_y_s_F_a_l_s_e │ │ │ │ -template which always yields a false value │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:124 │ │ │ │ -_D_u_n_e_:_:_A_l_w_a_y_s_T_r_u_e │ │ │ │ -template which always yields a true value │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:134 │ │ │ │ -_D_u_n_e_:_:_I_s_C_a_l_l_a_b_l_e │ │ │ │ -Check if a type is callable with ()-operator and given arguments. │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:162 │ │ │ │ -_D_u_n_e_:_:_H_a_s_N_a_N │ │ │ │ -Whether this type has a value of NaN. │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:212 │ │ │ │ -_D_u_n_e_:_:_I_s_I_n_d_e_x_a_b_l_e │ │ │ │ -Type trait to determine whether an instance of T has an operator[](I), i.e. │ │ │ │ -whether it can be indexed... │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:250 │ │ │ │ -_D_u_n_e_:_:_I_s_I_t_e_r_a_b_l_e │ │ │ │ -typetrait to check that a class has begin() and end() members │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:273 │ │ │ │ -_D_u_n_e_:_:_I_s_T_u_p_l_e │ │ │ │ -Check if T is a std::tuple<...> │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:329 │ │ │ │ -_D_u_n_e_:_:_I_s_T_u_p_l_e_O_r_D_e_r_i_v_e_d │ │ │ │ -Check if T derived from a std::tuple<...> │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:357 │ │ │ │ -_D_u_n_e_:_:_I_s_I_n_t_e_g_r_a_l_C_o_n_s_t_a_n_t │ │ │ │ -Check if T is an std::integral_constant │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:384 │ │ │ │ -_D_u_n_e_:_:_I_s_C_o_m_p_i_l_e_T_i_m_e_C_o_n_s_t_a_n_t │ │ │ │ -Check if T is an integral constant or any type derived from std:: │ │ │ │ -integral_constant. │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:411 │ │ │ │ -_D_u_n_e_:_:_S_i_z_e_O_f │ │ │ │ -Compute size of variadic type list. │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:435 │ │ │ │ -_D_u_n_e_:_:_I_n_t_e_g_e_r_S_e_q_u_e_n_c_e_E_n_t_r_y │ │ │ │ -Get entry of std::integer_sequence. │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:506 │ │ │ │ -_D_u_n_e_:_:_A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e │ │ │ │ -Type free of internal references that T can be converted to. │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:531 │ │ │ │ -_D_u_n_e_:_:_A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e_:_:_t_y_p_e │ │ │ │ -T type │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:531 │ │ │ │ -_D_u_n_e_:_:_A_u_t_o_n_o_m_o_u_s_V_a_l_u_e_T_y_p_e_<_ _s_t_d_:_:_v_e_c_t_o_r_<_ _b_o_o_l_ _>_:_:_r_e_f_e_r_e_n_c_e_ _>_:_:_t_y_p_e │ │ │ │ -bool type │ │ │ │ -DDeeffiinniittiioonn typetraits.hh:553 │ │ │ │ +_D_u_n_e_:_:_S_t_d │ │ │ │ +Namespace for features backported from new C++ standards. │ │ │ │ +DDeeffiinniittiioonn default_accessor.hh:10 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t │ │ │ │ +constexpr std::size_t dynamic_extent │ │ │ │ +A constant of type std::size_t that is used to differentiate std::span of │ │ │ │ +static and dynamic extent. │ │ │ │ +DDeeffiinniittiioonn span.hh:26 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_e_x_t_e_n_t_s │ │ │ │ +Multidimensional index space with dynamic and static extents. │ │ │ │ +DDeeffiinniittiioonn extents.hh:54 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_e_x_t_e_n_t_s_:_:_r_a_n_k___d_y_n_a_m_i_c │ │ │ │ +static constexpr rank_type rank_dynamic() noexcept │ │ │ │ +The number of dimensions with dynamic extent. │ │ │ │ +DDeeffiinniittiioonn extents.hh:90 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_e_x_t_e_n_t_s_:_:_e_x_t_e_n_t_s │ │ │ │ +constexpr extents(const extents< I, e... > &other) noexcept │ │ │ │ +DDeeffiinniittiioonn extents.hh:164 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_e_x_t_e_n_t_s_:_:_r_a_n_k___t_y_p_e │ │ │ │ +std::size_t rank_type │ │ │ │ +DDeeffiinniittiioonn extents.hh:78 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_e_x_t_e_n_t_s_:_:_e_x_t_e_n_t_s │ │ │ │ +constexpr extents() noexcept=default │ │ │ │ +The default constructor requires that all exts are not Std::dynamic_extent. │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_e_x_t_e_n_t_s_:_:_r_a_n_k │ │ │ │ +static constexpr rank_type rank() noexcept │ │ │ │ +The total number of dimensions. │ │ │ │ +DDeeffiinniittiioonn extents.hh:87 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_e_x_t_e_n_t_s_:_:_l_a_y_o_u_t___s_t_r_i_d_e │ │ │ │ +friend struct layout_stride │ │ │ │ +DDeeffiinniittiioonn extents.hh:233 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_e_x_t_e_n_t_s_:_:_l_a_y_o_u_t___l_e_f_t │ │ │ │ +friend struct layout_left │ │ │ │ +DDeeffiinniittiioonn extents.hh:231 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_e_x_t_e_n_t_s_:_:_l_a_y_o_u_t___r_i_g_h_t │ │ │ │ +friend struct layout_right │ │ │ │ +DDeeffiinniittiioonn extents.hh:232 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_e_x_t_e_n_t_s_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ +friend constexpr bool operator==(const extents &a, const extents< │ │ │ │ +OtherIndexType, otherExts... > &b) noexcept │ │ │ │ +Compare two extents by their rank and all individual extents. │ │ │ │ +DDeeffiinniittiioonn extents.hh:174 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_e_x_t_e_n_t_s_:_:_s_i_z_e___t_y_p_e │ │ │ │ +std::make_unsigned_t< index_type > size_type │ │ │ │ +DDeeffiinniittiioonn extents.hh:80 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_e_x_t_e_n_t_s_:_:_s_t_a_t_i_c___e_x_t_e_n_t │ │ │ │ +static constexpr std::size_t static_extent(rank_type r) noexcept │ │ │ │ +Return the static extent of dimension r or Std::dynamic_extent │ │ │ │ +DDeeffiinniittiioonn extents.hh:93 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_e_x_t_e_n_t_s_:_:_e_x_t_e_n_t_s │ │ │ │ +friend class extents │ │ │ │ +DDeeffiinniittiioonn extents.hh:230 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_e_x_t_e_n_t_s_:_:_e_x_t_e_n_t │ │ │ │ +constexpr index_type extent(rank_type r) const noexcept │ │ │ │ +Return the extent of dimension i │ │ │ │ +DDeeffiinniittiioonn extents.hh:100 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_e_x_t_e_n_t_s_:_:_i_n_d_e_x___t_y_p_e │ │ │ │ +IndexType index_type │ │ │ │ +DDeeffiinniittiioonn extents.hh:79 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n │ │ │ │ +A contiguous sequence of elements with static or dynamic extent. │ │ │ │ +DDeeffiinniittiioonn span.hh:126 │ │ │ │ =============================================================================== │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00026.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: typelist.hh File Reference │ │ │ +dune-common: layout_right.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,92 +65,45 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │
│ │ │ Classes | │ │ │ -Namespaces | │ │ │ -Typedefs | │ │ │ -Functions
│ │ │ -
typelist.hh File Reference
│ │ │ +Namespaces
│ │ │ +
layout_right.hh File Reference
│ │ │ │ │ │
│ │ │ -
#include <type_traits>
│ │ │ -#include <tuple>
│ │ │ -#include <utility>
│ │ │ +
#include <array>
│ │ │ +#include <type_traits>
│ │ │ +#include <dune/common/indices.hh>
│ │ │ +#include <dune/common/std/impl/fwd_layouts.hh>
│ │ │
│ │ │

Go to the source code of this file.

│ │ │ │ │ │ │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ + │ │ │ + │ │ │ │ │ │

│ │ │ Classes

struct  Dune::MetaType< T >
 A type that refers to another type. More...
 
struct  Dune::IsTypeList< T >
 Check if given type is a TypeList. More...
 
struct  Dune::IsTypeList< TypeList< T... > >
 Check if given type is a TypeList. More...
 
struct  Dune::IsEmptyTypeList< T >
 Check if given type is an empty TypeList. More...
 
struct  Dune::TypeListSize< T >
 
struct  Dune::TypeListSize< TypeList< T... > >
 Get size of TypeList. More...
 
struct  Dune::TypeListElement< i, T >
 
struct  Dune::TypeListElement< i, TypeList< T... > >
 Get element of TypeList. More...
class  Dune::Std::layout_right::mapping< Extents >
 A layout mapping where the rightmost extent has stride 1. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ Namespaces

namespace  Dune
 Dune namespace.
 
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ -

│ │ │ -Typedefs

template<class... T>
using Dune::TypeList = std::tuple< MetaType< T >... >
 A simple type list.
 
template<std::size_t i, class T >
using Dune::TypeListEntry_t = typename TypeListElement< i, T >::type
 Shortcut for TypeListElement<i, T>::type;.
 
template<template< class... > class Target, class TL >
using Dune::UnpackTypeList_t = typename Impl::UnpackTypeList< Target, TL >::type
 Unpack Dune::TypeList.
 
template<template< class... > class Target, class... T>
using Dune::UniqueTypes_t = typename Impl::UniqueTypesHelper< Target, TypeList< T... > >::type
 Remove duplicates from a list of types.
 
template<class NonUniqueTypeList >
using Dune::UniqueTypeList_t = typename Impl::UniqueTypesHelper< TypeList, NonUniqueTypeList >::type
 Remove duplicates from a Dune::TypeList.
 
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ + │ │ │ + │ │ │ + │ │ │

│ │ │ -Functions

template<class... T>
constexpr auto Dune::uniqueTypeList (TypeList< T... > list)
 Remove duplicates from a Dune::TypeList.
 
namespace  Dune::Std
 Namespace for features backported from new C++ standards.
 
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,70 +1,27 @@ │ │ │ │ dune-common 2.10 │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ * _d_u_n_e │ │ │ │ * _c_o_m_m_o_n │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _T_y_p_e_d_e_f_s | _F_u_n_c_t_i_o_n_s │ │ │ │ -typelist.hh File Reference │ │ │ │ + * _s_t_d │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ +layout_right.hh File Reference │ │ │ │ +#include │ │ │ │ #include │ │ │ │ -#include │ │ │ │ -#include │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_i_n_d_i_c_e_s_._h_h> │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_i_m_p_l_/_f_w_d___l_a_y_o_u_t_s_._h_h> │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ CCllaasssseess │ │ │ │ -struct   _D_u_n_e_:_:_M_e_t_a_T_y_p_e_<_ _T_ _> │ │ │ │ -  A type that refers to another type. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_I_s_T_y_p_e_L_i_s_t_<_ _T_ _> │ │ │ │ -  Check if given type is a TypeList. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_I_s_T_y_p_e_L_i_s_t_<_ _T_y_p_e_L_i_s_t_<_ _T_._._._ _>_ _> │ │ │ │ -  Check if given type is a TypeList. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_I_s_E_m_p_t_y_T_y_p_e_L_i_s_t_<_ _T_ _> │ │ │ │ -  Check if given type is an empty TypeList. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_T_y_p_e_L_i_s_t_S_i_z_e_<_ _T_ _> │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_T_y_p_e_L_i_s_t_S_i_z_e_<_ _T_y_p_e_L_i_s_t_<_ _T_._._._ _>_ _> │ │ │ │ -  Get size of TypeList. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_T_y_p_e_L_i_s_t_E_l_e_m_e_n_t_<_ _i_,_ _T_ _> │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_T_y_p_e_L_i_s_t_E_l_e_m_e_n_t_<_ _i_,_ _T_y_p_e_L_i_s_t_<_ _T_._._._ _>_ _> │ │ │ │ -  Get element of TypeList. _M_o_r_e_._._. │ │ │ │ +class   _D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___r_i_g_h_t_:_:_m_a_p_p_i_n_g_<_ _E_x_t_e_n_t_s_ _> │ │ │ │ +  A layout mapping where the rightmost extent has stride 1. _M_o_r_e_._._. │ │ │ │   │ │ │ │ NNaammeessppaacceess │ │ │ │ namespace   _D_u_n_e │ │ │ │   _D_u_n_e namespace. │ │ │ │   │ │ │ │ -TTyyppeeddeeffss │ │ │ │ -template │ │ │ │ -using  _D_u_n_e_:_:_T_y_p_e_L_i_s_t = std::tuple< _M_e_t_a_T_y_p_e< T >... > │ │ │ │ -  A simple type list. │ │ │ │ -  │ │ │ │ -template │ │ │ │ -using  _D_u_n_e_:_:_T_y_p_e_L_i_s_t_E_n_t_r_y___t = typename _T_y_p_e_L_i_s_t_E_l_e_m_e_n_t< i, T >::type │ │ │ │ -  Shortcut for TypeListElement::type;. │ │ │ │ -  │ │ │ │ -template class Target, class TL > │ │ │ │ -using  _D_u_n_e_:_:_U_n_p_a_c_k_T_y_p_e_L_i_s_t___t = typename Impl::UnpackTypeList< Target, TL >:: │ │ │ │ - type │ │ │ │ -  Unpack _D_u_n_e_:_:_T_y_p_e_L_i_s_t. │ │ │ │ -  │ │ │ │ -template class Target, class... T> │ │ │ │ -using  _D_u_n_e_:_:_U_n_i_q_u_e_T_y_p_e_s___t = typename Impl::UniqueTypesHelper< Target, │ │ │ │ - _T_y_p_e_L_i_s_t< T... > >::type │ │ │ │ -  Remove duplicates from a list of types. │ │ │ │ -  │ │ │ │ -template │ │ │ │ -using  _D_u_n_e_:_:_U_n_i_q_u_e_T_y_p_e_L_i_s_t___t = typename Impl::UniqueTypesHelper< _T_y_p_e_L_i_s_t, │ │ │ │ - NonUniqueTypeList >::type │ │ │ │ -  Remove duplicates from a _D_u_n_e_:_:_T_y_p_e_L_i_s_t. │ │ │ │ -  │ │ │ │ -FFuunnccttiioonnss │ │ │ │ -template │ │ │ │ -constexpr auto  _D_u_n_e_:_:_u_n_i_q_u_e_T_y_p_e_L_i_s_t (_T_y_p_e_L_i_s_t< T... > list) │ │ │ │ -  Remove duplicates from a _D_u_n_e_:_:_T_y_p_e_L_i_s_t. │ │ │ │ +namespace   _D_u_n_e_:_:_S_t_d │ │ │ │ +  Namespace for features backported from new C++ standards. │ │ │ │   │ │ │ │ =============================================================================== │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00026_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: typelist.hh Source File │ │ │ +dune-common: layout_right.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,152 +70,196 @@ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
typelist.hh
│ │ │ +
layout_right.hh
│ │ │
│ │ │
│ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │
3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
│ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ -
5#ifndef DUNE_COMMON_TYPELIST_HH
│ │ │ -
6#define DUNE_COMMON_TYPELIST_HH
│ │ │ +
5#ifndef DUNE_COMMON_STD_LAYOUT_RIGHT_HH
│ │ │ +
6#define DUNE_COMMON_STD_LAYOUT_RIGHT_HH
│ │ │
7
│ │ │ -
8#include <type_traits>
│ │ │ -
9#include <tuple>
│ │ │ -
10#include <utility>
│ │ │ -
11
│ │ │ -
12namespace Dune {
│ │ │ +
8#include <array>
│ │ │ +
9#include <type_traits>
│ │ │ +
10
│ │ │ + │ │ │ + │ │ │
13
│ │ │ -
32 template<class T>
│ │ │ -
│ │ │ -
33 struct MetaType {
│ │ │ -
35 using type = T;
│ │ │ -
36 };
│ │ │ -
│ │ │ -
37
│ │ │ -
86 template<class... T>
│ │ │ -
87 using TypeList = std::tuple<MetaType<T>...>;
│ │ │ -
88
│ │ │ -
89
│ │ │ -
90
│ │ │ -
99 template<class T>
│ │ │ -
100 struct IsTypeList : std::false_type {};
│ │ │ -
101
│ │ │ -
107 template<class... T>
│ │ │ -
108 struct IsTypeList<TypeList<T...> > : std::true_type {};
│ │ │ -
109
│ │ │ -
110
│ │ │ -
111
│ │ │ -
120 template<class T>
│ │ │ -
121 struct IsEmptyTypeList : std::is_same<T, TypeList<> > {};
│ │ │ -
122
│ │ │ -
123
│ │ │ -
124
│ │ │ -
125 template<class T>
│ │ │ -
126 struct TypeListSize {};
│ │ │ -
127
│ │ │ -
136 template<class... T>
│ │ │ -
137 struct TypeListSize<TypeList<T...>> : std::integral_constant<std::size_t, sizeof...(T)> {};
│ │ │ +
14namespace Dune::Std {
│ │ │ +
15
│ │ │ +
17template <class Extents>
│ │ │ +
│ │ │ + │ │ │ +
19{
│ │ │ +
20 template <class> friend class mapping;
│ │ │ +
21
│ │ │ +
22public:
│ │ │ +
23 using extents_type = Extents;
│ │ │ +
24 using size_type = typename extents_type::size_type;
│ │ │ +
25 using rank_type = typename extents_type::rank_type;
│ │ │ +
26 using index_type = typename extents_type::index_type;
│ │ │ + │ │ │ +
28
│ │ │ +
30 constexpr mapping () noexcept = default;
│ │ │ +
31
│ │ │ +
33 constexpr mapping (const mapping&) noexcept = default;
│ │ │ +
34
│ │ │ +
│ │ │ +
36 constexpr mapping (const extents_type& e) noexcept
│ │ │ +
37 : extents_(e)
│ │ │ +
38 {}
│ │ │ +
│ │ │ +
39
│ │ │ +
41 template <class OtherExtents,
│ │ │ +
42 std::enable_if_t<std::is_constructible_v<extents_type, OtherExtents>, int> = 0>
│ │ │ +
43 #if __cpp_conditional_explicit >= 201806L
│ │ │ +
44 explicit(!std::is_convertible_v<OtherExtents, extents_type>)
│ │ │ +
45 #endif
│ │ │ +
│ │ │ +
46 constexpr mapping (const mapping<OtherExtents>& m) noexcept
│ │ │ +
47 : extents_(m.extents())
│ │ │ +
48 {}
│ │ │ +
│ │ │ +
49
│ │ │ +
51 template <class OtherExtents, class E = extents_type,
│ │ │ +
52 std::enable_if_t<(E::rank() <= 1), int> = 0,
│ │ │ +
53 std::enable_if_t<std::is_constructible_v<extents_type, OtherExtents>, int> = 0>
│ │ │ +
54 #if __cpp_conditional_explicit >= 201806L
│ │ │ +
55 explicit(!std::is_convertible_v<OtherExtents, extents_type>)
│ │ │ +
56 #endif
│ │ │ +
│ │ │ +
57 constexpr mapping (const layout_left::mapping<OtherExtents>& m) noexcept
│ │ │ +
58 : extents_(m.extents())
│ │ │ +
59 {}
│ │ │ +
│ │ │ +
60
│ │ │ +
62 template <class OtherExtents,
│ │ │ +
63 std::enable_if_t<std::is_constructible_v<extents_type, OtherExtents>, int> = 0>
│ │ │ +
64 #if __cpp_conditional_explicit >= 201806L
│ │ │ +
65 explicit(extents_type::rank() > 0)
│ │ │ +
66 #endif
│ │ │ +
│ │ │ + │ │ │ +
68 : extents_(m.extents())
│ │ │ +
69 {
│ │ │ +
70#ifndef NDEBUG
│ │ │ +
71 if constexpr(extents_type::rank() > 0) {
│ │ │ +
72 index_type prod = 1;
│ │ │ +
73 for (rank_type r = extents_type::rank()-1; r > 0; --r) {
│ │ │ +
74 assert(m.strides(r) == prod);
│ │ │ +
75 prod *= m.extents().extent(r);
│ │ │ +
76 }
│ │ │ +
77 assert(m.strides(0) == prod);
│ │ │ +
78 }
│ │ │ +
79#endif
│ │ │ +
80 }
│ │ │ +
│ │ │ +
81
│ │ │ +
83 constexpr mapping& operator= (const mapping&) noexcept = default;
│ │ │ +
84
│ │ │ +
85 constexpr const extents_type& extents () const noexcept { return extents_; }
│ │ │ +
86 constexpr index_type required_span_size () const noexcept { return extents_.product(); }
│ │ │ +
87
│ │ │ +
89 template <class... Indices,
│ │ │ +
90 std::enable_if_t<(sizeof...(Indices) == extents_type::rank()), int> = 0,
│ │ │ +
91 std::enable_if_t<(std::is_convertible_v<Indices, index_type> && ...), int> = 0,
│ │ │ +
92 std::enable_if_t<(std::is_nothrow_constructible_v<Indices, index_type> && ...), int> = 0>
│ │ │ +
│ │ │ +
93 constexpr index_type operator() (Indices... ii) const noexcept
│ │ │ +
94 {
│ │ │ +
95 const std::array indices{index_type(std::move(ii))...};
│ │ │ +
96 index_type value = indices.front();
│ │ │ +
97 for (rank_type j = 0; j < extents_type::rank()-1; ++j) {
│ │ │ +
98 value = indices[j+1] + extents_.extent(j+1) * value;
│ │ │ +
99 }
│ │ │ +
100 return value;
│ │ │ +
101 }
│ │ │ +
│ │ │ +
102
│ │ │ +
│ │ │ +
104 constexpr index_type operator() () const noexcept
│ │ │ +
105 {
│ │ │ +
106 return 0;
│ │ │ +
107 }
│ │ │ +
│ │ │ +
108
│ │ │ +
109 static constexpr bool is_always_unique () noexcept { return true; }
│ │ │ +
110 static constexpr bool is_always_exhaustive () noexcept { return true; }
│ │ │ +
111 static constexpr bool is_always_strided () noexcept { return true; }
│ │ │ +
112
│ │ │ +
113 static constexpr bool is_unique () noexcept { return true; }
│ │ │ +
114 static constexpr bool is_exhaustive () noexcept { return true; }
│ │ │ +
115 static constexpr bool is_strided () noexcept { return true; }
│ │ │ +
116
│ │ │ +
118 template <class E = extents_type,
│ │ │ +
119 std::enable_if_t<(E::rank() > 0), int> = 0>
│ │ │ +
│ │ │ +
120 constexpr index_type stride (rank_type i) const noexcept
│ │ │ +
121 {
│ │ │ +
122 assert(i < extents_type::rank());
│ │ │ +
123 index_type prod = 1;
│ │ │ +
124 for (rank_type r = i+1; r < extents_type::rank(); ++r)
│ │ │ +
125 prod *= extents().extent(r);
│ │ │ +
126 return prod;
│ │ │ +
127 }
│ │ │ +
│ │ │ +
128
│ │ │ +
129 template <class OtherExtents>
│ │ │ +
│ │ │ +
130 friend constexpr bool operator== (const mapping& a, const mapping<OtherExtents>& b) noexcept
│ │ │ +
131 {
│ │ │ +
132 return a.extents_ == b.extents_;
│ │ │ +
133 }
│ │ │ +
│ │ │ +
134
│ │ │ +
135private:
│ │ │ +
136 [[no_unique_address]] extents_type extents_;
│ │ │ +
137};
│ │ │ +
│ │ │
138
│ │ │ -
139
│ │ │ +
139} // end namespace Dune::Std
│ │ │
140
│ │ │ -
141 template<std::size_t i, class T>
│ │ │ - │ │ │ -
143
│ │ │ -
149 template<std::size_t i, class... T>
│ │ │ -
│ │ │ -
150 struct TypeListElement<i, TypeList<T...>>
│ │ │ -
151 {
│ │ │ -
157 using type = typename std::tuple_element<i, std::tuple<T...>>::type;
│ │ │ -
158
│ │ │ -
164 using Type = type;
│ │ │ -
165 };
│ │ │ -
│ │ │ -
166
│ │ │ -
170 template<std::size_t i, class T>
│ │ │ - │ │ │ -
172
│ │ │ -
173 namespace Impl {
│ │ │ -
174
│ │ │ -
175 template<template<class...> class Target, class ToDoList, class... Processed>
│ │ │ -
176 struct UniqueTypesHelper;
│ │ │ -
177
│ │ │ -
178 template<template<class...> class Target, class... Processed>
│ │ │ -
179 struct UniqueTypesHelper<Target, TypeList<>, Processed...>
│ │ │ -
180 {
│ │ │ -
181 using type = Target<Processed...>;
│ │ │ -
182 };
│ │ │ -
183
│ │ │ -
184 template<template<class...> class Target, class T0, class... T, class... Processed>
│ │ │ -
185 struct UniqueTypesHelper<Target, TypeList<T0, T...>, Processed...>
│ │ │ -
186 {
│ │ │ -
187 using type = std::conditional_t<
│ │ │ -
188 std::disjunction<std::is_same<T0, Processed>...>::value,
│ │ │ -
189 typename UniqueTypesHelper<Target, TypeList<T...>, Processed...>::type,
│ │ │ -
190 typename UniqueTypesHelper<Target, TypeList<T...>, T0, Processed...>::type>;
│ │ │ -
191 };
│ │ │ -
192
│ │ │ -
193 // Helper for unpacking Dune::TypeList
│ │ │ -
194 template<template<class...> class Target, class TL>
│ │ │ -
195 struct UnpackTypeList;
│ │ │ -
196
│ │ │ -
197 template<template<class...> class Target, class... T>
│ │ │ -
198 struct UnpackTypeList<Target, Dune::TypeList<T...>>
│ │ │ -
199 {
│ │ │ -
200 using type = Target<T...>;
│ │ │ -
201 };
│ │ │ -
202
│ │ │ -
203 } // namespace Impl
│ │ │ -
204
│ │ │ -
209 template<template<class...> class Target, class TL>
│ │ │ -
210 using UnpackTypeList_t = typename Impl::UnpackTypeList<Target, TL>::type;
│ │ │ -
211
│ │ │ -
219 template<template<class...> class Target, class... T>
│ │ │ -
220 using UniqueTypes_t = typename Impl::UniqueTypesHelper<Target, TypeList<T...>>::type;
│ │ │ -
221
│ │ │ -
227 template<class NonUniqueTypeList>
│ │ │ -
228 using UniqueTypeList_t = typename Impl::UniqueTypesHelper<TypeList, NonUniqueTypeList>::type;
│ │ │ -
229
│ │ │ -
235 template<class... T>
│ │ │ -
│ │ │ -
236 constexpr auto uniqueTypeList(TypeList<T...> list)
│ │ │ -
237 {
│ │ │ -
238 return typename Impl::UniqueTypesHelper<TypeList, TypeList<T...>>::type{};
│ │ │ -
239 }
│ │ │ -
│ │ │ -
240
│ │ │ -
241
│ │ │ -
242
│ │ │ -
243} // namespace Dune
│ │ │ -
244
│ │ │ -
245#endif // DUNE_COMMON_TYPELIST_HH
│ │ │ -
std::tuple< MetaType< T >... > TypeList
A simple type list.
Definition typelist.hh:87
│ │ │ -
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ -
typename Impl::UnpackTypeList< Target, TL >::type UnpackTypeList_t
Unpack Dune::TypeList.
Definition typelist.hh:210
│ │ │ -
constexpr auto uniqueTypeList(TypeList< T... > list)
Remove duplicates from a Dune::TypeList.
Definition typelist.hh:236
│ │ │ -
typename Impl::UniqueTypesHelper< Target, TypeList< T... > >::type UniqueTypes_t
Remove duplicates from a list of types.
Definition typelist.hh:220
│ │ │ -
typename Impl::UniqueTypesHelper< TypeList, NonUniqueTypeList >::type UniqueTypeList_t
Remove duplicates from a Dune::TypeList.
Definition typelist.hh:228
│ │ │ -
typename TypeListElement< i, T >::type TypeListEntry_t
Shortcut for TypeListElement<i, T>::type;.
Definition typelist.hh:171
│ │ │ -
A type that refers to another type.
Definition typelist.hh:33
│ │ │ -
T type
The referred-to type.
Definition typelist.hh:35
│ │ │ -
Check if given type is a TypeList.
Definition typelist.hh:100
│ │ │ -
Check if given type is an empty TypeList.
Definition typelist.hh:121
│ │ │ -
Definition typelist.hh:126
│ │ │ -
Definition typelist.hh:142
│ │ │ -
typename std::tuple_element< i, std::tuple< T... > >::type type
Export type of i-th element in TypeList.
Definition typelist.hh:157
│ │ │ -
type Type
Export type of i-th element in TypeList.
Definition typelist.hh:164
│ │ │ +
141#endif // DUNE_COMMON_STD_LAYOUT_RIGHT_HH
│ │ │ + │ │ │ + │ │ │ +
Namespace for features backported from new C++ standards.
Definition default_accessor.hh:10
│ │ │ +
A layout mapping where the leftmost extent has stride 1.
Definition layout_left.hh:19
│ │ │ +
A layout where the rightmost extent has stride 1, and strides increase right-to-left as the product o...
Definition fwd_layouts.hh:30
│ │ │ +
A layout mapping where the rightmost extent has stride 1.
Definition layout_right.hh:19
│ │ │ +
constexpr const extents_type & extents() const noexcept
Definition layout_right.hh:85
│ │ │ +
constexpr index_type operator()() const noexcept
The default offset for rank-0 tensors is 0.
Definition layout_right.hh:104
│ │ │ +
constexpr mapping & operator=(const mapping &) noexcept=default
Copy-assignment for the mapping.
│ │ │ +
constexpr index_type required_span_size() const noexcept
Definition layout_right.hh:86
│ │ │ +
constexpr mapping() noexcept=default
The default construction is possible for default constructible extents.
│ │ │ +
typename extents_type::size_type size_type
Definition layout_right.hh:24
│ │ │ +
Extents extents_type
Definition layout_right.hh:23
│ │ │ +
static constexpr bool is_always_unique() noexcept
Definition layout_right.hh:109
│ │ │ +
constexpr index_type stride(rank_type i) const noexcept
The stride is the product of the extents E(n)*E(n-1)*...*E(i+1)
Definition layout_right.hh:120
│ │ │ +
static constexpr bool is_exhaustive() noexcept
Definition layout_right.hh:114
│ │ │ +
constexpr mapping(const layout_left::mapping< OtherExtents > &m) noexcept
Construct the mapping from a layout_left.
Definition layout_right.hh:57
│ │ │ +
static constexpr bool is_strided() noexcept
Definition layout_right.hh:115
│ │ │ +
typename extents_type::rank_type rank_type
Definition layout_right.hh:25
│ │ │ +
static constexpr bool is_always_strided() noexcept
Definition layout_right.hh:111
│ │ │ +
static constexpr bool is_unique() noexcept
Definition layout_right.hh:113
│ │ │ +
friend constexpr bool operator==(const mapping &a, const mapping< OtherExtents > &b) noexcept
Definition layout_right.hh:130
│ │ │ +
static constexpr bool is_always_exhaustive() noexcept
Definition layout_right.hh:110
│ │ │ +
typename extents_type::index_type index_type
Definition layout_right.hh:26
│ │ │ +
A layout mapping where the strides are user-defined.
Definition layout_stride.hh:19
│ │ │ +
constexpr const extents_type & extents() const noexcept
Definition layout_stride.hh:85
│ │ │ +
constexpr const strides_type & strides() const noexcept
Get the array of all strides.
Definition layout_stride.hh:127
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,181 +1,232 @@ │ │ │ │ dune-common 2.10 │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ * _d_u_n_e │ │ │ │ * _c_o_m_m_o_n │ │ │ │ -typelist.hh │ │ │ │ + * _s_t_d │ │ │ │ +layout_right.hh │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ LICENSE.md in module root │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ -5#ifndef DUNE_COMMON_TYPELIST_HH │ │ │ │ -6#define DUNE_COMMON_TYPELIST_HH │ │ │ │ +5#ifndef DUNE_COMMON_STD_LAYOUT_RIGHT_HH │ │ │ │ +6#define DUNE_COMMON_STD_LAYOUT_RIGHT_HH │ │ │ │ 7 │ │ │ │ -8#include │ │ │ │ -9#include │ │ │ │ -10#include │ │ │ │ -11 │ │ │ │ -12namespace _D_u_n_e { │ │ │ │ +8#include │ │ │ │ +9#include │ │ │ │ +10 │ │ │ │ +11#include <_d_u_n_e_/_c_o_m_m_o_n_/_i_n_d_i_c_e_s_._h_h> │ │ │ │ +12#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_i_m_p_l_/_f_w_d___l_a_y_o_u_t_s_._h_h> │ │ │ │ 13 │ │ │ │ -32 template │ │ │ │ -_3_3 struct _M_e_t_a_T_y_p_e { │ │ │ │ -_3_5 using _t_y_p_e = T; │ │ │ │ -36 }; │ │ │ │ -37 │ │ │ │ -86 template │ │ │ │ -_8_7 using _T_y_p_e_L_i_s_t = std::tuple...>; │ │ │ │ -88 │ │ │ │ -89 │ │ │ │ -90 │ │ │ │ -99 template │ │ │ │ -_1_0_0 struct _I_s_T_y_p_e_L_i_s_t : std::false_type {}; │ │ │ │ -101 │ │ │ │ -107 template │ │ │ │ -_1_0_8 struct _I_s_T_y_p_e_L_i_s_t<_T_y_p_e_L_i_s_t > : std::true_type {}; │ │ │ │ -109 │ │ │ │ -110 │ │ │ │ -111 │ │ │ │ -120 template │ │ │ │ -_1_2_1 struct _I_s_E_m_p_t_y_T_y_p_e_L_i_s_t : std::is_same > {}; │ │ │ │ -122 │ │ │ │ -123 │ │ │ │ -124 │ │ │ │ -125 template │ │ │ │ -_1_2_6 struct _T_y_p_e_L_i_s_t_S_i_z_e {}; │ │ │ │ -127 │ │ │ │ -136 template │ │ │ │ -_1_3_7 struct _T_y_p_e_L_i_s_t_S_i_z_e<_T_y_p_e_L_i_s_t> : std::integral_constant {}; │ │ │ │ +14namespace _D_u_n_e_:_:_S_t_d { │ │ │ │ +15 │ │ │ │ +17template │ │ │ │ +_1_8class _l_a_y_o_u_t___r_i_g_h_t_:_:_m_a_p_p_i_n_g │ │ │ │ +19{ │ │ │ │ +_2_0 template friend class _m_a_p_p_i_n_g; │ │ │ │ +21 │ │ │ │ +22public: │ │ │ │ +_2_3 using _e_x_t_e_n_t_s___t_y_p_e = Extents; │ │ │ │ +_2_4 using _s_i_z_e___t_y_p_e = typename extents_type::size_type; │ │ │ │ +_2_5 using _r_a_n_k___t_y_p_e = typename extents_type::rank_type; │ │ │ │ +_2_6 using _i_n_d_e_x___t_y_p_e = typename extents_type::index_type; │ │ │ │ +_2_7 using _l_a_y_o_u_t___t_y_p_e = _l_a_y_o_u_t___r_i_g_h_t; │ │ │ │ +28 │ │ │ │ +_3_0 constexpr _m_a_p_p_i_n_g () noexcept = default; │ │ │ │ +31 │ │ │ │ +_3_3 constexpr _m_a_p_p_i_n_g (const _m_a_p_p_i_n_g&) noexcept = default; │ │ │ │ +34 │ │ │ │ +_3_6 constexpr _m_a_p_p_i_n_g (const _e_x_t_e_n_t_s___t_y_p_e& e) noexcept │ │ │ │ +37 : extents_(e) │ │ │ │ +38 {} │ │ │ │ +39 │ │ │ │ +41 template , int> = │ │ │ │ +0> │ │ │ │ +43 #if __cpp_conditional_explicit >= 201806L │ │ │ │ +44 explicit(!std::is_convertible_v) │ │ │ │ +45 #endif │ │ │ │ +_4_6 constexpr _m_a_p_p_i_n_g (const _m_a_p_p_i_n_g_<_O_t_h_e_r_E_x_t_e_n_t_s_>& m) noexcept │ │ │ │ +47 : extents_(m._e_x_t_e_n_t_s()) │ │ │ │ +48 {} │ │ │ │ +49 │ │ │ │ +51 template = 0, │ │ │ │ +53 std::enable_if_t, int> = │ │ │ │ +0> │ │ │ │ +54 #if __cpp_conditional_explicit >= 201806L │ │ │ │ +55 explicit(!std::is_convertible_v) │ │ │ │ +56 #endif │ │ │ │ +_5_7 constexpr _m_a_p_p_i_n_g (const _l_a_y_o_u_t___l_e_f_t_:_:_m_a_p_p_i_n_g_<_O_t_h_e_r_E_x_t_e_n_t_s_>& m) noexcept │ │ │ │ +58 : extents_(m._e_x_t_e_n_t_s()) │ │ │ │ +59 {} │ │ │ │ +60 │ │ │ │ +62 template , int> = │ │ │ │ +0> │ │ │ │ +64 #if __cpp_conditional_explicit >= 201806L │ │ │ │ +65 explicit(extents_type::rank() > 0) │ │ │ │ +66 #endif │ │ │ │ +_6_7 constexpr _m_a_p_p_i_n_g (const _l_a_y_o_u_t___s_t_r_i_d_e_:_:_m_a_p_p_i_n_g_<_O_t_h_e_r_E_x_t_e_n_t_s_>& m) │ │ │ │ +68 : extents_(m._e_x_t_e_n_t_s()) │ │ │ │ +69 { │ │ │ │ +70#ifndef NDEBUG │ │ │ │ +71 if constexpr(extents_type::rank() > 0) { │ │ │ │ +72 _i_n_d_e_x___t_y_p_e prod = 1; │ │ │ │ +73 for (_r_a_n_k___t_y_p_e r = extents_type::rank()-1; r > 0; --r) { │ │ │ │ +74 assert(m._s_t_r_i_d_e_s(r) == prod); │ │ │ │ +75 prod *= m._e_x_t_e_n_t_s().extent(r); │ │ │ │ +76 } │ │ │ │ +77 assert(m._s_t_r_i_d_e_s(0) == prod); │ │ │ │ +78 } │ │ │ │ +79#endif │ │ │ │ +80 } │ │ │ │ +81 │ │ │ │ +_8_3 constexpr _m_a_p_p_i_n_g& _o_p_e_r_a_t_o_r_=_ (const _m_a_p_p_i_n_g&) noexcept = default; │ │ │ │ +84 │ │ │ │ +_8_5 constexpr const _e_x_t_e_n_t_s___t_y_p_e& _e_x_t_e_n_t_s () const noexcept { return extents_; } │ │ │ │ +_8_6 constexpr _i_n_d_e_x___t_y_p_e _r_e_q_u_i_r_e_d___s_p_a_n___s_i_z_e () const noexcept { return │ │ │ │ +extents_.product(); } │ │ │ │ +87 │ │ │ │ +89 template = 0, │ │ │ │ +91 std::enable_if_t<(std::is_convertible_v && ...), int> = │ │ │ │ +0, │ │ │ │ +92 std::enable_if_t<(std::is_nothrow_constructible_v && │ │ │ │ +...), int> = 0> │ │ │ │ +_9_3 constexpr _i_n_d_e_x___t_y_p_e _o_p_e_r_a_t_o_r_(_)_ (Indices... ii) const noexcept │ │ │ │ +94 { │ │ │ │ +95 const std::array indices{_i_n_d_e_x___t_y_p_e(std::move(ii))...}; │ │ │ │ +96 _i_n_d_e_x___t_y_p_e value = indices.front(); │ │ │ │ +97 for (_r_a_n_k___t_y_p_e j = 0; j < extents_type::rank()-1; ++j) { │ │ │ │ +98 value = indices[j+1] + extents_.extent(j+1) * value; │ │ │ │ +99 } │ │ │ │ +100 return value; │ │ │ │ +101 } │ │ │ │ +102 │ │ │ │ +_1_0_4 constexpr _i_n_d_e_x___t_y_p_e _o_p_e_r_a_t_o_r_(_)_ () const noexcept │ │ │ │ +105 { │ │ │ │ +106 return 0; │ │ │ │ +107 } │ │ │ │ +108 │ │ │ │ +_1_0_9 static constexpr bool _i_s___a_l_w_a_y_s___u_n_i_q_u_e () noexcept { return true; } │ │ │ │ +_1_1_0 static constexpr bool _i_s___a_l_w_a_y_s___e_x_h_a_u_s_t_i_v_e () noexcept { return true; } │ │ │ │ +_1_1_1 static constexpr bool _i_s___a_l_w_a_y_s___s_t_r_i_d_e_d () noexcept { return true; } │ │ │ │ +112 │ │ │ │ +_1_1_3 static constexpr bool _i_s___u_n_i_q_u_e () noexcept { return true; } │ │ │ │ +_1_1_4 static constexpr bool _i_s___e_x_h_a_u_s_t_i_v_e () noexcept { return true; } │ │ │ │ +_1_1_5 static constexpr bool _i_s___s_t_r_i_d_e_d () noexcept { return true; } │ │ │ │ +116 │ │ │ │ +118 template 0), int> = 0> │ │ │ │ +_1_2_0 constexpr _i_n_d_e_x___t_y_p_e _s_t_r_i_d_e (_r_a_n_k___t_y_p_e i) const noexcept │ │ │ │ +121 { │ │ │ │ +122 assert(i < extents_type::rank()); │ │ │ │ +123 _i_n_d_e_x___t_y_p_e prod = 1; │ │ │ │ +124 for (_r_a_n_k___t_y_p_e r = i+1; r < extents_type::rank(); ++r) │ │ │ │ +125 prod *= _e_x_t_e_n_t_s().extent(r); │ │ │ │ +126 return prod; │ │ │ │ +127 } │ │ │ │ +128 │ │ │ │ +129 template │ │ │ │ +_1_3_0 friend constexpr bool _o_p_e_r_a_t_o_r_=_=_ (const _m_a_p_p_i_n_g& a, const │ │ │ │ +_m_a_p_p_i_n_g_<_O_t_h_e_r_E_x_t_e_n_t_s_>& b) noexcept │ │ │ │ +131 { │ │ │ │ +132 return a.extents_ == b.extents_; │ │ │ │ +133 } │ │ │ │ +134 │ │ │ │ +135private: │ │ │ │ +136 [[no_unique_address]] _e_x_t_e_n_t_s___t_y_p_e extents_; │ │ │ │ +137}; │ │ │ │ 138 │ │ │ │ -139 │ │ │ │ +139} // end namespace Dune::Std │ │ │ │ 140 │ │ │ │ -141 template │ │ │ │ -_1_4_2 struct _T_y_p_e_L_i_s_t_E_l_e_m_e_n_t {}; │ │ │ │ -143 │ │ │ │ -149 template │ │ │ │ -_1_5_0 struct _T_y_p_e_L_i_s_t_E_l_e_m_e_n_t> │ │ │ │ -151 { │ │ │ │ -_1_5_7 using _t_y_p_e = typename std::tuple_element>::type; │ │ │ │ -158 │ │ │ │ -_1_6_4 using _T_y_p_e = _t_y_p_e; │ │ │ │ -165 }; │ │ │ │ -166 │ │ │ │ -170 template │ │ │ │ -_1_7_1 using _T_y_p_e_L_i_s_t_E_n_t_r_y___t = typename _T_y_p_e_L_i_s_t_E_l_e_m_e_n_t_<_i_,_ _T_>_:_:_t_y_p_e; │ │ │ │ -172 │ │ │ │ -173 namespace Impl { │ │ │ │ -174 │ │ │ │ -175 template class Target, class ToDoList, class... │ │ │ │ -Processed> │ │ │ │ -176 struct UniqueTypesHelper; │ │ │ │ -177 │ │ │ │ -178 template class Target, class... Processed> │ │ │ │ -179 struct UniqueTypesHelper, Processed...> │ │ │ │ -180 { │ │ │ │ -181 using type = Target; │ │ │ │ -182 }; │ │ │ │ -183 │ │ │ │ -184 template class Target, class T0, class... T, class... │ │ │ │ -Processed> │ │ │ │ -185 struct UniqueTypesHelper, Processed...> │ │ │ │ -186 { │ │ │ │ -187 using type = std::conditional_t< │ │ │ │ -188 std::disjunction...>::value, │ │ │ │ -189 typename UniqueTypesHelper, Processed...>::type, │ │ │ │ -190 typename UniqueTypesHelper, T0, Processed...>:: │ │ │ │ -type>; │ │ │ │ -191 }; │ │ │ │ -192 │ │ │ │ -193 // Helper for unpacking Dune::TypeList │ │ │ │ -194 template class Target, class TL> │ │ │ │ -195 struct UnpackTypeList; │ │ │ │ -196 │ │ │ │ -197 template class Target, class... T> │ │ │ │ -198 struct UnpackTypeList> │ │ │ │ -199 { │ │ │ │ -200 using type = Target; │ │ │ │ -201 }; │ │ │ │ -202 │ │ │ │ -203 } // namespace Impl │ │ │ │ -204 │ │ │ │ -209 template class Target, class TL> │ │ │ │ -_2_1_0 using _U_n_p_a_c_k_T_y_p_e_L_i_s_t___t = typename Impl::UnpackTypeList::type; │ │ │ │ -211 │ │ │ │ -219 template class Target, class... T> │ │ │ │ -_2_2_0 using _U_n_i_q_u_e_T_y_p_e_s___t = typename Impl::UniqueTypesHelper>::type; │ │ │ │ -221 │ │ │ │ -227 template │ │ │ │ -_2_2_8 using _U_n_i_q_u_e_T_y_p_e_L_i_s_t___t = typename Impl::UniqueTypesHelper::type; │ │ │ │ -229 │ │ │ │ -235 template │ │ │ │ -_2_3_6 constexpr auto _u_n_i_q_u_e_T_y_p_e_L_i_s_t(_T_y_p_e_L_i_s_t_<_T_._._._> list) │ │ │ │ -237 { │ │ │ │ -238 return typename Impl::UniqueTypesHelper<_T_y_p_e_L_i_s_t, _T_y_p_e_L_i_s_t>::type{}; │ │ │ │ -239 } │ │ │ │ -240 │ │ │ │ -241 │ │ │ │ -242 │ │ │ │ -243} // namespace Dune │ │ │ │ -244 │ │ │ │ -245#endif // DUNE_COMMON_TYPELIST_HH │ │ │ │ -_D_u_n_e_:_:_T_y_p_e_L_i_s_t │ │ │ │ -std::tuple< MetaType< T >... > TypeList │ │ │ │ -A simple type list. │ │ │ │ -DDeeffiinniittiioonn typelist.hh:87 │ │ │ │ -_D_u_n_e │ │ │ │ -Dune namespace. │ │ │ │ -DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ -_D_u_n_e_:_:_U_n_p_a_c_k_T_y_p_e_L_i_s_t___t │ │ │ │ -typename Impl::UnpackTypeList< Target, TL >::type UnpackTypeList_t │ │ │ │ -Unpack Dune::TypeList. │ │ │ │ -DDeeffiinniittiioonn typelist.hh:210 │ │ │ │ -_D_u_n_e_:_:_u_n_i_q_u_e_T_y_p_e_L_i_s_t │ │ │ │ -constexpr auto uniqueTypeList(TypeList< T... > list) │ │ │ │ -Remove duplicates from a Dune::TypeList. │ │ │ │ -DDeeffiinniittiioonn typelist.hh:236 │ │ │ │ -_D_u_n_e_:_:_U_n_i_q_u_e_T_y_p_e_s___t │ │ │ │ -typename Impl::UniqueTypesHelper< Target, TypeList< T... > >::type │ │ │ │ -UniqueTypes_t │ │ │ │ -Remove duplicates from a list of types. │ │ │ │ -DDeeffiinniittiioonn typelist.hh:220 │ │ │ │ -_D_u_n_e_:_:_U_n_i_q_u_e_T_y_p_e_L_i_s_t___t │ │ │ │ -typename Impl::UniqueTypesHelper< TypeList, NonUniqueTypeList >::type │ │ │ │ -UniqueTypeList_t │ │ │ │ -Remove duplicates from a Dune::TypeList. │ │ │ │ -DDeeffiinniittiioonn typelist.hh:228 │ │ │ │ -_D_u_n_e_:_:_T_y_p_e_L_i_s_t_E_n_t_r_y___t │ │ │ │ -typename TypeListElement< i, T >::type TypeListEntry_t │ │ │ │ -Shortcut for TypeListElement::type;. │ │ │ │ -DDeeffiinniittiioonn typelist.hh:171 │ │ │ │ -_D_u_n_e_:_:_M_e_t_a_T_y_p_e │ │ │ │ -A type that refers to another type. │ │ │ │ -DDeeffiinniittiioonn typelist.hh:33 │ │ │ │ -_D_u_n_e_:_:_M_e_t_a_T_y_p_e_:_:_t_y_p_e │ │ │ │ -T type │ │ │ │ -The referred-to type. │ │ │ │ -DDeeffiinniittiioonn typelist.hh:35 │ │ │ │ -_D_u_n_e_:_:_I_s_T_y_p_e_L_i_s_t │ │ │ │ -Check if given type is a TypeList. │ │ │ │ -DDeeffiinniittiioonn typelist.hh:100 │ │ │ │ -_D_u_n_e_:_:_I_s_E_m_p_t_y_T_y_p_e_L_i_s_t │ │ │ │ -Check if given type is an empty TypeList. │ │ │ │ -DDeeffiinniittiioonn typelist.hh:121 │ │ │ │ -_D_u_n_e_:_:_T_y_p_e_L_i_s_t_S_i_z_e │ │ │ │ -DDeeffiinniittiioonn typelist.hh:126 │ │ │ │ -_D_u_n_e_:_:_T_y_p_e_L_i_s_t_E_l_e_m_e_n_t │ │ │ │ -DDeeffiinniittiioonn typelist.hh:142 │ │ │ │ -_D_u_n_e_:_:_T_y_p_e_L_i_s_t_E_l_e_m_e_n_t_<_ _i_,_ _T_y_p_e_L_i_s_t_<_ _T_._._._ _>_ _>_:_:_t_y_p_e │ │ │ │ -typename std::tuple_element< i, std::tuple< T... > >::type type │ │ │ │ -Export type of i-th element in TypeList. │ │ │ │ -DDeeffiinniittiioonn typelist.hh:157 │ │ │ │ -_D_u_n_e_:_:_T_y_p_e_L_i_s_t_E_l_e_m_e_n_t_<_ _i_,_ _T_y_p_e_L_i_s_t_<_ _T_._._._ _>_ _>_:_:_T_y_p_e │ │ │ │ -type Type │ │ │ │ -Export type of i-th element in TypeList. │ │ │ │ -DDeeffiinniittiioonn typelist.hh:164 │ │ │ │ +141#endif // DUNE_COMMON_STD_LAYOUT_RIGHT_HH │ │ │ │ +_f_w_d___l_a_y_o_u_t_s_._h_h │ │ │ │ +_i_n_d_i_c_e_s_._h_h │ │ │ │ +_D_u_n_e_:_:_S_t_d │ │ │ │ +Namespace for features backported from new C++ standards. │ │ │ │ +DDeeffiinniittiioonn default_accessor.hh:10 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___l_e_f_t_:_:_m_a_p_p_i_n_g │ │ │ │ +A layout mapping where the leftmost extent has stride 1. │ │ │ │ +DDeeffiinniittiioonn layout_left.hh:19 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___r_i_g_h_t │ │ │ │ +A layout where the rightmost extent has stride 1, and strides increase right- │ │ │ │ +to-left as the product o... │ │ │ │ +DDeeffiinniittiioonn fwd_layouts.hh:30 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___r_i_g_h_t_:_:_m_a_p_p_i_n_g │ │ │ │ +A layout mapping where the rightmost extent has stride 1. │ │ │ │ +DDeeffiinniittiioonn layout_right.hh:19 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___r_i_g_h_t_:_:_m_a_p_p_i_n_g_:_:_e_x_t_e_n_t_s │ │ │ │ +constexpr const extents_type & extents() const noexcept │ │ │ │ +DDeeffiinniittiioonn layout_right.hh:85 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___r_i_g_h_t_:_:_m_a_p_p_i_n_g_:_:_o_p_e_r_a_t_o_r_(_) │ │ │ │ +constexpr index_type operator()() const noexcept │ │ │ │ +The default offset for rank-0 tensors is 0. │ │ │ │ +DDeeffiinniittiioonn layout_right.hh:104 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___r_i_g_h_t_:_:_m_a_p_p_i_n_g_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ +constexpr mapping & operator=(const mapping &) noexcept=default │ │ │ │ +Copy-assignment for the mapping. │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___r_i_g_h_t_:_:_m_a_p_p_i_n_g_:_:_r_e_q_u_i_r_e_d___s_p_a_n___s_i_z_e │ │ │ │ +constexpr index_type required_span_size() const noexcept │ │ │ │ +DDeeffiinniittiioonn layout_right.hh:86 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___r_i_g_h_t_:_:_m_a_p_p_i_n_g_:_:_m_a_p_p_i_n_g │ │ │ │ +constexpr mapping() noexcept=default │ │ │ │ +The default construction is possible for default constructible extents. │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___r_i_g_h_t_:_:_m_a_p_p_i_n_g_:_:_s_i_z_e___t_y_p_e │ │ │ │ +typename extents_type::size_type size_type │ │ │ │ +DDeeffiinniittiioonn layout_right.hh:24 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___r_i_g_h_t_:_:_m_a_p_p_i_n_g_:_:_e_x_t_e_n_t_s___t_y_p_e │ │ │ │ +Extents extents_type │ │ │ │ +DDeeffiinniittiioonn layout_right.hh:23 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___r_i_g_h_t_:_:_m_a_p_p_i_n_g_:_:_i_s___a_l_w_a_y_s___u_n_i_q_u_e │ │ │ │ +static constexpr bool is_always_unique() noexcept │ │ │ │ +DDeeffiinniittiioonn layout_right.hh:109 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___r_i_g_h_t_:_:_m_a_p_p_i_n_g_:_:_s_t_r_i_d_e │ │ │ │ +constexpr index_type stride(rank_type i) const noexcept │ │ │ │ +The stride is the product of the extents E(n)*E(n-1)*...*E(i+1) │ │ │ │ +DDeeffiinniittiioonn layout_right.hh:120 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___r_i_g_h_t_:_:_m_a_p_p_i_n_g_:_:_i_s___e_x_h_a_u_s_t_i_v_e │ │ │ │ +static constexpr bool is_exhaustive() noexcept │ │ │ │ +DDeeffiinniittiioonn layout_right.hh:114 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___r_i_g_h_t_:_:_m_a_p_p_i_n_g_:_:_m_a_p_p_i_n_g │ │ │ │ +constexpr mapping(const layout_left::mapping< OtherExtents > &m) noexcept │ │ │ │ +Construct the mapping from a layout_left. │ │ │ │ +DDeeffiinniittiioonn layout_right.hh:57 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___r_i_g_h_t_:_:_m_a_p_p_i_n_g_:_:_i_s___s_t_r_i_d_e_d │ │ │ │ +static constexpr bool is_strided() noexcept │ │ │ │ +DDeeffiinniittiioonn layout_right.hh:115 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___r_i_g_h_t_:_:_m_a_p_p_i_n_g_:_:_r_a_n_k___t_y_p_e │ │ │ │ +typename extents_type::rank_type rank_type │ │ │ │ +DDeeffiinniittiioonn layout_right.hh:25 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___r_i_g_h_t_:_:_m_a_p_p_i_n_g_:_:_i_s___a_l_w_a_y_s___s_t_r_i_d_e_d │ │ │ │ +static constexpr bool is_always_strided() noexcept │ │ │ │ +DDeeffiinniittiioonn layout_right.hh:111 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___r_i_g_h_t_:_:_m_a_p_p_i_n_g_:_:_i_s___u_n_i_q_u_e │ │ │ │ +static constexpr bool is_unique() noexcept │ │ │ │ +DDeeffiinniittiioonn layout_right.hh:113 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___r_i_g_h_t_:_:_m_a_p_p_i_n_g_:_:_o_p_e_r_a_t_o_r_=_= │ │ │ │ +friend constexpr bool operator==(const mapping &a, const mapping< OtherExtents │ │ │ │ +> &b) noexcept │ │ │ │ +DDeeffiinniittiioonn layout_right.hh:130 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___r_i_g_h_t_:_:_m_a_p_p_i_n_g_:_:_i_s___a_l_w_a_y_s___e_x_h_a_u_s_t_i_v_e │ │ │ │ +static constexpr bool is_always_exhaustive() noexcept │ │ │ │ +DDeeffiinniittiioonn layout_right.hh:110 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___r_i_g_h_t_:_:_m_a_p_p_i_n_g_:_:_i_n_d_e_x___t_y_p_e │ │ │ │ +typename extents_type::index_type index_type │ │ │ │ +DDeeffiinniittiioonn layout_right.hh:26 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___s_t_r_i_d_e_:_:_m_a_p_p_i_n_g │ │ │ │ +A layout mapping where the strides are user-defined. │ │ │ │ +DDeeffiinniittiioonn layout_stride.hh:19 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___s_t_r_i_d_e_:_:_m_a_p_p_i_n_g_:_:_e_x_t_e_n_t_s │ │ │ │ +constexpr const extents_type & extents() const noexcept │ │ │ │ +DDeeffiinniittiioonn layout_stride.hh:85 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___s_t_r_i_d_e_:_:_m_a_p_p_i_n_g_:_:_s_t_r_i_d_e_s │ │ │ │ +constexpr const strides_type & strides() const noexcept │ │ │ │ +Get the array of all strides. │ │ │ │ +DDeeffiinniittiioonn layout_stride.hh:127 │ │ │ │ =============================================================================== │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00029.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: tuplevector.hh File Reference │ │ │ +dune-common: span.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,66 +65,84 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │
│ │ │ Classes | │ │ │ Namespaces | │ │ │ -Functions
│ │ │ -
tuplevector.hh File Reference
│ │ │ +Functions | │ │ │ +Variables
│ │ │ +
span.hh File Reference
│ │ │ │ │ │
│ │ │ - │ │ │ -

Provides the TupleVector class that augments std::tuple by operator[]. │ │ │ -More...

│ │ │ -
#include <tuple>
│ │ │ -#include <utility>
│ │ │ -#include <dune/common/indices.hh>
│ │ │ -#include <dune/common/typetraits.hh>
│ │ │ -#include <dune/common/std/type_traits.hh>
│ │ │ +
#include <cassert>
│ │ │ +#include <cstddef>
│ │ │ +#include <exception>
│ │ │ +#include <iterator>
│ │ │ +#include <limits>
│ │ │ +#include <stdexcept>
│ │ │ +#include <string>
│ │ │ +#include <type_traits>
│ │ │ +#include <dune/common/exceptions.hh>
│ │ │ +#include <dune/common/std/memory.hh>
│ │ │
│ │ │

Go to the source code of this file.

│ │ │ │ │ │ │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ + │ │ │ + │ │ │ │ │ │

│ │ │ Classes

class  Dune::TupleVector< T >
 A class augmenting std::tuple by element access via operator[]. More...
 
struct  std::tuple_element< i, Dune::TupleVector< Args... > >
 Make std::tuple_element work for TupleVector. More...
 
struct  std::tuple_size< Dune::TupleVector< Args... > >
 Make std::tuple_size work for TupleVector. More...
class  Dune::Std::span< Element, Extent >
 A contiguous sequence of elements with static or dynamic extent. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ - │ │ │ + │ │ │ + │ │ │ │ │ │

│ │ │ Namespaces

namespace  Dune
 Dune namespace.
 
namespace  std
 STL namespace.
namespace  Dune::Std
 Namespace for features backported from new C++ standards.
 
│ │ │ │ │ │ - │ │ │ - │ │ │ - │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +

│ │ │ Functions

template<class... T>
constexpr auto Dune::makeTupleVector (T &&... t)
 
template<class T , std::size_t N>
 Dune::Std::span (T(&)[N]) -> span< T, N >
 
template<class ElementType , class I , std::size_t Extent, std::enable_if_t< std::is_convertible_v< I, std::size_t >, int > = 0>
 Dune::Std::span (ElementType *, std::integral_constant< I, Extent >) -> span< ElementType, Extent >
 
template<class ElementType , class I , std::enable_if_t< std::is_integral_v< I >, int > = 0, std::enable_if_t< std::is_convertible_v< I, std::size_t >, int > = 0>
 Dune::Std::span (ElementType *, I) -> span< ElementType, Std::dynamic_extent >
 
template<class Iter , class Element = std::remove_reference_t<decltype(*std::declval<Iter>())>>
 Dune::Std::span (Iter, Iter) -> span< Element, Std::dynamic_extent >
 
template<class Range , class First = decltype(std::begin(std::declval<Range>())), class Last = decltype(std::end(std::declval<Range>())), class Element = std::remove_reference_t<decltype(*std::declval<First>())>>
 Dune::Std::span (Range &) -> span< Element, Std::dynamic_extent >
 
template<class T , size_t N>
 Dune::Std::span (std::array< T, N > &) -> span< T, N >
 
template<class T , size_t N>
 Dune::Std::span (const std::array< T, N > &) -> span< const T, N >
 
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │

│ │ │ +Variables

constexpr std::size_t Dune::Std::dynamic_extent = std::numeric_limits<std::size_t>::max()
 A constant of type std::size_t that is used to differentiate std::span of static and dynamic extent.
 
│ │ │ -

Detailed Description

│ │ │ -

Provides the TupleVector class that augments std::tuple by operator[].

│ │ │ -
Author
Carsten Gräser
│ │ │ -
│ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ @@ -1 +1 @@ │ │ │ │ -utf-8 │ │ │ │ +us-ascii │ │ │ ├── html2text {} │ │ │ │ @@ -1,43 +1,70 @@ │ │ │ │ dune-common 2.10 │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ * _d_u_n_e │ │ │ │ * _c_o_m_m_o_n │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ -tuplevector.hh File Reference │ │ │ │ -Provides the TupleVector class that augments std::tuple by operator[]. _M_o_r_e_._._. │ │ │ │ -#include │ │ │ │ -#include │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_i_n_d_i_c_e_s_._h_h> │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ + * _s_t_d │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s | _V_a_r_i_a_b_l_e_s │ │ │ │ +span.hh File Reference │ │ │ │ +#include │ │ │ │ +#include │ │ │ │ +#include │ │ │ │ +#include │ │ │ │ +#include │ │ │ │ +#include │ │ │ │ +#include │ │ │ │ +#include │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_m_e_m_o_r_y_._h_h> │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ CCllaasssseess │ │ │ │ - class   _D_u_n_e_:_:_T_u_p_l_e_V_e_c_t_o_r_<_ _T_ _> │ │ │ │ -  A class augmenting std::tuple by element access via operator[]. │ │ │ │ - _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _s_t_d_:_:_t_u_p_l_e___e_l_e_m_e_n_t_<_ _i_,_ _D_u_n_e_:_:_T_u_p_l_e_V_e_c_t_o_r_<_ _A_r_g_s_._._._ _>_ _> │ │ │ │ -  Make std::tuple_element work for TupleVector. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _s_t_d_:_:_t_u_p_l_e___s_i_z_e_<_ _D_u_n_e_:_:_T_u_p_l_e_V_e_c_t_o_r_<_ _A_r_g_s_._._._ _>_ _> │ │ │ │ -  Make std::tuple_size work for TupleVector. _M_o_r_e_._._. │ │ │ │ +class   _D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_<_ _E_l_e_m_e_n_t_,_ _E_x_t_e_n_t_ _> │ │ │ │ +  A contiguous sequence of elements with static or dynamic extent. │ │ │ │ + _M_o_r_e_._._. │ │ │ │   │ │ │ │ NNaammeessppaacceess │ │ │ │ namespace   _D_u_n_e │ │ │ │   _D_u_n_e namespace. │ │ │ │   │ │ │ │ -namespace   _s_t_d │ │ │ │ -  STL namespace. │ │ │ │ +namespace   _D_u_n_e_:_:_S_t_d │ │ │ │ +  Namespace for features backported from new C++ standards. │ │ │ │   │ │ │ │ FFuunnccttiioonnss │ │ │ │ -template │ │ │ │ -constexpr auto  _D_u_n_e_:_:_m_a_k_e_T_u_p_l_e_V_e_c_t_o_r (T &&... t) │ │ │ │ +template │ │ │ │ +  _D_u_n_e_:_:_S_t_d_:_:_s_p_a_n (T(&)[N]) -> _s_p_a_n< T, N > │ │ │ │ +  │ │ │ │ +template, int > = 0> │ │ │ │ +  _D_u_n_e_:_:_S_t_d_:_:_s_p_a_n (ElementType *, std::integral_constant< I, Extent >) -> _s_p_a_n< │ │ │ │ + ElementType, Extent > │ │ │ │ +  │ │ │ │ +template, int > = 0, std::enable_if_t< std::is_convertible_v< I, std::size_t >, int > │ │ │ │ += 0> │ │ │ │ +  _D_u_n_e_:_:_S_t_d_:_:_s_p_a_n (ElementType *, I) -> _s_p_a_n< ElementType, _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t │ │ │ │ + > │ │ │ │ +  │ │ │ │ +template())>> │ │ │ │ +  _D_u_n_e_:_:_S_t_d_:_:_s_p_a_n (Iter, Iter) -> _s_p_a_n< Element, _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t > │ │ │ │ +  │ │ │ │ +template │ │ │ │ +())), class Last = decltype(std::end(std::declval())), class Element = │ │ │ │ +std::remove_reference_t())>> │ │ │ │ +  _D_u_n_e_:_:_S_t_d_:_:_s_p_a_n (Range &) -> _s_p_a_n< Element, _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t > │ │ │ │ +  │ │ │ │ +template │ │ │ │ +  _D_u_n_e_:_:_S_t_d_:_:_s_p_a_n (std::array< T, N > &) -> _s_p_a_n< T, N > │ │ │ │ +  │ │ │ │ +template │ │ │ │ +  _D_u_n_e_:_:_S_t_d_:_:_s_p_a_n (const std::array< T, N > &) -> _s_p_a_n< const T, N > │ │ │ │ +  │ │ │ │ +VVaarriiaabblleess │ │ │ │ +constexpr std::size_t  _D_u_n_e_:_:_S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t = std::numeric_limits::max() │ │ │ │ +  A constant of type std::size_t that is used to │ │ │ │ + differentiate std::span of static and dynamic extent. │ │ │ │   │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ -Provides the TupleVector class that augments std::tuple by operator[]. │ │ │ │ - Author │ │ │ │ - Carsten Gräser │ │ │ │ =============================================================================== │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00029_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: tuplevector.hh Source File │ │ │ +dune-common: span.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,145 +70,464 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
tuplevector.hh
│ │ │ +
span.hh
│ │ │
│ │ │
│ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │
3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
│ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ -
5#ifndef DUNE_COMMON_TUPLEVECTOR_HH
│ │ │ -
6#define DUNE_COMMON_TUPLEVECTOR_HH
│ │ │ +
5#ifndef DUNE_COMMON_STD_SPAN_HH
│ │ │ +
6#define DUNE_COMMON_STD_SPAN_HH
│ │ │
7
│ │ │ -
8#include <tuple>
│ │ │ -
9#include <utility>
│ │ │ -
10
│ │ │ - │ │ │ - │ │ │ - │ │ │ -
14
│ │ │ -
15
│ │ │ -
16
│ │ │ -
23namespace Dune
│ │ │ -
24{
│ │ │ -
25
│ │ │ -
26
│ │ │ +
8#include <cassert>
│ │ │ +
9#include <cstddef>
│ │ │ +
10#include <exception>
│ │ │ +
11#include <iterator>
│ │ │ +
12#include <limits>
│ │ │ +
13#include <stdexcept>
│ │ │ +
14#include <string>
│ │ │ +
15#include <type_traits>
│ │ │ +
16#if __has_include(<version>)
│ │ │ +
17 #include <version>
│ │ │ +
18#endif
│ │ │ +
19
│ │ │ + │ │ │ + │ │ │ +
22
│ │ │ +
23namespace Dune::Std {
│ │ │ +
24
│ │ │ +
26inline constexpr std::size_t dynamic_extent = std::numeric_limits<std::size_t>::max();
│ │ │
27
│ │ │ -
33template<class... T>
│ │ │ -
│ │ │ -
34class TupleVector : public std::tuple<T...>
│ │ │ -
35{
│ │ │ -
36 using Base = std::tuple<T...>;
│ │ │ -
37
│ │ │ -
38 template<class... TT>
│ │ │ -
39 using TupleConstructorDetector = decltype(Base(std::declval<TT&&>()...));
│ │ │ -
40
│ │ │ -
41 template<class... TT>
│ │ │ -
42 using hasTupleConstructor = Dune::Std::is_detected<TupleConstructorDetector, TT...>;
│ │ │ +
28namespace Impl {
│ │ │ +
29
│ │ │ +
30template <std::size_t Extent>
│ │ │ +
31class SpanSize
│ │ │ +
32{
│ │ │ +
33public:
│ │ │ +
34 using size_type = std::size_t;
│ │ │ +
35
│ │ │ +
36public:
│ │ │ +
37 constexpr SpanSize () = default;
│ │ │ +
38
│ │ │ +
39 constexpr SpanSize ([[maybe_unused]] size_type size) noexcept
│ │ │ +
40 {
│ │ │ +
41 assert(Extent == Std::dynamic_extent || Extent == size);
│ │ │ +
42 }
│ │ │
43
│ │ │ -
44
│ │ │ -
45public:
│ │ │ -
46
│ │ │ -
53 template<class... TT,
│ │ │ -
54 std::enable_if_t<hasTupleConstructor<TT...>::value, int> = 0>
│ │ │ -
│ │ │ -
55 constexpr TupleVector(TT&&... tt) :
│ │ │ -
56 Base(std::forward<TT>(tt)...)
│ │ │ -
57 {}
│ │ │ -
│ │ │ +
44 template <class Iter>
│ │ │ +
45 constexpr SpanSize ([[maybe_unused]] Iter first, [[maybe_unused]] Iter last) noexcept
│ │ │ +
46 {
│ │ │ +
47 assert((std::distance(first,last) == Extent));
│ │ │ +
48 }
│ │ │ +
49
│ │ │ +
50 constexpr size_type size () const noexcept { return Extent; }
│ │ │ +
51};
│ │ │ +
52
│ │ │ +
53template <>
│ │ │ +
54class SpanSize<Std::dynamic_extent>
│ │ │ +
55{
│ │ │ +
56public:
│ │ │ +
57 using size_type = std::size_t;
│ │ │
58
│ │ │ -
│ │ │ -
61 constexpr TupleVector()
│ │ │ +
59public:
│ │ │ +
60 constexpr SpanSize (size_type size = 0) noexcept
│ │ │ +
61 : size_(size)
│ │ │
62 {}
│ │ │ -
│ │ │
63
│ │ │ -
66 template<std::size_t i,
│ │ │ -
67 std::enable_if_t<(i < sizeof...(T)), int> = 0>
│ │ │ -
│ │ │ -
68 constexpr decltype(auto) operator[](const Dune::index_constant<i>&) const
│ │ │ -
69 {
│ │ │ -
70 return std::get<i>(*this);
│ │ │ -
71 }
│ │ │ -
│ │ │ -
72
│ │ │ -
75 template<std::size_t i,
│ │ │ -
76 std::enable_if_t<(i < sizeof...(T)), int> = 0>
│ │ │ -
│ │ │ -
77 decltype(auto) operator[](const Dune::index_constant<i>&)
│ │ │ -
78 {
│ │ │ -
79 return std::get<i>(*this);
│ │ │ -
80 }
│ │ │ -
│ │ │ -
81
│ │ │ -
│ │ │ -
83 static constexpr std::size_t size()
│ │ │ -
84 {
│ │ │ -
85 return std::tuple_size<Base>::value;
│ │ │ -
86 }
│ │ │ -
│ │ │ -
87};
│ │ │ -
│ │ │ -
88
│ │ │ -
89
│ │ │ -
90
│ │ │ -
91template<class... T>
│ │ │ -
│ │ │ -
92constexpr auto makeTupleVector(T&&... t)
│ │ │ -
93{
│ │ │ -
94 // The std::decay_t<T> is is a slight simplification,
│ │ │ -
95 // because std::reference_wrapper needs special care.
│ │ │ -
96 return TupleVector<std::decay_t<T>...>(std::forward<T>(t)...);
│ │ │ -
97}
│ │ │ -
│ │ │ -
98
│ │ │ -
99
│ │ │ -
100
│ │ │ -
101} // namespace Dune
│ │ │ -
102
│ │ │ -
103namespace std
│ │ │ -
104{
│ │ │ -
109 template <size_t i, typename... Args>
│ │ │ -
│ │ │ -
110 struct tuple_element<i,Dune::TupleVector<Args...> >
│ │ │ -
111 {
│ │ │ -
112 using type = typename std::tuple_element<i, std::tuple<Args...> >::type;
│ │ │ -
113 };
│ │ │ -
│ │ │ -
114
│ │ │ -
119 template <typename... Args>
│ │ │ -
│ │ │ -
120 struct tuple_size<Dune::TupleVector<Args...> >
│ │ │ -
121 : std::integral_constant<std::size_t, sizeof...(Args)>
│ │ │ -
122 {};
│ │ │ -
│ │ │ -
123}
│ │ │ -
124
│ │ │ -
125#endif // DUNE_COMMON_TUPLEVECTOR_HH
│ │ │ -
Traits for type conversions and type information.
│ │ │ - │ │ │ - │ │ │ -
std::integral_constant< std::size_t, i > index_constant
An index constant with value i.
Definition indices.hh:29
│ │ │ -
typename detected_or< nonesuch, Op, Args... >::value_t is_detected
Detects whether Op<Args...> is valid.
Definition type_traits.hh:145
│ │ │ +
64 template <class Iter>
│ │ │ +
65 constexpr SpanSize (Iter first, Iter last) noexcept
│ │ │ +
66 : size_(std::distance(first,last))
│ │ │ +
67 {}
│ │ │ +
68
│ │ │ +
69 constexpr size_type size () const noexcept { return size_; }
│ │ │ +
70
│ │ │ +
71private:
│ │ │ +
72 size_type size_;
│ │ │ +
73};
│ │ │ +
74
│ │ │ +
75template <class T>
│ │ │ +
76struct TypeIdentity { using type = T; };
│ │ │ +
77
│ │ │ +
78template <class T>
│ │ │ +
79using TypeIdentity_t = typename TypeIdentity<T>::type;
│ │ │ +
80
│ │ │ +
81} // end namespace Impl
│ │ │ +
82
│ │ │ +
83
│ │ │ +
123template <class Element, std::size_t Extent = Std::dynamic_extent>
│ │ │ +
│ │ │ +
124class span
│ │ │ +
125 : public Impl::SpanSize<Extent>
│ │ │ +
126{
│ │ │ +
127 using base_type = Impl::SpanSize<Extent>; // base_type implements the member variable size()
│ │ │ +
128
│ │ │ +
129 static_assert(std::is_object_v<Element> && !std::is_abstract_v<Element>);
│ │ │ +
130
│ │ │ +
131public:
│ │ │ +
132 using element_type = Element;
│ │ │ +
133 using value_type = std::remove_cv_t<element_type>;
│ │ │ +
134 using size_type = std::size_t;
│ │ │ +
135 using difference_type = std::ptrdiff_t;
│ │ │ + │ │ │ + │ │ │ + │ │ │ + │ │ │ +
140 using reverse_iterator = std::reverse_iterator<iterator>;
│ │ │ +
141#if __cpp_lib_ranges_as_const >202311L
│ │ │ +
142 using const_iterator = std::const_iterator<iterator>;
│ │ │ +
143 using const_reverse_iterator = std::const_iterator<reverse_iterator>;
│ │ │ +
144#else
│ │ │ + │ │ │ +
146 using const_reverse_iterator = std::reverse_iterator<const_iterator>;
│ │ │ +
147#endif
│ │ │ +
148
│ │ │ +
149
│ │ │ +
150 static constexpr size_type extent = Extent;
│ │ │ +
151
│ │ │ +
152public:
│ │ │ +
155
│ │ │ +
157 template <std::size_t e = extent,
│ │ │ +
158 std::enable_if_t<(e == dynamic_extent || e == 0), int> = 0>
│ │ │ +
│ │ │ +
159 constexpr span () noexcept
│ │ │ +
160 : base_type{}
│ │ │ +
161 , data_{}
│ │ │ +
162 {}
│ │ │ +
│ │ │ +
163
│ │ │ +
165 template <class Iter,
│ │ │ +
166 class U = std::remove_reference_t<decltype(*std::declval<Iter>())>,
│ │ │ +
167 std::enable_if_t<std::is_convertible_v<U(*)[], element_type(*)[]>, int> = 0>
│ │ │ +
168 #if __cpp_conditional_explicit >= 201806L
│ │ │ +
169 explicit(extent != Std::dynamic_extent)
│ │ │ +
170 #endif
│ │ │ +
│ │ │ +
171 constexpr span (Iter first, size_type size)
│ │ │ +
172 : base_type(size)
│ │ │ +
173 , data_(Std::to_address(first))
│ │ │ +
174 {}
│ │ │ +
│ │ │ +
175
│ │ │ +
177 template <class Iter,
│ │ │ +
178 class U = std::remove_reference_t<decltype(*std::declval<Iter>())>,
│ │ │ +
179 std::enable_if_t<std::is_convertible_v<U(*)[], element_type(*)[]>, int> = 0>
│ │ │ +
180 #if __cpp_conditional_explicit >= 201806L
│ │ │ +
181 explicit(extent != Std::dynamic_extent)
│ │ │ +
182 #endif
│ │ │ +
│ │ │ +
183 constexpr span (Iter first, Iter last)
│ │ │ +
184 : base_type(first,last)
│ │ │ +
185 , data_(Std::to_address(first))
│ │ │ +
186 {}
│ │ │ +
│ │ │ +
187
│ │ │ +
189 template <class Range,
│ │ │ +
190 decltype(std::begin(std::declval<Range>()), std::end(std::declval<Range>()), bool{}) = true,
│ │ │ +
191 std::enable_if_t<not std::is_array_v<Range>, int> = 0>
│ │ │ +
192 #if __cpp_conditional_explicit >= 201806L
│ │ │ +
193 explicit(extent != Std::dynamic_extent)
│ │ │ +
194 #endif
│ │ │ +
│ │ │ +
195 constexpr span (Range& range)
│ │ │ +
196 : span(std::begin(range), std::end(range))
│ │ │ +
197 {}
│ │ │ +
│ │ │ +
198
│ │ │ +
200 template <std::size_t N, std::size_t e = extent,
│ │ │ +
201 std::enable_if_t<(e == Std::dynamic_extent || e == N), int> = 0>
│ │ │ +
│ │ │ +
202 constexpr span (Impl::TypeIdentity_t<element_type> (&data)[N]) noexcept
│ │ │ +
203 : base_type(N)
│ │ │ +
204 , data_(data)
│ │ │ +
205 {}
│ │ │ +
│ │ │ +
206
│ │ │ +
208 template <class T, size_t N, std::size_t e = extent,
│ │ │ +
209 std::enable_if_t<(e == Std::dynamic_extent || e == N), int> = 0,
│ │ │ +
210 std::enable_if_t<std::is_convertible_v<T(*)[], element_type(*)[]>, int> = 0>
│ │ │ +
│ │ │ +
211 constexpr span (std::array<T, N>& arr) noexcept
│ │ │ +
212 : base_type(N)
│ │ │ +
213 , data_(arr.data())
│ │ │ +
214 {}
│ │ │ +
│ │ │ +
215
│ │ │ +
217 template <class T, size_t N, std::size_t e = extent,
│ │ │ +
218 std::enable_if_t<(e == Std::dynamic_extent || e == N), int> = 0,
│ │ │ +
219 std::enable_if_t<std::is_convertible_v<const T(*)[], element_type(*)[]>, int> = 0>
│ │ │ +
│ │ │ +
220 constexpr span (const std::array<T, N>& arr) noexcept
│ │ │ +
221 : base_type(N)
│ │ │ +
222 , data_(arr.data())
│ │ │ +
223 {}
│ │ │ +
│ │ │ +
224
│ │ │ +
226 template <class E = element_type,
│ │ │ +
227 std::enable_if_t<std::is_const_v<E>, int> = 0>
│ │ │ +
228 #if __cpp_conditional_explicit >= 201806L
│ │ │ +
229 explicit(extent != Std::dynamic_extent)
│ │ │ +
230 #endif
│ │ │ +
│ │ │ +
231 constexpr span (std::initializer_list<value_type> il)
│ │ │ +
232 : base_type(il.size())
│ │ │ +
233 , data_(il.begin())
│ │ │ +
234 {}
│ │ │ +
│ │ │ +
235
│ │ │ +
237 constexpr span (const span& other) noexcept = default;
│ │ │ +
238
│ │ │ +
240 template <class OtherElementType, std::size_t OtherExtent,
│ │ │ +
241 std::enable_if_t<(extent == Std::dynamic_extent || OtherExtent == Std::dynamic_extent || extent == OtherExtent), int> = 0,
│ │ │ +
242 std::enable_if_t<std::is_convertible_v<OtherElementType(*)[], element_type(*)[]>, int> = 0>
│ │ │ +
243 #if __cpp_conditional_explicit >= 201806L
│ │ │ +
244 explicit(extent != Std::dynamic_extent && OtherExtent == Std::dynamic_extent)
│ │ │ +
245 #endif
│ │ │ +
│ │ │ +
246 constexpr span (const span<OtherElementType, OtherExtent>& s) noexcept
│ │ │ +
247 : base_type(s.size())
│ │ │ +
248 , data_(s.data())
│ │ │ +
249 {}
│ │ │ +
│ │ │ +
250
│ │ │ +
252 constexpr span& operator= (const span& other) noexcept = default;
│ │ │ +
253
│ │ │ +
255
│ │ │ +
256
│ │ │ +
259
│ │ │ +
261 constexpr iterator begin () const noexcept { return data_; }
│ │ │ +
262
│ │ │ +
264 constexpr iterator end () const noexcept { return data_ + size(); }
│ │ │ +
265
│ │ │ +
267 constexpr const_iterator cbegin () const noexcept { return data_; }
│ │ │ +
268
│ │ │ +
270 constexpr const_iterator cend () const noexcept { return data_ + size(); }
│ │ │ +
271
│ │ │ +
273 constexpr reverse_iterator rbegin() const noexcept { return reverse_iterator{end()}; }
│ │ │ +
274
│ │ │ +
276 constexpr reverse_iterator rend() const noexcept { return reverse_iterator{begin()}; }
│ │ │ +
277
│ │ │ +
279 constexpr const_reverse_iterator crbegin() const noexcept { return reverse_iterator{end()}; }
│ │ │ +
280
│ │ │ +
282 constexpr const_reverse_iterator crend() const noexcept { return reverse_iterator{begin()}; }
│ │ │ +
283
│ │ │ +
285
│ │ │ +
286
│ │ │ +
289
│ │ │ +
│ │ │ +
291 constexpr reference front () const
│ │ │ +
292 {
│ │ │ +
293 assert(not empty() && "front of empty span does not exist");
│ │ │ +
294 return data_[0];
│ │ │ +
295 }
│ │ │ +
│ │ │ +
296
│ │ │ +
│ │ │ +
298 constexpr reference back () const
│ │ │ +
299 {
│ │ │ +
300 assert(not empty() && "front of empty span does not exist");
│ │ │ +
301 return data_[size()-1];
│ │ │ +
302 }
│ │ │ +
│ │ │ +
303
│ │ │ +
│ │ │ +
305 constexpr reference at (size_type i) const
│ │ │ +
306 {
│ │ │ +
307 if (i >= size())
│ │ │ +
308 throw std::out_of_range("Index " + std::to_string(i) + " out of range.");
│ │ │ +
309 return data_[i];
│ │ │ +
310 }
│ │ │ +
│ │ │ +
311
│ │ │ +
313 constexpr reference operator[] (size_type i) const { return data_[i]; }
│ │ │ +
314
│ │ │ +
316 constexpr pointer data () const noexcept { return data_; }
│ │ │ +
317
│ │ │ +
319
│ │ │ +
320
│ │ │ +
323
│ │ │ +
325 template <std::size_t Count>
│ │ │ +
│ │ │ + │ │ │ +
327 {
│ │ │ +
328 static_assert(Count <= Extent);
│ │ │ +
329 assert(Count <= size());
│ │ │ +
330 return span<element_type, Count>{data(), Count};
│ │ │ +
331 }
│ │ │ +
│ │ │ +
332
│ │ │ +
334 template <std::size_t Count>
│ │ │ +
│ │ │ + │ │ │ +
336 {
│ │ │ +
337 static_assert(Count <= Extent);
│ │ │ +
338 assert(Count <= size());
│ │ │ +
339 return span<element_type, Count>{data()+ (size() - Count), Count};
│ │ │ +
340 }
│ │ │ +
│ │ │ +
341
│ │ │ +
342private:
│ │ │ +
343
│ │ │ +
344 static constexpr std::size_t subspan_extent (std::size_t O, std::size_t C) noexcept
│ │ │ +
345 {
│ │ │ +
346 return (C != Std::dynamic_extent) ? C :
│ │ │ +
347 (Extent != Std::dynamic_extent) ? Extent - O : Std::dynamic_extent;
│ │ │ +
348 }
│ │ │ +
349
│ │ │ +
350public:
│ │ │ +
351
│ │ │ +
353
│ │ │ +
357 template <std::size_t Offset, std::size_t Count = Std::dynamic_extent>
│ │ │ +
│ │ │ +
358 constexpr span<element_type, subspan_extent(Offset,Count)> subspan () const
│ │ │ +
359 {
│ │ │ +
360 static_assert(Offset <= Extent && (Count == Std::dynamic_extent || Count <= Extent - Offset));
│ │ │ +
361 assert(Offset <= size() && (Count == Std::dynamic_extent || Count <= size() - Offset));
│ │ │ +
362 return span<element_type, subspan_extent(Offset,Count)>{
│ │ │ +
363 data() + Offset, Count != Std::dynamic_extent ? Count : size() - Offset};
│ │ │ +
364 }
│ │ │ +
│ │ │ +
365
│ │ │ +
│ │ │ + │ │ │ +
368 {
│ │ │ +
369 assert(count <= size());
│ │ │ + │ │ │ +
371 }
│ │ │ +
│ │ │ +
372
│ │ │ +
│ │ │ + │ │ │ +
375 {
│ │ │ +
376 assert(count <= size());
│ │ │ +
377 return span<element_type, Std::dynamic_extent>{data()+ (size() - count), count};
│ │ │ +
378 }
│ │ │ +
│ │ │ +
379
│ │ │ +
381
│ │ │ +
│ │ │ + │ │ │ +
386 {
│ │ │ +
387 assert(offset <= size() && (count == Std::dynamic_extent || count <= size() - offset));
│ │ │ + │ │ │ +
389 data() + offset, count == Std::dynamic_extent ? size() - offset : count};
│ │ │ +
390 }
│ │ │ +
│ │ │ +
391
│ │ │ +
393
│ │ │ +
394
│ │ │ +
397
│ │ │ +
399 using base_type::size;
│ │ │ +
400
│ │ │ +
402 constexpr size_type size_bytes () const noexcept { return size() * sizeof(element_type); }
│ │ │ +
403
│ │ │ +
405 [[nodiscard]] constexpr bool empty () const noexcept { return size() == 0; }
│ │ │ +
406
│ │ │ +
408
│ │ │ +
409private:
│ │ │ +
410 pointer data_;
│ │ │ +
411};
│ │ │ +
│ │ │ +
412
│ │ │ +
413// deduction guide
│ │ │ +
414// @{
│ │ │ +
415
│ │ │ +
416template <class T, std::size_t N>
│ │ │ +
417span (T (&)[N])
│ │ │ +
418 -> span<T, N>;
│ │ │ +
419
│ │ │ +
420template <class ElementType, class I, std::size_t Extent,
│ │ │ +
421 std::enable_if_t<std::is_convertible_v<I,std::size_t>, int> = 0>
│ │ │ +
422span (ElementType*, std::integral_constant<I,Extent>)
│ │ │ + │ │ │ +
424
│ │ │ +
425template <class ElementType, class I,
│ │ │ +
426 std::enable_if_t<std::is_integral_v<I>, int> = 0,
│ │ │ +
427 std::enable_if_t<std::is_convertible_v<I,std::size_t>, int> = 0>
│ │ │ +
428span (ElementType*, I)
│ │ │ + │ │ │ +
430
│ │ │ +
431template <class Iter,
│ │ │ +
432 class Element = std::remove_reference_t<decltype(*std::declval<Iter>())>>
│ │ │ +
433span (Iter,Iter)
│ │ │ + │ │ │ +
435
│ │ │ +
436template <class Range,
│ │ │ +
437 class First = decltype(std::begin(std::declval<Range>())),
│ │ │ +
438 class Last = decltype(std::end(std::declval<Range>())),
│ │ │ +
439 class Element = std::remove_reference_t<decltype(*std::declval<First>())>>
│ │ │ +
440span (Range&)
│ │ │ + │ │ │ +
442
│ │ │ +
443template <class T, size_t N>
│ │ │ +
444span (std::array<T, N>&) -> span<T, N>;
│ │ │ +
445
│ │ │ +
446template <class T, size_t N>
│ │ │ +
447span (const std::array<T, N>&) -> span<const T, N>;
│ │ │ +
448
│ │ │ +
449// @}
│ │ │ +
450
│ │ │ +
451} // end namespace Dune::Std
│ │ │ +
452
│ │ │ +
453#endif // DUNE_COMMON_STD_SPAN_HH
│ │ │ + │ │ │ +
A few common exception classes.
│ │ │ +
static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from >, std::integral_constant< T, to >) noexcept
Definition rangeutilities.hh:312
│ │ │
STL namespace.
│ │ │ -
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ -
constexpr auto makeTupleVector(T &&... t)
Definition tuplevector.hh:92
│ │ │ -
A class augmenting std::tuple by element access via operator[].
Definition tuplevector.hh:35
│ │ │ -
static constexpr std::size_t size()
Number of elements of the tuple.
Definition tuplevector.hh:83
│ │ │ -
constexpr TupleVector(TT &&... tt)
Construct from a set of arguments.
Definition tuplevector.hh:55
│ │ │ -
constexpr TupleVector()
Default constructor.
Definition tuplevector.hh:61
│ │ │ -
typename std::tuple_element< i, std::tuple< Args... > >::type type
Definition tuplevector.hh:112
│ │ │ +
Namespace for features backported from new C++ standards.
Definition default_accessor.hh:10
│ │ │ +
constexpr auto to_address(T &&p) noexcept
Obtain the address represented by p without forming a reference to the object pointed to by p.
Definition memory.hh:47
│ │ │ +
constexpr std::size_t dynamic_extent
A constant of type std::size_t that is used to differentiate std::span of static and dynamic extent.
Definition span.hh:26
│ │ │ +
A contiguous sequence of elements with static or dynamic extent.
Definition span.hh:126
│ │ │ +
std::ptrdiff_t difference_type
Definition span.hh:135
│ │ │ +
const element_type & const_reference
Definition span.hh:138
│ │ │ +
constexpr reference front() const
Access the first element.
Definition span.hh:291
│ │ │ +
element_type & reference
Definition span.hh:137
│ │ │ +
constexpr span(const span &other) noexcept=default
Copy constructor.
│ │ │ +
pointer iterator
Definition span.hh:139
│ │ │ +
static constexpr size_type extent
Definition span.hh:150
│ │ │ +
constexpr iterator begin() const noexcept
Returns an iterator to the beginning.
Definition span.hh:261
│ │ │ +
constexpr const_iterator cbegin() const noexcept
Returns an iterator to the beginning.
Definition span.hh:267
│ │ │ +
constexpr span(std::array< T, N > &arr) noexcept
Constructs a span that is a view over the array.
Definition span.hh:211
│ │ │ +
std::reverse_iterator< iterator > reverse_iterator
Definition span.hh:140
│ │ │ +
constexpr iterator end() const noexcept
Returns an iterator to the end.
Definition span.hh:264
│ │ │ +
constexpr span< element_type, Std::dynamic_extent > subspan(size_type offset, size_type count=Std::dynamic_extent) const
Obtains a subspan consisting of count elements of the sequence starting at offset.
Definition span.hh:385
│ │ │ +
constexpr span & operator=(const span &other) noexcept=default
Copy assignment operator.
│ │ │ +
std::size_t size_type
Definition span.hh:134
│ │ │ +
element_type * pointer
Definition span.hh:136
│ │ │ +
constexpr reference at(size_type i) const
Access specified element with bounds checking.
Definition span.hh:305
│ │ │ +
std::remove_cv_t< element_type > value_type
Definition span.hh:133
│ │ │ +
constexpr span< element_type, Std::dynamic_extent > first(size_type count) const
Obtains a subspan consisting of the first count elements of the sequence.
Definition span.hh:367
│ │ │ +
constexpr span< element_type, subspan_extent(Offset, Count)> subspan() const
Obtains a subspan consisting of Count elements of the sequence starting at Offset.
Definition span.hh:358
│ │ │ +
const iterator const_iterator
Definition span.hh:145
│ │ │ +
constexpr const_reverse_iterator crend() const noexcept
Returns a reverse iterator ending at the beginning.
Definition span.hh:282
│ │ │ +
constexpr reverse_iterator rend() const noexcept
Returns a reverse iterator ending at the beginning.
Definition span.hh:276
│ │ │ +
constexpr pointer data() const noexcept
Direct access to the underlying contiguous storage.
Definition span.hh:316
│ │ │ +
constexpr size_type size_bytes() const noexcept
Returns the size of the sequence in bytes.
Definition span.hh:402
│ │ │ +
constexpr const_reverse_iterator crbegin() const noexcept
Returns a reverse iterator starting at the end.
Definition span.hh:279
│ │ │ +
Element element_type
Definition span.hh:132
│ │ │ +
constexpr bool empty() const noexcept
Checks if the sequence is empty.
Definition span.hh:405
│ │ │ +
constexpr span< element_type, Count > last() const
Obtains a subspan consisting of the last Count elements of the sequence.
Definition span.hh:335
│ │ │ +
constexpr span(Range &range)
Constructs a span that is a view over the range [range.begin(), range.end())
Definition span.hh:195
│ │ │ +
constexpr reverse_iterator rbegin() const noexcept
Returns a reverse iterator starting at the end.
Definition span.hh:273
│ │ │ +
constexpr span< element_type, Std::dynamic_extent > last(size_type count) const
Obtains a subspan consisting of the last count elements of the sequence.
Definition span.hh:374
│ │ │ +
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition span.hh:146
│ │ │ +
constexpr const_iterator cend() const noexcept
Returns an iterator to the end.
Definition span.hh:270
│ │ │ +
constexpr span< element_type, Count > first() const
Obtains a subspan consisting of the first Count elements of the sequence.
Definition span.hh:326
│ │ │ +
constexpr reference back() const
Access the last element.
Definition span.hh:298
│ │ │ +
constexpr span(const std::array< T, N > &arr) noexcept
Constructs a span that is a view over the const array.
Definition span.hh:220
│ │ │ +
constexpr reference operator[](size_type i) const
Access specified element.
Definition span.hh:313
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,143 +1,563 @@ │ │ │ │ dune-common 2.10 │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ * _d_u_n_e │ │ │ │ * _c_o_m_m_o_n │ │ │ │ -tuplevector.hh │ │ │ │ + * _s_t_d │ │ │ │ +span.hh │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ LICENSE.md in module root │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ -5#ifndef DUNE_COMMON_TUPLEVECTOR_HH │ │ │ │ -6#define DUNE_COMMON_TUPLEVECTOR_HH │ │ │ │ +5#ifndef DUNE_COMMON_STD_SPAN_HH │ │ │ │ +6#define DUNE_COMMON_STD_SPAN_HH │ │ │ │ 7 │ │ │ │ -8#include │ │ │ │ -9#include │ │ │ │ -10 │ │ │ │ -11#include <_d_u_n_e_/_c_o_m_m_o_n_/_i_n_d_i_c_e_s_._h_h> │ │ │ │ -12#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ -13#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_t_y_p_e___t_r_a_i_t_s_._h_h> │ │ │ │ -14 │ │ │ │ -15 │ │ │ │ -16 │ │ │ │ -23namespace _D_u_n_e │ │ │ │ -24{ │ │ │ │ -25 │ │ │ │ -26 │ │ │ │ +8#include │ │ │ │ +9#include │ │ │ │ +10#include │ │ │ │ +11#include │ │ │ │ +12#include │ │ │ │ +13#include │ │ │ │ +14#include │ │ │ │ +15#include │ │ │ │ +16#if __has_include() │ │ │ │ +17 #include │ │ │ │ +18#endif │ │ │ │ +19 │ │ │ │ +20#include <_d_u_n_e_/_c_o_m_m_o_n_/_e_x_c_e_p_t_i_o_n_s_._h_h> │ │ │ │ +21#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_m_e_m_o_r_y_._h_h> │ │ │ │ +22 │ │ │ │ +23namespace _D_u_n_e_:_:_S_t_d { │ │ │ │ +24 │ │ │ │ +_2_6inline constexpr std::size_t _d_y_n_a_m_i_c___e_x_t_e_n_t = std::numeric_limits::max(); │ │ │ │ 27 │ │ │ │ -33template │ │ │ │ -_3_4class _T_u_p_l_e_V_e_c_t_o_r : public std::tuple │ │ │ │ -35{ │ │ │ │ -36 using Base = std::tuple; │ │ │ │ -37 │ │ │ │ -38 template │ │ │ │ -39 using TupleConstructorDetector = decltype(Base(std::declval()...)); │ │ │ │ -40 │ │ │ │ -41 template │ │ │ │ -42 using hasTupleConstructor = _D_u_n_e_:_:_S_t_d_:_:_i_s___d_e_t_e_c_t_e_d; │ │ │ │ +28namespace Impl { │ │ │ │ +29 │ │ │ │ +30template │ │ │ │ +31class SpanSize │ │ │ │ +32{ │ │ │ │ +33public: │ │ │ │ +34 using size_type = std::size_t; │ │ │ │ +35 │ │ │ │ +36public: │ │ │ │ +37 constexpr SpanSize () = default; │ │ │ │ +38 │ │ │ │ +39 constexpr SpanSize ([[maybe_unused]] size_type size) noexcept │ │ │ │ +40 { │ │ │ │ +41 assert(Extent == _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t || Extent == size); │ │ │ │ +42 } │ │ │ │ 43 │ │ │ │ -44 │ │ │ │ -45public: │ │ │ │ -46 │ │ │ │ -53 template::value, int> = 0> │ │ │ │ -_5_5 constexpr _T_u_p_l_e_V_e_c_t_o_r(TT&&... tt) : │ │ │ │ -56 Base(_s_t_d::forward(tt)...) │ │ │ │ -57 {} │ │ │ │ +44 template │ │ │ │ +45 constexpr SpanSize ([[maybe_unused]] Iter first, [[maybe_unused]] Iter last) │ │ │ │ +noexcept │ │ │ │ +46 { │ │ │ │ +47 assert((std::distance(first,last) == Extent)); │ │ │ │ +48 } │ │ │ │ +49 │ │ │ │ +50 constexpr size_type size () const noexcept { return Extent; } │ │ │ │ +51}; │ │ │ │ +52 │ │ │ │ +53template <> │ │ │ │ +54class SpanSize │ │ │ │ +55{ │ │ │ │ +56public: │ │ │ │ +57 using size_type = std::size_t; │ │ │ │ 58 │ │ │ │ -_6_1 constexpr _T_u_p_l_e_V_e_c_t_o_r() │ │ │ │ +59public: │ │ │ │ +60 constexpr SpanSize (size_type size = 0) noexcept │ │ │ │ +61 : size_(size) │ │ │ │ 62 {} │ │ │ │ 63 │ │ │ │ -66 template = 0> │ │ │ │ -_6_8 constexpr decltype(auto) operator[](const _D_u_n_e_:_:_i_n_d_e_x___c_o_n_s_t_a_n_t_<_i_>&) const │ │ │ │ -69 { │ │ │ │ -70 return std::get(*this); │ │ │ │ -71 } │ │ │ │ -72 │ │ │ │ -75 template = 0> │ │ │ │ -_7_7 decltype(auto) operator[](const _D_u_n_e_:_:_i_n_d_e_x___c_o_n_s_t_a_n_t_<_i_>&) │ │ │ │ -78 { │ │ │ │ -79 return std::get(*this); │ │ │ │ -80 } │ │ │ │ -81 │ │ │ │ -_8_3 static constexpr std::size_t _s_i_z_e() │ │ │ │ -84 { │ │ │ │ -85 return std::tuple_size::value; │ │ │ │ -86 } │ │ │ │ -87}; │ │ │ │ -88 │ │ │ │ -89 │ │ │ │ -90 │ │ │ │ -91template │ │ │ │ -_9_2constexpr auto _m_a_k_e_T_u_p_l_e_V_e_c_t_o_r(T&&... t) │ │ │ │ -93{ │ │ │ │ -94 // The std::decay_t is is a slight simplification, │ │ │ │ -95 // because std::reference_wrapper needs special care. │ │ │ │ -96 return _T_u_p_l_e_V_e_c_t_o_r_<_s_t_d_:_:_d_e_c_a_y___t_<_T_>...>(std::forward(t)...); │ │ │ │ -97} │ │ │ │ -98 │ │ │ │ -99 │ │ │ │ -100 │ │ │ │ -101} // namespace Dune │ │ │ │ -102 │ │ │ │ -103namespace _s_t_d │ │ │ │ -104{ │ │ │ │ -109 template │ │ │ │ -_1_1_0 struct tuple_element > │ │ │ │ -111 { │ │ │ │ -_1_1_2 using _t_y_p_e = typename std::tuple_element >::type; │ │ │ │ -113 }; │ │ │ │ -114 │ │ │ │ -119 template │ │ │ │ -_1_2_0 struct tuple_size<_D_u_n_e::TupleVector > │ │ │ │ -121 : std::integral_constant │ │ │ │ -122 {}; │ │ │ │ -123} │ │ │ │ -124 │ │ │ │ -125#endif // DUNE_COMMON_TUPLEVECTOR_HH │ │ │ │ -_t_y_p_e_t_r_a_i_t_s_._h_h │ │ │ │ -Traits for type conversions and type information. │ │ │ │ -_t_y_p_e___t_r_a_i_t_s_._h_h │ │ │ │ -_i_n_d_i_c_e_s_._h_h │ │ │ │ -_D_u_n_e_:_:_i_n_d_e_x___c_o_n_s_t_a_n_t │ │ │ │ -std::integral_constant< std::size_t, i > index_constant │ │ │ │ -An index constant with value i. │ │ │ │ -DDeeffiinniittiioonn indices.hh:29 │ │ │ │ -_D_u_n_e_:_:_S_t_d_:_:_i_s___d_e_t_e_c_t_e_d │ │ │ │ -typename detected_or< nonesuch, Op, Args... >::value_t is_detected │ │ │ │ -Detects whether Op is valid. │ │ │ │ -DDeeffiinniittiioonn type_traits.hh:145 │ │ │ │ +64 template │ │ │ │ +65 constexpr SpanSize (Iter first, Iter last) noexcept │ │ │ │ +66 : size_(std::distance(first,last)) │ │ │ │ +67 {} │ │ │ │ +68 │ │ │ │ +69 constexpr size_type size () const noexcept { return size_; } │ │ │ │ +70 │ │ │ │ +71private: │ │ │ │ +72 size_type size_; │ │ │ │ +73}; │ │ │ │ +74 │ │ │ │ +75template │ │ │ │ +76struct TypeIdentity { using type = T; }; │ │ │ │ +77 │ │ │ │ +78template │ │ │ │ +79using TypeIdentity_t = typename TypeIdentity::type; │ │ │ │ +80 │ │ │ │ +81} // end namespace Impl │ │ │ │ +82 │ │ │ │ +83 │ │ │ │ +123template │ │ │ │ +_1_2_4class _s_p_a_n │ │ │ │ +125 : public Impl::SpanSize │ │ │ │ +126{ │ │ │ │ +127 using base_type = Impl::SpanSize; // base_type implements the │ │ │ │ +member variable size() │ │ │ │ +128 │ │ │ │ +129 static_assert(std::is_object_v && !std::is_abstract_v); │ │ │ │ +130 │ │ │ │ +131public: │ │ │ │ +_1_3_2 using _e_l_e_m_e_n_t___t_y_p_e = Element; │ │ │ │ +_1_3_3 using _v_a_l_u_e___t_y_p_e = std::remove_cv_t; │ │ │ │ +_1_3_4 using _s_i_z_e___t_y_p_e = std::size_t; │ │ │ │ +_1_3_5 using _d_i_f_f_e_r_e_n_c_e___t_y_p_e = std::ptrdiff_t; │ │ │ │ +_1_3_6 using _p_o_i_n_t_e_r = _e_l_e_m_e_n_t___t_y_p_e*; │ │ │ │ +_1_3_7 using _r_e_f_e_r_e_n_c_e = _e_l_e_m_e_n_t___t_y_p_e&; │ │ │ │ +_1_3_8 using _c_o_n_s_t___r_e_f_e_r_e_n_c_e = const _e_l_e_m_e_n_t___t_y_p_e&; │ │ │ │ +_1_3_9 using _i_t_e_r_a_t_o_r = _p_o_i_n_t_e_r; │ │ │ │ +_1_4_0 using _r_e_v_e_r_s_e___i_t_e_r_a_t_o_r = std::reverse_iterator; │ │ │ │ +141#if __cpp_lib_ranges_as_const >202311L │ │ │ │ +142 using _c_o_n_s_t___i_t_e_r_a_t_o_r = std::const_iterator; │ │ │ │ +143 using _c_o_n_s_t___r_e_v_e_r_s_e___i_t_e_r_a_t_o_r = std::const_iterator; │ │ │ │ +144#else │ │ │ │ +_1_4_5 using _c_o_n_s_t___i_t_e_r_a_t_o_r = const _i_t_e_r_a_t_o_r; │ │ │ │ +_1_4_6 using _c_o_n_s_t___r_e_v_e_r_s_e___i_t_e_r_a_t_o_r = std::reverse_iterator; │ │ │ │ +147#endif │ │ │ │ +148 │ │ │ │ +149 │ │ │ │ +_1_5_0 static constexpr _s_i_z_e___t_y_p_e _e_x_t_e_n_t = Extent; │ │ │ │ +151 │ │ │ │ +152public: │ │ │ │ +155 │ │ │ │ +157 template = 0> │ │ │ │ +_1_5_9 constexpr _s_p_a_n () noexcept │ │ │ │ +160 : base_type{} │ │ │ │ +161 , data_{} │ │ │ │ +162 {} │ │ │ │ +163 │ │ │ │ +165 template ())>, │ │ │ │ +167 std::enable_if_t, int> = │ │ │ │ +0> │ │ │ │ +168 #if __cpp_conditional_explicit >= 201806L │ │ │ │ +169 explicit(_e_x_t_e_n_t != _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t) │ │ │ │ +170 #endif │ │ │ │ +_1_7_1 constexpr _s_p_a_n (Iter _f_i_r_s_t, _s_i_z_e___t_y_p_e size) │ │ │ │ +172 : base_type(size) │ │ │ │ +173 , data_(_S_t_d_:_:_t_o___a_d_d_r_e_s_s(_f_i_r_s_t)) │ │ │ │ +174 {} │ │ │ │ +175 │ │ │ │ +177 template ())>, │ │ │ │ +179 std::enable_if_t, int> = │ │ │ │ +0> │ │ │ │ +180 #if __cpp_conditional_explicit >= 201806L │ │ │ │ +181 explicit(_e_x_t_e_n_t != _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t) │ │ │ │ +182 #endif │ │ │ │ +_1_8_3 constexpr _s_p_a_n (Iter _f_i_r_s_t, Iter _l_a_s_t) │ │ │ │ +184 : base_type(_f_i_r_s_t,_l_a_s_t) │ │ │ │ +185 , data_(_S_t_d_:_:_t_o___a_d_d_r_e_s_s(_f_i_r_s_t)) │ │ │ │ +186 {} │ │ │ │ +187 │ │ │ │ +189 template ()), std::end(std::declval │ │ │ │ +()), bool{}) = true, │ │ │ │ +191 std::enable_if_t, int> = 0> │ │ │ │ +192 #if __cpp_conditional_explicit >= 201806L │ │ │ │ +193 explicit(_e_x_t_e_n_t != _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t) │ │ │ │ +194 #endif │ │ │ │ +_1_9_5 constexpr _s_p_a_n (Range& _r_a_n_g_e) │ │ │ │ +196 : _s_p_a_n(_s_t_d::_b_e_g_i_n(_r_a_n_g_e), _s_t_d::_e_n_d(_r_a_n_g_e)) │ │ │ │ +197 {} │ │ │ │ +198 │ │ │ │ +200 template = 0> │ │ │ │ +_2_0_2 constexpr _s_p_a_n (Impl::TypeIdentity_t (&_d_a_t_a)[N]) noexcept │ │ │ │ +203 : base_type(N) │ │ │ │ +204 , data_(_d_a_t_a) │ │ │ │ +205 {} │ │ │ │ +206 │ │ │ │ +208 template = 0, │ │ │ │ +210 std::enable_if_t, int> = │ │ │ │ +0> │ │ │ │ +_2_1_1 constexpr _s_p_a_n (std::array& arr) noexcept │ │ │ │ +212 : base_type(N) │ │ │ │ +213 , data_(arr.data()) │ │ │ │ +214 {} │ │ │ │ +215 │ │ │ │ +217 template = 0, │ │ │ │ +219 std::enable_if_t, │ │ │ │ +int> = 0> │ │ │ │ +_2_2_0 constexpr _s_p_a_n (const std::array& arr) noexcept │ │ │ │ +221 : base_type(N) │ │ │ │ +222 , data_(arr.data()) │ │ │ │ +223 {} │ │ │ │ +224 │ │ │ │ +226 template , int> = 0> │ │ │ │ +228 #if __cpp_conditional_explicit >= 201806L │ │ │ │ +229 explicit(_e_x_t_e_n_t != _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t) │ │ │ │ +230 #endif │ │ │ │ +_2_3_1 constexpr _s_p_a_n (std::initializer_list il) │ │ │ │ +232 : base_type(il.size()) │ │ │ │ +233 , data_(il.begin()) │ │ │ │ +234 {} │ │ │ │ +235 │ │ │ │ +_2_3_7 constexpr _s_p_a_n (const _s_p_a_n& other) noexcept = default; │ │ │ │ +238 │ │ │ │ +240 template = 0, │ │ │ │ +242 std::enable_if_t, int> = 0> │ │ │ │ +243 #if __cpp_conditional_explicit >= 201806L │ │ │ │ +244 explicit(_e_x_t_e_n_t != _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t && OtherExtent == _S_t_d_:_: │ │ │ │ +_d_y_n_a_m_i_c___e_x_t_e_n_t) │ │ │ │ +245 #endif │ │ │ │ +_2_4_6 constexpr _s_p_a_n (const _s_p_a_n_<_O_t_h_e_r_E_l_e_m_e_n_t_T_y_p_e_,_ _O_t_h_e_r_E_x_t_e_n_t_>& s) noexcept │ │ │ │ +247 : base_type(s.size()) │ │ │ │ +248 , data_(s._d_a_t_a()) │ │ │ │ +249 {} │ │ │ │ +250 │ │ │ │ +_2_5_2 constexpr _s_p_a_n& _o_p_e_r_a_t_o_r_=_ (const _s_p_a_n& other) noexcept = default; │ │ │ │ +253 │ │ │ │ +255 │ │ │ │ +256 │ │ │ │ +259 │ │ │ │ +_2_6_1 constexpr _i_t_e_r_a_t_o_r _b_e_g_i_n () const noexcept { return data_; } │ │ │ │ +262 │ │ │ │ +_2_6_4 constexpr _i_t_e_r_a_t_o_r _e_n_d () const noexcept { return data_ + size(); } │ │ │ │ +265 │ │ │ │ +_2_6_7 constexpr _c_o_n_s_t___i_t_e_r_a_t_o_r _c_b_e_g_i_n () const noexcept { return data_; } │ │ │ │ +268 │ │ │ │ +_2_7_0 constexpr _c_o_n_s_t___i_t_e_r_a_t_o_r _c_e_n_d () const noexcept { return data_ + size(); } │ │ │ │ +271 │ │ │ │ +_2_7_3 constexpr _r_e_v_e_r_s_e___i_t_e_r_a_t_o_r _r_b_e_g_i_n() const noexcept { return │ │ │ │ +_r_e_v_e_r_s_e___i_t_e_r_a_t_o_r{_e_n_d()}; } │ │ │ │ +274 │ │ │ │ +_2_7_6 constexpr _r_e_v_e_r_s_e___i_t_e_r_a_t_o_r _r_e_n_d() const noexcept { return _r_e_v_e_r_s_e___i_t_e_r_a_t_o_r │ │ │ │ +{_b_e_g_i_n()}; } │ │ │ │ +277 │ │ │ │ +_2_7_9 constexpr _c_o_n_s_t___r_e_v_e_r_s_e___i_t_e_r_a_t_o_r _c_r_b_e_g_i_n() const noexcept { return │ │ │ │ +_r_e_v_e_r_s_e___i_t_e_r_a_t_o_r{_e_n_d()}; } │ │ │ │ +280 │ │ │ │ +_2_8_2 constexpr _c_o_n_s_t___r_e_v_e_r_s_e___i_t_e_r_a_t_o_r _c_r_e_n_d() const noexcept { return │ │ │ │ +_r_e_v_e_r_s_e___i_t_e_r_a_t_o_r{_b_e_g_i_n()}; } │ │ │ │ +283 │ │ │ │ +285 │ │ │ │ +286 │ │ │ │ +289 │ │ │ │ +_2_9_1 constexpr _r_e_f_e_r_e_n_c_e _f_r_o_n_t () const │ │ │ │ +292 { │ │ │ │ +293 assert(not _e_m_p_t_y() && "front of empty span does not exist"); │ │ │ │ +294 return data_[0]; │ │ │ │ +295 } │ │ │ │ +296 │ │ │ │ +_2_9_8 constexpr _r_e_f_e_r_e_n_c_e _b_a_c_k () const │ │ │ │ +299 { │ │ │ │ +300 assert(not _e_m_p_t_y() && "front of empty span does not exist"); │ │ │ │ +301 return data_[size()-1]; │ │ │ │ +302 } │ │ │ │ +303 │ │ │ │ +_3_0_5 constexpr _r_e_f_e_r_e_n_c_e _a_t (_s_i_z_e___t_y_p_e i) const │ │ │ │ +306 { │ │ │ │ +307 if (i >= size()) │ │ │ │ +308 throw std::out_of_range("Index " + std::to_string(i) + " out of range."); │ │ │ │ +309 return data_[i]; │ │ │ │ +310 } │ │ │ │ +311 │ │ │ │ +_3_1_3 constexpr _r_e_f_e_r_e_n_c_e _o_p_e_r_a_t_o_r_[_]_ (_s_i_z_e___t_y_p_e i) const { return data_[i]; } │ │ │ │ +314 │ │ │ │ +_3_1_6 constexpr _p_o_i_n_t_e_r _d_a_t_a () const noexcept { return data_; } │ │ │ │ +317 │ │ │ │ +319 │ │ │ │ +320 │ │ │ │ +323 │ │ │ │ +325 template │ │ │ │ +_3_2_6 constexpr _s_p_a_n_<_e_l_e_m_e_n_t___t_y_p_e_,_ _C_o_u_n_t_> _f_i_r_s_t () const │ │ │ │ +327 { │ │ │ │ +328 static_assert(Count <= Extent); │ │ │ │ +329 assert(Count <= size()); │ │ │ │ +330 return _s_p_a_n_<_e_l_e_m_e_n_t___t_y_p_e_,_ _C_o_u_n_t_>{_d_a_t_a(), Count}; │ │ │ │ +331 } │ │ │ │ +332 │ │ │ │ +334 template │ │ │ │ +_3_3_5 constexpr _s_p_a_n_<_e_l_e_m_e_n_t___t_y_p_e_,_ _C_o_u_n_t_> _l_a_s_t () const │ │ │ │ +336 { │ │ │ │ +337 static_assert(Count <= Extent); │ │ │ │ +338 assert(Count <= size()); │ │ │ │ +339 return _s_p_a_n_<_e_l_e_m_e_n_t___t_y_p_e_,_ _C_o_u_n_t_>{_d_a_t_a()+ (size() - Count), Count}; │ │ │ │ +340 } │ │ │ │ +341 │ │ │ │ +342private: │ │ │ │ +343 │ │ │ │ +344 static constexpr std::size_t subspan_extent (std::size_t O, std::size_t C) │ │ │ │ +noexcept │ │ │ │ +345 { │ │ │ │ +346 return (C != _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t) ? C : │ │ │ │ +347 (Extent != _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t) ? Extent - O : Std::_d_y_n_a_m_i_c___e_x_t_e_n_t; │ │ │ │ +348 } │ │ │ │ +349 │ │ │ │ +350public: │ │ │ │ +351 │ │ │ │ +353 │ │ │ │ +357 template │ │ │ │ +_3_5_8 constexpr _s_p_a_n<_e_l_e_m_e_n_t___t_y_p_e, subspan_extent(Offset,Count)> _s_u_b_s_p_a_n () const │ │ │ │ +359 { │ │ │ │ +360 static_assert(Offset <= Extent && (Count == _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t || Count <= │ │ │ │ +Extent - Offset)); │ │ │ │ +361 assert(Offset <= size() && (Count == _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t || Count <= size() │ │ │ │ +- Offset)); │ │ │ │ +362 return _s_p_a_n<_e_l_e_m_e_n_t___t_y_p_e, subspan_extent(Offset,Count)>{ │ │ │ │ +363 _d_a_t_a() + Offset, Count != _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t ? Count : size() - Offset}; │ │ │ │ +364 } │ │ │ │ +365 │ │ │ │ +_3_6_7 constexpr _s_p_a_n_<_e_l_e_m_e_n_t___t_y_p_e_,_ _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t_> _f_i_r_s_t (_s_i_z_e___t_y_p_e count) │ │ │ │ +const │ │ │ │ +368 { │ │ │ │ +369 assert(count <= size()); │ │ │ │ +370 return _s_p_a_n_<_e_l_e_m_e_n_t___t_y_p_e_,_ _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t_>{_d_a_t_a(), count}; │ │ │ │ +371 } │ │ │ │ +372 │ │ │ │ +_3_7_4 constexpr _s_p_a_n_<_e_l_e_m_e_n_t___t_y_p_e_,_ _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t_> _l_a_s_t (_s_i_z_e___t_y_p_e count) │ │ │ │ +const │ │ │ │ +375 { │ │ │ │ +376 assert(count <= size()); │ │ │ │ +377 return _s_p_a_n_<_e_l_e_m_e_n_t___t_y_p_e_,_ _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t_>{_d_a_t_a()+ (size() - count), │ │ │ │ +count}; │ │ │ │ +378 } │ │ │ │ +379 │ │ │ │ +381 │ │ │ │ +_3_8_5 constexpr _s_p_a_n_<_e_l_e_m_e_n_t___t_y_p_e_,_ _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t_> _s_u_b_s_p_a_n (_s_i_z_e___t_y_p_e │ │ │ │ +offset, _s_i_z_e___t_y_p_e count = _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t) const │ │ │ │ +386 { │ │ │ │ +387 assert(offset <= size() && (count == _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t || count <= size() │ │ │ │ +- offset)); │ │ │ │ +388 return _s_p_a_n_<_e_l_e_m_e_n_t___t_y_p_e_,_ _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t_>{ │ │ │ │ +389 _d_a_t_a() + offset, count == _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t ? size() - offset : count}; │ │ │ │ +390 } │ │ │ │ +391 │ │ │ │ +393 │ │ │ │ +394 │ │ │ │ +397 │ │ │ │ +399 using base_type::size; │ │ │ │ +400 │ │ │ │ +_4_0_2 constexpr _s_i_z_e___t_y_p_e _s_i_z_e___b_y_t_e_s () const noexcept { return size() * sizeof │ │ │ │ +(_e_l_e_m_e_n_t___t_y_p_e); } │ │ │ │ +403 │ │ │ │ +_4_0_5 [[nodiscard]] constexpr bool _e_m_p_t_y () const noexcept { return size() == 0; │ │ │ │ +} │ │ │ │ +406 │ │ │ │ +408 │ │ │ │ +409private: │ │ │ │ +410 _p_o_i_n_t_e_r data_; │ │ │ │ +411}; │ │ │ │ +412 │ │ │ │ +413// deduction guide │ │ │ │ +414// @{ │ │ │ │ +415 │ │ │ │ +416template │ │ │ │ +_4_1_7_s_p_a_n (T (&)[N]) │ │ │ │ +418 -> _s_p_a_n_<_T_,_ _N_>; │ │ │ │ +419 │ │ │ │ +420template , int> = 0> │ │ │ │ +_4_2_2_s_p_a_n (ElementType*, std::integral_constant) │ │ │ │ +423 -> _s_p_a_n_<_E_l_e_m_e_n_t_T_y_p_e_,_ _E_x_t_e_n_t_>; │ │ │ │ +424 │ │ │ │ +425template , int> = 0, │ │ │ │ +427 std::enable_if_t, int> = 0> │ │ │ │ +_4_2_8_s_p_a_n (ElementType*, I) │ │ │ │ +429 -> _s_p_a_n_<_E_l_e_m_e_n_t_T_y_p_e_,_ _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t_>; │ │ │ │ +430 │ │ │ │ +431template ())>> │ │ │ │ +_4_3_3_s_p_a_n (Iter,Iter) │ │ │ │ +434 -> _s_p_a_n_<_E_l_e_m_e_n_t_,_ _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t_>; │ │ │ │ +435 │ │ │ │ +436template ())), │ │ │ │ +438 class Last = decltype(std::end(std::declval())), │ │ │ │ +439 class Element = std::remove_reference_t())>> │ │ │ │ +_4_4_0_s_p_a_n (Range&) │ │ │ │ +441 -> _s_p_a_n_<_E_l_e_m_e_n_t_,_ _S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t_>; │ │ │ │ +442 │ │ │ │ +443template │ │ │ │ +_4_4_4_s_p_a_n (std::array&) -> _s_p_a_n_<_T_,_ _N_>; │ │ │ │ +445 │ │ │ │ +446template │ │ │ │ +_4_4_7_s_p_a_n (const std::array&) -> _s_p_a_n_<_c_o_n_s_t_ _T_,_ _N_>; │ │ │ │ +448 │ │ │ │ +449// @} │ │ │ │ +450 │ │ │ │ +451} // end namespace Dune::Std │ │ │ │ +452 │ │ │ │ +453#endif // DUNE_COMMON_STD_SPAN_HH │ │ │ │ +_m_e_m_o_r_y_._h_h │ │ │ │ +_e_x_c_e_p_t_i_o_n_s_._h_h │ │ │ │ +A few common exception classes. │ │ │ │ +_D_u_n_e_:_:_r_a_n_g_e │ │ │ │ +static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from │ │ │ │ +>, std::integral_constant< T, to >) noexcept │ │ │ │ +DDeeffiinniittiioonn rangeutilities.hh:312 │ │ │ │ _s_t_d │ │ │ │ STL namespace. │ │ │ │ -_D_u_n_e │ │ │ │ -Dune namespace. │ │ │ │ -DDeeffiinniittiioonn alignedallocator.hh:13 │ │ │ │ -_D_u_n_e_:_:_m_a_k_e_T_u_p_l_e_V_e_c_t_o_r │ │ │ │ -constexpr auto makeTupleVector(T &&... t) │ │ │ │ -DDeeffiinniittiioonn tuplevector.hh:92 │ │ │ │ -_D_u_n_e_:_:_T_u_p_l_e_V_e_c_t_o_r │ │ │ │ -A class augmenting std::tuple by element access via operator[]. │ │ │ │ -DDeeffiinniittiioonn tuplevector.hh:35 │ │ │ │ -_D_u_n_e_:_:_T_u_p_l_e_V_e_c_t_o_r_:_:_s_i_z_e │ │ │ │ -static constexpr std::size_t size() │ │ │ │ -Number of elements of the tuple. │ │ │ │ -DDeeffiinniittiioonn tuplevector.hh:83 │ │ │ │ -_D_u_n_e_:_:_T_u_p_l_e_V_e_c_t_o_r_:_:_T_u_p_l_e_V_e_c_t_o_r │ │ │ │ -constexpr TupleVector(TT &&... tt) │ │ │ │ -Construct from a set of arguments. │ │ │ │ -DDeeffiinniittiioonn tuplevector.hh:55 │ │ │ │ -_D_u_n_e_:_:_T_u_p_l_e_V_e_c_t_o_r_:_:_T_u_p_l_e_V_e_c_t_o_r │ │ │ │ -constexpr TupleVector() │ │ │ │ -Default constructor. │ │ │ │ -DDeeffiinniittiioonn tuplevector.hh:61 │ │ │ │ -_s_t_d_:_:_t_u_p_l_e___e_l_e_m_e_n_t_<_ _i_,_ _D_u_n_e_:_:_T_u_p_l_e_V_e_c_t_o_r_<_ _A_r_g_s_._._._ _>_ _>_:_:_t_y_p_e │ │ │ │ -typename std::tuple_element< i, std::tuple< Args... > >::type type │ │ │ │ -DDeeffiinniittiioonn tuplevector.hh:112 │ │ │ │ +_D_u_n_e_:_:_S_t_d │ │ │ │ +Namespace for features backported from new C++ standards. │ │ │ │ +DDeeffiinniittiioonn default_accessor.hh:10 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_t_o___a_d_d_r_e_s_s │ │ │ │ +constexpr auto to_address(T &&p) noexcept │ │ │ │ +Obtain the address represented by p without forming a reference to the object │ │ │ │ +pointed to by p. │ │ │ │ +DDeeffiinniittiioonn memory.hh:47 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_d_y_n_a_m_i_c___e_x_t_e_n_t │ │ │ │ +constexpr std::size_t dynamic_extent │ │ │ │ +A constant of type std::size_t that is used to differentiate std::span of │ │ │ │ +static and dynamic extent. │ │ │ │ +DDeeffiinniittiioonn span.hh:26 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n │ │ │ │ +A contiguous sequence of elements with static or dynamic extent. │ │ │ │ +DDeeffiinniittiioonn span.hh:126 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_d_i_f_f_e_r_e_n_c_e___t_y_p_e │ │ │ │ +std::ptrdiff_t difference_type │ │ │ │ +DDeeffiinniittiioonn span.hh:135 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_c_o_n_s_t___r_e_f_e_r_e_n_c_e │ │ │ │ +const element_type & const_reference │ │ │ │ +DDeeffiinniittiioonn span.hh:138 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_f_r_o_n_t │ │ │ │ +constexpr reference front() const │ │ │ │ +Access the first element. │ │ │ │ +DDeeffiinniittiioonn span.hh:291 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_r_e_f_e_r_e_n_c_e │ │ │ │ +element_type & reference │ │ │ │ +DDeeffiinniittiioonn span.hh:137 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_s_p_a_n │ │ │ │ +constexpr span(const span &other) noexcept=default │ │ │ │ +Copy constructor. │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_i_t_e_r_a_t_o_r │ │ │ │ +pointer iterator │ │ │ │ +DDeeffiinniittiioonn span.hh:139 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_e_x_t_e_n_t │ │ │ │ +static constexpr size_type extent │ │ │ │ +DDeeffiinniittiioonn span.hh:150 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_b_e_g_i_n │ │ │ │ +constexpr iterator begin() const noexcept │ │ │ │ +Returns an iterator to the beginning. │ │ │ │ +DDeeffiinniittiioonn span.hh:261 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_c_b_e_g_i_n │ │ │ │ +constexpr const_iterator cbegin() const noexcept │ │ │ │ +Returns an iterator to the beginning. │ │ │ │ +DDeeffiinniittiioonn span.hh:267 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_s_p_a_n │ │ │ │ +constexpr span(std::array< T, N > &arr) noexcept │ │ │ │ +Constructs a span that is a view over the array. │ │ │ │ +DDeeffiinniittiioonn span.hh:211 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_r_e_v_e_r_s_e___i_t_e_r_a_t_o_r │ │ │ │ +std::reverse_iterator< iterator > reverse_iterator │ │ │ │ +DDeeffiinniittiioonn span.hh:140 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_e_n_d │ │ │ │ +constexpr iterator end() const noexcept │ │ │ │ +Returns an iterator to the end. │ │ │ │ +DDeeffiinniittiioonn span.hh:264 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_s_u_b_s_p_a_n │ │ │ │ +constexpr span< element_type, Std::dynamic_extent > subspan(size_type offset, │ │ │ │ +size_type count=Std::dynamic_extent) const │ │ │ │ +Obtains a subspan consisting of count elements of the sequence starting at │ │ │ │ +offset. │ │ │ │ +DDeeffiinniittiioonn span.hh:385 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_o_p_e_r_a_t_o_r_= │ │ │ │ +constexpr span & operator=(const span &other) noexcept=default │ │ │ │ +Copy assignment operator. │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_s_i_z_e___t_y_p_e │ │ │ │ +std::size_t size_type │ │ │ │ +DDeeffiinniittiioonn span.hh:134 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_p_o_i_n_t_e_r │ │ │ │ +element_type * pointer │ │ │ │ +DDeeffiinniittiioonn span.hh:136 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_a_t │ │ │ │ +constexpr reference at(size_type i) const │ │ │ │ +Access specified element with bounds checking. │ │ │ │ +DDeeffiinniittiioonn span.hh:305 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_v_a_l_u_e___t_y_p_e │ │ │ │ +std::remove_cv_t< element_type > value_type │ │ │ │ +DDeeffiinniittiioonn span.hh:133 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_f_i_r_s_t │ │ │ │ +constexpr span< element_type, Std::dynamic_extent > first(size_type count) │ │ │ │ +const │ │ │ │ +Obtains a subspan consisting of the first count elements of the sequence. │ │ │ │ +DDeeffiinniittiioonn span.hh:367 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_s_u_b_s_p_a_n │ │ │ │ +constexpr span< element_type, subspan_extent(Offset, Count)> subspan() const │ │ │ │ +Obtains a subspan consisting of Count elements of the sequence starting at │ │ │ │ +Offset. │ │ │ │ +DDeeffiinniittiioonn span.hh:358 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_c_o_n_s_t___i_t_e_r_a_t_o_r │ │ │ │ +const iterator const_iterator │ │ │ │ +DDeeffiinniittiioonn span.hh:145 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_c_r_e_n_d │ │ │ │ +constexpr const_reverse_iterator crend() const noexcept │ │ │ │ +Returns a reverse iterator ending at the beginning. │ │ │ │ +DDeeffiinniittiioonn span.hh:282 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_r_e_n_d │ │ │ │ +constexpr reverse_iterator rend() const noexcept │ │ │ │ +Returns a reverse iterator ending at the beginning. │ │ │ │ +DDeeffiinniittiioonn span.hh:276 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_d_a_t_a │ │ │ │ +constexpr pointer data() const noexcept │ │ │ │ +Direct access to the underlying contiguous storage. │ │ │ │ +DDeeffiinniittiioonn span.hh:316 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_s_i_z_e___b_y_t_e_s │ │ │ │ +constexpr size_type size_bytes() const noexcept │ │ │ │ +Returns the size of the sequence in bytes. │ │ │ │ +DDeeffiinniittiioonn span.hh:402 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_c_r_b_e_g_i_n │ │ │ │ +constexpr const_reverse_iterator crbegin() const noexcept │ │ │ │ +Returns a reverse iterator starting at the end. │ │ │ │ +DDeeffiinniittiioonn span.hh:279 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_e_l_e_m_e_n_t___t_y_p_e │ │ │ │ +Element element_type │ │ │ │ +DDeeffiinniittiioonn span.hh:132 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_e_m_p_t_y │ │ │ │ +constexpr bool empty() const noexcept │ │ │ │ +Checks if the sequence is empty. │ │ │ │ +DDeeffiinniittiioonn span.hh:405 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_l_a_s_t │ │ │ │ +constexpr span< element_type, Count > last() const │ │ │ │ +Obtains a subspan consisting of the last Count elements of the sequence. │ │ │ │ +DDeeffiinniittiioonn span.hh:335 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_s_p_a_n │ │ │ │ +constexpr span(Range &range) │ │ │ │ +Constructs a span that is a view over the range [range.begin(), range.end()) │ │ │ │ +DDeeffiinniittiioonn span.hh:195 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_r_b_e_g_i_n │ │ │ │ +constexpr reverse_iterator rbegin() const noexcept │ │ │ │ +Returns a reverse iterator starting at the end. │ │ │ │ +DDeeffiinniittiioonn span.hh:273 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_l_a_s_t │ │ │ │ +constexpr span< element_type, Std::dynamic_extent > last(size_type count) const │ │ │ │ +Obtains a subspan consisting of the last count elements of the sequence. │ │ │ │ +DDeeffiinniittiioonn span.hh:374 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_c_o_n_s_t___r_e_v_e_r_s_e___i_t_e_r_a_t_o_r │ │ │ │ +std::reverse_iterator< const_iterator > const_reverse_iterator │ │ │ │ +DDeeffiinniittiioonn span.hh:146 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_c_e_n_d │ │ │ │ +constexpr const_iterator cend() const noexcept │ │ │ │ +Returns an iterator to the end. │ │ │ │ +DDeeffiinniittiioonn span.hh:270 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_f_i_r_s_t │ │ │ │ +constexpr span< element_type, Count > first() const │ │ │ │ +Obtains a subspan consisting of the first Count elements of the sequence. │ │ │ │ +DDeeffiinniittiioonn span.hh:326 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_b_a_c_k │ │ │ │ +constexpr reference back() const │ │ │ │ +Access the last element. │ │ │ │ +DDeeffiinniittiioonn span.hh:298 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_s_p_a_n │ │ │ │ +constexpr span(const std::array< T, N > &arr) noexcept │ │ │ │ +Constructs a span that is a view over the const array. │ │ │ │ +DDeeffiinniittiioonn span.hh:220 │ │ │ │ +_D_u_n_e_:_:_S_t_d_:_:_s_p_a_n_:_:_o_p_e_r_a_t_o_r_[_] │ │ │ │ +constexpr reference operator[](size_type i) const │ │ │ │ +Access specified element. │ │ │ │ +DDeeffiinniittiioonn span.hh:313 │ │ │ │ =============================================================================== │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00032.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: tupleutility.hh File Reference │ │ │ +dune-common: layout_stride.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,123 +65,46 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │
│ │ │ Classes | │ │ │ -Namespaces | │ │ │ -Functions
│ │ │ -
tupleutility.hh File Reference
│ │ │ +Namespaces
│ │ │ +
layout_stride.hh File Reference
│ │ │ │ │ │
│ │ │ - │ │ │ -

Contains utility classes which can be used with std::tuple. │ │ │ -More...

│ │ │ -
#include <cstddef>
│ │ │ -#include <tuple>
│ │ │ +
#include <array>
│ │ │ #include <type_traits>
│ │ │ -#include <utility>
│ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ -#include <dune/common/typetraits.hh>
│ │ │ +#include <dune/common/indices.hh>
│ │ │ +#include <dune/common/std/impl/fwd_layouts.hh>
│ │ │
│ │ │

Go to the source code of this file.

│ │ │ │ │ │ │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ + │ │ │ + │ │ │ │ │ │

│ │ │ Classes

struct  Dune::TupleAccessTraits< T >
 
struct  Dune::TupleAccessTraits< T * >
 
struct  Dune::TupleAccessTraits< T & >
 
struct  Dune::NullPointerInitialiser< std::tuple< Args... > >
 
struct  Dune::ForEachType< TE, std::tuple< Args... > >
 
class  Dune::TransformTupleFunctor< TE, Args >
 
struct  Dune::TransformTupleFunctor< TE, Args >::TypeEvaluator< T >
 
struct  Dune::AddRefTypeEvaluator< T >
 TypeEvaluator to turn a type T into a reference to T More...
 
struct  Dune::AddPtrTypeEvaluator< T >
 TypeEvaluator to turn a type T into a pointer to T More...
 
struct  Dune::AddPtrTypeEvaluator< T & >
 
struct  Dune::AtType< N, Tuple >
 Type for reverse element access. More...
 
struct  Dune::At< N >
 Reverse element access. More...
 
struct  Dune::PointerPairDeletor< Tuple >
 Deletes all objects pointed to in a std::tuple of pointers. More...
 
class  Dune::FirstPredicateIndex< Tuple, Predicate, start, size >
 Finding the index of a certain type in a std::tuple. More...
 
struct  Dune::IsType< T >
 Generator for predicates accepting one particular type. More...
 
struct  Dune::IsType< T >::Predicate< U >
 The actual predicate. More...
 
struct  Dune::FirstTypeIndex< Tuple, T, start >
 Find the first occurrence of a type in a std::tuple. More...
 
struct  Dune::PushBackTuple< typename std::tuple< Args... >, T >
 
struct  Dune::PushFrontTuple< typename std::tuple< Args... >, T >
 
struct  Dune::ReduceTuple< F, Tuple, Seed, N >
 Apply reduce with meta binary function to template. More...
 
struct  Dune::ReduceTuple< F, Tuple, Seed, 0 >
 Apply reduce with meta binary function to template. More...
 
struct  Dune::JoinTuples< Head, Tail >
 Join two std::tuple's. More...
 
struct  Dune::FlattenTuple< Tuple >
 Flatten a std::tuple of std::tuple's. More...
class  Dune::Std::layout_stride::mapping< Extents >
 A layout mapping where the strides are user-defined. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ Namespaces

namespace  Dune
 Dune namespace.
 
│ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ - │ │ │ + │ │ │ + │ │ │ + │ │ │

│ │ │ -Functions

template<class F , class ArgTuple , class I , I... i>
decltype(auto) Dune::applyPartial (F &&f, ArgTuple &&args, std::integer_sequence< I, i... >)
 Apply function with arguments from a given tuple.
 
template<class Tuple , class Functor >
auto Dune::genericTransformTuple (Tuple &&t, Functor &&f) -> decltype(genericTransformTupleBackend(t, f))
 
template<template< class > class TE, class... Args>
TransformTupleFunctor< TE, Args... > Dune::makeTransformTupleFunctor (Args &&... args)
 
template<template< class > class TypeEvaluator, class Tuple , class... Args>
auto Dune::transformTuple (Tuple &&orig, Args &&... args) -> decltype(genericTransformTuple(orig, makeTransformTupleFunctor< TypeEvaluator >(args...)))
 
namespace  Dune::Std
 Namespace for features backported from new C++ standards.
 
│ │ │ -

Detailed Description

│ │ │ -

Contains utility classes which can be used with std::tuple.

│ │ │ -
│ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,108 +1,27 @@ │ │ │ │ dune-common 2.10 │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ * _d_u_n_e │ │ │ │ * _c_o_m_m_o_n │ │ │ │ -_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s | _F_u_n_c_t_i_o_n_s │ │ │ │ -tupleutility.hh File Reference │ │ │ │ -_C_o_m_m_o_n » _U_t_i_l_i_t_i_e_s » _T_u_p_l_e_ _U_t_i_l_i_t_i_e_s │ │ │ │ -Contains utility classes which can be used with std::tuple. _M_o_r_e_._._. │ │ │ │ -#include │ │ │ │ -#include │ │ │ │ + * _s_t_d │ │ │ │ +_C_l_a_s_s_e_s | _N_a_m_e_s_p_a_c_e_s │ │ │ │ +layout_stride.hh File Reference │ │ │ │ +#include │ │ │ │ #include │ │ │ │ -#include │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_h_y_b_r_i_d_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ -#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_i_n_d_i_c_e_s_._h_h> │ │ │ │ +#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_i_m_p_l_/_f_w_d___l_a_y_o_u_t_s_._h_h> │ │ │ │ _G_o_ _t_o_ _t_h_e_ _s_o_u_r_c_e_ _c_o_d_e_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ CCllaasssseess │ │ │ │ -struct   _D_u_n_e_:_:_T_u_p_l_e_A_c_c_e_s_s_T_r_a_i_t_s_<_ _T_ _> │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_T_u_p_l_e_A_c_c_e_s_s_T_r_a_i_t_s_<_ _T_ _*_ _> │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_T_u_p_l_e_A_c_c_e_s_s_T_r_a_i_t_s_<_ _T_ _&_ _> │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_N_u_l_l_P_o_i_n_t_e_r_I_n_i_t_i_a_l_i_s_e_r_<_ _s_t_d_:_:_t_u_p_l_e_<_ _A_r_g_s_._._._ _>_ _> │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_F_o_r_E_a_c_h_T_y_p_e_<_ _T_E_,_ _s_t_d_:_:_t_u_p_l_e_<_ _A_r_g_s_._._._ _>_ _> │ │ │ │ -  │ │ │ │ - class   _D_u_n_e_:_:_T_r_a_n_s_f_o_r_m_T_u_p_l_e_F_u_n_c_t_o_r_<_ _T_E_,_ _A_r_g_s_ _> │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_T_r_a_n_s_f_o_r_m_T_u_p_l_e_F_u_n_c_t_o_r_<_ _T_E_,_ _A_r_g_s_ _>_:_:_T_y_p_e_E_v_a_l_u_a_t_o_r_<_ _T_ _> │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_A_d_d_R_e_f_T_y_p_e_E_v_a_l_u_a_t_o_r_<_ _T_ _> │ │ │ │ -  TypeEvaluator to turn a type T into a reference to T _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_A_d_d_P_t_r_T_y_p_e_E_v_a_l_u_a_t_o_r_<_ _T_ _> │ │ │ │ -  TypeEvaluator to turn a type T into a pointer to T _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_A_d_d_P_t_r_T_y_p_e_E_v_a_l_u_a_t_o_r_<_ _T_ _&_ _> │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_A_t_T_y_p_e_<_ _N_,_ _T_u_p_l_e_ _> │ │ │ │ -  Type for reverse element access. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_A_t_<_ _N_ _> │ │ │ │ -  Reverse element access. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_P_o_i_n_t_e_r_P_a_i_r_D_e_l_e_t_o_r_<_ _T_u_p_l_e_ _> │ │ │ │ -  Deletes all objects pointed to in a std::tuple of pointers. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ - class   _D_u_n_e_:_:_F_i_r_s_t_P_r_e_d_i_c_a_t_e_I_n_d_e_x_<_ _T_u_p_l_e_,_ _P_r_e_d_i_c_a_t_e_,_ _s_t_a_r_t_,_ _s_i_z_e_ _> │ │ │ │ -  Finding the index of a certain type in a std::tuple. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_I_s_T_y_p_e_<_ _T_ _> │ │ │ │ -  Generator for predicates accepting one particular type. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_I_s_T_y_p_e_<_ _T_ _>_:_:_P_r_e_d_i_c_a_t_e_<_ _U_ _> │ │ │ │ -  The actual predicate. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_F_i_r_s_t_T_y_p_e_I_n_d_e_x_<_ _T_u_p_l_e_,_ _T_,_ _s_t_a_r_t_ _> │ │ │ │ -  Find the first occurrence of a type in a std::tuple. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_P_u_s_h_B_a_c_k_T_u_p_l_e_<_ _t_y_p_e_n_a_m_e_ _s_t_d_:_:_t_u_p_l_e_<_ _A_r_g_s_._._._ _>_,_ _T_ _> │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_P_u_s_h_F_r_o_n_t_T_u_p_l_e_<_ _t_y_p_e_n_a_m_e_ _s_t_d_:_:_t_u_p_l_e_<_ _A_r_g_s_._._._ _>_,_ _T_ _> │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_R_e_d_u_c_e_T_u_p_l_e_<_ _F_,_ _T_u_p_l_e_,_ _S_e_e_d_,_ _N_ _> │ │ │ │ -  Apply reduce with meta binary function to template. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_R_e_d_u_c_e_T_u_p_l_e_<_ _F_,_ _T_u_p_l_e_,_ _S_e_e_d_,_ _0_ _> │ │ │ │ -  Apply reduce with meta binary function to template. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_J_o_i_n_T_u_p_l_e_s_<_ _H_e_a_d_,_ _T_a_i_l_ _> │ │ │ │ -  Join two std::tuple's. _M_o_r_e_._._. │ │ │ │ -  │ │ │ │ -struct   _D_u_n_e_:_:_F_l_a_t_t_e_n_T_u_p_l_e_<_ _T_u_p_l_e_ _> │ │ │ │ -  Flatten a std::tuple of std::tuple's. _M_o_r_e_._._. │ │ │ │ +class   _D_u_n_e_:_:_S_t_d_:_:_l_a_y_o_u_t___s_t_r_i_d_e_:_:_m_a_p_p_i_n_g_<_ _E_x_t_e_n_t_s_ _> │ │ │ │ +  A layout mapping where the strides are user-defined. _M_o_r_e_._._. │ │ │ │   │ │ │ │ NNaammeessppaacceess │ │ │ │ namespace   _D_u_n_e │ │ │ │   _D_u_n_e namespace. │ │ │ │   │ │ │ │ -FFuunnccttiioonnss │ │ │ │ -template │ │ │ │ - decltype(auto)  _D_u_n_e_:_:_a_p_p_l_y_P_a_r_t_i_a_l (F &&f, ArgTuple │ │ │ │ - &&args, std::integer_sequence< I, i... >) │ │ │ │ -  Apply function with arguments from a │ │ │ │ - given tuple. │ │ │ │ -  │ │ │ │ -template │ │ │ │ - auto  _D_u_n_e_:_:_g_e_n_e_r_i_c_T_r_a_n_s_f_o_r_m_T_u_p_l_e (Tuple &&t, │ │ │ │ - Functor &&f) -> decltype │ │ │ │ - (genericTransformTupleBackend(t, f)) │ │ │ │ -  │ │ │ │ -template class TE, class... Args> │ │ │ │ -_T_r_a_n_s_f_o_r_m_T_u_p_l_e_F_u_n_c_t_o_r< TE, Args... >  _D_u_n_e_:_:_m_a_k_e_T_r_a_n_s_f_o_r_m_T_u_p_l_e_F_u_n_c_t_o_r (Args │ │ │ │ - &&... args) │ │ │ │ -  │ │ │ │ -template class TypeEvaluator, class Tuple , class... Args> │ │ │ │ - auto  _D_u_n_e_:_:_t_r_a_n_s_f_o_r_m_T_u_p_l_e (Tuple &&orig, Args │ │ │ │ - &&... args) -> decltype │ │ │ │ - (_g_e_n_e_r_i_c_T_r_a_n_s_f_o_r_m_T_u_p_l_e(orig, │ │ │ │ - _m_a_k_e_T_r_a_n_s_f_o_r_m_T_u_p_l_e_F_u_n_c_t_o_r< TypeEvaluator │ │ │ │ - >(args...))) │ │ │ │ +namespace   _D_u_n_e_:_:_S_t_d │ │ │ │ +  Namespace for features backported from new C++ standards. │ │ │ │   │ │ │ │ -********** DDeettaaiilleedd DDeessccrriippttiioonn ********** │ │ │ │ -Contains utility classes which can be used with std::tuple. │ │ │ │ =============================================================================== │ │ │ │ Generated by _[_d_o_x_y_g_e_n_] 1.9.8 │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00032_source.html │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: tupleutility.hh Source File │ │ │ +dune-common: layout_stride.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -70,452 +70,256 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ -
tupleutility.hh
│ │ │ +
layout_stride.hh
│ │ │
│ │ │
│ │ │ Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │
2// vi: set et ts=4 sw=2 sts=2:
│ │ │
3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file LICENSE.md in module root
│ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ -
5
│ │ │ -
6#ifndef DUNE_TUPLE_UTILITY_HH
│ │ │ -
7#define DUNE_TUPLE_UTILITY_HH
│ │ │ -
8
│ │ │ -
9#include <cstddef>
│ │ │ -
10#include <tuple>
│ │ │ -
11#include <type_traits>
│ │ │ -
12#include <utility>
│ │ │ +
5#ifndef DUNE_COMMON_STD_LAYOUT_STRIDE_HH
│ │ │ +
6#define DUNE_COMMON_STD_LAYOUT_STRIDE_HH
│ │ │ +
7
│ │ │ +
8#include <array>
│ │ │ +
9#include <type_traits>
│ │ │ +
10
│ │ │ + │ │ │ + │ │ │
13
│ │ │ - │ │ │ - │ │ │ -
16
│ │ │ -
17namespace Dune {
│ │ │ -
18
│ │ │ -
41 template<class F, class ArgTuple, class I, I... i>
│ │ │ -
│ │ │ -
42 decltype(auto) applyPartial(F&& f, ArgTuple&& args, std::integer_sequence<I, i...> /*indices*/)
│ │ │ -
43 {
│ │ │ -
44 return f(std::get<i>(args)...);
│ │ │ -
45 }
│ │ │ -
│ │ │ -
46
│ │ │ -
47 template<class T>
│ │ │ -
│ │ │ - │ │ │ -
49 {
│ │ │ -
50 typedef typename std::add_const<T>::type& ConstType;
│ │ │ -
51 typedef T& NonConstType;
│ │ │ -
52 typedef const typename std::remove_const<T>::type& ParameterType;
│ │ │ -
53 };
│ │ │ +
14namespace Dune::Std {
│ │ │ +
15
│ │ │ +
17template <class Extents>
│ │ │ +
│ │ │ + │ │ │ +
19{
│ │ │ +
20 template <class> friend class mapping;
│ │ │ +
21 static constexpr typename Extents::rank_type rank_ = Extents::rank();
│ │ │ +
22
│ │ │ +
23public:
│ │ │ +
24 using extents_type = Extents;
│ │ │ +
25 using index_type = typename extents_type::index_type;
│ │ │ +
26 using size_type = typename extents_type::size_type;
│ │ │ +
27 using rank_type = typename extents_type::rank_type;
│ │ │ + │ │ │ +
29
│ │ │ +
30private:
│ │ │ +
31 using strides_type = std::array<index_type,rank_>;
│ │ │ +
32
│ │ │ +
33public:
│ │ │ +
34
│ │ │ +
│ │ │ +
36 constexpr mapping () noexcept
│ │ │ + │ │ │ +
38 {}
│ │ │ +
│ │ │ +
39
│ │ │ +
41 constexpr mapping (const mapping&) noexcept = default;
│ │ │ +
42
│ │ │ +
44 template <class OtherIndexType,
│ │ │ +
45 std::enable_if_t<std::is_convertible_v<const OtherIndexType&, index_type>, int> = 0,
│ │ │ +
46 std::enable_if_t<std::is_nothrow_constructible_v<index_type, const OtherIndexType&>, int> = 0>
│ │ │ +
│ │ │ +
47 constexpr mapping (const extents_type& e, const std::array<OtherIndexType,rank_>& s) noexcept
│ │ │ +
48 : extents_(e)
│ │ │ +
49 , strides_{}
│ │ │ +
50 {
│ │ │ +
51 for (rank_type r = 0; r < rank_; ++r)
│ │ │ +
52 strides_[r] = s[r];
│ │ │ +
53 }
│ │ │
│ │ │
54
│ │ │ -
55 template<class T>
│ │ │ -
│ │ │ - │ │ │ -
57 {
│ │ │ -
58 typedef typename std::add_const<T>::type* ConstType;
│ │ │ -
59 typedef T* NonConstType;
│ │ │ -
60 typedef T* ParameterType;
│ │ │ -
61 };
│ │ │ -
│ │ │ -
62
│ │ │ -
63 template<class T>
│ │ │ -
│ │ │ - │ │ │ -
65 {
│ │ │ -
66 typedef T& ConstType;
│ │ │ -
67 typedef T& NonConstType;
│ │ │ -
68 typedef T& ParameterType;
│ │ │ -
69 };
│ │ │ -
│ │ │ -
70
│ │ │ -
78 template<class T>
│ │ │ - │ │ │ -
80
│ │ │ -
81 template<class... Args>
│ │ │ -
│ │ │ -
82 struct NullPointerInitialiser<std::tuple<Args...> >
│ │ │ -
83 {
│ │ │ -
84 typedef std::tuple<Args...> ResultType;
│ │ │ -
│ │ │ - │ │ │ -
86 {
│ │ │ -
87 return ResultType(static_cast<Args>(nullptr)...);
│ │ │ -
88 }
│ │ │ -
│ │ │ -
89 };
│ │ │ -
│ │ │ -
90
│ │ │ -
115 template<template <class> class TE, class T>
│ │ │ - │ │ │ +
56 template <class OtherIndexType,
│ │ │ +
57 std::enable_if_t<std::is_convertible_v<const OtherIndexType&, index_type>, int> = 0,
│ │ │ +
58 std::enable_if_t<std::is_nothrow_constructible_v<index_type, const OtherIndexType&>, int> = 0>
│ │ │ +
│ │ │ +
59 constexpr mapping (const extents_type& e, const span<OtherIndexType,rank_>& s) noexcept
│ │ │ +
60 : extents_(e)
│ │ │ +
61 , strides_{}
│ │ │ +
62 {
│ │ │ +
63 for (rank_type r = 0; r < rank_; ++r)
│ │ │ +
64 strides_[r] = s[r];
│ │ │ +
65 }
│ │ │ +
│ │ │ +
66
│ │ │ +
68 template <class M,
│ │ │ +
69 std::enable_if_t<(M::extents_type::rank() == extents_type::rank()), int> = 0,
│ │ │ +
70 std::enable_if_t<(M::is_always_unique()), int> = 0,
│ │ │ +
71 std::enable_if_t<(M::is_always_strided()), int> = 0,
│ │ │ +
72 decltype(std::declval<M>().extents(), bool{}) = true,
│ │ │ +
73 decltype(std::declval<M>().stride(std::declval<rank_type>()), bool{}) = true>
│ │ │ +
│ │ │ +
74 constexpr mapping (const M& m) noexcept
│ │ │ +
75 : extents_(m.extents())
│ │ │ +
76 , strides_{}
│ │ │ +
77 {
│ │ │ +
78 for (rank_type r = 0; r < rank_; ++r)
│ │ │ +
79 strides_[r] = m.stride(r);
│ │ │ +
80 }
│ │ │ +
│ │ │ +
81
│ │ │ +
83 constexpr mapping& operator= (const mapping&) noexcept = default;
│ │ │ +
84
│ │ │ +
85 constexpr const extents_type& extents () const noexcept { return extents_; }
│ │ │ +
86
│ │ │ +
│ │ │ +
88 constexpr index_type required_span_size () const noexcept
│ │ │ +
89 {
│ │ │ +
90 return size(extents_,strides_);
│ │ │ +
91 }
│ │ │ +
│ │ │ +
92
│ │ │ +
94 template <class... Indices,
│ │ │ +
95 std::enable_if_t<(sizeof...(Indices) == rank_), int> = 0,
│ │ │ +
96 std::enable_if_t<(std::is_convertible_v<Indices, index_type> && ...), int> = 0,
│ │ │ +
97 std::enable_if_t<(std::is_nothrow_constructible_v<index_type, Indices> && ...), int> = 0>
│ │ │ +
│ │ │ +
98 constexpr index_type operator() (Indices... ii) const noexcept
│ │ │ +
99 {
│ │ │ +
100 return unpackIntegerSequence([&](auto... r) {
│ │ │ +
101 return ((static_cast<index_type>(ii)*strides_[r]) + ... + 0); },
│ │ │ +
102 std::make_index_sequence<rank_>{});
│ │ │ +
103 }
│ │ │ +
│ │ │ +
104
│ │ │ +
│ │ │ +
106 constexpr index_type operator() () const noexcept
│ │ │ +
107 {
│ │ │ +
108 return 0;
│ │ │ +
109 }
│ │ │ +
│ │ │ +
110
│ │ │ +
111 static constexpr bool is_always_unique () noexcept { return true; }
│ │ │ +
112 static constexpr bool is_always_exhaustive () noexcept { return false; }
│ │ │ +
113 static constexpr bool is_always_strided () noexcept { return true; }
│ │ │ +
114
│ │ │ +
115 static constexpr bool is_unique () noexcept { return true; }
│ │ │ +
116 static constexpr bool is_strided () noexcept { return true; }
│ │ │
117
│ │ │ -
118 template<template <class> class TE, class... Args>
│ │ │ -
│ │ │ -
119 struct ForEachType<TE, std::tuple<Args...> >
│ │ │ -
120 {
│ │ │ -
121 typedef std::tuple<typename TE<Args>::Type...> Type;
│ │ │ -
122 };
│ │ │ -
│ │ │ -
123
│ │ │ -
124#ifndef DOXYGEN
│ │ │ -
125 template<class Tuple, class Functor, std::size_t... I>
│ │ │ -
126 inline auto genericTransformTupleBackendImpl(Tuple& t, Functor& f, const std::index_sequence<I...>& )
│ │ │ -
127 -> std::tuple<decltype(f(std::get<I>(t)))...>
│ │ │ +
│ │ │ +
118 constexpr bool is_exhaustive () const noexcept
│ │ │ +
119 {
│ │ │ +
120 // Actually this could be improved. A strided layout can still be exhaustive.
│ │ │ +
121 // This test is more complicated to implement, though. See §24.7.3.4.7.4 line (5.2)
│ │ │ +
122 // in the C++ standard document N4971
│ │ │ +
123 return extents_type::rank() == 0 || (required_span_size() > 0 && required_span_size() == extents().product());
│ │ │ +
124 }
│ │ │ +
│ │ │ +
125
│ │ │ +
│ │ │ +
127 constexpr const strides_type& strides () const noexcept
│ │ │
128 {
│ │ │ -
129 return std::tuple<decltype(f(std::get<I>(t)))...>(f(std::get<I>(t))...);
│ │ │ +
129 return strides_;
│ │ │
130 }
│ │ │ +
│ │ │
131
│ │ │ -
132 template<class... Args, class Functor>
│ │ │ -
133 auto genericTransformTupleBackend(std::tuple<Args...>& t, Functor& f) ->
│ │ │ -
134 decltype(genericTransformTupleBackendImpl(t, f,std::index_sequence_for<Args...>{}))
│ │ │ -
135 {
│ │ │ -
136 return genericTransformTupleBackendImpl(t, f,std::index_sequence_for<Args...>{});
│ │ │ -
137 }
│ │ │ -
138
│ │ │ -
139 template<class... Args, class Functor>
│ │ │ -
140 auto genericTransformTupleBackend(const std::tuple<Args...>& t, Functor& f) ->
│ │ │ -
141 decltype(genericTransformTupleBackendImpl(t, f, std::index_sequence_for<Args...>{}))
│ │ │ -
142 {
│ │ │ -
143 return genericTransformTupleBackendImpl(t, f, std::index_sequence_for<Args...>{});
│ │ │ -
144 }
│ │ │ -
145#endif
│ │ │ -
146
│ │ │ -
185 template<class Tuple, class Functor>
│ │ │ -
│ │ │ -
186 auto genericTransformTuple(Tuple&& t, Functor&& f) ->
│ │ │ -
187 decltype(genericTransformTupleBackend(t, f))
│ │ │ -
188 {
│ │ │ -
189 return genericTransformTupleBackend(t, f);
│ │ │ -
190 }
│ │ │ -
│ │ │ -
191
│ │ │ -
224 template<template<class> class TE, class... Args>
│ │ │ -
│ │ │ - │ │ │ -
226 {
│ │ │ -
227 mutable std::tuple<Args&...> tup;
│ │ │ -
228
│ │ │ -
229 template<class T, std::size_t... I>
│ │ │ -
230 inline auto apply(T&& t, const std::index_sequence<I...>& ) ->
│ │ │ -
231 decltype(TE<T>::apply(t,std::get<I>(tup)...)) const
│ │ │ -
232 {
│ │ │ -
233 return TE<T>::apply(t,std::get<I>(tup)...);
│ │ │ -
234 }
│ │ │ -
235
│ │ │ -
236 public:
│ │ │ -
237 template<class T>
│ │ │ -
│ │ │ -
238 struct TypeEvaluator : public TE<T>
│ │ │ -
239 {};
│ │ │ -
│ │ │ -
240
│ │ │ -
│ │ │ -
241 TransformTupleFunctor(Args&&... args)
│ │ │ -
242 : tup(args...)
│ │ │ -
243 { }
│ │ │ -
│ │ │ -
244
│ │ │ -
245 template<class T>
│ │ │ -
│ │ │ -
246 inline auto operator()(T&& t) ->
│ │ │ -
247 decltype(this->apply(t,std::index_sequence_for<Args...>{})) const
│ │ │ -
248 {
│ │ │ -
249 return apply(t,std::index_sequence_for<Args...>{});
│ │ │ -
250 }
│ │ │ -
│ │ │ -
251 };
│ │ │ -
│ │ │ -
252
│ │ │ -
253 template<template<class> class TE, class... Args>
│ │ │ -
│ │ │ - │ │ │ -
255 {
│ │ │ -
256 return TransformTupleFunctor<TE, Args...>(args...);
│ │ │ -
257 }
│ │ │ -
│ │ │ -
258
│ │ │ -
291 template<template<class> class TypeEvaluator, class Tuple, class... Args>
│ │ │ -
│ │ │ -
292 auto transformTuple(Tuple&& orig, Args&&... args) ->
│ │ │ -
293 decltype(genericTransformTuple(orig, makeTransformTupleFunctor<TypeEvaluator>(args...)))
│ │ │ -
294 {
│ │ │ -
295 return genericTransformTuple(orig, makeTransformTupleFunctor<TypeEvaluator>(args...));
│ │ │ -
296 }
│ │ │ -
│ │ │ -
297
│ │ │ -
299
│ │ │ -
303 template<class T>
│ │ │ -
│ │ │ - │ │ │ -
305 {
│ │ │ -
306 typedef T& Type;
│ │ │ -
│ │ │ -
307 static Type apply(T& t)
│ │ │ -
308 {
│ │ │ -
309 return t;
│ │ │ -
310 }
│ │ │ -
│ │ │ -
311 };
│ │ │ -
│ │ │ -
312
│ │ │ -
314
│ │ │ -
318 template<class T>
│ │ │ -
│ │ │ - │ │ │ -
320 {
│ │ │ -
321 typedef typename std::remove_reference<T>::type* Type;
│ │ │ -
│ │ │ -
322 static Type apply(T& t)
│ │ │ -
323 {
│ │ │ -
324 return &t;
│ │ │ -
325 }
│ │ │ -
│ │ │ -
326 };
│ │ │ -
│ │ │ -
327
│ │ │ -
328 // Specialization, in case the type is already a reference
│ │ │ -
329 template<class T>
│ │ │ -
│ │ │ - │ │ │ -
331 {
│ │ │ -
332 typedef typename std::remove_reference<T>::type* Type;
│ │ │ -
│ │ │ -
333 static Type apply(T& t)
│ │ │ -
334 {
│ │ │ -
335 return &t;
│ │ │ -
336 }
│ │ │ -
│ │ │ -
337 };
│ │ │ -
│ │ │ -
338
│ │ │ -
344 template<int N, class Tuple>
│ │ │ -
│ │ │ -
345 struct AtType
│ │ │ -
346 {
│ │ │ -
347 typedef typename std::tuple_element<std::tuple_size<Tuple>::value - N - 1, Tuple>::type Type;
│ │ │ -
348 };
│ │ │ -
│ │ │ -
349
│ │ │ -
357 template<int N>
│ │ │ -
│ │ │ -
358 struct At
│ │ │ -
359 {
│ │ │ -
360 template<typename Tuple>
│ │ │ -
361 static typename TupleAccessTraits<typename AtType<N, Tuple>::Type>::NonConstType
│ │ │ -
│ │ │ -
362 get(Tuple& t)
│ │ │ -
363 {
│ │ │ -
364 return std::get<std::tuple_size<Tuple>::value - N - 1>(t);
│ │ │ -
365 }
│ │ │ -
│ │ │ -
366
│ │ │ -
367 template<typename Tuple>
│ │ │ -
368 static typename TupleAccessTraits<typename AtType<N, Tuple>::Type>::ConstType
│ │ │ -
│ │ │ -
369 get(const Tuple& t)
│ │ │ -
370 {
│ │ │ -
371 return std::get<std::tuple_size<Tuple>::value - N - 1>(t);
│ │ │ -
372 }
│ │ │ -
│ │ │ -
373 };
│ │ │ -
│ │ │ -
374
│ │ │ -
378 template<class Tuple>
│ │ │ -
│ │ │ - │ │ │ -
380 {
│ │ │ -
381 template<typename... Ts>
│ │ │ -
│ │ │ -
382 static void apply(std::tuple<Ts...>& t)
│ │ │ -
383 {
│ │ │ -
384 Hybrid::forEach(t,[&](auto&& ti){delete ti; ti=nullptr;});
│ │ │ -
385 }
│ │ │ -
│ │ │ -
386 };
│ │ │ -
│ │ │ -
387
│ │ │ -
411 template<class Tuple, template<class> class Predicate, std::size_t start = 0,
│ │ │ -
412 std::size_t size = std::tuple_size<Tuple>::value>
│ │ │ -
│ │ │ - │ │ │ -
414 public std::conditional<Predicate<typename std::tuple_element<start,
│ │ │ -
415 Tuple>::type>::value,
│ │ │ -
416 std::integral_constant<std::size_t, start>,
│ │ │ -
417 FirstPredicateIndex<Tuple, Predicate, start+1> >::type
│ │ │ -
418 {
│ │ │ -
419 static_assert(std::tuple_size<Tuple>::value == size, "The \"size\" "
│ │ │ -
420 "template parameter of FirstPredicateIndex is an "
│ │ │ -
421 "implementation detail and should never be set "
│ │ │ -
422 "explicitly!");
│ │ │ -
423 };
│ │ │ -
│ │ │ -
424
│ │ │ -
425#ifndef DOXYGEN
│ │ │ -
426 template<class Tuple, template<class> class Predicate, std::size_t size>
│ │ │ -
427 class FirstPredicateIndex<Tuple, Predicate, size, size>
│ │ │ -
428 {
│ │ │ -
429 static_assert(AlwaysFalse<Tuple>::value, "None of the std::tuple element "
│ │ │ -
430 "types matches the predicate!");
│ │ │ -
431 };
│ │ │ -
432#endif // !DOXYGEN
│ │ │ -
433
│ │ │ -
443 template<class T>
│ │ │ -
│ │ │ -
444 struct IsType
│ │ │ -
445 {
│ │ │ -
447 template<class U>
│ │ │ -
448 struct Predicate : public std::is_same<T, U> {};
│ │ │ -
449 };
│ │ │ -
│ │ │ -
450
│ │ │ -
464 template<class Tuple, class T, std::size_t start = 0>
│ │ │ -
│ │ │ - │ │ │ -
466 public FirstPredicateIndex<Tuple, IsType<T>::template Predicate, start>
│ │ │ -
467 { };
│ │ │ -
│ │ │ -
468
│ │ │ -
475 template<class Tuple, class T>
│ │ │ - │ │ │ -
477
│ │ │ -
478 template<class... Args, class T>
│ │ │ -
│ │ │ -
479 struct PushBackTuple<typename std::tuple<Args...>, T>
│ │ │ -
480 {
│ │ │ -
481 typedef typename std::tuple<Args..., T> type;
│ │ │ -
482 };
│ │ │ -
│ │ │ -
483
│ │ │ -
490 template<class Tuple, class T>
│ │ │ - │ │ │ -
492
│ │ │ -
493 template<class... Args, class T>
│ │ │ -
│ │ │ -
494 struct PushFrontTuple<typename std::tuple<Args...>, T>
│ │ │ -
495 {
│ │ │ -
496 typedef typename std::tuple<T, Args...> type;
│ │ │ -
497 };
│ │ │ -
│ │ │ -
498
│ │ │ -
511 template<
│ │ │ -
512 template <class, class> class F,
│ │ │ -
513 class Tuple,
│ │ │ -
514 class Seed=std::tuple<>,
│ │ │ -
515 int N=std::tuple_size<Tuple>::value>
│ │ │ -
│ │ │ - │ │ │ -
517 {
│ │ │ -
518 typedef typename ReduceTuple<F, Tuple, Seed, N-1>::type Accumulated;
│ │ │ -
519 typedef typename std::tuple_element<N-1, Tuple>::type Value;
│ │ │ -
520
│ │ │ -
522 typedef typename F<Accumulated, Value>::type type;
│ │ │ -
523 };
│ │ │ -
│ │ │ -
524
│ │ │ -
535 template<
│ │ │ -
536 template <class, class> class F,
│ │ │ -
537 class Tuple,
│ │ │ -
538 class Seed>
│ │ │ -
│ │ │ -
539 struct ReduceTuple<F, Tuple, Seed, 0>
│ │ │ -
540 {
│ │ │ -
542 typedef Seed type;
│ │ │ -
543 };
│ │ │ -
│ │ │ -
544
│ │ │ -
554 template<class Head, class Tail>
│ │ │ -
│ │ │ - │ │ │ -
556 {
│ │ │ - │ │ │ -
559 };
│ │ │ -
│ │ │ -
560
│ │ │ -
569 template<class Tuple>
│ │ │ -
│ │ │ - │ │ │ -
571 {
│ │ │ - │ │ │ -
574 };
│ │ │ -
│ │ │ -
575
│ │ │ -
577}
│ │ │ -
578
│ │ │ -
579#endif
│ │ │ -
Traits for type conversions and type information.
│ │ │ - │ │ │ -
std::add_const< T >::type & ConstType
Definition tupleutility.hh:50
│ │ │ -
static void apply(std::tuple< Ts... > &t)
Definition tupleutility.hh:382
│ │ │ -
T * ParameterType
Definition tupleutility.hh:60
│ │ │ -
auto transformTuple(Tuple &&orig, Args &&... args) -> decltype(genericTransformTuple(orig, makeTransformTupleFunctor< TypeEvaluator >(args...)))
Definition tupleutility.hh:292
│ │ │ -
T & ConstType
Definition tupleutility.hh:66
│ │ │ -
ReduceTuple< F, Tuple, Seed, N-1 >::type Accumulated
Definition tupleutility.hh:518
│ │ │ -
T * NonConstType
Definition tupleutility.hh:59
│ │ │ -
Seed type
Result of the reduce operation.
Definition tupleutility.hh:542
│ │ │ -
std::remove_reference< T >::type * Type
Definition tupleutility.hh:321
│ │ │ -
static Type apply(T &t)
Definition tupleutility.hh:307
│ │ │ -
static ResultType apply()
Definition tupleutility.hh:85
│ │ │ -
std::tuple< Args... > ResultType
Definition tupleutility.hh:84
│ │ │ -
std::remove_reference< T >::type * Type
Definition tupleutility.hh:332
│ │ │ -
TransformTupleFunctor(Args &&... args)
Definition tupleutility.hh:241
│ │ │ -
std::tuple_element< std::tuple_size< Tuple >::value-N-1, Tuple >::type Type
Definition tupleutility.hh:347
│ │ │ -
static Type apply(T &t)
Definition tupleutility.hh:333
│ │ │ -
auto operator()(T &&t) -> decltype(this->apply(t, std::index_sequence_for< Args... >{})) const
Definition tupleutility.hh:246
│ │ │ -
T & NonConstType
Definition tupleutility.hh:67
│ │ │ -
T & NonConstType
Definition tupleutility.hh:51
│ │ │ -
static TupleAccessTraits< typenameAtType< N, Tuple >::Type >::ConstType get(const Tuple &t)
Definition tupleutility.hh:369
│ │ │ -
T & Type
Definition tupleutility.hh:306
│ │ │ -
static TupleAccessTraits< typenameAtType< N, Tuple >::Type >::NonConstType get(Tuple &t)
Definition tupleutility.hh:362
│ │ │ -
std::tuple< Args..., T > type
Definition tupleutility.hh:481
│ │ │ -
std::tuple_element< N-1, Tuple >::type Value
Definition tupleutility.hh:519
│ │ │ -
std::tuple< T, Args... > type
Definition tupleutility.hh:496
│ │ │ -
ReduceTuple< JoinTuples, Tuple >::type type
Result of the flatten operation.
Definition tupleutility.hh:573
│ │ │ -
static Type apply(T &t)
Definition tupleutility.hh:322
│ │ │ -
F< Accumulated, Value >::type type
Result of the reduce operation.
Definition tupleutility.hh:522
│ │ │ -
ReduceTuple< PushBackTuple, Tail, Head >::type type
Result of the join operation.
Definition tupleutility.hh:558
│ │ │ -
std::tuple< typename TE< Args >::Type... > Type
Definition tupleutility.hh:121
│ │ │ -
auto genericTransformTuple(Tuple &&t, Functor &&f) -> decltype(genericTransformTupleBackend(t, f))
Definition tupleutility.hh:186
│ │ │ -
decltype(auto) applyPartial(F &&f, ArgTuple &&args, std::integer_sequence< I, i... >)
Apply function with arguments from a given tuple.
Definition tupleutility.hh:42
│ │ │ -
T & ParameterType
Definition tupleutility.hh:68
│ │ │ -
const std::remove_const< T >::type & ParameterType
Definition tupleutility.hh:52
│ │ │ -
std::add_const< T >::type * ConstType
Definition tupleutility.hh:58
│ │ │ -
TransformTupleFunctor< TE, Args... > makeTransformTupleFunctor(Args &&... args)
Definition tupleutility.hh:254
│ │ │ -
constexpr void forEach(Range &&range, F &&f)
Range based for loop.
Definition hybridutilities.hh:256
│ │ │ -
STL namespace.
│ │ │ -
Dune namespace.
Definition alignedallocator.hh:13
│ │ │ -
constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
Return the size of the sequence.
Definition integersequence.hh:75
│ │ │ -
Definition tupleutility.hh:49
│ │ │ -
A helper template that initializes a std::tuple consisting of pointers to nullptr.
Definition tupleutility.hh:79
│ │ │ -
Helper template to clone the type definition of a std::tuple with the storage types replaced by a use...
Definition tupleutility.hh:116
│ │ │ -
Definition tupleutility.hh:226
│ │ │ -
Definition tupleutility.hh:239
│ │ │ -
TypeEvaluator to turn a type T into a reference to T
Definition tupleutility.hh:305
│ │ │ -
TypeEvaluator to turn a type T into a pointer to T
Definition tupleutility.hh:320
│ │ │ -
Type for reverse element access.
Definition tupleutility.hh:346
│ │ │ -
Reverse element access.
Definition tupleutility.hh:359
│ │ │ -
Deletes all objects pointed to in a std::tuple of pointers.
Definition tupleutility.hh:380
│ │ │ -
Finding the index of a certain type in a std::tuple.
Definition tupleutility.hh:418
│ │ │ -
Generator for predicates accepting one particular type.
Definition tupleutility.hh:445
│ │ │ -
The actual predicate.
Definition tupleutility.hh:448
│ │ │ -
Find the first occurrence of a type in a std::tuple.
Definition tupleutility.hh:467
│ │ │ -
Helper template to append a type to a std::tuple.
Definition tupleutility.hh:476
│ │ │ -
Helper template to prepend a type to a std::tuple.
Definition tupleutility.hh:491
│ │ │ -
Apply reduce with meta binary function to template.
Definition tupleutility.hh:517
│ │ │ -
Join two std::tuple's.
Definition tupleutility.hh:556
│ │ │ -
Flatten a std::tuple of std::tuple's.
Definition tupleutility.hh:571
│ │ │ -
template which always yields a false value
Definition typetraits.hh:124
│ │ │ +
133 template <class E = extents_type,
│ │ │ +
134 std::enable_if_t<(E::rank() > 0), int> = 0>
│ │ │ +
│ │ │ +
135 constexpr index_type stride (rank_type i) const noexcept
│ │ │ +
136 {
│ │ │ +
137 return strides_[i];
│ │ │ +
138 }
│ │ │ +
│ │ │ +
139
│ │ │ +
140 template <class OtherMapping,
│ │ │ +
141 std::enable_if_t<(OtherMapping::extents_type::rank() == extents_type::rank()), int> = 0,
│ │ │ +
142 std::enable_if_t<(OtherMapping::is_always_strided()), int> = 0>
│ │ │ +
│ │ │ +
143 friend constexpr bool operator== (const mapping& a, const OtherMapping& b) noexcept
│ │ │ +
144 {
│ │ │ +
145 if (offset(b))
│ │ │ +
146 return false;
│ │ │ +
147 if constexpr(extents_type::rank() == 0)
│ │ │ +
148 return true;
│ │ │ +
149 return a.extents_ == b.extents_ && a.strides_ == b.strides_;
│ │ │ +
150 }
│ │ │ +
│ │ │ +
151
│ │ │ +
152private:
│ │ │ +
153 template <class E, class S>
│ │ │ +
154 static constexpr index_type size (const E& extents, const S& strides) noexcept
│ │ │ +
155 {
│ │ │ +
156 if constexpr (E::rank() == 0)
│ │ │ +
157 return 1;
│ │ │ +
158 else {
│ │ │ +
159 if (extents.product() == 0)
│ │ │ +
160 return 0;
│ │ │ +
161 else {
│ │ │ +
162 index_type result = 1;
│ │ │ +
163 for (rank_type r = 0; r < E::rank(); ++r)
│ │ │ +
164 result += (extents.extent(r)-1) * strides[r];
│ │ │ +
165 return result;
│ │ │ +
166 }
│ │ │ +
167 }
│ │ │ +
168 }
│ │ │ +
169
│ │ │ +
170 template <class M>
│ │ │ +
171 static constexpr size_type offset (const M& m) noexcept
│ │ │ +
172 {
│ │ │ +
173 if constexpr (M::extents_type::rank() == 0)
│ │ │ +
174 return m();
│ │ │ +
175 else {
│ │ │ +
176 if (m.required_span_size() == 0)
│ │ │ +
177 return 0;
│ │ │ +
178 else {
│ │ │ +
179 return unpackIntegerSequence([&](auto... r) {
│ │ │ +
180 return m((r,0)...); }, // map the index tuple (0,0...)
│ │ │ +
181 std::make_index_sequence<M::extents_type::rank()>{});
│ │ │ +
182 }
│ │ │ +
183 }
│ │ │ +
184 }
│ │ │ +
185
│ │ │ +
186private:
│ │ │ +
187 [[no_unique_address]] extents_type extents_;
│ │ │ +
188 strides_type strides_;
│ │ │ +
189};
│ │ │ +
│ │ │ +
190
│ │ │ +
191} // end namespace Dune::Std
│ │ │ +
192
│ │ │ +
193#endif // DUNE_COMMON_STD_LAYOUT_STRIDE_HH
│ │ │ + │ │ │ + │ │ │ +
decltype(auto) constexpr unpackIntegerSequence(F &&f, std::integer_sequence< I, i... > sequence)
Unpack an std::integer_sequence<I,i...> to std::integral_constant<I,i>...
Definition indices.hh:124
│ │ │ +
Namespace for features backported from new C++ standards.
Definition default_accessor.hh:10
│ │ │ +
Multidimensional index space with dynamic and static extents.
Definition extents.hh:54
│ │ │ +
constexpr index_type extent(rank_type r) const noexcept
Return the extent of dimension i
Definition extents.hh:100
│ │ │ +
A layout where the rightmost extent has stride 1, and strides increase right-to-left as the product o...
Definition fwd_layouts.hh:30
│ │ │ +
A layout mapping where the strides are user-defined.
Definition fwd_layouts.hh:40
│ │ │ +
A layout mapping where the strides are user-defined.
Definition layout_stride.hh:19
│ │ │ +
constexpr mapping(const extents_type &e, const span< OtherIndexType, rank_ > &s) noexcept
Construct the mapping from given extents and strides.
Definition layout_stride.hh:59
│ │ │ +
Extents extents_type
Definition layout_stride.hh:24
│ │ │ +
constexpr mapping & operator=(const mapping &) noexcept=default
Copy-assignment for the mapping.
│ │ │ +
constexpr bool is_exhaustive() const noexcept
Definition layout_stride.hh:118
│ │ │ +
constexpr mapping() noexcept
The default construction initializes the strides from layout_right.
Definition layout_stride.hh:36
│ │ │ +
constexpr mapping(const extents_type &e, const std::array< OtherIndexType, rank_ > &s) noexcept
Construct the mapping from given extents and strides.
Definition layout_stride.hh:47
│ │ │ +
constexpr index_type stride(rank_type i) const noexcept
Get the single stride i
Definition layout_stride.hh:135
│ │ │ +
typename extents_type::index_type index_type
Definition layout_stride.hh:25
│ │ │ +
static constexpr bool is_always_exhaustive() noexcept
Definition layout_stride.hh:112
│ │ │ +
constexpr const extents_type & extents() const noexcept
Definition layout_stride.hh:85
│ │ │ +
static constexpr bool is_strided() noexcept
Definition layout_stride.hh:116
│ │ │ +
static constexpr bool is_always_strided() noexcept
Definition layout_stride.hh:113
│ │ │ +
constexpr index_type required_span_size() const noexcept
Return the sum 1 + (E(0)-1)*S(0) + (E(1)-1)*S(1) + ...
Definition layout_stride.hh:88
│ │ │ +
constexpr const strides_type & strides() const noexcept
Get the array of all strides.
Definition layout_stride.hh:127
│ │ │ +
constexpr mapping(const mapping &) noexcept=default
Copy constructor for the mapping.
│ │ │ +
typename extents_type::rank_type rank_type
Definition layout_stride.hh:27
│ │ │ +
static constexpr bool is_unique() noexcept
Definition layout_stride.hh:115
│ │ │ +
constexpr index_type operator()() const noexcept
The default offset for rank-0 tensors is 0.
Definition layout_stride.hh:106
│ │ │ +
typename extents_type::size_type size_type
Definition layout_stride.hh:26
│ │ │ +
static constexpr bool is_always_unique() noexcept
Definition layout_stride.hh:111
│ │ │ +
A contiguous sequence of elements with static or dynamic extent.
Definition span.hh:126
│ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ @@ -1,520 +1,308 @@ │ │ │ │ dune-common 2.10 │ │ │ │ Loading... │ │ │ │ Searching... │ │ │ │ No Matches │ │ │ │ * _d_u_n_e │ │ │ │ * _c_o_m_m_o_n │ │ │ │ -tupleutility.hh │ │ │ │ + * _s_t_d │ │ │ │ +layout_stride.hh │ │ │ │ _G_o_ _t_o_ _t_h_e_ _d_o_c_u_m_e_n_t_a_t_i_o_n_ _o_f_ _t_h_i_s_ _f_i_l_e_. │ │ │ │ 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ 2// vi: set et ts=4 sw=2 sts=2: │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright © DUNE Project contributors, see file │ │ │ │ LICENSE.md in module root │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ -5 │ │ │ │ -6#ifndef DUNE_TUPLE_UTILITY_HH │ │ │ │ -7#define DUNE_TUPLE_UTILITY_HH │ │ │ │ -8 │ │ │ │ -9#include │ │ │ │ -10#include │ │ │ │ -11#include │ │ │ │ -12#include │ │ │ │ +5#ifndef DUNE_COMMON_STD_LAYOUT_STRIDE_HH │ │ │ │ +6#define DUNE_COMMON_STD_LAYOUT_STRIDE_HH │ │ │ │ +7 │ │ │ │ +8#include │ │ │ │ +9#include │ │ │ │ +10 │ │ │ │ +11#include <_d_u_n_e_/_c_o_m_m_o_n_/_i_n_d_i_c_e_s_._h_h> │ │ │ │ +12#include <_d_u_n_e_/_c_o_m_m_o_n_/_s_t_d_/_i_m_p_l_/_f_w_d___l_a_y_o_u_t_s_._h_h> │ │ │ │ 13 │ │ │ │ -14#include <_d_u_n_e_/_c_o_m_m_o_n_/_h_y_b_r_i_d_u_t_i_l_i_t_i_e_s_._h_h> │ │ │ │ -15#include <_d_u_n_e_/_c_o_m_m_o_n_/_t_y_p_e_t_r_a_i_t_s_._h_h> │ │ │ │ -16 │ │ │ │ -17namespace _D_u_n_e { │ │ │ │ -18 │ │ │ │ -41 template │ │ │ │ -_4_2 decltype(auto) _a_p_p_l_y_P_a_r_t_i_a_l(F&& f, ArgTuple&& args, std::integer_sequence /*indices*/) │ │ │ │ -43 { │ │ │ │ -44 return f(std::get(args)...); │ │ │ │ -45 } │ │ │ │ -46 │ │ │ │ -47 template │ │ │ │ -_4_8 struct _T_u_p_l_e_A_c_c_e_s_s_T_r_a_i_t_s │ │ │ │ -49 { │ │ │ │ -_5_0 typedef typename std::add_const::type& _C_o_n_s_t_T_y_p_e; │ │ │ │ -_5_1 typedef T& _N_o_n_C_o_n_s_t_T_y_p_e; │ │ │ │ -_5_2 typedef const typename std::remove_const::type& _P_a_r_a_m_e_t_e_r_T_y_p_e; │ │ │ │ -53 }; │ │ │ │ +14namespace _D_u_n_e_:_:_S_t_d { │ │ │ │ +15 │ │ │ │ +17template │ │ │ │ +_1_8class _l_a_y_o_u_t___s_t_r_i_d_e_:_:_m_a_p_p_i_n_g │ │ │ │ +19{ │ │ │ │ +_2_0 template friend class _m_a_p_p_i_n_g; │ │ │ │ +21 static constexpr typename Extents::rank_type rank_ = Extents::rank(); │ │ │ │ +22 │ │ │ │ +23public: │ │ │ │ +_2_4 using _e_x_t_e_n_t_s___t_y_p_e = Extents; │ │ │ │ +_2_5 using _i_n_d_e_x___t_y_p_e = typename extents_type::index_type; │ │ │ │ +_2_6 using _s_i_z_e___t_y_p_e = typename extents_type::size_type; │ │ │ │ +_2_7 using _r_a_n_k___t_y_p_e = typename extents_type::rank_type; │ │ │ │ +_2_8 using _l_a_y_o_u_t___t_y_p_e = _l_a_y_o_u_t___s_t_r_i_d_e; │ │ │ │ +29 │ │ │ │ +30private: │ │ │ │ +31 using strides_type = std::array; │ │ │ │ +32 │ │ │ │ +33public: │ │ │ │ +34 │ │ │ │ +_3_6 constexpr _m_a_p_p_i_n_g () noexcept │ │ │ │ +37 : _m_a_p_p_i_n_g(_l_a_y_o_u_t___r_i_g_h_t::template _m_a_p_p_i_n_g<_e_x_t_e_n_t_s___t_y_p_e>{}) │ │ │ │ +38 {} │ │ │ │ +39 │ │ │ │ +_4_1 constexpr _m_a_p_p_i_n_g (const _m_a_p_p_i_n_g&) noexcept = default; │ │ │ │ +42 │ │ │ │ +44 template , │ │ │ │ +int> = 0, │ │ │ │ +46 std::enable_if_t, int> = 0> │ │ │ │ +_4_7 constexpr _m_a_p_p_i_n_g (const _e_x_t_e_n_t_s___t_y_p_e& e, const std:: │ │ │ │ +array& s) noexcept │ │ │ │ +48 : extents_(e) │ │ │ │ +49 , strides_{} │ │ │ │ +50 { │ │ │ │ +51 for (_r_a_n_k___t_y_p_e r = 0; r < rank_; ++r) │ │ │ │ +52 strides_[r] = s[r]; │ │ │ │ +53 } │ │ │ │ 54 │ │ │ │ -55 template │ │ │ │ -_5_6 struct _T_u_p_l_e_A_c_c_e_s_s_T_r_a_i_t_s │ │ │ │ -57 { │ │ │ │ -_5_8 typedef typename std::add_const::type* _C_o_n_s_t_T_y_p_e; │ │ │ │ -_5_9 typedef T* _N_o_n_C_o_n_s_t_T_y_p_e; │ │ │ │ -_6_0 typedef T* _P_a_r_a_m_e_t_e_r_T_y_p_e; │ │ │ │ -61 }; │ │ │ │ -62 │ │ │ │ -63 template │ │ │ │ -_6_4 struct _T_u_p_l_e_A_c_c_e_s_s_T_r_a_i_t_s │ │ │ │ -65 { │ │ │ │ -_6_6 typedef T& _C_o_n_s_t_T_y_p_e; │ │ │ │ -_6_7 typedef T& _N_o_n_C_o_n_s_t_T_y_p_e; │ │ │ │ -_6_8 typedef T& _P_a_r_a_m_e_t_e_r_T_y_p_e; │ │ │ │ -69 }; │ │ │ │ -70 │ │ │ │ -78 template │ │ │ │ -_7_9 struct _N_u_l_l_P_o_i_n_t_e_r_I_n_i_t_i_a_l_i_s_e_r; │ │ │ │ -80 │ │ │ │ -81 template │ │ │ │ -_8_2 struct _N_u_l_l_P_o_i_n_t_e_r_I_n_i_t_i_a_l_i_s_e_r<_s_t_d::tuple > │ │ │ │ -83 { │ │ │ │ -_8_4 typedef std::tuple _R_e_s_u_l_t_T_y_p_e; │ │ │ │ -_8_5 static _R_e_s_u_l_t_T_y_p_e _a_p_p_l_y() │ │ │ │ -86 { │ │ │ │ -87 return _R_e_s_u_l_t_T_y_p_e(static_cast(nullptr)...); │ │ │ │ -88 } │ │ │ │ -89 }; │ │ │ │ -90 │ │ │ │ -115 template