--- /srv/reproducible-results/rbuild-debian/r-b-build.163xaY0n/b1/dune-common_2.9.0-2_armhf.changes +++ /srv/reproducible-results/rbuild-debian/r-b-build.163xaY0n/b2/dune-common_2.9.0-2_armhf.changes ├── Files │ @@ -1,4 +1,4 @@ │ │ 14b043c09be4076b9a62bef33443361a 537192 debug optional libdune-common-dev-dbgsym_2.9.0-2_armhf.deb │ b75f8c5f2b0802dde13d74914765e00b 374740 libdevel optional libdune-common-dev_2.9.0-2_armhf.deb │ - e47c553d16daf50c752cc0c3f7194117 2757436 doc optional libdune-common-doc_2.9.0-2_all.deb │ + f77c408793563bf3bd33e0e087541f98 2763088 doc optional libdune-common-doc_2.9.0-2_all.deb ├── libdune-common-doc_2.9.0-2_all.deb │ ├── file list │ │ @@ -1,3 +1,3 @@ │ │ -rw-r--r-- 0 0 0 4 2023-01-12 15:39:41.000000 debian-binary │ │ --rw-r--r-- 0 0 0 26480 2023-01-12 15:39:41.000000 control.tar.xz │ │ --rw-r--r-- 0 0 0 2730764 2023-01-12 15:39:41.000000 data.tar.xz │ │ +-rw-r--r-- 0 0 0 26424 2023-01-12 15:39:41.000000 control.tar.xz │ │ +-rw-r--r-- 0 0 0 2736472 2023-01-12 15:39:41.000000 data.tar.xz │ ├── control.tar.xz │ │ ├── control.tar │ │ │ ├── ./md5sums │ │ │ │ ├── ./md5sums │ │ │ │ │┄ Files differ │ │ │ │ ├── line order │ │ │ │ │ @@ -17,35 +17,34 @@ │ │ │ │ │ usr/share/doc/libdune-common-doc/buildsystem/html/search.html │ │ │ │ │ usr/share/doc/libdune-common-doc/buildsystem/html/searchindex.js │ │ │ │ │ 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 │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00023_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00026.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00026_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00029.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00029_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00032.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00032_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00035.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00035_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00038.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00038_source.html │ │ │ │ │ +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 │ │ │ │ │ @@ -56,26 +55,26 @@ │ │ │ │ │ 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 │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00068_source.html │ │ │ │ │ -usr/share/doc/libdune-common-doc/doxygen/a00071.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00074.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00077.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00077_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00080.html │ │ │ │ │ -usr/share/doc/libdune-common-doc/doxygen/a00080_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00083.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00083_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00086.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00086_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00089.html │ │ │ │ │ +usr/share/doc/libdune-common-doc/doxygen/a00089_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00092.html │ │ │ │ │ +usr/share/doc/libdune-common-doc/doxygen/a00092_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00095.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00095_source.html │ │ │ │ │ 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 │ │ │ │ │ @@ -83,43 +82,47 @@ │ │ │ │ │ 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 │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00131_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00134.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00134_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00137.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00137_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00140.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00140_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00143.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00143_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00146.html │ │ │ │ │ +usr/share/doc/libdune-common-doc/doxygen/a00146_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00149.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00149_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00152.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00152_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00155.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00155_source.html │ │ │ │ │ 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 │ │ │ │ │ @@ -137,34 +140,33 @@ │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00194.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00194_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00197.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00197_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00200.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00200_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00203.html │ │ │ │ │ +usr/share/doc/libdune-common-doc/doxygen/a00203_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00206.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00206_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00209.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00209_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00212.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00212_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00215.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00215_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00218.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00218_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00221.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00221_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00224.html │ │ │ │ │ -usr/share/doc/libdune-common-doc/doxygen/a00224_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00227.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00227_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00230.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00230_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00233.html │ │ │ │ │ -usr/share/doc/libdune-common-doc/doxygen/a00233_source.html │ │ │ │ │ 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 │ │ │ │ │ @@ -186,49 +188,48 @@ │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00269.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00269_source.html │ │ │ │ │ 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 │ │ │ │ │ -usr/share/doc/libdune-common-doc/doxygen/a00332_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00335.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00335_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00338.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00338_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00341.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00341_source.html │ │ │ │ │ usr/share/doc/libdune-common-doc/doxygen/a00344.html │ │ │ │ │ @@ -253,15 +254,14 @@ │ │ │ │ │ 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 │ ├── data.tar.xz │ │ ├── data.tar │ │ │ ├── file list │ │ │ │ @@ -26,258 +26,258 @@ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 2944 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/buildsystem/html/search.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 10569 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/buildsystem/html/searchindex.js │ │ │ │ -rw-r--r-- 0 root (0) root (0) 1683 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/changelog.Debian.gz │ │ │ │ -rw-r--r-- 0 root (0) root (0) 7231 2022-10-20 18:41: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 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 2875 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00002.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6156 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00008.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 18508 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00008_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6433 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00011.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 56061 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00011_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5802 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00014.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 49130 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00014_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 11001 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00017.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 285442 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00017_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6463 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00020.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 38085 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00020_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8529 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00023.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 68849 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00023_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8223 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00026.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 45084 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00026_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5455 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00029.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 33081 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00029_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6215 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00032.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 32452 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00032_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 18448 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00035.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 177953 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00035_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 11262 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00038.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 97989 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00038_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 12174 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00044.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 170838 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00044_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 3488 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00047.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4599 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00047_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7187 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00050.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 31844 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00050_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 3479 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00053.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4602 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00053_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8958 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00056.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 171994 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00056_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7395 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00059.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 135895 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00059_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6387 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00062.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 18874 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00062_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6387 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00065.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 44463 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00065_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8593 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00068.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 50688 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00068_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 22487 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00071.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4754 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00074.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5420 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00077.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8892 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00077_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8243 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00080.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 40020 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00080_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 17498 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00083.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 44697 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00083_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6004 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00086.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 16983 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00086_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4537 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00089.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6651 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00092.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9892 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00095.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 109105 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00095_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6044 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00098.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8357 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00098_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8575 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00101.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 60148 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00101_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4512 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00104.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6996 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00104_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7240 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00107.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 18045 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00107_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7987 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00110.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 61732 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00110_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 3214 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00113.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 51504 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00113_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7934 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00116.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 24902 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00119.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 62033 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00119_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 11254 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00122.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 114010 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00122_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9138 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00125.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6998 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00128.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 148981 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00128_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5848 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00131.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 20583 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00131_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4942 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00134.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 29332 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00134_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 15379 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00137.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 48457 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00137_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5093 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00140.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10799 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00140_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6373 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00143.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 18116 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00143_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 21197 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00146.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5301 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00149.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7858 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00149_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4155 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00152.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4756 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00152_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 13669 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00155.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 53424 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00155_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 3650 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00158.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6145 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00158_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8569 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00161.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 15045 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00161_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 3941 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00164.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4754 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00008.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6651 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00011.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6253 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00014.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 15564 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00014_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4537 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00017.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7160 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00020.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 13976 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00020_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7215 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00023.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 30184 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00023_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5301 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00026.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7858 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00026_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5064 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00029.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9917 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00029_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 13285 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00032.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 28077 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00032_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5420 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00035.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8892 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00035_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 45376 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00038.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 14273 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00038_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4584 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00041.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 13590 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00041_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8243 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00044.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 40020 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00044_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 3650 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00047.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6145 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00047_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6044 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00050.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8357 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00050_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 73012 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00053.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 145326 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00053_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9514 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00056.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 18624 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00056_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 13788 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00059.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 86891 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00059_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 22309 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00062.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 41730 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00062_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 13240 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00065.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 19678 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00065_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6504 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00068.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10628 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00068_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 3479 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00074.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 31969 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00077.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 351570 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00077_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 3944 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00080.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 20498 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00083.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 65100 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00083_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8013 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00086.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 143638 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00086_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5431 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00089.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6938 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00089_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6650 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00092.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 12338 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00092_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6373 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00095.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 18116 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00095_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 11254 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00098.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 114010 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00098_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6004 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00101.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 16983 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00101_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6998 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00104.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 148981 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00104_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 16962 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00107.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 166161 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00107_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 13669 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00110.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 53424 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00110_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4998 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00113.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8995 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00113_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4512 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00116.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6996 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00116_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7471 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00119.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9668 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00119_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10688 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00122.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 22213 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00122_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7196 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00125.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9379 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00125_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4126 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00128.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 18020 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00128_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4942 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00131.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 29332 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00131_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7240 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00134.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 18045 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00134_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 18479 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00137.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 101876 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00137_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7987 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00140.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 61732 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00140_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6666 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00143.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7883 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00143_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5094 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00146.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 21556 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00146_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5605 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00149.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9719 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00149_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 16848 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00152.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 42375 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00152_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4480 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00155.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7248 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00155_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4474 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00158.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6339 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00158_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5186 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00161.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8487 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00161_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4480 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00164.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7691 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00164_source.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 5164 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00167.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 33610 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00167_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 18479 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00170.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 101876 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00170_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 19755 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00173.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 29417 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00173_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7657 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00176.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 119846 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00176_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6479 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00179.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 51046 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00179_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5990 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00182.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6401 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00182_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10688 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00185.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 22213 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00185_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 55958 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00188.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 127006 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00188_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 14232 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00191.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 65414 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00191_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8809 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00194.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10158 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00194_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6403 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00197.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 42750 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00197_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5031 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00170.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 15647 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00170_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 15379 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00173.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 48457 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00173_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8809 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00176.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10158 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00176_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6156 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00179.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 18508 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00179_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5947 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00182.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 20957 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00182_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8575 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00185.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 60148 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00185_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 17498 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00188.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 44697 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00188_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4885 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00191.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6495 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00191_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8569 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00194.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 15045 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00194_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4809 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00197.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 30708 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00197_source.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3202 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00200.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 88611 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00200_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 3779 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00203.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6650 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00206.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 12338 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00206_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 11314 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00209.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 53376 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00209_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 17418 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00212.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 76033 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00212_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5094 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00215.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 21556 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00215_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4584 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00218.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 13590 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00218_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5485 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00221.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10357 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00221_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 20498 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00224.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 65100 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00224_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5031 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00227.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 15647 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00227_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6674 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00203.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 107074 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00203_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 55958 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00206.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 127006 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00206_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5610 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00209.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 16342 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00209_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5848 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00212.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 20583 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00212_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9316 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00215.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 242326 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00215_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4250 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00218.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6054 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00218_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7678 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00221.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 11713 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00221_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 3779 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00224.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4155 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00227.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4756 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00227_source.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 4899 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00230.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 7547 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00230_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4126 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00233.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 18020 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00233_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7160 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00236.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 13976 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00236_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 13788 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00239.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 86891 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00239_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9316 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00242.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 242326 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00242_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 20174 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00245.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 130337 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00245_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7196 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00248.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9379 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00248_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 16962 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00251.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 166161 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00251_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4776 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00254.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6226 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00254_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5947 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00257.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 20957 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00257_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 13833 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00260.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 145936 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00260_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 73012 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00263.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 145326 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00263_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 31969 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00266.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 351570 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00266_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6504 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00269.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 10628 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00269_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 22309 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00272.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 41730 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00272_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 13240 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00275.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 19678 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00275_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 3479 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00278.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9514 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00281.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 18624 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00281_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7678 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00284.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 11713 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00284_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7215 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00287.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 30184 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00287_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8190 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00290.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 15083 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00290_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5964 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00293.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 19049 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00293_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4250 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00296.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6054 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00296_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4998 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00299.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8995 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00299_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4885 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00302.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6495 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00302_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 3944 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00305.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6666 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00308.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7883 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00308_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5173 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00311.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 40029 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00311_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8013 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00314.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 143638 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00314_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5064 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00317.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9917 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00317_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4809 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00320.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 30708 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00320_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5142 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00323.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9611 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00323_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5186 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00326.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8487 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00326_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4480 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00329.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7691 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00329_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4474 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00332.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6339 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00332_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 16848 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00335.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 42375 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00335_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4480 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00338.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7248 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00338_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5605 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00341.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9719 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00341_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6674 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00344.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 107074 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00344_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 13285 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00347.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 28077 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00347_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5431 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00350.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6938 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00350_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9970 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00353.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 31576 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00353_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6595 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00356.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 96963 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00356_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 45376 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00359.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 14273 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00359_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6941 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00362.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 21983 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00362_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8012 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00365.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 39175 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00365_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 4866 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00368.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 22263 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00368_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 12461 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00371.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 91639 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00371_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 13484 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00374.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 22858 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00374_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 5610 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00377.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 16342 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00377_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7934 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00233.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9428 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00236.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 242767 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00236_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5093 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00239.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10799 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00239_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6479 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00242.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 51046 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00242_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4866 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00245.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 22263 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00245_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5964 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00248.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 19049 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00248_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 13833 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00251.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 145936 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00251_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5142 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00254.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9611 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00254_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8012 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00257.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 39175 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00257_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 13484 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00260.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 22858 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00260_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5485 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00263.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 10357 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00263_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 11314 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00266.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 53376 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00266_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 3214 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00269.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 51504 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00269_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7657 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00272.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 119846 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00272_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 19755 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00275.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 29417 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00275_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9970 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00278.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 31576 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00278_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 24902 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00281.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 62033 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00281_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 17418 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00284.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 76033 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00284_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8190 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00287.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 15083 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00287_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4776 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00290.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6226 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00290_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5173 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00293.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 40029 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00293_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9892 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00296.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 109105 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00296_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 21197 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00299.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 20174 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00302.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 130337 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00302_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6403 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00305.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 42750 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00305_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5990 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00308.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6401 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00308_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 3941 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00311.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 18448 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00314.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 177953 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00314_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6387 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00317.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 18874 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00317_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8593 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00320.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 50688 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00320_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6433 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00323.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 56061 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00323_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 3488 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00326.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4599 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00326_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 12174 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00329.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 170838 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00329_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 22487 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00332.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8223 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00335.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 45084 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00335_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7395 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00338.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 135895 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00338_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5802 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00341.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 49130 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00341_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6387 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00344.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 44463 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00344_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 11262 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00347.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 97989 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00347_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6463 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00350.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 38085 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00350_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 3479 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00353.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 4602 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00353_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 7187 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00356.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 31844 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00356_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 11001 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00359.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 285442 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00359_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8958 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00362.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 171994 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00362_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 5455 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00365.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 33081 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00365_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8529 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00368.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 68849 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00368_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6215 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00371.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 32452 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00371_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6941 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00374.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 21983 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00374_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 8506 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00377.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 25816 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00377_source.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3729 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00380.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 6253 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00383.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 15564 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00383_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 8506 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00386.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 25816 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00386_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9428 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00389.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 242767 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00389_source.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 7471 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00392.html │ │ │ │ --rw-r--r-- 0 root (0) root (0) 9668 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00392_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 9138 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00383.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 12461 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00386.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 91639 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00386_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 6595 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00389.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 96963 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00389_source.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 14232 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00392.html │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 65414 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00392_source.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 7728 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00395.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 5564 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00396.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 260283 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00397.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 32579 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00397.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 39061 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00398.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 2362 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00398.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 9062 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/a00399.html │ │ │ │ @@ -1130,15 +1130,15 @@ │ │ │ │ -rw-r--r-- 0 root (0) root (0) 4380 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_be46aaae597ce098e36afa8d6ef4f49b.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 2528 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_be46aaae597ce098e36afa8d6ef4f49b_dep.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 45880 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_e151556194dc695299293609645e9437.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 9370 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_e151556194dc695299293609645e9437_dep.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 3476 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/dir_e68e8157741866f444e17edd764ebbae.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 746 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/doc.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 33676 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/doxygen.css │ │ │ │ --rw-r--r-- 0 root (0) root (0) 168145 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/dune-common.tag.gz │ │ │ │ +-rw-r--r-- 0 root (0) root (0) 168015 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/dune-common.tag.gz │ │ │ │ -rw-r--r-- 0 root (0) root (0) 4452 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/dynsections.js │ │ │ │ -rw-r--r-- 0 root (0) root (0) 50913 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/files.html │ │ │ │ -rw-r--r-- 0 root (0) root (0) 616 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/folderclosed.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 597 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/folderopen.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 2987 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/form_0.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 2993 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/form_1.png │ │ │ │ -rw-r--r-- 0 root (0) root (0) 2582 2023-01-12 15:39:41.000000 ./usr/share/doc/libdune-common-doc/doxygen/form_10.png │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00008.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: tuplevector.hh File Reference │ │ │ │ +dune-common: stdthread.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,52 +63,36 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
tuplevector.hh File Reference
│ │ │ │ +
stdthread.cc 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>
│ │ │ │ -
│ │ │ │ -

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::TupleVector< T >
 A class augmenting std::tuple by element access via operator[]. More...
 
│ │ │ │ +
#include <cstdlib>
│ │ │ │ +#include <iostream>
│ │ │ │ +#include <mutex>
│ │ │ │ +#include <ostream>
│ │ │ │ +#include <dune/common/stdthread.hh>
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ Functions

template<class... T>
constexpr auto Dune::makeTupleVector (T &&... t)
 
void Dune::doAssertCallOnce (const char *file, int line, const char *function)
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

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

│ │ │ │ -
Author
Carsten Gräser
│ │ │ │ -
│ │ │ │ + │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -utf-8 │ │ │ │ │ +us-ascii │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,35 +4,24 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Classes | Namespaces | Functions │ │ │ │ │ -tuplevector.hh File Reference │ │ │ │ │ -Provides the TupleVector class that augments std::tuple by operator[]. More... │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -Go_to_the_source_code_of_this_file. │ │ │ │ │ - Classes │ │ │ │ │ -class  Dune::TupleVector<_T_> │ │ │ │ │ -  A class augmenting std::tuple by element access via operator[]. More... │ │ │ │ │ -  │ │ │ │ │ +Namespaces | Functions │ │ │ │ │ +stdthread.cc File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ -constexpr auto Dune::makeTupleVector (T &&... t) │ │ │ │ │ +void Dune::doAssertCallOnce (const char *file, int line, const char *function) │ │ │ │ │   │ │ │ │ │ -***** Detailed Description ***** │ │ │ │ │ -Provides the TupleVector class that augments std::tuple by operator[]. │ │ │ │ │ - Author │ │ │ │ │ - Carsten Gräser │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00011.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: selection.hh File Reference │ │ │ │ +dune-common: debugalign.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,53 +58,51 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces
│ │ │ │ - │ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
debugalign.cc File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

Provides classes for selecting indices based on attribute flags. │ │ │ │ -More...

│ │ │ │ -
#include "indexset.hh"
│ │ │ │ -#include <dune/common/iteratorfacades.hh>
│ │ │ │ -
│ │ │ │ -

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::SelectionIterator< TS, TG, TL, N >
 A const iterator over an uncached selection. More...
 
class  Dune::UncachedSelection< TS, TG, TL, N >
 An uncached selection of indices. More...
 
class  Dune::Selection< TS, TG, TL, N >
 A cached selection of indices. More...
 
│ │ │ │ +
#include <config.h>
│ │ │ │ +#include <cstddef>
│ │ │ │ +#include <cstdlib>
│ │ │ │ +#include <functional>
│ │ │ │ +#include <ios>
│ │ │ │ +#include <iostream>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <dune/common/debugalign.hh>
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

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

│ │ │ │ +Functions

static void Dune::defaultViolatedAlignment (const char *className, std::size_t expectedAlignment, const void *address)
 default alignment violation handler More...
 
ViolatedAlignmentHandler & Dune::violatedAlignmentHandler ()
 access the handler called by violatedAlignment() More...
 
void Dune::violatedAlignment (const char *className, std::size_t expectedAlignment, const void *address)
 called when an alignment violation is detected More...
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Provides classes for selecting indices based on attribute flags.

│ │ │ │ -
Author
Markus Blatt
│ │ │ │ -
│ │ │ │ + │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,36 +4,39 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -Classes | Namespaces │ │ │ │ │ -selection.hh File Reference │ │ │ │ │ -Common » Parallel_Communication » Parallel_Computing_based_on_Indexsets │ │ │ │ │ -Provides classes for selecting indices based on attribute flags. More... │ │ │ │ │ -#include "indexset.hh" │ │ │ │ │ -#include │ │ │ │ │ -Go_to_the_source_code_of_this_file. │ │ │ │ │ - Classes │ │ │ │ │ -class  Dune::SelectionIterator<_TS,_TG,_TL,_N_> │ │ │ │ │ -  A const iterator over an uncached selection. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::UncachedSelection<_TS,_TG,_TL,_N_> │ │ │ │ │ -  An uncached selection of indices. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::Selection<_TS,_TG,_TL,_N_> │ │ │ │ │ -  A cached selection of indices. More... │ │ │ │ │ -  │ │ │ │ │ +Namespaces | Functions │ │ │ │ │ +debugalign.cc File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ -***** Detailed Description ***** │ │ │ │ │ -Provides classes for selecting indices based on attribute flags. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ + Functions │ │ │ │ │ + static void Dune::defaultViolatedAlignment (const char │ │ │ │ │ + *className, std::size_t expectedAlignment, const │ │ │ │ │ + void *address) │ │ │ │ │ +  default alignment violation handler More... │ │ │ │ │ +  │ │ │ │ │ +ViolatedAlignmentHandler & Dune::violatedAlignmentHandler () │ │ │ │ │ +  access the handler called by violatedAlignment() │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ + void Dune::violatedAlignment (const char *className, │ │ │ │ │ + std::size_t expectedAlignment, const void *address) │ │ │ │ │ +  called when an alignment violation is detected │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00014.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: mpipack.hh File Reference │ │ │ │ +dune-common: classname.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,51 +58,54 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces
│ │ │ │ -
mpipack.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
classname.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

See MPI_Pack. │ │ │ │ +

A free function to provide the demangled class name of a given object or type as a string. │ │ │ │ More...

│ │ │ │ -
#include <vector>
│ │ │ │ -#include <mpi.h>
│ │ │ │ -#include <dune/common/parallel/mpicommunication.hh>
│ │ │ │ -#include <dune/common/parallel/mpidata.hh>
│ │ │ │ +
#include <cstdlib>
│ │ │ │ +#include <memory>
│ │ │ │ +#include <string>
│ │ │ │ +#include <typeinfo>
│ │ │ │ +#include <type_traits>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::MPIPack
 
struct  Dune::MPIData< P, std::enable_if_t< std::is_same< std::remove_const_t< P >, MPIPack >::value > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

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

│ │ │ │ +Functions

template<class T >
std::string Dune::className ()
 Provide the demangled class name of a type T as a string. More...
 
template<class T >
std::string Dune::className (T &&v)
 Provide the demangled class name of a given object as a string. More...
 
│ │ │ │

Detailed Description

│ │ │ │ -

See MPI_Pack.

│ │ │ │ -

This Wrapper class takes care of the memory management and provides methods to pack and unpack objects. All objects that can be used for MPI communication can also be packed and unpacked to/from MPIPack.

│ │ │ │ -
Author
Nils-Arne Dreier
│ │ │ │ +

A free function to provide the demangled class name of a given object or type as a string.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,37 +4,37 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -Classes | Namespaces │ │ │ │ │ -mpipack.hh File Reference │ │ │ │ │ -Common » Parallel_Communication │ │ │ │ │ -See MPI_Pack. More... │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Namespaces | Functions │ │ │ │ │ +classname.hh File Reference │ │ │ │ │ +A free function to provide the demangled class name of a given object or type │ │ │ │ │ +as a string. More... │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ - Classes │ │ │ │ │ - class  Dune::MPIPack │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::MPIData<_P,_std::enable_if_t<_std::is_same<_std::remove_const_t< │ │ │ │ │ - P_>,_MPIPack_>::value_>_> │ │ │ │ │ -  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +std::string Dune::className () │ │ │ │ │ +  Provide the demangled class name of a type T as a string. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +std::string Dune::className (T &&v) │ │ │ │ │ +  Provide the demangled class name of a given object as a string. │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -See MPI_Pack. │ │ │ │ │ -This Wrapper class takes care of the memory management and provides methods to │ │ │ │ │ -pack and unpack objects. All objects that can be used for MPI communication can │ │ │ │ │ -also be packed and unpacked to/from MPIPack. │ │ │ │ │ - Author │ │ │ │ │ - Nils-Arne Dreier │ │ │ │ │ +A free function to provide the demangled class name of a given object or type │ │ │ │ │ +as a string. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00014_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: mpipack.hh Source File │ │ │ │ +dune-common: classname.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,235 +58,95 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
mpipack.hh
│ │ │ │ +
classname.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 (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
20#ifndef DUNE_COMMON_PARALLEL_MPIPACK_HH
│ │ │ │ -
21#define DUNE_COMMON_PARALLEL_MPIPACK_HH
│ │ │ │ -
22
│ │ │ │ -
23#include <vector>
│ │ │ │ -
24#if HAVE_MPI
│ │ │ │ -
25#include <mpi.h>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
28
│ │ │ │ -
29
│ │ │ │ -
30namespace Dune {
│ │ │ │ -
31
│ │ │ │ -
32 class MPIPack {
│ │ │ │ -
33 std::vector<char> _buffer;
│ │ │ │ -
34 int _position;
│ │ │ │ -
35 MPI_Comm _comm;
│ │ │ │ -
36
│ │ │ │ -
37 friend struct MPIData<MPIPack>;
│ │ │ │ -
38 friend struct MPIData<const MPIPack>;
│ │ │ │ -
39 public:
│ │ │ │ -
40 MPIPack(Communication<MPI_Comm> comm, std::size_t size = 0)
│ │ │ │ -
41 : _buffer(size)
│ │ │ │ -
42 , _position(0)
│ │ │ │ -
43 , _comm(comm)
│ │ │ │ -
44 {}
│ │ │ │ -
45
│ │ │ │ -
46 // Its not valid to copy a MPIPack but you can move it
│ │ │ │ -
47 MPIPack(const MPIPack&) = delete;
│ │ │ │ -
48 MPIPack& operator = (const MPIPack& other) = delete;
│ │ │ │ -
49 MPIPack(MPIPack&&) = default;
│ │ │ │ -
50 MPIPack& operator = (MPIPack&& other) = default;
│ │ │ │ -
51
│ │ │ │ -
57 template<class T>
│ │ │ │ -
58 void pack(const T& data){
│ │ │ │ -
59 auto mpidata = getMPIData(data);
│ │ │ │ -
60 int size = getPackSize(mpidata.size(), _comm, mpidata.type());
│ │ │ │ -
61 constexpr bool has_static_size = decltype(getMPIData(std::declval<T&>()))::static_size;
│ │ │ │ -
62 if(!has_static_size)
│ │ │ │ -
63 size += getPackSize(1, _comm, MPI_INT);
│ │ │ │ -
64 if (_position + size > 0 && size_t(_position + size) > _buffer.size()) // resize buffer if necessary
│ │ │ │ -
65 _buffer.resize(_position + size);
│ │ │ │ -
66 if(!has_static_size){
│ │ │ │ -
67 int size = mpidata.size();
│ │ │ │ -
68 MPI_Pack(&size, 1, MPI_INT, _buffer.data(), _buffer.size(),
│ │ │ │ -
69 &_position, _comm);
│ │ │ │ -
70 }
│ │ │ │ -
71 MPI_Pack(mpidata.ptr(), mpidata.size(),
│ │ │ │ -
72 mpidata.type(), _buffer.data(), _buffer.size(),
│ │ │ │ -
73 &_position, _comm);
│ │ │ │ -
74 }
│ │ │ │ -
75
│ │ │ │ -
80 template<class T>
│ │ │ │ -
81 auto /*void*/ unpack(T& data)
│ │ │ │ -
82 -> std::enable_if_t<decltype(getMPIData(data))::static_size, void>
│ │ │ │ -
83 {
│ │ │ │ -
84 auto mpidata = getMPIData(data);
│ │ │ │ -
85 MPI_Unpack(_buffer.data(), _buffer.size(), &_position,
│ │ │ │ -
86 mpidata.ptr(), mpidata.size(),
│ │ │ │ -
87 mpidata.type(), _comm);
│ │ │ │ -
88 }
│ │ │ │ -
89
│ │ │ │ -
94 template<class T>
│ │ │ │ -
95 auto /*void*/ unpack(T& data)
│ │ │ │ -
96 -> std::enable_if_t<!decltype(getMPIData(data))::static_size, void>
│ │ │ │ -
97 {
│ │ │ │ -
98 auto mpidata = getMPIData(data);
│ │ │ │ -
99 int size = 0;
│ │ │ │ -
100 MPI_Unpack(_buffer.data(), _buffer.size(), &_position,
│ │ │ │ -
101 &size, 1,
│ │ │ │ -
102 MPI_INT, _comm);
│ │ │ │ -
103 mpidata.resize(size);
│ │ │ │ -
104 MPI_Unpack(_buffer.data(), _buffer.size(), &_position,
│ │ │ │ -
105 mpidata.ptr(), mpidata.size(),
│ │ │ │ -
106 mpidata.type(), _comm);
│ │ │ │ -
107 }
│ │ │ │ -
108
│ │ │ │ -
109
│ │ │ │ -
111 template<typename T>
│ │ │ │ -
112 friend MPIPack& operator << (MPIPack& p, const T& t){
│ │ │ │ -
113 p.pack(t);
│ │ │ │ -
114 return p;
│ │ │ │ -
115 }
│ │ │ │ -
116
│ │ │ │ -
118 template<typename T>
│ │ │ │ -
119 friend MPIPack& operator >> (MPIPack& p, T& t){
│ │ │ │ -
120 p.unpack(t);
│ │ │ │ -
121 return p;
│ │ │ │ -
122 }
│ │ │ │ -
123
│ │ │ │ -
125 template<typename T>
│ │ │ │ -
126 MPIPack& read(T& t){
│ │ │ │ -
127 unpack(t);
│ │ │ │ -
128 return *this;
│ │ │ │ -
129 }
│ │ │ │ -
130
│ │ │ │ -
132 template<typename T>
│ │ │ │ -
133 MPIPack& write(const T& t){
│ │ │ │ -
134 pack(t);
│ │ │ │ -
135 return *this;
│ │ │ │ -
136 }
│ │ │ │ -
137
│ │ │ │ -
141 void resize(size_t size){
│ │ │ │ -
142 _buffer.resize(size);
│ │ │ │ -
143 }
│ │ │ │ -
144
│ │ │ │ -
147 void enlarge(int s) {
│ │ │ │ -
148 _buffer.resize(_buffer.size() + s);
│ │ │ │ -
149 }
│ │ │ │ -
150
│ │ │ │ -
153 size_t size() const {
│ │ │ │ -
154 return _buffer.size();
│ │ │ │ -
155 }
│ │ │ │ -
156
│ │ │ │ -
160 void seek(int p){
│ │ │ │ -
161 _position = p;
│ │ │ │ -
162 }
│ │ │ │ -
163
│ │ │ │ -
167 int tell() const{
│ │ │ │ -
168 return _position;
│ │ │ │ -
169 }
│ │ │ │ -
170
│ │ │ │ -
173 bool eof() const{
│ │ │ │ -
174 return std::size_t(_position)==_buffer.size();
│ │ │ │ -
175 }
│ │ │ │ -
176
│ │ │ │ -
180 static int getPackSize(int len, const MPI_Comm& comm, const MPI_Datatype& dt){
│ │ │ │ -
181 int size;
│ │ │ │ -
182 MPI_Pack_size(len, dt, comm, &size);
│ │ │ │ -
183 return size;
│ │ │ │ -
184 }
│ │ │ │ -
185
│ │ │ │ -
186 friend bool operator==(const MPIPack& a, const MPIPack& b) {
│ │ │ │ -
187 return a._buffer == b._buffer && a._comm == b._comm;
│ │ │ │ -
188 }
│ │ │ │ -
189 friend bool operator!=(const MPIPack& a, const MPIPack& b) {
│ │ │ │ -
190 return !(a==b);
│ │ │ │ -
191 }
│ │ │ │ -
192
│ │ │ │ -
193 };
│ │ │ │ -
194
│ │ │ │ -
195 template<class P>
│ │ │ │ -
196 struct MPIData<P, std::enable_if_t<std::is_same<std::remove_const_t<P>, MPIPack>::value>> {
│ │ │ │ -
197 protected:
│ │ │ │ -
198 friend auto getMPIData<P>(P& t);
│ │ │ │ -
199 MPIData(P& t) :
│ │ │ │ -
200 data_(t)
│ │ │ │ -
201 {}
│ │ │ │ -
202 public:
│ │ │ │ -
203 static constexpr bool static_size = std::is_const<P>::value;
│ │ │ │ -
204
│ │ │ │ -
205 void* ptr() {
│ │ │ │ -
206 return (void*) data_._buffer.data();
│ │ │ │ -
207 }
│ │ │ │ -
208
│ │ │ │ -
209 int size() {
│ │ │ │ -
210 return data_.size();
│ │ │ │ -
211 }
│ │ │ │ -
212
│ │ │ │ -
213 MPI_Datatype type() const{
│ │ │ │ -
214 return MPI_PACKED;
│ │ │ │ -
215 }
│ │ │ │ -
216
│ │ │ │ -
217 void resize(int size){
│ │ │ │ -
218 data_.resize(size);
│ │ │ │ -
219 }
│ │ │ │ -
220 protected:
│ │ │ │ - │ │ │ │ -
222 };
│ │ │ │ -
223
│ │ │ │ -
224} // end namespace Dune
│ │ │ │ -
225
│ │ │ │ -
226#endif
│ │ │ │ -
227#endif
│ │ │ │ -
Implements an utility class that provides MPI's collective communication methods.
│ │ │ │ -
Interface class to translate objects to a MPI_Datatype, void* and size used for MPI calls.
│ │ │ │ -
STL namespace.
│ │ │ │ +
5#ifndef DUNE_CLASSNAME_HH
│ │ │ │ +
6#define DUNE_CLASSNAME_HH
│ │ │ │ +
7
│ │ │ │ +
13#include <cstdlib>
│ │ │ │ +
14#include <memory>
│ │ │ │ +
15#include <string>
│ │ │ │ +
16#include <typeinfo>
│ │ │ │ +
17#include <type_traits>
│ │ │ │ +
18
│ │ │ │ +
19#if __has_include(<cxxabi.h>) && !DISABLE_CXA_DEMANGLE
│ │ │ │ +
20#define HAVE_CXA_DEMANGLE 1
│ │ │ │ +
21#include <cxxabi.h>
│ │ │ │ +
22#endif // #if HAVE_CXA_DEMANGLE
│ │ │ │ +
23
│ │ │ │ +
24namespace Dune {
│ │ │ │ +
25
│ │ │ │ +
26 namespace Impl {
│ │ │ │ +
27
│ │ │ │ +
28 inline std::string demangle(std::string name)
│ │ │ │ +
29 {
│ │ │ │ +
30#if HAVE_CXA_DEMANGLE
│ │ │ │ +
31 int status;
│ │ │ │ +
32 std::unique_ptr<char, void(*)(void*)>
│ │ │ │ +
33 demangled(abi::__cxa_demangle(name.c_str(), nullptr, nullptr, &status),
│ │ │ │ +
34 std::free);
│ │ │ │ +
35 if( demangled )
│ │ │ │ +
36 name = demangled.get();
│ │ │ │ +
37#endif // #if HAVE_CXA_DEMANGLE
│ │ │ │ +
38 return name;
│ │ │ │ +
39 }
│ │ │ │ +
40 }
│ │ │ │ +
41
│ │ │ │ +
43 /*
│ │ │ │ +
44 * \ingroup CxxUtilities
│ │ │ │ +
45 */
│ │ │ │ +
46 template <class T>
│ │ │ │ +
47 std::string className ()
│ │ │ │ +
48 {
│ │ │ │ +
49 typedef typename std::remove_reference<T>::type TR;
│ │ │ │ +
50 std::string className = Impl::demangle( typeid( TR ).name() );
│ │ │ │ +
51 if (std::is_const<TR>::value)
│ │ │ │ +
52 className += " const";
│ │ │ │ +
53 if (std::is_volatile<TR>::value)
│ │ │ │ +
54 className += " volatile";
│ │ │ │ +
55 if (std::is_lvalue_reference<T>::value)
│ │ │ │ +
56 className += "&";
│ │ │ │ +
57 else if (std::is_rvalue_reference<T>::value)
│ │ │ │ +
58 className += "&&";
│ │ │ │ +
59 return className;
│ │ │ │ +
60 }
│ │ │ │ +
61
│ │ │ │ +
63 /*
│ │ │ │ +
64 * \ingroup CxxUtilities
│ │ │ │ +
65 */
│ │ │ │ +
66 template <class T>
│ │ │ │ +
67 std::string className ( T&& v)
│ │ │ │ +
68 {
│ │ │ │ +
69 typedef typename std::remove_reference<T>::type TR;
│ │ │ │ +
70 std::string className = Impl::demangle( typeid(v).name() );
│ │ │ │ +
71 if (std::is_const<TR>::value)
│ │ │ │ +
72 className += " const";
│ │ │ │ +
73 if (std::is_volatile<TR>::value)
│ │ │ │ +
74 className += " volatile";
│ │ │ │ +
75 return className;
│ │ │ │ +
76 }
│ │ │ │ +
77} // namespace Dune
│ │ │ │ +
78
│ │ │ │ +
79#endif // DUNE_CLASSNAME_HH
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
auto getMPIData(T &t)
Definition: mpidata.hh:43
│ │ │ │ -
Specialization of Communication for MPI.
Definition: mpicommunication.hh:108
│ │ │ │ -
Definition: mpidata.hh:50
│ │ │ │ -
T & data_
Definition: mpidata.hh:53
│ │ │ │ -
int size() const
Definition: mpidata.hh:67
│ │ │ │ -
static constexpr bool static_size
Definition: mpidata.hh:65
│ │ │ │ -
Definition: mpipack.hh:32
│ │ │ │ -
void enlarge(int s)
Enlarges the internal buffer.
Definition: mpipack.hh:147
│ │ │ │ -
friend MPIPack & operator>>(MPIPack &p, T &t)
Unpacks data from the object.
Definition: mpipack.hh:119
│ │ │ │ -
friend MPIPack & operator<<(MPIPack &p, const T &t)
Packs the data into the object. Enlarges the internal buffer if necessary.
Definition: mpipack.hh:112
│ │ │ │ -
friend bool operator!=(const MPIPack &a, const MPIPack &b)
Definition: mpipack.hh:189
│ │ │ │ -
size_t size() const
Returns the size of the internal buffer.
Definition: mpipack.hh:153
│ │ │ │ -
MPIPack & operator=(const MPIPack &other)=delete
│ │ │ │ -
MPIPack(Communication< MPI_Comm > comm, std::size_t size=0)
Definition: mpipack.hh:40
│ │ │ │ -
void pack(const T &data)
Packs the data into the object. Enlarges the internal buffer if necessary.
Definition: mpipack.hh:58
│ │ │ │ -
auto unpack(T &data) -> std::enable_if_t<!decltype(getMPIData(data))::static_size, void >
Unpacks data from the object.
Definition: mpipack.hh:95
│ │ │ │ -
auto unpack(T &data) -> std::enable_if_t< decltype(getMPIData(data))::static_size, void >
Unpacks data from the object.
Definition: mpipack.hh:81
│ │ │ │ -
friend bool operator==(const MPIPack &a, const MPIPack &b)
Definition: mpipack.hh:186
│ │ │ │ -
MPIPack(const MPIPack &)=delete
│ │ │ │ -
void seek(int p)
Sets the position in the buffer where the next pack/unpack operation should take place.
Definition: mpipack.hh:160
│ │ │ │ -
bool eof() const
Checks whether the end of the buffer is reached.
Definition: mpipack.hh:173
│ │ │ │ -
void resize(size_t size)
Resizes the internal buffer.
Definition: mpipack.hh:141
│ │ │ │ -
int tell() const
Gets the position in the buffer where the next pack/unpack operation should take place.
Definition: mpipack.hh:167
│ │ │ │ -
MPIPack(MPIPack &&)=default
│ │ │ │ -
MPIPack & read(T &t)
Unpacks data from the object.
Definition: mpipack.hh:126
│ │ │ │ -
static int getPackSize(int len, const MPI_Comm &comm, const MPI_Datatype &dt)
Returns the size of the data needed to store the data in an MPIPack. See MPI_Pack_size.
Definition: mpipack.hh:180
│ │ │ │ -
MPIPack & write(const T &t)
Packs the data into the object. Enlarges the internal buffer if necessary.
Definition: mpipack.hh:133
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +
std::string className()
Provide the demangled class name of a type T as a string.
Definition: classname.hh:47
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,325 +4,92 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -mpipack.hh │ │ │ │ │ +classname.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 (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ - 20#ifndef DUNE_COMMON_PARALLEL_MPIPACK_HH │ │ │ │ │ - 21#define DUNE_COMMON_PARALLEL_MPIPACK_HH │ │ │ │ │ - 22 │ │ │ │ │ - 23#include │ │ │ │ │ - 24#if HAVE_MPI │ │ │ │ │ - 25#include │ │ │ │ │ - 26#include │ │ │ │ │ - 27#include │ │ │ │ │ - 28 │ │ │ │ │ - 29 │ │ │ │ │ - 30namespace Dune { │ │ │ │ │ - 31 │ │ │ │ │ -32 class MPIPack { │ │ │ │ │ - 33 std::vector _buffer; │ │ │ │ │ - 34 int _position; │ │ │ │ │ -35 MPI_Comm _comm; │ │ │ │ │ - 36 │ │ │ │ │ - 37 friend struct MPIData; │ │ │ │ │ - 38 friend struct MPIData; │ │ │ │ │ - 39 public: │ │ │ │ │ -40 MPIPack(Communication comm, std::size_t size = 0) │ │ │ │ │ - 41 : _buffer(size) │ │ │ │ │ - 42 , _position(0) │ │ │ │ │ - 43 , _comm(comm) │ │ │ │ │ - 44 {} │ │ │ │ │ - 45 │ │ │ │ │ - 46 // Its not valid to copy a MPIPack but you can move it │ │ │ │ │ -47 MPIPack(const MPIPack&) = delete; │ │ │ │ │ -48 MPIPack& operator_=(const MPIPack& other) = delete; │ │ │ │ │ -49 MPIPack(MPIPack&&) = default; │ │ │ │ │ -50 MPIPack& operator_=(MPIPack&& other) = default; │ │ │ │ │ - 51 │ │ │ │ │ - 57 template │ │ │ │ │ -58 void pack(const T& data){ │ │ │ │ │ - 59 auto mpidata = getMPIData(data); │ │ │ │ │ - 60 int size = getPackSize(mpidata.size(), _comm, mpidata.type()); │ │ │ │ │ - 61 constexpr bool has_static_size = decltype(getMPIData(std::declval())):: │ │ │ │ │ -static_size; │ │ │ │ │ - 62 if(!has_static_size) │ │ │ │ │ - 63 size += getPackSize(1, _comm, MPI_INT); │ │ │ │ │ - 64 if (_position + size > 0 && size_t(_position + size) > _buffer.size()) / │ │ │ │ │ -/ resize buffer if necessary │ │ │ │ │ - 65 _buffer.resize(_position + size); │ │ │ │ │ - 66 if(!has_static_size){ │ │ │ │ │ - 67 int size = mpidata.size(); │ │ │ │ │ - 68 MPI_Pack(&size, 1, MPI_INT, _buffer.data(), _buffer.size(), │ │ │ │ │ - 69 &_position, _comm); │ │ │ │ │ - 70 } │ │ │ │ │ - 71 MPI_Pack(mpidata.ptr(), mpidata.size(), │ │ │ │ │ - 72 mpidata.type(), _buffer.data(), _buffer.size(), │ │ │ │ │ - 73 &_position, _comm); │ │ │ │ │ - 74 } │ │ │ │ │ - 75 │ │ │ │ │ - 80 template │ │ │ │ │ -81 auto /*void*/ unpack(T& data) │ │ │ │ │ - 82 -> std::enable_if_t │ │ │ │ │ - 83 { │ │ │ │ │ - 84 auto mpidata = getMPIData(data); │ │ │ │ │ - 85 MPI_Unpack(_buffer.data(), _buffer.size(), &_position, │ │ │ │ │ - 86 mpidata.ptr(), mpidata.size(), │ │ │ │ │ - 87 mpidata.type(), _comm); │ │ │ │ │ - 88 } │ │ │ │ │ - 89 │ │ │ │ │ - 94 template │ │ │ │ │ -95 auto /*void*/ unpack(T& data) │ │ │ │ │ - 96 -> std::enable_if_t │ │ │ │ │ - 97 { │ │ │ │ │ - 98 auto mpidata = getMPIData(data); │ │ │ │ │ - 99 int size = 0; │ │ │ │ │ - 100 MPI_Unpack(_buffer.data(), _buffer.size(), &_position, │ │ │ │ │ - 101 &size, 1, │ │ │ │ │ - 102 MPI_INT, _comm); │ │ │ │ │ - 103 mpidata.resize(size); │ │ │ │ │ - 104 MPI_Unpack(_buffer.data(), _buffer.size(), &_position, │ │ │ │ │ - 105 mpidata.ptr(), mpidata.size(), │ │ │ │ │ - 106 mpidata.type(), _comm); │ │ │ │ │ - 107 } │ │ │ │ │ - 108 │ │ │ │ │ - 109 │ │ │ │ │ - 111 template │ │ │ │ │ -112 friend MPIPack& operator_<<(MPIPack& p, const T& t){ │ │ │ │ │ - 113 p.pack(t); │ │ │ │ │ - 114 return p; │ │ │ │ │ - 115 } │ │ │ │ │ - 116 │ │ │ │ │ - 118 template │ │ │ │ │ -119 friend MPIPack& operator_>>(MPIPack& p, T& t){ │ │ │ │ │ - 120 p.unpack(t); │ │ │ │ │ - 121 return p; │ │ │ │ │ - 122 } │ │ │ │ │ - 123 │ │ │ │ │ - 125 template │ │ │ │ │ -126 MPIPack& read(T& t){ │ │ │ │ │ - 127 unpack(t); │ │ │ │ │ - 128 return *this; │ │ │ │ │ - 129 } │ │ │ │ │ - 130 │ │ │ │ │ - 132 template │ │ │ │ │ -133 MPIPack& write(const T& t){ │ │ │ │ │ - 134 pack(t); │ │ │ │ │ - 135 return *this; │ │ │ │ │ - 136 } │ │ │ │ │ - 137 │ │ │ │ │ -141 void resize(size_t size){ │ │ │ │ │ - 142 _buffer.resize(size); │ │ │ │ │ - 143 } │ │ │ │ │ - 144 │ │ │ │ │ -147 void enlarge(int s) { │ │ │ │ │ - 148 _buffer.resize(_buffer.size() + s); │ │ │ │ │ - 149 } │ │ │ │ │ - 150 │ │ │ │ │ -153 size_t size() const { │ │ │ │ │ - 154 return _buffer.size(); │ │ │ │ │ - 155 } │ │ │ │ │ - 156 │ │ │ │ │ -160 void seek(int p){ │ │ │ │ │ - 161 _position = p; │ │ │ │ │ - 162 } │ │ │ │ │ - 163 │ │ │ │ │ -167 int tell() const{ │ │ │ │ │ - 168 return _position; │ │ │ │ │ - 169 } │ │ │ │ │ - 170 │ │ │ │ │ -173 bool eof() const{ │ │ │ │ │ - 174 return std::size_t(_position)==_buffer.size(); │ │ │ │ │ - 175 } │ │ │ │ │ - 176 │ │ │ │ │ -180 static int getPackSize(int len, const MPI_Comm& comm, const MPI_Datatype& │ │ │ │ │ -dt){ │ │ │ │ │ - 181 int size; │ │ │ │ │ - 182 MPI_Pack_size(len, dt, comm, &size); │ │ │ │ │ - 183 return size; │ │ │ │ │ - 184 } │ │ │ │ │ - 185 │ │ │ │ │ -186 friend bool operator==(const MPIPack& a, const MPIPack& b) { │ │ │ │ │ - 187 return a._buffer == b._buffer && a._comm == b._comm; │ │ │ │ │ - 188 } │ │ │ │ │ -189 friend bool operator!=(const MPIPack& a, const MPIPack& b) { │ │ │ │ │ - 190 return !(a==b); │ │ │ │ │ - 191 } │ │ │ │ │ - 192 │ │ │ │ │ - 193 }; │ │ │ │ │ - 194 │ │ │ │ │ - 195 template │ │ │ │ │ -196 struct MPIData, │ │ │ │ │ -MPIPack>::value>> { │ │ │ │ │ - 197 protected: │ │ │ │ │ -198 friend auto getMPIData

(P& t); │ │ │ │ │ -199 MPIData(P& t) : │ │ │ │ │ - 200 data_(t) │ │ │ │ │ - 201 {} │ │ │ │ │ - 202 public: │ │ │ │ │ -203 static constexpr bool static_size = std::is_const

::value; │ │ │ │ │ - 204 │ │ │ │ │ -205 void* ptr() { │ │ │ │ │ - 206 return (void*) data_._buffer.data(); │ │ │ │ │ - 207 } │ │ │ │ │ - 208 │ │ │ │ │ -209 int size() { │ │ │ │ │ - 210 return data_.size(); │ │ │ │ │ - 211 } │ │ │ │ │ - 212 │ │ │ │ │ -213 MPI_Datatype type() const{ │ │ │ │ │ - 214 return MPI_PACKED; │ │ │ │ │ - 215 } │ │ │ │ │ - 216 │ │ │ │ │ -217 void resize(int size){ │ │ │ │ │ - 218 data_.resize(size); │ │ │ │ │ - 219 } │ │ │ │ │ - 220 protected: │ │ │ │ │ -221 P& data_; │ │ │ │ │ - 222 }; │ │ │ │ │ - 223 │ │ │ │ │ - 224} // end namespace Dune │ │ │ │ │ - 225 │ │ │ │ │ - 226#endif │ │ │ │ │ - 227#endif │ │ │ │ │ -mpicommunication.hh │ │ │ │ │ -Implements an utility class that provides MPI's collective communication │ │ │ │ │ -methods. │ │ │ │ │ -mpidata.hh │ │ │ │ │ -Interface class to translate objects to a MPI_Datatype, void* and size used for │ │ │ │ │ -MPI calls. │ │ │ │ │ -std │ │ │ │ │ -STL namespace. │ │ │ │ │ + 5#ifndef DUNE_CLASSNAME_HH │ │ │ │ │ + 6#define DUNE_CLASSNAME_HH │ │ │ │ │ + 7 │ │ │ │ │ + 13#include │ │ │ │ │ + 14#include │ │ │ │ │ + 15#include │ │ │ │ │ + 16#include │ │ │ │ │ + 17#include │ │ │ │ │ + 18 │ │ │ │ │ + 19#if __has_include() && !DISABLE_CXA_DEMANGLE │ │ │ │ │ + 20#define HAVE_CXA_DEMANGLE 1 │ │ │ │ │ + 21#include │ │ │ │ │ + 22#endif // #if HAVE_CXA_DEMANGLE │ │ │ │ │ + 23 │ │ │ │ │ + 24namespace Dune { │ │ │ │ │ + 25 │ │ │ │ │ + 26 namespace Impl { │ │ │ │ │ + 27 │ │ │ │ │ + 28 inline std::string demangle(std::string name) │ │ │ │ │ + 29 { │ │ │ │ │ + 30#if HAVE_CXA_DEMANGLE │ │ │ │ │ + 31 int status; │ │ │ │ │ + 32 std::unique_ptr │ │ │ │ │ + 33 demangled(abi::__cxa_demangle(name.c_str(), nullptr, nullptr, &status), │ │ │ │ │ + 34 std::free); │ │ │ │ │ + 35 if( demangled ) │ │ │ │ │ + 36 name = demangled.get(); │ │ │ │ │ + 37#endif // #if HAVE_CXA_DEMANGLE │ │ │ │ │ + 38 return name; │ │ │ │ │ + 39 } │ │ │ │ │ + 40 } │ │ │ │ │ + 41 │ │ │ │ │ + 43 /* │ │ │ │ │ + 44 * \ingroup CxxUtilities │ │ │ │ │ + 45 */ │ │ │ │ │ + 46 template │ │ │ │ │ +47 std::string className () │ │ │ │ │ + 48 { │ │ │ │ │ + 49 typedef typename std::remove_reference::type TR; │ │ │ │ │ + 50 std::string className = Impl::demangle( typeid( TR ).name() ); │ │ │ │ │ + 51 if (std::is_const::value) │ │ │ │ │ + 52 className += " const"; │ │ │ │ │ + 53 if (std::is_volatile::value) │ │ │ │ │ + 54 className += " volatile"; │ │ │ │ │ + 55 if (std::is_lvalue_reference::value) │ │ │ │ │ + 56 className += "&"; │ │ │ │ │ + 57 else if (std::is_rvalue_reference::value) │ │ │ │ │ + 58 className += "&&"; │ │ │ │ │ + 59 return className; │ │ │ │ │ + 60 } │ │ │ │ │ + 61 │ │ │ │ │ + 63 /* │ │ │ │ │ + 64 * \ingroup CxxUtilities │ │ │ │ │ + 65 */ │ │ │ │ │ + 66 template │ │ │ │ │ +67 std::string className ( T&& v) │ │ │ │ │ + 68 { │ │ │ │ │ + 69 typedef typename std::remove_reference::type TR; │ │ │ │ │ + 70 std::string className = Impl::demangle( typeid(v).name() ); │ │ │ │ │ + 71 if (std::is_const::value) │ │ │ │ │ + 72 className += " const"; │ │ │ │ │ + 73 if (std::is_volatile::value) │ │ │ │ │ + 74 className += " volatile"; │ │ │ │ │ + 75 return className; │ │ │ │ │ + 76 } │ │ │ │ │ + 77} // namespace Dune │ │ │ │ │ + 78 │ │ │ │ │ + 79#endif // DUNE_CLASSNAME_HH │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::getMPIData │ │ │ │ │ -auto getMPIData(T &t) │ │ │ │ │ -Definition: mpidata.hh:43 │ │ │ │ │ -Dune::Communication<_MPI_Comm_> │ │ │ │ │ -Specialization of Communication for MPI. │ │ │ │ │ -Definition: mpicommunication.hh:108 │ │ │ │ │ -Dune::MPIData │ │ │ │ │ -Definition: mpidata.hh:50 │ │ │ │ │ -Dune::MPIData::data_ │ │ │ │ │ -T & data_ │ │ │ │ │ -Definition: mpidata.hh:53 │ │ │ │ │ -Dune::MPIData::size │ │ │ │ │ -int size() const │ │ │ │ │ -Definition: mpidata.hh:67 │ │ │ │ │ -Dune::MPIData::static_size │ │ │ │ │ -static constexpr bool static_size │ │ │ │ │ -Definition: mpidata.hh:65 │ │ │ │ │ -Dune::MPIPack │ │ │ │ │ -Definition: mpipack.hh:32 │ │ │ │ │ -Dune::MPIPack::enlarge │ │ │ │ │ -void enlarge(int s) │ │ │ │ │ -Enlarges the internal buffer. │ │ │ │ │ -Definition: mpipack.hh:147 │ │ │ │ │ -Dune::MPIPack::operator>> │ │ │ │ │ -friend MPIPack & operator>>(MPIPack &p, T &t) │ │ │ │ │ -Unpacks data from the object. │ │ │ │ │ -Definition: mpipack.hh:119 │ │ │ │ │ -Dune::MPIPack::operator<< │ │ │ │ │ -friend MPIPack & operator<<(MPIPack &p, const T &t) │ │ │ │ │ -Packs the data into the object. Enlarges the internal buffer if necessary. │ │ │ │ │ -Definition: mpipack.hh:112 │ │ │ │ │ -Dune::MPIPack::operator!= │ │ │ │ │ -friend bool operator!=(const MPIPack &a, const MPIPack &b) │ │ │ │ │ -Definition: mpipack.hh:189 │ │ │ │ │ -Dune::MPIPack::size │ │ │ │ │ -size_t size() const │ │ │ │ │ -Returns the size of the internal buffer. │ │ │ │ │ -Definition: mpipack.hh:153 │ │ │ │ │ -Dune::MPIPack::operator= │ │ │ │ │ -MPIPack & operator=(const MPIPack &other)=delete │ │ │ │ │ -Dune::MPIPack::MPIPack │ │ │ │ │ -MPIPack(Communication< MPI_Comm > comm, std::size_t size=0) │ │ │ │ │ -Definition: mpipack.hh:40 │ │ │ │ │ -Dune::MPIPack::pack │ │ │ │ │ -void pack(const T &data) │ │ │ │ │ -Packs the data into the object. Enlarges the internal buffer if necessary. │ │ │ │ │ -Definition: mpipack.hh:58 │ │ │ │ │ -Dune::MPIPack::unpack │ │ │ │ │ -auto unpack(T &data) -> std::enable_if_t │ │ │ │ │ -Unpacks data from the object. │ │ │ │ │ -Definition: mpipack.hh:95 │ │ │ │ │ -Dune::MPIPack::unpack │ │ │ │ │ -auto unpack(T &data) -> std::enable_if_t< decltype(getMPIData(data)):: │ │ │ │ │ -static_size, void > │ │ │ │ │ -Unpacks data from the object. │ │ │ │ │ -Definition: mpipack.hh:81 │ │ │ │ │ -Dune::MPIPack::operator== │ │ │ │ │ -friend bool operator==(const MPIPack &a, const MPIPack &b) │ │ │ │ │ -Definition: mpipack.hh:186 │ │ │ │ │ -Dune::MPIPack::MPIPack │ │ │ │ │ -MPIPack(const MPIPack &)=delete │ │ │ │ │ -Dune::MPIPack::seek │ │ │ │ │ -void seek(int p) │ │ │ │ │ -Sets the position in the buffer where the next pack/unpack operation should │ │ │ │ │ -take place. │ │ │ │ │ -Definition: mpipack.hh:160 │ │ │ │ │ -Dune::MPIPack::eof │ │ │ │ │ -bool eof() const │ │ │ │ │ -Checks whether the end of the buffer is reached. │ │ │ │ │ -Definition: mpipack.hh:173 │ │ │ │ │ -Dune::MPIPack::resize │ │ │ │ │ -void resize(size_t size) │ │ │ │ │ -Resizes the internal buffer. │ │ │ │ │ -Definition: mpipack.hh:141 │ │ │ │ │ -Dune::MPIPack::tell │ │ │ │ │ -int tell() const │ │ │ │ │ -Gets the position in the buffer where the next pack/unpack operation should │ │ │ │ │ -take place. │ │ │ │ │ -Definition: mpipack.hh:167 │ │ │ │ │ -Dune::MPIPack::MPIPack │ │ │ │ │ -MPIPack(MPIPack &&)=default │ │ │ │ │ -Dune::MPIPack::read │ │ │ │ │ -MPIPack & read(T &t) │ │ │ │ │ -Unpacks data from the object. │ │ │ │ │ -Definition: mpipack.hh:126 │ │ │ │ │ -Dune::MPIPack::getPackSize │ │ │ │ │ -static int getPackSize(int len, const MPI_Comm &comm, const MPI_Datatype &dt) │ │ │ │ │ -Returns the size of the data needed to store the data in an MPIPack. See │ │ │ │ │ -MPI_Pack_size. │ │ │ │ │ -Definition: mpipack.hh:180 │ │ │ │ │ -Dune::MPIPack::write │ │ │ │ │ -MPIPack & write(const T &t) │ │ │ │ │ -Packs the data into the object. Enlarges the internal buffer if necessary. │ │ │ │ │ -Definition: mpipack.hh:133 │ │ │ │ │ -Dune::MPIData<_P,_std::enable_if_t<_std::is_same<_std::remove_const_t<_P_>, │ │ │ │ │ -MPIPack_>::value_>_>::type │ │ │ │ │ -MPI_Datatype type() const │ │ │ │ │ -Definition: mpipack.hh:213 │ │ │ │ │ -Dune::MPIData<_P,_std::enable_if_t<_std::is_same<_std::remove_const_t<_P_>, │ │ │ │ │ -MPIPack_>::value_>_>::MPIData │ │ │ │ │ -MPIData(P &t) │ │ │ │ │ -Definition: mpipack.hh:199 │ │ │ │ │ -Dune::MPIData<_P,_std::enable_if_t<_std::is_same<_std::remove_const_t<_P_>, │ │ │ │ │ -MPIPack_>::value_>_>::size │ │ │ │ │ -int size() │ │ │ │ │ -Definition: mpipack.hh:209 │ │ │ │ │ -Dune::MPIData<_P,_std::enable_if_t<_std::is_same<_std::remove_const_t<_P_>, │ │ │ │ │ -MPIPack_>::value_>_>::ptr │ │ │ │ │ -void * ptr() │ │ │ │ │ -Definition: mpipack.hh:205 │ │ │ │ │ -Dune::MPIData<_P,_std::enable_if_t<_std::is_same<_std::remove_const_t<_P_>, │ │ │ │ │ -MPIPack_>::value_>_>::data_ │ │ │ │ │ -P & data_ │ │ │ │ │ -Definition: mpipack.hh:221 │ │ │ │ │ -Dune::MPIData<_P,_std::enable_if_t<_std::is_same<_std::remove_const_t<_P_>, │ │ │ │ │ -MPIPack_>::value_>_>::resize │ │ │ │ │ -void resize(int size) │ │ │ │ │ -Definition: mpipack.hh:217 │ │ │ │ │ +Dune::className │ │ │ │ │ +std::string className() │ │ │ │ │ +Provide the demangled class name of a type T as a string. │ │ │ │ │ +Definition: classname.hh:47 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00017.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: remoteindices.hh File Reference │ │ │ │ +dune-common: fmatrixev.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,89 +58,48 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ - │ │ │ │ +Macros
│ │ │ │ +
fmatrixev.cc File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

Classes describing a distributed indexset. │ │ │ │ -More...

│ │ │ │ -
#include <cassert>
│ │ │ │ -#include <iostream>
│ │ │ │ -#include <ostream>
│ │ │ │ -#include <map>
│ │ │ │ -#include <memory>
│ │ │ │ -#include <set>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <mpi.h>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/common/parallel/indexset.hh>
│ │ │ │ -#include <dune/common/parallel/mpitraits.hh>
│ │ │ │ -#include <dune/common/parallel/plocalindex.hh>
│ │ │ │ -#include <dune/common/sllist.hh>
│ │ │ │ -#include <dune/common/stdstreams.hh>
│ │ │ │ -
│ │ │ │ -

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::MPITraits< IndexPair< TG, ParallelLocalIndex< TA > > >
 
class  Dune::RemoteIndex< T1, T2 >
 Information about an index residing on another processor. More...
 
class  Dune::RemoteIndices< T, A >
 The indices present on remote processes. More...
 
class  Dune::RemoteIndexListModifier< T, A, mode >
 Modifier for adding and/or deleting remote indices from the remote index list. More...
 
class  Dune::RemoteIndexListModifier< T, A, mode >::InvalidPosition
 
class  Dune::CollectiveIterator< T, A >
 A collective iterator for moving over the remote indices for all processes collectively. More...
 
class  Dune::CollectiveIterator< T, A >::iterator
 Iterator over the valid underlying iterators. More...
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Namespaces

namespace  Dune
 Dune namespace.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +
#include <iostream>
│ │ │ │ +#include <cmath>
│ │ │ │ +#include <cassert>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +

│ │ │ │ -Functions

template<typename T1 , typename T2 >
std::ostream & Dune::operator<< (std::ostream &os, const RemoteIndex< T1, T2 > &index)
 
template<class T , class A >
std::ostream & Dune::operator<< (std::ostream &os, const RemoteIndices< T, A > &indices)
 
template<typename TG , typename TA >
std::ostream & Dune::operator<< (std::ostream &os, const RemoteIndex< TG, TA > &index)
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Macros

#define DUNE_FMATRIXEIGENVALUES_CC
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Classes describing a distributed indexset.

│ │ │ │ -
Author
Markus Blatt
│ │ │ │ -
│ │ │ │ +

Macro Definition Documentation

│ │ │ │ + │ │ │ │ +

◆ DUNE_FMATRIXEIGENVALUES_CC

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_FMATRIXEIGENVALUES_CC
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,74 +4,22 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -Classes | Namespaces | Functions │ │ │ │ │ -remoteindices.hh File Reference │ │ │ │ │ -Common » Parallel_Communication » Parallel_Computing_based_on_Indexsets │ │ │ │ │ -Classes describing a distributed indexset. More... │ │ │ │ │ -#include │ │ │ │ │ +Macros │ │ │ │ │ +fmatrixev.cc File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -Go_to_the_source_code_of_this_file. │ │ │ │ │ - Classes │ │ │ │ │ -class  Dune::MPITraits<_IndexPair<_TG,_ParallelLocalIndex<_TA_>_>_> │ │ │ │ │ -  │ │ │ │ │ -class  Dune::RemoteIndex<_T1,_T2_> │ │ │ │ │ -  Information about an index residing on another processor. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::RemoteIndices<_T,_A_> │ │ │ │ │ -  The indices present on remote processes. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::RemoteIndexListModifier<_T,_A,_mode_> │ │ │ │ │ -  Modifier for adding and/or deleting remote indices from the remote │ │ │ │ │ - index list. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::RemoteIndexListModifier<_T,_A,_mode_>::InvalidPosition │ │ │ │ │ -  │ │ │ │ │ -class  Dune::CollectiveIterator<_T,_A_> │ │ │ │ │ -  A collective iterator for moving over the remote indices for all │ │ │ │ │ - processes collectively. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::CollectiveIterator<_T,_A_>::iterator │ │ │ │ │ -  Iterator over the valid underlying iterators. More... │ │ │ │ │ -  │ │ │ │ │ - Namespaces │ │ │ │ │ -namespace  Dune │ │ │ │ │ -  Dune namespace. │ │ │ │ │ -  │ │ │ │ │ - Functions │ │ │ │ │ -template │ │ │ │ │ -std::ostream & Dune::operator<< (std::ostream &os, const RemoteIndex< T1, T2 > │ │ │ │ │ - &index) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -std::ostream & Dune::operator<< (std::ostream &os, const RemoteIndices< T, A > │ │ │ │ │ - &indices) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -std::ostream & Dune::operator<< (std::ostream &os, const RemoteIndex< TG, TA > │ │ │ │ │ - &index) │ │ │ │ │ + Macros │ │ │ │ │ +#define DUNE_FMATRIXEIGENVALUES_CC │ │ │ │ │   │ │ │ │ │ -***** Detailed Description ***** │ │ │ │ │ -Classes describing a distributed indexset. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ +***** Macro Definition Documentation ***** │ │ │ │ │ +***** ◆ DUNE_FMATRIXEIGENVALUES_CC ***** │ │ │ │ │ +#define DUNE_FMATRIXEIGENVALUES_CC │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00020.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: future.hh File Reference │ │ │ │ +dune-common: streamoperators.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,49 +58,57 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces
│ │ │ │ -
future.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
streamoperators.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <memory>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ + │ │ │ │ +

Implementation of stream operators for std::array and std::tuple. │ │ │ │ +More...

│ │ │ │ +
#include <array>
│ │ │ │ +#include <tuple>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <dune/common/hybridutilities.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::InvalidFutureException
 This exception is thrown when ready(), wait() or get() is called on an invalid future. A future is valid until get() is called and if it is not default-constructed and it was not moved from. More...
 
class  Dune::Future< T >
 Type-erasure for future-like objects. A future-like object is a object satisfying the interface of FutureBase. More...
 
class  Dune::PseudoFuture< T >
 A wrapper-class for a object which is ready immediately. More...
 
class  Dune::PseudoFuture< void >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

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

│ │ │ │ +Functions

template<typename Stream , typename... Ts>
Stream & Dune::operator<< (Stream &stream, const std::tuple< Ts... > &t)
 Print a std::tuple. More...
 
template<typename Stream , typename... Ts>
Stream & Dune::operator>> (Stream &stream, std::tuple< Ts... > &t)
 Read a std::tuple. More...
 
template<typename Stream , typename T , std::size_t N>
Stream & Dune::operator<< (Stream &stream, const std::array< T, N > &a)
 Print a std::array. More...
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

Implementation of stream operators for std::array and std::tuple.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,35 +4,37 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -Classes | Namespaces │ │ │ │ │ -future.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Namespaces | Functions │ │ │ │ │ +streamoperators.hh File Reference │ │ │ │ │ +Implementation of stream operators for std::array and std::tuple. More... │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ - Classes │ │ │ │ │ -class  Dune::InvalidFutureException │ │ │ │ │ - This exception is thrown when ready(), wait() or get() is called on an │ │ │ │ │ -  invalid future. A future is valid until get() is called and if it is │ │ │ │ │ - not default-constructed and it was not moved from. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::Future<_T_> │ │ │ │ │ -  Type-erasure for future-like objects. A future-like object is a object │ │ │ │ │ - satisfying the interface of FutureBase. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::PseudoFuture<_T_> │ │ │ │ │ -  A wrapper-class for a object which is ready immediately. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::PseudoFuture<_void_> │ │ │ │ │ -  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +Stream & Dune::operator<< (Stream &stream, const std::tuple< Ts... > &t) │ │ │ │ │ +  Print a std::tuple. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +Stream & Dune::operator>> (Stream &stream, std::tuple< Ts... > &t) │ │ │ │ │ +  Read a std::tuple. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +Stream & Dune::operator<< (Stream &stream, const std::array< T, N > &a) │ │ │ │ │ +  Print a std::array. More... │ │ │ │ │ +  │ │ │ │ │ +***** Detailed Description ***** │ │ │ │ │ +Implementation of stream operators for std::array and std::tuple. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00020_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: future.hh Source File │ │ │ │ +dune-common: streamoperators.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,211 +58,82 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
future.hh
│ │ │ │ +
streamoperators.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 (C) 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_PARALLEL_FUTURE_HH
│ │ │ │ -
6#define DUNE_COMMON_PARALLEL_FUTURE_HH
│ │ │ │ -
7
│ │ │ │ -
8#include <memory>
│ │ │ │ - │ │ │ │ -
10
│ │ │ │ -
11namespace Dune{
│ │ │ │ -
12
│ │ │ │ - │ │ │ │ -
18 {};
│ │ │ │ -
19
│ │ │ │ -
20 // forward declaration
│ │ │ │ -
21 template<class T>
│ │ │ │ -
22 class PseudoFuture;
│ │ │ │ -
23
│ │ │ │ -
27 template<class T>
│ │ │ │ -
28 class Future{
│ │ │ │ -
29 // Future interface:
│ │ │ │ -
30 class FutureBase{
│ │ │ │ -
31 public:
│ │ │ │ -
32 virtual ~FutureBase() = default;
│ │ │ │ -
33 virtual void wait() = 0;
│ │ │ │ -
34 virtual bool ready() const = 0;
│ │ │ │ -
35 virtual bool valid() const = 0;
│ │ │ │ -
36 virtual T get() = 0;
│ │ │ │ -
37 };
│ │ │ │ -
38
│ │ │ │ -
39 // model class
│ │ │ │ -
40 template<class F>
│ │ │ │ -
41 class FutureModel
│ │ │ │ -
42 : public FutureBase
│ │ │ │ -
43 {
│ │ │ │ -
44 F _future;
│ │ │ │ -
45 public:
│ │ │ │ -
46 FutureModel(F&& f)
│ │ │ │ -
47 : _future(std::forward<F>(f))
│ │ │ │ -
48 {}
│ │ │ │ +
5
│ │ │ │ +
6#ifndef DUNE_STREAMOPERATORS_HH
│ │ │ │ +
7#define DUNE_STREAMOPERATORS_HH
│ │ │ │ +
8
│ │ │ │ +
13#include <array>
│ │ │ │ +
14#include <tuple>
│ │ │ │ +
15#include <utility>
│ │ │ │ +
16
│ │ │ │ + │ │ │ │ +
18
│ │ │ │ +
19namespace Dune
│ │ │ │ +
20{
│ │ │ │ +
27 template<typename Stream, typename... Ts>
│ │ │ │ +
28 inline Stream& operator<<(Stream& stream, const std::tuple<Ts...>& t)
│ │ │ │ +
29 {
│ │ │ │ +
30 stream<<"[";
│ │ │ │ +
31 if(sizeof...(Ts)>0)
│ │ │ │ +
32 {
│ │ │ │ +
33 Hybrid::forEach(std::make_index_sequence<sizeof...(Ts)-1>{},
│ │ │ │ +
34 [&](auto i){stream<<std::get<i>(t)<<",";});
│ │ │ │ +
35 stream<<std::get<sizeof...(Ts)-1>(t);
│ │ │ │ +
36 }
│ │ │ │ +
37 stream<<"]";
│ │ │ │ +
38 return stream;
│ │ │ │ +
39 }
│ │ │ │ +
40
│ │ │ │ +
42 template<typename Stream, typename... Ts>
│ │ │ │ +
43 inline Stream& operator>>(Stream& stream, std::tuple<Ts...>& t)
│ │ │ │ +
44 {
│ │ │ │ +
45 Hybrid::forEach(std::make_index_sequence<sizeof...(Ts)>{},
│ │ │ │ +
46 [&](auto i){stream>>std::get<i>(t);});
│ │ │ │ +
47 return stream;
│ │ │ │ +
48 }
│ │ │ │
49
│ │ │ │ -
50 virtual void wait() override
│ │ │ │ -
51 {
│ │ │ │ -
52 _future.wait();
│ │ │ │ -
53 }
│ │ │ │ -
54
│ │ │ │ -
55 virtual bool ready() const override
│ │ │ │ -
56 {
│ │ │ │ -
57 return _future.ready();
│ │ │ │ -
58 }
│ │ │ │ -
59
│ │ │ │ -
60 virtual bool valid() const override
│ │ │ │ -
61 {
│ │ │ │ -
62 return _future.valid();
│ │ │ │ -
63 }
│ │ │ │ +
51 template<typename Stream, typename T, std::size_t N>
│ │ │ │ +
52 inline Stream& operator<<(Stream& stream, const std::array<T,N>& a)
│ │ │ │ +
53 {
│ │ │ │ +
54 stream<<"[";
│ │ │ │ +
55 if(N>0)
│ │ │ │ +
56 {
│ │ │ │ +
57 for(std::size_t i=0; i<N-1; ++i)
│ │ │ │ +
58 stream<<a[i]<<",";
│ │ │ │ +
59 stream<<a[N-1];
│ │ │ │ +
60 }
│ │ │ │ +
61 stream<<"]";
│ │ │ │ +
62 return stream;
│ │ │ │ +
63 }
│ │ │ │
64
│ │ │ │ -
65 virtual T get() override{
│ │ │ │ -
66 return (T)_future.get();
│ │ │ │ -
67 }
│ │ │ │ -
68 };
│ │ │ │ -
69
│ │ │ │ -
70 std::unique_ptr<FutureBase> _future;
│ │ │ │ -
71 public:
│ │ │ │ -
72 template<class F>
│ │ │ │ -
73 Future(F&& f)
│ │ │ │ -
74 : _future(std::make_unique<FutureModel<F>>(std::forward<F>(f)))
│ │ │ │ -
75 {}
│ │ │ │ -
76
│ │ │ │ -
77 template<class U, std::enable_if_t<std::is_same<U,T>::value && !std::is_same<T,void>::value>>
│ │ │ │ -
78 Future(U&& data)
│ │ │ │ -
79 : _future(std::make_unique<FutureModel<PseudoFuture<T>>>(PseudoFuture<T>(std::forward<U>(data))))
│ │ │ │ -
80 {}
│ │ │ │ -
81
│ │ │ │ -
82 Future() = default;
│ │ │ │ -
83
│ │ │ │ -
87 void wait(){
│ │ │ │ -
88 _future->wait();
│ │ │ │ -
89 }
│ │ │ │ -
90
│ │ │ │ -
95 T get() {
│ │ │ │ -
96 return _future->get();
│ │ │ │ -
97 }
│ │ │ │ -
98
│ │ │ │ -
103 bool ready() const {
│ │ │ │ -
104 return _future->ready();
│ │ │ │ -
105 }
│ │ │ │ -
106
│ │ │ │ -
112 bool valid() const {
│ │ │ │ -
113 if(_future)
│ │ │ │ -
114 return _future->valid();
│ │ │ │ -
115 return false;
│ │ │ │ -
116 }
│ │ │ │ -
117 };
│ │ │ │ -
118
│ │ │ │ -
121 template<class T>
│ │ │ │ - │ │ │ │ -
123 bool valid_;
│ │ │ │ -
124 T data_;
│ │ │ │ -
125 public:
│ │ │ │ - │ │ │ │ -
127 valid_(false)
│ │ │ │ -
128 {}
│ │ │ │ -
129
│ │ │ │ -
130 template<class U>
│ │ │ │ - │ │ │ │ -
132 valid_(true),
│ │ │ │ -
133 data_(std::forward<U>(u))
│ │ │ │ -
134 {}
│ │ │ │ -
135
│ │ │ │ -
136 void wait() {
│ │ │ │ -
137 if(!valid_)
│ │ │ │ -
138 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
│ │ │ │ -
139 }
│ │ │ │ -
140
│ │ │ │ -
141 bool ready() const {
│ │ │ │ -
142 if(!valid_)
│ │ │ │ -
143 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
│ │ │ │ -
144 return true;
│ │ │ │ -
145 }
│ │ │ │ -
146
│ │ │ │ -
147 T get() {
│ │ │ │ -
148 if(!valid_)
│ │ │ │ -
149 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
│ │ │ │ -
150 valid_ = false;
│ │ │ │ -
151 return std::forward<T>(data_);
│ │ │ │ -
152 }
│ │ │ │ -
153
│ │ │ │ -
154 bool valid() const {
│ │ │ │ -
155 return valid_;
│ │ │ │ -
156 }
│ │ │ │ -
157 };
│ │ │ │ -
158
│ │ │ │ -
159 template<>
│ │ │ │ -
160 class PseudoFuture<void>{
│ │ │ │ -
161 bool valid_;
│ │ │ │ -
162 public:
│ │ │ │ -
163 PseudoFuture(bool valid = false) :
│ │ │ │ -
164 valid_(valid)
│ │ │ │ -
165 {}
│ │ │ │ -
166
│ │ │ │ -
167 void wait(){
│ │ │ │ -
168 if(!valid_)
│ │ │ │ -
169 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
│ │ │ │ -
170 }
│ │ │ │ -
171 bool ready() const{
│ │ │ │ -
172 if(!valid_)
│ │ │ │ -
173 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
│ │ │ │ -
174 return true;
│ │ │ │ -
175 }
│ │ │ │ -
176
│ │ │ │ -
177 void get(){
│ │ │ │ -
178 if(!valid_)
│ │ │ │ -
179 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid");
│ │ │ │ -
180 valid_ = false;
│ │ │ │ -
181 }
│ │ │ │ -
182
│ │ │ │ -
183 bool valid() const{
│ │ │ │ -
184 return valid_;
│ │ │ │ -
185 }
│ │ │ │ -
186 };
│ │ │ │ -
187}
│ │ │ │ -
188
│ │ │ │ -
189#endif
│ │ │ │ -
A few common exception classes.
│ │ │ │ -
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
│ │ │ │ -
STL namespace.
│ │ │ │ +
67} // end namespace Dune
│ │ │ │ +
68
│ │ │ │ +
69#endif
│ │ │ │ + │ │ │ │ +
Stream & operator>>(Stream &stream, std::tuple< Ts... > &t)
Read a std::tuple.
Definition: streamoperators.hh:43
│ │ │ │ +
constexpr void forEach(Range &&range, F &&f)
Range based for loop.
Definition: hybridutilities.hh:268
│ │ │ │ +
std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
Definition: bigunsignedint.hh:278
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
Default exception if a function was called while the object is not in a valid state for that function...
Definition: exceptions.hh:281
│ │ │ │ -
This exception is thrown when ready(), wait() or get() is called on an invalid future....
Definition: future.hh:18
│ │ │ │ -
A wrapper-class for a object which is ready immediately.
Definition: future.hh:122
│ │ │ │ -
bool ready() const
Definition: future.hh:141
│ │ │ │ -
T get()
Definition: future.hh:147
│ │ │ │ -
PseudoFuture(U &&u)
Definition: future.hh:131
│ │ │ │ -
PseudoFuture()
Definition: future.hh:126
│ │ │ │ -
void wait()
Definition: future.hh:136
│ │ │ │ -
bool valid() const
Definition: future.hh:154
│ │ │ │ -
Type-erasure for future-like objects. A future-like object is a object satisfying the interface of Fu...
Definition: future.hh:28
│ │ │ │ -
bool ready() const
Definition: future.hh:103
│ │ │ │ -
void wait()
wait until the future is ready
Definition: future.hh:87
│ │ │ │ -
Future(U &&data)
Definition: future.hh:78
│ │ │ │ -
T get()
Waits until the future is ready and returns the resulting value.
Definition: future.hh:95
│ │ │ │ -
Future()=default
│ │ │ │ -
bool valid() const
Checks whether the future is valid. I.e. ‘get()’ was not called on that future and when it was not de...
Definition: future.hh:112
│ │ │ │ -
Future(F &&f)
Definition: future.hh:73
│ │ │ │ -
bool ready() const
Definition: future.hh:171
│ │ │ │ -
bool valid() const
Definition: future.hh:183
│ │ │ │ -
void get()
Definition: future.hh:177
│ │ │ │ -
PseudoFuture(bool valid=false)
Definition: future.hh:163
│ │ │ │ -
void wait()
Definition: future.hh:167
│ │ │ │ +
Reference get(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const Key &key)
Definition: propertymap.hh:84
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -utf-8 │ │ │ │ │ +us-ascii │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,262 +4,87 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -future.hh │ │ │ │ │ +streamoperators.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 (C) 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_PARALLEL_FUTURE_HH │ │ │ │ │ - 6#define DUNE_COMMON_PARALLEL_FUTURE_HH │ │ │ │ │ - 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9#include │ │ │ │ │ - 10 │ │ │ │ │ - 11namespace Dune{ │ │ │ │ │ - 12 │ │ │ │ │ -17 class InvalidFutureException : public InvalidStateException │ │ │ │ │ - 18 {}; │ │ │ │ │ - 19 │ │ │ │ │ - 20 // forward declaration │ │ │ │ │ - 21 template │ │ │ │ │ - 22 class PseudoFuture; │ │ │ │ │ - 23 │ │ │ │ │ - 27 template │ │ │ │ │ -28 class Future{ │ │ │ │ │ - 29 // Future interface: │ │ │ │ │ - 30 class FutureBase{ │ │ │ │ │ - 31 public: │ │ │ │ │ - 32 virtual ~FutureBase() = default; │ │ │ │ │ - 33 virtual void wait() = 0; │ │ │ │ │ - 34 virtual bool ready() const = 0; │ │ │ │ │ - 35 virtual bool valid() const = 0; │ │ │ │ │ - 36 virtual T get() = 0; │ │ │ │ │ - 37 }; │ │ │ │ │ - 38 │ │ │ │ │ - 39 // model class │ │ │ │ │ - 40 template │ │ │ │ │ - 41 class FutureModel │ │ │ │ │ - 42 : public FutureBase │ │ │ │ │ - 43 { │ │ │ │ │ - 44 F _future; │ │ │ │ │ - 45 public: │ │ │ │ │ - 46 FutureModel(F&& f) │ │ │ │ │ - 47 : _future(std::forward(f)) │ │ │ │ │ - 48 {} │ │ │ │ │ + 5 │ │ │ │ │ + 6#ifndef DUNE_STREAMOPERATORS_HH │ │ │ │ │ + 7#define DUNE_STREAMOPERATORS_HH │ │ │ │ │ + 8 │ │ │ │ │ + 13#include │ │ │ │ │ + 14#include │ │ │ │ │ + 15#include │ │ │ │ │ + 16 │ │ │ │ │ + 17#include │ │ │ │ │ + 18 │ │ │ │ │ + 19namespace Dune │ │ │ │ │ + 20{ │ │ │ │ │ + 27 template │ │ │ │ │ +28 inline Stream& operator<<(Stream& stream, const std::tuple& t) │ │ │ │ │ + 29 { │ │ │ │ │ + 30 stream<<"["; │ │ │ │ │ + 31 if(sizeof...(Ts)>0) │ │ │ │ │ + 32 { │ │ │ │ │ + 33 Hybrid::forEach(std::make_index_sequence{}, │ │ │ │ │ + 34 [&](auto i){stream<(t)<<",";}); │ │ │ │ │ + 35 stream<(t); │ │ │ │ │ + 36 } │ │ │ │ │ + 37 stream<<"]"; │ │ │ │ │ + 38 return stream; │ │ │ │ │ + 39 } │ │ │ │ │ + 40 │ │ │ │ │ + 42 template │ │ │ │ │ +43 inline Stream& operator>>(Stream& stream, std::tuple& t) │ │ │ │ │ + 44 { │ │ │ │ │ + 45 Hybrid::forEach(std::make_index_sequence{}, │ │ │ │ │ + 46 [&](auto i){stream>>std::get(t);}); │ │ │ │ │ + 47 return stream; │ │ │ │ │ + 48 } │ │ │ │ │ 49 │ │ │ │ │ - 50 virtual void wait() override │ │ │ │ │ - 51 { │ │ │ │ │ - 52 _future.wait(); │ │ │ │ │ - 53 } │ │ │ │ │ - 54 │ │ │ │ │ - 55 virtual bool ready() const override │ │ │ │ │ + 51 template │ │ │ │ │ +52 inline Stream& operator<<(Stream& stream, const std::array& a) │ │ │ │ │ + 53 { │ │ │ │ │ + 54 stream<<"["; │ │ │ │ │ + 55 if(N>0) │ │ │ │ │ 56 { │ │ │ │ │ - 57 return _future.ready(); │ │ │ │ │ - 58 } │ │ │ │ │ - 59 │ │ │ │ │ - 60 virtual bool valid() const override │ │ │ │ │ - 61 { │ │ │ │ │ - 62 return _future.valid(); │ │ │ │ │ + 57 for(std::size_t i=0; i _future; │ │ │ │ │ - 71 public: │ │ │ │ │ - 72 template │ │ │ │ │ -73 Future(F&& f) │ │ │ │ │ - 74 : _future(std::make_unique>(std::forward(f))) │ │ │ │ │ - 75 {} │ │ │ │ │ - 76 │ │ │ │ │ - 77 template::value && !std:: │ │ │ │ │ -is_same::value>> │ │ │ │ │ -78 Future(U&& data) │ │ │ │ │ - 79 : _future(std::make_unique>>(PseudoFuture │ │ │ │ │ -(std::forward(data)))) │ │ │ │ │ - 80 {} │ │ │ │ │ - 81 │ │ │ │ │ -82 Future() = default; │ │ │ │ │ - 83 │ │ │ │ │ -87 void wait(){ │ │ │ │ │ - 88 _future->wait(); │ │ │ │ │ - 89 } │ │ │ │ │ - 90 │ │ │ │ │ -95 T get() { │ │ │ │ │ - 96 return _future->get(); │ │ │ │ │ - 97 } │ │ │ │ │ - 98 │ │ │ │ │ -103 bool ready() const { │ │ │ │ │ - 104 return _future->ready(); │ │ │ │ │ - 105 } │ │ │ │ │ - 106 │ │ │ │ │ -112 bool valid() const { │ │ │ │ │ - 113 if(_future) │ │ │ │ │ - 114 return _future->valid(); │ │ │ │ │ - 115 return false; │ │ │ │ │ - 116 } │ │ │ │ │ - 117 }; │ │ │ │ │ - 118 │ │ │ │ │ - 121 template │ │ │ │ │ -122 class PseudoFuture{ │ │ │ │ │ - 123 bool valid_; │ │ │ │ │ - 124 T data_; │ │ │ │ │ - 125 public: │ │ │ │ │ -126 PseudoFuture() : │ │ │ │ │ - 127 valid_(false) │ │ │ │ │ - 128 {} │ │ │ │ │ - 129 │ │ │ │ │ - 130 template │ │ │ │ │ -131 PseudoFuture(U&& u) : │ │ │ │ │ - 132 valid_(true), │ │ │ │ │ - 133 data_(std::forward(u)) │ │ │ │ │ - 134 {} │ │ │ │ │ - 135 │ │ │ │ │ -136 void wait() { │ │ │ │ │ - 137 if(!valid_) │ │ │ │ │ - 138 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid"); │ │ │ │ │ - 139 } │ │ │ │ │ - 140 │ │ │ │ │ -141 bool ready() const { │ │ │ │ │ - 142 if(!valid_) │ │ │ │ │ - 143 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid"); │ │ │ │ │ - 144 return true; │ │ │ │ │ - 145 } │ │ │ │ │ - 146 │ │ │ │ │ -147 T get() { │ │ │ │ │ - 148 if(!valid_) │ │ │ │ │ - 149 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid"); │ │ │ │ │ - 150 valid_ = false; │ │ │ │ │ - 151 return std::forward(data_); │ │ │ │ │ - 152 } │ │ │ │ │ - 153 │ │ │ │ │ -154 bool valid() const { │ │ │ │ │ - 155 return valid_; │ │ │ │ │ - 156 } │ │ │ │ │ - 157 }; │ │ │ │ │ - 158 │ │ │ │ │ - 159 template<> │ │ │ │ │ -160 class PseudoFuture{ │ │ │ │ │ - 161 bool valid_; │ │ │ │ │ - 162 public: │ │ │ │ │ -163 PseudoFuture(bool valid = false) : │ │ │ │ │ - 164 valid_(valid) │ │ │ │ │ - 165 {} │ │ │ │ │ - 166 │ │ │ │ │ -167 void wait(){ │ │ │ │ │ - 168 if(!valid_) │ │ │ │ │ - 169 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid"); │ │ │ │ │ - 170 } │ │ │ │ │ -171 bool ready() const{ │ │ │ │ │ - 172 if(!valid_) │ │ │ │ │ - 173 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid"); │ │ │ │ │ - 174 return true; │ │ │ │ │ - 175 } │ │ │ │ │ - 176 │ │ │ │ │ -177 void get(){ │ │ │ │ │ - 178 if(!valid_) │ │ │ │ │ - 179 DUNE_THROW(InvalidFutureException, "The PseudoFuture is not valid"); │ │ │ │ │ - 180 valid_ = false; │ │ │ │ │ - 181 } │ │ │ │ │ - 182 │ │ │ │ │ -183 bool valid() const{ │ │ │ │ │ - 184 return valid_; │ │ │ │ │ - 185 } │ │ │ │ │ - 186 }; │ │ │ │ │ - 187} │ │ │ │ │ - 188 │ │ │ │ │ - 189#endif │ │ │ │ │ -exceptions.hh │ │ │ │ │ -A few common exception classes. │ │ │ │ │ -DUNE_THROW │ │ │ │ │ -#define DUNE_THROW(E, m) │ │ │ │ │ -Definition: exceptions.hh:218 │ │ │ │ │ -std │ │ │ │ │ -STL namespace. │ │ │ │ │ + 67} // end namespace Dune │ │ │ │ │ + 68 │ │ │ │ │ + 69#endif │ │ │ │ │ +hybridutilities.hh │ │ │ │ │ +Dune::operator>> │ │ │ │ │ +Stream & operator>>(Stream &stream, std::tuple< Ts... > &t) │ │ │ │ │ +Read a std::tuple. │ │ │ │ │ +Definition: streamoperators.hh:43 │ │ │ │ │ +Dune::Hybrid::forEach │ │ │ │ │ +constexpr void forEach(Range &&range, F &&f) │ │ │ │ │ +Range based for loop. │ │ │ │ │ +Definition: hybridutilities.hh:268 │ │ │ │ │ +Dune::operator<< │ │ │ │ │ +std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x) │ │ │ │ │ +Definition: bigunsignedint.hh:278 │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::InvalidStateException │ │ │ │ │ -Default exception if a function was called while the object is not in a valid │ │ │ │ │ -state for that function... │ │ │ │ │ -Definition: exceptions.hh:281 │ │ │ │ │ -Dune::InvalidFutureException │ │ │ │ │ -This exception is thrown when ready(), wait() or get() is called on an invalid │ │ │ │ │ -future.... │ │ │ │ │ -Definition: future.hh:18 │ │ │ │ │ -Dune::PseudoFuture │ │ │ │ │ -A wrapper-class for a object which is ready immediately. │ │ │ │ │ -Definition: future.hh:122 │ │ │ │ │ -Dune::PseudoFuture::ready │ │ │ │ │ -bool ready() const │ │ │ │ │ -Definition: future.hh:141 │ │ │ │ │ -Dune::PseudoFuture::get │ │ │ │ │ -T get() │ │ │ │ │ -Definition: future.hh:147 │ │ │ │ │ -Dune::PseudoFuture::PseudoFuture │ │ │ │ │ -PseudoFuture(U &&u) │ │ │ │ │ -Definition: future.hh:131 │ │ │ │ │ -Dune::PseudoFuture::PseudoFuture │ │ │ │ │ -PseudoFuture() │ │ │ │ │ -Definition: future.hh:126 │ │ │ │ │ -Dune::PseudoFuture::wait │ │ │ │ │ -void wait() │ │ │ │ │ -Definition: future.hh:136 │ │ │ │ │ -Dune::PseudoFuture::valid │ │ │ │ │ -bool valid() const │ │ │ │ │ -Definition: future.hh:154 │ │ │ │ │ -Dune::Future │ │ │ │ │ -Type-erasure for future-like objects. A future-like object is a object │ │ │ │ │ -satisfying the interface of Fu... │ │ │ │ │ -Definition: future.hh:28 │ │ │ │ │ -Dune::Future::ready │ │ │ │ │ -bool ready() const │ │ │ │ │ -Definition: future.hh:103 │ │ │ │ │ -Dune::Future::wait │ │ │ │ │ -void wait() │ │ │ │ │ -wait until the future is ready │ │ │ │ │ -Definition: future.hh:87 │ │ │ │ │ -Dune::Future::Future │ │ │ │ │ -Future(U &&data) │ │ │ │ │ -Definition: future.hh:78 │ │ │ │ │ -Dune::Future::get │ │ │ │ │ -T get() │ │ │ │ │ -Waits until the future is ready and returns the resulting value. │ │ │ │ │ -Definition: future.hh:95 │ │ │ │ │ -Dune::Future::Future │ │ │ │ │ -Future()=default │ │ │ │ │ -Dune::Future::valid │ │ │ │ │ -bool valid() const │ │ │ │ │ -Checks whether the future is valid. I.e. ‘get()’ was not called on that future │ │ │ │ │ -and when it was not de... │ │ │ │ │ -Definition: future.hh:112 │ │ │ │ │ -Dune::Future::Future │ │ │ │ │ -Future(F &&f) │ │ │ │ │ -Definition: future.hh:73 │ │ │ │ │ -Dune::PseudoFuture<_void_>::ready │ │ │ │ │ -bool ready() const │ │ │ │ │ -Definition: future.hh:171 │ │ │ │ │ -Dune::PseudoFuture<_void_>::valid │ │ │ │ │ -bool valid() const │ │ │ │ │ -Definition: future.hh:183 │ │ │ │ │ -Dune::PseudoFuture<_void_>::get │ │ │ │ │ -void get() │ │ │ │ │ -Definition: future.hh:177 │ │ │ │ │ -Dune::PseudoFuture<_void_>::PseudoFuture │ │ │ │ │ -PseudoFuture(bool valid=false) │ │ │ │ │ -Definition: future.hh:163 │ │ │ │ │ -Dune::PseudoFuture<_void_>::wait │ │ │ │ │ -void wait() │ │ │ │ │ -Definition: future.hh:167 │ │ │ │ │ +Dune::get │ │ │ │ │ +Reference get(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const │ │ │ │ │ +Key &key) │ │ │ │ │ +Definition: propertymap.hh:84 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00023.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: communication.hh File Reference │ │ │ │ +dune-common: mallocallocator.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,71 +58,62 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Typedefs | │ │ │ │ Functions
│ │ │ │ -
communication.hh File Reference
│ │ │ │ +
mallocallocator.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

Implements an utility class that provides collective communication methods for sequential programs. │ │ │ │ +

Allocators that use malloc/free. │ │ │ │ More...

│ │ │ │ -
#include <iostream>
│ │ │ │ -#include <complex>
│ │ │ │ -#include <algorithm>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <dune/common/binaryfunctions.hh>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/common/parallel/future.hh>
│ │ │ │ +
#include <exception>
│ │ │ │ +#include <cstdlib>
│ │ │ │ +#include <new>
│ │ │ │ +#include <utility>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::No_Comm
class  Dune::MallocAllocator< T >
 Allocators implementation which simply calls malloc/free. More...
 
class  Dune::Communication< Communicator >
 Collective communication interface and sequential default implementation. More...
struct  Dune::MallocAllocator< T >::rebind< U >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ -Typedefs

template<class T >
using Dune::CollectiveCommunication = Communication< T >
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

bool Dune::operator== (const No_Comm &, const No_Comm &)
 Comparison operator for MPI compatibility. More...
 
bool Dune::operator!= (const No_Comm &, const No_Comm &)
 Comparison operator for MPI compatibility. More...
 
template<class T >
constexpr bool Dune::operator== (const MallocAllocator< T > &, const MallocAllocator< T > &)
 check whether allocators are equivalent More...
 
template<class T >
constexpr bool Dune::operator!= (const MallocAllocator< T > &, const MallocAllocator< T > &)
 check whether allocators are not equivalent More...
 
│ │ │ │

Detailed Description

│ │ │ │ -

Implements an utility class that provides collective communication methods for sequential programs.

│ │ │ │ -

An abstraction to the basic methods of parallel communication, following the message-passing paradigm.

│ │ │ │ +

Allocators that use malloc/free.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,51 +4,41 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -Classes | Namespaces | Typedefs | Functions │ │ │ │ │ -communication.hh File Reference │ │ │ │ │ -Common » Parallel_Communication | Common » Parallel_Communication │ │ │ │ │ -Implements an utility class that provides collective communication methods for │ │ │ │ │ -sequential programs. More... │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Functions │ │ │ │ │ +mallocallocator.hh File Reference │ │ │ │ │ +Allocators that use malloc/free. More... │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -struct  Dune::No_Comm │ │ │ │ │ + class  Dune::MallocAllocator<_T_> │ │ │ │ │ +  Allocators implementation which simply calls malloc/free. More... │ │ │ │ │   │ │ │ │ │ - class  Dune::Communication<_Communicator_> │ │ │ │ │ -  Collective communication interface and sequential default │ │ │ │ │ - implementation. More... │ │ │ │ │ +struct  Dune::MallocAllocator<_T_>::rebind<_U_> │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ - Typedefs │ │ │ │ │ -template │ │ │ │ │ -using Dune::CollectiveCommunication = Communication< T > │ │ │ │ │ -  │ │ │ │ │ Functions │ │ │ │ │ -bool Dune::operator== (const No_Comm &, const No_Comm &) │ │ │ │ │ -  Comparison operator for MPI compatibility. More... │ │ │ │ │ +template │ │ │ │ │ +constexpr bool Dune::operator== (const MallocAllocator< T > &, const │ │ │ │ │ + MallocAllocator< T > &) │ │ │ │ │ +  check whether allocators are equivalent More... │ │ │ │ │   │ │ │ │ │ -bool Dune::operator!= (const No_Comm &, const No_Comm &) │ │ │ │ │ -  Comparison operator for MPI compatibility. More... │ │ │ │ │ +template │ │ │ │ │ +constexpr bool Dune::operator!= (const MallocAllocator< T > &, const │ │ │ │ │ + MallocAllocator< T > &) │ │ │ │ │ +  check whether allocators are not equivalent More... │ │ │ │ │   │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -Implements an utility class that provides collective communication methods for │ │ │ │ │ -sequential programs. │ │ │ │ │ -An abstraction to the basic methods of parallel communication, following the │ │ │ │ │ -message-passing paradigm. │ │ │ │ │ +Allocators that use malloc/free. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00023_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: communication.hh Source File │ │ │ │ +dune-common: mallocallocator.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,342 +58,142 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
communication.hh
│ │ │ │ +
mallocallocator.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 (C) 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_PARALLEL_COMMUNICATION_HH
│ │ │ │ -
6#define DUNE_COMMON_PARALLEL_COMMUNICATION_HH
│ │ │ │ -
14#include <iostream>
│ │ │ │ -
15#include <complex>
│ │ │ │ -
16#include <algorithm>
│ │ │ │ -
17#include <vector>
│ │ │ │ -
18
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
22
│ │ │ │ -
42namespace Dune
│ │ │ │ -
43{
│ │ │ │ +
5#ifndef DUNE_MALLOC_ALLOCATOR_HH
│ │ │ │ +
6#define DUNE_MALLOC_ALLOCATOR_HH
│ │ │ │ +
7
│ │ │ │ +
8#include <exception>
│ │ │ │ +
9#include <cstdlib>
│ │ │ │ +
10#include <new>
│ │ │ │ +
11#include <utility>
│ │ │ │ +
12
│ │ │ │ +
17namespace Dune
│ │ │ │ +
18{
│ │ │ │ +
23 template <class T>
│ │ │ │ + │ │ │ │ +
25 public:
│ │ │ │ +
26 typedef std::size_t size_type;
│ │ │ │ +
27 typedef std::ptrdiff_t difference_type;
│ │ │ │ +
28 typedef T* pointer;
│ │ │ │ +
29 typedef const T* const_pointer;
│ │ │ │ +
30 typedef T& reference;
│ │ │ │ +
31 typedef const T& const_reference;
│ │ │ │ +
32 typedef T value_type;
│ │ │ │ +
33 template <class U> struct rebind {
│ │ │ │ + │ │ │ │ +
35 };
│ │ │ │ +
36
│ │ │ │ +
38 MallocAllocator() noexcept {}
│ │ │ │ +
40 template <class U>
│ │ │ │ + │ │ │ │ +
43 ~MallocAllocator() noexcept {}
│ │ │ │
44
│ │ │ │ -
45 /* define some type that definitely differs from MPI_Comm */
│ │ │ │ -
46 struct No_Comm {};
│ │ │ │ -
47
│ │ │ │ -
52 inline bool operator==(const No_Comm&, const No_Comm&)
│ │ │ │ -
53 {
│ │ │ │ -
54 return true;
│ │ │ │ -
55 }
│ │ │ │ -
56
│ │ │ │ -
61 inline bool operator!=(const No_Comm&, const No_Comm&)
│ │ │ │ -
62 {
│ │ │ │ -
63 return false;
│ │ │ │ -
64 }
│ │ │ │ -
65
│ │ │ │ -
98 template<typename Communicator>
│ │ │ │ - │ │ │ │ -
100 {
│ │ │ │ -
101 public:
│ │ │ │ - │ │ │ │ -
104 {}
│ │ │ │ -
105
│ │ │ │ -
110 Communication (const Communicator&)
│ │ │ │ -
111 {}
│ │ │ │ -
112
│ │ │ │ -
114 int rank () const
│ │ │ │ -
115 {
│ │ │ │ -
116 return 0;
│ │ │ │ -
117 }
│ │ │ │ -
118
│ │ │ │ -
120 operator No_Comm() const
│ │ │ │ -
121 {
│ │ │ │ -
122 return {};
│ │ │ │ -
123 }
│ │ │ │ -
124
│ │ │ │ -
126 int size () const
│ │ │ │ -
127 {
│ │ │ │ -
128 return 1;
│ │ │ │ -
129 }
│ │ │ │ -
130
│ │ │ │ -
134 template<class T>
│ │ │ │ -
135 int send([[maybe_unused]] const T& data,
│ │ │ │ -
136 [[maybe_unused]] int dest_rank,
│ │ │ │ -
137 [[maybe_unused]] int tag)
│ │ │ │ -
138 {
│ │ │ │ -
139 DUNE_THROW(ParallelError, "This method is not supported in sequential programs");
│ │ │ │ -
140 }
│ │ │ │ -
141
│ │ │ │ -
145 template<class T>
│ │ │ │ -
146 PseudoFuture<T> isend([[maybe_unused]] const T&& data,
│ │ │ │ -
147 [[maybe_unused]] int dest_rank,
│ │ │ │ -
148 [[maybe_unused]] int tag)
│ │ │ │ -
149 {
│ │ │ │ -
150 DUNE_THROW(ParallelError, "This method is not supported in sequential programs");
│ │ │ │ -
151 }
│ │ │ │ -
152
│ │ │ │ -
156 template<class T>
│ │ │ │ -
157 T recv([[maybe_unused]] T&& data,
│ │ │ │ -
158 [[maybe_unused]] int source_rank,
│ │ │ │ -
159 [[maybe_unused]] int tag,
│ │ │ │ -
160 [[maybe_unused]] void* status = 0)
│ │ │ │ -
161 {
│ │ │ │ -
162 DUNE_THROW(ParallelError, "This method is not supported in sequential programs");
│ │ │ │ -
163 }
│ │ │ │ -
164
│ │ │ │ -
168 template<class T>
│ │ │ │ -
169 PseudoFuture<T> irecv([[maybe_unused]] T&& data,
│ │ │ │ -
170 [[maybe_unused]] int source_rank,
│ │ │ │ -
171 [[maybe_unused]] int tag)
│ │ │ │ -
172 {
│ │ │ │ -
173 DUNE_THROW(ParallelError, "This method is not supported in sequential programs");
│ │ │ │ -
174 }
│ │ │ │ -
175
│ │ │ │ -
176 template<class T>
│ │ │ │ -
177 T rrecv([[maybe_unused]] T&& data,
│ │ │ │ -
178 [[maybe_unused]] int source_rank,
│ │ │ │ -
179 [[maybe_unused]] int tag,
│ │ │ │ -
180 [[maybe_unused]] void* status = 0) const
│ │ │ │ -
181 {
│ │ │ │ -
182 DUNE_THROW(ParallelError, "This method is not supported in sequential programs");
│ │ │ │ -
183 }
│ │ │ │ -
187 template<typename T>
│ │ │ │ -
188 T sum (const T& in) const
│ │ │ │ -
189 {
│ │ │ │ -
190 return in;
│ │ │ │ -
191 }
│ │ │ │ -
192
│ │ │ │ -
198 template<typename T>
│ │ │ │ -
199 int sum ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const
│ │ │ │ -
200 {
│ │ │ │ -
201 return 0;
│ │ │ │ -
202 }
│ │ │ │ -
203
│ │ │ │ -
207 template<typename T>
│ │ │ │ -
208 T prod (const T& in) const
│ │ │ │ -
209 {
│ │ │ │ -
210 return in;
│ │ │ │ -
211 }
│ │ │ │ -
212
│ │ │ │ -
218 template<typename T>
│ │ │ │ -
219 int prod ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const
│ │ │ │ -
220 {
│ │ │ │ -
221 return 0;
│ │ │ │ -
222 }
│ │ │ │ -
223
│ │ │ │ -
227 template<typename T>
│ │ │ │ -
228 T min (const T& in) const
│ │ │ │ -
229 {
│ │ │ │ -
230 return in;
│ │ │ │ -
231 }
│ │ │ │ -
232
│ │ │ │ -
238 template<typename T>
│ │ │ │ -
239 int min ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const
│ │ │ │ -
240 {
│ │ │ │ -
241 return 0;
│ │ │ │ -
242 }
│ │ │ │ -
243
│ │ │ │ -
247 template<typename T>
│ │ │ │ -
248 T max (const T& in) const
│ │ │ │ -
249 {
│ │ │ │ -
250 return in;
│ │ │ │ -
251 }
│ │ │ │ -
252
│ │ │ │ -
258 template<typename T>
│ │ │ │ -
259 int max ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const
│ │ │ │ -
260 {
│ │ │ │ -
261 return 0;
│ │ │ │ -
262 }
│ │ │ │ -
263
│ │ │ │ -
267 int barrier () const
│ │ │ │ -
268 {
│ │ │ │ -
269 return 0;
│ │ │ │ -
270 }
│ │ │ │ -
271
│ │ │ │ - │ │ │ │ -
276 {
│ │ │ │ -
277 return {true}; // return a valid future
│ │ │ │ -
278 }
│ │ │ │ -
279
│ │ │ │ -
283 template<typename T>
│ │ │ │ -
284 int broadcast ([[maybe_unused]] T* inout,
│ │ │ │ -
285 [[maybe_unused]] int len,
│ │ │ │ -
286 [[maybe_unused]] int root) const
│ │ │ │ -
287 {
│ │ │ │ -
288 return 0;
│ │ │ │ -
289 }
│ │ │ │ -
290
│ │ │ │ -
294 template<class T>
│ │ │ │ -
295 PseudoFuture<T> ibroadcast(T&& data, int root) const{
│ │ │ │ -
296 return {std::forward<T>(data)};
│ │ │ │ -
297 }
│ │ │ │ -
298
│ │ │ │ -
299
│ │ │ │ -
312 template<typename T>
│ │ │ │ -
313 int gather (const T* in, T* out, int len, [[maybe_unused]] int root) const // note out must have same size as in
│ │ │ │ -
314 {
│ │ │ │ -
315 for (int i=0; i<len; i++)
│ │ │ │ -
316 out[i] = in[i];
│ │ │ │ -
317 return 0;
│ │ │ │ -
318 }
│ │ │ │ -
319
│ │ │ │ -
323 template<class TIN, class TOUT = std::vector<TIN>>
│ │ │ │ -
324 PseudoFuture<TOUT> igather(TIN&& data_in, TOUT&& data_out, int root){
│ │ │ │ -
325 *(data_out.begin()) = std::forward<TIN>(data_in);
│ │ │ │ -
326 return {std::forward<TOUT>(data_out)};
│ │ │ │ -
327 }
│ │ │ │ -
328
│ │ │ │ -
329
│ │ │ │ -
349 template<typename T>
│ │ │ │ -
350 int gatherv (const T* in,
│ │ │ │ -
351 int sendDataLen,
│ │ │ │ -
352 T* out,
│ │ │ │ -
353 [[maybe_unused]] int* recvDataLen,
│ │ │ │ -
354 int* displ,
│ │ │ │ -
355 [[maybe_unused]] int root) const
│ │ │ │ -
356 {
│ │ │ │ -
357 for (int i=*displ; i<sendDataLen; i++)
│ │ │ │ -
358 out[i] = in[i];
│ │ │ │ -
359 return 0;
│ │ │ │ -
360 }
│ │ │ │ -
361
│ │ │ │ -
375 template<typename T>
│ │ │ │ -
376 int scatter (const T* sendData, T* recvData, int len, [[maybe_unused]] int root) const // note out must have same size as in
│ │ │ │ -
377 {
│ │ │ │ -
378 for (int i=0; i<len; i++)
│ │ │ │ -
379 recvData[i] = sendData[i];
│ │ │ │ -
380 return 0;
│ │ │ │ -
381 }
│ │ │ │ -
382
│ │ │ │ -
386 template<class TIN, class TOUT = TIN>
│ │ │ │ -
387 PseudoFuture<TOUT> iscatter(TIN&& data_in, TOUT&& data_out, int root){
│ │ │ │ -
388 data_out = *(std::forward<TIN>(data_in).begin());
│ │ │ │ -
389 return {std::forward<TOUT>(data_out)};
│ │ │ │ -
390 }
│ │ │ │ -
391
│ │ │ │ -
410 template<typename T>
│ │ │ │ -
411 int scatterv (const T* sendData,int* sendDataLen, int* displ, T* recvData,
│ │ │ │ -
412 [[maybe_unused]] int recvDataLen, [[maybe_unused]] int root) const
│ │ │ │ -
413 {
│ │ │ │ -
414 for (int i=*displ; i<*sendDataLen; i++)
│ │ │ │ -
415 recvData[i] = sendData[i];
│ │ │ │ -
416 return 0;
│ │ │ │ -
417 }
│ │ │ │ -
418
│ │ │ │ -
432 template<typename T>
│ │ │ │ -
433 int allgather(const T* sbuf, int count, T* rbuf) const
│ │ │ │ -
434 {
│ │ │ │ -
435 for(const T* end=sbuf+count; sbuf < end; ++sbuf, ++rbuf)
│ │ │ │ -
436 *rbuf=*sbuf;
│ │ │ │ -
437 return 0;
│ │ │ │ -
438 }
│ │ │ │ -
439
│ │ │ │ -
444 template<class TIN, class TOUT = TIN>
│ │ │ │ -
445 PseudoFuture<TOUT> iallgather(TIN&& data_in, TOUT&& data_out){
│ │ │ │ -
446 return {std::forward<TOUT>(data_out)};
│ │ │ │ -
447 }
│ │ │ │ -
448
│ │ │ │ -
465 template<typename T>
│ │ │ │ -
466 int allgatherv (const T* in, int sendDataLen, T* out, [[maybe_unused]] int* recvDataLen, int* displ) const
│ │ │ │ -
467 {
│ │ │ │ -
468 for (int i=*displ; i<sendDataLen; i++)
│ │ │ │ -
469 out[i] = in[i];
│ │ │ │ -
470 return 0;
│ │ │ │ -
471 }
│ │ │ │ -
472
│ │ │ │ -
485 template<typename BinaryFunction, typename Type>
│ │ │ │ -
486 int allreduce([[maybe_unused]] Type* inout, [[maybe_unused]] int len) const
│ │ │ │ -
487 {
│ │ │ │ -
488 return 0;
│ │ │ │ -
489 }
│ │ │ │ -
490
│ │ │ │ -
495 template<class BinaryFunction, class TIN, class TOUT = TIN>
│ │ │ │ -
496 PseudoFuture<TOUT> iallreduce(TIN&& data_in, TOUT&& data_out){
│ │ │ │ -
497 data_out = std::forward<TIN>(data_in);
│ │ │ │ -
498 return {std::forward<TOUT>(data_out)};
│ │ │ │ -
499 }
│ │ │ │ -
500
│ │ │ │ -
505 template<class BinaryFunction, class T>
│ │ │ │ - │ │ │ │ -
507 return {std::forward<T>(data)};
│ │ │ │ -
508 }
│ │ │ │ -
509
│ │ │ │ -
510
│ │ │ │ -
524 template<typename BinaryFunction, typename Type>
│ │ │ │ -
525 int allreduce(const Type* in, Type* out, int len) const
│ │ │ │ -
526 {
│ │ │ │ -
527 std::copy(in, in+len, out);
│ │ │ │ -
528 return 0;
│ │ │ │ -
529 }
│ │ │ │ -
530
│ │ │ │ -
531 };
│ │ │ │ -
532
│ │ │ │ -
538 template<class T>
│ │ │ │ - │ │ │ │ -
540 [[deprecated("CollectiveCommunication is deprecated. Use Communication instead.")]]
│ │ │ │ - │ │ │ │ -
542}
│ │ │ │ -
543
│ │ │ │ -
544#endif
│ │ │ │ - │ │ │ │ -
A few common exception classes.
│ │ │ │ -
helper classes to provide unique types for standard functions
│ │ │ │ -
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
│ │ │ │ + │ │ │ │ +
46 {
│ │ │ │ +
47 return &x;
│ │ │ │ +
48 }
│ │ │ │ + │ │ │ │ +
50 {
│ │ │ │ +
51 return &x;
│ │ │ │ +
52 }
│ │ │ │ +
53
│ │ │ │ + │ │ │ │ +
56 [[maybe_unused]] const void* hint = 0)
│ │ │ │ +
57 {
│ │ │ │ +
58 if (n > this->max_size())
│ │ │ │ +
59 throw std::bad_alloc();
│ │ │ │ +
60
│ │ │ │ +
61 pointer ret = static_cast<pointer>(std::malloc(n * sizeof(T)));
│ │ │ │ +
62 if (!ret)
│ │ │ │ +
63 throw std::bad_alloc();
│ │ │ │ +
64 return ret;
│ │ │ │ +
65 }
│ │ │ │ +
66
│ │ │ │ +
68 void deallocate(pointer p, [[maybe_unused]] size_type n)
│ │ │ │ +
69 {
│ │ │ │ +
70 std::free(p);
│ │ │ │ +
71 }
│ │ │ │ +
72
│ │ │ │ +
74 size_type max_size() const noexcept
│ │ │ │ +
75 {
│ │ │ │ +
76 return size_type(-1) / sizeof(T);
│ │ │ │ +
77 }
│ │ │ │ +
78
│ │ │ │ +
80 void construct(pointer p, const T& val)
│ │ │ │ +
81 {
│ │ │ │ +
82 ::new((void*)p)T(val);
│ │ │ │ +
83 }
│ │ │ │ +
84
│ │ │ │ +
86 template<typename ... Args>
│ │ │ │ +
87 void construct(pointer p, Args&&... args)
│ │ │ │ +
88 {
│ │ │ │ +
89 ::new((void *)p)T(std::forward<Args>(args) ...);
│ │ │ │ +
90 }
│ │ │ │ +
91
│ │ │ │ + │ │ │ │ +
94 {
│ │ │ │ +
95 p->~T();
│ │ │ │ +
96 }
│ │ │ │ +
97 };
│ │ │ │ +
98
│ │ │ │ +
100 template<class T>
│ │ │ │ +
101 constexpr bool
│ │ │ │ + │ │ │ │ +
103 {
│ │ │ │ +
104 return true;
│ │ │ │ +
105 }
│ │ │ │ +
106
│ │ │ │ +
108 template<class T>
│ │ │ │ +
109 constexpr bool
│ │ │ │ + │ │ │ │ +
111 {
│ │ │ │ +
112 return false;
│ │ │ │ +
113 }
│ │ │ │ +
114}
│ │ │ │ +
115
│ │ │ │ +
116#endif // DUNE_MALLOC_ALLOCATOR_HH
│ │ │ │
EnableIfInterOperable< T1, T2, bool >::type operator==(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for equality.
Definition: iteratorfacades.hh:237
│ │ │ │
EnableIfInterOperable< T1, T2, bool >::type operator!=(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for inequality.
Definition: iteratorfacades.hh:259
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
Default exception if an error in the parallel communication of the program occurred.
Definition: exceptions.hh:287
│ │ │ │ -
Definition: communication.hh:46
│ │ │ │ -
Collective communication interface and sequential default implementation.
Definition: communication.hh:100
│ │ │ │ -
PseudoFuture< TOUT > iallreduce(TIN &&data_in, TOUT &&data_out)
Compute something over all processes nonblocking.
Definition: communication.hh:496
│ │ │ │ -
int send(const T &data, int dest_rank, int tag)
Sends the data to the dest_rank.
Definition: communication.hh:135
│ │ │ │ -
int allreduce(const Type *in, Type *out, int len) const
Compute something over all processes for each component of an array and return the result in every pr...
Definition: communication.hh:525
│ │ │ │ -
T max(const T &in) const
Compute the maximum of the argument over all processes and return the result in every process....
Definition: communication.hh:248
│ │ │ │ -
int rank() const
Return rank, is between 0 and size()-1.
Definition: communication.hh:114
│ │ │ │ -
T sum(const T &in) const
Compute the sum of the argument over all processes and return the result in every process....
Definition: communication.hh:188
│ │ │ │ -
int scatterv(const T *sendData, int *sendDataLen, int *displ, T *recvData, int recvDataLen, int root) const
Scatter arrays of variable length from a root to all other tasks.
Definition: communication.hh:411
│ │ │ │ -
int prod(T *inout, int len) const
Compute the product over all processes for each component of an array and return the result in every ...
Definition: communication.hh:219
│ │ │ │ -
T recv(T &&data, int source_rank, int tag, void *status=0)
Receives the data from the source_rank.
Definition: communication.hh:157
│ │ │ │ -
PseudoFuture< T > isend(const T &&data, int dest_rank, int tag)
Sends the data to the dest_rank nonblocking.
Definition: communication.hh:146
│ │ │ │ -
PseudoFuture< void > ibarrier() const
Nonblocking barrier.
Definition: communication.hh:275
│ │ │ │ -
int allreduce(Type *inout, int len) const
Compute something over all processes for each component of an array and return the result in every pr...
Definition: communication.hh:486
│ │ │ │ -
int size() const
Number of processes in set, is greater than 0.
Definition: communication.hh:126
│ │ │ │ -
int sum(T *inout, int len) const
Compute the sum over all processes for each component of an array and return the result in every proc...
Definition: communication.hh:199
│ │ │ │ -
int allgatherv(const T *in, int sendDataLen, T *out, int *recvDataLen, int *displ) const
Gathers data of variable length from all tasks and distribute it to all.
Definition: communication.hh:466
│ │ │ │ -
T min(const T &in) const
Compute the minimum of the argument over all processes and return the result in every process....
Definition: communication.hh:228
│ │ │ │ -
PseudoFuture< T > irecv(T &&data, int source_rank, int tag)
Receives the data from the source_rank nonblocking.
Definition: communication.hh:169
│ │ │ │ -
int gatherv(const T *in, int sendDataLen, T *out, int *recvDataLen, int *displ, int root) const
Gather arrays of variable size on root task.
Definition: communication.hh:350
│ │ │ │ -
PseudoFuture< T > ibroadcast(T &&data, int root) const
Distribute an array from the process with rank root to all other processes nonblocking.
Definition: communication.hh:295
│ │ │ │ -
int allgather(const T *sbuf, int count, T *rbuf) const
Gathers data from all tasks and distribute it to all.
Definition: communication.hh:433
│ │ │ │ -
int scatter(const T *sendData, T *recvData, int len, int root) const
Scatter array from a root to all other task.
Definition: communication.hh:376
│ │ │ │ -
int gather(const T *in, T *out, int len, int root) const
Gather arrays on root task.
Definition: communication.hh:313
│ │ │ │ -
PseudoFuture< T > iallreduce(T &&data)
Compute something over all processes nonblocking and in-place.
Definition: communication.hh:506
│ │ │ │ -
Communication(const Communicator &)
Constructor with a given communicator.
Definition: communication.hh:110
│ │ │ │ -
int max(T *inout, int len) const
Compute the maximum over all processes for each component of an array and return the result in every ...
Definition: communication.hh:259
│ │ │ │ -
T prod(const T &in) const
Compute the product of the argument over all processes and return the result in every process....
Definition: communication.hh:208
│ │ │ │ -
int broadcast(T *inout, int len, int root) const
Distribute an array from the process with rank root to all other processes.
Definition: communication.hh:284
│ │ │ │ -
T rrecv(T &&data, int source_rank, int tag, void *status=0) const
Definition: communication.hh:177
│ │ │ │ -
PseudoFuture< TOUT > iscatter(TIN &&data_in, TOUT &&data_out, int root)
Scatter array from a root to all other task nonblocking.
Definition: communication.hh:387
│ │ │ │ -
int min(T *inout, int len) const
Compute the minimum over all processes for each component of an array and return the result in every ...
Definition: communication.hh:239
│ │ │ │ -
int barrier() const
Wait until all processes have arrived at this point in the program.
Definition: communication.hh:267
│ │ │ │ -
PseudoFuture< TOUT > igather(TIN &&data_in, TOUT &&data_out, int root)
Gather arrays on root task nonblocking.
Definition: communication.hh:324
│ │ │ │ -
PseudoFuture< TOUT > iallgather(TIN &&data_in, TOUT &&data_out)
Gathers data from all tasks and distribute it to all nonblocking.
Definition: communication.hh:445
│ │ │ │ -
Communication()
Construct default object.
Definition: communication.hh:103
│ │ │ │ -
A wrapper-class for a object which is ready immediately.
Definition: future.hh:122
│ │ │ │ -
Definition: future.hh:160
│ │ │ │ +
Allocators implementation which simply calls malloc/free.
Definition: mallocallocator.hh:24
│ │ │ │ +
~MallocAllocator() noexcept
cleanup this allocator
Definition: mallocallocator.hh:43
│ │ │ │ +
T * pointer
Definition: mallocallocator.hh:28
│ │ │ │ +
void construct(pointer p, const T &val)
copy-construct an object of type T (i.e. make a placement new on p)
Definition: mallocallocator.hh:80
│ │ │ │ +
MallocAllocator() noexcept
create a new MallocAllocator
Definition: mallocallocator.hh:38
│ │ │ │ +
MallocAllocator(const MallocAllocator< U > &) noexcept
copy construct from an other MallocAllocator, possibly for a different result type
Definition: mallocallocator.hh:41
│ │ │ │ +
std::size_t size_type
Definition: mallocallocator.hh:26
│ │ │ │ +
std::ptrdiff_t difference_type
Definition: mallocallocator.hh:27
│ │ │ │ +
void deallocate(pointer p, size_type n)
deallocate n objects of type T at address p
Definition: mallocallocator.hh:68
│ │ │ │ +
T value_type
Definition: mallocallocator.hh:32
│ │ │ │ +
const_pointer address(const_reference x) const
Definition: mallocallocator.hh:49
│ │ │ │ +
const T & const_reference
Definition: mallocallocator.hh:31
│ │ │ │ +
void destroy(pointer p)
destroy an object of type T (i.e. call the destructor)
Definition: mallocallocator.hh:93
│ │ │ │ +
pointer allocate(size_type n, const void *hint=0)
allocate n objects of type T
Definition: mallocallocator.hh:55
│ │ │ │ +
pointer address(reference x) const
Definition: mallocallocator.hh:45
│ │ │ │ +
void construct(pointer p, Args &&... args)
construct an object of type T from variadic parameters
Definition: mallocallocator.hh:87
│ │ │ │ +
T & reference
Definition: mallocallocator.hh:30
│ │ │ │ +
size_type max_size() const noexcept
max size for allocate
Definition: mallocallocator.hh:74
│ │ │ │ +
const T * const_pointer
Definition: mallocallocator.hh:29
│ │ │ │ +
Definition: mallocallocator.hh:33
│ │ │ │ +
MallocAllocator< U > other
Definition: mallocallocator.hh:34
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,310 +4,114 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -communication.hh │ │ │ │ │ +mallocallocator.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 (C) 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_PARALLEL_COMMUNICATION_HH │ │ │ │ │ - 6#define DUNE_COMMON_PARALLEL_COMMUNICATION_HH │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ - 16#include │ │ │ │ │ - 17#include │ │ │ │ │ - 18 │ │ │ │ │ - 19#include │ │ │ │ │ - 20#include │ │ │ │ │ - 21#include │ │ │ │ │ - 22 │ │ │ │ │ - 42namespace Dune │ │ │ │ │ - 43{ │ │ │ │ │ + 5#ifndef DUNE_MALLOC_ALLOCATOR_HH │ │ │ │ │ + 6#define DUNE_MALLOC_ALLOCATOR_HH │ │ │ │ │ + 7 │ │ │ │ │ + 8#include │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12 │ │ │ │ │ + 17namespace Dune │ │ │ │ │ + 18{ │ │ │ │ │ + 23 template │ │ │ │ │ +24 class MallocAllocator { │ │ │ │ │ + 25 public: │ │ │ │ │ +26 typedef std::size_t size_type; │ │ │ │ │ +27 typedef std::ptrdiff_t difference_type; │ │ │ │ │ +28 typedef T* pointer; │ │ │ │ │ +29 typedef const T* const_pointer; │ │ │ │ │ +30 typedef T& reference; │ │ │ │ │ +31 typedef const T& const_reference; │ │ │ │ │ +32 typedef T value_type; │ │ │ │ │ +33 template struct rebind { │ │ │ │ │ +34 typedef MallocAllocator other; │ │ │ │ │ + 35 }; │ │ │ │ │ + 36 │ │ │ │ │ +38 MallocAllocator() noexcept {} │ │ │ │ │ + 40 template │ │ │ │ │ +41 MallocAllocator(const MallocAllocator&) noexcept {} │ │ │ │ │ +43 ~MallocAllocator() noexcept {} │ │ │ │ │ 44 │ │ │ │ │ - 45 /* define some type that definitely differs from MPI_Comm */ │ │ │ │ │ -46 struct No_Comm {}; │ │ │ │ │ - 47 │ │ │ │ │ -52 inline bool operator==(const No_Comm&, const No_Comm&) │ │ │ │ │ - 53 { │ │ │ │ │ - 54 return true; │ │ │ │ │ - 55 } │ │ │ │ │ - 56 │ │ │ │ │ -61 inline bool operator!=(const No_Comm&, const No_Comm&) │ │ │ │ │ - 62 { │ │ │ │ │ - 63 return false; │ │ │ │ │ - 64 } │ │ │ │ │ - 65 │ │ │ │ │ - 98 template │ │ │ │ │ -99 class Communication │ │ │ │ │ - 100 { │ │ │ │ │ - 101 public: │ │ │ │ │ -103 Communication() │ │ │ │ │ - 104 {} │ │ │ │ │ - 105 │ │ │ │ │ -110 Communication (const Communicator&) │ │ │ │ │ - 111 {} │ │ │ │ │ - 112 │ │ │ │ │ -114 int rank () const │ │ │ │ │ - 115 { │ │ │ │ │ - 116 return 0; │ │ │ │ │ - 117 } │ │ │ │ │ - 118 │ │ │ │ │ -120 operator No_Comm() const │ │ │ │ │ - 121 { │ │ │ │ │ - 122 return {}; │ │ │ │ │ - 123 } │ │ │ │ │ - 124 │ │ │ │ │ -126 int size () const │ │ │ │ │ - 127 { │ │ │ │ │ - 128 return 1; │ │ │ │ │ - 129 } │ │ │ │ │ - 130 │ │ │ │ │ - 134 template │ │ │ │ │ -135 int send([[maybe_unused]] const T& data, │ │ │ │ │ - 136 [[maybe_unused]] int dest_rank, │ │ │ │ │ - 137 [[maybe_unused]] int tag) │ │ │ │ │ - 138 { │ │ │ │ │ - 139 DUNE_THROW(ParallelError, "This method is not supported in sequential │ │ │ │ │ -programs"); │ │ │ │ │ - 140 } │ │ │ │ │ - 141 │ │ │ │ │ - 145 template │ │ │ │ │ -146 PseudoFuture isend([[maybe_unused]] const T&& data, │ │ │ │ │ - 147 [[maybe_unused]] int dest_rank, │ │ │ │ │ - 148 [[maybe_unused]] int tag) │ │ │ │ │ - 149 { │ │ │ │ │ - 150 DUNE_THROW(ParallelError, "This method is not supported in sequential │ │ │ │ │ -programs"); │ │ │ │ │ - 151 } │ │ │ │ │ - 152 │ │ │ │ │ - 156 template │ │ │ │ │ -157 T recv([[maybe_unused]] T&& data, │ │ │ │ │ - 158 [[maybe_unused]] int source_rank, │ │ │ │ │ - 159 [[maybe_unused]] int tag, │ │ │ │ │ - 160 [[maybe_unused]] void* status = 0) │ │ │ │ │ - 161 { │ │ │ │ │ - 162 DUNE_THROW(ParallelError, "This method is not supported in sequential │ │ │ │ │ -programs"); │ │ │ │ │ - 163 } │ │ │ │ │ - 164 │ │ │ │ │ - 168 template │ │ │ │ │ -169 PseudoFuture irecv([[maybe_unused]] T&& data, │ │ │ │ │ - 170 [[maybe_unused]] int source_rank, │ │ │ │ │ - 171 [[maybe_unused]] int tag) │ │ │ │ │ - 172 { │ │ │ │ │ - 173 DUNE_THROW(ParallelError, "This method is not supported in sequential │ │ │ │ │ -programs"); │ │ │ │ │ - 174 } │ │ │ │ │ - 175 │ │ │ │ │ - 176 template │ │ │ │ │ -177 T rrecv([[maybe_unused]] T&& data, │ │ │ │ │ - 178 [[maybe_unused]] int source_rank, │ │ │ │ │ - 179 [[maybe_unused]] int tag, │ │ │ │ │ - 180 [[maybe_unused]] void* status = 0) const │ │ │ │ │ - 181 { │ │ │ │ │ - 182 DUNE_THROW(ParallelError, "This method is not supported in sequential │ │ │ │ │ -programs"); │ │ │ │ │ - 183 } │ │ │ │ │ - 187 template │ │ │ │ │ -188 T sum (const T& in) const │ │ │ │ │ - 189 { │ │ │ │ │ - 190 return in; │ │ │ │ │ - 191 } │ │ │ │ │ - 192 │ │ │ │ │ - 198 template │ │ │ │ │ -199 int sum ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const │ │ │ │ │ - 200 { │ │ │ │ │ - 201 return 0; │ │ │ │ │ - 202 } │ │ │ │ │ - 203 │ │ │ │ │ - 207 template │ │ │ │ │ -208 T prod (const T& in) const │ │ │ │ │ - 209 { │ │ │ │ │ - 210 return in; │ │ │ │ │ - 211 } │ │ │ │ │ - 212 │ │ │ │ │ - 218 template │ │ │ │ │ -219 int prod ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const │ │ │ │ │ - 220 { │ │ │ │ │ - 221 return 0; │ │ │ │ │ - 222 } │ │ │ │ │ - 223 │ │ │ │ │ - 227 template │ │ │ │ │ -228 T min (const T& in) const │ │ │ │ │ - 229 { │ │ │ │ │ - 230 return in; │ │ │ │ │ - 231 } │ │ │ │ │ - 232 │ │ │ │ │ - 238 template │ │ │ │ │ -239 int min ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const │ │ │ │ │ - 240 { │ │ │ │ │ - 241 return 0; │ │ │ │ │ - 242 } │ │ │ │ │ - 243 │ │ │ │ │ - 247 template │ │ │ │ │ -248 T max (const T& in) const │ │ │ │ │ - 249 { │ │ │ │ │ - 250 return in; │ │ │ │ │ - 251 } │ │ │ │ │ - 252 │ │ │ │ │ - 258 template │ │ │ │ │ -259 int max ([[maybe_unused]] T* inout, [[maybe_unused]] int len) const │ │ │ │ │ - 260 { │ │ │ │ │ - 261 return 0; │ │ │ │ │ - 262 } │ │ │ │ │ - 263 │ │ │ │ │ -267 int barrier () const │ │ │ │ │ - 268 { │ │ │ │ │ - 269 return 0; │ │ │ │ │ - 270 } │ │ │ │ │ - 271 │ │ │ │ │ -275 PseudoFuture ibarrier () const │ │ │ │ │ - 276 { │ │ │ │ │ - 277 return {true}; // return a valid future │ │ │ │ │ - 278 } │ │ │ │ │ - 279 │ │ │ │ │ - 283 template │ │ │ │ │ -284 int broadcast ([[maybe_unused]] T* inout, │ │ │ │ │ - 285 [[maybe_unused]] int len, │ │ │ │ │ - 286 [[maybe_unused]] int root) const │ │ │ │ │ - 287 { │ │ │ │ │ - 288 return 0; │ │ │ │ │ - 289 } │ │ │ │ │ - 290 │ │ │ │ │ - 294 template │ │ │ │ │ -295 PseudoFuture ibroadcast(T&& data, int root) const{ │ │ │ │ │ - 296 return {std::forward(data)}; │ │ │ │ │ - 297 } │ │ │ │ │ - 298 │ │ │ │ │ - 299 │ │ │ │ │ - 312 template │ │ │ │ │ -313 int gather (const T* in, T* out, int len, [[maybe_unused]] int root) const │ │ │ │ │ -// note out must have same size as in │ │ │ │ │ - 314 { │ │ │ │ │ - 315 for (int i=0; i> │ │ │ │ │ -324 PseudoFuture igather(TIN&& data_in, TOUT&& data_out, int root){ │ │ │ │ │ - 325 *(data_out.begin()) = std::forward(data_in); │ │ │ │ │ - 326 return {std::forward(data_out)}; │ │ │ │ │ - 327 } │ │ │ │ │ - 328 │ │ │ │ │ - 329 │ │ │ │ │ - 349 template │ │ │ │ │ -350 int gatherv (const T* in, │ │ │ │ │ - 351 int sendDataLen, │ │ │ │ │ - 352 T* out, │ │ │ │ │ - 353 [[maybe_unused]] int* recvDataLen, │ │ │ │ │ - 354 int* displ, │ │ │ │ │ - 355 [[maybe_unused]] int root) const │ │ │ │ │ - 356 { │ │ │ │ │ - 357 for (int i=*displ; i │ │ │ │ │ -376 int scatter (const T* sendData, T* recvData, int len, [[maybe_unused]] int │ │ │ │ │ -root) const // note out must have same size as in │ │ │ │ │ - 377 { │ │ │ │ │ - 378 for (int i=0; i │ │ │ │ │ -387 PseudoFuture iscatter(TIN&& data_in, TOUT&& data_out, int root){ │ │ │ │ │ - 388 data_out = *(std::forward(data_in).begin()); │ │ │ │ │ - 389 return {std::forward(data_out)}; │ │ │ │ │ - 390 } │ │ │ │ │ - 391 │ │ │ │ │ - 410 template │ │ │ │ │ -411 int scatterv (const T* sendData,int* sendDataLen, int* displ, T* recvData, │ │ │ │ │ - 412 [[maybe_unused]] int recvDataLen, [[maybe_unused]] int root) const │ │ │ │ │ - 413 { │ │ │ │ │ - 414 for (int i=*displ; i<*sendDataLen; i++) │ │ │ │ │ - 415 recvData[i] = sendData[i]; │ │ │ │ │ - 416 return 0; │ │ │ │ │ - 417 } │ │ │ │ │ - 418 │ │ │ │ │ - 432 template │ │ │ │ │ -433 int allgather(const T* sbuf, int count, T* rbuf) const │ │ │ │ │ - 434 { │ │ │ │ │ - 435 for(const T* end=sbuf+count; sbuf < end; ++sbuf, ++rbuf) │ │ │ │ │ - 436 *rbuf=*sbuf; │ │ │ │ │ - 437 return 0; │ │ │ │ │ - 438 } │ │ │ │ │ - 439 │ │ │ │ │ - 444 template │ │ │ │ │ -445 PseudoFuture iallgather(TIN&& data_in, TOUT&& data_out){ │ │ │ │ │ - 446 return {std::forward(data_out)}; │ │ │ │ │ - 447 } │ │ │ │ │ - 448 │ │ │ │ │ - 465 template │ │ │ │ │ -466 int allgatherv (const T* in, int sendDataLen, T* out, [[maybe_unused]] int* │ │ │ │ │ -recvDataLen, int* displ) const │ │ │ │ │ - 467 { │ │ │ │ │ - 468 for (int i=*displ; i │ │ │ │ │ -486 int allreduce([[maybe_unused]] Type* inout, [[maybe_unused]] int len) const │ │ │ │ │ - 487 { │ │ │ │ │ - 488 return 0; │ │ │ │ │ - 489 } │ │ │ │ │ - 490 │ │ │ │ │ - 495 template │ │ │ │ │ -496 PseudoFuture iallreduce(TIN&& data_in, TOUT&& data_out){ │ │ │ │ │ - 497 data_out = std::forward(data_in); │ │ │ │ │ - 498 return {std::forward(data_out)}; │ │ │ │ │ - 499 } │ │ │ │ │ - 500 │ │ │ │ │ - 505 template │ │ │ │ │ -506 PseudoFuture iallreduce(T&& data){ │ │ │ │ │ - 507 return {std::forward(data)}; │ │ │ │ │ - 508 } │ │ │ │ │ - 509 │ │ │ │ │ - 510 │ │ │ │ │ - 524 template │ │ │ │ │ -525 int allreduce(const Type* in, Type* out, int len) const │ │ │ │ │ - 526 { │ │ │ │ │ - 527 std::copy(in, in+len, out); │ │ │ │ │ - 528 return 0; │ │ │ │ │ - 529 } │ │ │ │ │ - 530 │ │ │ │ │ - 531 }; │ │ │ │ │ - 532 │ │ │ │ │ - 538 template │ │ │ │ │ -539 using CollectiveCommunication │ │ │ │ │ - 540 [[deprecated("CollectiveCommunication is deprecated. Use Communication │ │ │ │ │ -instead.")]] │ │ │ │ │ - 541 = Communication; │ │ │ │ │ - 542} │ │ │ │ │ - 543 │ │ │ │ │ - 544#endif │ │ │ │ │ -future.hh │ │ │ │ │ -exceptions.hh │ │ │ │ │ -A few common exception classes. │ │ │ │ │ -binaryfunctions.hh │ │ │ │ │ -helper classes to provide unique types for standard functions │ │ │ │ │ -DUNE_THROW │ │ │ │ │ -#define DUNE_THROW(E, m) │ │ │ │ │ -Definition: exceptions.hh:218 │ │ │ │ │ +45 pointer address(reference x) const │ │ │ │ │ + 46 { │ │ │ │ │ + 47 return &x; │ │ │ │ │ + 48 } │ │ │ │ │ +49 const_pointer address(const_reference x) const │ │ │ │ │ + 50 { │ │ │ │ │ + 51 return &x; │ │ │ │ │ + 52 } │ │ │ │ │ + 53 │ │ │ │ │ +55 pointer allocate(size_type n, │ │ │ │ │ + 56 [[maybe_unused]] const void* hint = 0) │ │ │ │ │ + 57 { │ │ │ │ │ + 58 if (n > this->max_size()) │ │ │ │ │ + 59 throw std::bad_alloc(); │ │ │ │ │ + 60 │ │ │ │ │ + 61 pointer ret = static_cast(std::malloc(n * sizeof(T))); │ │ │ │ │ + 62 if (!ret) │ │ │ │ │ + 63 throw std::bad_alloc(); │ │ │ │ │ + 64 return ret; │ │ │ │ │ + 65 } │ │ │ │ │ + 66 │ │ │ │ │ +68 void deallocate(pointer p, [[maybe_unused]] size_type n) │ │ │ │ │ + 69 { │ │ │ │ │ + 70 std::free(p); │ │ │ │ │ + 71 } │ │ │ │ │ + 72 │ │ │ │ │ +74 size_type max_size() const noexcept │ │ │ │ │ + 75 { │ │ │ │ │ + 76 return size_type(-1) / sizeof(T); │ │ │ │ │ + 77 } │ │ │ │ │ + 78 │ │ │ │ │ +80 void construct(pointer p, const T& val) │ │ │ │ │ + 81 { │ │ │ │ │ + 82 ::new((void*)p)T(val); │ │ │ │ │ + 83 } │ │ │ │ │ + 84 │ │ │ │ │ + 86 template │ │ │ │ │ +87 void construct(pointer p, Args&&... args) │ │ │ │ │ + 88 { │ │ │ │ │ + 89 ::new((void *)p)T(std::forward(args) ...); │ │ │ │ │ + 90 } │ │ │ │ │ + 91 │ │ │ │ │ +93 void destroy(pointer p) │ │ │ │ │ + 94 { │ │ │ │ │ + 95 p->~T(); │ │ │ │ │ + 96 } │ │ │ │ │ + 97 }; │ │ │ │ │ + 98 │ │ │ │ │ + 100 template │ │ │ │ │ + 101 constexpr bool │ │ │ │ │ +102 operator==(const MallocAllocator &, const MallocAllocator &) │ │ │ │ │ + 103 { │ │ │ │ │ + 104 return true; │ │ │ │ │ + 105 } │ │ │ │ │ + 106 │ │ │ │ │ + 108 template │ │ │ │ │ + 109 constexpr bool │ │ │ │ │ +110 operator!=(const MallocAllocator &, const MallocAllocator &) │ │ │ │ │ + 111 { │ │ │ │ │ + 112 return false; │ │ │ │ │ + 113 } │ │ │ │ │ + 114} │ │ │ │ │ + 115 │ │ │ │ │ + 116#endif // DUNE_MALLOC_ALLOCATOR_HH │ │ │ │ │ Dune::operator== │ │ │ │ │ EnableIfInterOperable< T1, T2, bool >::type operator==(const │ │ │ │ │ ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, │ │ │ │ │ V2, R2, D > &rhs) │ │ │ │ │ Checks for equality. │ │ │ │ │ Definition: iteratorfacades.hh:237 │ │ │ │ │ Dune::operator!= │ │ │ │ │ @@ -315,173 +119,82 @@ │ │ │ │ │ ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, │ │ │ │ │ V2, R2, D > &rhs) │ │ │ │ │ Checks for inequality. │ │ │ │ │ Definition: iteratorfacades.hh:259 │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::ParallelError │ │ │ │ │ -Default exception if an error in the parallel communication of the program │ │ │ │ │ -occurred. │ │ │ │ │ -Definition: exceptions.hh:287 │ │ │ │ │ -Dune::No_Comm │ │ │ │ │ -Definition: communication.hh:46 │ │ │ │ │ -Dune::Communication │ │ │ │ │ -Collective communication interface and sequential default implementation. │ │ │ │ │ -Definition: communication.hh:100 │ │ │ │ │ -Dune::Communication::iallreduce │ │ │ │ │ -PseudoFuture< TOUT > iallreduce(TIN &&data_in, TOUT &&data_out) │ │ │ │ │ -Compute something over all processes nonblocking. │ │ │ │ │ -Definition: communication.hh:496 │ │ │ │ │ -Dune::Communication::send │ │ │ │ │ -int send(const T &data, int dest_rank, int tag) │ │ │ │ │ -Sends the data to the dest_rank. │ │ │ │ │ -Definition: communication.hh:135 │ │ │ │ │ -Dune::Communication::allreduce │ │ │ │ │ -int allreduce(const Type *in, Type *out, int len) const │ │ │ │ │ -Compute something over all processes for each component of an array and return │ │ │ │ │ -the result in every pr... │ │ │ │ │ -Definition: communication.hh:525 │ │ │ │ │ -Dune::Communication::max │ │ │ │ │ -T max(const T &in) const │ │ │ │ │ -Compute the maximum of the argument over all processes and return the result in │ │ │ │ │ -every process.... │ │ │ │ │ -Definition: communication.hh:248 │ │ │ │ │ -Dune::Communication::rank │ │ │ │ │ -int rank() const │ │ │ │ │ -Return rank, is between 0 and size()-1. │ │ │ │ │ -Definition: communication.hh:114 │ │ │ │ │ -Dune::Communication::sum │ │ │ │ │ -T sum(const T &in) const │ │ │ │ │ -Compute the sum of the argument over all processes and return the result in │ │ │ │ │ -every process.... │ │ │ │ │ -Definition: communication.hh:188 │ │ │ │ │ -Dune::Communication::scatterv │ │ │ │ │ -int scatterv(const T *sendData, int *sendDataLen, int *displ, T *recvData, int │ │ │ │ │ -recvDataLen, int root) const │ │ │ │ │ -Scatter arrays of variable length from a root to all other tasks. │ │ │ │ │ -Definition: communication.hh:411 │ │ │ │ │ -Dune::Communication::prod │ │ │ │ │ -int prod(T *inout, int len) const │ │ │ │ │ -Compute the product over all processes for each component of an array and │ │ │ │ │ -return the result in every ... │ │ │ │ │ -Definition: communication.hh:219 │ │ │ │ │ -Dune::Communication::recv │ │ │ │ │ -T recv(T &&data, int source_rank, int tag, void *status=0) │ │ │ │ │ -Receives the data from the source_rank. │ │ │ │ │ -Definition: communication.hh:157 │ │ │ │ │ -Dune::Communication::isend │ │ │ │ │ -PseudoFuture< T > isend(const T &&data, int dest_rank, int tag) │ │ │ │ │ -Sends the data to the dest_rank nonblocking. │ │ │ │ │ -Definition: communication.hh:146 │ │ │ │ │ -Dune::Communication::ibarrier │ │ │ │ │ -PseudoFuture< void > ibarrier() const │ │ │ │ │ -Nonblocking barrier. │ │ │ │ │ -Definition: communication.hh:275 │ │ │ │ │ -Dune::Communication::allreduce │ │ │ │ │ -int allreduce(Type *inout, int len) const │ │ │ │ │ -Compute something over all processes for each component of an array and return │ │ │ │ │ -the result in every pr... │ │ │ │ │ -Definition: communication.hh:486 │ │ │ │ │ -Dune::Communication::size │ │ │ │ │ -int size() const │ │ │ │ │ -Number of processes in set, is greater than 0. │ │ │ │ │ -Definition: communication.hh:126 │ │ │ │ │ -Dune::Communication::sum │ │ │ │ │ -int sum(T *inout, int len) const │ │ │ │ │ -Compute the sum over all processes for each component of an array and return │ │ │ │ │ -the result in every proc... │ │ │ │ │ -Definition: communication.hh:199 │ │ │ │ │ -Dune::Communication::allgatherv │ │ │ │ │ -int allgatherv(const T *in, int sendDataLen, T *out, int *recvDataLen, int │ │ │ │ │ -*displ) const │ │ │ │ │ -Gathers data of variable length from all tasks and distribute it to all. │ │ │ │ │ -Definition: communication.hh:466 │ │ │ │ │ -Dune::Communication::min │ │ │ │ │ -T min(const T &in) const │ │ │ │ │ -Compute the minimum of the argument over all processes and return the result in │ │ │ │ │ -every process.... │ │ │ │ │ -Definition: communication.hh:228 │ │ │ │ │ -Dune::Communication::irecv │ │ │ │ │ -PseudoFuture< T > irecv(T &&data, int source_rank, int tag) │ │ │ │ │ -Receives the data from the source_rank nonblocking. │ │ │ │ │ -Definition: communication.hh:169 │ │ │ │ │ -Dune::Communication::gatherv │ │ │ │ │ -int gatherv(const T *in, int sendDataLen, T *out, int *recvDataLen, int *displ, │ │ │ │ │ -int root) const │ │ │ │ │ -Gather arrays of variable size on root task. │ │ │ │ │ -Definition: communication.hh:350 │ │ │ │ │ -Dune::Communication::ibroadcast │ │ │ │ │ -PseudoFuture< T > ibroadcast(T &&data, int root) const │ │ │ │ │ -Distribute an array from the process with rank root to all other processes │ │ │ │ │ -nonblocking. │ │ │ │ │ -Definition: communication.hh:295 │ │ │ │ │ -Dune::Communication::allgather │ │ │ │ │ -int allgather(const T *sbuf, int count, T *rbuf) const │ │ │ │ │ -Gathers data from all tasks and distribute it to all. │ │ │ │ │ -Definition: communication.hh:433 │ │ │ │ │ -Dune::Communication::scatter │ │ │ │ │ -int scatter(const T *sendData, T *recvData, int len, int root) const │ │ │ │ │ -Scatter array from a root to all other task. │ │ │ │ │ -Definition: communication.hh:376 │ │ │ │ │ -Dune::Communication::gather │ │ │ │ │ -int gather(const T *in, T *out, int len, int root) const │ │ │ │ │ -Gather arrays on root task. │ │ │ │ │ -Definition: communication.hh:313 │ │ │ │ │ -Dune::Communication::iallreduce │ │ │ │ │ -PseudoFuture< T > iallreduce(T &&data) │ │ │ │ │ -Compute something over all processes nonblocking and in-place. │ │ │ │ │ -Definition: communication.hh:506 │ │ │ │ │ -Dune::Communication::Communication │ │ │ │ │ -Communication(const Communicator &) │ │ │ │ │ -Constructor with a given communicator. │ │ │ │ │ -Definition: communication.hh:110 │ │ │ │ │ -Dune::Communication::max │ │ │ │ │ -int max(T *inout, int len) const │ │ │ │ │ -Compute the maximum over all processes for each component of an array and │ │ │ │ │ -return the result in every ... │ │ │ │ │ -Definition: communication.hh:259 │ │ │ │ │ -Dune::Communication::prod │ │ │ │ │ -T prod(const T &in) const │ │ │ │ │ -Compute the product of the argument over all processes and return the result in │ │ │ │ │ -every process.... │ │ │ │ │ -Definition: communication.hh:208 │ │ │ │ │ -Dune::Communication::broadcast │ │ │ │ │ -int broadcast(T *inout, int len, int root) const │ │ │ │ │ -Distribute an array from the process with rank root to all other processes. │ │ │ │ │ -Definition: communication.hh:284 │ │ │ │ │ -Dune::Communication::rrecv │ │ │ │ │ -T rrecv(T &&data, int source_rank, int tag, void *status=0) const │ │ │ │ │ -Definition: communication.hh:177 │ │ │ │ │ -Dune::Communication::iscatter │ │ │ │ │ -PseudoFuture< TOUT > iscatter(TIN &&data_in, TOUT &&data_out, int root) │ │ │ │ │ -Scatter array from a root to all other task nonblocking. │ │ │ │ │ -Definition: communication.hh:387 │ │ │ │ │ -Dune::Communication::min │ │ │ │ │ -int min(T *inout, int len) const │ │ │ │ │ -Compute the minimum over all processes for each component of an array and │ │ │ │ │ -return the result in every ... │ │ │ │ │ -Definition: communication.hh:239 │ │ │ │ │ -Dune::Communication::barrier │ │ │ │ │ -int barrier() const │ │ │ │ │ -Wait until all processes have arrived at this point in the program. │ │ │ │ │ -Definition: communication.hh:267 │ │ │ │ │ -Dune::Communication::igather │ │ │ │ │ -PseudoFuture< TOUT > igather(TIN &&data_in, TOUT &&data_out, int root) │ │ │ │ │ -Gather arrays on root task nonblocking. │ │ │ │ │ -Definition: communication.hh:324 │ │ │ │ │ -Dune::Communication::iallgather │ │ │ │ │ -PseudoFuture< TOUT > iallgather(TIN &&data_in, TOUT &&data_out) │ │ │ │ │ -Gathers data from all tasks and distribute it to all nonblocking. │ │ │ │ │ -Definition: communication.hh:445 │ │ │ │ │ -Dune::Communication::Communication │ │ │ │ │ -Communication() │ │ │ │ │ -Construct default object. │ │ │ │ │ -Definition: communication.hh:103 │ │ │ │ │ -Dune::PseudoFuture │ │ │ │ │ -A wrapper-class for a object which is ready immediately. │ │ │ │ │ -Definition: future.hh:122 │ │ │ │ │ -Dune::PseudoFuture<_void_> │ │ │ │ │ -Definition: future.hh:160 │ │ │ │ │ +Dune::MallocAllocator │ │ │ │ │ +Allocators implementation which simply calls malloc/free. │ │ │ │ │ +Definition: mallocallocator.hh:24 │ │ │ │ │ +Dune::MallocAllocator::~MallocAllocator │ │ │ │ │ +~MallocAllocator() noexcept │ │ │ │ │ +cleanup this allocator │ │ │ │ │ +Definition: mallocallocator.hh:43 │ │ │ │ │ +Dune::MallocAllocator::pointer │ │ │ │ │ +T * pointer │ │ │ │ │ +Definition: mallocallocator.hh:28 │ │ │ │ │ +Dune::MallocAllocator::construct │ │ │ │ │ +void construct(pointer p, const T &val) │ │ │ │ │ +copy-construct an object of type T (i.e. make a placement new on p) │ │ │ │ │ +Definition: mallocallocator.hh:80 │ │ │ │ │ +Dune::MallocAllocator::MallocAllocator │ │ │ │ │ +MallocAllocator() noexcept │ │ │ │ │ +create a new MallocAllocator │ │ │ │ │ +Definition: mallocallocator.hh:38 │ │ │ │ │ +Dune::MallocAllocator::MallocAllocator │ │ │ │ │ +MallocAllocator(const MallocAllocator< U > &) noexcept │ │ │ │ │ +copy construct from an other MallocAllocator, possibly for a different result │ │ │ │ │ +type │ │ │ │ │ +Definition: mallocallocator.hh:41 │ │ │ │ │ +Dune::MallocAllocator::size_type │ │ │ │ │ +std::size_t size_type │ │ │ │ │ +Definition: mallocallocator.hh:26 │ │ │ │ │ +Dune::MallocAllocator::difference_type │ │ │ │ │ +std::ptrdiff_t difference_type │ │ │ │ │ +Definition: mallocallocator.hh:27 │ │ │ │ │ +Dune::MallocAllocator::deallocate │ │ │ │ │ +void deallocate(pointer p, size_type n) │ │ │ │ │ +deallocate n objects of type T at address p │ │ │ │ │ +Definition: mallocallocator.hh:68 │ │ │ │ │ +Dune::MallocAllocator::value_type │ │ │ │ │ +T value_type │ │ │ │ │ +Definition: mallocallocator.hh:32 │ │ │ │ │ +Dune::MallocAllocator::address │ │ │ │ │ +const_pointer address(const_reference x) const │ │ │ │ │ +Definition: mallocallocator.hh:49 │ │ │ │ │ +Dune::MallocAllocator::const_reference │ │ │ │ │ +const T & const_reference │ │ │ │ │ +Definition: mallocallocator.hh:31 │ │ │ │ │ +Dune::MallocAllocator::destroy │ │ │ │ │ +void destroy(pointer p) │ │ │ │ │ +destroy an object of type T (i.e. call the destructor) │ │ │ │ │ +Definition: mallocallocator.hh:93 │ │ │ │ │ +Dune::MallocAllocator::allocate │ │ │ │ │ +pointer allocate(size_type n, const void *hint=0) │ │ │ │ │ +allocate n objects of type T │ │ │ │ │ +Definition: mallocallocator.hh:55 │ │ │ │ │ +Dune::MallocAllocator::address │ │ │ │ │ +pointer address(reference x) const │ │ │ │ │ +Definition: mallocallocator.hh:45 │ │ │ │ │ +Dune::MallocAllocator::construct │ │ │ │ │ +void construct(pointer p, Args &&... args) │ │ │ │ │ +construct an object of type T from variadic parameters │ │ │ │ │ +Definition: mallocallocator.hh:87 │ │ │ │ │ +Dune::MallocAllocator::reference │ │ │ │ │ +T & reference │ │ │ │ │ +Definition: mallocallocator.hh:30 │ │ │ │ │ +Dune::MallocAllocator::max_size │ │ │ │ │ +size_type max_size() const noexcept │ │ │ │ │ +max size for allocate │ │ │ │ │ +Definition: mallocallocator.hh:74 │ │ │ │ │ +Dune::MallocAllocator::const_pointer │ │ │ │ │ +const T * const_pointer │ │ │ │ │ +Definition: mallocallocator.hh:29 │ │ │ │ │ +Dune::MallocAllocator::rebind │ │ │ │ │ +Definition: mallocallocator.hh:33 │ │ │ │ │ +Dune::MallocAllocator::rebind::other │ │ │ │ │ +MallocAllocator< U > other │ │ │ │ │ +Definition: mallocallocator.hh:34 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00026.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: mpihelper.hh File Reference │ │ │ │ +dune-common: filledarray.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,72 +58,47 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces
│ │ │ │ -
mpihelper.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
filledarray.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

Helpers for dealing with MPI. │ │ │ │ +

Utility to generate an array with a certain value. │ │ │ │ More...

│ │ │ │ -
#include <cassert>
│ │ │ │ -#include <mpi.h>
│ │ │ │ -#include <mutex>
│ │ │ │ -#include <dune/common/parallel/communication.hh>
│ │ │ │ -#include <dune/common/parallel/mpicommunication.hh>
│ │ │ │ -#include <dune/common/stdstreams.hh>
│ │ │ │ -#include <dune/common/visibility.hh>
│ │ │ │ +
#include <array>
│ │ │ │ +#include <cstddef>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::FakeMPIHelper
 A fake mpi helper. More...
 
class  Dune::MPIHelper
 A real mpi helper. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

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

│ │ │ │ +Functions

template<std::size_t n, class T >
constexpr std::array< T, n > Dune::filledArray (const T &t)
 Return an array filled with the provided value. More...
 
│ │ │ │

Detailed Description

│ │ │ │ -

Helpers for dealing with MPI.

│ │ │ │ -

Basically there are two helpers available:

│ │ │ │ -
FakeMPIHelper
│ │ │ │ -
A class adhering to the interface of MPIHelper that does not need MPI at all. This can be used to create a sequential program even if MPI is used to compile it.
│ │ │ │ -
MPIHelper
│ │ │ │ -
A real MPI helper. When the singleton gets instantiated MPI_Init will be called and before the program exits MPI_Finalize will be called.
│ │ │ │ -
│ │ │ │ -

Example of who to use these classes:

│ │ │ │ -

A program that is parallel if compiled with MPI and sequential otherwise:

int main(int argc, char** argv){
│ │ │ │ -
typedef Dune::MPIHelper MPIHelper;
│ │ │ │ -
MPIHelper::instance(argc, argv);
│ │ │ │ -
typename MPIHelper::MPICommunicator world =
│ │ │ │ -
MPIHelper::getCommunicator();
│ │ │ │ -
...
│ │ │ │ -
int main(int argc, char **argv)
Definition: mpi_collective_benchmark.cc:293
│ │ │ │ -
A real mpi helper.
Definition: mpihelper.hh:179
│ │ │ │ -

If one wants to have sequential program even if the code is compiled with mpi then one simply has to exchange the typedef with

typedef Dune::MPIHelper FakeMPIHelper;
│ │ │ │ -

.

│ │ │ │ -

For checking whether we really use MPI or just fake please use MPIHelper::isFake (this is also possible at compile time!)

│ │ │ │ +

Utility to generate an array with a certain value.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,64 +4,28 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -Classes | Namespaces │ │ │ │ │ -mpihelper.hh File Reference │ │ │ │ │ -Common » Parallel_Communication │ │ │ │ │ -Helpers for dealing with MPI. More... │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Namespaces | Functions │ │ │ │ │ +filledarray.hh File Reference │ │ │ │ │ +Utility to generate an array with a certain value. More... │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ - Classes │ │ │ │ │ -class  Dune::FakeMPIHelper │ │ │ │ │ -  A fake mpi helper. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::MPIHelper │ │ │ │ │ -  A real mpi helper. More... │ │ │ │ │ -  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +constexpr std::array< T, n > Dune::filledArray (const T &t) │ │ │ │ │ +  Return an array filled with the provided value. │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -Helpers for dealing with MPI. │ │ │ │ │ -Basically there are two helpers available: │ │ │ │ │ - FakeMPIHelper │ │ │ │ │ - A class adhering to the interface of MPIHelper that does not need MPI at │ │ │ │ │ - all. This can be used to create a sequential program even if MPI is used │ │ │ │ │ - to compile it. │ │ │ │ │ - MPIHelper │ │ │ │ │ - A real MPI helper. When the singleton gets instantiated MPI_Init will be │ │ │ │ │ - called and before the program exits MPI_Finalize will be called. │ │ │ │ │ -Example of who to use these classes: │ │ │ │ │ -A program that is parallel if compiled with MPI and sequential otherwise: │ │ │ │ │ -int main(int argc, char** argv){ │ │ │ │ │ -typedef Dune::MPIHelper MPIHelper; │ │ │ │ │ -MPIHelper::instance(argc, argv); │ │ │ │ │ -typename MPIHelper::MPICommunicator world = │ │ │ │ │ -MPIHelper::getCommunicator(); │ │ │ │ │ -... │ │ │ │ │ -main │ │ │ │ │ -int main(int argc, char **argv) │ │ │ │ │ -Definition: mpi_collective_benchmark.cc:293 │ │ │ │ │ -Dune::MPIHelper │ │ │ │ │ -A real mpi helper. │ │ │ │ │ -Definition: mpihelper.hh:179 │ │ │ │ │ -If one wants to have sequential program even if the code is compiled with mpi │ │ │ │ │ -then one simply has to exchange the typedef with │ │ │ │ │ -typedef Dune::MPIHelper FakeMPIHelper; │ │ │ │ │ -. │ │ │ │ │ -For checking whether we really use MPI or just fake please use MPIHelper:: │ │ │ │ │ -isFake (this is also possible at compile time!) │ │ │ │ │ +Utility to generate an array with a certain value. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00026_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: mpihelper.hh Source File │ │ │ │ +dune-common: filledarray.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,237 +58,50 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
mpihelper.hh
│ │ │ │ +
filledarray.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 (C) 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_MPIHELPER
│ │ │ │ -
6#define DUNE_MPIHELPER
│ │ │ │ -
7
│ │ │ │ -
8#if HAVE_MPI
│ │ │ │ -
9#include <cassert>
│ │ │ │ -
10#include <mpi.h>
│ │ │ │ -
11#endif
│ │ │ │ -
12
│ │ │ │ -
13#include <mutex>
│ │ │ │ -
14
│ │ │ │ - │ │ │ │ -
16#if HAVE_MPI
│ │ │ │ - │ │ │ │ - │ │ │ │ -
19#endif
│ │ │ │ - │ │ │ │ -
21
│ │ │ │ -
22namespace Dune
│ │ │ │ -
23{
│ │ │ │ - │ │ │ │ -
74 {
│ │ │ │ -
75 public:
│ │ │ │ -
80 constexpr static bool isFake = true;
│ │ │ │ -
81
│ │ │ │ - │ │ │ │ -
86
│ │ │ │ - │ │ │ │ -
94 {
│ │ │ │ -
95 static MPICommunicator comm;
│ │ │ │ -
96 return comm;
│ │ │ │ -
97 }
│ │ │ │ -
98
│ │ │ │ - │ │ │ │ -
106 {
│ │ │ │ -
107 return getCommunicator();
│ │ │ │ -
108 }
│ │ │ │ -
109
│ │ │ │ -
110
│ │ │ │ -
111
│ │ │ │ -
117 [[deprecated("getCollectionCommunication is deprecated. Use getCommunication instead.")]]
│ │ │ │ - │ │ │ │ -
119 {
│ │ │ │ - │ │ │ │ -
121 }
│ │ │ │ -
122
│ │ │ │ - │ │ │ │ - │ │ │ │ -
125 {
│ │ │ │ - │ │ │ │ -
127 }
│ │ │ │ -
128
│ │ │ │ -
144 DUNE_EXPORT static FakeMPIHelper& instance([[maybe_unused]] int argc,
│ │ │ │ -
145 [[maybe_unused]] char** argv)
│ │ │ │ -
146 {
│ │ │ │ -
147 return instance();
│ │ │ │ -
148 }
│ │ │ │ -
149
│ │ │ │ - │ │ │ │ -
151 {
│ │ │ │ -
152 static FakeMPIHelper singleton;
│ │ │ │ -
153 return singleton;
│ │ │ │ -
154 }
│ │ │ │ -
155
│ │ │ │ -
159 int rank () const { return 0; }
│ │ │ │ -
163 int size () const { return 1; }
│ │ │ │ -
164
│ │ │ │ -
165 private:
│ │ │ │ -
166 FakeMPIHelper() {}
│ │ │ │ -
167 FakeMPIHelper(const FakeMPIHelper&);
│ │ │ │ -
168 FakeMPIHelper& operator=(const FakeMPIHelper);
│ │ │ │ -
169 };
│ │ │ │ -
170
│ │ │ │ -
171#if HAVE_MPI
│ │ │ │ - │ │ │ │ -
179 {
│ │ │ │ -
180 public:
│ │ │ │ -
185 constexpr static bool isFake = false;
│ │ │ │ -
186
│ │ │ │ -
190 typedef MPI_Comm MPICommunicator;
│ │ │ │ -
191
│ │ │ │ - │ │ │ │ -
199 {
│ │ │ │ -
200 return MPI_COMM_WORLD;
│ │ │ │ -
201 }
│ │ │ │ -
202
│ │ │ │ - │ │ │ │ -
210 {
│ │ │ │ -
211 return MPI_COMM_SELF;
│ │ │ │ -
212 }
│ │ │ │ -
213
│ │ │ │ -
219 [[deprecated("getCollectionCommunication is deprecated. Use getCommunication instead.")]]
│ │ │ │ - │ │ │ │ - │ │ │ │ -
222 {
│ │ │ │ - │ │ │ │ -
224 }
│ │ │ │ -
225
│ │ │ │ - │ │ │ │ - │ │ │ │ -
228 {
│ │ │ │ - │ │ │ │ -
230 }
│ │ │ │ -
246 DUNE_EXPORT static MPIHelper& instance(int& argc, char**& argv)
│ │ │ │ -
247 {
│ │ │ │ -
248 // create singleton instance
│ │ │ │ -
249 if (!instance_){
│ │ │ │ -
250 static std::mutex mutex;
│ │ │ │ -
251 std::lock_guard<std::mutex> guard(mutex);
│ │ │ │ -
252 if(!instance_)
│ │ │ │ -
253 instance_.reset(new MPIHelper(argc,argv));
│ │ │ │ -
254 }
│ │ │ │ -
255 return *instance_;
│ │ │ │ -
256 }
│ │ │ │ -
257
│ │ │ │ - │ │ │ │ -
259 {
│ │ │ │ -
260 if(!instance_)
│ │ │ │ -
261 DUNE_THROW(InvalidStateException, "MPIHelper not initialized! Call MPIHelper::instance(argc, argv) with arguments first.");
│ │ │ │ -
262 return *instance_;
│ │ │ │ -
263 }
│ │ │ │ -
264
│ │ │ │ -
268 int rank () const { return rank_; }
│ │ │ │ -
272 int size () const { return size_; }
│ │ │ │ -
273
│ │ │ │ - │ │ │ │ -
276 {
│ │ │ │ -
277 int wasFinalized = -1;
│ │ │ │ -
278 MPI_Finalized( &wasFinalized );
│ │ │ │ -
279 if(!wasFinalized && initializedHere_)
│ │ │ │ -
280 {
│ │ │ │ -
281 MPI_Finalize();
│ │ │ │ -
282 dverb << "Called MPI_Finalize on p=" << rank_ << "!" <<std::endl;
│ │ │ │ -
283 }
│ │ │ │ -
284
│ │ │ │ -
285 }
│ │ │ │ -
286
│ │ │ │ -
287 private:
│ │ │ │ -
288 int rank_;
│ │ │ │ -
289 int size_;
│ │ │ │ -
290 bool initializedHere_;
│ │ │ │ -
291 void prevent_warning(int){}
│ │ │ │ -
292 static inline std::unique_ptr<MPIHelper> instance_ = {};
│ │ │ │ -
293
│ │ │ │ -
295 MPIHelper(int& argc, char**& argv)
│ │ │ │ -
296 : initializedHere_(false)
│ │ │ │ -
297 {
│ │ │ │ -
298 int wasInitialized = -1;
│ │ │ │ -
299 MPI_Initialized( &wasInitialized );
│ │ │ │ -
300 if(!wasInitialized)
│ │ │ │ -
301 {
│ │ │ │ -
302 rank_ = -1;
│ │ │ │ -
303 size_ = -1;
│ │ │ │ -
304 static int is_initialized = MPI_Init(&argc, &argv);
│ │ │ │ -
305 prevent_warning(is_initialized);
│ │ │ │ -
306 initializedHere_ = true;
│ │ │ │ -
307 }
│ │ │ │ -
308
│ │ │ │ -
309 MPI_Comm_rank(MPI_COMM_WORLD,&rank_);
│ │ │ │ -
310 MPI_Comm_size(MPI_COMM_WORLD,&size_);
│ │ │ │ -
311
│ │ │ │ -
312 assert( rank_ >= 0 );
│ │ │ │ -
313 assert( size_ >= 1 );
│ │ │ │ -
314
│ │ │ │ -
315 dverb << "Called MPI_Init on p=" << rank_ << "!" << std::endl;
│ │ │ │ -
316 }
│ │ │ │ -
317
│ │ │ │ -
318 MPIHelper(const MPIHelper&);
│ │ │ │ -
319 MPIHelper& operator=(const MPIHelper);
│ │ │ │ -
320 };
│ │ │ │ -
321#else // !HAVE_MPI
│ │ │ │ -
322 // We do not have MPI therefore FakeMPIHelper
│ │ │ │ -
323 // is the MPIHelper
│ │ │ │ -
328 typedef FakeMPIHelper MPIHelper;
│ │ │ │ -
329
│ │ │ │ -
330#endif // !HAVE_MPI
│ │ │ │ -
331
│ │ │ │ -
332} // end namespace Dune
│ │ │ │ -
333#endif
│ │ │ │ -
Implements an utility class that provides collective communication methods for sequential programs.
│ │ │ │ -
Implements an utility class that provides MPI's collective communication methods.
│ │ │ │ -
Definition of macros controlling symbol visibility at the ABI level.
│ │ │ │ -
#define DUNE_EXPORT
Export a symbol as part of the public ABI.
Definition: visibility.hh:20
│ │ │ │ -
Standard Dune debug streams.
│ │ │ │ -
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
│ │ │ │ -
DVerbType dverb(std::cout)
Singleton of verbose debug stream.
Definition: stdstreams.hh:116
│ │ │ │ +
5
│ │ │ │ +
6#ifndef DUNE_COMMON_FILLED_ARRAY_HH
│ │ │ │ +
7#define DUNE_COMMON_FILLED_ARRAY_HH
│ │ │ │ +
8
│ │ │ │ +
13#include <array>
│ │ │ │ +
14#include <cstddef>
│ │ │ │ +
15
│ │ │ │ +
16namespace Dune
│ │ │ │ +
17{
│ │ │ │ +
24
│ │ │ │ +
32 template<std::size_t n, class T>
│ │ │ │ +
33 constexpr std::array<T, n> filledArray(const T& t)
│ │ │ │ +
34 {
│ │ │ │ +
35 std::array<T, n> arr{};
│ │ │ │ +
36 // this is constexpr in c++17, `arr.fill(t)` is not
│ │ │ │ +
37 for(auto &el : arr)
│ │ │ │ +
38 el = t;
│ │ │ │ +
39 return arr;
│ │ │ │ +
40 }
│ │ │ │ +
41
│ │ │ │ +
44} // end namespace Dune
│ │ │ │ +
45
│ │ │ │ +
46#endif // DUNE_COMMON_FILLED_ARRAY_HH
│ │ │ │ +
constexpr std::array< T, n > filledArray(const T &t)
Return an array filled with the provided value.
Definition: filledarray.hh:33
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
Default exception if a function was called while the object is not in a valid state for that function...
Definition: exceptions.hh:281
│ │ │ │ -
Definition: communication.hh:46
│ │ │ │ -
Collective communication interface and sequential default implementation.
Definition: communication.hh:100
│ │ │ │ -
A fake mpi helper.
Definition: mpihelper.hh:74
│ │ │ │ -
static DUNE_EXPORT MPICommunicator getCommunicator()
get the default communicator
Definition: mpihelper.hh:93
│ │ │ │ -
int size() const
return rank of process, i.e. one
Definition: mpihelper.hh:163
│ │ │ │ -
static Communication< MPICommunicator > getCollectiveCommunication()
Definition: mpihelper.hh:118
│ │ │ │ -
static MPICommunicator getLocalCommunicator()
get a local communicator
Definition: mpihelper.hh:105
│ │ │ │ -
No_Comm MPICommunicator
The type of the mpi communicator.
Definition: mpihelper.hh:85
│ │ │ │ -
static DUNE_EXPORT FakeMPIHelper & instance(int argc, char **argv)
Get the singleton instance of the helper.
Definition: mpihelper.hh:144
│ │ │ │ -
static DUNE_EXPORT FakeMPIHelper & instance()
Definition: mpihelper.hh:150
│ │ │ │ -
static Communication< MPICommunicator > getCommunication()
Definition: mpihelper.hh:124
│ │ │ │ -
static constexpr bool isFake
Are we fake (i.e. pretend to have MPI support but are compiled without.)
Definition: mpihelper.hh:80
│ │ │ │ -
int rank() const
return rank of process, i.e. zero
Definition: mpihelper.hh:159
│ │ │ │ -
A real mpi helper.
Definition: mpihelper.hh:179
│ │ │ │ -
int size() const
return number of processes
Definition: mpihelper.hh:272
│ │ │ │ -
static DUNE_EXPORT MPIHelper & instance()
Definition: mpihelper.hh:258
│ │ │ │ -
static constexpr bool isFake
Are we fake (i. e. pretend to have MPI support but are compiled without.
Definition: mpihelper.hh:185
│ │ │ │ -
static DUNE_EXPORT MPIHelper & instance(int &argc, char **&argv)
Get the singleton instance of the helper.
Definition: mpihelper.hh:246
│ │ │ │ -
static Communication< MPICommunicator > getCommunication()
Definition: mpihelper.hh:227
│ │ │ │ -
~MPIHelper()
calls MPI_Finalize
Definition: mpihelper.hh:275
│ │ │ │ -
int rank() const
return rank of process
Definition: mpihelper.hh:268
│ │ │ │ -
MPI_Comm MPICommunicator
The type of the mpi communicator.
Definition: mpihelper.hh:190
│ │ │ │ -
static MPICommunicator getCommunicator()
get the default communicator
Definition: mpihelper.hh:198
│ │ │ │ -
static MPICommunicator getLocalCommunicator()
get a local communicator
Definition: mpihelper.hh:209
│ │ │ │ -
static Communication< MPICommunicator > getCollectiveCommunication()
Definition: mpihelper.hh:221
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,316 +4,47 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -mpihelper.hh │ │ │ │ │ +filledarray.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 (C) 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_MPIHELPER │ │ │ │ │ - 6#define DUNE_MPIHELPER │ │ │ │ │ - 7 │ │ │ │ │ - 8#if HAVE_MPI │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11#endif │ │ │ │ │ - 12 │ │ │ │ │ - 13#include │ │ │ │ │ - 14 │ │ │ │ │ - 15#include │ │ │ │ │ - 16#if HAVE_MPI │ │ │ │ │ - 17#include │ │ │ │ │ - 18#include │ │ │ │ │ - 19#endif │ │ │ │ │ - 20#include │ │ │ │ │ - 21 │ │ │ │ │ - 22namespace Dune │ │ │ │ │ - 23{ │ │ │ │ │ -73 class FakeMPIHelper │ │ │ │ │ - 74 { │ │ │ │ │ - 75 public: │ │ │ │ │ -80 constexpr static bool isFake = true; │ │ │ │ │ - 81 │ │ │ │ │ -85 typedef No_Comm MPICommunicator; │ │ │ │ │ - 86 │ │ │ │ │ -93 DUNE_EXPORT static MPICommunicator getCommunicator () │ │ │ │ │ - 94 { │ │ │ │ │ - 95 static MPICommunicator comm; │ │ │ │ │ - 96 return comm; │ │ │ │ │ - 97 } │ │ │ │ │ - 98 │ │ │ │ │ -105 static MPICommunicator getLocalCommunicator () │ │ │ │ │ - 106 { │ │ │ │ │ - 107 return getCommunicator(); │ │ │ │ │ - 108 } │ │ │ │ │ - 109 │ │ │ │ │ - 110 │ │ │ │ │ - 111 │ │ │ │ │ - 117 [[deprecated("getCollectionCommunication is deprecated. Use │ │ │ │ │ -getCommunication instead.")]] │ │ │ │ │ -118 static Communication getCollectiveCommunication() │ │ │ │ │ - 119 { │ │ │ │ │ - 120 return Communication(getCommunicator()); │ │ │ │ │ - 121 } │ │ │ │ │ - 122 │ │ │ │ │ - 123 static Communication │ │ │ │ │ -124 getCommunication() │ │ │ │ │ - 125 { │ │ │ │ │ - 126 return Communication(getCommunicator()); │ │ │ │ │ - 127 } │ │ │ │ │ - 128 │ │ │ │ │ -144 DUNE_EXPORT static FakeMPIHelper& instance([[maybe_unused]] int argc, │ │ │ │ │ - 145 [[maybe_unused]] char** argv) │ │ │ │ │ - 146 { │ │ │ │ │ - 147 return instance(); │ │ │ │ │ - 148 } │ │ │ │ │ - 149 │ │ │ │ │ -150 DUNE_EXPORT static FakeMPIHelper& instance() │ │ │ │ │ - 151 { │ │ │ │ │ - 152 static FakeMPIHelper singleton; │ │ │ │ │ - 153 return singleton; │ │ │ │ │ - 154 } │ │ │ │ │ - 155 │ │ │ │ │ -159 int rank () const { return 0; } │ │ │ │ │ -163 int size () const { return 1; } │ │ │ │ │ - 164 │ │ │ │ │ - 165 private: │ │ │ │ │ - 166 FakeMPIHelper() {} │ │ │ │ │ - 167 FakeMPIHelper(const FakeMPIHelper&); │ │ │ │ │ - 168 FakeMPIHelper& operator=(const FakeMPIHelper); │ │ │ │ │ - 169 }; │ │ │ │ │ - 170 │ │ │ │ │ - 171#if HAVE_MPI │ │ │ │ │ -178 class MPIHelper │ │ │ │ │ - 179 { │ │ │ │ │ - 180 public: │ │ │ │ │ -185 constexpr static bool isFake = false; │ │ │ │ │ - 186 │ │ │ │ │ -190 typedef MPI_Comm MPICommunicator; │ │ │ │ │ - 191 │ │ │ │ │ -198 static MPICommunicator getCommunicator () │ │ │ │ │ - 199 { │ │ │ │ │ - 200 return MPI_COMM_WORLD; │ │ │ │ │ - 201 } │ │ │ │ │ - 202 │ │ │ │ │ -209 static MPICommunicator getLocalCommunicator () │ │ │ │ │ - 210 { │ │ │ │ │ - 211 return MPI_COMM_SELF; │ │ │ │ │ - 212 } │ │ │ │ │ - 213 │ │ │ │ │ - 219 [[deprecated("getCollectionCommunication is deprecated. Use │ │ │ │ │ -getCommunication instead.")]] │ │ │ │ │ - 220 static Communication │ │ │ │ │ -221 getCollectiveCommunication() │ │ │ │ │ - 222 { │ │ │ │ │ - 223 return Communication(getCommunicator()); │ │ │ │ │ - 224 } │ │ │ │ │ - 225 │ │ │ │ │ - 226 static Communication │ │ │ │ │ -227 getCommunication() │ │ │ │ │ - 228 { │ │ │ │ │ - 229 return Communication(getCommunicator()); │ │ │ │ │ - 230 } │ │ │ │ │ -246 DUNE_EXPORT static MPIHelper& instance(int& argc, char**& argv) │ │ │ │ │ - 247 { │ │ │ │ │ - 248 // create singleton instance │ │ │ │ │ - 249 if (!instance_){ │ │ │ │ │ - 250 static std::mutex mutex; │ │ │ │ │ - 251 std::lock_guard guard(mutex); │ │ │ │ │ - 252 if(!instance_) │ │ │ │ │ - 253 instance_.reset(new MPIHelper(argc,argv)); │ │ │ │ │ - 254 } │ │ │ │ │ - 255 return *instance_; │ │ │ │ │ - 256 } │ │ │ │ │ - 257 │ │ │ │ │ -258 DUNE_EXPORT static MPIHelper& instance() │ │ │ │ │ - 259 { │ │ │ │ │ - 260 if(!instance_) │ │ │ │ │ - 261 DUNE_THROW(InvalidStateException, "MPIHelper not initialized! Call │ │ │ │ │ -MPIHelper::instance(argc, argv) with arguments first."); │ │ │ │ │ - 262 return *instance_; │ │ │ │ │ - 263 } │ │ │ │ │ - 264 │ │ │ │ │ -268 int rank () const { return rank_; } │ │ │ │ │ -272 int size () const { return size_; } │ │ │ │ │ - 273 │ │ │ │ │ -275 ~MPIHelper() │ │ │ │ │ - 276 { │ │ │ │ │ - 277 int wasFinalized = -1; │ │ │ │ │ - 278 MPI_Finalized( &wasFinalized ); │ │ │ │ │ - 279 if(!wasFinalized && initializedHere_) │ │ │ │ │ - 280 { │ │ │ │ │ - 281 MPI_Finalize(); │ │ │ │ │ - 282 dverb << "Called MPI_Finalize on p=" << rank_ << "!" < instance_ = {}; │ │ │ │ │ - 293 │ │ │ │ │ - 295 MPIHelper(int& argc, char**& argv) │ │ │ │ │ - 296 : initializedHere_(false) │ │ │ │ │ - 297 { │ │ │ │ │ - 298 int wasInitialized = -1; │ │ │ │ │ - 299 MPI_Initialized( &wasInitialized ); │ │ │ │ │ - 300 if(!wasInitialized) │ │ │ │ │ - 301 { │ │ │ │ │ - 302 rank_ = -1; │ │ │ │ │ - 303 size_ = -1; │ │ │ │ │ - 304 static int is_initialized = MPI_Init(&argc, &argv); │ │ │ │ │ - 305 prevent_warning(is_initialized); │ │ │ │ │ - 306 initializedHere_ = true; │ │ │ │ │ - 307 } │ │ │ │ │ - 308 │ │ │ │ │ - 309 MPI_Comm_rank(MPI_COMM_WORLD,&rank_); │ │ │ │ │ - 310 MPI_Comm_size(MPI_COMM_WORLD,&size_); │ │ │ │ │ - 311 │ │ │ │ │ - 312 assert( rank_ >= 0 ); │ │ │ │ │ - 313 assert( size_ >= 1 ); │ │ │ │ │ - 314 │ │ │ │ │ - 315 dverb << "Called MPI_Init on p=" << rank_ << "!" << std::endl; │ │ │ │ │ - 316 } │ │ │ │ │ - 317 │ │ │ │ │ - 318 MPIHelper(const MPIHelper&); │ │ │ │ │ - 319 MPIHelper& operator=(const MPIHelper); │ │ │ │ │ - 320 }; │ │ │ │ │ - 321#else // !HAVE_MPI │ │ │ │ │ - 322 // We do not have MPI therefore FakeMPIHelper │ │ │ │ │ - 323 // is the MPIHelper │ │ │ │ │ - 328 typedef FakeMPIHelper MPIHelper; │ │ │ │ │ - 329 │ │ │ │ │ - 330#endif // !HAVE_MPI │ │ │ │ │ - 331 │ │ │ │ │ - 332} // end namespace Dune │ │ │ │ │ - 333#endif │ │ │ │ │ -communication.hh │ │ │ │ │ -Implements an utility class that provides collective communication methods for │ │ │ │ │ -sequential programs. │ │ │ │ │ -mpicommunication.hh │ │ │ │ │ -Implements an utility class that provides MPI's collective communication │ │ │ │ │ -methods. │ │ │ │ │ -visibility.hh │ │ │ │ │ -Definition of macros controlling symbol visibility at the ABI level. │ │ │ │ │ -DUNE_EXPORT │ │ │ │ │ -#define DUNE_EXPORT │ │ │ │ │ -Export a symbol as part of the public ABI. │ │ │ │ │ -Definition: visibility.hh:20 │ │ │ │ │ -stdstreams.hh │ │ │ │ │ -Standard Dune debug streams. │ │ │ │ │ -DUNE_THROW │ │ │ │ │ -#define DUNE_THROW(E, m) │ │ │ │ │ -Definition: exceptions.hh:218 │ │ │ │ │ -Dune::dverb │ │ │ │ │ -DVerbType dverb(std::cout) │ │ │ │ │ -Singleton of verbose debug stream. │ │ │ │ │ -Definition: stdstreams.hh:116 │ │ │ │ │ + 5 │ │ │ │ │ + 6#ifndef DUNE_COMMON_FILLED_ARRAY_HH │ │ │ │ │ + 7#define DUNE_COMMON_FILLED_ARRAY_HH │ │ │ │ │ + 8 │ │ │ │ │ + 13#include │ │ │ │ │ + 14#include │ │ │ │ │ + 15 │ │ │ │ │ + 16namespace Dune │ │ │ │ │ + 17{ │ │ │ │ │ + 24 │ │ │ │ │ + 32 template │ │ │ │ │ +33 constexpr std::array filledArray(const T& t) │ │ │ │ │ + 34 { │ │ │ │ │ + 35 std::array arr{}; │ │ │ │ │ + 36 // this is constexpr in c++17, `arr.fill(t)` is not │ │ │ │ │ + 37 for(auto &el : arr) │ │ │ │ │ + 38 el = t; │ │ │ │ │ + 39 return arr; │ │ │ │ │ + 40 } │ │ │ │ │ + 41 │ │ │ │ │ + 44} // end namespace Dune │ │ │ │ │ + 45 │ │ │ │ │ + 46#endif // DUNE_COMMON_FILLED_ARRAY_HH │ │ │ │ │ +Dune::filledArray │ │ │ │ │ +constexpr std::array< T, n > filledArray(const T &t) │ │ │ │ │ +Return an array filled with the provided value. │ │ │ │ │ +Definition: filledarray.hh:33 │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::InvalidStateException │ │ │ │ │ -Default exception if a function was called while the object is not in a valid │ │ │ │ │ -state for that function... │ │ │ │ │ -Definition: exceptions.hh:281 │ │ │ │ │ -Dune::No_Comm │ │ │ │ │ -Definition: communication.hh:46 │ │ │ │ │ -Dune::Communication │ │ │ │ │ -Collective communication interface and sequential default implementation. │ │ │ │ │ -Definition: communication.hh:100 │ │ │ │ │ -Dune::FakeMPIHelper │ │ │ │ │ -A fake mpi helper. │ │ │ │ │ -Definition: mpihelper.hh:74 │ │ │ │ │ -Dune::FakeMPIHelper::getCommunicator │ │ │ │ │ -static DUNE_EXPORT MPICommunicator getCommunicator() │ │ │ │ │ -get the default communicator │ │ │ │ │ -Definition: mpihelper.hh:93 │ │ │ │ │ -Dune::FakeMPIHelper::size │ │ │ │ │ -int size() const │ │ │ │ │ -return rank of process, i.e. one │ │ │ │ │ -Definition: mpihelper.hh:163 │ │ │ │ │ -Dune::FakeMPIHelper::getCollectiveCommunication │ │ │ │ │ -static Communication< MPICommunicator > getCollectiveCommunication() │ │ │ │ │ -Definition: mpihelper.hh:118 │ │ │ │ │ -Dune::FakeMPIHelper::getLocalCommunicator │ │ │ │ │ -static MPICommunicator getLocalCommunicator() │ │ │ │ │ -get a local communicator │ │ │ │ │ -Definition: mpihelper.hh:105 │ │ │ │ │ -Dune::FakeMPIHelper::MPICommunicator │ │ │ │ │ -No_Comm MPICommunicator │ │ │ │ │ -The type of the mpi communicator. │ │ │ │ │ -Definition: mpihelper.hh:85 │ │ │ │ │ -Dune::FakeMPIHelper::instance │ │ │ │ │ -static DUNE_EXPORT FakeMPIHelper & instance(int argc, char **argv) │ │ │ │ │ -Get the singleton instance of the helper. │ │ │ │ │ -Definition: mpihelper.hh:144 │ │ │ │ │ -Dune::FakeMPIHelper::instance │ │ │ │ │ -static DUNE_EXPORT FakeMPIHelper & instance() │ │ │ │ │ -Definition: mpihelper.hh:150 │ │ │ │ │ -Dune::FakeMPIHelper::getCommunication │ │ │ │ │ -static Communication< MPICommunicator > getCommunication() │ │ │ │ │ -Definition: mpihelper.hh:124 │ │ │ │ │ -Dune::FakeMPIHelper::isFake │ │ │ │ │ -static constexpr bool isFake │ │ │ │ │ -Are we fake (i.e. pretend to have MPI support but are compiled without.) │ │ │ │ │ -Definition: mpihelper.hh:80 │ │ │ │ │ -Dune::FakeMPIHelper::rank │ │ │ │ │ -int rank() const │ │ │ │ │ -return rank of process, i.e. zero │ │ │ │ │ -Definition: mpihelper.hh:159 │ │ │ │ │ -Dune::MPIHelper │ │ │ │ │ -A real mpi helper. │ │ │ │ │ -Definition: mpihelper.hh:179 │ │ │ │ │ -Dune::MPIHelper::size │ │ │ │ │ -int size() const │ │ │ │ │ -return number of processes │ │ │ │ │ -Definition: mpihelper.hh:272 │ │ │ │ │ -Dune::MPIHelper::instance │ │ │ │ │ -static DUNE_EXPORT MPIHelper & instance() │ │ │ │ │ -Definition: mpihelper.hh:258 │ │ │ │ │ -Dune::MPIHelper::isFake │ │ │ │ │ -static constexpr bool isFake │ │ │ │ │ -Are we fake (i. e. pretend to have MPI support but are compiled without. │ │ │ │ │ -Definition: mpihelper.hh:185 │ │ │ │ │ -Dune::MPIHelper::instance │ │ │ │ │ -static DUNE_EXPORT MPIHelper & instance(int &argc, char **&argv) │ │ │ │ │ -Get the singleton instance of the helper. │ │ │ │ │ -Definition: mpihelper.hh:246 │ │ │ │ │ -Dune::MPIHelper::getCommunication │ │ │ │ │ -static Communication< MPICommunicator > getCommunication() │ │ │ │ │ -Definition: mpihelper.hh:227 │ │ │ │ │ -Dune::MPIHelper::~MPIHelper │ │ │ │ │ -~MPIHelper() │ │ │ │ │ -calls MPI_Finalize │ │ │ │ │ -Definition: mpihelper.hh:275 │ │ │ │ │ -Dune::MPIHelper::rank │ │ │ │ │ -int rank() const │ │ │ │ │ -return rank of process │ │ │ │ │ -Definition: mpihelper.hh:268 │ │ │ │ │ -Dune::MPIHelper::MPICommunicator │ │ │ │ │ -MPI_Comm MPICommunicator │ │ │ │ │ -The type of the mpi communicator. │ │ │ │ │ -Definition: mpihelper.hh:190 │ │ │ │ │ -Dune::MPIHelper::getCommunicator │ │ │ │ │ -static MPICommunicator getCommunicator() │ │ │ │ │ -get the default communicator │ │ │ │ │ -Definition: mpihelper.hh:198 │ │ │ │ │ -Dune::MPIHelper::getLocalCommunicator │ │ │ │ │ -static MPICommunicator getLocalCommunicator() │ │ │ │ │ -get a local communicator │ │ │ │ │ -Definition: mpihelper.hh:209 │ │ │ │ │ -Dune::MPIHelper::getCollectiveCommunication │ │ │ │ │ -static Communication< MPICommunicator > getCollectiveCommunication() │ │ │ │ │ -Definition: mpihelper.hh:221 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00029.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: mpitraits.hh File Reference │ │ │ │ +dune-common: ios_state.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,50 +58,45 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
mpitraits.hh File Reference
│ │ │ │ +
ios_state.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

Traits classes for mapping types onto MPI_Datatype. │ │ │ │ +

Utility class for storing and resetting stream attributes. │ │ │ │ More...

│ │ │ │ -
#include <cstddef>
│ │ │ │ -#include <cstdint>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <complex>
│ │ │ │ -#include <mpi.h>
│ │ │ │ +
#include <ios>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::MPITraits< T >
 A traits class describing the mapping of types onto MPI_Datatypes. More...
class  Dune::ios_base_all_saver
 Utility class for storing and resetting stream attributes. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 Dune namespace.
 
│ │ │ │

Detailed Description

│ │ │ │ -

Traits classes for mapping types onto MPI_Datatype.

│ │ │ │ +

Utility class for storing and resetting stream attributes.

│ │ │ │
Author
Markus Blatt
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,35 +4,28 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ Classes | Namespaces │ │ │ │ │ -mpitraits.hh File Reference │ │ │ │ │ -Common » Parallel_Communication │ │ │ │ │ -Traits classes for mapping types onto MPI_Datatype. More... │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +ios_state.hh File Reference │ │ │ │ │ +Common │ │ │ │ │ +Utility class for storing and resetting stream attributes. More... │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -struct  Dune::MPITraits<_T_> │ │ │ │ │ -  A traits class describing the mapping of types onto MPI_Datatypes. │ │ │ │ │ - More... │ │ │ │ │ +class  Dune::ios_base_all_saver │ │ │ │ │ +  Utility class for storing and resetting stream attributes. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -Traits classes for mapping types onto MPI_Datatype. │ │ │ │ │ +Utility class for storing and resetting stream attributes. │ │ │ │ │ Author │ │ │ │ │ Markus Blatt │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00029_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: mpitraits.hh Source File │ │ │ │ +dune-common: ios_state.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,214 +58,58 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
mpitraits.hh
│ │ │ │ +
ios_state.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 (C) 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_MPITRAITS_HH
│ │ │ │ -
6#define DUNE_MPITRAITS_HH
│ │ │ │ +
5#ifndef DUNE_COMMON_IOS_STATE_HH
│ │ │ │ +
6#define DUNE_COMMON_IOS_STATE_HH
│ │ │ │
7
│ │ │ │ -
18#if HAVE_MPI
│ │ │ │ -
19
│ │ │ │ -
20#include <cstddef>
│ │ │ │ -
21#include <cstdint>
│ │ │ │ -
22#include <type_traits>
│ │ │ │ -
23#include <utility>
│ │ │ │ -
24#include <complex>
│ │ │ │ -
25
│ │ │ │ -
26#include <mpi.h>
│ │ │ │ -
27
│ │ │ │ -
28namespace Dune
│ │ │ │ -
29{
│ │ │ │ -
39 template<typename T>
│ │ │ │ -
40 struct MPITraits
│ │ │ │ -
41 {
│ │ │ │ -
42 private:
│ │ │ │ -
43 MPITraits(){}
│ │ │ │ -
44 MPITraits(const MPITraits&){}
│ │ │ │ -
45 static MPI_Datatype datatype;
│ │ │ │ -
46 static MPI_Datatype vectortype;
│ │ │ │ -
47 public:
│ │ │ │ -
48 static inline MPI_Datatype getType()
│ │ │ │ -
49 {
│ │ │ │ -
50 if(datatype==MPI_DATATYPE_NULL) {
│ │ │ │ -
51 MPI_Type_contiguous(sizeof(T),MPI_BYTE,&datatype);
│ │ │ │ -
52 MPI_Type_commit(&datatype);
│ │ │ │ -
53 }
│ │ │ │ -
54 return datatype;
│ │ │ │ -
55 }
│ │ │ │ -
56 static constexpr bool is_intrinsic = false;
│ │ │ │ -
57 };
│ │ │ │ -
58 template<class T>
│ │ │ │ -
59 MPI_Datatype MPITraits<T>::datatype = MPI_DATATYPE_NULL;
│ │ │ │ -
60
│ │ │ │ -
61#ifndef DOXYGEN
│ │ │ │ +
8#include <ios>
│ │ │ │ +
9
│ │ │ │ +
10namespace Dune {
│ │ │ │ + │ │ │ │ +
34 {
│ │ │ │ +
35 public:
│ │ │ │ +
37 typedef std::ios_base state_type;
│ │ │ │ +
38
│ │ │ │ + │ │ │ │ +
49
│ │ │ │ + │ │ │ │ +
54
│ │ │ │ +
61 void restore();
│ │ │ │
62
│ │ │ │ -
63 // A Macro for defining traits for the primitive data types
│ │ │ │ -
64#define ComposeMPITraits(p,m) \
│ │ │ │ -
65 template<> \
│ │ │ │ -
66 struct MPITraits<p>{ \
│ │ │ │ -
67 static inline MPI_Datatype getType(){ \
│ │ │ │ -
68 return m; \
│ │ │ │ -
69 } \
│ │ │ │ -
70 static constexpr bool is_intrinsic = true; \
│ │ │ │ -
71 }
│ │ │ │ -
72
│ │ │ │ -
73 ComposeMPITraits(char, MPI_CHAR);
│ │ │ │ -
74 ComposeMPITraits(unsigned char,MPI_UNSIGNED_CHAR);
│ │ │ │ -
75 ComposeMPITraits(short,MPI_SHORT);
│ │ │ │ -
76 ComposeMPITraits(unsigned short,MPI_UNSIGNED_SHORT);
│ │ │ │ -
77 ComposeMPITraits(int,MPI_INT);
│ │ │ │ -
78 ComposeMPITraits(unsigned int,MPI_UNSIGNED);
│ │ │ │ -
79 ComposeMPITraits(long,MPI_LONG);
│ │ │ │ -
80 ComposeMPITraits(unsigned long,MPI_UNSIGNED_LONG);
│ │ │ │ -
81 ComposeMPITraits(float,MPI_FLOAT);
│ │ │ │ -
82 ComposeMPITraits(double,MPI_DOUBLE);
│ │ │ │ -
83 ComposeMPITraits(long double,MPI_LONG_DOUBLE);
│ │ │ │ -
84 ComposeMPITraits(std::complex<double>, MPI_CXX_DOUBLE_COMPLEX);
│ │ │ │ -
85 ComposeMPITraits(std::complex<long double>, MPI_CXX_LONG_DOUBLE_COMPLEX);
│ │ │ │ -
86 ComposeMPITraits(std::complex<float>, MPI_CXX_FLOAT_COMPLEX);
│ │ │ │ -
87
│ │ │ │ -
88
│ │ │ │ -
89#undef ComposeMPITraits
│ │ │ │ -
90
│ │ │ │ -
91 template<class K, int n> class FieldVector;
│ │ │ │ -
92
│ │ │ │ -
93 template<class K, int n>
│ │ │ │ -
94 struct MPITraits<FieldVector<K,n> >
│ │ │ │ -
95 {
│ │ │ │ -
96 static MPI_Datatype datatype;
│ │ │ │ -
97 static MPI_Datatype vectortype;
│ │ │ │ -
98
│ │ │ │ -
99 static inline MPI_Datatype getType()
│ │ │ │ -
100 {
│ │ │ │ -
101 if(datatype==MPI_DATATYPE_NULL) {
│ │ │ │ -
102 MPI_Type_contiguous(n, MPITraits<K>::getType(), &vectortype);
│ │ │ │ -
103 MPI_Type_commit(&vectortype);
│ │ │ │ -
104 FieldVector<K,n> fvector;
│ │ │ │ -
105 MPI_Aint base;
│ │ │ │ -
106 MPI_Aint displ;
│ │ │ │ -
107 MPI_Get_address(&fvector, &base);
│ │ │ │ -
108 MPI_Get_address(&(fvector[0]), &displ);
│ │ │ │ -
109 displ -= base;
│ │ │ │ -
110 int length[1]={1};
│ │ │ │ -
111
│ │ │ │ -
112 MPI_Type_create_struct(1, length, &displ, &vectortype, &datatype);
│ │ │ │ -
113 MPI_Type_commit(&datatype);
│ │ │ │ -
114 }
│ │ │ │ -
115 return datatype;
│ │ │ │ -
116 }
│ │ │ │ -
117
│ │ │ │ -
118 };
│ │ │ │ -
119
│ │ │ │ -
120 template<class K, int n>
│ │ │ │ -
121 MPI_Datatype MPITraits<FieldVector<K,n> >::datatype = MPI_DATATYPE_NULL;
│ │ │ │ -
122 template<class K, int n>
│ │ │ │ -
123 MPI_Datatype MPITraits<FieldVector<K,n> >::vectortype = {MPI_DATATYPE_NULL};
│ │ │ │ -
124
│ │ │ │ -
125
│ │ │ │ -
126 template<int k>
│ │ │ │ -
127 class bigunsignedint;
│ │ │ │ -
128
│ │ │ │ -
129 template<int k>
│ │ │ │ -
130 struct MPITraits<bigunsignedint<k> >
│ │ │ │ -
131 {
│ │ │ │ -
132 static MPI_Datatype datatype;
│ │ │ │ -
133 static MPI_Datatype vectortype;
│ │ │ │ -
134
│ │ │ │ -
135 static inline MPI_Datatype getType()
│ │ │ │ -
136 {
│ │ │ │ -
137 if(datatype==MPI_DATATYPE_NULL) {
│ │ │ │ - │ │ │ │ -
139 &vectortype);
│ │ │ │ -
140 //MPI_Type_commit(&vectortype);
│ │ │ │ -
141 bigunsignedint<k> data;
│ │ │ │ -
142 MPI_Aint base;
│ │ │ │ -
143 MPI_Aint displ;
│ │ │ │ -
144 MPI_Get_address(&data, &base);
│ │ │ │ -
145 MPI_Get_address(&(data.digit), &displ);
│ │ │ │ -
146 displ -= base;
│ │ │ │ -
147 int length[1]={1};
│ │ │ │ -
148 MPI_Type_create_struct(1, length, &displ, &vectortype, &datatype);
│ │ │ │ -
149 MPI_Type_commit(&datatype);
│ │ │ │ -
150 }
│ │ │ │ -
151 return datatype;
│ │ │ │ -
152 }
│ │ │ │ -
153 };
│ │ │ │ -
154}
│ │ │ │ -
155
│ │ │ │ -
156namespace Dune
│ │ │ │ -
157{
│ │ │ │ -
158 template<int k>
│ │ │ │ -
159 MPI_Datatype MPITraits<bigunsignedint<k> >::datatype = MPI_DATATYPE_NULL;
│ │ │ │ -
160 template<int k>
│ │ │ │ -
161 MPI_Datatype MPITraits<bigunsignedint<k> >::vectortype = MPI_DATATYPE_NULL;
│ │ │ │ -
162
│ │ │ │ -
163 template<typename T1, typename T2>
│ │ │ │ -
164 struct MPITraits<std::pair<T1,T2 > >
│ │ │ │ -
165 {
│ │ │ │ -
166 public:
│ │ │ │ -
167 inline static MPI_Datatype getType();
│ │ │ │ -
168 private:
│ │ │ │ -
169 static MPI_Datatype type;
│ │ │ │ -
170 };
│ │ │ │ -
171 template<typename T1, typename T2>
│ │ │ │ -
172 MPI_Datatype MPITraits<std::pair<T1,T2> >::getType()
│ │ │ │ -
173 {
│ │ │ │ -
174 if(type==MPI_DATATYPE_NULL) {
│ │ │ │ -
175 int length[2] = {1, 1};
│ │ │ │ -
176 MPI_Aint disp[2];
│ │ │ │ -
177 MPI_Datatype types[2] = {MPITraits<T1>::getType(),
│ │ │ │ - │ │ │ │ -
179
│ │ │ │ -
180 using Pair = std::pair<T1, T2>;
│ │ │ │ -
181 static_assert(std::is_standard_layout<Pair>::value, "offsetof() is only defined for standard layout types");
│ │ │ │ -
182 disp[0] = offsetof(Pair, first);
│ │ │ │ -
183 disp[1] = offsetof(Pair, second);
│ │ │ │ -
184
│ │ │ │ -
185 MPI_Datatype tmp;
│ │ │ │ -
186 MPI_Type_create_struct(2, length, disp, types, &tmp);
│ │ │ │ -
187
│ │ │ │ -
188 MPI_Type_create_resized(tmp, 0, sizeof(Pair), &type);
│ │ │ │ -
189 MPI_Type_commit(&type);
│ │ │ │ -
190
│ │ │ │ -
191 MPI_Type_free(&tmp);
│ │ │ │ -
192 }
│ │ │ │ -
193 return type;
│ │ │ │ -
194 }
│ │ │ │ -
195
│ │ │ │ -
196 template<typename T1, typename T2>
│ │ │ │ -
197 MPI_Datatype MPITraits<std::pair<T1,T2> >::type=MPI_DATATYPE_NULL;
│ │ │ │ -
198
│ │ │ │ -
199#endif // !DOXYGEN
│ │ │ │ -
200
│ │ │ │ -
201} // namespace Dune
│ │ │ │ -
202
│ │ │ │ -
203#endif // HAVE_MPI
│ │ │ │ -
204
│ │ │ │ -
207#endif
│ │ │ │ -
STL namespace.
│ │ │ │ +
63 private:
│ │ │ │ +
65 state_type& ios;
│ │ │ │ +
67 state_type::fmtflags oldflags;
│ │ │ │ +
69 std::streamsize oldprec;
│ │ │ │ +
71 std::streamsize oldwidth;
│ │ │ │ +
72 };
│ │ │ │ +
73
│ │ │ │ +
75}
│ │ │ │ +
76
│ │ │ │ +
77#endif // DUNE_COMMON_IOS_STATE_HH
│ │ │ │ +
~ios_base_all_saver()
Destructor that restores the flags stored by the constructor.
Definition: ios_state.cc:24
│ │ │ │ +
void restore()
Restore flags now.
Definition: ios_state.cc:29
│ │ │ │ +
std::ios_base state_type
Export type of object we save the state for.
Definition: ios_state.hh:37
│ │ │ │ +
ios_base_all_saver(state_type &ios_)
Constructor that stores the currently used flags.
Definition: ios_state.cc:19
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
A traits class describing the mapping of types onto MPI_Datatypes.
Definition: mpitraits.hh:41
│ │ │ │ -
static MPI_Datatype getType()
Definition: mpitraits.hh:48
│ │ │ │ -
static constexpr bool is_intrinsic
Definition: mpitraits.hh:56
│ │ │ │ -
static constexpr int n
Definition: bigunsignedint.hh:78
│ │ │ │ -
vector space out of a tensor product of fields.
Definition: fvector.hh:95
│ │ │ │ +
Utility class for storing and resetting stream attributes.
Definition: ios_state.hh:34
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,224 +4,66 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -mpitraits.hh │ │ │ │ │ +ios_state.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 (C) 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_MPITRAITS_HH │ │ │ │ │ - 6#define DUNE_MPITRAITS_HH │ │ │ │ │ + 5#ifndef DUNE_COMMON_IOS_STATE_HH │ │ │ │ │ + 6#define DUNE_COMMON_IOS_STATE_HH │ │ │ │ │ 7 │ │ │ │ │ - 18#if HAVE_MPI │ │ │ │ │ - 19 │ │ │ │ │ - 20#include │ │ │ │ │ - 21#include │ │ │ │ │ - 22#include │ │ │ │ │ - 23#include │ │ │ │ │ - 24#include │ │ │ │ │ - 25 │ │ │ │ │ - 26#include │ │ │ │ │ - 27 │ │ │ │ │ - 28namespace Dune │ │ │ │ │ - 29{ │ │ │ │ │ - 39 template │ │ │ │ │ -40 struct MPITraits │ │ │ │ │ - 41 { │ │ │ │ │ - 42 private: │ │ │ │ │ - 43 MPITraits(){} │ │ │ │ │ - 44 MPITraits(const MPITraits&){} │ │ │ │ │ - 45 static MPI_Datatype datatype; │ │ │ │ │ - 46 static MPI_Datatype vectortype; │ │ │ │ │ - 47 public: │ │ │ │ │ -48 static inline MPI_Datatype getType() │ │ │ │ │ - 49 { │ │ │ │ │ - 50 if(datatype==MPI_DATATYPE_NULL) { │ │ │ │ │ - 51 MPI_Type_contiguous(sizeof(T),MPI_BYTE,&datatype); │ │ │ │ │ - 52 MPI_Type_commit(&datatype); │ │ │ │ │ - 53 } │ │ │ │ │ - 54 return datatype; │ │ │ │ │ - 55 } │ │ │ │ │ -56 static constexpr bool is_intrinsic = false; │ │ │ │ │ - 57 }; │ │ │ │ │ - 58 template │ │ │ │ │ - 59 MPI_Datatype MPITraits::datatype = MPI_DATATYPE_NULL; │ │ │ │ │ - 60 │ │ │ │ │ - 61#ifndef DOXYGEN │ │ │ │ │ + 8#include │ │ │ │ │ + 9 │ │ │ │ │ + 10namespace Dune { │ │ │ │ │ +33 class ios_base_all_saver │ │ │ │ │ + 34 { │ │ │ │ │ + 35 public: │ │ │ │ │ +37 typedef std::ios_base state_type; │ │ │ │ │ + 38 │ │ │ │ │ + 48 ios_base_all_saver(state_type& ios_); │ │ │ │ │ + 49 │ │ │ │ │ + 53 ~ios_base_all_saver(); │ │ │ │ │ + 54 │ │ │ │ │ + 61 void restore(); │ │ │ │ │ 62 │ │ │ │ │ - 63 // A Macro for defining traits for the primitive data types │ │ │ │ │ - 64#define ComposeMPITraits(p,m) \ │ │ │ │ │ - 65 template<> \ │ │ │ │ │ - 66 struct MPITraits

{ \ │ │ │ │ │ - 67 static inline MPI_Datatype getType(){ \ │ │ │ │ │ - 68 return m; \ │ │ │ │ │ - 69 } \ │ │ │ │ │ - 70 static constexpr bool is_intrinsic = true; \ │ │ │ │ │ - 71 } │ │ │ │ │ - 72 │ │ │ │ │ - 73 ComposeMPITraits(char, MPI_CHAR); │ │ │ │ │ - 74 ComposeMPITraits(unsigned char,MPI_UNSIGNED_CHAR); │ │ │ │ │ - 75 ComposeMPITraits(short,MPI_SHORT); │ │ │ │ │ - 76 ComposeMPITraits(unsigned short,MPI_UNSIGNED_SHORT); │ │ │ │ │ - 77 ComposeMPITraits(int,MPI_INT); │ │ │ │ │ - 78 ComposeMPITraits(unsigned int,MPI_UNSIGNED); │ │ │ │ │ - 79 ComposeMPITraits(long,MPI_LONG); │ │ │ │ │ - 80 ComposeMPITraits(unsigned long,MPI_UNSIGNED_LONG); │ │ │ │ │ - 81 ComposeMPITraits(float,MPI_FLOAT); │ │ │ │ │ - 82 ComposeMPITraits(double,MPI_DOUBLE); │ │ │ │ │ - 83 ComposeMPITraits(long double,MPI_LONG_DOUBLE); │ │ │ │ │ - 84 ComposeMPITraits(std::complex, MPI_CXX_DOUBLE_COMPLEX); │ │ │ │ │ - 85 ComposeMPITraits(std::complex, MPI_CXX_LONG_DOUBLE_COMPLEX); │ │ │ │ │ - 86 ComposeMPITraits(std::complex, MPI_CXX_FLOAT_COMPLEX); │ │ │ │ │ - 87 │ │ │ │ │ - 88 │ │ │ │ │ - 89#undef ComposeMPITraits │ │ │ │ │ - 90 │ │ │ │ │ - 91 template class FieldVector; │ │ │ │ │ - 92 │ │ │ │ │ - 93 template │ │ │ │ │ - 94 struct MPITraits > │ │ │ │ │ - 95 { │ │ │ │ │ - 96 static MPI_Datatype datatype; │ │ │ │ │ - 97 static MPI_Datatype vectortype; │ │ │ │ │ - 98 │ │ │ │ │ - 99 static inline MPI_Datatype getType() │ │ │ │ │ - 100 { │ │ │ │ │ - 101 if(datatype==MPI_DATATYPE_NULL) { │ │ │ │ │ - 102 MPI_Type_contiguous(n, MPITraits::getType(), &vectortype); │ │ │ │ │ - 103 MPI_Type_commit(&vectortype); │ │ │ │ │ - 104 FieldVector fvector; │ │ │ │ │ - 105 MPI_Aint base; │ │ │ │ │ - 106 MPI_Aint displ; │ │ │ │ │ - 107 MPI_Get_address(&fvector, &base); │ │ │ │ │ - 108 MPI_Get_address(&(fvector[0]), &displ); │ │ │ │ │ - 109 displ -= base; │ │ │ │ │ - 110 int length[1]={1}; │ │ │ │ │ - 111 │ │ │ │ │ - 112 MPI_Type_create_struct(1, length, &displ, &vectortype, &datatype); │ │ │ │ │ - 113 MPI_Type_commit(&datatype); │ │ │ │ │ - 114 } │ │ │ │ │ - 115 return datatype; │ │ │ │ │ - 116 } │ │ │ │ │ - 117 │ │ │ │ │ - 118 }; │ │ │ │ │ - 119 │ │ │ │ │ - 120 template │ │ │ │ │ - 121 MPI_Datatype MPITraits >::datatype = MPI_DATATYPE_NULL; │ │ │ │ │ - 122 template │ │ │ │ │ - 123 MPI_Datatype MPITraits >::vectortype = │ │ │ │ │ -{MPI_DATATYPE_NULL}; │ │ │ │ │ - 124 │ │ │ │ │ - 125 │ │ │ │ │ - 126 template │ │ │ │ │ - 127 class bigunsignedint; │ │ │ │ │ - 128 │ │ │ │ │ - 129 template │ │ │ │ │ - 130 struct MPITraits > │ │ │ │ │ - 131 { │ │ │ │ │ - 132 static MPI_Datatype datatype; │ │ │ │ │ - 133 static MPI_Datatype vectortype; │ │ │ │ │ - 134 │ │ │ │ │ - 135 static inline MPI_Datatype getType() │ │ │ │ │ - 136 { │ │ │ │ │ - 137 if(datatype==MPI_DATATYPE_NULL) { │ │ │ │ │ - 138 MPI_Type_contiguous(bigunsignedint::n, MPITraits:: │ │ │ │ │ -getType(), │ │ │ │ │ - 139 &vectortype); │ │ │ │ │ - 140 //MPI_Type_commit(&vectortype); │ │ │ │ │ - 141 bigunsignedint data; │ │ │ │ │ - 142 MPI_Aint base; │ │ │ │ │ - 143 MPI_Aint displ; │ │ │ │ │ - 144 MPI_Get_address(&data, &base); │ │ │ │ │ - 145 MPI_Get_address(&(data.digit), &displ); │ │ │ │ │ - 146 displ -= base; │ │ │ │ │ - 147 int length[1]={1}; │ │ │ │ │ - 148 MPI_Type_create_struct(1, length, &displ, &vectortype, &datatype); │ │ │ │ │ - 149 MPI_Type_commit(&datatype); │ │ │ │ │ - 150 } │ │ │ │ │ - 151 return datatype; │ │ │ │ │ - 152 } │ │ │ │ │ - 153 }; │ │ │ │ │ - 154} │ │ │ │ │ - 155 │ │ │ │ │ - 156namespace Dune │ │ │ │ │ - 157{ │ │ │ │ │ - 158 template │ │ │ │ │ - 159 MPI_Datatype MPITraits >::datatype = MPI_DATATYPE_NULL; │ │ │ │ │ - 160 template │ │ │ │ │ - 161 MPI_Datatype MPITraits >::vectortype = │ │ │ │ │ -MPI_DATATYPE_NULL; │ │ │ │ │ - 162 │ │ │ │ │ - 163 template │ │ │ │ │ - 164 struct MPITraits > │ │ │ │ │ - 165 { │ │ │ │ │ - 166 public: │ │ │ │ │ - 167 inline static MPI_Datatype getType(); │ │ │ │ │ - 168 private: │ │ │ │ │ - 169 static MPI_Datatype type; │ │ │ │ │ - 170 }; │ │ │ │ │ - 171 template │ │ │ │ │ - 172 MPI_Datatype MPITraits >::getType() │ │ │ │ │ - 173 { │ │ │ │ │ - 174 if(type==MPI_DATATYPE_NULL) { │ │ │ │ │ - 175 int length[2] = {1, 1}; │ │ │ │ │ - 176 MPI_Aint disp[2]; │ │ │ │ │ - 177 MPI_Datatype types[2] = {MPITraits::getType(), │ │ │ │ │ - 178 MPITraits::getType()}; │ │ │ │ │ - 179 │ │ │ │ │ - 180 using Pair = std::pair; │ │ │ │ │ - 181 static_assert(std::is_standard_layout::value, "offsetof() is only │ │ │ │ │ -defined for standard layout types"); │ │ │ │ │ - 182 disp[0] = offsetof(Pair, first); │ │ │ │ │ - 183 disp[1] = offsetof(Pair, second); │ │ │ │ │ - 184 │ │ │ │ │ - 185 MPI_Datatype tmp; │ │ │ │ │ - 186 MPI_Type_create_struct(2, length, disp, types, &tmp); │ │ │ │ │ - 187 │ │ │ │ │ - 188 MPI_Type_create_resized(tmp, 0, sizeof(Pair), &type); │ │ │ │ │ - 189 MPI_Type_commit(&type); │ │ │ │ │ - 190 │ │ │ │ │ - 191 MPI_Type_free(&tmp); │ │ │ │ │ - 192 } │ │ │ │ │ - 193 return type; │ │ │ │ │ - 194 } │ │ │ │ │ - 195 │ │ │ │ │ - 196 template │ │ │ │ │ - 197 MPI_Datatype MPITraits >::type=MPI_DATATYPE_NULL; │ │ │ │ │ - 198 │ │ │ │ │ - 199#endif // !DOXYGEN │ │ │ │ │ - 200 │ │ │ │ │ - 201} // namespace Dune │ │ │ │ │ - 202 │ │ │ │ │ - 203#endif // HAVE_MPI │ │ │ │ │ - 204 │ │ │ │ │ - 207#endif │ │ │ │ │ -std │ │ │ │ │ -STL namespace. │ │ │ │ │ + 63 private: │ │ │ │ │ + 65 state_type& ios; │ │ │ │ │ + 67 state_type::fmtflags oldflags; │ │ │ │ │ + 69 std::streamsize oldprec; │ │ │ │ │ + 71 std::streamsize oldwidth; │ │ │ │ │ + 72 }; │ │ │ │ │ + 73 │ │ │ │ │ + 75} │ │ │ │ │ + 76 │ │ │ │ │ + 77#endif // DUNE_COMMON_IOS_STATE_HH │ │ │ │ │ +Dune::ios_base_all_saver::~ios_base_all_saver │ │ │ │ │ +~ios_base_all_saver() │ │ │ │ │ +Destructor that restores the flags stored by the constructor. │ │ │ │ │ +Definition: ios_state.cc:24 │ │ │ │ │ +Dune::ios_base_all_saver::restore │ │ │ │ │ +void restore() │ │ │ │ │ +Restore flags now. │ │ │ │ │ +Definition: ios_state.cc:29 │ │ │ │ │ +Dune::ios_base_all_saver::state_type │ │ │ │ │ +std::ios_base state_type │ │ │ │ │ +Export type of object we save the state for. │ │ │ │ │ +Definition: ios_state.hh:37 │ │ │ │ │ +Dune::ios_base_all_saver::ios_base_all_saver │ │ │ │ │ +ios_base_all_saver(state_type &ios_) │ │ │ │ │ +Constructor that stores the currently used flags. │ │ │ │ │ +Definition: ios_state.cc:19 │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::MPITraits │ │ │ │ │ -A traits class describing the mapping of types onto MPI_Datatypes. │ │ │ │ │ -Definition: mpitraits.hh:41 │ │ │ │ │ -Dune::MPITraits::getType │ │ │ │ │ -static MPI_Datatype getType() │ │ │ │ │ -Definition: mpitraits.hh:48 │ │ │ │ │ -Dune::MPITraits::is_intrinsic │ │ │ │ │ -static constexpr bool is_intrinsic │ │ │ │ │ -Definition: mpitraits.hh:56 │ │ │ │ │ -Dune::bigunsignedint::n │ │ │ │ │ -static constexpr int n │ │ │ │ │ -Definition: bigunsignedint.hh:78 │ │ │ │ │ -Dune::FieldVector │ │ │ │ │ -vector space out of a tensor product of fields. │ │ │ │ │ -Definition: fvector.hh:95 │ │ │ │ │ +Dune::ios_base_all_saver │ │ │ │ │ +Utility class for storing and resetting stream attributes. │ │ │ │ │ +Definition: ios_state.hh:34 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00032.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: mpiguard.hh File Reference │ │ │ │ +dune-common: typelist.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,52 +58,93 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
mpiguard.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Typedefs | │ │ │ │ +Functions
│ │ │ │ +
typelist.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

Implements a MPIGuard which detects an error on a remote process. │ │ │ │ -More...

│ │ │ │ -
#include "mpihelper.hh"
│ │ │ │ -#include "communication.hh"
│ │ │ │ -#include "mpicommunication.hh"
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ +
#include <type_traits>
│ │ │ │ +#include <tuple>
│ │ │ │ +#include <utility>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::MPIGuardError
 This exception is thrown if the MPIGuard detects an error on a remote process. More...
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 >
 
class  Dune::MPIGuard
 detects a thrown exception and communicates to all other processes More...
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...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

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

│ │ │ │ +Typedefs

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

│ │ │ │ +Functions

template<class... T>
constexpr auto Dune::uniqueTypeList (TypeList< T... > list)
 Remove duplicates from a Dune::TypeList. More...
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Implements a MPIGuard which detects an error on a remote process.

│ │ │ │ -
Author
Christian Engwer
│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,37 +4,72 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -Classes | Namespaces │ │ │ │ │ -mpiguard.hh File Reference │ │ │ │ │ -Common » Parallel_Communication │ │ │ │ │ -Implements a MPIGuard which detects an error on a remote process. More... │ │ │ │ │ -#include "mpihelper.hh" │ │ │ │ │ -#include "communication.hh" │ │ │ │ │ -#include "mpicommunication.hh" │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Typedefs | Functions │ │ │ │ │ +typelist.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::MPIGuardError │ │ │ │ │ -  This exception is thrown if the MPIGuard detects an error on a remote │ │ │ │ │ - process. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::MPIGuard │ │ │ │ │ -  detects a thrown exception and communicates to all other processes │ │ │ │ │ - More... │ │ │ │ │ +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... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ -***** Detailed Description ***** │ │ │ │ │ -Implements a MPIGuard which detects an error on a remote process. │ │ │ │ │ - Author │ │ │ │ │ - Christian Engwer │ │ │ │ │ + Typedefs │ │ │ │ │ +template │ │ │ │ │ +using Dune::TypeList = std::tuple< MetaType< T >... > │ │ │ │ │ +  A simple type list. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +using Dune::TypeListEntry_t = typename TypeListElement< i, T >::type │ │ │ │ │ +  Shortcut for TypeListElement::type;. More... │ │ │ │ │ +  │ │ │ │ │ +template class Target, class TL > │ │ │ │ │ +using Dune::UnpackTypeList_t = typename Impl::UnpackTypeList< Target, TL >:: │ │ │ │ │ + type │ │ │ │ │ +  Unpack Dune::TypeList. More... │ │ │ │ │ +  │ │ │ │ │ +template class Target, class... T> │ │ │ │ │ +using Dune::UniqueTypes_t = typename Impl::UniqueTypesHelper< Target, │ │ │ │ │ + TypeList< T... > >::type │ │ │ │ │ +  Remove duplicates from a list of types. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +using Dune::UniqueTypeList_t = typename Impl::UniqueTypesHelper< TypeList, │ │ │ │ │ + NonUniqueTypeList >::type │ │ │ │ │ +  Remove duplicates from a Dune::TypeList. More... │ │ │ │ │ +  │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +constexpr auto Dune::uniqueTypeList (TypeList< T... > list) │ │ │ │ │ +  Remove duplicates from a Dune::TypeList. More... │ │ │ │ │ +  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00032_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: mpiguard.hh Source File │ │ │ │ +dune-common: typelist.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,196 +58,146 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
mpiguard.hh
│ │ │ │ +
typelist.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 (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
5
│ │ │ │ -
13#ifndef DUNE_COMMON_MPIGUARD_HH
│ │ │ │ -
14#define DUNE_COMMON_MPIGUARD_HH
│ │ │ │ -
15
│ │ │ │ -
16#include "mpihelper.hh"
│ │ │ │ -
17#include "communication.hh"
│ │ │ │ -
18#include "mpicommunication.hh"
│ │ │ │ - │ │ │ │ -
20
│ │ │ │ -
21namespace Dune
│ │ │ │ -
22{
│ │ │ │ -
23
│ │ │ │ -
24#ifndef DOXYGEN
│ │ │ │ -
25
│ │ │ │ -
26 /*
│ │ │ │ -
27 Interface class for the communication needed by MPIGuard
│ │ │ │ -
28 */
│ │ │ │ -
29 struct GuardCommunicator
│ │ │ │ -
30 {
│ │ │ │ -
31 // cleanup
│ │ │ │ -
32 virtual ~GuardCommunicator() {};
│ │ │ │ -
33 // all the communication methods we need
│ │ │ │ -
34 virtual int rank() = 0;
│ │ │ │ -
35 virtual int size() = 0;
│ │ │ │ -
36 virtual int sum(int i) = 0;
│ │ │ │ -
37 // create a new GuardCommunicator pointer
│ │ │ │ -
38 template <class C>
│ │ │ │ -
39 static GuardCommunicator * create(const Communication<C> & c);
│ │ │ │ -
40#if HAVE_MPI
│ │ │ │ -
41 inline
│ │ │ │ -
42 static GuardCommunicator * create(const MPI_Comm & c);
│ │ │ │ -
43#endif
│ │ │ │ -
44 };
│ │ │ │ -
45
│ │ │ │ -
46 namespace {
│ │ │ │ -
47 /*
│ │ │ │ -
48 templated implementation of different communication classes
│ │ │ │ -
49 */
│ │ │ │ -
50 // the default class will always fail, due to the missing implementation of "sum"
│ │ │ │ -
51 template <class Imp>
│ │ │ │ -
52 struct GenericGuardCommunicator
│ │ │ │ -
53 : public GuardCommunicator
│ │ │ │ -
54 {};
│ │ │ │ -
55 // specialization for Communication
│ │ │ │ -
56 template <class T>
│ │ │ │ -
57 struct GenericGuardCommunicator< Communication<T> >
│ │ │ │ -
58 : public GuardCommunicator
│ │ │ │ -
59 {
│ │ │ │ -
60 const Communication<T> comm;
│ │ │ │ -
61 GenericGuardCommunicator(const Communication<T> & c) :
│ │ │ │ -
62 comm(c) {}
│ │ │ │ -
63 int rank() override { return comm.rank(); };
│ │ │ │ -
64 int size() override { return comm.size(); };
│ │ │ │ -
65 int sum(int i) override { return comm.sum(i); }
│ │ │ │ -
66 };
│ │ │ │ -
67
│ │ │ │ -
68#if HAVE_MPI
│ │ │ │ -
69 // specialization for MPI_Comm
│ │ │ │ -
70 template <>
│ │ │ │ -
71 struct GenericGuardCommunicator<MPI_Comm>
│ │ │ │ -
72 : public GenericGuardCommunicator< Communication<MPI_Comm> >
│ │ │ │ -
73 {
│ │ │ │ -
74 GenericGuardCommunicator(const MPI_Comm & c) :
│ │ │ │ -
75 GenericGuardCommunicator< Communication<MPI_Comm> >(
│ │ │ │ -
76 Communication<MPI_Comm>(c)) {}
│ │ │ │ -
77 };
│ │ │ │ -
78#endif
│ │ │ │ -
79 } // anonymous namespace
│ │ │ │ -
80
│ │ │ │ -
81 template<class C>
│ │ │ │ -
82 GuardCommunicator * GuardCommunicator::create(const Communication<C> & comm)
│ │ │ │ -
83 {
│ │ │ │ -
84 return new GenericGuardCommunicator< Communication<C> >(comm);
│ │ │ │ -
85 }
│ │ │ │ -
86
│ │ │ │ -
87#if HAVE_MPI
│ │ │ │ -
88 GuardCommunicator * GuardCommunicator::create(const MPI_Comm & comm)
│ │ │ │ -
89 {
│ │ │ │ -
90 return new GenericGuardCommunicator< Communication<MPI_Comm> >(comm);
│ │ │ │ -
91 }
│ │ │ │ -
92#endif
│ │ │ │ -
93
│ │ │ │ -
94#endif
│ │ │ │ -
95
│ │ │ │ -
99 class MPIGuardError : public ParallelError {};
│ │ │ │ -
100
│ │ │ │ - │ │ │ │ -
134 {
│ │ │ │ -
135 GuardCommunicator * comm_;
│ │ │ │ -
136 bool active_;
│ │ │ │ -
137
│ │ │ │ -
138 // we don't want to copy this class
│ │ │ │ -
139 MPIGuard (const MPIGuard &);
│ │ │ │ +
5#ifndef DUNE_COMMON_TYPELIST_HH
│ │ │ │ +
6#define DUNE_COMMON_TYPELIST_HH
│ │ │ │ +
7
│ │ │ │ +
8#include <type_traits>
│ │ │ │ +
9#include <tuple>
│ │ │ │ +
10#include <utility>
│ │ │ │ +
11
│ │ │ │ +
12namespace Dune {
│ │ │ │ +
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)> {};
│ │ │ │ +
138
│ │ │ │ +
139
│ │ │ │
140
│ │ │ │ -
141 public:
│ │ │ │ -
146 MPIGuard (bool active=true) :
│ │ │ │ -
147 comm_(GuardCommunicator::create(
│ │ │ │ -
148 MPIHelper::getCommunication())),
│ │ │ │ -
149 active_(active)
│ │ │ │ -
150 {}
│ │ │ │ -
151
│ │ │ │ -
157 MPIGuard (MPIHelper & m, bool active=true) :
│ │ │ │ -
158 comm_(GuardCommunicator::create(
│ │ │ │ -
159 m.getCommunication())),
│ │ │ │ -
160 active_(active)
│ │ │ │ -
161 {}
│ │ │ │ -
162
│ │ │ │ -
173 template <class C>
│ │ │ │ -
174 MPIGuard (const C & comm, bool active=true) :
│ │ │ │ -
175 comm_(GuardCommunicator::create(comm)),
│ │ │ │ -
176 active_(active)
│ │ │ │ -
177 {}
│ │ │ │ -
178
│ │ │ │ -
179#if HAVE_MPI
│ │ │ │ -
180 MPIGuard (const MPI_Comm & comm, bool active=true) :
│ │ │ │ -
181 comm_(GuardCommunicator::create(comm)),
│ │ │ │ -
182 active_(active)
│ │ │ │ -
183 {}
│ │ │ │ -
184#endif
│ │ │ │ -
185
│ │ │ │ - │ │ │ │ -
189 {
│ │ │ │ -
190 if (active_)
│ │ │ │ -
191 {
│ │ │ │ -
192 active_ = false;
│ │ │ │ -
193 finalize(false);
│ │ │ │ -
194 }
│ │ │ │ -
195 delete comm_;
│ │ │ │ -
196 }
│ │ │ │ -
197
│ │ │ │ -
202 void reactivate() {
│ │ │ │ -
203 if (active_ == true)
│ │ │ │ -
204 finalize();
│ │ │ │ -
205 active_ = true;
│ │ │ │ -
206 }
│ │ │ │ -
207
│ │ │ │ -
218 void finalize(bool success = true)
│ │ │ │ -
219 {
│ │ │ │ -
220 int result = success ? 0 : 1;
│ │ │ │ -
221 bool was_active = active_;
│ │ │ │ -
222 active_ = false;
│ │ │ │ -
223 result = comm_->sum(result);
│ │ │ │ -
224 if (result>0 && was_active)
│ │ │ │ -
225 {
│ │ │ │ -
226 DUNE_THROW(MPIGuardError, "Terminating process "
│ │ │ │ -
227 << comm_->rank() << " due to "
│ │ │ │ -
228 << result << " remote error(s)");
│ │ │ │ -
229 }
│ │ │ │ -
230 }
│ │ │ │ -
231 };
│ │ │ │ -
232
│ │ │ │ -
233}
│ │ │ │ -
234
│ │ │ │ -
235#endif // DUNE_COMMON_MPIGUARD_HH
│ │ │ │ -
Implements an utility class that provides collective communication methods for sequential programs.
│ │ │ │ -
Helpers for dealing with MPI.
│ │ │ │ -
Implements an utility class that provides MPI's collective communication methods.
│ │ │ │ -
A few common exception classes.
│ │ │ │ -
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
│ │ │ │ +
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
│ │ │ │ -
Default exception if an error in the parallel communication of the program occurred.
Definition: exceptions.hh:287
│ │ │ │ -
This exception is thrown if the MPIGuard detects an error on a remote process.
Definition: mpiguard.hh:99
│ │ │ │ -
detects a thrown exception and communicates to all other processes
Definition: mpiguard.hh:134
│ │ │ │ -
void reactivate()
reactivate the guard.
Definition: mpiguard.hh:202
│ │ │ │ -
void finalize(bool success=true)
stop the guard.
Definition: mpiguard.hh:218
│ │ │ │ -
~MPIGuard()
destroy the guard and check for undetected exceptions
Definition: mpiguard.hh:188
│ │ │ │ -
MPIGuard(const C &comm, bool active=true)
create an MPIGuard operating on an arbitrary communicator.
Definition: mpiguard.hh:174
│ │ │ │ -
MPIGuard(const MPI_Comm &comm, bool active=true)
Definition: mpiguard.hh:180
│ │ │ │ -
MPIGuard(bool active=true)
create an MPIGuard operating on the Communicator of the global Dune::MPIHelper
Definition: mpiguard.hh:146
│ │ │ │ -
MPIGuard(MPIHelper &m, bool active=true)
create an MPIGuard operating on the Communicator of a special Dune::MPIHelper m
Definition: mpiguard.hh:157
│ │ │ │ -
A real mpi helper.
Definition: mpihelper.hh:179
│ │ │ │ +
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
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,230 +4,183 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -mpiguard.hh │ │ │ │ │ +typelist.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 (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ - 5 │ │ │ │ │ - 13#ifndef DUNE_COMMON_MPIGUARD_HH │ │ │ │ │ - 14#define DUNE_COMMON_MPIGUARD_HH │ │ │ │ │ - 15 │ │ │ │ │ - 16#include "mpihelper.hh" │ │ │ │ │ - 17#include "communication.hh" │ │ │ │ │ - 18#include "mpicommunication.hh" │ │ │ │ │ - 19#include │ │ │ │ │ - 20 │ │ │ │ │ - 21namespace Dune │ │ │ │ │ - 22{ │ │ │ │ │ - 23 │ │ │ │ │ - 24#ifndef DOXYGEN │ │ │ │ │ - 25 │ │ │ │ │ - 26 /* │ │ │ │ │ - 27 Interface class for the communication needed by MPIGuard │ │ │ │ │ - 28 */ │ │ │ │ │ - 29 struct GuardCommunicator │ │ │ │ │ - 30 { │ │ │ │ │ - 31 // cleanup │ │ │ │ │ - 32 virtual ~GuardCommunicator() {}; │ │ │ │ │ - 33 // all the communication methods we need │ │ │ │ │ - 34 virtual int rank() = 0; │ │ │ │ │ - 35 virtual int size() = 0; │ │ │ │ │ - 36 virtual int sum(int i) = 0; │ │ │ │ │ - 37 // create a new GuardCommunicator pointer │ │ │ │ │ - 38 template │ │ │ │ │ - 39 static GuardCommunicator * create(const Communication & c); │ │ │ │ │ - 40#if HAVE_MPI │ │ │ │ │ - 41 inline │ │ │ │ │ - 42 static GuardCommunicator * create(const MPI_Comm & c); │ │ │ │ │ - 43#endif │ │ │ │ │ - 44 }; │ │ │ │ │ - 45 │ │ │ │ │ - 46 namespace { │ │ │ │ │ - 47 /* │ │ │ │ │ - 48 templated implementation of different communication classes │ │ │ │ │ - 49 */ │ │ │ │ │ - 50 // the default class will always fail, due to the missing implementation of │ │ │ │ │ -"sum" │ │ │ │ │ - 51 template │ │ │ │ │ - 52 struct GenericGuardCommunicator │ │ │ │ │ - 53 : public GuardCommunicator │ │ │ │ │ - 54 {}; │ │ │ │ │ - 55 // specialization for Communication │ │ │ │ │ - 56 template │ │ │ │ │ - 57 struct GenericGuardCommunicator< Communication > │ │ │ │ │ - 58 : public GuardCommunicator │ │ │ │ │ - 59 { │ │ │ │ │ - 60 const Communication comm; │ │ │ │ │ - 61 GenericGuardCommunicator(const Communication & c) : │ │ │ │ │ - 62 comm(c) {} │ │ │ │ │ - 63 int rank() override { return comm.rank(); }; │ │ │ │ │ - 64 int size() override { return comm.size(); }; │ │ │ │ │ - 65 int sum(int i) override { return comm.sum(i); } │ │ │ │ │ - 66 }; │ │ │ │ │ - 67 │ │ │ │ │ - 68#if HAVE_MPI │ │ │ │ │ - 69 // specialization for MPI_Comm │ │ │ │ │ - 70 template <> │ │ │ │ │ - 71 struct GenericGuardCommunicator │ │ │ │ │ - 72 : public GenericGuardCommunicator< Communication > │ │ │ │ │ - 73 { │ │ │ │ │ - 74 GenericGuardCommunicator(const MPI_Comm & c) : │ │ │ │ │ - 75 GenericGuardCommunicator< Communication >( │ │ │ │ │ - 76 Communication(c)) {} │ │ │ │ │ - 77 }; │ │ │ │ │ - 78#endif │ │ │ │ │ - 79 } // anonymous namespace │ │ │ │ │ - 80 │ │ │ │ │ - 81 template │ │ │ │ │ - 82 GuardCommunicator * GuardCommunicator::create(const Communication & │ │ │ │ │ -comm) │ │ │ │ │ - 83 { │ │ │ │ │ - 84 return new GenericGuardCommunicator< Communication >(comm); │ │ │ │ │ - 85 } │ │ │ │ │ - 86 │ │ │ │ │ - 87#if HAVE_MPI │ │ │ │ │ - 88 GuardCommunicator * GuardCommunicator::create(const MPI_Comm & comm) │ │ │ │ │ - 89 { │ │ │ │ │ - 90 return new GenericGuardCommunicator< Communication >(comm); │ │ │ │ │ - 91 } │ │ │ │ │ - 92#endif │ │ │ │ │ - 93 │ │ │ │ │ - 94#endif │ │ │ │ │ - 95 │ │ │ │ │ -99 class MPIGuardError : public ParallelError {}; │ │ │ │ │ - 100 │ │ │ │ │ -133 class MPIGuard │ │ │ │ │ - 134 { │ │ │ │ │ - 135 GuardCommunicator * comm_; │ │ │ │ │ - 136 bool active_; │ │ │ │ │ - 137 │ │ │ │ │ - 138 // we don't want to copy this class │ │ │ │ │ - 139 MPIGuard (const MPIGuard &); │ │ │ │ │ + 5#ifndef DUNE_COMMON_TYPELIST_HH │ │ │ │ │ + 6#define DUNE_COMMON_TYPELIST_HH │ │ │ │ │ + 7 │ │ │ │ │ + 8#include │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11 │ │ │ │ │ + 12namespace Dune { │ │ │ │ │ + 13 │ │ │ │ │ + 32 template │ │ │ │ │ +33 struct MetaType { │ │ │ │ │ +35 using type = T; │ │ │ │ │ + 36 }; │ │ │ │ │ + 37 │ │ │ │ │ + 86 template │ │ │ │ │ +87 using TypeList = std::tuple...>; │ │ │ │ │ + 88 │ │ │ │ │ + 89 │ │ │ │ │ + 90 │ │ │ │ │ + 99 template │ │ │ │ │ +100 struct IsTypeList : std::false_type {}; │ │ │ │ │ + 101 │ │ │ │ │ + 107 template │ │ │ │ │ +108 struct IsTypeList > : std::true_type {}; │ │ │ │ │ + 109 │ │ │ │ │ + 110 │ │ │ │ │ + 111 │ │ │ │ │ + 120 template │ │ │ │ │ +121 struct IsEmptyTypeList : std::is_same > {}; │ │ │ │ │ + 122 │ │ │ │ │ + 123 │ │ │ │ │ + 124 │ │ │ │ │ + 125 template │ │ │ │ │ +126 struct TypeListSize {}; │ │ │ │ │ + 127 │ │ │ │ │ + 136 template │ │ │ │ │ +137 struct TypeListSize> : std::integral_constant {}; │ │ │ │ │ + 138 │ │ │ │ │ + 139 │ │ │ │ │ 140 │ │ │ │ │ - 141 public: │ │ │ │ │ -146 MPIGuard (bool active=true) : │ │ │ │ │ - 147 comm_(GuardCommunicator::create( │ │ │ │ │ - 148 MPIHelper::getCommunication())), │ │ │ │ │ - 149 active_(active) │ │ │ │ │ - 150 {} │ │ │ │ │ - 151 │ │ │ │ │ -157 MPIGuard (MPIHelper & m, bool active=true) : │ │ │ │ │ - 158 comm_(GuardCommunicator::create( │ │ │ │ │ - 159 m.getCommunication())), │ │ │ │ │ - 160 active_(active) │ │ │ │ │ - 161 {} │ │ │ │ │ - 162 │ │ │ │ │ - 173 template │ │ │ │ │ -174 MPIGuard (const C & comm, bool active=true) : │ │ │ │ │ - 175 comm_(GuardCommunicator::create(comm)), │ │ │ │ │ - 176 active_(active) │ │ │ │ │ - 177 {} │ │ │ │ │ - 178 │ │ │ │ │ - 179#if HAVE_MPI │ │ │ │ │ -180 MPIGuard (const MPI_Comm & comm, bool active=true) : │ │ │ │ │ - 181 comm_(GuardCommunicator::create(comm)), │ │ │ │ │ - 182 active_(active) │ │ │ │ │ - 183 {} │ │ │ │ │ - 184#endif │ │ │ │ │ - 185 │ │ │ │ │ -188 ~MPIGuard() │ │ │ │ │ - 189 { │ │ │ │ │ - 190 if (active_) │ │ │ │ │ - 191 { │ │ │ │ │ - 192 active_ = false; │ │ │ │ │ - 193 finalize(false); │ │ │ │ │ - 194 } │ │ │ │ │ - 195 delete comm_; │ │ │ │ │ - 196 } │ │ │ │ │ - 197 │ │ │ │ │ -202 void reactivate() { │ │ │ │ │ - 203 if (active_ == true) │ │ │ │ │ - 204 finalize(); │ │ │ │ │ - 205 active_ = true; │ │ │ │ │ - 206 } │ │ │ │ │ - 207 │ │ │ │ │ -218 void finalize(bool success = true) │ │ │ │ │ - 219 { │ │ │ │ │ - 220 int result = success ? 0 : 1; │ │ │ │ │ - 221 bool was_active = active_; │ │ │ │ │ - 222 active_ = false; │ │ │ │ │ - 223 result = comm_->sum(result); │ │ │ │ │ - 224 if (result>0 && was_active) │ │ │ │ │ - 225 { │ │ │ │ │ - 226 DUNE_THROW(MPIGuardError, "Terminating process " │ │ │ │ │ - 227 << comm_->rank() << " due to " │ │ │ │ │ - 228 << result << " remote error(s)"); │ │ │ │ │ - 229 } │ │ │ │ │ - 230 } │ │ │ │ │ - 231 }; │ │ │ │ │ - 232 │ │ │ │ │ - 233} │ │ │ │ │ - 234 │ │ │ │ │ - 235#endif // DUNE_COMMON_MPIGUARD_HH │ │ │ │ │ -communication.hh │ │ │ │ │ -Implements an utility class that provides collective communication methods for │ │ │ │ │ -sequential programs. │ │ │ │ │ -mpihelper.hh │ │ │ │ │ -Helpers for dealing with MPI. │ │ │ │ │ -mpicommunication.hh │ │ │ │ │ -Implements an utility class that provides MPI's collective communication │ │ │ │ │ -methods. │ │ │ │ │ -exceptions.hh │ │ │ │ │ -A few common exception classes. │ │ │ │ │ -DUNE_THROW │ │ │ │ │ -#define DUNE_THROW(E, m) │ │ │ │ │ -Definition: exceptions.hh:218 │ │ │ │ │ + 141 template │ │ │ │ │ +142 struct TypeListElement {}; │ │ │ │ │ + 143 │ │ │ │ │ + 149 template │ │ │ │ │ +150 struct TypeListElement> │ │ │ │ │ + 151 { │ │ │ │ │ +157 using type = typename std::tuple_element>::type; │ │ │ │ │ + 158 │ │ │ │ │ +164 using Type = type; │ │ │ │ │ + 165 }; │ │ │ │ │ + 166 │ │ │ │ │ + 170 template │ │ │ │ │ +171 using TypeListEntry_t = typename TypeListElement::type; │ │ │ │ │ + 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> │ │ │ │ │ +210 using UnpackTypeList_t = typename Impl::UnpackTypeList::type; │ │ │ │ │ + 211 │ │ │ │ │ + 219 template class Target, class... T> │ │ │ │ │ +220 using UniqueTypes_t = typename Impl::UniqueTypesHelper>::type; │ │ │ │ │ + 221 │ │ │ │ │ + 227 template │ │ │ │ │ +228 using UniqueTypeList_t = typename Impl::UniqueTypesHelper::type; │ │ │ │ │ + 229 │ │ │ │ │ + 235 template │ │ │ │ │ +236 constexpr auto uniqueTypeList(TypeList list) │ │ │ │ │ + 237 { │ │ │ │ │ + 238 return typename Impl::UniqueTypesHelper>::type{}; │ │ │ │ │ + 239 } │ │ │ │ │ + 240 │ │ │ │ │ + 241 │ │ │ │ │ + 242 │ │ │ │ │ + 243} // namespace Dune │ │ │ │ │ + 244 │ │ │ │ │ + 245#endif // DUNE_COMMON_TYPELIST_HH │ │ │ │ │ +Dune::TypeList │ │ │ │ │ +std::tuple< MetaType< T >... > TypeList │ │ │ │ │ +A simple type list. │ │ │ │ │ +Definition: typelist.hh:87 │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::ParallelError │ │ │ │ │ -Default exception if an error in the parallel communication of the program │ │ │ │ │ -occurred. │ │ │ │ │ -Definition: exceptions.hh:287 │ │ │ │ │ -Dune::MPIGuardError │ │ │ │ │ -This exception is thrown if the MPIGuard detects an error on a remote process. │ │ │ │ │ -Definition: mpiguard.hh:99 │ │ │ │ │ -Dune::MPIGuard │ │ │ │ │ -detects a thrown exception and communicates to all other processes │ │ │ │ │ -Definition: mpiguard.hh:134 │ │ │ │ │ -Dune::MPIGuard::reactivate │ │ │ │ │ -void reactivate() │ │ │ │ │ -reactivate the guard. │ │ │ │ │ -Definition: mpiguard.hh:202 │ │ │ │ │ -Dune::MPIGuard::finalize │ │ │ │ │ -void finalize(bool success=true) │ │ │ │ │ -stop the guard. │ │ │ │ │ -Definition: mpiguard.hh:218 │ │ │ │ │ -Dune::MPIGuard::~MPIGuard │ │ │ │ │ -~MPIGuard() │ │ │ │ │ -destroy the guard and check for undetected exceptions │ │ │ │ │ -Definition: mpiguard.hh:188 │ │ │ │ │ -Dune::MPIGuard::MPIGuard │ │ │ │ │ -MPIGuard(const C &comm, bool active=true) │ │ │ │ │ -create an MPIGuard operating on an arbitrary communicator. │ │ │ │ │ -Definition: mpiguard.hh:174 │ │ │ │ │ -Dune::MPIGuard::MPIGuard │ │ │ │ │ -MPIGuard(const MPI_Comm &comm, bool active=true) │ │ │ │ │ -Definition: mpiguard.hh:180 │ │ │ │ │ -Dune::MPIGuard::MPIGuard │ │ │ │ │ -MPIGuard(bool active=true) │ │ │ │ │ -create an MPIGuard operating on the Communicator of the global Dune::MPIHelper │ │ │ │ │ -Definition: mpiguard.hh:146 │ │ │ │ │ -Dune::MPIGuard::MPIGuard │ │ │ │ │ -MPIGuard(MPIHelper &m, bool active=true) │ │ │ │ │ -create an MPIGuard operating on the Communicator of a special Dune::MPIHelper m │ │ │ │ │ -Definition: mpiguard.hh:157 │ │ │ │ │ -Dune::MPIHelper │ │ │ │ │ -A real mpi helper. │ │ │ │ │ -Definition: mpihelper.hh:179 │ │ │ │ │ +Dune::UnpackTypeList_t │ │ │ │ │ +typename Impl::UnpackTypeList< Target, TL >::type UnpackTypeList_t │ │ │ │ │ +Unpack Dune::TypeList. │ │ │ │ │ +Definition: typelist.hh:210 │ │ │ │ │ +Dune::uniqueTypeList │ │ │ │ │ +constexpr auto uniqueTypeList(TypeList< T... > list) │ │ │ │ │ +Remove duplicates from a Dune::TypeList. │ │ │ │ │ +Definition: typelist.hh:236 │ │ │ │ │ +Dune::UniqueTypes_t │ │ │ │ │ +typename Impl::UniqueTypesHelper< Target, TypeList< T... > >::type │ │ │ │ │ +UniqueTypes_t │ │ │ │ │ +Remove duplicates from a list of types. │ │ │ │ │ +Definition: typelist.hh:220 │ │ │ │ │ +Dune::UniqueTypeList_t │ │ │ │ │ +typename Impl::UniqueTypesHelper< TypeList, NonUniqueTypeList >::type │ │ │ │ │ +UniqueTypeList_t │ │ │ │ │ +Remove duplicates from a Dune::TypeList. │ │ │ │ │ +Definition: typelist.hh:228 │ │ │ │ │ +Dune::TypeListEntry_t │ │ │ │ │ +typename TypeListElement< i, T >::type TypeListEntry_t │ │ │ │ │ +Shortcut for TypeListElement::type;. │ │ │ │ │ +Definition: typelist.hh:171 │ │ │ │ │ +Dune::MetaType │ │ │ │ │ +A type that refers to another type. │ │ │ │ │ +Definition: typelist.hh:33 │ │ │ │ │ +Dune::MetaType::type │ │ │ │ │ +T type │ │ │ │ │ +The referred-to type. │ │ │ │ │ +Definition: typelist.hh:35 │ │ │ │ │ +Dune::IsTypeList │ │ │ │ │ +Check if given type is a TypeList. │ │ │ │ │ +Definition: typelist.hh:100 │ │ │ │ │ +Dune::IsEmptyTypeList │ │ │ │ │ +Check if given type is an empty TypeList. │ │ │ │ │ +Definition: typelist.hh:121 │ │ │ │ │ +Dune::TypeListSize │ │ │ │ │ +Definition: typelist.hh:126 │ │ │ │ │ +Dune::TypeListElement │ │ │ │ │ +Definition: typelist.hh:142 │ │ │ │ │ +Dune::TypeListElement<_i,_TypeList<_T..._>_>::type │ │ │ │ │ +typename std::tuple_element< i, std::tuple< T... > >::type type │ │ │ │ │ +Export type of i-th element in TypeList. │ │ │ │ │ +Definition: typelist.hh:157 │ │ │ │ │ +Dune::TypeListElement<_i,_TypeList<_T..._>_>::Type │ │ │ │ │ +type Type │ │ │ │ │ +Export type of i-th element in TypeList. │ │ │ │ │ +Definition: typelist.hh:164 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00035.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: indexset.hh File Reference │ │ │ │ +dune-common: promotiontraits.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,124 +58,48 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Enumerations | │ │ │ │ -Functions
│ │ │ │ - │ │ │ │ +Namespaces
│ │ │ │ +
promotiontraits.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

Provides a map between global and local indices. │ │ │ │ +

Compute type of the result of an arithmetic operation involving two different number types. │ │ │ │ More...

│ │ │ │ -
#include <algorithm>
│ │ │ │ -#include <dune/common/arraylist.hh>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -#include <iostream>
│ │ │ │ -#include "localindex.hh"
│ │ │ │ -#include <stdint.h>
│ │ │ │ +
#include <utility>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::IndexPair< TG, TL >
 A pair consisting of a global and local index. More...
struct  Dune::PromotionTraits< T1, T2 >
 Compute type of the result of an arithmetic operation involving two different number types. More...
 
class  Dune::InvalidIndexSetState
 Exception indicating that the index set is not in the expected state. More...
 
class  Dune::ParallelIndexSet< TG, TL, N >
 Manager class for the mapping between local indices and globally unique indices. More...
 
class  Dune::ParallelIndexSet< TG, TL, N >::iterator
 The iterator over the pairs. More...
 
class  Dune::GlobalLookupIndexSet< I >
 Decorates an index set with the possibility to find a global index that is mapped to a specific local. More...
 
struct  Dune::LocalIndexComparator< T >
 
struct  Dune::IndexSetSortFunctor< TG, TL >
struct  Dune::PromotionTraits< T1, T1 >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

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

│ │ │ │ -Enumerations

enum  Dune::ParallelIndexSetState { Dune::GROUND │ │ │ │ -, Dune::RESIZE │ │ │ │ - }
 The states the index set can be in. More...
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<class TG , class TL >
std::ostream & Dune::operator<< (std::ostream &os, const IndexPair< TG, TL > &pair)
 Print an index pair. More...
 
template<class TG , class TL >
bool Dune::operator== (const IndexPair< TG, TL > &, const IndexPair< TG, TL > &)
 
template<class TG , class TL >
bool Dune::operator!= (const IndexPair< TG, TL > &, const IndexPair< TG, TL > &)
 
template<class TG , class TL >
bool Dune::operator< (const IndexPair< TG, TL > &, const IndexPair< TG, TL > &)
 
template<class TG , class TL >
bool Dune::operator> (const IndexPair< TG, TL > &, const IndexPair< TG, TL > &)
 
template<class TG , class TL >
bool Dune::operator<= (const IndexPair< TG, TL > &, const IndexPair< TG, TL > &)
 
template<class TG , class TL >
bool Dune::operator>= (const IndexPair< TG, TL > &, const IndexPair< TG, TL > &)
 
template<class TG , class TL >
bool Dune::operator== (const IndexPair< TG, TL > &, const TG &)
 
template<class TG , class TL >
bool Dune::operator!= (const IndexPair< TG, TL > &, const TG &)
 
template<class TG , class TL >
bool Dune::operator< (const IndexPair< TG, TL > &, const TG &)
 
template<class TG , class TL >
bool Dune::operator> (const IndexPair< TG, TL > &, const TG &)
 
template<class TG , class TL >
bool Dune::operator<= (const IndexPair< TG, TL > &, const TG &)
 
template<class TG , class TL >
bool Dune::operator>= (const IndexPair< TG, TL > &, const TG &)
 
template<class TG , class TL , int N>
std::ostream & Dune::operator<< (std::ostream &os, const ParallelIndexSet< TG, TL, N > &indexSet)
 Print an index set. More...
 
│ │ │ │

Detailed Description

│ │ │ │ -

Provides a map between global and local indices.

│ │ │ │ -
Author
Markus Blatt
│ │ │ │ +

Compute type of the result of an arithmetic operation involving two different number types.

│ │ │ │ +
Author
Matthias Wohlmuth
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,110 +4,32 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -Classes | Namespaces | Enumerations | Functions │ │ │ │ │ -indexset.hh File Reference │ │ │ │ │ -Common » Parallel_Communication » Parallel_Computing_based_on_Indexsets │ │ │ │ │ -Provides a map between global and local indices. More... │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "localindex.hh" │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces │ │ │ │ │ +promotiontraits.hh File Reference │ │ │ │ │ +Compute type of the result of an arithmetic operation involving two different │ │ │ │ │ +number types. More... │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ - class  Dune::IndexPair<_TG,_TL_> │ │ │ │ │ -  A pair consisting of a global and local index. More... │ │ │ │ │ +struct  Dune::PromotionTraits<_T1,_T2_> │ │ │ │ │ +  Compute type of the result of an arithmetic operation involving two │ │ │ │ │ + different number types. More... │ │ │ │ │   │ │ │ │ │ - class  Dune::InvalidIndexSetState │ │ │ │ │ -  Exception indicating that the index set is not in the expected state. │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ - class  Dune::ParallelIndexSet<_TG,_TL,_N_> │ │ │ │ │ -  Manager class for the mapping between local indices and globally │ │ │ │ │ - unique indices. More... │ │ │ │ │ -  │ │ │ │ │ - class  Dune::ParallelIndexSet<_TG,_TL,_N_>::iterator │ │ │ │ │ -  The iterator over the pairs. More... │ │ │ │ │ -  │ │ │ │ │ - class  Dune::GlobalLookupIndexSet<_I_> │ │ │ │ │ -  Decorates an index set with the possibility to find a global index │ │ │ │ │ - that is mapped to a specific local. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::LocalIndexComparator<_T_> │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::IndexSetSortFunctor<_TG,_TL_> │ │ │ │ │ +struct  Dune::PromotionTraits<_T1,_T1_> │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ - Enumerations │ │ │ │ │ -enum  Dune::ParallelIndexSetState { Dune::GROUND , Dune::RESIZE } │ │ │ │ │ -  The states the index set can be in. More... │ │ │ │ │ -  │ │ │ │ │ - Functions │ │ │ │ │ -template │ │ │ │ │ -std::ostream & Dune::operator<< (std::ostream &os, const IndexPair< TG, TL > │ │ │ │ │ - &pair) │ │ │ │ │ -  Print an index pair. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - bool Dune::operator== (const IndexPair< TG, TL > &, const IndexPair< │ │ │ │ │ - TG, TL > &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - bool Dune::operator!= (const IndexPair< TG, TL > &, const IndexPair< │ │ │ │ │ - TG, TL > &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - bool Dune::operator< (const IndexPair< TG, TL > &, const IndexPair< │ │ │ │ │ - TG, TL > &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - bool Dune::operator> (const IndexPair< TG, TL > &, const IndexPair< │ │ │ │ │ - TG, TL > &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - bool Dune::operator<= (const IndexPair< TG, TL > &, const IndexPair< │ │ │ │ │ - TG, TL > &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - bool Dune::operator>= (const IndexPair< TG, TL > &, const IndexPair< │ │ │ │ │ - TG, TL > &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - bool Dune::operator== (const IndexPair< TG, TL > &, const TG &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - bool Dune::operator!= (const IndexPair< TG, TL > &, const TG &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - bool Dune::operator< (const IndexPair< TG, TL > &, const TG &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - bool Dune::operator> (const IndexPair< TG, TL > &, const TG &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - bool Dune::operator<= (const IndexPair< TG, TL > &, const TG &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - bool Dune::operator>= (const IndexPair< TG, TL > &, const TG &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -std::ostream & Dune::operator<< (std::ostream &os, const ParallelIndexSet< TG, │ │ │ │ │ - TL, N > &indexSet) │ │ │ │ │ -  Print an index set. More... │ │ │ │ │ -  │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -Provides a map between global and local indices. │ │ │ │ │ +Compute type of the result of an arithmetic operation involving two different │ │ │ │ │ +number types. │ │ │ │ │ Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ + Matthias Wohlmuth │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00035_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: indexset.hh Source File │ │ │ │ +dune-common: promotiontraits.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,912 +58,51 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
indexset.hh
│ │ │ │ +
promotiontraits.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 (C) 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_INDEXSET_HH
│ │ │ │ -
6#define DUNE_INDEXSET_HH
│ │ │ │ +
5#ifndef DUNE_PROMOTIONTRAITS_HH
│ │ │ │ +
6#define DUNE_PROMOTIONTRAITS_HH
│ │ │ │
7
│ │ │ │ -
8#include <algorithm>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
11#include <iostream>
│ │ │ │ -
12
│ │ │ │ -
13#include "localindex.hh"
│ │ │ │ -
14
│ │ │ │ -
15#include <stdint.h> // for uint32_t
│ │ │ │ -
16
│ │ │ │ -
17namespace Dune
│ │ │ │ -
18{
│ │ │ │ -
28 // forward declarations
│ │ │ │ -
29
│ │ │ │ -
30 template<class TG, class TL>
│ │ │ │ -
31 class IndexPair;
│ │ │ │ -
32
│ │ │ │ -
38 template<class TG, class TL>
│ │ │ │ -
39 std::ostream& operator<<(std::ostream& os, const IndexPair<TG,TL>& pair);
│ │ │ │ +
8#include <utility>
│ │ │ │ +
9
│ │ │ │ +
10namespace Dune {
│ │ │ │ +
25 template <typename T1, typename T2>
│ │ │ │ + │ │ │ │ +
27 {
│ │ │ │ +
28 typedef decltype(std::declval<T1>()+std::declval<T2>()) PromotedType;
│ │ │ │ +
29 };
│ │ │ │ +
30
│ │ │ │ +
31 // Specialization for the case of two equal types
│ │ │ │ +
32 // One should think that the generic template should handle this case as well.
│ │ │ │ +
33 // However, the fvectortest.cc unit test fails without it if ENABLE_GMP is set.
│ │ │ │ +
34 template <typename T1>
│ │ │ │ +
35 struct PromotionTraits<T1,T1> { typedef T1 PromotedType; };
│ │ │ │ +
36
│ │ │ │ +
38} // end namespace
│ │ │ │ +
39
│ │ │ │
40
│ │ │ │ -
41 template<class TG, class TL>
│ │ │ │ -
42 bool operator==(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
│ │ │ │ -
43
│ │ │ │ -
44 template<class TG, class TL>
│ │ │ │ -
45 bool operator!=(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
│ │ │ │ -
46
│ │ │ │ -
47 template<class TG, class TL>
│ │ │ │ -
48 bool operator<(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
│ │ │ │ -
49
│ │ │ │ -
50 template<class TG, class TL>
│ │ │ │ -
51 bool operator>(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
│ │ │ │ -
52
│ │ │ │ -
53 template<class TG, class TL>
│ │ │ │ -
54 bool operator<=(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
│ │ │ │ -
55
│ │ │ │ -
56 template<class TG, class TL>
│ │ │ │ -
57 bool operator >=(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
│ │ │ │ -
58
│ │ │ │ -
59 template<class TG, class TL>
│ │ │ │ -
60 bool operator==(const IndexPair<TG,TL>&, const TG&);
│ │ │ │ -
61
│ │ │ │ -
62 template<class TG, class TL>
│ │ │ │ -
63 bool operator!=(const IndexPair<TG,TL>&, const TG&);
│ │ │ │ -
64
│ │ │ │ -
65 template<class TG, class TL>
│ │ │ │ -
66 bool operator<(const IndexPair<TG,TL>&, const TG&);
│ │ │ │ -
67
│ │ │ │ -
68 template<class TG, class TL>
│ │ │ │ -
69 bool operator>(const IndexPair<TG,TL>&, const TG&);
│ │ │ │ -
70
│ │ │ │ -
71 template<class TG, class TL>
│ │ │ │ -
72 bool operator<=(const IndexPair<TG,TL>&, const TG&);
│ │ │ │ -
73
│ │ │ │ -
74 template<class TG, class TL>
│ │ │ │ -
75 bool operator >=(const IndexPair<TG,TL>&, const TG&);
│ │ │ │ -
76
│ │ │ │ -
77 template<typename T>
│ │ │ │ -
78 struct MPITraits;
│ │ │ │ -
79
│ │ │ │ -
83 template<class TG, class TL>
│ │ │ │ - │ │ │ │ -
85 {
│ │ │ │ -
86 friend std::ostream& operator<<<>(std::ostream&, const IndexPair<TG,TL>&);
│ │ │ │ -
87 friend bool operator==<>(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
│ │ │ │ -
88 friend bool operator!=<>(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
│ │ │ │ -
89 friend bool operator< <>(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
│ │ │ │ -
90 friend bool operator><>(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
│ │ │ │ -
91 friend bool operator<=<>(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
│ │ │ │ -
92 friend bool operator>=<>(const IndexPair<TG,TL>&, const IndexPair<TG,TL>&);
│ │ │ │ -
93 friend bool operator==<>(const IndexPair<TG,TL>&, const TG &);
│ │ │ │ -
94 friend bool operator!=<>(const IndexPair<TG,TL>&, const TG &);
│ │ │ │ -
95 friend bool operator< <>(const IndexPair<TG,TL>&, const TG &);
│ │ │ │ -
96 friend bool operator> <>(const IndexPair<TG,TL>&, const TG &);
│ │ │ │ -
97 friend bool operator<=<>(const IndexPair<TG,TL>&, const TG &);
│ │ │ │ -
98 friend bool operator>=<>(const IndexPair<TG,TL>&, const TG &);
│ │ │ │ -
99 friend struct MPITraits<IndexPair<TG,TL> >;
│ │ │ │ -
100
│ │ │ │ -
101 public:
│ │ │ │ -
107 typedef TG GlobalIndex;
│ │ │ │ -
108
│ │ │ │ -
120 typedef TL LocalIndex;
│ │ │ │ -
121
│ │ │ │ - │ │ │ │ -
129
│ │ │ │ - │ │ │ │ - │ │ │ │ -
141
│ │ │ │ -
147 inline const GlobalIndex& global() const;
│ │ │ │ -
148
│ │ │ │ -
154 inline LocalIndex& local();
│ │ │ │ -
155
│ │ │ │ -
161 inline const LocalIndex& local() const;
│ │ │ │ -
162
│ │ │ │ -
168 inline void setLocal(int index);
│ │ │ │ -
169 private:
│ │ │ │ -
171 GlobalIndex global_;
│ │ │ │ - │ │ │ │ -
174 };
│ │ │ │ -
175
│ │ │ │ - │ │ │ │ -
181 {
│ │ │ │ - │ │ │ │ -
190 RESIZE
│ │ │ │ -
200 };
│ │ │ │ -
201
│ │ │ │ - │ │ │ │ -
206
│ │ │ │ -
207 // Forward declaration
│ │ │ │ -
208 template<class I> class GlobalLookupIndexSet;
│ │ │ │ -
209
│ │ │ │ -
216 template<typename TG, typename TL, int N=100>
│ │ │ │ - │ │ │ │ -
218 {
│ │ │ │ -
219 friend class GlobalLookupIndexSet<ParallelIndexSet<TG,TL,N> >;
│ │ │ │ -
220
│ │ │ │ -
221 public:
│ │ │ │ -
226 typedef TG GlobalIndex;
│ │ │ │ -
227
│ │ │ │ -
239 typedef TL LocalIndex;
│ │ │ │ -
240
│ │ │ │ - │ │ │ │ -
245
│ │ │ │ -
252 constexpr static int arraySize = (N>0) ? N : 1;
│ │ │ │ -
253
│ │ │ │ -
255 class iterator :
│ │ │ │ -
256 public ArrayList<IndexPair,N>::iterator
│ │ │ │ -
257 {
│ │ │ │ -
258 typedef typename ArrayList<IndexPair,N>::iterator
│ │ │ │ - │ │ │ │ - │ │ │ │ -
261 public:
│ │ │ │ -
262 iterator(ParallelIndexSet<TG,TL,N>& indexSet, const Father& father)
│ │ │ │ -
263 : Father(father), indexSet_(&indexSet)
│ │ │ │ -
264 {}
│ │ │ │ -
265
│ │ │ │ -
266 private:
│ │ │ │ -
276 inline void markAsDeleted() const
│ │ │ │ -
277 {
│ │ │ │ -
278#ifndef NDEBUG
│ │ │ │ -
279 if(indexSet_->state_ != RESIZE)
│ │ │ │ -
280 DUNE_THROW(InvalidIndexSetState, "Indices can only be removed "
│ │ │ │ -
281 <<"while in RESIZE state!");
│ │ │ │ -
282#endif
│ │ │ │ -
283 Father::operator*().local().setState(DELETED);
│ │ │ │ -
284 }
│ │ │ │ -
285
│ │ │ │ -
287 ParallelIndexSet<TG,TL,N>* indexSet_;
│ │ │ │ -
288
│ │ │ │ -
289 };
│ │ │ │ -
290
│ │ │ │ -
291
│ │ │ │ -
292
│ │ │ │ -
294 typedef typename
│ │ │ │ - │ │ │ │ - │ │ │ │ -
297
│ │ │ │ - │ │ │ │ -
302
│ │ │ │ - │ │ │ │ -
308 {
│ │ │ │ -
309 return state_;
│ │ │ │ -
310 }
│ │ │ │ -
311
│ │ │ │ - │ │ │ │ -
318
│ │ │ │ -
327 inline void add(const GlobalIndex& global);
│ │ │ │ -
328
│ │ │ │ -
337 inline void add(const GlobalIndex& global, const LocalIndex& local);
│ │ │ │ -
338
│ │ │ │ -
346 inline void markAsDeleted(const iterator& position);
│ │ │ │ -
347
│ │ │ │ -
360 void endResize();
│ │ │ │ -
361
│ │ │ │ -
372 inline IndexPair&
│ │ │ │ -
373 operator[](const GlobalIndex& global);
│ │ │ │ -
374
│ │ │ │ -
384 inline IndexPair&
│ │ │ │ -
385 at(const GlobalIndex& global);
│ │ │ │ -
386
│ │ │ │ -
396 inline bool
│ │ │ │ -
397 exists (const GlobalIndex& global) const;
│ │ │ │ -
398
│ │ │ │ -
409 inline const IndexPair&
│ │ │ │ -
410 operator[](const GlobalIndex& global) const;
│ │ │ │ -
411
│ │ │ │ -
421 inline const IndexPair&
│ │ │ │ -
422 at(const GlobalIndex& global) const;
│ │ │ │ -
423
│ │ │ │ -
428 inline iterator begin();
│ │ │ │ -
429
│ │ │ │ -
434 inline iterator end();
│ │ │ │ -
435
│ │ │ │ -
440 inline const_iterator begin() const;
│ │ │ │ -
441
│ │ │ │ -
446 inline const_iterator end() const;
│ │ │ │ -
447
│ │ │ │ -
457 inline void renumberLocal();
│ │ │ │ -
458
│ │ │ │ -
465 inline int seqNo() const;
│ │ │ │ -
466
│ │ │ │ -
471 inline size_t size() const;
│ │ │ │ -
472
│ │ │ │ -
473 private:
│ │ │ │ -
475 ArrayList<IndexPair,N> localIndices_;
│ │ │ │ -
477 ArrayList<IndexPair,N> newIndices_;
│ │ │ │ - │ │ │ │ -
481 int seqNo_;
│ │ │ │ -
483 bool deletedEntries_;
│ │ │ │ -
488 inline void merge();
│ │ │ │ -
489 };
│ │ │ │ -
490
│ │ │ │ -
491
│ │ │ │ -
497 template<class TG, class TL, int N>
│ │ │ │ -
498 std::ostream& operator<<(std::ostream& os, const ParallelIndexSet<TG,TL,N>& indexSet);
│ │ │ │ -
499
│ │ │ │ -
505 template<class I>
│ │ │ │ - │ │ │ │ -
507 {
│ │ │ │ -
508 public:
│ │ │ │ - │ │ │ │ -
513
│ │ │ │ - │ │ │ │ -
518
│ │ │ │ - │ │ │ │ -
523
│ │ │ │ - │ │ │ │ -
528
│ │ │ │ - │ │ │ │ -
530
│ │ │ │ -
537 GlobalLookupIndexSet(const ParallelIndexSet& indexset, std::size_t size);
│ │ │ │ -
538
│ │ │ │ - │ │ │ │ -
545
│ │ │ │ - │ │ │ │ -
550
│ │ │ │ -
560 inline const IndexPair&
│ │ │ │ -
561 operator[](const GlobalIndex& global) const;
│ │ │ │ -
562
│ │ │ │ -
566 inline const IndexPair*
│ │ │ │ -
567 pair(const std::size_t& local) const;
│ │ │ │ -
568
│ │ │ │ -
573 inline const_iterator begin() const;
│ │ │ │ -
574
│ │ │ │ -
579 inline const_iterator end() const;
│ │ │ │ -
580
│ │ │ │ -
587 inline int seqNo() const;
│ │ │ │ -
588
│ │ │ │ -
593 inline size_t size() const;
│ │ │ │ -
594 private:
│ │ │ │ -
598 const ParallelIndexSet& indexSet_;
│ │ │ │ -
599
│ │ │ │ -
603 std::size_t size_;
│ │ │ │ -
604
│ │ │ │ -
608 std::vector<const IndexPair*> indices_;
│ │ │ │ -
609
│ │ │ │ -
610 };
│ │ │ │ -
611
│ │ │ │ -
612
│ │ │ │ -
613 template<typename T>
│ │ │ │ - │ │ │ │ -
615 {
│ │ │ │ -
616 static bool compare([[maybe_unused]] const T& t1, [[maybe_unused]] const T& t2)
│ │ │ │ -
617 {
│ │ │ │ -
618 return false;
│ │ │ │ -
619 }
│ │ │ │ -
620 };
│ │ │ │ -
621
│ │ │ │ -
622 template<class TG, class TL>
│ │ │ │ - │ │ │ │ -
624 {
│ │ │ │ - │ │ │ │ -
626 {
│ │ │ │ -
627 return i1.global()<i2.global() || (i1.global()==i2.global() &&
│ │ │ │ - │ │ │ │ -
629 i2.local()));
│ │ │ │ -
630 }
│ │ │ │ -
631 };
│ │ │ │ -
632
│ │ │ │ -
633
│ │ │ │ -
634
│ │ │ │ -
635 template<class TG, class TL>
│ │ │ │ -
636 inline std::ostream& operator<<(std::ostream& os, const IndexPair<TG,TL>& pair)
│ │ │ │ -
637 {
│ │ │ │ -
638 os<<"{global="<<pair.global_<<", local="<<pair.local_<<"}";
│ │ │ │ -
639 return os;
│ │ │ │ -
640 }
│ │ │ │ -
641
│ │ │ │ -
642 template<class TG, class TL, int N>
│ │ │ │ -
643 inline std::ostream& operator<<(std::ostream& os, const ParallelIndexSet<TG,TL,N>& indexSet)
│ │ │ │ -
644 {
│ │ │ │ -
645 typedef typename ParallelIndexSet<TG,TL,N>::const_iterator Iterator;
│ │ │ │ -
646 Iterator end = indexSet.end();
│ │ │ │ -
647 os<<"{";
│ │ │ │ -
648 for(Iterator index = indexSet.begin(); index != end; ++index)
│ │ │ │ -
649 os<<*index<<" ";
│ │ │ │ -
650 os<<"}";
│ │ │ │ -
651 return os;
│ │ │ │ -
652
│ │ │ │ -
653 }
│ │ │ │ -
654
│ │ │ │ -
655 template<class TG, class TL>
│ │ │ │ -
656 inline bool operator==(const IndexPair<TG,TL>& a, const IndexPair<TG,TL>& b)
│ │ │ │ -
657 {
│ │ │ │ -
658 return a.global_==b.global_;
│ │ │ │ -
659 }
│ │ │ │ -
660
│ │ │ │ -
661 template<class TG, class TL>
│ │ │ │ -
662 inline bool operator!=(const IndexPair<TG,TL>& a, const IndexPair<TG,TL>& b)
│ │ │ │ -
663 {
│ │ │ │ -
664 return a.global_!=b.global_;
│ │ │ │ -
665 }
│ │ │ │ -
666
│ │ │ │ -
667 template<class TG, class TL>
│ │ │ │ -
668 inline bool operator<(const IndexPair<TG,TL>& a, const IndexPair<TG,TL>& b)
│ │ │ │ -
669 {
│ │ │ │ -
670 return a.global_<b.global_;
│ │ │ │ -
671 }
│ │ │ │ -
672
│ │ │ │ -
673 template<class TG, class TL>
│ │ │ │ -
674 inline bool operator>(const IndexPair<TG,TL>& a, const IndexPair<TG,TL>& b)
│ │ │ │ -
675 {
│ │ │ │ -
676 return a.global_>b.global_;
│ │ │ │ -
677 }
│ │ │ │ -
678
│ │ │ │ -
679 template<class TG, class TL>
│ │ │ │ -
680 inline bool operator<=(const IndexPair<TG,TL>& a, const IndexPair<TG,TL>& b)
│ │ │ │ -
681 {
│ │ │ │ -
682 return a.global_<=b.global_;
│ │ │ │ -
683 }
│ │ │ │ -
684
│ │ │ │ -
685 template<class TG, class TL>
│ │ │ │ -
686 inline bool operator >=(const IndexPair<TG,TL>& a, const IndexPair<TG,TL>& b)
│ │ │ │ -
687 {
│ │ │ │ -
688 return a.global_>=b.global_;
│ │ │ │ -
689 }
│ │ │ │ -
690
│ │ │ │ -
691 template<class TG, class TL>
│ │ │ │ -
692 inline bool operator==(const IndexPair<TG,TL>& a, const TG& b)
│ │ │ │ -
693 {
│ │ │ │ -
694 return a.global_==b;
│ │ │ │ -
695 }
│ │ │ │ -
696
│ │ │ │ -
697 template<class TG, class TL>
│ │ │ │ -
698 inline bool operator!=(const IndexPair<TG,TL>& a, const TG& b)
│ │ │ │ -
699 {
│ │ │ │ -
700 return a.global_!=b;
│ │ │ │ -
701 }
│ │ │ │ -
702
│ │ │ │ -
703 template<class TG, class TL>
│ │ │ │ -
704 inline bool operator<(const IndexPair<TG,TL>& a, const TG& b)
│ │ │ │ -
705 {
│ │ │ │ -
706 return a.global_<b;
│ │ │ │ -
707 }
│ │ │ │ -
708
│ │ │ │ -
709 template<class TG, class TL>
│ │ │ │ -
710 inline bool operator>(const IndexPair<TG,TL>& a, const TG& b)
│ │ │ │ -
711 {
│ │ │ │ -
712 return a.global_>b;
│ │ │ │ -
713 }
│ │ │ │ -
714
│ │ │ │ -
715 template<class TG, class TL>
│ │ │ │ -
716 inline bool operator<=(const IndexPair<TG,TL>& a, const TG& b)
│ │ │ │ -
717 {
│ │ │ │ -
718 return a.global_<=b;
│ │ │ │ -
719 }
│ │ │ │ -
720
│ │ │ │ -
721 template<class TG, class TL>
│ │ │ │ -
722 inline bool operator >=(const IndexPair<TG,TL>& a, const TG& b)
│ │ │ │ -
723 {
│ │ │ │ -
724 return a.global_>=b;
│ │ │ │ -
725 }
│ │ │ │ -
726
│ │ │ │ -
727#ifndef DOXYGEN
│ │ │ │ -
728
│ │ │ │ -
729 template<class TG, class TL>
│ │ │ │ -
730 IndexPair<TG,TL>::IndexPair(const TG& global, const TL& local)
│ │ │ │ -
731 : global_(global), local_(local){}
│ │ │ │ -
732
│ │ │ │ -
733 template<class TG, class TL>
│ │ │ │ -
734 IndexPair<TG,TL>::IndexPair(const TG& global)
│ │ │ │ -
735 : global_(global), local_(){}
│ │ │ │ -
736
│ │ │ │ -
737 template<class TG, class TL>
│ │ │ │ - │ │ │ │ -
739 : global_(), local_(){}
│ │ │ │ -
740
│ │ │ │ -
741 template<class TG, class TL>
│ │ │ │ -
742 inline const TG& IndexPair<TG,TL>::global() const {
│ │ │ │ -
743 return global_;
│ │ │ │ -
744 }
│ │ │ │ -
745
│ │ │ │ -
746 template<class TG, class TL>
│ │ │ │ -
747 inline TL& IndexPair<TG,TL>::local() {
│ │ │ │ -
748 return local_;
│ │ │ │ -
749 }
│ │ │ │ -
750
│ │ │ │ -
751 template<class TG, class TL>
│ │ │ │ -
752 inline const TL& IndexPair<TG,TL>::local() const {
│ │ │ │ -
753 return local_;
│ │ │ │ -
754 }
│ │ │ │ -
755
│ │ │ │ -
756 template<class TG, class TL>
│ │ │ │ -
757 inline void IndexPair<TG,TL>::setLocal(int local){
│ │ │ │ -
758 local_=local;
│ │ │ │ -
759 }
│ │ │ │ -
760
│ │ │ │ -
761 template<class TG, class TL, int N>
│ │ │ │ - │ │ │ │ -
763 : state_(GROUND), seqNo_(0), deletedEntries_()
│ │ │ │ -
764 {}
│ │ │ │ -
765
│ │ │ │ -
766 template<class TG, class TL, int N>
│ │ │ │ - │ │ │ │ -
768 {
│ │ │ │ -
769
│ │ │ │ -
770 // Checks in unproductive code
│ │ │ │ -
771#ifndef NDEBUG
│ │ │ │ -
772 if(state_!=GROUND)
│ │ │ │ -
773 DUNE_THROW(InvalidIndexSetState,
│ │ │ │ -
774 "IndexSet has to be in GROUND state, when "
│ │ │ │ -
775 << "beginResize() is called!");
│ │ │ │ -
776#endif
│ │ │ │ -
777
│ │ │ │ -
778 state_ = RESIZE;
│ │ │ │ -
779 deletedEntries_ = false;
│ │ │ │ -
780 }
│ │ │ │ -
781
│ │ │ │ -
782 template<class TG, class TL, int N>
│ │ │ │ -
783 inline void ParallelIndexSet<TG,TL,N>::add(const GlobalIndex& global)
│ │ │ │ -
784 {
│ │ │ │ -
785 // Checks in unproductive code
│ │ │ │ -
786#ifndef NDEBUG
│ │ │ │ -
787 if(state_ != RESIZE)
│ │ │ │ -
788 DUNE_THROW(InvalidIndexSetState, "Indices can only be added "
│ │ │ │ -
789 <<"while in RESIZE state!");
│ │ │ │ -
790#endif
│ │ │ │ -
791 newIndices_.push_back(IndexPair(global));
│ │ │ │ -
792 }
│ │ │ │ -
793
│ │ │ │ -
794 template<class TG, class TL, int N>
│ │ │ │ -
795 inline void ParallelIndexSet<TG,TL,N>::add(const TG& global, const TL& local)
│ │ │ │ -
796 {
│ │ │ │ -
797 // Checks in unproductive code
│ │ │ │ -
798#ifndef NDEBUG
│ │ │ │ -
799 if(state_ != RESIZE)
│ │ │ │ -
800 DUNE_THROW(InvalidIndexSetState, "Indices can only be added "
│ │ │ │ -
801 <<"while in RESIZE state!");
│ │ │ │ -
802#endif
│ │ │ │ -
803 newIndices_.push_back(IndexPair(global,local));
│ │ │ │ -
804 }
│ │ │ │ -
805
│ │ │ │ -
806 template<class TG, class TL, int N>
│ │ │ │ -
807 inline void ParallelIndexSet<TG,TL,N>::markAsDeleted(const iterator& global)
│ │ │ │ -
808 {
│ │ │ │ -
809 // Checks in unproductive code
│ │ │ │ -
810#ifndef NDEBUG
│ │ │ │ -
811 if(state_ != RESIZE)
│ │ │ │ -
812 DUNE_THROW(InvalidIndexSetState, "Indices can only be removed "
│ │ │ │ -
813 <<"while in RESIZE state!");
│ │ │ │ -
814#endif
│ │ │ │ -
815 deletedEntries_ = true;
│ │ │ │ -
816
│ │ │ │ -
817 global.markAsDeleted();
│ │ │ │ -
818 }
│ │ │ │ -
819
│ │ │ │ -
820 template<class TG, class TL, int N>
│ │ │ │ - │ │ │ │ -
822 // Checks in unproductive code
│ │ │ │ -
823#ifndef NDEBUG
│ │ │ │ -
824 if(state_ != RESIZE)
│ │ │ │ -
825 DUNE_THROW(InvalidIndexSetState, "endResize called while not "
│ │ │ │ -
826 <<"in RESIZE state!");
│ │ │ │ -
827#endif
│ │ │ │ -
828
│ │ │ │ -
829 std::sort(newIndices_.begin(), newIndices_.end(), IndexSetSortFunctor<TG,TL>());
│ │ │ │ -
830 merge();
│ │ │ │ -
831 seqNo_++;
│ │ │ │ -
832 state_ = GROUND;
│ │ │ │ -
833 }
│ │ │ │ -
834
│ │ │ │ -
835
│ │ │ │ -
836 template<class TG, class TL, int N>
│ │ │ │ -
837 inline void ParallelIndexSet<TG,TL,N>::merge(){
│ │ │ │ -
838 if(localIndices_.size()==0)
│ │ │ │ -
839 {
│ │ │ │ -
840 localIndices_=newIndices_;
│ │ │ │ -
841 newIndices_.clear();
│ │ │ │ -
842 }
│ │ │ │ -
843 else if(newIndices_.size()>0 || deletedEntries_)
│ │ │ │ -
844 {
│ │ │ │ -
845 ArrayList<IndexPair,N> tempPairs;
│ │ │ │ -
846
│ │ │ │ -
847 auto old = localIndices_.begin();
│ │ │ │ -
848 auto added = newIndices_.begin();
│ │ │ │ -
849 const auto endold = localIndices_.end();
│ │ │ │ -
850 const auto endadded = newIndices_.end();
│ │ │ │ -
851
│ │ │ │ -
852 while(old != endold && added!= endadded)
│ │ │ │ -
853 {
│ │ │ │ -
854 if(old->local().state()==DELETED) {
│ │ │ │ -
855 old.eraseToHere();
│ │ │ │ -
856 }
│ │ │ │ -
857 else
│ │ │ │ -
858 {
│ │ │ │ -
859 if(old->global() < added->global() ||
│ │ │ │ -
860 (old->global() == added->global()
│ │ │ │ -
861 && LocalIndexComparator<TL>::compare(old->local(),added->local())))
│ │ │ │ -
862 {
│ │ │ │ -
863 tempPairs.push_back(*old);
│ │ │ │ -
864 old.eraseToHere();
│ │ │ │ -
865 continue;
│ │ │ │ -
866 }else
│ │ │ │ -
867 {
│ │ │ │ -
868 tempPairs.push_back(*added);
│ │ │ │ -
869 added.eraseToHere();
│ │ │ │ -
870 }
│ │ │ │ -
871 }
│ │ │ │ -
872 }
│ │ │ │ -
873
│ │ │ │ -
874 while(old != endold)
│ │ │ │ -
875 {
│ │ │ │ -
876 if(old->local().state()!=DELETED) {
│ │ │ │ -
877 tempPairs.push_back(*old);
│ │ │ │ -
878 }
│ │ │ │ -
879 old.eraseToHere();
│ │ │ │ -
880 }
│ │ │ │ -
881
│ │ │ │ -
882 while(added!= endadded)
│ │ │ │ -
883 {
│ │ │ │ -
884 tempPairs.push_back(*added);
│ │ │ │ -
885 added.eraseToHere();
│ │ │ │ -
886 }
│ │ │ │ -
887 localIndices_ = tempPairs;
│ │ │ │ -
888 }
│ │ │ │ -
889 }
│ │ │ │ -
890
│ │ │ │ -
891
│ │ │ │ -
892 template<class TG, class TL, int N>
│ │ │ │ -
893 inline const IndexPair<TG,TL>&
│ │ │ │ -
894 ParallelIndexSet<TG,TL,N>::at(const TG& global) const
│ │ │ │ -
895 {
│ │ │ │ -
896 // perform a binary search
│ │ │ │ -
897 int low=0, high=localIndices_.size()-1, probe=-1;
│ │ │ │ -
898
│ │ │ │ -
899 while(low<high)
│ │ │ │ -
900 {
│ │ │ │ -
901 probe = (high + low) / 2;
│ │ │ │ -
902 if(global <= localIndices_[probe].global())
│ │ │ │ -
903 high = probe;
│ │ │ │ -
904 else
│ │ │ │ -
905 low = probe+1;
│ │ │ │ -
906 }
│ │ │ │ -
907
│ │ │ │ -
908 if(probe==-1)
│ │ │ │ -
909 DUNE_THROW(RangeError, "No entries!");
│ │ │ │ -
910
│ │ │ │ -
911 if( localIndices_[low].global() != global)
│ │ │ │ -
912 DUNE_THROW(RangeError, "Could not find entry of "<<global);
│ │ │ │ -
913 else
│ │ │ │ -
914 return localIndices_[low];
│ │ │ │ -
915 }
│ │ │ │ -
916
│ │ │ │ -
917 template<class TG, class TL, int N>
│ │ │ │ -
918 inline const IndexPair<TG,TL>&
│ │ │ │ -
919 ParallelIndexSet<TG,TL,N>::operator[](const TG& global) const
│ │ │ │ -
920 {
│ │ │ │ -
921 // perform a binary search
│ │ │ │ -
922 int low=0, high=localIndices_.size()-1, probe=-1;
│ │ │ │ -
923
│ │ │ │ -
924 while(low<high)
│ │ │ │ -
925 {
│ │ │ │ -
926 probe = (high + low) / 2;
│ │ │ │ -
927 if(global <= localIndices_[probe].global())
│ │ │ │ -
928 high = probe;
│ │ │ │ -
929 else
│ │ │ │ -
930 low = probe+1;
│ │ │ │ -
931 }
│ │ │ │ -
932
│ │ │ │ -
933 return localIndices_[low];
│ │ │ │ -
934 }
│ │ │ │ -
935 template<class TG, class TL, int N>
│ │ │ │ -
936 inline IndexPair<TG,TL>& ParallelIndexSet<TG,TL,N>::at(const TG& global)
│ │ │ │ -
937 {
│ │ │ │ -
938 // perform a binary search
│ │ │ │ -
939 int low=0, high=localIndices_.size()-1, probe=-1;
│ │ │ │ -
940
│ │ │ │ -
941 while(low<high)
│ │ │ │ -
942 {
│ │ │ │ -
943 probe = (high + low) / 2;
│ │ │ │ -
944 if(localIndices_[probe].global() >= global)
│ │ │ │ -
945 high = probe;
│ │ │ │ -
946 else
│ │ │ │ -
947 low = probe+1;
│ │ │ │ -
948 }
│ │ │ │ -
949
│ │ │ │ -
950 if(probe==-1)
│ │ │ │ -
951 DUNE_THROW(RangeError, "No entries!");
│ │ │ │ -
952
│ │ │ │ -
953 if( localIndices_[low].global() != global)
│ │ │ │ -
954 DUNE_THROW(RangeError, "Could not find entry of "<<global);
│ │ │ │ -
955 else
│ │ │ │ -
956 return localIndices_[low];
│ │ │ │ -
957 }
│ │ │ │ -
958
│ │ │ │ -
959 template<class TG, class TL, int N>
│ │ │ │ -
960 inline bool ParallelIndexSet<TG,TL,N>::exists (const TG& global) const
│ │ │ │ -
961 {
│ │ │ │ -
962 // perform a binary search
│ │ │ │ -
963 int low=0, high=localIndices_.size()-1, probe=-1;
│ │ │ │ -
964
│ │ │ │ -
965 while(low<high)
│ │ │ │ -
966 {
│ │ │ │ -
967 probe = (high + low) / 2;
│ │ │ │ -
968 if(localIndices_[probe].global() >= global)
│ │ │ │ -
969 high = probe;
│ │ │ │ -
970 else
│ │ │ │ -
971 low = probe+1;
│ │ │ │ -
972 }
│ │ │ │ -
973
│ │ │ │ -
974 if(probe==-1)
│ │ │ │ -
975 return false;
│ │ │ │ -
976
│ │ │ │ -
977 if( localIndices_[low].global() != global)
│ │ │ │ -
978 return false;
│ │ │ │ -
979 return true;
│ │ │ │ -
980 }
│ │ │ │ -
981
│ │ │ │ -
982 template<class TG, class TL, int N>
│ │ │ │ -
983 inline IndexPair<TG,TL>& ParallelIndexSet<TG,TL,N>::operator[](const TG& global)
│ │ │ │ -
984 {
│ │ │ │ -
985 // perform a binary search
│ │ │ │ -
986 int low=0, high=localIndices_.size()-1, probe=-1;
│ │ │ │ -
987
│ │ │ │ -
988 while(low<high)
│ │ │ │ -
989 {
│ │ │ │ -
990 probe = (high + low) / 2;
│ │ │ │ -
991 if(localIndices_[probe].global() >= global)
│ │ │ │ -
992 high = probe;
│ │ │ │ -
993 else
│ │ │ │ -
994 low = probe+1;
│ │ │ │ -
995 }
│ │ │ │ -
996
│ │ │ │ -
997 return localIndices_[low];
│ │ │ │ -
998 }
│ │ │ │ -
999 template<class TG, class TL, int N>
│ │ │ │ -
1000 inline typename ParallelIndexSet<TG,TL,N>::iterator
│ │ │ │ - │ │ │ │ -
1002 {
│ │ │ │ -
1003 return iterator(*this, localIndices_.begin());
│ │ │ │ -
1004 }
│ │ │ │ -
1005
│ │ │ │ -
1006
│ │ │ │ -
1007 template<class TG, class TL, int N>
│ │ │ │ -
1008 inline typename ParallelIndexSet<TG,TL,N>::iterator
│ │ │ │ - │ │ │ │ -
1010 {
│ │ │ │ -
1011 return iterator(*this,localIndices_.end());
│ │ │ │ -
1012 }
│ │ │ │ -
1013
│ │ │ │ -
1014 template<class TG, class TL, int N>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
1017 {
│ │ │ │ -
1018 return localIndices_.begin();
│ │ │ │ -
1019 }
│ │ │ │ -
1020
│ │ │ │ -
1021
│ │ │ │ -
1022 template<class TG, class TL, int N>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
1025 {
│ │ │ │ -
1026 return localIndices_.end();
│ │ │ │ -
1027 }
│ │ │ │ -
1028
│ │ │ │ -
1029 template<class TG, class TL, int N>
│ │ │ │ - │ │ │ │ -
1031#ifndef NDEBUG
│ │ │ │ -
1032 if(state_==RESIZE)
│ │ │ │ -
1033 DUNE_THROW(InvalidIndexSetState, "IndexSet has to be in "
│ │ │ │ -
1034 <<"GROUND state for renumberLocal()");
│ │ │ │ -
1035#endif
│ │ │ │ -
1036
│ │ │ │ -
1037 const auto end_ = end();
│ │ │ │ -
1038 uint32_t index=0;
│ │ │ │ -
1039
│ │ │ │ -
1040 for(auto pair=begin(); pair!=end_; index++, ++pair)
│ │ │ │ -
1041 pair->local()=index;
│ │ │ │ -
1042 }
│ │ │ │ -
1043
│ │ │ │ -
1044 template<class TG, class TL, int N>
│ │ │ │ -
1045 inline int ParallelIndexSet<TG,TL,N>::seqNo() const
│ │ │ │ -
1046 {
│ │ │ │ -
1047 return seqNo_;
│ │ │ │ -
1048 }
│ │ │ │ -
1049
│ │ │ │ -
1050 template<class TG, class TL, int N>
│ │ │ │ -
1051 inline size_t ParallelIndexSet<TG,TL,N>::size() const
│ │ │ │ -
1052 {
│ │ │ │ -
1053 return localIndices_.size();
│ │ │ │ -
1054 }
│ │ │ │ -
1055
│ │ │ │ -
1056 template<class I>
│ │ │ │ -
1057 GlobalLookupIndexSet<I>::GlobalLookupIndexSet(const I& indexset,
│ │ │ │ -
1058 std::size_t size)
│ │ │ │ -
1059 : indexSet_(indexset), size_(size),
│ │ │ │ -
1060 indices_(size_, static_cast<const IndexPair*>(0))
│ │ │ │ -
1061 {
│ │ │ │ -
1062 const_iterator end_ = indexSet_.end();
│ │ │ │ -
1063
│ │ │ │ -
1064 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair) {
│ │ │ │ -
1065 assert(pair->local()<size_);
│ │ │ │ -
1066 indices_[pair->local()] = &(*pair);
│ │ │ │ -
1067 }
│ │ │ │ -
1068 }
│ │ │ │ -
1069
│ │ │ │ -
1070 template<class I>
│ │ │ │ - │ │ │ │ -
1072 : indexSet_(indexset), size_(0)
│ │ │ │ -
1073 {
│ │ │ │ -
1074 const_iterator end_ = indexSet_.end();
│ │ │ │ -
1075 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair)
│ │ │ │ -
1076 size_=std::max(size_,static_cast<std::size_t>(pair->local()));
│ │ │ │ -
1077
│ │ │ │ -
1078 indices_.resize(++size_, 0);
│ │ │ │ -
1079
│ │ │ │ -
1080 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair)
│ │ │ │ -
1081 indices_[pair->local()] = &(*pair);
│ │ │ │ -
1082 }
│ │ │ │ -
1083
│ │ │ │ -
1084 template<class I>
│ │ │ │ - │ │ │ │ -
1086 {}
│ │ │ │ -
1087
│ │ │ │ -
1088 template<class I>
│ │ │ │ -
1089 inline const IndexPair<typename I::GlobalIndex, typename I::LocalIndex>*
│ │ │ │ -
1090 GlobalLookupIndexSet<I>::pair(const std::size_t& local) const
│ │ │ │ -
1091 {
│ │ │ │ -
1092 return indices_[local];
│ │ │ │ -
1093 }
│ │ │ │ -
1094
│ │ │ │ -
1095 template<class I>
│ │ │ │ -
1096 inline const IndexPair<typename I::GlobalIndex, typename I::LocalIndex>&
│ │ │ │ -
1097 GlobalLookupIndexSet<I>::operator[](const GlobalIndex& global) const
│ │ │ │ -
1098 {
│ │ │ │ -
1099 return indexSet_[global];
│ │ │ │ -
1100 }
│ │ │ │ -
1101
│ │ │ │ -
1102 template<class I>
│ │ │ │ -
1103 typename I::const_iterator GlobalLookupIndexSet<I>::begin() const
│ │ │ │ -
1104 {
│ │ │ │ -
1105 return indexSet_.begin();
│ │ │ │ -
1106 }
│ │ │ │ -
1107
│ │ │ │ -
1108 template<class I>
│ │ │ │ -
1109 typename I::const_iterator GlobalLookupIndexSet<I>::end() const
│ │ │ │ -
1110 {
│ │ │ │ -
1111 return indexSet_.end();
│ │ │ │ -
1112 }
│ │ │ │ -
1113
│ │ │ │ -
1114 template<class I>
│ │ │ │ -
1115 inline size_t GlobalLookupIndexSet<I>::size() const
│ │ │ │ -
1116 {
│ │ │ │ -
1117 return size_;
│ │ │ │ -
1118 }
│ │ │ │ -
1119
│ │ │ │ -
1120 template<class I>
│ │ │ │ -
1121 inline int GlobalLookupIndexSet<I>::seqNo() const
│ │ │ │ -
1122 {
│ │ │ │ -
1123 return indexSet_.seqNo();
│ │ │ │ -
1124 }
│ │ │ │ -
1125
│ │ │ │ -
1126 template<typename TG, typename TL, int N, typename TG1, typename TL1, int N1>
│ │ │ │ -
1127 bool operator==(const ParallelIndexSet<TG,TL,N>& idxset,
│ │ │ │ -
1128 const ParallelIndexSet<TG1,TL1,N1>& idxset1)
│ │ │ │ -
1129 {
│ │ │ │ -
1130 if(idxset.size()!=idxset1.size())
│ │ │ │ -
1131 return false;
│ │ │ │ -
1132 typedef typename ParallelIndexSet<TG,TL,N>::const_iterator Iter;
│ │ │ │ -
1133 typedef typename ParallelIndexSet<TG1,TL1,N1>::const_iterator Iter1;
│ │ │ │ -
1134 Iter iter=idxset.begin();
│ │ │ │ -
1135 for(Iter1 iter1=idxset1.begin(); iter1 != idxset1.end(); ++iter, ++iter1) {
│ │ │ │ -
1136 if(iter1->global()!=iter->global())
│ │ │ │ -
1137 return false;
│ │ │ │ -
1138 typedef typename ParallelIndexSet<TG,TL,N>::LocalIndex PI;
│ │ │ │ -
1139 const PI& pi=iter->local(), pi1=iter1->local();
│ │ │ │ -
1140
│ │ │ │ -
1141 if(pi!=pi1)
│ │ │ │ -
1142 return false;
│ │ │ │ -
1143 }
│ │ │ │ -
1144 return true;
│ │ │ │ -
1145 }
│ │ │ │ -
1146
│ │ │ │ -
1147 template<typename TG, typename TL, int N, typename TG1, typename TL1, int N1>
│ │ │ │ -
1148 bool operator!=(const ParallelIndexSet<TG,TL,N>& idxset,
│ │ │ │ -
1149 const ParallelIndexSet<TG1,TL1,N1>& idxset1)
│ │ │ │ -
1150 {
│ │ │ │ -
1151 return !(idxset==idxset1);
│ │ │ │ -
1152 }
│ │ │ │ -
1153
│ │ │ │ -
1154
│ │ │ │ -
1155#endif // DOXYGEN
│ │ │ │ -
1156
│ │ │ │ -
1157}
│ │ │ │ -
1158#endif
│ │ │ │ -
Provides classes for use as the local index in ParallelIndexSet.
│ │ │ │ -
A few common exception classes.
│ │ │ │ -
Implements a random-access container that can efficiently change size (similar to std::deque)
│ │ │ │ -
std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
Definition: bigunsignedint.hh:278
│ │ │ │ -
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
│ │ │ │ -
EnableIfInterOperable< T1, T2, bool >::type operator<(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition: iteratorfacades.hh:637
│ │ │ │ -
EnableIfInterOperable< T1, T2, bool >::type operator>(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition: iteratorfacades.hh:683
│ │ │ │ -
EnableIfInterOperable< T1, T2, bool >::type operator<=(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition: iteratorfacades.hh:660
│ │ │ │ -
EnableIfInterOperable< T1, T2, bool >::type operator==(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for equality.
Definition: iteratorfacades.hh:237
│ │ │ │ -
EnableIfInterOperable< T1, T2, bool >::type operator>=(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition: iteratorfacades.hh:705
│ │ │ │ -
EnableIfInterOperable< T1, T2, bool >::type operator!=(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for inequality.
Definition: iteratorfacades.hh:259
│ │ │ │ -
IndexPair & operator[](const GlobalIndex &global)
Find the index pair with a specific global id.
│ │ │ │ -
static constexpr int arraySize
The size of the individual arrays in the underlying ArrayList.
Definition: indexset.hh:252
│ │ │ │ -
void beginResize()
Indicate that the index set is to be resized.
│ │ │ │ -
ParallelIndexSetState
The states the index set can be in.
Definition: indexset.hh:181
│ │ │ │ -
void renumberLocal()
Renumbers the local index numbers.
│ │ │ │ -
bool exists(const GlobalIndex &global) const
Find the index pair with a specific global id.
│ │ │ │ -
size_t size() const
Get the total number (public and nonpublic) indices.
│ │ │ │ -
ArrayList< IndexPair, N >::const_iterator const_iterator
The constant iterator over the pairs.
Definition: indexset.hh:296
│ │ │ │ -
bool operator()(const IndexPair< TG, TL > &i1, const IndexPair< TG, TL > &i2)
Definition: indexset.hh:625
│ │ │ │ -
void add(const GlobalIndex &global)
Add an new index to the set.
│ │ │ │ -
const_iterator end() const
Get an iterator over the indices positioned after the last index.
│ │ │ │ -
const LocalIndex & local() const
Get the local index.
│ │ │ │ -
const IndexPair & at(const GlobalIndex &global) const
Find the index pair with a specific global id.
│ │ │ │ -
GlobalLookupIndexSet(const ParallelIndexSet &indexset)
Constructor.
│ │ │ │ -
TL LocalIndex
the type of the local index.
Definition: indexset.hh:120
│ │ │ │ -
int seqNo() const
Get the internal sequence number.
│ │ │ │ -
static bool compare(const T &t1, const T &t2)
Definition: indexset.hh:616
│ │ │ │ -
iterator begin()
Get an iterator over the indices positioned at the first index.
│ │ │ │ -
Dune::IndexPair< typename I::GlobalIndex, typename I::LocalIndex > IndexPair
Definition: indexset.hh:529
│ │ │ │ -
iterator end()
Get an iterator over the indices positioned after the last index.
│ │ │ │ -
ParallelIndexSet::const_iterator const_iterator
The iterator over the index pairs.
Definition: indexset.hh:527
│ │ │ │ -
const_iterator begin() const
Get an iterator over the indices positioned at the first index.
│ │ │ │ -
const IndexPair & operator[](const GlobalIndex &global) const
Find the index pair with a specific global id.
│ │ │ │ -
const ParallelIndexSetState & state()
Get the state the index set is in.
Definition: indexset.hh:307
│ │ │ │ -
const_iterator begin() const
Get an iterator over the indices positioned at the first index.
│ │ │ │ -
const IndexPair & operator[](const GlobalIndex &global) const
Find the index pair with a specific global id.
│ │ │ │ -
IndexPair()
Construct a new Pair.
│ │ │ │ -
I ParallelIndexSet
The type of the index set.
Definition: indexset.hh:512
│ │ │ │ -
TL LocalIndex
The type of the local index, e.g. ParallelLocalIndex.
Definition: indexset.hh:239
│ │ │ │ -
void markAsDeleted(const iterator &position)
Mark an index as deleted.
│ │ │ │ -
ParallelIndexSet::LocalIndex LocalIndex
The type of the local index.
Definition: indexset.hh:517
│ │ │ │ -
IndexPair(const GlobalIndex &global, const LocalIndex &local)
Constructs a new Pair.
│ │ │ │ -
void setLocal(int index)
Set the local index.
│ │ │ │ -
const GlobalIndex & global() const
Get the global index.
│ │ │ │ -
void add(const GlobalIndex &global, const LocalIndex &local)
Add an new index to the set.
│ │ │ │ -
const_iterator end() const
Get an iterator over the indices positioned after the last index.
│ │ │ │ -
IndexPair & at(const GlobalIndex &global)
Find the index pair with a specific global id.
│ │ │ │ -
ParallelIndexSet()
Constructor.
│ │ │ │ -
void endResize()
Indicate that the resizing finishes.
│ │ │ │ -
~GlobalLookupIndexSet()
Destructor.
│ │ │ │ -
const IndexPair * pair(const std::size_t &local) const
Get the index pair corresponding to a local index.
│ │ │ │ -
LocalIndex & local()
Get the local index.
│ │ │ │ -
size_t size() const
Get the total number (public and nonpublic) indices.
│ │ │ │ -
IndexPair(const GlobalIndex &global)
Constructs a new Pair.
│ │ │ │ -
TG GlobalIndex
the type of the global index. This type has to provide at least a operator< for sorting.
Definition: indexset.hh:226
│ │ │ │ -
TG GlobalIndex
the type of the global index.
Definition: indexset.hh:107
│ │ │ │ -
int seqNo() const
Get the internal sequence number.
│ │ │ │ -
iterator(ParallelIndexSet< TG, TL, N > &indexSet, const Father &father)
Definition: indexset.hh:262
│ │ │ │ -
GlobalLookupIndexSet(const ParallelIndexSet &indexset, std::size_t size)
Constructor.
│ │ │ │ -
ParallelIndexSet::GlobalIndex GlobalIndex
The type of the global index.
Definition: indexset.hh:522
│ │ │ │ -
Dune::IndexPair< GlobalIndex, LocalIndex > IndexPair
The type of the pair stored.
Definition: indexset.hh:244
│ │ │ │ -
@ RESIZE
Indicates that the index set is currently being resized.
Definition: indexset.hh:190
│ │ │ │ -
@ GROUND
The default mode. Indicates that the index set is ready to be used.
Definition: indexset.hh:186
│ │ │ │ -
@ DELETED
Definition: localindex.hh:28
│ │ │ │ +
41#endif // DUNE_PROMOTIONTRAITS_HH
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
Definition: debugalign.hh:425
│ │ │ │ -
A random access iterator for the Dune::ArrayList class.
Definition: arraylist.hh:255
│ │ │ │ -
A constant random access iterator for the Dune::ArrayList class.
Definition: arraylist.hh:370
│ │ │ │ -
A dynamically growing random access list.
Definition: arraylist.hh:62
│ │ │ │ -
ConstArrayListIterator< MemberType, N, A > const_iterator
A constant random access iterator.
Definition: arraylist.hh:110
│ │ │ │ -
A traits class describing the mapping of types onto MPI_Datatypes.
Definition: mpitraits.hh:41
│ │ │ │ -
Default exception if a function was called while the object is not in a valid state for that function...
Definition: exceptions.hh:281
│ │ │ │ - │ │ │ │ -
A pair consisting of a global and local index.
Definition: indexset.hh:85
│ │ │ │ -
Exception indicating that the index set is not in the expected state.
Definition: indexset.hh:205
│ │ │ │ -
Decorates an index set with the possibility to find a global index that is mapped to a specific local...
Definition: indexset.hh:507
│ │ │ │ -
Manager class for the mapping between local indices and globally unique indices.
Definition: indexset.hh:218
│ │ │ │ -
The iterator over the pairs.
Definition: indexset.hh:257
│ │ │ │ -
Definition: indexset.hh:615
│ │ │ │ -
Definition: indexset.hh:624
│ │ │ │ +
Compute type of the result of an arithmetic operation involving two different number types.
Definition: promotiontraits.hh:27
│ │ │ │ +
decltype(std::declval< T1 >()+std::declval< T2 >()) PromotedType
Definition: promotiontraits.hh:28
│ │ │ │ +
T1 PromotedType
Definition: promotiontraits.hh:35
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,1120 +4,54 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -indexset.hh │ │ │ │ │ +promotiontraits.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 (C) 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_INDEXSET_HH │ │ │ │ │ - 6#define DUNE_INDEXSET_HH │ │ │ │ │ + 5#ifndef DUNE_PROMOTIONTRAITS_HH │ │ │ │ │ + 6#define DUNE_PROMOTIONTRAITS_HH │ │ │ │ │ 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12 │ │ │ │ │ - 13#include "localindex.hh" │ │ │ │ │ - 14 │ │ │ │ │ - 15#include // for uint32_t │ │ │ │ │ - 16 │ │ │ │ │ - 17namespace Dune │ │ │ │ │ - 18{ │ │ │ │ │ - 28 // forward declarations │ │ │ │ │ - 29 │ │ │ │ │ - 30 template │ │ │ │ │ - 31 class IndexPair; │ │ │ │ │ - 32 │ │ │ │ │ - 38 template │ │ │ │ │ - 39 std::ostream& operator<<(std::ostream& os, const IndexPair& pair); │ │ │ │ │ + 8#include │ │ │ │ │ + 9 │ │ │ │ │ + 10namespace Dune { │ │ │ │ │ + 25 template │ │ │ │ │ +26 struct PromotionTraits │ │ │ │ │ + 27 { │ │ │ │ │ +28 typedef decltype(std::declval()+std::declval()) PromotedType; │ │ │ │ │ + 29 }; │ │ │ │ │ + 30 │ │ │ │ │ + 31 // Specialization for the case of two equal types │ │ │ │ │ + 32 // One should think that the generic template should handle this case as │ │ │ │ │ +well. │ │ │ │ │ + 33 // However, the fvectortest.cc unit test fails without it if ENABLE_GMP is │ │ │ │ │ +set. │ │ │ │ │ + 34 template │ │ │ │ │ +35 struct PromotionTraits { typedef T1 PromotedType; }; │ │ │ │ │ + 36 │ │ │ │ │ + 38} // end namespace │ │ │ │ │ + 39 │ │ │ │ │ 40 │ │ │ │ │ - 41 template │ │ │ │ │ - 42 bool operator==(const IndexPair&, const IndexPair&); │ │ │ │ │ - 43 │ │ │ │ │ - 44 template │ │ │ │ │ - 45 bool operator!=(const IndexPair&, const IndexPair&); │ │ │ │ │ - 46 │ │ │ │ │ - 47 template │ │ │ │ │ - 48 bool operator<(const IndexPair&, const IndexPair&); │ │ │ │ │ - 49 │ │ │ │ │ - 50 template │ │ │ │ │ - 51 bool operator>(const IndexPair&, const IndexPair&); │ │ │ │ │ - 52 │ │ │ │ │ - 53 template │ │ │ │ │ - 54 bool operator<=(const IndexPair&, const IndexPair&); │ │ │ │ │ - 55 │ │ │ │ │ - 56 template │ │ │ │ │ - 57 bool operator_>=(const IndexPair&, const IndexPair&); │ │ │ │ │ - 58 │ │ │ │ │ - 59 template │ │ │ │ │ - 60 bool operator==(const IndexPair&, const TG&); │ │ │ │ │ - 61 │ │ │ │ │ - 62 template │ │ │ │ │ - 63 bool operator!=(const IndexPair&, const TG&); │ │ │ │ │ - 64 │ │ │ │ │ - 65 template │ │ │ │ │ - 66 bool operator<(const IndexPair&, const TG&); │ │ │ │ │ - 67 │ │ │ │ │ - 68 template │ │ │ │ │ - 69 bool operator>(const IndexPair&, const TG&); │ │ │ │ │ - 70 │ │ │ │ │ - 71 template │ │ │ │ │ - 72 bool operator<=(const IndexPair&, const TG&); │ │ │ │ │ - 73 │ │ │ │ │ - 74 template │ │ │ │ │ - 75 bool operator_>=(const IndexPair&, const TG&); │ │ │ │ │ - 76 │ │ │ │ │ - 77 template │ │ │ │ │ - 78 struct MPITraits; │ │ │ │ │ - 79 │ │ │ │ │ - 83 template │ │ │ │ │ -84 class IndexPair │ │ │ │ │ - 85 { │ │ │ │ │ - 86 friend std::ostream& operator<<<>(std::ostream&, const IndexPair&); │ │ │ │ │ - 87 friend bool operator==<>(const IndexPair&, const IndexPair&); │ │ │ │ │ - 88 friend bool operator!=<>(const IndexPair&, const IndexPair&); │ │ │ │ │ - 89 friend bool operator< <>(const IndexPair&, const IndexPair&); │ │ │ │ │ - 90 friend bool operator><>(const IndexPair&, const IndexPair&); │ │ │ │ │ - 91 friend bool operator<=<>(const IndexPair&, const IndexPair&); │ │ │ │ │ - 92 friend bool operator>=<>(const IndexPair&, const IndexPair&); │ │ │ │ │ - 93 friend bool operator==<>(const IndexPair&, const TG &); │ │ │ │ │ - 94 friend bool operator!=<>(const IndexPair&, const TG &); │ │ │ │ │ - 95 friend bool operator< <>(const IndexPair&, const TG &); │ │ │ │ │ - 96 friend bool operator> <>(const IndexPair&, const TG &); │ │ │ │ │ - 97 friend bool operator<=<>(const IndexPair&, const TG &); │ │ │ │ │ -98 friend bool operator>=<>(const IndexPair&, const TG &); │ │ │ │ │ - 99 friend struct MPITraits >; │ │ │ │ │ - 100 │ │ │ │ │ - 101 public: │ │ │ │ │ -107 typedef TG GlobalIndex; │ │ │ │ │ - 108 │ │ │ │ │ -120 typedef TL LocalIndex; │ │ │ │ │ - 121 │ │ │ │ │ -128 IndexPair(const GlobalIndex& global, const LocalIndex& local); │ │ │ │ │ - 129 │ │ │ │ │ -133 IndexPair(); │ │ │ │ │ -140 IndexPair(const GlobalIndex& global); │ │ │ │ │ - 141 │ │ │ │ │ -147 inline const GlobalIndex& global() const; │ │ │ │ │ - 148 │ │ │ │ │ -154 inline LocalIndex& local(); │ │ │ │ │ - 155 │ │ │ │ │ -161 inline const LocalIndex& local() const; │ │ │ │ │ - 162 │ │ │ │ │ -168 inline void setLocal(int index); │ │ │ │ │ - 169 private: │ │ │ │ │ - 171 GlobalIndex global_; │ │ │ │ │ -173 LocalIndex local_; │ │ │ │ │ - 174 }; │ │ │ │ │ - 175 │ │ │ │ │ -180 enum ParallelIndexSetState │ │ │ │ │ - 181 { │ │ │ │ │ -186 GROUND, │ │ │ │ │ - 190 RESIZE │ │ │ │ │ -200 }; │ │ │ │ │ - 201 │ │ │ │ │ -205 class InvalidIndexSetState : public InvalidStateException {}; │ │ │ │ │ - 206 │ │ │ │ │ - 207 // Forward declaration │ │ │ │ │ - 208 template class GlobalLookupIndexSet; │ │ │ │ │ - 209 │ │ │ │ │ - 216 template │ │ │ │ │ -217 class ParallelIndexSet │ │ │ │ │ - 218 { │ │ │ │ │ - 219 friend class GlobalLookupIndexSet >; │ │ │ │ │ - 220 │ │ │ │ │ - 221 public: │ │ │ │ │ -226 typedef TG GlobalIndex; │ │ │ │ │ - 227 │ │ │ │ │ -239 typedef TL LocalIndex; │ │ │ │ │ - 240 │ │ │ │ │ -244 typedef Dune::IndexPair IndexPair; │ │ │ │ │ - 245 │ │ │ │ │ -252 constexpr static int arraySize = (N>0) ? N : 1; │ │ │ │ │ - 253 │ │ │ │ │ -255 class iterator : │ │ │ │ │ - 256 public ArrayList::iterator │ │ │ │ │ - 257 { │ │ │ │ │ - 258 typedef typename ArrayList::iterator │ │ │ │ │ -259 Father; │ │ │ │ │ - 260 friend class ParallelIndexSet; │ │ │ │ │ - 261 public: │ │ │ │ │ -262 iterator(ParallelIndexSet& indexSet, const Father& father) │ │ │ │ │ - 263 : Father(father), indexSet_(&indexSet) │ │ │ │ │ - 264 {} │ │ │ │ │ - 265 │ │ │ │ │ - 266 private: │ │ │ │ │ - 276 inline void markAsDeleted() const │ │ │ │ │ - 277 { │ │ │ │ │ - 278#ifndef NDEBUG │ │ │ │ │ - 279 if(indexSet_->state_ != RESIZE) │ │ │ │ │ - 280 DUNE_THROW(InvalidIndexSetState, "Indices can only be removed " │ │ │ │ │ - 281 <<"while in RESIZE state!"); │ │ │ │ │ - 282#endif │ │ │ │ │ - 283 Father::operator*().local().setState(DELETED); │ │ │ │ │ - 284 } │ │ │ │ │ - 285 │ │ │ │ │ - 287 ParallelIndexSet* indexSet_; │ │ │ │ │ - 288 │ │ │ │ │ - 289 }; │ │ │ │ │ - 290 │ │ │ │ │ - 291 │ │ │ │ │ - 292 │ │ │ │ │ - 294 typedef typename │ │ │ │ │ - 295 ArrayList::const_iterator │ │ │ │ │ -296 const_iterator; │ │ │ │ │ - 297 │ │ │ │ │ -301 ParallelIndexSet(); │ │ │ │ │ - 302 │ │ │ │ │ -307 inline const ParallelIndexSetState& state() │ │ │ │ │ - 308 { │ │ │ │ │ - 309 return state_; │ │ │ │ │ - 310 } │ │ │ │ │ - 311 │ │ │ │ │ -317 void beginResize(); │ │ │ │ │ - 318 │ │ │ │ │ -327 inline void add(const GlobalIndex& global); │ │ │ │ │ - 328 │ │ │ │ │ -337 inline void add(const GlobalIndex& global, const LocalIndex& local); │ │ │ │ │ - 338 │ │ │ │ │ -346 inline void markAsDeleted(const iterator& position); │ │ │ │ │ - 347 │ │ │ │ │ -360 void endResize(); │ │ │ │ │ - 361 │ │ │ │ │ - 372 inline IndexPair& │ │ │ │ │ -373 operator[](const GlobalIndex& global); │ │ │ │ │ - 374 │ │ │ │ │ - 384 inline IndexPair& │ │ │ │ │ -385 at(const GlobalIndex& global); │ │ │ │ │ - 386 │ │ │ │ │ - 396 inline bool │ │ │ │ │ -397 exists (const GlobalIndex& global) const; │ │ │ │ │ - 398 │ │ │ │ │ - 409 inline const IndexPair& │ │ │ │ │ -410 operator[](const GlobalIndex& global) const; │ │ │ │ │ - 411 │ │ │ │ │ - 421 inline const IndexPair& │ │ │ │ │ -422 at(const GlobalIndex& global) const; │ │ │ │ │ - 423 │ │ │ │ │ -428 inline iterator begin(); │ │ │ │ │ - 429 │ │ │ │ │ -434 inline iterator end(); │ │ │ │ │ - 435 │ │ │ │ │ -440 inline const_iterator begin() const; │ │ │ │ │ - 441 │ │ │ │ │ -446 inline const_iterator end() const; │ │ │ │ │ - 447 │ │ │ │ │ -457 inline void renumberLocal(); │ │ │ │ │ - 458 │ │ │ │ │ -465 inline int seqNo() const; │ │ │ │ │ - 466 │ │ │ │ │ -471 inline size_t size() const; │ │ │ │ │ - 472 │ │ │ │ │ - 473 private: │ │ │ │ │ - 475 ArrayList localIndices_; │ │ │ │ │ - 477 ArrayList newIndices_; │ │ │ │ │ - 479 ParallelIndexSetState state_; │ │ │ │ │ - 481 int seqNo_; │ │ │ │ │ - 483 bool deletedEntries_; │ │ │ │ │ - 488 inline void merge(); │ │ │ │ │ - 489 }; │ │ │ │ │ - 490 │ │ │ │ │ - 491 │ │ │ │ │ - 497 template │ │ │ │ │ - 498 std::ostream& operator<<(std::ostream& os, const │ │ │ │ │ -ParallelIndexSet& indexSet); │ │ │ │ │ - 499 │ │ │ │ │ - 505 template │ │ │ │ │ -506 class GlobalLookupIndexSet │ │ │ │ │ - 507 { │ │ │ │ │ - 508 public: │ │ │ │ │ -512 typedef I ParallelIndexSet; │ │ │ │ │ - 513 │ │ │ │ │ -517 typedef typename ParallelIndexSet::LocalIndex LocalIndex; │ │ │ │ │ - 518 │ │ │ │ │ -522 typedef typename ParallelIndexSet::GlobalIndex GlobalIndex; │ │ │ │ │ - 523 │ │ │ │ │ -527 typedef typename ParallelIndexSet::const_iterator const_iterator; │ │ │ │ │ - 528 │ │ │ │ │ -529 typedef Dune::IndexPair │ │ │ │ │ -IndexPair; │ │ │ │ │ - 530 │ │ │ │ │ -537 GlobalLookupIndexSet(const ParallelIndexSet& indexset, std::size_t size); │ │ │ │ │ - 538 │ │ │ │ │ -544 GlobalLookupIndexSet(const ParallelIndexSet& indexset); │ │ │ │ │ - 545 │ │ │ │ │ -549 ~GlobalLookupIndexSet(); │ │ │ │ │ - 550 │ │ │ │ │ - 560 inline const IndexPair& │ │ │ │ │ -561 operator[](const GlobalIndex& global) const; │ │ │ │ │ - 562 │ │ │ │ │ - 566 inline const IndexPair* │ │ │ │ │ -567 pair(const std::size_t& local) const; │ │ │ │ │ - 568 │ │ │ │ │ -573 inline const_iterator begin() const; │ │ │ │ │ - 574 │ │ │ │ │ -579 inline const_iterator end() const; │ │ │ │ │ - 580 │ │ │ │ │ -587 inline int seqNo() const; │ │ │ │ │ - 588 │ │ │ │ │ -593 inline size_t size() const; │ │ │ │ │ - 594 private: │ │ │ │ │ - 598 const ParallelIndexSet& indexSet_; │ │ │ │ │ - 599 │ │ │ │ │ - 603 std::size_t size_; │ │ │ │ │ - 604 │ │ │ │ │ - 608 std::vector indices_; │ │ │ │ │ - 609 │ │ │ │ │ - 610 }; │ │ │ │ │ - 611 │ │ │ │ │ - 612 │ │ │ │ │ - 613 template │ │ │ │ │ -614 struct LocalIndexComparator │ │ │ │ │ - 615 { │ │ │ │ │ -616 static bool compare([[maybe_unused]] const T& t1, [[maybe_unused]] const T& │ │ │ │ │ -t2) │ │ │ │ │ - 617 { │ │ │ │ │ - 618 return false; │ │ │ │ │ - 619 } │ │ │ │ │ - 620 }; │ │ │ │ │ - 621 │ │ │ │ │ - 622 template │ │ │ │ │ -623 struct IndexSetSortFunctor │ │ │ │ │ - 624 { │ │ │ │ │ -625 bool operator()(const IndexPair& i1, const IndexPair& i2) │ │ │ │ │ - 626 { │ │ │ │ │ - 627 return i1.global()::compare(i1.local(), │ │ │ │ │ - 629 i2.local())); │ │ │ │ │ - 630 } │ │ │ │ │ - 631 }; │ │ │ │ │ - 632 │ │ │ │ │ - 633 │ │ │ │ │ - 634 │ │ │ │ │ - 635 template │ │ │ │ │ -636 inline std::ostream& operator<<(std::ostream& os, const IndexPair& │ │ │ │ │ -pair) │ │ │ │ │ - 637 { │ │ │ │ │ - 638 os<<"{global="< │ │ │ │ │ -643 inline std::ostream& operator<<(std::ostream& os, const │ │ │ │ │ -ParallelIndexSet& indexSet) │ │ │ │ │ - 644 { │ │ │ │ │ - 645 typedef typename ParallelIndexSet::const_iterator Iterator; │ │ │ │ │ - 646 Iterator end = indexSet.end(); │ │ │ │ │ - 647 os<<"{"; │ │ │ │ │ - 648 for(Iterator index = indexSet.begin(); index != end; ++index) │ │ │ │ │ - 649 os<<*index<<" "; │ │ │ │ │ - 650 os<<"}"; │ │ │ │ │ - 651 return os; │ │ │ │ │ - 652 │ │ │ │ │ - 653 } │ │ │ │ │ - 654 │ │ │ │ │ - 655 template │ │ │ │ │ -656 inline bool operator==(const IndexPair& a, const IndexPair& │ │ │ │ │ -b) │ │ │ │ │ - 657 { │ │ │ │ │ - 658 return a.global_==b.global_; │ │ │ │ │ - 659 } │ │ │ │ │ - 660 │ │ │ │ │ - 661 template │ │ │ │ │ -662 inline bool operator!=(const IndexPair& a, const IndexPair& │ │ │ │ │ -b) │ │ │ │ │ - 663 { │ │ │ │ │ - 664 return a.global_!=b.global_; │ │ │ │ │ - 665 } │ │ │ │ │ - 666 │ │ │ │ │ - 667 template │ │ │ │ │ -668 inline bool operator<(const IndexPair& a, const IndexPair& b) │ │ │ │ │ - 669 { │ │ │ │ │ - 670 return a.global_ │ │ │ │ │ -674 inline bool operator>(const IndexPair& a, const IndexPair& b) │ │ │ │ │ - 675 { │ │ │ │ │ - 676 return a.global_>b.global_; │ │ │ │ │ - 677 } │ │ │ │ │ - 678 │ │ │ │ │ - 679 template │ │ │ │ │ -680 inline bool operator<=(const IndexPair& a, const IndexPair& │ │ │ │ │ -b) │ │ │ │ │ - 681 { │ │ │ │ │ - 682 return a.global_<=b.global_; │ │ │ │ │ - 683 } │ │ │ │ │ - 684 │ │ │ │ │ - 685 template │ │ │ │ │ -686 inline bool operator_>=(const IndexPair& a, const IndexPair& │ │ │ │ │ -b) │ │ │ │ │ - 687 { │ │ │ │ │ - 688 return a.global_>=b.global_; │ │ │ │ │ - 689 } │ │ │ │ │ - 690 │ │ │ │ │ - 691 template │ │ │ │ │ -692 inline bool operator==(const IndexPair& a, const TG& b) │ │ │ │ │ - 693 { │ │ │ │ │ - 694 return a.global_==b; │ │ │ │ │ - 695 } │ │ │ │ │ - 696 │ │ │ │ │ - 697 template │ │ │ │ │ -698 inline bool operator!=(const IndexPair& a, const TG& b) │ │ │ │ │ - 699 { │ │ │ │ │ - 700 return a.global_!=b; │ │ │ │ │ - 701 } │ │ │ │ │ - 702 │ │ │ │ │ - 703 template │ │ │ │ │ -704 inline bool operator<(const IndexPair& a, const TG& b) │ │ │ │ │ - 705 { │ │ │ │ │ - 706 return a.global_ │ │ │ │ │ -710 inline bool operator>(const IndexPair& a, const TG& b) │ │ │ │ │ - 711 { │ │ │ │ │ - 712 return a.global_>b; │ │ │ │ │ - 713 } │ │ │ │ │ - 714 │ │ │ │ │ - 715 template │ │ │ │ │ -716 inline bool operator<=(const IndexPair& a, const TG& b) │ │ │ │ │ - 717 { │ │ │ │ │ - 718 return a.global_<=b; │ │ │ │ │ - 719 } │ │ │ │ │ - 720 │ │ │ │ │ - 721 template │ │ │ │ │ -722 inline bool operator_>=(const IndexPair& a, const TG& b) │ │ │ │ │ - 723 { │ │ │ │ │ - 724 return a.global_>=b; │ │ │ │ │ - 725 } │ │ │ │ │ - 726 │ │ │ │ │ - 727#ifndef DOXYGEN │ │ │ │ │ - 728 │ │ │ │ │ - 729 template │ │ │ │ │ - 730 IndexPair::IndexPair(const TG& global, const TL& local) │ │ │ │ │ - 731 : global_(global), local_(local){} │ │ │ │ │ - 732 │ │ │ │ │ - 733 template │ │ │ │ │ - 734 IndexPair::IndexPair(const TG& global) │ │ │ │ │ - 735 : global_(global), local_(){} │ │ │ │ │ - 736 │ │ │ │ │ - 737 template │ │ │ │ │ - 738 IndexPair::IndexPair() │ │ │ │ │ - 739 : global_(), local_(){} │ │ │ │ │ - 740 │ │ │ │ │ - 741 template │ │ │ │ │ - 742 inline const TG& IndexPair::global() const { │ │ │ │ │ - 743 return global_; │ │ │ │ │ - 744 } │ │ │ │ │ - 745 │ │ │ │ │ - 746 template │ │ │ │ │ - 747 inline TL& IndexPair::local() { │ │ │ │ │ - 748 return local_; │ │ │ │ │ - 749 } │ │ │ │ │ - 750 │ │ │ │ │ - 751 template │ │ │ │ │ - 752 inline const TL& IndexPair::local() const { │ │ │ │ │ - 753 return local_; │ │ │ │ │ - 754 } │ │ │ │ │ - 755 │ │ │ │ │ - 756 template │ │ │ │ │ - 757 inline void IndexPair::setLocal(int local){ │ │ │ │ │ - 758 local_=local; │ │ │ │ │ - 759 } │ │ │ │ │ - 760 │ │ │ │ │ - 761 template │ │ │ │ │ - 762 ParallelIndexSet::ParallelIndexSet() │ │ │ │ │ - 763 : state_(GROUND), seqNo_(0), deletedEntries_() │ │ │ │ │ - 764 {} │ │ │ │ │ - 765 │ │ │ │ │ - 766 template │ │ │ │ │ - 767 void ParallelIndexSet::beginResize() │ │ │ │ │ - 768 { │ │ │ │ │ - 769 │ │ │ │ │ - 770 // Checks in unproductive code │ │ │ │ │ - 771#ifndef NDEBUG │ │ │ │ │ - 772 if(state_!=GROUND) │ │ │ │ │ - 773 DUNE_THROW(InvalidIndexSetState, │ │ │ │ │ - 774 "IndexSet has to be in GROUND state, when " │ │ │ │ │ - 775 << "beginResize() is called!"); │ │ │ │ │ - 776#endif │ │ │ │ │ - 777 │ │ │ │ │ - 778 state_ = RESIZE; │ │ │ │ │ - 779 deletedEntries_ = false; │ │ │ │ │ - 780 } │ │ │ │ │ - 781 │ │ │ │ │ - 782 template │ │ │ │ │ - 783 inline void ParallelIndexSet::add(const GlobalIndex& global) │ │ │ │ │ - 784 { │ │ │ │ │ - 785 // Checks in unproductive code │ │ │ │ │ - 786#ifndef NDEBUG │ │ │ │ │ - 787 if(state_ != RESIZE) │ │ │ │ │ - 788 DUNE_THROW(InvalidIndexSetState, "Indices can only be added " │ │ │ │ │ - 789 <<"while in RESIZE state!"); │ │ │ │ │ - 790#endif │ │ │ │ │ - 791 newIndices_.push_back(IndexPair(global)); │ │ │ │ │ - 792 } │ │ │ │ │ - 793 │ │ │ │ │ - 794 template │ │ │ │ │ - 795 inline void ParallelIndexSet::add(const TG& global, const TL& │ │ │ │ │ -local) │ │ │ │ │ - 796 { │ │ │ │ │ - 797 // Checks in unproductive code │ │ │ │ │ - 798#ifndef NDEBUG │ │ │ │ │ - 799 if(state_ != RESIZE) │ │ │ │ │ - 800 DUNE_THROW(InvalidIndexSetState, "Indices can only be added " │ │ │ │ │ - 801 <<"while in RESIZE state!"); │ │ │ │ │ - 802#endif │ │ │ │ │ - 803 newIndices_.push_back(IndexPair(global,local)); │ │ │ │ │ - 804 } │ │ │ │ │ - 805 │ │ │ │ │ - 806 template │ │ │ │ │ - 807 inline void ParallelIndexSet::markAsDeleted(const iterator& │ │ │ │ │ -global) │ │ │ │ │ - 808 { │ │ │ │ │ - 809 // Checks in unproductive code │ │ │ │ │ - 810#ifndef NDEBUG │ │ │ │ │ - 811 if(state_ != RESIZE) │ │ │ │ │ - 812 DUNE_THROW(InvalidIndexSetState, "Indices can only be removed " │ │ │ │ │ - 813 <<"while in RESIZE state!"); │ │ │ │ │ - 814#endif │ │ │ │ │ - 815 deletedEntries_ = true; │ │ │ │ │ - 816 │ │ │ │ │ - 817 global.markAsDeleted(); │ │ │ │ │ - 818 } │ │ │ │ │ - 819 │ │ │ │ │ - 820 template │ │ │ │ │ - 821 void ParallelIndexSet::endResize() { │ │ │ │ │ - 822 // Checks in unproductive code │ │ │ │ │ - 823#ifndef NDEBUG │ │ │ │ │ - 824 if(state_ != RESIZE) │ │ │ │ │ - 825 DUNE_THROW(InvalidIndexSetState, "endResize called while not " │ │ │ │ │ - 826 <<"in RESIZE state!"); │ │ │ │ │ - 827#endif │ │ │ │ │ - 828 │ │ │ │ │ - 829 std::sort(newIndices_.begin(), newIndices_.end(), │ │ │ │ │ -IndexSetSortFunctor()); │ │ │ │ │ - 830 merge(); │ │ │ │ │ - 831 seqNo_++; │ │ │ │ │ - 832 state_ = GROUND; │ │ │ │ │ - 833 } │ │ │ │ │ - 834 │ │ │ │ │ - 835 │ │ │ │ │ - 836 template │ │ │ │ │ - 837 inline void ParallelIndexSet::merge(){ │ │ │ │ │ - 838 if(localIndices_.size()==0) │ │ │ │ │ - 839 { │ │ │ │ │ - 840 localIndices_=newIndices_; │ │ │ │ │ - 841 newIndices_.clear(); │ │ │ │ │ - 842 } │ │ │ │ │ - 843 else if(newIndices_.size()>0 || deletedEntries_) │ │ │ │ │ - 844 { │ │ │ │ │ - 845 ArrayList tempPairs; │ │ │ │ │ - 846 │ │ │ │ │ - 847 auto old = localIndices_.begin(); │ │ │ │ │ - 848 auto added = newIndices_.begin(); │ │ │ │ │ - 849 const auto endold = localIndices_.end(); │ │ │ │ │ - 850 const auto endadded = newIndices_.end(); │ │ │ │ │ - 851 │ │ │ │ │ - 852 while(old != endold && added!= endadded) │ │ │ │ │ - 853 { │ │ │ │ │ - 854 if(old->local().state()==DELETED) { │ │ │ │ │ - 855 old.eraseToHere(); │ │ │ │ │ - 856 } │ │ │ │ │ - 857 else │ │ │ │ │ - 858 { │ │ │ │ │ - 859 if(old->global() < added->global() || │ │ │ │ │ - 860 (old->global() == added->global() │ │ │ │ │ - 861 && LocalIndexComparator::compare(old->local(),added->local()))) │ │ │ │ │ - 862 { │ │ │ │ │ - 863 tempPairs.push_back(*old); │ │ │ │ │ - 864 old.eraseToHere(); │ │ │ │ │ - 865 continue; │ │ │ │ │ - 866 }else │ │ │ │ │ - 867 { │ │ │ │ │ - 868 tempPairs.push_back(*added); │ │ │ │ │ - 869 added.eraseToHere(); │ │ │ │ │ - 870 } │ │ │ │ │ - 871 } │ │ │ │ │ - 872 } │ │ │ │ │ - 873 │ │ │ │ │ - 874 while(old != endold) │ │ │ │ │ - 875 { │ │ │ │ │ - 876 if(old->local().state()!=DELETED) { │ │ │ │ │ - 877 tempPairs.push_back(*old); │ │ │ │ │ - 878 } │ │ │ │ │ - 879 old.eraseToHere(); │ │ │ │ │ - 880 } │ │ │ │ │ - 881 │ │ │ │ │ - 882 while(added!= endadded) │ │ │ │ │ - 883 { │ │ │ │ │ - 884 tempPairs.push_back(*added); │ │ │ │ │ - 885 added.eraseToHere(); │ │ │ │ │ - 886 } │ │ │ │ │ - 887 localIndices_ = tempPairs; │ │ │ │ │ - 888 } │ │ │ │ │ - 889 } │ │ │ │ │ - 890 │ │ │ │ │ - 891 │ │ │ │ │ - 892 template │ │ │ │ │ - 893 inline const IndexPair& │ │ │ │ │ - 894 ParallelIndexSet::at(const TG& global) const │ │ │ │ │ - 895 { │ │ │ │ │ - 896 // perform a binary search │ │ │ │ │ - 897 int low=0, high=localIndices_.size()-1, probe=-1; │ │ │ │ │ - 898 │ │ │ │ │ - 899 while(low │ │ │ │ │ - 918 inline const IndexPair& │ │ │ │ │ - 919 ParallelIndexSet::operator[](const TG& global) const │ │ │ │ │ - 920 { │ │ │ │ │ - 921 // perform a binary search │ │ │ │ │ - 922 int low=0, high=localIndices_.size()-1, probe=-1; │ │ │ │ │ - 923 │ │ │ │ │ - 924 while(low │ │ │ │ │ - 936 inline IndexPair& ParallelIndexSet::at(const TG& global) │ │ │ │ │ - 937 { │ │ │ │ │ - 938 // perform a binary search │ │ │ │ │ - 939 int low=0, high=localIndices_.size()-1, probe=-1; │ │ │ │ │ - 940 │ │ │ │ │ - 941 while(low= global) │ │ │ │ │ - 945 high = probe; │ │ │ │ │ - 946 else │ │ │ │ │ - 947 low = probe+1; │ │ │ │ │ - 948 } │ │ │ │ │ - 949 │ │ │ │ │ - 950 if(probe==-1) │ │ │ │ │ - 951 DUNE_THROW(RangeError, "No entries!"); │ │ │ │ │ - 952 │ │ │ │ │ - 953 if( localIndices_[low].global() != global) │ │ │ │ │ - 954 DUNE_THROW(RangeError, "Could not find entry of "< │ │ │ │ │ - 960 inline bool ParallelIndexSet::exists (const TG& global) const │ │ │ │ │ - 961 { │ │ │ │ │ - 962 // perform a binary search │ │ │ │ │ - 963 int low=0, high=localIndices_.size()-1, probe=-1; │ │ │ │ │ - 964 │ │ │ │ │ - 965 while(low= global) │ │ │ │ │ - 969 high = probe; │ │ │ │ │ - 970 else │ │ │ │ │ - 971 low = probe+1; │ │ │ │ │ - 972 } │ │ │ │ │ - 973 │ │ │ │ │ - 974 if(probe==-1) │ │ │ │ │ - 975 return false; │ │ │ │ │ - 976 │ │ │ │ │ - 977 if( localIndices_[low].global() != global) │ │ │ │ │ - 978 return false; │ │ │ │ │ - 979 return true; │ │ │ │ │ - 980 } │ │ │ │ │ - 981 │ │ │ │ │ - 982 template │ │ │ │ │ - 983 inline IndexPair& ParallelIndexSet::operator[](const TG& │ │ │ │ │ -global) │ │ │ │ │ - 984 { │ │ │ │ │ - 985 // perform a binary search │ │ │ │ │ - 986 int low=0, high=localIndices_.size()-1, probe=-1; │ │ │ │ │ - 987 │ │ │ │ │ - 988 while(low= global) │ │ │ │ │ - 992 high = probe; │ │ │ │ │ - 993 else │ │ │ │ │ - 994 low = probe+1; │ │ │ │ │ - 995 } │ │ │ │ │ - 996 │ │ │ │ │ - 997 return localIndices_[low]; │ │ │ │ │ - 998 } │ │ │ │ │ - 999 template │ │ │ │ │ - 1000 inline typename ParallelIndexSet::iterator │ │ │ │ │ - 1001 ParallelIndexSet::begin() │ │ │ │ │ - 1002 { │ │ │ │ │ - 1003 return iterator(*this, localIndices_.begin()); │ │ │ │ │ - 1004 } │ │ │ │ │ - 1005 │ │ │ │ │ - 1006 │ │ │ │ │ - 1007 template │ │ │ │ │ - 1008 inline typename ParallelIndexSet::iterator │ │ │ │ │ - 1009 ParallelIndexSet::end() │ │ │ │ │ - 1010 { │ │ │ │ │ - 1011 return iterator(*this,localIndices_.end()); │ │ │ │ │ - 1012 } │ │ │ │ │ - 1013 │ │ │ │ │ - 1014 template │ │ │ │ │ - 1015 inline typename ParallelIndexSet::const_iterator │ │ │ │ │ - 1016 ParallelIndexSet::begin() const │ │ │ │ │ - 1017 { │ │ │ │ │ - 1018 return localIndices_.begin(); │ │ │ │ │ - 1019 } │ │ │ │ │ - 1020 │ │ │ │ │ - 1021 │ │ │ │ │ - 1022 template │ │ │ │ │ - 1023 inline typename ParallelIndexSet::const_iterator │ │ │ │ │ - 1024 ParallelIndexSet::end() const │ │ │ │ │ - 1025 { │ │ │ │ │ - 1026 return localIndices_.end(); │ │ │ │ │ - 1027 } │ │ │ │ │ - 1028 │ │ │ │ │ - 1029 template │ │ │ │ │ - 1030 void ParallelIndexSet::renumberLocal(){ │ │ │ │ │ - 1031#ifndef NDEBUG │ │ │ │ │ - 1032 if(state_==RESIZE) │ │ │ │ │ - 1033 DUNE_THROW(InvalidIndexSetState, "IndexSet has to be in " │ │ │ │ │ - 1034 <<"GROUND state for renumberLocal()"); │ │ │ │ │ - 1035#endif │ │ │ │ │ - 1036 │ │ │ │ │ - 1037 const auto end_ = end(); │ │ │ │ │ - 1038 uint32_t index=0; │ │ │ │ │ - 1039 │ │ │ │ │ - 1040 for(auto pair=begin(); pair!=end_; index++, ++pair) │ │ │ │ │ - 1041 pair->local()=index; │ │ │ │ │ - 1042 } │ │ │ │ │ - 1043 │ │ │ │ │ - 1044 template │ │ │ │ │ - 1045 inline int ParallelIndexSet::seqNo() const │ │ │ │ │ - 1046 { │ │ │ │ │ - 1047 return seqNo_; │ │ │ │ │ - 1048 } │ │ │ │ │ - 1049 │ │ │ │ │ - 1050 template │ │ │ │ │ - 1051 inline size_t ParallelIndexSet::size() const │ │ │ │ │ - 1052 { │ │ │ │ │ - 1053 return localIndices_.size(); │ │ │ │ │ - 1054 } │ │ │ │ │ - 1055 │ │ │ │ │ - 1056 template │ │ │ │ │ - 1057 GlobalLookupIndexSet::GlobalLookupIndexSet(const I& indexset, │ │ │ │ │ - 1058 std::size_t size) │ │ │ │ │ - 1059 : indexSet_(indexset), size_(size), │ │ │ │ │ - 1060 indices_(size_, static_cast(0)) │ │ │ │ │ - 1061 { │ │ │ │ │ - 1062 const_iterator end_ = indexSet_.end(); │ │ │ │ │ - 1063 │ │ │ │ │ - 1064 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair) { │ │ │ │ │ - 1065 assert(pair->local()local()] = &(*pair); │ │ │ │ │ - 1067 } │ │ │ │ │ - 1068 } │ │ │ │ │ - 1069 │ │ │ │ │ - 1070 template │ │ │ │ │ - 1071 GlobalLookupIndexSet::GlobalLookupIndexSet(const I& indexset) │ │ │ │ │ - 1072 : indexSet_(indexset), size_(0) │ │ │ │ │ - 1073 { │ │ │ │ │ - 1074 const_iterator end_ = indexSet_.end(); │ │ │ │ │ - 1075 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair) │ │ │ │ │ - 1076 size_=std::max(size_,static_cast(pair->local())); │ │ │ │ │ - 1077 │ │ │ │ │ - 1078 indices_.resize(++size_, 0); │ │ │ │ │ - 1079 │ │ │ │ │ - 1080 for(const_iterator pair = indexSet_.begin(); pair!=end_; ++pair) │ │ │ │ │ - 1081 indices_[pair->local()] = &(*pair); │ │ │ │ │ - 1082 } │ │ │ │ │ - 1083 │ │ │ │ │ - 1084 template │ │ │ │ │ - 1085 GlobalLookupIndexSet::~GlobalLookupIndexSet() │ │ │ │ │ - 1086 {} │ │ │ │ │ - 1087 │ │ │ │ │ - 1088 template │ │ │ │ │ - 1089 inline const IndexPair* │ │ │ │ │ - 1090 GlobalLookupIndexSet::pair(const std::size_t& local) const │ │ │ │ │ - 1091 { │ │ │ │ │ - 1092 return indices_[local]; │ │ │ │ │ - 1093 } │ │ │ │ │ - 1094 │ │ │ │ │ - 1095 template │ │ │ │ │ - 1096 inline const IndexPair& │ │ │ │ │ - 1097 GlobalLookupIndexSet::operator[](const GlobalIndex& global) const │ │ │ │ │ - 1098 { │ │ │ │ │ - 1099 return indexSet_[global]; │ │ │ │ │ - 1100 } │ │ │ │ │ - 1101 │ │ │ │ │ - 1102 template │ │ │ │ │ - 1103 typename I::const_iterator GlobalLookupIndexSet::begin() const │ │ │ │ │ - 1104 { │ │ │ │ │ - 1105 return indexSet_.begin(); │ │ │ │ │ - 1106 } │ │ │ │ │ - 1107 │ │ │ │ │ - 1108 template │ │ │ │ │ - 1109 typename I::const_iterator GlobalLookupIndexSet::end() const │ │ │ │ │ - 1110 { │ │ │ │ │ - 1111 return indexSet_.end(); │ │ │ │ │ - 1112 } │ │ │ │ │ - 1113 │ │ │ │ │ - 1114 template │ │ │ │ │ - 1115 inline size_t GlobalLookupIndexSet::size() const │ │ │ │ │ - 1116 { │ │ │ │ │ - 1117 return size_; │ │ │ │ │ - 1118 } │ │ │ │ │ - 1119 │ │ │ │ │ - 1120 template │ │ │ │ │ - 1121 inline int GlobalLookupIndexSet::seqNo() const │ │ │ │ │ - 1122 { │ │ │ │ │ - 1123 return indexSet_.seqNo(); │ │ │ │ │ - 1124 } │ │ │ │ │ - 1125 │ │ │ │ │ - 1126 template │ │ │ │ │ - 1127 bool operator==(const ParallelIndexSet& idxset, │ │ │ │ │ - 1128 const ParallelIndexSet& idxset1) │ │ │ │ │ - 1129 { │ │ │ │ │ - 1130 if(idxset.size()!=idxset1.size()) │ │ │ │ │ - 1131 return false; │ │ │ │ │ - 1132 typedef typename ParallelIndexSet::const_iterator Iter; │ │ │ │ │ - 1133 typedef typename ParallelIndexSet::const_iterator Iter1; │ │ │ │ │ - 1134 Iter iter=idxset.begin(); │ │ │ │ │ - 1135 for(Iter1 iter1=idxset1.begin(); iter1 != idxset1.end(); ++iter, ++iter1) │ │ │ │ │ -{ │ │ │ │ │ - 1136 if(iter1->global()!=iter->global()) │ │ │ │ │ - 1137 return false; │ │ │ │ │ - 1138 typedef typename ParallelIndexSet::LocalIndex PI; │ │ │ │ │ - 1139 const PI& pi=iter->local(), pi1=iter1->local(); │ │ │ │ │ - 1140 │ │ │ │ │ - 1141 if(pi!=pi1) │ │ │ │ │ - 1142 return false; │ │ │ │ │ - 1143 } │ │ │ │ │ - 1144 return true; │ │ │ │ │ - 1145 } │ │ │ │ │ - 1146 │ │ │ │ │ - 1147 template │ │ │ │ │ - 1148 bool operator!=(const ParallelIndexSet& idxset, │ │ │ │ │ - 1149 const ParallelIndexSet& idxset1) │ │ │ │ │ - 1150 { │ │ │ │ │ - 1151 return !(idxset==idxset1); │ │ │ │ │ - 1152 } │ │ │ │ │ - 1153 │ │ │ │ │ - 1154 │ │ │ │ │ - 1155#endif // DOXYGEN │ │ │ │ │ - 1156 │ │ │ │ │ - 1157} │ │ │ │ │ - 1158#endif │ │ │ │ │ -localindex.hh │ │ │ │ │ -Provides classes for use as the local index in ParallelIndexSet. │ │ │ │ │ -exceptions.hh │ │ │ │ │ -A few common exception classes. │ │ │ │ │ -arraylist.hh │ │ │ │ │ -Implements a random-access container that can efficiently change size (similar │ │ │ │ │ -to std::deque) │ │ │ │ │ -Dune::operator<< │ │ │ │ │ -std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x) │ │ │ │ │ -Definition: bigunsignedint.hh:278 │ │ │ │ │ -DUNE_THROW │ │ │ │ │ -#define DUNE_THROW(E, m) │ │ │ │ │ -Definition: exceptions.hh:218 │ │ │ │ │ -Dune::operator< │ │ │ │ │ -EnableIfInterOperable< T1, T2, bool >::type operator<(const │ │ │ │ │ -RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const │ │ │ │ │ -RandomAccessIteratorFacade< T2, V2, R2, D > &rhs) │ │ │ │ │ -Comparison operator. │ │ │ │ │ -Definition: iteratorfacades.hh:637 │ │ │ │ │ -Dune::operator> │ │ │ │ │ -EnableIfInterOperable< T1, T2, bool >::type operator>(const │ │ │ │ │ -RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const │ │ │ │ │ -RandomAccessIteratorFacade< T2, V2, R2, D > &rhs) │ │ │ │ │ -Comparison operator. │ │ │ │ │ -Definition: iteratorfacades.hh:683 │ │ │ │ │ -Dune::operator<= │ │ │ │ │ -EnableIfInterOperable< T1, T2, bool >::type operator<=(const │ │ │ │ │ -RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const │ │ │ │ │ -RandomAccessIteratorFacade< T2, V2, R2, D > &rhs) │ │ │ │ │ -Comparison operator. │ │ │ │ │ -Definition: iteratorfacades.hh:660 │ │ │ │ │ -Dune::operator== │ │ │ │ │ -EnableIfInterOperable< T1, T2, bool >::type operator==(const │ │ │ │ │ -ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, │ │ │ │ │ -V2, R2, D > &rhs) │ │ │ │ │ -Checks for equality. │ │ │ │ │ -Definition: iteratorfacades.hh:237 │ │ │ │ │ -Dune::operator>= │ │ │ │ │ -EnableIfInterOperable< T1, T2, bool >::type operator>=(const │ │ │ │ │ -RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const │ │ │ │ │ -RandomAccessIteratorFacade< T2, V2, R2, D > &rhs) │ │ │ │ │ -Comparison operator. │ │ │ │ │ -Definition: iteratorfacades.hh:705 │ │ │ │ │ -Dune::operator!= │ │ │ │ │ -EnableIfInterOperable< T1, T2, bool >::type operator!=(const │ │ │ │ │ -ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, │ │ │ │ │ -V2, R2, D > &rhs) │ │ │ │ │ -Checks for inequality. │ │ │ │ │ -Definition: iteratorfacades.hh:259 │ │ │ │ │ -Dune::ParallelIndexSet::operator[] │ │ │ │ │ -IndexPair & operator[](const GlobalIndex &global) │ │ │ │ │ -Find the index pair with a specific global id. │ │ │ │ │ -Dune::ParallelIndexSet::arraySize │ │ │ │ │ -static constexpr int arraySize │ │ │ │ │ -The size of the individual arrays in the underlying ArrayList. │ │ │ │ │ -Definition: indexset.hh:252 │ │ │ │ │ -Dune::ParallelIndexSet::beginResize │ │ │ │ │ -void beginResize() │ │ │ │ │ -Indicate that the index set is to be resized. │ │ │ │ │ -Dune::ParallelIndexSetState │ │ │ │ │ -ParallelIndexSetState │ │ │ │ │ -The states the index set can be in. │ │ │ │ │ -Definition: indexset.hh:181 │ │ │ │ │ -Dune::ParallelIndexSet::renumberLocal │ │ │ │ │ -void renumberLocal() │ │ │ │ │ -Renumbers the local index numbers. │ │ │ │ │ -Dune::ParallelIndexSet::exists │ │ │ │ │ -bool exists(const GlobalIndex &global) const │ │ │ │ │ -Find the index pair with a specific global id. │ │ │ │ │ -Dune::ParallelIndexSet::size │ │ │ │ │ -size_t size() const │ │ │ │ │ -Get the total number (public and nonpublic) indices. │ │ │ │ │ -Dune::ParallelIndexSet::const_iterator │ │ │ │ │ -ArrayList< IndexPair, N >::const_iterator const_iterator │ │ │ │ │ -The constant iterator over the pairs. │ │ │ │ │ -Definition: indexset.hh:296 │ │ │ │ │ -Dune::IndexSetSortFunctor::operator() │ │ │ │ │ -bool operator()(const IndexPair< TG, TL > &i1, const IndexPair< TG, TL > &i2) │ │ │ │ │ -Definition: indexset.hh:625 │ │ │ │ │ -Dune::ParallelIndexSet::add │ │ │ │ │ -void add(const GlobalIndex &global) │ │ │ │ │ -Add an new index to the set. │ │ │ │ │ -Dune::GlobalLookupIndexSet::end │ │ │ │ │ -const_iterator end() const │ │ │ │ │ -Get an iterator over the indices positioned after the last index. │ │ │ │ │ -Dune::IndexPair::local │ │ │ │ │ -const LocalIndex & local() const │ │ │ │ │ -Get the local index. │ │ │ │ │ -Dune::ParallelIndexSet::at │ │ │ │ │ -const IndexPair & at(const GlobalIndex &global) const │ │ │ │ │ -Find the index pair with a specific global id. │ │ │ │ │ -Dune::GlobalLookupIndexSet::GlobalLookupIndexSet │ │ │ │ │ -GlobalLookupIndexSet(const ParallelIndexSet &indexset) │ │ │ │ │ -Constructor. │ │ │ │ │ -Dune::IndexPair::LocalIndex │ │ │ │ │ -TL LocalIndex │ │ │ │ │ -the type of the local index. │ │ │ │ │ -Definition: indexset.hh:120 │ │ │ │ │ -Dune::GlobalLookupIndexSet::seqNo │ │ │ │ │ -int seqNo() const │ │ │ │ │ -Get the internal sequence number. │ │ │ │ │ -Dune::LocalIndexComparator::compare │ │ │ │ │ -static bool compare(const T &t1, const T &t2) │ │ │ │ │ -Definition: indexset.hh:616 │ │ │ │ │ -Dune::ParallelIndexSet::begin │ │ │ │ │ -iterator begin() │ │ │ │ │ -Get an iterator over the indices positioned at the first index. │ │ │ │ │ -Dune::GlobalLookupIndexSet::IndexPair │ │ │ │ │ -Dune::IndexPair< typename I::GlobalIndex, typename I::LocalIndex > IndexPair │ │ │ │ │ -Definition: indexset.hh:529 │ │ │ │ │ -Dune::ParallelIndexSet::end │ │ │ │ │ -iterator end() │ │ │ │ │ -Get an iterator over the indices positioned after the last index. │ │ │ │ │ -Dune::GlobalLookupIndexSet::const_iterator │ │ │ │ │ -ParallelIndexSet::const_iterator const_iterator │ │ │ │ │ -The iterator over the index pairs. │ │ │ │ │ -Definition: indexset.hh:527 │ │ │ │ │ -Dune::GlobalLookupIndexSet::begin │ │ │ │ │ -const_iterator begin() const │ │ │ │ │ -Get an iterator over the indices positioned at the first index. │ │ │ │ │ -Dune::ParallelIndexSet::operator[] │ │ │ │ │ -const IndexPair & operator[](const GlobalIndex &global) const │ │ │ │ │ -Find the index pair with a specific global id. │ │ │ │ │ -Dune::ParallelIndexSet::state │ │ │ │ │ -const ParallelIndexSetState & state() │ │ │ │ │ -Get the state the index set is in. │ │ │ │ │ -Definition: indexset.hh:307 │ │ │ │ │ -Dune::ParallelIndexSet::begin │ │ │ │ │ -const_iterator begin() const │ │ │ │ │ -Get an iterator over the indices positioned at the first index. │ │ │ │ │ -Dune::GlobalLookupIndexSet::operator[] │ │ │ │ │ -const IndexPair & operator[](const GlobalIndex &global) const │ │ │ │ │ -Find the index pair with a specific global id. │ │ │ │ │ -Dune::IndexPair::IndexPair │ │ │ │ │ -IndexPair() │ │ │ │ │ -Construct a new Pair. │ │ │ │ │ -Dune::GlobalLookupIndexSet::ParallelIndexSet │ │ │ │ │ -I ParallelIndexSet │ │ │ │ │ -The type of the index set. │ │ │ │ │ -Definition: indexset.hh:512 │ │ │ │ │ -Dune::ParallelIndexSet::LocalIndex │ │ │ │ │ -TL LocalIndex │ │ │ │ │ -The type of the local index, e.g. ParallelLocalIndex. │ │ │ │ │ -Definition: indexset.hh:239 │ │ │ │ │ -Dune::ParallelIndexSet::markAsDeleted │ │ │ │ │ -void markAsDeleted(const iterator &position) │ │ │ │ │ -Mark an index as deleted. │ │ │ │ │ -Dune::GlobalLookupIndexSet::LocalIndex │ │ │ │ │ -ParallelIndexSet::LocalIndex LocalIndex │ │ │ │ │ -The type of the local index. │ │ │ │ │ -Definition: indexset.hh:517 │ │ │ │ │ -Dune::IndexPair::IndexPair │ │ │ │ │ -IndexPair(const GlobalIndex &global, const LocalIndex &local) │ │ │ │ │ -Constructs a new Pair. │ │ │ │ │ -Dune::IndexPair::setLocal │ │ │ │ │ -void setLocal(int index) │ │ │ │ │ -Set the local index. │ │ │ │ │ -Dune::IndexPair::global │ │ │ │ │ -const GlobalIndex & global() const │ │ │ │ │ -Get the global index. │ │ │ │ │ -Dune::ParallelIndexSet::add │ │ │ │ │ -void add(const GlobalIndex &global, const LocalIndex &local) │ │ │ │ │ -Add an new index to the set. │ │ │ │ │ -Dune::ParallelIndexSet::end │ │ │ │ │ -const_iterator end() const │ │ │ │ │ -Get an iterator over the indices positioned after the last index. │ │ │ │ │ -Dune::ParallelIndexSet::at │ │ │ │ │ -IndexPair & at(const GlobalIndex &global) │ │ │ │ │ -Find the index pair with a specific global id. │ │ │ │ │ -Dune::ParallelIndexSet::ParallelIndexSet │ │ │ │ │ -ParallelIndexSet() │ │ │ │ │ -Constructor. │ │ │ │ │ -Dune::ParallelIndexSet::endResize │ │ │ │ │ -void endResize() │ │ │ │ │ -Indicate that the resizing finishes. │ │ │ │ │ -Dune::GlobalLookupIndexSet::~GlobalLookupIndexSet │ │ │ │ │ -~GlobalLookupIndexSet() │ │ │ │ │ -Destructor. │ │ │ │ │ -Dune::GlobalLookupIndexSet::pair │ │ │ │ │ -const IndexPair * pair(const std::size_t &local) const │ │ │ │ │ -Get the index pair corresponding to a local index. │ │ │ │ │ -Dune::IndexPair::local │ │ │ │ │ -LocalIndex & local() │ │ │ │ │ -Get the local index. │ │ │ │ │ -Dune::GlobalLookupIndexSet::size │ │ │ │ │ -size_t size() const │ │ │ │ │ -Get the total number (public and nonpublic) indices. │ │ │ │ │ -Dune::IndexPair::IndexPair │ │ │ │ │ -IndexPair(const GlobalIndex &global) │ │ │ │ │ -Constructs a new Pair. │ │ │ │ │ -Dune::ParallelIndexSet::GlobalIndex │ │ │ │ │ -TG GlobalIndex │ │ │ │ │ -the type of the global index. This type has to provide at least a operator< for │ │ │ │ │ -sorting. │ │ │ │ │ -Definition: indexset.hh:226 │ │ │ │ │ -Dune::IndexPair::GlobalIndex │ │ │ │ │ -TG GlobalIndex │ │ │ │ │ -the type of the global index. │ │ │ │ │ -Definition: indexset.hh:107 │ │ │ │ │ -Dune::ParallelIndexSet::seqNo │ │ │ │ │ -int seqNo() const │ │ │ │ │ -Get the internal sequence number. │ │ │ │ │ -Dune::ParallelIndexSet::iterator::iterator │ │ │ │ │ -iterator(ParallelIndexSet< TG, TL, N > &indexSet, const Father &father) │ │ │ │ │ -Definition: indexset.hh:262 │ │ │ │ │ -Dune::GlobalLookupIndexSet::GlobalLookupIndexSet │ │ │ │ │ -GlobalLookupIndexSet(const ParallelIndexSet &indexset, std::size_t size) │ │ │ │ │ -Constructor. │ │ │ │ │ -Dune::GlobalLookupIndexSet::GlobalIndex │ │ │ │ │ -ParallelIndexSet::GlobalIndex GlobalIndex │ │ │ │ │ -The type of the global index. │ │ │ │ │ -Definition: indexset.hh:522 │ │ │ │ │ -Dune::ParallelIndexSet::IndexPair │ │ │ │ │ -Dune::IndexPair< GlobalIndex, LocalIndex > IndexPair │ │ │ │ │ -The type of the pair stored. │ │ │ │ │ -Definition: indexset.hh:244 │ │ │ │ │ -Dune::RESIZE │ │ │ │ │ -@ RESIZE │ │ │ │ │ -Indicates that the index set is currently being resized. │ │ │ │ │ -Definition: indexset.hh:190 │ │ │ │ │ -Dune::GROUND │ │ │ │ │ -@ GROUND │ │ │ │ │ -The default mode. Indicates that the index set is ready to be used. │ │ │ │ │ -Definition: indexset.hh:186 │ │ │ │ │ -Dune::DELETED │ │ │ │ │ -@ DELETED │ │ │ │ │ -Definition: localindex.hh:28 │ │ │ │ │ + 41#endif // DUNE_PROMOTIONTRAITS_HH │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::AlignedNumberImpl::max │ │ │ │ │ -auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > │ │ │ │ │ -&b) │ │ │ │ │ -Definition: debugalign.hh:425 │ │ │ │ │ -Dune::ArrayListIterator │ │ │ │ │ -A random access iterator for the Dune::ArrayList class. │ │ │ │ │ -Definition: arraylist.hh:255 │ │ │ │ │ -Dune::ConstArrayListIterator │ │ │ │ │ -A constant random access iterator for the Dune::ArrayList class. │ │ │ │ │ -Definition: arraylist.hh:370 │ │ │ │ │ -Dune::ArrayList │ │ │ │ │ -A dynamically growing random access list. │ │ │ │ │ -Definition: arraylist.hh:62 │ │ │ │ │ -Dune::ArrayList::const_iterator │ │ │ │ │ -ConstArrayListIterator< MemberType, N, A > const_iterator │ │ │ │ │ -A constant random access iterator. │ │ │ │ │ -Definition: arraylist.hh:110 │ │ │ │ │ -Dune::MPITraits │ │ │ │ │ -A traits class describing the mapping of types onto MPI_Datatypes. │ │ │ │ │ -Definition: mpitraits.hh:41 │ │ │ │ │ -Dune::InvalidStateException │ │ │ │ │ -Default exception if a function was called while the object is not in a valid │ │ │ │ │ -state for that function... │ │ │ │ │ -Definition: exceptions.hh:281 │ │ │ │ │ -Dune::RandomAccessIteratorFacade<_ArrayListIterator<_T,_N,_A_>,_A::value_type, │ │ │ │ │ -A::value_type_&,_A::difference_type_>::operator* │ │ │ │ │ -Reference operator*() const │ │ │ │ │ -Dereferencing operator. │ │ │ │ │ -Definition: iteratorfacades.hh:500 │ │ │ │ │ -Dune::IndexPair │ │ │ │ │ -A pair consisting of a global and local index. │ │ │ │ │ -Definition: indexset.hh:85 │ │ │ │ │ -Dune::InvalidIndexSetState │ │ │ │ │ -Exception indicating that the index set is not in the expected state. │ │ │ │ │ -Definition: indexset.hh:205 │ │ │ │ │ -Dune::GlobalLookupIndexSet │ │ │ │ │ -Decorates an index set with the possibility to find a global index that is │ │ │ │ │ -mapped to a specific local... │ │ │ │ │ -Definition: indexset.hh:507 │ │ │ │ │ -Dune::ParallelIndexSet │ │ │ │ │ -Manager class for the mapping between local indices and globally unique │ │ │ │ │ -indices. │ │ │ │ │ -Definition: indexset.hh:218 │ │ │ │ │ -Dune::ParallelIndexSet::iterator │ │ │ │ │ -The iterator over the pairs. │ │ │ │ │ -Definition: indexset.hh:257 │ │ │ │ │ -Dune::LocalIndexComparator │ │ │ │ │ -Definition: indexset.hh:615 │ │ │ │ │ -Dune::IndexSetSortFunctor │ │ │ │ │ -Definition: indexset.hh:624 │ │ │ │ │ +Dune::PromotionTraits │ │ │ │ │ +Compute type of the result of an arithmetic operation involving two different │ │ │ │ │ +number types. │ │ │ │ │ +Definition: promotiontraits.hh:27 │ │ │ │ │ +Dune::PromotionTraits::PromotedType │ │ │ │ │ +decltype(std::declval< T1 >()+std::declval< T2 >()) PromotedType │ │ │ │ │ +Definition: promotiontraits.hh:28 │ │ │ │ │ +Dune::PromotionTraits<_T1,_T1_>::PromotedType │ │ │ │ │ +T1 PromotedType │ │ │ │ │ +Definition: promotiontraits.hh:35 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00038.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: mpicommunication.hh File Reference │ │ │ │ +dune-common: version.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,112 +58,779 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces | │ │ │ │ -Macros | │ │ │ │ -Functions
│ │ │ │ -
mpicommunication.hh File Reference
│ │ │ │ +Macros
│ │ │ │ +
version.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

Implements an utility class that provides MPI's collective communication methods. │ │ │ │ +

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

│ │ │ │ -
#include <algorithm>
│ │ │ │ -#include <functional>
│ │ │ │ -#include <memory>
│ │ │ │ -#include <mpi.h>
│ │ │ │ -#include <dune/common/binaryfunctions.hh>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/common/parallel/communication.hh>
│ │ │ │ -#include <dune/common/parallel/mpitraits.hh>
│ │ │ │ -#include <dune/common/parallel/mpifuture.hh>
│ │ │ │ -#include <dune/common/parallel/mpidata.hh>
│ │ │ │ -
│ │ │ │ + │ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::Generic_MPI_Op< Type, BinaryFunction, Enable >
 
class  Dune::Communication< MPI_Comm >
 Specialization of Communication for MPI. More...
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Namespaces

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

│ │ │ │ Macros

#define ComposeMPIOp(func, op)
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Functions

 Dune::ComposeMPIOp (std::plus, MPI_SUM)
 
 Dune::ComposeMPIOp (std::multiplies, MPI_PROD)
 
 Dune::ComposeMPIOp (Min, MPI_MIN)
 
 Dune::ComposeMPIOp (Max, MPI_MAX)
 
#define DUNE_VERSION_JOIN(module, type)   module ## _VERSION_ ## type
 Constructs the preprocessor name used in config.h to hold version numbers. More...
 
#define DUNE_VERSION_EQUAL(module, major, minor)
 True if 'module' has the version major.minor. More...
 
#define DUNE_VERSION_EQUAL_REV(module, major, minor, revision)
 True if 'module' has the version major.minor.revision. More...
 
#define DUNE_VERSION_GTE(module, major, minor)
 True if 'module' has the version major.minor or greater. More...
 
#define DUNE_VERSION_LT(module, major, minor)    ! DUNE_VERSION_GTE(module,major,minor)
 True if 'module' has a version less than major.minor. More...
 
#define DUNE_VERSION_NEWER(module, major, minor)    DUNE_VERSION_GTE(module,major,minor)
 True if 'module' has the version major.minor or newer. More...
 
#define DUNE_VERSION_GT(module, major, minor)
 True if 'module' has a version greater than major.minor. More...
 
#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. More...
 
#define DUNE_VERSION_GTE_REV(module, major, minor, revision)
 True if 'module' has the version major.minor.revision or greater. More...
 
#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. More...
 
#define DUNE_VERSION_NEWER_REV(module, major, minor, revision)    DUNE_VERSION_GTE_REV(module,major,minor,revision)
 True if 'module' has the version major.minor.revision or newer. More...
 
#define DUNE_VERSION_GT_REV(module, major, minor, revision)
 True if 'module' has a greater version than major.minor.revision. More...
 
#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. More...
 
#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. More...
 
#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. More...
 
│ │ │ │

Detailed Description

│ │ │ │ -

Implements an utility class that provides MPI's collective communication methods.

│ │ │ │ +

Various macros to work with Dune module version numbers.

│ │ │ │

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ ComposeMPIOp

│ │ │ │ + │ │ │ │ +

◆ 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:28
│ │ │ │ +
│ │ │ │ +

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:44
│ │ │ │ +
│ │ │ │ +

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 ComposeMPIOp#define DUNE_VERSION_GTE_REV( func, module,
 op major,
 minor,
 revision 
)
│ │ │ │
│ │ │ │ -Value:
template<class T, class S> \
│ │ │ │ -
class Generic_MPI_Op<T, func<S>, std::enable_if_t<MPITraits<S>::is_intrinsic> >{ \
│ │ │ │ -
public: \
│ │ │ │ -
static MPI_Op get(){ \
│ │ │ │ -
return op; \
│ │ │ │ -
} \
│ │ │ │ -
private: \
│ │ │ │ -
Generic_MPI_Op () {} \
│ │ │ │ -
Generic_MPI_Op (const Generic_MPI_Op & ) {} \
│ │ │ │ -
}
│ │ │ │ -
Reference get(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const Key &key)
Definition: propertymap.hh:84
│ │ │ │ +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.

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_VERSION_NEWER

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_VERSION_NEWER( module,
 major,
 minor 
)    DUNE_VERSION_GTE(module,major,minor)
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

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

│ │ │ │ +
Note
Deprecated, use DUNE_VERSION_GTE instead.
│ │ │ │ +

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_NEWER_REV

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_VERSION_NEWER_REV( module,
 major,
 minor,
 revision 
)    DUNE_VERSION_GTE_REV(module,major,minor,revision)
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

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

│ │ │ │ +
Note
Deprecated, use DUNE_VERSION_GTE_REV instead.
│ │ │ │ +

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 {} │ │ │ │ │ @@ -4,73 +4,346 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -Classes | Namespaces | Macros | Functions │ │ │ │ │ -mpicommunication.hh File Reference │ │ │ │ │ -Common » Parallel_Communication │ │ │ │ │ -Implements an utility class that provides MPI's collective communication │ │ │ │ │ -methods. More... │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Macros │ │ │ │ │ +version.hh File Reference │ │ │ │ │ +Various macros to work with Dune module version numbers. More... │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ - Classes │ │ │ │ │ -class  Dune::Generic_MPI_Op<_Type,_BinaryFunction,_Enable_> │ │ │ │ │ + Macros │ │ │ │ │ +#define DUNE_VERSION_JOIN(module, type)   module ## _VERSION_ ## type │ │ │ │ │ +  Constructs the preprocessor name used in config.h to hold version numbers. │ │ │ │ │ + More... │ │ │ │ │   │ │ │ │ │ -class  Dune::Communication<_MPI_Comm_> │ │ │ │ │ -  Specialization of Communication for MPI. More... │ │ │ │ │ +#define DUNE_VERSION_EQUAL(module, major, minor) │ │ │ │ │ +  True if 'module' has the version major.minor. More... │ │ │ │ │   │ │ │ │ │ - Namespaces │ │ │ │ │ -namespace  Dune │ │ │ │ │ -  Dune namespace. │ │ │ │ │ +#define DUNE_VERSION_EQUAL_REV(module, major, minor, revision) │ │ │ │ │ +  True if 'module' has the version major.minor.revision. More... │ │ │ │ │   │ │ │ │ │ - Macros │ │ │ │ │ -#define ComposeMPIOp(func, op) │ │ │ │ │ +#define DUNE_VERSION_GTE(module, major, minor) │ │ │ │ │ +  True if 'module' has the version major.minor or greater. More... │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_VERSION_LT(module, major, minor)    ! DUNE_VERSION_GTE(module,major,minor) │ │ │ │ │ +  True if 'module' has a version less than major.minor. More... │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_VERSION_NEWER(module, major, minor)    DUNE_VERSION_GTE(module,major,minor) │ │ │ │ │ +  True if 'module' has the version major.minor or newer. More... │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_VERSION_GT(module, major, minor) │ │ │ │ │ +  True if 'module' has a version greater than major.minor. More... │ │ │ │ │ +  │ │ │ │ │ +#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. More... │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_VERSION_GTE_REV(module, major, minor, revision) │ │ │ │ │ +  True if 'module' has the version major.minor.revision or greater. More... │ │ │ │ │ +  │ │ │ │ │ +#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. More... │ │ │ │ │   │ │ │ │ │ - Functions │ │ │ │ │ - Dune::ComposeMPIOp (std::plus, MPI_SUM) │ │ │ │ │ +#define DUNE_VERSION_NEWER_REV(module, major, minor, revision)    DUNE_VERSION_GTE_REV │ │ │ │ │ + (module,major,minor,revision) │ │ │ │ │ +  True if 'module' has the version major.minor.revision or newer. More... │ │ │ │ │   │ │ │ │ │ - Dune::ComposeMPIOp (std::multiplies, MPI_PROD) │ │ │ │ │ +#define DUNE_VERSION_GT_REV(module, major, minor, revision) │ │ │ │ │ +  True if 'module' has a greater version than major.minor.revision. More... │ │ │ │ │   │ │ │ │ │ - Dune::ComposeMPIOp (Min, MPI_MIN) │ │ │ │ │ +#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. More... │ │ │ │ │   │ │ │ │ │ - Dune::ComposeMPIOp (Max, MPI_MAX) │ │ │ │ │ +#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. More... │ │ │ │ │ +  │ │ │ │ │ +#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. More... │ │ │ │ │   │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -Implements an utility class that provides MPI's collective communication │ │ │ │ │ -methods. │ │ │ │ │ +Various macros to work with Dune module version numbers. │ │ │ │ │ ***** Macro Definition Documentation ***** │ │ │ │ │ -***** ◆ ComposeMPIOp ***** │ │ │ │ │ -#define ComposeMPIOp (  func, │ │ │ │ │ -  op  │ │ │ │ │ - ) │ │ │ │ │ -Value: │ │ │ │ │ -template \ │ │ │ │ │ -class Generic_MPI_Op, std::enable_if_t::is_intrinsic> > │ │ │ │ │ -{ \ │ │ │ │ │ -public: \ │ │ │ │ │ -static MPI_Op get(){ \ │ │ │ │ │ -return op; \ │ │ │ │ │ -} \ │ │ │ │ │ -private: \ │ │ │ │ │ -Generic_MPI_Op () {} \ │ │ │ │ │ -Generic_MPI_Op (const Generic_MPI_Op & ) {} \ │ │ │ │ │ -} │ │ │ │ │ -Dune::get │ │ │ │ │ -Reference get(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const │ │ │ │ │ -Key &key) │ │ │ │ │ -Definition: propertymap.hh:84 │ │ │ │ │ +***** ◆ DUNE_MODULE_VERSION_ID ***** │ │ │ │ │ +#define (  module )     DUNE_VERSION_ID( DUNE_VERSION_JOIN(module,MAJOR), DUNE_VERSION_JOIN │ │ │ │ │ +DUNE_MODULE_VERSION_ID (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)) │ │ │ │ │ +DUNE_VERSION_JOIN │ │ │ │ │ +#define DUNE_VERSION_JOIN(module, type) │ │ │ │ │ +Constructs the preprocessor name used in config.h to hold version numbers. │ │ │ │ │ +Definition: version.hh:28 │ │ │ │ │ +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)) │ │ │ │ │ +DUNE_VERSION_EQUAL │ │ │ │ │ +#define DUNE_VERSION_EQUAL(module, major, minor) │ │ │ │ │ +True if 'module' has the version major.minor. │ │ │ │ │ +Definition: version.hh:44 │ │ │ │ │ +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 (  major, │ │ │ │ │ +DUNE_VERSION_ID │ │ │ │ │ +  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 │ │ │ │ │ + module The name of the Dune module │ │ │ │ │ + type The 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. │ │ │ │ │ +***** ◆ DUNE_VERSION_NEWER ***** │ │ │ │ │ +#define DUNE_VERSION_NEWER (  module, │ │ │ │ │ +  major, │ │ │ │ │ +  minor  │ │ │ │ │ + )     DUNE_VERSION_GTE(module,major,minor) │ │ │ │ │ +True if 'module' has the version major.minor or newer. │ │ │ │ │ + Note │ │ │ │ │ + Deprecated, use DUNE_VERSION_GTE instead. │ │ │ │ │ +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_NEWER_REV ***** │ │ │ │ │ +#define DUNE_VERSION_NEWER_REV (  module, │ │ │ │ │ +  major, │ │ │ │ │ +  minor, │ │ │ │ │ +  revision  │ │ │ │ │ + )     DUNE_VERSION_GTE_REV │ │ │ │ │ + (module,major,minor,revision) │ │ │ │ │ +True if 'module' has the version major.minor.revision or newer. │ │ │ │ │ + Note │ │ │ │ │ + Deprecated, use DUNE_VERSION_GTE_REV instead. │ │ │ │ │ +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 [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00038_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: mpicommunication.hh Source File │ │ │ │ +dune-common: version.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,501 +58,83 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
mpicommunication.hh
│ │ │ │ +
version.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 (C) 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_PARALLEL_MPICOMMUNICATION_HH
│ │ │ │ -
6#define DUNE_COMMON_PARALLEL_MPICOMMUNICATION_HH
│ │ │ │ +
5#ifndef DUNE_VERSION_HH
│ │ │ │ +
6#define DUNE_VERSION_HH
│ │ │ │
7
│ │ │ │ -
16#if HAVE_MPI
│ │ │ │ -
17
│ │ │ │ -
18#include <algorithm>
│ │ │ │ -
19#include <functional>
│ │ │ │ -
20#include <memory>
│ │ │ │ -
21
│ │ │ │ -
22#include <mpi.h>
│ │ │ │ -
23
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
30
│ │ │ │ -
31namespace Dune
│ │ │ │ -
32{
│ │ │ │ -
33
│ │ │ │ -
34 //=======================================================
│ │ │ │ -
35 // use singleton pattern and template specialization to
│ │ │ │ -
36 // generate MPI operations
│ │ │ │ -
37 //=======================================================
│ │ │ │ -
38
│ │ │ │ -
39 template<typename Type, typename BinaryFunction, typename Enable=void>
│ │ │ │ - │ │ │ │ -
41 {
│ │ │ │ -
42
│ │ │ │ -
43 public:
│ │ │ │ -
44 static MPI_Op get ()
│ │ │ │ -
45 {
│ │ │ │ -
46 if (!op)
│ │ │ │ -
47 {
│ │ │ │ -
48 op = std::make_unique<MPI_Op>();
│ │ │ │ -
49 // The following line leaks an MPI operation object, because the corresponding
│ │ │ │ -
50 //`MPI_Op_free` is never called. It is never called because there is no easy
│ │ │ │ -
51 // way to call it at the right moment: right before the call to MPI_Finalize.
│ │ │ │ -
52 // See https://gitlab.dune-project.org/core/dune-istl/issues/80
│ │ │ │ -
53 MPI_Op_create((void (*)(void*, void*, int*, MPI_Datatype*))&operation,true,op.get());
│ │ │ │ -
54 }
│ │ │ │ -
55 return *op;
│ │ │ │ -
56 }
│ │ │ │ -
57 private:
│ │ │ │ -
58 static void operation (Type *in, Type *inout, int *len, MPI_Datatype*)
│ │ │ │ -
59 {
│ │ │ │ -
60 BinaryFunction func;
│ │ │ │ -
61
│ │ │ │ -
62 for (int i=0; i< *len; ++i, ++in, ++inout) {
│ │ │ │ -
63 Type temp;
│ │ │ │ -
64 temp = func(*in, *inout);
│ │ │ │ -
65 *inout = temp;
│ │ │ │ -
66 }
│ │ │ │ -
67 }
│ │ │ │ -
68 Generic_MPI_Op () {}
│ │ │ │ -
69 Generic_MPI_Op (const Generic_MPI_Op& ) {}
│ │ │ │ -
70 static std::unique_ptr<MPI_Op> op;
│ │ │ │ -
71 };
│ │ │ │ -
72
│ │ │ │ -
73
│ │ │ │ -
74 template<typename Type, typename BinaryFunction, typename Enable>
│ │ │ │ -
75 std::unique_ptr<MPI_Op> Generic_MPI_Op<Type,BinaryFunction, Enable>::op;
│ │ │ │ -
76
│ │ │ │ -
77#define ComposeMPIOp(func,op) \
│ │ │ │ -
78 template<class T, class S> \
│ │ │ │ -
79 class Generic_MPI_Op<T, func<S>, std::enable_if_t<MPITraits<S>::is_intrinsic> >{ \
│ │ │ │ -
80 public: \
│ │ │ │ -
81 static MPI_Op get(){ \
│ │ │ │ -
82 return op; \
│ │ │ │ -
83 } \
│ │ │ │ -
84 private: \
│ │ │ │ -
85 Generic_MPI_Op () {} \
│ │ │ │ -
86 Generic_MPI_Op (const Generic_MPI_Op & ) {} \
│ │ │ │ -
87 }
│ │ │ │ -
88
│ │ │ │ -
89
│ │ │ │ -
90 ComposeMPIOp(std::plus, MPI_SUM);
│ │ │ │ -
91 ComposeMPIOp(std::multiplies, MPI_PROD);
│ │ │ │ -
92 ComposeMPIOp(Min, MPI_MIN);
│ │ │ │ -
93 ComposeMPIOp(Max, MPI_MAX);
│ │ │ │ -
94
│ │ │ │ -
95#undef ComposeMPIOp
│ │ │ │ -
96
│ │ │ │ -
97
│ │ │ │ -
98 //=======================================================
│ │ │ │ -
99 // use singleton pattern and template specialization to
│ │ │ │ -
100 // generate MPI operations
│ │ │ │ -
101 //=======================================================
│ │ │ │ -
102
│ │ │ │ -
106 template<>
│ │ │ │ -
107 class Communication<MPI_Comm>
│ │ │ │ -
108 {
│ │ │ │ -
109 public:
│ │ │ │ -
111 Communication (const MPI_Comm& c = MPI_COMM_WORLD)
│ │ │ │ -
112 : communicator(c)
│ │ │ │ -
113 {
│ │ │ │ -
114 if(communicator!=MPI_COMM_NULL) {
│ │ │ │ -
115 int initialized = 0;
│ │ │ │ -
116 MPI_Initialized(&initialized);
│ │ │ │ -
117 if (!initialized)
│ │ │ │ -
118 DUNE_THROW(ParallelError,"You must call MPIHelper::instance(argc,argv) in your main() function before using the MPI Communication!");
│ │ │ │ -
119 MPI_Comm_rank(communicator,&me);
│ │ │ │ -
120 MPI_Comm_size(communicator,&procs);
│ │ │ │ -
121 }else{
│ │ │ │ -
122 procs=0;
│ │ │ │ -
123 me=-1;
│ │ │ │ -
124 }
│ │ │ │ -
125 }
│ │ │ │ -
126
│ │ │ │ -
128 int rank () const
│ │ │ │ -
129 {
│ │ │ │ -
130 return me;
│ │ │ │ -
131 }
│ │ │ │ -
132
│ │ │ │ -
134 int size () const
│ │ │ │ -
135 {
│ │ │ │ -
136 return procs;
│ │ │ │ -
137 }
│ │ │ │ -
138
│ │ │ │ -
140 template<class T>
│ │ │ │ -
141 int send(const T& data, int dest_rank, int tag) const
│ │ │ │ -
142 {
│ │ │ │ -
143 auto mpi_data = getMPIData(data);
│ │ │ │ -
144 return MPI_Send(mpi_data.ptr(), mpi_data.size(), mpi_data.type(),
│ │ │ │ -
145 dest_rank, tag, communicator);
│ │ │ │ -
146 }
│ │ │ │ -
147
│ │ │ │ -
149 template<class T>
│ │ │ │ -
150 MPIFuture<const T> isend(const T&& data, int dest_rank, int tag) const
│ │ │ │ -
151 {
│ │ │ │ -
152 MPIFuture<const T> future(std::forward<const T>(data));
│ │ │ │ -
153 auto mpidata = future.get_mpidata();
│ │ │ │ -
154 MPI_Isend(mpidata.ptr(), mpidata.size(), mpidata.type(),
│ │ │ │ -
155 dest_rank, tag, communicator, &future.req_);
│ │ │ │ -
156 return future;
│ │ │ │ -
157 }
│ │ │ │ -
158
│ │ │ │ -
160 template<class T>
│ │ │ │ -
161 T recv(T&& data, int source_rank, int tag, MPI_Status* status = MPI_STATUS_IGNORE) const
│ │ │ │ -
162 {
│ │ │ │ -
163 T lvalue_data(std::forward<T>(data));
│ │ │ │ -
164 auto mpi_data = getMPIData(lvalue_data);
│ │ │ │ -
165 MPI_Recv(mpi_data.ptr(), mpi_data.size(), mpi_data.type(),
│ │ │ │ -
166 source_rank, tag, communicator, status);
│ │ │ │ -
167 return lvalue_data;
│ │ │ │ -
168 }
│ │ │ │ -
169
│ │ │ │ -
171 template<class T>
│ │ │ │ -
172 MPIFuture<T> irecv(T&& data, int source_rank, int tag) const
│ │ │ │ -
173 {
│ │ │ │ -
174 MPIFuture<T> future(std::forward<T>(data));
│ │ │ │ -
175 auto mpidata = future.get_mpidata();
│ │ │ │ -
176 MPI_Irecv(mpidata.ptr(), mpidata.size(), mpidata.type(),
│ │ │ │ -
177 source_rank, tag, communicator, &future.req_);
│ │ │ │ -
178 return future;
│ │ │ │ -
179 }
│ │ │ │ -
180
│ │ │ │ -
181 template<class T>
│ │ │ │ -
182 T rrecv(T&& data, int source_rank, int tag, MPI_Status* status = MPI_STATUS_IGNORE) const
│ │ │ │ -
183 {
│ │ │ │ -
184 MPI_Status _status;
│ │ │ │ -
185 MPI_Message _message;
│ │ │ │ -
186 T lvalue_data(std::forward<T>(data));
│ │ │ │ -
187 auto mpi_data = getMPIData(lvalue_data);
│ │ │ │ -
188 static_assert(!mpi_data.static_size, "rrecv work only for non-static-sized types.");
│ │ │ │ -
189 if(status == MPI_STATUS_IGNORE)
│ │ │ │ -
190 status = &_status;
│ │ │ │ -
191 MPI_Mprobe(source_rank, tag, communicator, &_message, status);
│ │ │ │ -
192 int size;
│ │ │ │ -
193 MPI_Get_count(status, mpi_data.type(), &size);
│ │ │ │ -
194 mpi_data.resize(size);
│ │ │ │ -
195 MPI_Mrecv(mpi_data.ptr(), mpi_data.size(), mpi_data.type(), &_message, status);
│ │ │ │ -
196 return lvalue_data;
│ │ │ │ -
197 }
│ │ │ │ -
198
│ │ │ │ -
200 template<typename T>
│ │ │ │ -
201 T sum (const T& in) const
│ │ │ │ -
202 {
│ │ │ │ -
203 T out;
│ │ │ │ -
204 allreduce<std::plus<T> >(&in,&out,1);
│ │ │ │ -
205 return out;
│ │ │ │ -
206 }
│ │ │ │ -
207
│ │ │ │ -
209 template<typename T>
│ │ │ │ -
210 int sum (T* inout, int len) const
│ │ │ │ -
211 {
│ │ │ │ -
212 return allreduce<std::plus<T> >(inout,len);
│ │ │ │ -
213 }
│ │ │ │ -
214
│ │ │ │ -
216 template<typename T>
│ │ │ │ -
217 T prod (const T& in) const
│ │ │ │ -
218 {
│ │ │ │ -
219 T out;
│ │ │ │ -
220 allreduce<std::multiplies<T> >(&in,&out,1);
│ │ │ │ -
221 return out;
│ │ │ │ -
222 }
│ │ │ │ -
223
│ │ │ │ -
225 template<typename T>
│ │ │ │ -
226 int prod (T* inout, int len) const
│ │ │ │ -
227 {
│ │ │ │ -
228 return allreduce<std::multiplies<T> >(inout,len);
│ │ │ │ -
229 }
│ │ │ │ -
230
│ │ │ │ -
232 template<typename T>
│ │ │ │ -
233 T min (const T& in) const
│ │ │ │ -
234 {
│ │ │ │ -
235 T out;
│ │ │ │ -
236 allreduce<Min<T> >(&in,&out,1);
│ │ │ │ -
237 return out;
│ │ │ │ -
238 }
│ │ │ │ -
239
│ │ │ │ -
241 template<typename T>
│ │ │ │ -
242 int min (T* inout, int len) const
│ │ │ │ -
243 {
│ │ │ │ -
244 return allreduce<Min<T> >(inout,len);
│ │ │ │ -
245 }
│ │ │ │ -
246
│ │ │ │ -
247
│ │ │ │ -
249 template<typename T>
│ │ │ │ -
250 T max (const T& in) const
│ │ │ │ -
251 {
│ │ │ │ -
252 T out;
│ │ │ │ -
253 allreduce<Max<T> >(&in,&out,1);
│ │ │ │ -
254 return out;
│ │ │ │ -
255 }
│ │ │ │ -
256
│ │ │ │ -
258 template<typename T>
│ │ │ │ -
259 int max (T* inout, int len) const
│ │ │ │ -
260 {
│ │ │ │ -
261 return allreduce<Max<T> >(inout,len);
│ │ │ │ -
262 }
│ │ │ │ -
263
│ │ │ │ -
265 int barrier () const
│ │ │ │ -
266 {
│ │ │ │ -
267 return MPI_Barrier(communicator);
│ │ │ │ -
268 }
│ │ │ │ -
269
│ │ │ │ - │ │ │ │ -
272 {
│ │ │ │ -
273 MPIFuture<void> future(true); // make a valid MPIFuture<void>
│ │ │ │ -
274 MPI_Ibarrier(communicator, &future.req_);
│ │ │ │ -
275 return future;
│ │ │ │ -
276 }
│ │ │ │ -
277
│ │ │ │ -
278
│ │ │ │ -
280 template<typename T>
│ │ │ │ -
281 int broadcast (T* inout, int len, int root) const
│ │ │ │ -
282 {
│ │ │ │ -
283 return MPI_Bcast(inout,len,MPITraits<T>::getType(),root,communicator);
│ │ │ │ -
284 }
│ │ │ │ -
285
│ │ │ │ -
287 template<class T>
│ │ │ │ -
288 MPIFuture<T> ibroadcast(T&& data, int root) const{
│ │ │ │ -
289 MPIFuture<T> future(std::forward<T>(data));
│ │ │ │ -
290 auto mpidata = future.get_mpidata();
│ │ │ │ -
291 MPI_Ibcast(mpidata.ptr(),
│ │ │ │ -
292 mpidata.size(),
│ │ │ │ -
293 mpidata.type(),
│ │ │ │ -
294 root,
│ │ │ │ -
295 communicator,
│ │ │ │ -
296 &future.req_);
│ │ │ │ -
297 return future;
│ │ │ │ -
298 }
│ │ │ │ -
299
│ │ │ │ -
302 template<typename T>
│ │ │ │ -
303 int gather (const T* in, T* out, int len, int root) const
│ │ │ │ -
304 {
│ │ │ │ -
305 return MPI_Gather(const_cast<T*>(in),len,MPITraits<T>::getType(),
│ │ │ │ -
306 out,len,MPITraits<T>::getType(),
│ │ │ │ -
307 root,communicator);
│ │ │ │ -
308 }
│ │ │ │ -
309
│ │ │ │ -
311 template<class TIN, class TOUT = std::vector<TIN>>
│ │ │ │ -
312 MPIFuture<TOUT, TIN> igather(TIN&& data_in, TOUT&& data_out, int root) const{
│ │ │ │ -
313 MPIFuture<TOUT, TIN> future(std::forward<TOUT>(data_out), std::forward<TIN>(data_in));
│ │ │ │ -
314 auto mpidata_in = future.get_send_mpidata();
│ │ │ │ -
315 auto mpidata_out = future.get_mpidata();
│ │ │ │ -
316 assert(root != me || mpidata_in.size()*procs <= mpidata_out.size());
│ │ │ │ -
317 int outlen = (me==root) * mpidata_in.size();
│ │ │ │ -
318 MPI_Igather(mpidata_in.ptr(), mpidata_in.size(), mpidata_in.type(),
│ │ │ │ -
319 mpidata_out.ptr(), outlen, mpidata_out.type(),
│ │ │ │ -
320 root, communicator, &future.req_);
│ │ │ │ -
321 return future;
│ │ │ │ -
322 }
│ │ │ │ -
323
│ │ │ │ -
325 template<typename T>
│ │ │ │ -
326 int gatherv (const T* in, int sendDataLen, T* out, int* recvDataLen, int* displ, int root) const
│ │ │ │ -
327 {
│ │ │ │ -
328 return MPI_Gatherv(const_cast<T*>(in),sendDataLen,MPITraits<T>::getType(),
│ │ │ │ -
329 out,recvDataLen,displ,MPITraits<T>::getType(),
│ │ │ │ -
330 root,communicator);
│ │ │ │ -
331 }
│ │ │ │ -
332
│ │ │ │ -
335 template<typename T>
│ │ │ │ -
336 int scatter (const T* sendData, T* recvData, int len, int root) const
│ │ │ │ -
337 {
│ │ │ │ -
338 return MPI_Scatter(const_cast<T*>(sendData),len,MPITraits<T>::getType(),
│ │ │ │ -
339 recvData,len,MPITraits<T>::getType(),
│ │ │ │ -
340 root,communicator);
│ │ │ │ -
341 }
│ │ │ │ -
342
│ │ │ │ -
344 template<class TIN, class TOUT = TIN>
│ │ │ │ -
345 MPIFuture<TOUT, TIN> iscatter(TIN&& data_in, TOUT&& data_out, int root) const
│ │ │ │ -
346 {
│ │ │ │ -
347 MPIFuture<TOUT, TIN> future(std::forward<TOUT>(data_out), std::forward<TIN>(data_in));
│ │ │ │ -
348 auto mpidata_in = future.get_send_mpidata();
│ │ │ │ -
349 auto mpidata_out = future.get_mpidata();
│ │ │ │ -
350 int inlen = (me==root) * mpidata_in.size()/procs;
│ │ │ │ -
351 MPI_Iscatter(mpidata_in.ptr(), inlen, mpidata_in.type(),
│ │ │ │ -
352 mpidata_out.ptr(), mpidata_out.size(), mpidata_out.type(),
│ │ │ │ -
353 root, communicator, &future.req_);
│ │ │ │ -
354 return future;
│ │ │ │ -
355 }
│ │ │ │ -
356
│ │ │ │ -
358 template<typename T>
│ │ │ │ -
359 int scatterv (const T* sendData, int* sendDataLen, int* displ, T* recvData, int recvDataLen, int root) const
│ │ │ │ -
360 {
│ │ │ │ -
361 return MPI_Scatterv(const_cast<T*>(sendData),sendDataLen,displ,MPITraits<T>::getType(),
│ │ │ │ -
362 recvData,recvDataLen,MPITraits<T>::getType(),
│ │ │ │ -
363 root,communicator);
│ │ │ │ -
364 }
│ │ │ │ -
365
│ │ │ │ -
366
│ │ │ │ -
367 operator MPI_Comm () const
│ │ │ │ -
368 {
│ │ │ │ -
369 return communicator;
│ │ │ │ -
370 }
│ │ │ │ -
371
│ │ │ │ -
373 template<typename T, typename T1>
│ │ │ │ -
374 int allgather(const T* sbuf, int count, T1* rbuf) const
│ │ │ │ -
375 {
│ │ │ │ -
376 return MPI_Allgather(const_cast<T*>(sbuf), count, MPITraits<T>::getType(),
│ │ │ │ -
377 rbuf, count, MPITraits<T1>::getType(),
│ │ │ │ -
378 communicator);
│ │ │ │ -
379 }
│ │ │ │ -
380
│ │ │ │ -
382 template<class TIN, class TOUT = TIN>
│ │ │ │ -
383 MPIFuture<TOUT, TIN> iallgather(TIN&& data_in, TOUT&& data_out) const
│ │ │ │ -
384 {
│ │ │ │ -
385 MPIFuture<TOUT, TIN> future(std::forward<TOUT>(data_out), std::forward<TIN>(data_in));
│ │ │ │ -
386 auto mpidata_in = future.get_send_mpidata();
│ │ │ │ -
387 auto mpidata_out = future.get_mpidata();
│ │ │ │ -
388 assert(mpidata_in.size()*procs <= mpidata_out.size());
│ │ │ │ -
389 int outlen = mpidata_in.size();
│ │ │ │ -
390 MPI_Iallgather(mpidata_in.ptr(), mpidata_in.size(), mpidata_in.type(),
│ │ │ │ -
391 mpidata_out.ptr(), outlen, mpidata_out.type(),
│ │ │ │ -
392 communicator, &future.req_);
│ │ │ │ -
393 return future;
│ │ │ │ -
394 }
│ │ │ │ -
395
│ │ │ │ -
397 template<typename T>
│ │ │ │ -
398 int allgatherv (const T* in, int sendDataLen, T* out, int* recvDataLen, int* displ) const
│ │ │ │ -
399 {
│ │ │ │ -
400 return MPI_Allgatherv(const_cast<T*>(in),sendDataLen,MPITraits<T>::getType(),
│ │ │ │ -
401 out,recvDataLen,displ,MPITraits<T>::getType(),
│ │ │ │ -
402 communicator);
│ │ │ │ -
403 }
│ │ │ │ -
404
│ │ │ │ -
406 template<typename BinaryFunction, typename Type>
│ │ │ │ -
407 int allreduce(Type* inout, int len) const
│ │ │ │ -
408 {
│ │ │ │ -
409 Type* out = new Type[len];
│ │ │ │ -
410 int ret = allreduce<BinaryFunction>(inout,out,len);
│ │ │ │ -
411 std::copy(out, out+len, inout);
│ │ │ │ -
412 delete[] out;
│ │ │ │ -
413 return ret;
│ │ │ │ -
414 }
│ │ │ │ -
415
│ │ │ │ -
416 template<typename BinaryFunction, typename Type>
│ │ │ │ -
417 Type allreduce(Type&& in) const{
│ │ │ │ -
418 Type lvalue_data = std::forward<Type>(in);
│ │ │ │ -
419 auto data = getMPIData(lvalue_data);
│ │ │ │ -
420 MPI_Allreduce(MPI_IN_PLACE, data.ptr(), data.size(), data.type(),
│ │ │ │ - │ │ │ │ -
422 communicator);
│ │ │ │ -
423 return lvalue_data;
│ │ │ │ -
424 }
│ │ │ │ -
425
│ │ │ │ -
427 template<class BinaryFunction, class TIN, class TOUT = TIN>
│ │ │ │ -
428 MPIFuture<TOUT, TIN> iallreduce(TIN&& data_in, TOUT&& data_out) const {
│ │ │ │ -
429 MPIFuture<TOUT, TIN> future(std::forward<TOUT>(data_out), std::forward<TIN>(data_in));
│ │ │ │ -
430 auto mpidata_in = future.get_send_mpidata();
│ │ │ │ -
431 auto mpidata_out = future.get_mpidata();
│ │ │ │ -
432 assert(mpidata_out.size() == mpidata_in.size());
│ │ │ │ -
433 assert(mpidata_out.type() == mpidata_in.type());
│ │ │ │ -
434 MPI_Iallreduce(mpidata_in.ptr(), mpidata_out.ptr(),
│ │ │ │ -
435 mpidata_out.size(), mpidata_out.type(),
│ │ │ │ - │ │ │ │ -
437 communicator, &future.req_);
│ │ │ │ -
438 return future;
│ │ │ │ -
439 }
│ │ │ │ -
440
│ │ │ │ -
442 template<class BinaryFunction, class T>
│ │ │ │ -
443 MPIFuture<T> iallreduce(T&& data) const{
│ │ │ │ -
444 MPIFuture<T> future(std::forward<T>(data));
│ │ │ │ -
445 auto mpidata = future.get_mpidata();
│ │ │ │ -
446 MPI_Iallreduce(MPI_IN_PLACE, mpidata.ptr(),
│ │ │ │ -
447 mpidata.size(), mpidata.type(),
│ │ │ │ - │ │ │ │ -
449 communicator, &future.req_);
│ │ │ │ -
450 return future;
│ │ │ │ -
451 }
│ │ │ │ -
452
│ │ │ │ -
454 template<typename BinaryFunction, typename Type>
│ │ │ │ -
455 int allreduce(const Type* in, Type* out, int len) const
│ │ │ │ -
456 {
│ │ │ │ -
457 return MPI_Allreduce(const_cast<Type*>(in), out, len, MPITraits<Type>::getType(),
│ │ │ │ - │ │ │ │ -
459 }
│ │ │ │ -
460
│ │ │ │ -
461 private:
│ │ │ │ -
462 MPI_Comm communicator;
│ │ │ │ -
463 int me;
│ │ │ │ -
464 int procs;
│ │ │ │ -
465 };
│ │ │ │ -
466} // namespace dune
│ │ │ │ -
467
│ │ │ │ -
468#endif // HAVE_MPI
│ │ │ │ -
469
│ │ │ │ -
470#endif
│ │ │ │ -
Implements an utility class that provides collective communication methods for sequential programs.
│ │ │ │ -
Traits classes for mapping types onto MPI_Datatype.
│ │ │ │ -
Interface class to translate objects to a MPI_Datatype, void* and size used for MPI calls.
│ │ │ │ - │ │ │ │ -
A few common exception classes.
│ │ │ │ -
helper classes to provide unique types for standard functions
│ │ │ │ -
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
│ │ │ │ -
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
ComposeMPIOp(std::plus, MPI_SUM)
│ │ │ │ -
auto getMPIData(T &t)
Definition: mpidata.hh:43
│ │ │ │ -
A traits class describing the mapping of types onto MPI_Datatypes.
Definition: mpitraits.hh:41
│ │ │ │ -
Definition: binaryfunctions.hh:18
│ │ │ │ -
Definition: binaryfunctions.hh:34
│ │ │ │ -
Default exception if an error in the parallel communication of the program occurred.
Definition: exceptions.hh:287
│ │ │ │ -
Collective communication interface and sequential default implementation.
Definition: communication.hh:100
│ │ │ │ -
int size() const
Number of processes in set, is greater than 0.
Definition: communication.hh:126
│ │ │ │ -
Definition: mpicommunication.hh:41
│ │ │ │ -
static MPI_Op get()
Definition: mpicommunication.hh:44
│ │ │ │ -
int max(T *inout, int len) const
Compute the maximum of the argument over all processes and return the result in every process....
Definition: mpicommunication.hh:259
│ │ │ │ -
int allgatherv(const T *in, int sendDataLen, T *out, int *recvDataLen, int *displ) const
Gathers data of variable length from all tasks and distribute it to all.
Definition: mpicommunication.hh:398
│ │ │ │ -
T max(const T &in) const
Compute the maximum of the argument over all processes and return the result in every process....
Definition: mpicommunication.hh:250
│ │ │ │ -
MPIFuture< T > ibroadcast(T &&data, int root) const
Distribute an array from the process with rank root to all other processes nonblocking.
Definition: mpicommunication.hh:288
│ │ │ │ -
MPIFuture< void > ibarrier() const
Nonblocking barrier.
Definition: mpicommunication.hh:271
│ │ │ │ -
MPIFuture< const T > isend(const T &&data, int dest_rank, int tag) const
Sends the data to the dest_rank nonblocking.
Definition: mpicommunication.hh:150
│ │ │ │ -
T recv(T &&data, int source_rank, int tag, MPI_Status *status=MPI_STATUS_IGNORE) const
Receives the data from the source_rank.
Definition: mpicommunication.hh:161
│ │ │ │ -
int barrier() const
Wait until all processes have arrived at this point in the program.
Definition: mpicommunication.hh:265
│ │ │ │ -
int rank() const
Return rank, is between 0 and size()-1.
Definition: mpicommunication.hh:128
│ │ │ │ -
int scatterv(const T *sendData, int *sendDataLen, int *displ, T *recvData, int recvDataLen, int root) const
Scatter arrays of variable length from a root to all other tasks.
Definition: mpicommunication.hh:359
│ │ │ │ -
MPIFuture< TOUT, TIN > iallgather(TIN &&data_in, TOUT &&data_out) const
Gathers data from all tasks and distribute it to all nonblocking.
Definition: mpicommunication.hh:383
│ │ │ │ -
Type allreduce(Type &&in) const
Definition: mpicommunication.hh:417
│ │ │ │ -
int sum(T *inout, int len) const
Compute the sum of the argument over all processes and return the result in every process....
Definition: mpicommunication.hh:210
│ │ │ │ -
int broadcast(T *inout, int len, int root) const
Distribute an array from the process with rank root to all other processes.
Definition: mpicommunication.hh:281
│ │ │ │ -
MPIFuture< T > iallreduce(T &&data) const
Compute something over all processes nonblocking.
Definition: mpicommunication.hh:443
│ │ │ │ -
T sum(const T &in) const
Compute the sum of the argument over all processes and return the result in every process....
Definition: mpicommunication.hh:201
│ │ │ │ -
int allreduce(const Type *in, Type *out, int len) const
Definition: mpicommunication.hh:455
│ │ │ │ -
MPIFuture< TOUT, TIN > iallreduce(TIN &&data_in, TOUT &&data_out) const
Compute something over all processes nonblocking.
Definition: mpicommunication.hh:428
│ │ │ │ -
int size() const
Number of processes in set, is greater than 0.
Definition: mpicommunication.hh:134
│ │ │ │ -
int gather(const T *in, T *out, int len, int root) const
Gather arrays on root task.
Definition: mpicommunication.hh:303
│ │ │ │ -
int allreduce(Type *inout, int len) const
Compute something over all processes for each component of an array and return the result in every pr...
Definition: mpicommunication.hh:407
│ │ │ │ -
T rrecv(T &&data, int source_rank, int tag, MPI_Status *status=MPI_STATUS_IGNORE) const
Definition: mpicommunication.hh:182
│ │ │ │ -
int scatter(const T *sendData, T *recvData, int len, int root) const
Scatter array from a root to all other task.
Definition: mpicommunication.hh:336
│ │ │ │ -
MPIFuture< T > irecv(T &&data, int source_rank, int tag) const
Receives the data from the source_rank nonblocking.
Definition: mpicommunication.hh:172
│ │ │ │ -
int prod(T *inout, int len) const
Compute the product of the argument over all processes and return the result in every process....
Definition: mpicommunication.hh:226
│ │ │ │ -
MPIFuture< TOUT, TIN > igather(TIN &&data_in, TOUT &&data_out, int root) const
Gather arrays on root task nonblocking.
Definition: mpicommunication.hh:312
│ │ │ │ -
T min(const T &in) const
Compute the minimum of the argument over all processes and return the result in every process....
Definition: mpicommunication.hh:233
│ │ │ │ -
Communication(const MPI_Comm &c=MPI_COMM_WORLD)
Instantiation using a MPI communicator.
Definition: mpicommunication.hh:111
│ │ │ │ -
MPIFuture< TOUT, TIN > iscatter(TIN &&data_in, TOUT &&data_out, int root) const
Scatter array from a root to all other task nonblocking.
Definition: mpicommunication.hh:345
│ │ │ │ -
int gatherv(const T *in, int sendDataLen, T *out, int *recvDataLen, int *displ, int root) const
Gather arrays of variable size on root task.
Definition: mpicommunication.hh:326
│ │ │ │ -
int min(T *inout, int len) const
Compute the minimum of the argument over all processes and return the result in every process....
Definition: mpicommunication.hh:242
│ │ │ │ -
int allgather(const T *sbuf, int count, T1 *rbuf) const
Gathers data from all tasks and distribute it to all.
Definition: mpicommunication.hh:374
│ │ │ │ -
int send(const T &data, int dest_rank, int tag) const
Sends the data to the dest_rank.
Definition: mpicommunication.hh:141
│ │ │ │ -
T prod(const T &in) const
Compute the product of the argument over all processes and return the result in every process....
Definition: mpicommunication.hh:217
│ │ │ │ -
Provides a future-like object for MPI communication. It contains the object that will be received and...
Definition: mpifuture.hh:85
│ │ │ │ -
auto get_send_mpidata()
Definition: mpifuture.hh:169
│ │ │ │ -
auto get_mpidata()
Definition: mpifuture.hh:165
│ │ │ │ +
28#define DUNE_VERSION_JOIN(module,type) module ## _VERSION_ ## type
│ │ │ │ +
29
│ │ │ │ +
44#define DUNE_VERSION_EQUAL(module,major,minor) \
│ │ │ │ +
45 ((DUNE_VERSION_JOIN(module,MAJOR) == major) && \
│ │ │ │ +
46 (DUNE_VERSION_JOIN(module,MINOR) == minor))
│ │ │ │ +
47
│ │ │ │ +
62#define DUNE_VERSION_EQUAL_REV(module,major,minor,revision) \
│ │ │ │ +
63 ( DUNE_VERSION_EQUAL(module,major,minor) && \
│ │ │ │ +
64 (DUNE_VERSION_JOIN(module,REVISION) == revision))
│ │ │ │ +
65
│ │ │ │ +
80#define DUNE_VERSION_GTE(module,major,minor) \
│ │ │ │ +
81 ((DUNE_VERSION_JOIN(module,MAJOR) > major) \
│ │ │ │ +
82 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) >= minor)))
│ │ │ │ +
83
│ │ │ │ +
98#define DUNE_VERSION_LT(module,major,minor) \
│ │ │ │ +
99 ! DUNE_VERSION_GTE(module,major,minor)
│ │ │ │ +
100
│ │ │ │ +
116#define DUNE_VERSION_NEWER(module,major,minor) \
│ │ │ │ +
117 DUNE_VERSION_GTE(module,major,minor)
│ │ │ │ +
118
│ │ │ │ +
133#define DUNE_VERSION_GT(module,major,minor) \
│ │ │ │ +
134 ((DUNE_VERSION_JOIN(module,MAJOR) > major) \
│ │ │ │ +
135 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) > minor)))
│ │ │ │ +
136
│ │ │ │ +
151#define DUNE_VERSION_LTE(module,major,minor) \
│ │ │ │ +
152 ! DUNE_VERSION_GT(module,major,minor)
│ │ │ │ +
153
│ │ │ │ +
168#define DUNE_VERSION_GTE_REV(module,major,minor,revision) \
│ │ │ │ +
169 ((DUNE_VERSION_JOIN(module,MAJOR) > major) \
│ │ │ │ +
170 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) > minor)) \
│ │ │ │ +
171 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) == minor) \
│ │ │ │ +
172 && (DUNE_VERSION_JOIN(module,REVISION) >= revision)))
│ │ │ │ +
173
│ │ │ │ +
188#define DUNE_VERSION_LT_REV(module,major,minor,revision) \
│ │ │ │ +
189 ! DUNE_VERSION_GTE_REV(module,major,minor,revision)
│ │ │ │ +
190
│ │ │ │ +
206#define DUNE_VERSION_NEWER_REV(module,major,minor,revision) \
│ │ │ │ +
207 DUNE_VERSION_GTE_REV(module,major,minor,revision)
│ │ │ │ +
208
│ │ │ │ +
223#define DUNE_VERSION_GT_REV(module,major,minor,revision) \
│ │ │ │ +
224 ((DUNE_VERSION_JOIN(module,MAJOR) > major) \
│ │ │ │ +
225 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) > minor)) \
│ │ │ │ +
226 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN(module,MINOR) == minor) \
│ │ │ │ +
227 && (DUNE_VERSION_JOIN(module,REVISION) > revision)))
│ │ │ │ +
228
│ │ │ │ +
243#define DUNE_VERSION_LTE_REV(module,major,minor,revision) \
│ │ │ │ +
244 ! DUNE_VERSION_GT_REV(module,major,minor,revision)
│ │ │ │ +
245
│ │ │ │ +
260#define DUNE_VERSION_ID(major,minor,revision) \
│ │ │ │ +
261 ((unsigned int)((major << 24) + (minor << 16) + revision))
│ │ │ │ +
262
│ │ │ │ +
277#define DUNE_MODULE_VERSION_ID(module) \
│ │ │ │ +
278 DUNE_VERSION_ID( DUNE_VERSION_JOIN(module,MAJOR), DUNE_VERSION_JOIN(module,MINOR), DUNE_VERSION_JOIN(module,REVISION) )
│ │ │ │ +
279
│ │ │ │ +
280#endif
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,666 +4,82 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -mpicommunication.hh │ │ │ │ │ +version.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 (C) 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_PARALLEL_MPICOMMUNICATION_HH │ │ │ │ │ - 6#define DUNE_COMMON_PARALLEL_MPICOMMUNICATION_HH │ │ │ │ │ + 5#ifndef DUNE_VERSION_HH │ │ │ │ │ + 6#define DUNE_VERSION_HH │ │ │ │ │ 7 │ │ │ │ │ - 16#if HAVE_MPI │ │ │ │ │ - 17 │ │ │ │ │ - 18#include │ │ │ │ │ - 19#include │ │ │ │ │ - 20#include │ │ │ │ │ - 21 │ │ │ │ │ - 22#include │ │ │ │ │ - 23 │ │ │ │ │ - 24#include │ │ │ │ │ - 25#include │ │ │ │ │ - 26#include │ │ │ │ │ - 27#include │ │ │ │ │ - 28#include │ │ │ │ │ - 29#include │ │ │ │ │ - 30 │ │ │ │ │ - 31namespace Dune │ │ │ │ │ - 32{ │ │ │ │ │ - 33 │ │ │ │ │ - 34 //======================================================= │ │ │ │ │ - 35 // use singleton pattern and template specialization to │ │ │ │ │ - 36 // generate MPI operations │ │ │ │ │ - 37 //======================================================= │ │ │ │ │ - 38 │ │ │ │ │ - 39 template │ │ │ │ │ -40 class Generic_MPI_Op │ │ │ │ │ - 41 { │ │ │ │ │ - 42 │ │ │ │ │ - 43 public: │ │ │ │ │ -44 static MPI_Op get () │ │ │ │ │ - 45 { │ │ │ │ │ - 46 if (!op) │ │ │ │ │ - 47 { │ │ │ │ │ - 48 op = std::make_unique(); │ │ │ │ │ - 49 // The following line leaks an MPI operation object, because the │ │ │ │ │ -corresponding │ │ │ │ │ - 50 //`MPI_Op_free` is never called. It is never called because there is no │ │ │ │ │ -easy │ │ │ │ │ - 51 // way to call it at the right moment: right before the call to │ │ │ │ │ -MPI_Finalize. │ │ │ │ │ - 52 // See https://gitlab.dune-project.org/core/dune-istl/issues/80 │ │ │ │ │ - 53 MPI_Op_create((void (*)(void*, void*, int*, │ │ │ │ │ -MPI_Datatype*))&operation,true,op.get()); │ │ │ │ │ - 54 } │ │ │ │ │ - 55 return *op; │ │ │ │ │ - 56 } │ │ │ │ │ - 57 private: │ │ │ │ │ - 58 static void operation (Type *in, Type *inout, int *len, MPI_Datatype*) │ │ │ │ │ - 59 { │ │ │ │ │ - 60 BinaryFunction func; │ │ │ │ │ - 61 │ │ │ │ │ - 62 for (int i=0; i< *len; ++i, ++in, ++inout) { │ │ │ │ │ - 63 Type temp; │ │ │ │ │ - 64 temp = func(*in, *inout); │ │ │ │ │ - 65 *inout = temp; │ │ │ │ │ - 66 } │ │ │ │ │ - 67 } │ │ │ │ │ - 68 Generic_MPI_Op () {} │ │ │ │ │ - 69 Generic_MPI_Op (const Generic_MPI_Op& ) {} │ │ │ │ │ - 70 static std::unique_ptr op; │ │ │ │ │ - 71 }; │ │ │ │ │ - 72 │ │ │ │ │ - 73 │ │ │ │ │ - 74 template │ │ │ │ │ - 75 std::unique_ptr Generic_MPI_Op::op; │ │ │ │ │ - 76 │ │ │ │ │ -77#define ComposeMPIOp(func,op) \ │ │ │ │ │ - 78 template \ │ │ │ │ │ - 79 class Generic_MPI_Op, std::enable_if_t:: │ │ │ │ │ -is_intrinsic> >{ \ │ │ │ │ │ - 80 public: \ │ │ │ │ │ - 81 static MPI_Op get(){ \ │ │ │ │ │ - 82 return op; \ │ │ │ │ │ - 83 } \ │ │ │ │ │ - 84 private: \ │ │ │ │ │ - 85 Generic_MPI_Op () {} \ │ │ │ │ │ - 86 Generic_MPI_Op (const Generic_MPI_Op & ) {} \ │ │ │ │ │ - 87 } │ │ │ │ │ - 88 │ │ │ │ │ - 89 │ │ │ │ │ -90 ComposeMPIOp(std::plus, MPI_SUM); │ │ │ │ │ -91 ComposeMPIOp(std::multiplies, MPI_PROD); │ │ │ │ │ -92 ComposeMPIOp(Min, MPI_MIN); │ │ │ │ │ -93 ComposeMPIOp(Max, MPI_MAX); │ │ │ │ │ - 94 │ │ │ │ │ - 95#undef ComposeMPIOp │ │ │ │ │ - 96 │ │ │ │ │ - 97 │ │ │ │ │ - 98 //======================================================= │ │ │ │ │ - 99 // use singleton pattern and template specialization to │ │ │ │ │ - 100 // generate MPI operations │ │ │ │ │ - 101 //======================================================= │ │ │ │ │ - 102 │ │ │ │ │ - 106 template<> │ │ │ │ │ -107 class Communication │ │ │ │ │ - 108 { │ │ │ │ │ - 109 public: │ │ │ │ │ -111 Communication (const MPI_Comm& c = MPI_COMM_WORLD) │ │ │ │ │ - 112 : communicator(c) │ │ │ │ │ - 113 { │ │ │ │ │ - 114 if(communicator!=MPI_COMM_NULL) { │ │ │ │ │ - 115 int initialized = 0; │ │ │ │ │ - 116 MPI_Initialized(&initialized); │ │ │ │ │ - 117 if (!initialized) │ │ │ │ │ - 118 DUNE_THROW(ParallelError,"You must call MPIHelper::instance(argc,argv) in │ │ │ │ │ -your main() function before using the MPI Communication!"); │ │ │ │ │ - 119 MPI_Comm_rank(communicator,&me); │ │ │ │ │ - 120 MPI_Comm_size(communicator,&procs); │ │ │ │ │ - 121 }else{ │ │ │ │ │ - 122 procs=0; │ │ │ │ │ - 123 me=-1; │ │ │ │ │ - 124 } │ │ │ │ │ - 125 } │ │ │ │ │ - 126 │ │ │ │ │ -128 int rank () const │ │ │ │ │ - 129 { │ │ │ │ │ - 130 return me; │ │ │ │ │ - 131 } │ │ │ │ │ - 132 │ │ │ │ │ -134 int size () const │ │ │ │ │ - 135 { │ │ │ │ │ - 136 return procs; │ │ │ │ │ - 137 } │ │ │ │ │ - 138 │ │ │ │ │ - 140 template │ │ │ │ │ -141 int send(const T& data, int dest_rank, int tag) const │ │ │ │ │ - 142 { │ │ │ │ │ - 143 auto mpi_data = getMPIData(data); │ │ │ │ │ - 144 return MPI_Send(mpi_data.ptr(), mpi_data.size(), mpi_data.type(), │ │ │ │ │ - 145 dest_rank, tag, communicator); │ │ │ │ │ - 146 } │ │ │ │ │ - 147 │ │ │ │ │ - 149 template │ │ │ │ │ -150 MPIFuture isend(const T&& data, int dest_rank, int tag) const │ │ │ │ │ - 151 { │ │ │ │ │ - 152 MPIFuture future(std::forward(data)); │ │ │ │ │ - 153 auto mpidata = future.get_mpidata(); │ │ │ │ │ - 154 MPI_Isend(mpidata.ptr(), mpidata.size(), mpidata.type(), │ │ │ │ │ - 155 dest_rank, tag, communicator, &future.req_); │ │ │ │ │ - 156 return future; │ │ │ │ │ - 157 } │ │ │ │ │ - 158 │ │ │ │ │ - 160 template │ │ │ │ │ -161 T recv(T&& data, int source_rank, int tag, MPI_Status* status = │ │ │ │ │ -MPI_STATUS_IGNORE) const │ │ │ │ │ - 162 { │ │ │ │ │ - 163 T lvalue_data(std::forward(data)); │ │ │ │ │ - 164 auto mpi_data = getMPIData(lvalue_data); │ │ │ │ │ - 165 MPI_Recv(mpi_data.ptr(), mpi_data.size(), mpi_data.type(), │ │ │ │ │ - 166 source_rank, tag, communicator, status); │ │ │ │ │ - 167 return lvalue_data; │ │ │ │ │ - 168 } │ │ │ │ │ - 169 │ │ │ │ │ - 171 template │ │ │ │ │ -172 MPIFuture irecv(T&& data, int source_rank, int tag) const │ │ │ │ │ - 173 { │ │ │ │ │ - 174 MPIFuture future(std::forward(data)); │ │ │ │ │ - 175 auto mpidata = future.get_mpidata(); │ │ │ │ │ - 176 MPI_Irecv(mpidata.ptr(), mpidata.size(), mpidata.type(), │ │ │ │ │ - 177 source_rank, tag, communicator, &future.req_); │ │ │ │ │ - 178 return future; │ │ │ │ │ - 179 } │ │ │ │ │ - 180 │ │ │ │ │ - 181 template │ │ │ │ │ -182 T rrecv(T&& data, int source_rank, int tag, MPI_Status* status = │ │ │ │ │ -MPI_STATUS_IGNORE) const │ │ │ │ │ - 183 { │ │ │ │ │ - 184 MPI_Status _status; │ │ │ │ │ - 185 MPI_Message _message; │ │ │ │ │ - 186 T lvalue_data(std::forward(data)); │ │ │ │ │ - 187 auto mpi_data = getMPIData(lvalue_data); │ │ │ │ │ - 188 static_assert(!mpi_data.static_size, "rrecv work only for non-static-sized │ │ │ │ │ -types."); │ │ │ │ │ - 189 if(status == MPI_STATUS_IGNORE) │ │ │ │ │ - 190 status = &_status; │ │ │ │ │ - 191 MPI_Mprobe(source_rank, tag, communicator, &_message, status); │ │ │ │ │ - 192 int size; │ │ │ │ │ - 193 MPI_Get_count(status, mpi_data.type(), &size); │ │ │ │ │ - 194 mpi_data.resize(size); │ │ │ │ │ - 195 MPI_Mrecv(mpi_data.ptr(), mpi_data.size(), mpi_data.type(), &_message, │ │ │ │ │ -status); │ │ │ │ │ - 196 return lvalue_data; │ │ │ │ │ - 197 } │ │ │ │ │ - 198 │ │ │ │ │ - 200 template │ │ │ │ │ -201 T sum (const T& in) const │ │ │ │ │ - 202 { │ │ │ │ │ - 203 T out; │ │ │ │ │ - 204 allreduce >(&in,&out,1); │ │ │ │ │ - 205 return out; │ │ │ │ │ - 206 } │ │ │ │ │ - 207 │ │ │ │ │ - 209 template │ │ │ │ │ -210 int sum (T* inout, int len) const │ │ │ │ │ - 211 { │ │ │ │ │ - 212 return allreduce >(inout,len); │ │ │ │ │ - 213 } │ │ │ │ │ - 214 │ │ │ │ │ - 216 template │ │ │ │ │ -217 T prod (const T& in) const │ │ │ │ │ - 218 { │ │ │ │ │ - 219 T out; │ │ │ │ │ - 220 allreduce >(&in,&out,1); │ │ │ │ │ - 221 return out; │ │ │ │ │ - 222 } │ │ │ │ │ - 223 │ │ │ │ │ - 225 template │ │ │ │ │ -226 int prod (T* inout, int len) const │ │ │ │ │ - 227 { │ │ │ │ │ - 228 return allreduce >(inout,len); │ │ │ │ │ - 229 } │ │ │ │ │ - 230 │ │ │ │ │ - 232 template │ │ │ │ │ -233 T min (const T& in) const │ │ │ │ │ - 234 { │ │ │ │ │ - 235 T out; │ │ │ │ │ - 236 allreduce >(&in,&out,1); │ │ │ │ │ - 237 return out; │ │ │ │ │ - 238 } │ │ │ │ │ - 239 │ │ │ │ │ - 241 template │ │ │ │ │ -242 int min (T* inout, int len) const │ │ │ │ │ - 243 { │ │ │ │ │ - 244 return allreduce >(inout,len); │ │ │ │ │ - 245 } │ │ │ │ │ - 246 │ │ │ │ │ - 247 │ │ │ │ │ - 249 template │ │ │ │ │ -250 T max (const T& in) const │ │ │ │ │ - 251 { │ │ │ │ │ - 252 T out; │ │ │ │ │ - 253 allreduce >(&in,&out,1); │ │ │ │ │ - 254 return out; │ │ │ │ │ - 255 } │ │ │ │ │ - 256 │ │ │ │ │ - 258 template │ │ │ │ │ -259 int max (T* inout, int len) const │ │ │ │ │ - 260 { │ │ │ │ │ - 261 return allreduce >(inout,len); │ │ │ │ │ - 262 } │ │ │ │ │ - 263 │ │ │ │ │ -265 int barrier () const │ │ │ │ │ - 266 { │ │ │ │ │ - 267 return MPI_Barrier(communicator); │ │ │ │ │ - 268 } │ │ │ │ │ - 269 │ │ │ │ │ -271 MPIFuture ibarrier () const │ │ │ │ │ - 272 { │ │ │ │ │ - 273 MPIFuture future(true); // make a valid MPIFuture │ │ │ │ │ - 274 MPI_Ibarrier(communicator, &future.req_); │ │ │ │ │ - 275 return future; │ │ │ │ │ - 276 } │ │ │ │ │ - 277 │ │ │ │ │ - 278 │ │ │ │ │ - 280 template │ │ │ │ │ -281 int broadcast (T* inout, int len, int root) const │ │ │ │ │ - 282 { │ │ │ │ │ - 283 return MPI_Bcast(inout,len,MPITraits::getType(),root,communicator); │ │ │ │ │ - 284 } │ │ │ │ │ - 285 │ │ │ │ │ - 287 template │ │ │ │ │ -288 MPIFuture ibroadcast(T&& data, int root) const{ │ │ │ │ │ - 289 MPIFuture future(std::forward(data)); │ │ │ │ │ - 290 auto mpidata = future.get_mpidata(); │ │ │ │ │ - 291 MPI_Ibcast(mpidata.ptr(), │ │ │ │ │ - 292 mpidata.size(), │ │ │ │ │ - 293 mpidata.type(), │ │ │ │ │ - 294 root, │ │ │ │ │ - 295 communicator, │ │ │ │ │ - 296 &future.req_); │ │ │ │ │ - 297 return future; │ │ │ │ │ - 298 } │ │ │ │ │ - 299 │ │ │ │ │ - 302 template │ │ │ │ │ -303 int gather (const T* in, T* out, int len, int root) const │ │ │ │ │ - 304 { │ │ │ │ │ - 305 return MPI_Gather(const_cast(in),len,MPITraits::getType(), │ │ │ │ │ - 306 out,len,MPITraits::getType(), │ │ │ │ │ - 307 root,communicator); │ │ │ │ │ - 308 } │ │ │ │ │ - 309 │ │ │ │ │ - 311 template> │ │ │ │ │ -312 MPIFuture igather(TIN&& data_in, TOUT&& data_out, int root) │ │ │ │ │ -const{ │ │ │ │ │ - 313 MPIFuture future(std::forward(data_out), std:: │ │ │ │ │ -forward(data_in)); │ │ │ │ │ - 314 auto mpidata_in = future.get_send_mpidata(); │ │ │ │ │ - 315 auto mpidata_out = future.get_mpidata(); │ │ │ │ │ - 316 assert(root != me || mpidata_in.size()*procs <= mpidata_out.size()); │ │ │ │ │ - 317 int outlen = (me==root) * mpidata_in.size(); │ │ │ │ │ - 318 MPI_Igather(mpidata_in.ptr(), mpidata_in.size(), mpidata_in.type(), │ │ │ │ │ - 319 mpidata_out.ptr(), outlen, mpidata_out.type(), │ │ │ │ │ - 320 root, communicator, &future.req_); │ │ │ │ │ - 321 return future; │ │ │ │ │ - 322 } │ │ │ │ │ - 323 │ │ │ │ │ - 325 template │ │ │ │ │ -326 int gatherv (const T* in, int sendDataLen, T* out, int* recvDataLen, int* │ │ │ │ │ -displ, int root) const │ │ │ │ │ - 327 { │ │ │ │ │ - 328 return MPI_Gatherv(const_cast(in),sendDataLen,MPITraits::getType(), │ │ │ │ │ - 329 out,recvDataLen,displ,MPITraits::getType(), │ │ │ │ │ - 330 root,communicator); │ │ │ │ │ - 331 } │ │ │ │ │ - 332 │ │ │ │ │ - 335 template │ │ │ │ │ -336 int scatter (const T* sendData, T* recvData, int len, int root) const │ │ │ │ │ - 337 { │ │ │ │ │ - 338 return MPI_Scatter(const_cast(sendData),len,MPITraits::getType(), │ │ │ │ │ - 339 recvData,len,MPITraits::getType(), │ │ │ │ │ - 340 root,communicator); │ │ │ │ │ - 341 } │ │ │ │ │ - 342 │ │ │ │ │ - 344 template │ │ │ │ │ -345 MPIFuture iscatter(TIN&& data_in, TOUT&& data_out, int root) │ │ │ │ │ -const │ │ │ │ │ - 346 { │ │ │ │ │ - 347 MPIFuture future(std::forward(data_out), std:: │ │ │ │ │ -forward(data_in)); │ │ │ │ │ - 348 auto mpidata_in = future.get_send_mpidata(); │ │ │ │ │ - 349 auto mpidata_out = future.get_mpidata(); │ │ │ │ │ - 350 int inlen = (me==root) * mpidata_in.size()/procs; │ │ │ │ │ - 351 MPI_Iscatter(mpidata_in.ptr(), inlen, mpidata_in.type(), │ │ │ │ │ - 352 mpidata_out.ptr(), mpidata_out.size(), mpidata_out.type(), │ │ │ │ │ - 353 root, communicator, &future.req_); │ │ │ │ │ - 354 return future; │ │ │ │ │ - 355 } │ │ │ │ │ - 356 │ │ │ │ │ - 358 template │ │ │ │ │ -359 int scatterv (const T* sendData, int* sendDataLen, int* displ, T* recvData, │ │ │ │ │ -int recvDataLen, int root) const │ │ │ │ │ - 360 { │ │ │ │ │ - 361 return MPI_Scatterv(const_cast │ │ │ │ │ -(sendData),sendDataLen,displ,MPITraits::getType(), │ │ │ │ │ - 362 recvData,recvDataLen,MPITraits::getType(), │ │ │ │ │ - 363 root,communicator); │ │ │ │ │ - 364 } │ │ │ │ │ - 365 │ │ │ │ │ - 366 │ │ │ │ │ -367 operator MPI_Comm () const │ │ │ │ │ - 368 { │ │ │ │ │ - 369 return communicator; │ │ │ │ │ - 370 } │ │ │ │ │ - 371 │ │ │ │ │ - 373 template │ │ │ │ │ -374 int allgather(const T* sbuf, int count, T1* rbuf) const │ │ │ │ │ - 375 { │ │ │ │ │ - 376 return MPI_Allgather(const_cast(sbuf), count, MPITraits::getType(), │ │ │ │ │ - 377 rbuf, count, MPITraits::getType(), │ │ │ │ │ - 378 communicator); │ │ │ │ │ - 379 } │ │ │ │ │ - 380 │ │ │ │ │ - 382 template │ │ │ │ │ -383 MPIFuture iallgather(TIN&& data_in, TOUT&& data_out) const │ │ │ │ │ - 384 { │ │ │ │ │ - 385 MPIFuture future(std::forward(data_out), std:: │ │ │ │ │ -forward(data_in)); │ │ │ │ │ - 386 auto mpidata_in = future.get_send_mpidata(); │ │ │ │ │ - 387 auto mpidata_out = future.get_mpidata(); │ │ │ │ │ - 388 assert(mpidata_in.size()*procs <= mpidata_out.size()); │ │ │ │ │ - 389 int outlen = mpidata_in.size(); │ │ │ │ │ - 390 MPI_Iallgather(mpidata_in.ptr(), mpidata_in.size(), mpidata_in.type(), │ │ │ │ │ - 391 mpidata_out.ptr(), outlen, mpidata_out.type(), │ │ │ │ │ - 392 communicator, &future.req_); │ │ │ │ │ - 393 return future; │ │ │ │ │ - 394 } │ │ │ │ │ - 395 │ │ │ │ │ - 397 template │ │ │ │ │ -398 int allgatherv (const T* in, int sendDataLen, T* out, int* recvDataLen, │ │ │ │ │ -int* displ) const │ │ │ │ │ - 399 { │ │ │ │ │ - 400 return MPI_Allgatherv(const_cast(in),sendDataLen,MPITraits::getType │ │ │ │ │ -(), │ │ │ │ │ - 401 out,recvDataLen,displ,MPITraits::getType(), │ │ │ │ │ - 402 communicator); │ │ │ │ │ - 403 } │ │ │ │ │ - 404 │ │ │ │ │ - 406 template │ │ │ │ │ -407 int allreduce(Type* inout, int len) const │ │ │ │ │ - 408 { │ │ │ │ │ - 409 Type* out = new Type[len]; │ │ │ │ │ - 410 int ret = allreduce(inout,out,len); │ │ │ │ │ - 411 std::copy(out, out+len, inout); │ │ │ │ │ - 412 delete[] out; │ │ │ │ │ - 413 return ret; │ │ │ │ │ - 414 } │ │ │ │ │ - 415 │ │ │ │ │ - 416 template │ │ │ │ │ -417 Type allreduce(Type&& in) const{ │ │ │ │ │ - 418 Type lvalue_data = std::forward(in); │ │ │ │ │ - 419 auto data = getMPIData(lvalue_data); │ │ │ │ │ - 420 MPI_Allreduce(MPI_IN_PLACE, data.ptr(), data.size(), data.type(), │ │ │ │ │ - 421 (Generic_MPI_Op::get()), │ │ │ │ │ - 422 communicator); │ │ │ │ │ - 423 return lvalue_data; │ │ │ │ │ - 424 } │ │ │ │ │ - 425 │ │ │ │ │ - 427 template │ │ │ │ │ -428 MPIFuture iallreduce(TIN&& data_in, TOUT&& data_out) const { │ │ │ │ │ - 429 MPIFuture future(std::forward(data_out), std:: │ │ │ │ │ -forward(data_in)); │ │ │ │ │ - 430 auto mpidata_in = future.get_send_mpidata(); │ │ │ │ │ - 431 auto mpidata_out = future.get_mpidata(); │ │ │ │ │ - 432 assert(mpidata_out.size() == mpidata_in.size()); │ │ │ │ │ - 433 assert(mpidata_out.type() == mpidata_in.type()); │ │ │ │ │ - 434 MPI_Iallreduce(mpidata_in.ptr(), mpidata_out.ptr(), │ │ │ │ │ - 435 mpidata_out.size(), mpidata_out.type(), │ │ │ │ │ - 436 (Generic_MPI_Op::get()), │ │ │ │ │ - 437 communicator, &future.req_); │ │ │ │ │ - 438 return future; │ │ │ │ │ - 439 } │ │ │ │ │ - 440 │ │ │ │ │ - 442 template │ │ │ │ │ -443 MPIFuture iallreduce(T&& data) const{ │ │ │ │ │ - 444 MPIFuture future(std::forward(data)); │ │ │ │ │ - 445 auto mpidata = future.get_mpidata(); │ │ │ │ │ - 446 MPI_Iallreduce(MPI_IN_PLACE, mpidata.ptr(), │ │ │ │ │ - 447 mpidata.size(), mpidata.type(), │ │ │ │ │ - 448 (Generic_MPI_Op::get()), │ │ │ │ │ - 449 communicator, &future.req_); │ │ │ │ │ - 450 return future; │ │ │ │ │ - 451 } │ │ │ │ │ - 452 │ │ │ │ │ - 454 template │ │ │ │ │ -455 int allreduce(const Type* in, Type* out, int len) const │ │ │ │ │ - 456 { │ │ │ │ │ - 457 return MPI_Allreduce(const_cast(in), out, len, MPITraits:: │ │ │ │ │ -getType(), │ │ │ │ │ - 458 (Generic_MPI_Op::get()),communicator); │ │ │ │ │ - 459 } │ │ │ │ │ - 460 │ │ │ │ │ - 461 private: │ │ │ │ │ - 462 MPI_Comm communicator; │ │ │ │ │ - 463 int me; │ │ │ │ │ - 464 int procs; │ │ │ │ │ - 465 }; │ │ │ │ │ - 466} // namespace dune │ │ │ │ │ - 467 │ │ │ │ │ - 468#endif // HAVE_MPI │ │ │ │ │ - 469 │ │ │ │ │ - 470#endif │ │ │ │ │ -communication.hh │ │ │ │ │ -Implements an utility class that provides collective communication methods for │ │ │ │ │ -sequential programs. │ │ │ │ │ -mpitraits.hh │ │ │ │ │ -Traits classes for mapping types onto MPI_Datatype. │ │ │ │ │ -mpidata.hh │ │ │ │ │ -Interface class to translate objects to a MPI_Datatype, void* and size used for │ │ │ │ │ -MPI calls. │ │ │ │ │ -mpifuture.hh │ │ │ │ │ -exceptions.hh │ │ │ │ │ -A few common exception classes. │ │ │ │ │ -binaryfunctions.hh │ │ │ │ │ -helper classes to provide unique types for standard functions │ │ │ │ │ -DUNE_THROW │ │ │ │ │ -#define DUNE_THROW(E, m) │ │ │ │ │ -Definition: exceptions.hh:218 │ │ │ │ │ -Dune │ │ │ │ │ -Dune namespace. │ │ │ │ │ -Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::ComposeMPIOp │ │ │ │ │ -ComposeMPIOp(std::plus, MPI_SUM) │ │ │ │ │ -Dune::getMPIData │ │ │ │ │ -auto getMPIData(T &t) │ │ │ │ │ -Definition: mpidata.hh:43 │ │ │ │ │ -Dune::MPITraits │ │ │ │ │ -A traits class describing the mapping of types onto MPI_Datatypes. │ │ │ │ │ -Definition: mpitraits.hh:41 │ │ │ │ │ -Dune::Min │ │ │ │ │ -Definition: binaryfunctions.hh:18 │ │ │ │ │ -Dune::Max │ │ │ │ │ -Definition: binaryfunctions.hh:34 │ │ │ │ │ -Dune::ParallelError │ │ │ │ │ -Default exception if an error in the parallel communication of the program │ │ │ │ │ -occurred. │ │ │ │ │ -Definition: exceptions.hh:287 │ │ │ │ │ -Dune::Communication │ │ │ │ │ -Collective communication interface and sequential default implementation. │ │ │ │ │ -Definition: communication.hh:100 │ │ │ │ │ -Dune::Communication::size │ │ │ │ │ -int size() const │ │ │ │ │ -Number of processes in set, is greater than 0. │ │ │ │ │ -Definition: communication.hh:126 │ │ │ │ │ -Dune::Generic_MPI_Op │ │ │ │ │ -Definition: mpicommunication.hh:41 │ │ │ │ │ -Dune::Generic_MPI_Op::get │ │ │ │ │ -static MPI_Op get() │ │ │ │ │ -Definition: mpicommunication.hh:44 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::max │ │ │ │ │ -int max(T *inout, int len) const │ │ │ │ │ -Compute the maximum of the argument over all processes and return the result in │ │ │ │ │ -every process.... │ │ │ │ │ -Definition: mpicommunication.hh:259 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::allgatherv │ │ │ │ │ -int allgatherv(const T *in, int sendDataLen, T *out, int *recvDataLen, int │ │ │ │ │ -*displ) const │ │ │ │ │ -Gathers data of variable length from all tasks and distribute it to all. │ │ │ │ │ -Definition: mpicommunication.hh:398 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::max │ │ │ │ │ -T max(const T &in) const │ │ │ │ │ -Compute the maximum of the argument over all processes and return the result in │ │ │ │ │ -every process.... │ │ │ │ │ -Definition: mpicommunication.hh:250 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::ibroadcast │ │ │ │ │ -MPIFuture< T > ibroadcast(T &&data, int root) const │ │ │ │ │ -Distribute an array from the process with rank root to all other processes │ │ │ │ │ -nonblocking. │ │ │ │ │ -Definition: mpicommunication.hh:288 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::ibarrier │ │ │ │ │ -MPIFuture< void > ibarrier() const │ │ │ │ │ -Nonblocking barrier. │ │ │ │ │ -Definition: mpicommunication.hh:271 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::isend │ │ │ │ │ -MPIFuture< const T > isend(const T &&data, int dest_rank, int tag) const │ │ │ │ │ -Sends the data to the dest_rank nonblocking. │ │ │ │ │ -Definition: mpicommunication.hh:150 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::recv │ │ │ │ │ -T recv(T &&data, int source_rank, int tag, MPI_Status │ │ │ │ │ -*status=MPI_STATUS_IGNORE) const │ │ │ │ │ -Receives the data from the source_rank. │ │ │ │ │ -Definition: mpicommunication.hh:161 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::barrier │ │ │ │ │ -int barrier() const │ │ │ │ │ -Wait until all processes have arrived at this point in the program. │ │ │ │ │ -Definition: mpicommunication.hh:265 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::rank │ │ │ │ │ -int rank() const │ │ │ │ │ -Return rank, is between 0 and size()-1. │ │ │ │ │ -Definition: mpicommunication.hh:128 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::scatterv │ │ │ │ │ -int scatterv(const T *sendData, int *sendDataLen, int *displ, T *recvData, int │ │ │ │ │ -recvDataLen, int root) const │ │ │ │ │ -Scatter arrays of variable length from a root to all other tasks. │ │ │ │ │ -Definition: mpicommunication.hh:359 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::iallgather │ │ │ │ │ -MPIFuture< TOUT, TIN > iallgather(TIN &&data_in, TOUT &&data_out) const │ │ │ │ │ -Gathers data from all tasks and distribute it to all nonblocking. │ │ │ │ │ -Definition: mpicommunication.hh:383 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::allreduce │ │ │ │ │ -Type allreduce(Type &&in) const │ │ │ │ │ -Definition: mpicommunication.hh:417 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::sum │ │ │ │ │ -int sum(T *inout, int len) const │ │ │ │ │ -Compute the sum of the argument over all processes and return the result in │ │ │ │ │ -every process.... │ │ │ │ │ -Definition: mpicommunication.hh:210 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::broadcast │ │ │ │ │ -int broadcast(T *inout, int len, int root) const │ │ │ │ │ -Distribute an array from the process with rank root to all other processes. │ │ │ │ │ -Definition: mpicommunication.hh:281 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::iallreduce │ │ │ │ │ -MPIFuture< T > iallreduce(T &&data) const │ │ │ │ │ -Compute something over all processes nonblocking. │ │ │ │ │ -Definition: mpicommunication.hh:443 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::sum │ │ │ │ │ -T sum(const T &in) const │ │ │ │ │ -Compute the sum of the argument over all processes and return the result in │ │ │ │ │ -every process.... │ │ │ │ │ -Definition: mpicommunication.hh:201 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::allreduce │ │ │ │ │ -int allreduce(const Type *in, Type *out, int len) const │ │ │ │ │ -Definition: mpicommunication.hh:455 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::iallreduce │ │ │ │ │ -MPIFuture< TOUT, TIN > iallreduce(TIN &&data_in, TOUT &&data_out) const │ │ │ │ │ -Compute something over all processes nonblocking. │ │ │ │ │ -Definition: mpicommunication.hh:428 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::size │ │ │ │ │ -int size() const │ │ │ │ │ -Number of processes in set, is greater than 0. │ │ │ │ │ -Definition: mpicommunication.hh:134 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::gather │ │ │ │ │ -int gather(const T *in, T *out, int len, int root) const │ │ │ │ │ -Gather arrays on root task. │ │ │ │ │ -Definition: mpicommunication.hh:303 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::allreduce │ │ │ │ │ -int allreduce(Type *inout, int len) const │ │ │ │ │ -Compute something over all processes for each component of an array and return │ │ │ │ │ -the result in every pr... │ │ │ │ │ -Definition: mpicommunication.hh:407 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::rrecv │ │ │ │ │ -T rrecv(T &&data, int source_rank, int tag, MPI_Status │ │ │ │ │ -*status=MPI_STATUS_IGNORE) const │ │ │ │ │ -Definition: mpicommunication.hh:182 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::scatter │ │ │ │ │ -int scatter(const T *sendData, T *recvData, int len, int root) const │ │ │ │ │ -Scatter array from a root to all other task. │ │ │ │ │ -Definition: mpicommunication.hh:336 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::irecv │ │ │ │ │ -MPIFuture< T > irecv(T &&data, int source_rank, int tag) const │ │ │ │ │ -Receives the data from the source_rank nonblocking. │ │ │ │ │ -Definition: mpicommunication.hh:172 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::prod │ │ │ │ │ -int prod(T *inout, int len) const │ │ │ │ │ -Compute the product of the argument over all processes and return the result in │ │ │ │ │ -every process.... │ │ │ │ │ -Definition: mpicommunication.hh:226 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::igather │ │ │ │ │ -MPIFuture< TOUT, TIN > igather(TIN &&data_in, TOUT &&data_out, int root) const │ │ │ │ │ -Gather arrays on root task nonblocking. │ │ │ │ │ -Definition: mpicommunication.hh:312 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::min │ │ │ │ │ -T min(const T &in) const │ │ │ │ │ -Compute the minimum of the argument over all processes and return the result in │ │ │ │ │ -every process.... │ │ │ │ │ -Definition: mpicommunication.hh:233 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::Communication │ │ │ │ │ -Communication(const MPI_Comm &c=MPI_COMM_WORLD) │ │ │ │ │ -Instantiation using a MPI communicator. │ │ │ │ │ -Definition: mpicommunication.hh:111 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::iscatter │ │ │ │ │ -MPIFuture< TOUT, TIN > iscatter(TIN &&data_in, TOUT &&data_out, int root) const │ │ │ │ │ -Scatter array from a root to all other task nonblocking. │ │ │ │ │ -Definition: mpicommunication.hh:345 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::gatherv │ │ │ │ │ -int gatherv(const T *in, int sendDataLen, T *out, int *recvDataLen, int *displ, │ │ │ │ │ -int root) const │ │ │ │ │ -Gather arrays of variable size on root task. │ │ │ │ │ -Definition: mpicommunication.hh:326 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::min │ │ │ │ │ -int min(T *inout, int len) const │ │ │ │ │ -Compute the minimum of the argument over all processes and return the result in │ │ │ │ │ -every process.... │ │ │ │ │ -Definition: mpicommunication.hh:242 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::allgather │ │ │ │ │ -int allgather(const T *sbuf, int count, T1 *rbuf) const │ │ │ │ │ -Gathers data from all tasks and distribute it to all. │ │ │ │ │ -Definition: mpicommunication.hh:374 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::send │ │ │ │ │ -int send(const T &data, int dest_rank, int tag) const │ │ │ │ │ -Sends the data to the dest_rank. │ │ │ │ │ -Definition: mpicommunication.hh:141 │ │ │ │ │ -Dune::Communication<_MPI_Comm_>::prod │ │ │ │ │ -T prod(const T &in) const │ │ │ │ │ -Compute the product of the argument over all processes and return the result in │ │ │ │ │ -every process.... │ │ │ │ │ -Definition: mpicommunication.hh:217 │ │ │ │ │ -Dune::MPIFuture │ │ │ │ │ -Provides a future-like object for MPI communication. It contains the object │ │ │ │ │ -that will be received and... │ │ │ │ │ -Definition: mpifuture.hh:85 │ │ │ │ │ -Dune::MPIFuture::get_send_mpidata │ │ │ │ │ -auto get_send_mpidata() │ │ │ │ │ -Definition: mpifuture.hh:169 │ │ │ │ │ -Dune::MPIFuture::get_mpidata │ │ │ │ │ -auto get_mpidata() │ │ │ │ │ -Definition: mpifuture.hh:165 │ │ │ │ │ +28#define DUNE_VERSION_JOIN(module,type) module ## _VERSION_ ## type │ │ │ │ │ + 29 │ │ │ │ │ +44#define DUNE_VERSION_EQUAL(module,major,minor) \ │ │ │ │ │ + 45 ((DUNE_VERSION_JOIN(module,MAJOR) == major) && \ │ │ │ │ │ + 46 (DUNE_VERSION_JOIN(module,MINOR) == minor)) │ │ │ │ │ + 47 │ │ │ │ │ +62#define DUNE_VERSION_EQUAL_REV(module,major,minor,revision) \ │ │ │ │ │ + 63 ( DUNE_VERSION_EQUAL(module,major,minor) && \ │ │ │ │ │ + 64 (DUNE_VERSION_JOIN(module,REVISION) == revision)) │ │ │ │ │ + 65 │ │ │ │ │ +80#define DUNE_VERSION_GTE(module,major,minor) \ │ │ │ │ │ + 81 ((DUNE_VERSION_JOIN(module,MAJOR) > major) \ │ │ │ │ │ + 82 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN │ │ │ │ │ +(module,MINOR) >= minor))) │ │ │ │ │ + 83 │ │ │ │ │ +98#define DUNE_VERSION_LT(module,major,minor) \ │ │ │ │ │ + 99 ! DUNE_VERSION_GTE(module,major,minor) │ │ │ │ │ + 100 │ │ │ │ │ +116#define DUNE_VERSION_NEWER(module,major,minor) \ │ │ │ │ │ + 117 DUNE_VERSION_GTE(module,major,minor) │ │ │ │ │ + 118 │ │ │ │ │ +133#define DUNE_VERSION_GT(module,major,minor) \ │ │ │ │ │ + 134 ((DUNE_VERSION_JOIN(module,MAJOR) > major) \ │ │ │ │ │ + 135 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN │ │ │ │ │ +(module,MINOR) > minor))) │ │ │ │ │ + 136 │ │ │ │ │ +151#define DUNE_VERSION_LTE(module,major,minor) \ │ │ │ │ │ + 152 ! DUNE_VERSION_GT(module,major,minor) │ │ │ │ │ + 153 │ │ │ │ │ +168#define DUNE_VERSION_GTE_REV(module,major,minor,revision) \ │ │ │ │ │ + 169 ((DUNE_VERSION_JOIN(module,MAJOR) > major) \ │ │ │ │ │ + 170 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN │ │ │ │ │ +(module,MINOR) > minor)) \ │ │ │ │ │ + 171 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN │ │ │ │ │ +(module,MINOR) == minor) \ │ │ │ │ │ + 172 && (DUNE_VERSION_JOIN(module,REVISION) >= revision))) │ │ │ │ │ + 173 │ │ │ │ │ +188#define DUNE_VERSION_LT_REV(module,major,minor,revision) \ │ │ │ │ │ + 189 ! DUNE_VERSION_GTE_REV(module,major,minor,revision) │ │ │ │ │ + 190 │ │ │ │ │ +206#define DUNE_VERSION_NEWER_REV(module,major,minor,revision) \ │ │ │ │ │ + 207 DUNE_VERSION_GTE_REV(module,major,minor,revision) │ │ │ │ │ + 208 │ │ │ │ │ +223#define DUNE_VERSION_GT_REV(module,major,minor,revision) \ │ │ │ │ │ + 224 ((DUNE_VERSION_JOIN(module,MAJOR) > major) \ │ │ │ │ │ + 225 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN │ │ │ │ │ +(module,MINOR) > minor)) \ │ │ │ │ │ + 226 || ((DUNE_VERSION_JOIN(module,MAJOR) == major) && (DUNE_VERSION_JOIN │ │ │ │ │ +(module,MINOR) == minor) \ │ │ │ │ │ + 227 && (DUNE_VERSION_JOIN(module,REVISION) > revision))) │ │ │ │ │ + 228 │ │ │ │ │ +243#define DUNE_VERSION_LTE_REV(module,major,minor,revision) \ │ │ │ │ │ + 244 ! DUNE_VERSION_GT_REV(module,major,minor,revision) │ │ │ │ │ + 245 │ │ │ │ │ +260#define DUNE_VERSION_ID(major,minor,revision) \ │ │ │ │ │ + 261 ((unsigned int)((major << 24) + (minor << 16) + revision)) │ │ │ │ │ + 262 │ │ │ │ │ +277#define DUNE_MODULE_VERSION_ID(module) \ │ │ │ │ │ + 278 DUNE_VERSION_ID( DUNE_VERSION_JOIN(module,MAJOR), DUNE_VERSION_JOIN │ │ │ │ │ +(module,MINOR), DUNE_VERSION_JOIN(module,REVISION) ) │ │ │ │ │ + 279 │ │ │ │ │ + 280#endif │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00044.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: indicessyncer.hh File Reference │ │ │ │ +dune-common: transpose.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,86 +58,60 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ - │ │ │ │ +
transpose.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

Class for adding missing indices of a distributed index set in a local communication. │ │ │ │ -More...

│ │ │ │ -
#include "indexset.hh"
│ │ │ │ -#include "remoteindices.hh"
│ │ │ │ -#include <dune/common/stdstreams.hh>
│ │ │ │ -#include <dune/common/sllist.hh>
│ │ │ │ -#include <cassert>
│ │ │ │ -#include <cmath>
│ │ │ │ -#include <limits>
│ │ │ │ -#include <algorithm>
│ │ │ │ +
#include <cstddef>
│ │ │ │ #include <functional>
│ │ │ │ -#include <map>
│ │ │ │ -#include <tuple>
│ │ │ │ +#include <dune/common/std/type_traits.hh>
│ │ │ │ +#include <dune/common/fmatrix.hh>
│ │ │ │ +#include <dune/common/promotiontraits.hh>
│ │ │ │ +#include <dune/common/referencehelper.hh>
│ │ │ │ +#include <dune/common/dynmatrix.hh>
│ │ │ │ +#include <dune/common/matrixconcepts.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::IndicesSyncer< T >
 Class for recomputing missing indices of a distributed index set. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ Functions

template<typename TG , typename TA >
bool Dune::operator< (const IndexPair< TG, ParallelLocalIndex< TA > > &i1, const std::pair< TG, TA > &i2)
 
template<typename TG , typename TA >
bool Dune::operator< (const std::pair< TG, TA > &i1, const IndexPair< TG, ParallelLocalIndex< TA > > &i2)
 
template<typename TG , typename TA >
bool Dune::operator== (const IndexPair< TG, ParallelLocalIndex< TA > > &i1, const std::pair< TG, TA > &i2)
 
template<typename TG , typename TA >
bool Dune::operator!= (const IndexPair< TG, ParallelLocalIndex< TA > > &i1, const std::pair< TG, TA > &i2)
 
template<typename TG , typename TA >
bool Dune::operator== (const std::pair< TG, TA > &i2, const IndexPair< TG, ParallelLocalIndex< TA > > &i1)
 
template<typename TG , typename TA >
bool Dune::operator!= (const std::pair< TG, TA > &i2, const IndexPair< TG, ParallelLocalIndex< TA > > &i1)
 
template<typename T , typename A , typename A1 >
void Dune::storeGlobalIndicesOfRemoteIndices (std::map< int, SLList< std::pair< typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > &globalMap, const RemoteIndices< T, A1 > &remoteIndices)
 Stores the corresponding global indices of the remote index information. More...
 
template<typename T , typename A , typename A1 >
void Dune::repairLocalIndexPointers (std::map< int, SLList< std::pair< typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > &globalMap, RemoteIndices< T, A1 > &remoteIndices, const T &indexSet)
 Repair the pointers to the local indices in the remote indices. More...
 
template<class Matrix , std::enable_if_t< Impl::HasMemberFunctionTransposed< Matrix >::value, int > = 0>
auto Dune::transpose (const Matrix &matrix)
 Return the transposed of the given matrix. More...
 
template<class Matrix , std::enable_if_t< not Impl::HasMemberFunctionTransposed< std::decay_t< Matrix > >::value, int > = 0>
auto Dune::transpose (Matrix &&matrix)
 Create a wrapper modelling the transposed matrix. More...
 
template<class Matrix >
auto Dune::transpose (const std::reference_wrapper< Matrix > &matrix)
 Create a wrapper modelling the transposed matrix. More...
 
template<class Matrix >
auto Dune::transposedView (const Matrix &matrix)
 Create a view modelling the transposed matrix. More...
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Class for adding missing indices of a distributed index set in a local communication.

│ │ │ │ -
Author
Markus Blatt
│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,80 +4,44 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -Classes | Namespaces | Functions │ │ │ │ │ -indicessyncer.hh File Reference │ │ │ │ │ -Common » Parallel_Communication » Parallel_Computing_based_on_Indexsets │ │ │ │ │ -Class for adding missing indices of a distributed index set in a local │ │ │ │ │ -communication. More... │ │ │ │ │ -#include "indexset.hh" │ │ │ │ │ -#include "remoteindices.hh" │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Namespaces | Functions │ │ │ │ │ +transpose.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ - Classes │ │ │ │ │ -class  Dune::IndicesSyncer<_T_> │ │ │ │ │ -  Class for recomputing missing indices of a distributed index set. │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ -bool Dune::operator< (const IndexPair< TG, ParallelLocalIndex< TA > > &i1, │ │ │ │ │ - const std::pair< TG, TA > &i2) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -bool Dune::operator< (const std::pair< TG, TA > &i1, const IndexPair< TG, │ │ │ │ │ - ParallelLocalIndex< TA > > &i2) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -bool Dune::operator== (const IndexPair< TG, ParallelLocalIndex< TA > > &i1, │ │ │ │ │ - const std::pair< TG, TA > &i2) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -bool Dune::operator!= (const IndexPair< TG, ParallelLocalIndex< TA > > &i1, │ │ │ │ │ - const std::pair< TG, TA > &i2) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -bool Dune::operator== (const std::pair< TG, TA > &i2, const IndexPair< TG, │ │ │ │ │ - ParallelLocalIndex< TA > > &i1) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -bool Dune::operator!= (const std::pair< TG, TA > &i2, const IndexPair< TG, │ │ │ │ │ - ParallelLocalIndex< TA > > &i1) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void Dune::storeGlobalIndicesOfRemoteIndices (std::map< int, SLList< std:: │ │ │ │ │ - pair< typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > │ │ │ │ │ - &globalMap, const RemoteIndices< T, A1 > &remoteIndices) │ │ │ │ │ -  Stores the corresponding global indices of the remote index information. │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -void Dune::repairLocalIndexPointers (std::map< int, SLList< std::pair< │ │ │ │ │ - typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > │ │ │ │ │ - &globalMap, RemoteIndices< T, A1 > &remoteIndices, const T &indexSet) │ │ │ │ │ -  Repair the pointers to the local indices in the remote indices. More... │ │ │ │ │ +template::value, int > = 0> │ │ │ │ │ +auto Dune::transpose (const Matrix &matrix) │ │ │ │ │ +  Return the transposed of the given matrix. More... │ │ │ │ │ +  │ │ │ │ │ +template >::value, int > = 0> │ │ │ │ │ +auto Dune::transpose (Matrix &&matrix) │ │ │ │ │ +  Create a wrapper modelling the transposed matrix. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto Dune::transpose (const std::reference_wrapper< Matrix > &matrix) │ │ │ │ │ +  Create a wrapper modelling the transposed matrix. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto Dune::transposedView (const Matrix &matrix) │ │ │ │ │ +  Create a view modelling the transposed matrix. More... │ │ │ │ │   │ │ │ │ │ -***** Detailed Description ***** │ │ │ │ │ -Class for adding missing indices of a distributed index set in a local │ │ │ │ │ -communication. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00044_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: indicessyncer.hh Source File │ │ │ │ +dune-common: transpose.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,996 +58,244 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
indicessyncer.hh
│ │ │ │ +
transpose.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 (C) 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_INDICESSYNCER_HH
│ │ │ │ -
6#define DUNE_INDICESSYNCER_HH
│ │ │ │ +
5#ifndef DUNE_COMMON_TRANSPOSE_HH
│ │ │ │ +
6#define DUNE_COMMON_TRANSPOSE_HH
│ │ │ │
7
│ │ │ │ -
8#include "indexset.hh"
│ │ │ │ -
9#include "remoteindices.hh"
│ │ │ │ - │ │ │ │ -
11#include <dune/common/sllist.hh>
│ │ │ │ -
12#include <cassert>
│ │ │ │ -
13#include <cmath>
│ │ │ │ -
14#include <limits>
│ │ │ │ -
15#include <algorithm>
│ │ │ │ -
16#include <functional>
│ │ │ │ -
17#include <map>
│ │ │ │ -
18#include <tuple>
│ │ │ │ +
8#include <cstddef>
│ │ │ │ +
9#include <functional>
│ │ │ │ +
10
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
17
│ │ │ │ +
18namespace Dune {
│ │ │ │
19
│ │ │ │ -
20#if HAVE_MPI
│ │ │ │ -
21namespace Dune
│ │ │ │ -
22{
│ │ │ │ -
39 template<typename T>
│ │ │ │ - │ │ │ │ -
41 {
│ │ │ │ -
42 public:
│ │ │ │ -
43
│ │ │ │ - │ │ │ │ -
46
│ │ │ │ - │ │ │ │ -
49
│ │ │ │ - │ │ │ │ -
52
│ │ │ │ -
54 typedef typename ParallelIndexSet::LocalIndex::Attribute Attribute;
│ │ │ │ -
55
│ │ │ │ - │ │ │ │ -
60
│ │ │ │ - │ │ │ │ -
71 RemoteIndices& remoteIndices);
│ │ │ │ -
72
│ │ │ │ -
82 void sync();
│ │ │ │ -
83
│ │ │ │ -
94 template<typename T1>
│ │ │ │ -
95 void sync(T1& numberer);
│ │ │ │ -
96
│ │ │ │ -
97 private:
│ │ │ │ +
20namespace Impl {
│ │ │ │ +
21
│ │ │ │ +
22
│ │ │ │ +
23
│ │ │ │ +
24 template<class M, bool = IsStaticSizeMatrix<M>::value>
│ │ │ │ +
25 struct TransposedDenseMatrixTraits
│ │ │ │ +
26 {
│ │ │ │ +
27 using type = Dune::FieldMatrix<typename FieldTraits<M>::field_type, M::cols, M::rows>;
│ │ │ │ +
28 };
│ │ │ │ +
29
│ │ │ │ +
30 template<class M>
│ │ │ │ +
31 struct TransposedDenseMatrixTraits<M, false>
│ │ │ │ +
32 {
│ │ │ │ + │ │ │ │ +
34 };
│ │ │ │ +
35
│ │ │ │ +
36 template<class M>
│ │ │ │ +
37 using TransposedDenseMatrixTraits_t = typename TransposedDenseMatrixTraits<M>::type;
│ │ │ │ +
38
│ │ │ │ +
39
│ │ │ │ +
40
│ │ │ │ +
41 // CRTP mixin class to provide the static part of the interface,
│ │ │ │ +
42 // namely enums rows and cols.
│ │ │ │ +
43 template<class WM, bool staticSize = IsStaticSizeMatrix<WM>::value>
│ │ │ │ +
44 class TransposedMatrixWrapperMixin {};
│ │ │ │ +
45
│ │ │ │ +
46 template<class WM>
│ │ │ │ +
47 class TransposedMatrixWrapperMixin<WM, true>
│ │ │ │ +
48 {
│ │ │ │ +
49 public:
│ │ │ │ +
50
│ │ │ │ +
52 constexpr static int rows = WM::cols;
│ │ │ │ +
54 constexpr static int cols = WM::rows;
│ │ │ │ +
55 };
│ │ │ │ +
56
│ │ │ │ +
57
│ │ │ │ +
58
│ │ │ │ +
59 template<class M>
│ │ │ │ +
60 class TransposedMatrixWrapper;
│ │ │ │ +
61
│ │ │ │ +
62} // namespace Impl
│ │ │ │ +
63
│ │ │ │ +
64// Specialization of FieldTraits needs to be in namespace Dune::
│ │ │ │ +
65template<class M>
│ │ │ │ +
66struct FieldTraits< Impl::TransposedMatrixWrapper<M> >
│ │ │ │ +
67{
│ │ │ │ +
68 using field_type = typename FieldTraits<ResolveRef_t<M>>::field_type;
│ │ │ │ +
69 using real_type = typename FieldTraits<ResolveRef_t<M>>::real_type;
│ │ │ │ +
70};
│ │ │ │ +
71
│ │ │ │ +
72namespace Impl {
│ │ │ │ +
73
│ │ │ │ +
74 // Wrapper representing the transposed of a matrix.
│ │ │ │ +
75 // Creating the wrapper does not compute anything
│ │ │ │ +
76 // but only serves for tagging the wrapped matrix
│ │ │ │ +
77 // for transposition. This class will store M by value.
│ │ │ │ +
78 // To support reference-semantic, it supports using
│ │ │ │ +
79 // M=std::reference_wrapper<OriginalMatrixType>.
│ │ │ │ +
80 template<class M>
│ │ │ │ +
81 class TransposedMatrixWrapper :
│ │ │ │ +
82 public TransposedMatrixWrapperMixin<ResolveRef_t<M>>
│ │ │ │ +
83 {
│ │ │ │ +
84 constexpr static bool hasStaticSize = IsStaticSizeMatrix<ResolveRef_t<M>>::value;
│ │ │ │ +
85 public:
│ │ │ │ +
86 using WrappedMatrix = ResolveRef_t<M>;
│ │ │ │ +
87
│ │ │ │ +
88 const WrappedMatrix& wrappedMatrix() const {
│ │ │ │ +
89 return resolveRef(matrix_);
│ │ │ │ +
90 }
│ │ │ │ +
91
│ │ │ │ +
92
│ │ │ │ +
93 using value_type = typename WrappedMatrix::value_type;
│ │ │ │ +
94 using field_type = typename FieldTraits<WrappedMatrix>::field_type;
│ │ │ │ +
95
│ │ │ │ +
96 TransposedMatrixWrapper(M&& matrix) : matrix_(std::move(matrix)) {}
│ │ │ │ +
97 TransposedMatrixWrapper(const M& matrix) : matrix_(matrix) {}
│ │ │ │
98
│ │ │ │ -
100 ParallelIndexSet& indexSet_;
│ │ │ │ -
101
│ │ │ │ -
103 RemoteIndices& remoteIndices_;
│ │ │ │ -
104
│ │ │ │ -
106 char** sendBuffers_;
│ │ │ │ -
107
│ │ │ │ -
109 char* receiveBuffer_;
│ │ │ │ -
110
│ │ │ │ -
112 std::size_t* sendBufferSizes_;
│ │ │ │ -
113
│ │ │ │ -
115 int receiveBufferSize_; // int because of MPI
│ │ │ │ -
116
│ │ │ │ -
120 struct MessageInformation
│ │ │ │ -
121 {
│ │ │ │ - │ │ │ │ -
123 : publish(), pairs()
│ │ │ │ -
124 {}
│ │ │ │ - │ │ │ │ -
131 int pairs;
│ │ │ │ -
132 };
│ │ │ │ +
99 template<class MatrixA,
│ │ │ │ +
100 std::enable_if_t<
│ │ │ │ +
101 ((not Impl::IsFieldMatrix<MatrixA>::value) or (not hasStaticSize))
│ │ │ │ +
102 and Impl::IsDenseMatrix_v<MatrixA>, int> = 0>
│ │ │ │ +
103 friend auto operator* (const MatrixA& matrixA, const TransposedMatrixWrapper& matrixB)
│ │ │ │ +
104 {
│ │ │ │ +
105 using FieldA = typename FieldTraits<MatrixA>::field_type;
│ │ │ │ + │ │ │ │ + │ │ │ │ +
108
│ │ │ │ +
109 // We exploit that the rows of AB^T are the columns of (AB^T)^T = BA^T.
│ │ │ │ +
110 // Hence we get the row-vectors of AB^T by mutiplying B to the row-vectors
│ │ │ │ +
111 // of A.
│ │ │ │ +
112 if constexpr(IsStaticSizeMatrix_v<MatrixA> and IsStaticSizeMatrix_v<WrappedMatrix>)
│ │ │ │ +
113 {
│ │ │ │ +
114 FieldMatrix<Field, MatrixA::rows, WrappedMatrix::rows> result;
│ │ │ │ +
115 for (std::size_t j=0; j<MatrixA::rows; ++j)
│ │ │ │ +
116 matrixB.wrappedMatrix().mv(matrixA[j], result[j]);
│ │ │ │ +
117 return result;
│ │ │ │ +
118 }
│ │ │ │ +
119 else
│ │ │ │ +
120 {
│ │ │ │ +
121 DynamicMatrix<Field> result(matrixA.N(), matrixB.wrappedMatrix().N());
│ │ │ │ +
122 for (std::size_t j=0; j<matrixA.N(); ++j)
│ │ │ │ +
123 matrixB.wrappedMatrix().mv(matrixA[j], result[j]);
│ │ │ │ +
124 return result;
│ │ │ │ +
125 }
│ │ │ │ +
126 }
│ │ │ │ +
127
│ │ │ │ +
128 template<class X, class Y>
│ │ │ │ +
129 void mv (const X& x, Y& y) const
│ │ │ │ +
130 {
│ │ │ │ +
131 wrappedMatrix().mtv(x,y);
│ │ │ │ +
132 }
│ │ │ │
133
│ │ │ │ -
137 class DefaultNumberer
│ │ │ │ -
138 {
│ │ │ │ -
139 public:
│ │ │ │ -
145 std::size_t operator()([[maybe_unused]] const GlobalIndex& global)
│ │ │ │ -
146 {
│ │ │ │ - │ │ │ │ -
148 }
│ │ │ │ -
149 };
│ │ │ │ -
150
│ │ │ │ -
152 MPI_Datatype datatype_;
│ │ │ │ -
153
│ │ │ │ -
155 int rank_;
│ │ │ │ -
156
│ │ │ │ -
161 typedef SLList<std::pair<GlobalIndex,Attribute>, typename RemoteIndices::Allocator> GlobalIndexList;
│ │ │ │ +
134 template<class X, class Y>
│ │ │ │ +
135 void mtv (const X& x, Y& y) const
│ │ │ │ +
136 {
│ │ │ │ +
137 wrappedMatrix().mv(x,y);
│ │ │ │ +
138 }
│ │ │ │ +
139
│ │ │ │ +
140 // Return a classical representation of the matrix.
│ │ │ │ +
141 // Since we do not know the internals of the wrapped
│ │ │ │ +
142 // matrix, this will always be a dense matrix. Depending
│ │ │ │ +
143 // on whether the matrix has static size or not, this
│ │ │ │ +
144 // will be either a FieldMatrix or a DynamicMatrix.
│ │ │ │ +
145 TransposedDenseMatrixTraits_t<WrappedMatrix> asDense() const
│ │ │ │ +
146 {
│ │ │ │ +
147 TransposedDenseMatrixTraits_t<WrappedMatrix> MT;
│ │ │ │ +
148 if constexpr(not IsStaticSizeMatrix<WrappedMatrix>::value)
│ │ │ │ +
149 {
│ │ │ │ +
150 MT.resize(wrappedMatrix().M(), wrappedMatrix().N(), 0);
│ │ │ │ +
151 }
│ │ │ │ +
152 for(auto&& [M_i, i] : Dune::sparseRange(wrappedMatrix()))
│ │ │ │ +
153 for(auto&& [M_ij, j] : Dune::sparseRange(M_i))
│ │ │ │ +
154 MT[j][i] = M_ij;
│ │ │ │ +
155 return MT;
│ │ │ │ +
156 }
│ │ │ │ +
157
│ │ │ │ +
158 private:
│ │ │ │ +
159
│ │ │ │ +
160 M matrix_;
│ │ │ │ +
161 };
│ │ │ │
162
│ │ │ │ -
164 typedef typename GlobalIndexList::ModifyIterator GlobalIndexModifier;
│ │ │ │ +
163 template<class M>
│ │ │ │ +
164 using MemberFunctionTransposedConcept = std::void_t<decltype(std::declval<M>().transposed())>;
│ │ │ │
165
│ │ │ │ - │ │ │ │ -
170 GlobalIndexIterator;
│ │ │ │ +
166 template<class M>
│ │ │ │ +
167 struct HasMemberFunctionTransposed : public Dune::Std::is_detected<MemberFunctionTransposedConcept, M> {};
│ │ │ │ +
168
│ │ │ │ +
169} // namespace Impl
│ │ │ │ +
170
│ │ │ │
171
│ │ │ │ -
173 typedef std::map<int, GlobalIndexList> GlobalIndicesMap;
│ │ │ │ -
174
│ │ │ │ -
183 GlobalIndicesMap globalMap_;
│ │ │ │ -
184
│ │ │ │ - │ │ │ │ -
189
│ │ │ │ -
193 typedef typename BoolList::iterator BoolIterator;
│ │ │ │ -
194
│ │ │ │ -
196 typedef typename BoolList::ModifyIterator BoolListModifier;
│ │ │ │ -
197
│ │ │ │ -
199 typedef std::map<int,BoolList> BoolMap;
│ │ │ │ -
200
│ │ │ │ -
205 BoolMap oldMap_;
│ │ │ │ -
206
│ │ │ │ -
208 std::map<int,MessageInformation> infoSend_;
│ │ │ │ -
209
│ │ │ │ -
211 typedef typename RemoteIndices::RemoteIndexList RemoteIndexList;
│ │ │ │ -
212
│ │ │ │ -
214 typedef typename RemoteIndexList::ModifyIterator RemoteIndexModifier;
│ │ │ │ +
172
│ │ │ │ +
181template<class Matrix,
│ │ │ │ +
182 std::enable_if_t<Impl::HasMemberFunctionTransposed<Matrix>::value, int> = 0>
│ │ │ │ +
183auto transpose(const Matrix& matrix) {
│ │ │ │ +
184 return matrix.transposed();
│ │ │ │ +
185}
│ │ │ │ +
186
│ │ │ │ +
187
│ │ │ │ +
188
│ │ │ │ +
210template<class Matrix,
│ │ │ │ +
211 std::enable_if_t<not Impl::HasMemberFunctionTransposed<std::decay_t<Matrix>>::value, int> = 0>
│ │ │ │ +
212auto transpose(Matrix&& matrix) {
│ │ │ │ +
213 return Impl::TransposedMatrixWrapper(std::forward<Matrix>(matrix));
│ │ │ │ +
214}
│ │ │ │
215
│ │ │ │ - │ │ │ │ -
218
│ │ │ │ -
220 typedef typename RemoteIndexList::iterator RemoteIndexIterator;
│ │ │ │ -
221
│ │ │ │ -
223 typedef typename RemoteIndexList::const_iterator ConstRemoteIndexIterator;
│ │ │ │ -
224
│ │ │ │ -
226 typedef std::tuple<RemoteIndexModifier,GlobalIndexModifier,BoolListModifier,
│ │ │ │ -
227 const ConstRemoteIndexIterator> IteratorTuple;
│ │ │ │ -
228
│ │ │ │ -
236 class Iterators
│ │ │ │ -
237 {
│ │ │ │ -
238 friend class IndicesSyncer<T>;
│ │ │ │ -
239 public:
│ │ │ │ -
249 Iterators(RemoteIndexList& remoteIndices, GlobalIndexList& globalIndices,
│ │ │ │ -
250 BoolList& booleans);
│ │ │ │ -
251
│ │ │ │ -
255 Iterators();
│ │ │ │ -
256
│ │ │ │ -
260 Iterators& operator++();
│ │ │ │ -
261
│ │ │ │ -
267 void insert(const RemoteIndex& index,
│ │ │ │ -
268 const std::pair<GlobalIndex,Attribute>& global);
│ │ │ │ -
269
│ │ │ │ -
274 RemoteIndex& remoteIndex() const;
│ │ │ │ -
275
│ │ │ │ -
280 std::pair<GlobalIndex,Attribute>& globalIndexPair() const;
│ │ │ │ -
281
│ │ │ │ - │ │ │ │ -
283
│ │ │ │ -
289 bool isOld() const;
│ │ │ │ -
290
│ │ │ │ -
300 void reset(RemoteIndexList& remoteIndices, GlobalIndexList& globalIndices,
│ │ │ │ -
301 BoolList& booleans);
│ │ │ │ -
302
│ │ │ │ -
308 bool isNotAtEnd() const;
│ │ │ │ -
309
│ │ │ │ -
315 bool isAtEnd() const;
│ │ │ │ -
316
│ │ │ │ -
317 private:
│ │ │ │ -
327 IteratorTuple iterators_;
│ │ │ │ -
328 };
│ │ │ │ -
329
│ │ │ │ -
331 typedef std::map<int,Iterators> IteratorsMap;
│ │ │ │ -
332
│ │ │ │ -
344 IteratorsMap iteratorsMap_;
│ │ │ │ -
345
│ │ │ │ -
347 void calculateMessageSizes();
│ │ │ │ -
348
│ │ │ │ -
356 void packAndSend(int destination, char* buffer, std::size_t bufferSize, MPI_Request& req);
│ │ │ │ -
357
│ │ │ │ -
362 template<typename T1>
│ │ │ │ -
363 void recvAndUnpack(T1& numberer);
│ │ │ │ -
364
│ │ │ │ -
368 void registerMessageDatatype();
│ │ │ │ -
369
│ │ │ │ -
373 void insertIntoRemoteIndexList(int process,
│ │ │ │ -
374 const std::pair<GlobalIndex,Attribute>& global,
│ │ │ │ -
375 char attribute);
│ │ │ │ -
376
│ │ │ │ -
380 void resetIteratorsMap();
│ │ │ │ -
381
│ │ │ │ -
386 bool checkReset();
│ │ │ │ -
387
│ │ │ │ -
396 bool checkReset(const Iterators& iterators, RemoteIndexList& rlist, GlobalIndexList& gList,
│ │ │ │ -
397 BoolList& bList);
│ │ │ │ -
398 };
│ │ │ │ -
399
│ │ │ │ -
400 template<typename TG, typename TA>
│ │ │ │ - │ │ │ │ -
402 const std::pair<TG,TA>& i2)
│ │ │ │ -
403 {
│ │ │ │ -
404 return i1.global() < i2.first ||
│ │ │ │ -
405 (i1.global() == i2.first && i1.local().attribute()<i2.second);
│ │ │ │ -
406 }
│ │ │ │ -
407
│ │ │ │ -
408 template<typename TG, typename TA>
│ │ │ │ -
409 bool operator<(const std::pair<TG,TA>& i1,
│ │ │ │ -
410 const IndexPair<TG,ParallelLocalIndex<TA> >& i2)
│ │ │ │ -
411 {
│ │ │ │ -
412 return i1.first < i2.global() ||
│ │ │ │ -
413 (i1.first == i2.global() && i1.second<i2.local().attribute());
│ │ │ │ -
414 }
│ │ │ │ -
415
│ │ │ │ -
416 template<typename TG, typename TA>
│ │ │ │ - │ │ │ │ -
418 const std::pair<TG,TA>& i2)
│ │ │ │ -
419 {
│ │ │ │ -
420 return (i1.global() == i2.first && i1.local().attribute()==i2.second);
│ │ │ │ -
421 }
│ │ │ │ -
422
│ │ │ │ -
423 template<typename TG, typename TA>
│ │ │ │ - │ │ │ │ -
425 const std::pair<TG,TA>& i2)
│ │ │ │ -
426 {
│ │ │ │ -
427 return (i1.global() != i2.first || i1.local().attribute()!=i2.second);
│ │ │ │ -
428 }
│ │ │ │ -
429
│ │ │ │ -
430 template<typename TG, typename TA>
│ │ │ │ -
431 bool operator==(const std::pair<TG,TA>& i2,
│ │ │ │ -
432 const IndexPair<TG,ParallelLocalIndex<TA> >& i1)
│ │ │ │ -
433 {
│ │ │ │ -
434 return (i1.global() == i2.first && i1.local().attribute()==i2.second);
│ │ │ │ -
435 }
│ │ │ │ -
436
│ │ │ │ -
437 template<typename TG, typename TA>
│ │ │ │ -
438 bool operator!=(const std::pair<TG,TA>& i2,
│ │ │ │ -
439 const IndexPair<TG,ParallelLocalIndex<TA> >& i1)
│ │ │ │ -
440 {
│ │ │ │ -
441 return (i1.global() != i2.first || i1.local().attribute()!=i2.second);
│ │ │ │ -
442 }
│ │ │ │ -
443
│ │ │ │ -
460 template<typename T, typename A, typename A1>
│ │ │ │ -
461 void storeGlobalIndicesOfRemoteIndices(std::map<int,SLList<std::pair<typename T::GlobalIndex, typename T::LocalIndex::Attribute>,A> >& globalMap,
│ │ │ │ -
462 const RemoteIndices<T,A1>& remoteIndices)
│ │ │ │ -
463 {
│ │ │ │ -
464 for(auto remote = remoteIndices.begin(), end =remoteIndices.end(); remote != end; ++remote) {
│ │ │ │ -
465 typedef typename RemoteIndices<T,A1>::RemoteIndexList RemoteIndexList;
│ │ │ │ - │ │ │ │ -
467 GlobalIndexList& global = globalMap[remote->first];
│ │ │ │ -
468 RemoteIndexList& rList = *(remote->second.first);
│ │ │ │ -
469
│ │ │ │ -
470 for(auto index = rList.begin(), riEnd = rList.end();
│ │ │ │ -
471 index != riEnd; ++index) {
│ │ │ │ -
472 global.push_back(std::make_pair(index->localIndexPair().global(),
│ │ │ │ -
473 index->localIndexPair().local().attribute()));
│ │ │ │ -
474 }
│ │ │ │ -
475 }
│ │ │ │ -
476 }
│ │ │ │ -
477
│ │ │ │ -
486 template<typename T, typename A, typename A1>
│ │ │ │ -
487 inline void repairLocalIndexPointers(std::map<int,
│ │ │ │ -
488 SLList<std::pair<typename T::GlobalIndex,
│ │ │ │ -
489 typename T::LocalIndex::Attribute>,A> >& globalMap,
│ │ │ │ -
490 RemoteIndices<T,A1>& remoteIndices,
│ │ │ │ -
491 const T& indexSet)
│ │ │ │ -
492 {
│ │ │ │ -
493 assert(globalMap.size()==static_cast<std::size_t>(remoteIndices.neighbours()));
│ │ │ │ -
494 // Repair pointers to index set in remote indices.
│ │ │ │ -
495 auto global = globalMap.begin();
│ │ │ │ -
496 auto end = remoteIndices.remoteIndices_.end();
│ │ │ │ -
497
│ │ │ │ -
498 for(auto remote = remoteIndices.remoteIndices_.begin(); remote != end; ++remote, ++global) {
│ │ │ │ -
499 assert(remote->first==global->first);
│ │ │ │ -
500 assert(remote->second.first->size() == global->second.size());
│ │ │ │ -
501
│ │ │ │ -
502 auto riEnd = remote->second.first->end();
│ │ │ │ -
503 auto rIndex = remote->second.first->begin();
│ │ │ │ -
504 auto gIndex = global->second.begin();
│ │ │ │ -
505 auto index = indexSet.begin();
│ │ │ │ -
506
│ │ │ │ -
507 assert(rIndex==riEnd || gIndex != global->second.end());
│ │ │ │ -
508 while(rIndex != riEnd) {
│ │ │ │ -
509 // Search for the index in the set.
│ │ │ │ -
510 assert(gIndex != global->second.end());
│ │ │ │ -
511
│ │ │ │ -
512 while(!(index->global() == gIndex->first
│ │ │ │ -
513 && index->local().attribute() == gIndex->second)) {
│ │ │ │ -
514 ++index;
│ │ │ │ -
515 // this is only needed for ALU, where there may exist
│ │ │ │ -
516 // more entries with the same global index in the remote index set
│ │ │ │ -
517 // than in the index set
│ │ │ │ -
518 if (index->global() > gIndex->first) {
│ │ │ │ -
519 index=indexSet.begin();
│ │ │ │ -
520 }
│ │ │ │ -
521 }
│ │ │ │ -
522
│ │ │ │ -
523 assert(index != indexSet.end() && *index == *gIndex);
│ │ │ │ -
524
│ │ │ │ -
525 rIndex->localIndex_ = &(*index);
│ │ │ │ -
526 ++index;
│ │ │ │ -
527 ++rIndex;
│ │ │ │ -
528 ++gIndex;
│ │ │ │ -
529 }
│ │ │ │ -
530 }
│ │ │ │ -
531 remoteIndices.sourceSeqNo_ = remoteIndices.source_->seqNo();
│ │ │ │ -
532 remoteIndices.destSeqNo_ = remoteIndices.target_->seqNo();
│ │ │ │ -
533 }
│ │ │ │ -
534
│ │ │ │ -
535 template<typename T>
│ │ │ │ - │ │ │ │ -
537 RemoteIndices& remoteIndices)
│ │ │ │ -
538 : indexSet_(indexSet), remoteIndices_(remoteIndices)
│ │ │ │ -
539 {
│ │ │ │ -
540 // index sets must match.
│ │ │ │ -
541 assert(remoteIndices.source_ == remoteIndices.target_);
│ │ │ │ -
542 assert(remoteIndices.source_ == &indexSet);
│ │ │ │ -
543 MPI_Comm_rank(remoteIndices_.communicator(), &rank_);
│ │ │ │ -
544 }
│ │ │ │ -
545
│ │ │ │ -
546 template<typename T>
│ │ │ │ - │ │ │ │ -
548 GlobalIndexList& globalIndices,
│ │ │ │ -
549 BoolList& booleans)
│ │ │ │ -
550 : iterators_(remoteIndices.beginModify(), globalIndices.beginModify(),
│ │ │ │ -
551 booleans.beginModify(), remoteIndices.end())
│ │ │ │ -
552 { }
│ │ │ │ -
553
│ │ │ │ -
554 template<typename T>
│ │ │ │ - │ │ │ │ -
556 : iterators_()
│ │ │ │ -
557 {}
│ │ │ │ -
558
│ │ │ │ -
559 template<typename T>
│ │ │ │ - │ │ │ │ -
561 {
│ │ │ │ -
562 ++(std::get<0>(iterators_));
│ │ │ │ -
563 ++(std::get<1>(iterators_));
│ │ │ │ -
564 ++(std::get<2>(iterators_));
│ │ │ │ -
565 return *this;
│ │ │ │ -
566 }
│ │ │ │ -
567
│ │ │ │ -
568 template<typename T>
│ │ │ │ - │ │ │ │ -
570 const std::pair<GlobalIndex,Attribute>& global)
│ │ │ │ -
571 {
│ │ │ │ -
572 std::get<0>(iterators_).insert(index);
│ │ │ │ -
573 std::get<1>(iterators_).insert(global);
│ │ │ │ -
574 std::get<2>(iterators_).insert(false);
│ │ │ │ -
575 }
│ │ │ │ -
576
│ │ │ │ -
577 template<typename T>
│ │ │ │ -
578 inline typename IndicesSyncer<T>::RemoteIndex&
│ │ │ │ - │ │ │ │ -
580 {
│ │ │ │ -
581 return *(std::get<0>(iterators_));
│ │ │ │ -
582 }
│ │ │ │ -
583
│ │ │ │ -
584 template<typename T>
│ │ │ │ -
585 inline std::pair<typename IndicesSyncer<T>::GlobalIndex,typename IndicesSyncer<T>::Attribute>&
│ │ │ │ - │ │ │ │ -
587 {
│ │ │ │ -
588 return *(std::get<1>(iterators_));
│ │ │ │ -
589 }
│ │ │ │ -
590
│ │ │ │ -
591 template<typename T>
│ │ │ │ - │ │ │ │ -
593 {
│ │ │ │ -
594 return *(std::get<2>(iterators_));
│ │ │ │ -
595 }
│ │ │ │ -
596
│ │ │ │ -
597 template<typename T>
│ │ │ │ - │ │ │ │ -
599 GlobalIndexList& globalIndices,
│ │ │ │ -
600 BoolList& booleans)
│ │ │ │ -
601 {
│ │ │ │ -
602 std::get<0>(iterators_) = remoteIndices.beginModify();
│ │ │ │ -
603 std::get<1>(iterators_) = globalIndices.beginModify();
│ │ │ │ -
604 std::get<2>(iterators_) = booleans.beginModify();
│ │ │ │ -
605 }
│ │ │ │ -
606
│ │ │ │ -
607 template<typename T>
│ │ │ │ - │ │ │ │ -
609 {
│ │ │ │ -
610 return std::get<0>(iterators_) != std::get<3>(iterators_);
│ │ │ │ -
611 }
│ │ │ │ -
612
│ │ │ │ -
613 template<typename T>
│ │ │ │ - │ │ │ │ -
615 {
│ │ │ │ -
616 return std::get<0>(iterators_) == std::get<3>(iterators_);
│ │ │ │ -
617 }
│ │ │ │ -
618
│ │ │ │ -
619 template<typename T>
│ │ │ │ - │ │ │ │ -
621 {
│ │ │ │ -
622 MPI_Datatype type[2] = {MPI_INT, MPI_INT};
│ │ │ │ -
623 int blocklength[2] = {1,1};
│ │ │ │ -
624 MPI_Aint displacement[2];
│ │ │ │ -
625 MPI_Aint base;
│ │ │ │ -
626
│ │ │ │ -
627 // Compute displacement
│ │ │ │ -
628 MessageInformation message;
│ │ │ │ -
629
│ │ │ │ -
630 MPI_Get_address( &(message.publish), displacement);
│ │ │ │ -
631 MPI_Get_address( &(message.pairs), displacement+1);
│ │ │ │ -
632
│ │ │ │ -
633 // Make the displacement relative
│ │ │ │ -
634 MPI_Get_address(&message, &base);
│ │ │ │ -
635 displacement[0] -= base;
│ │ │ │ -
636 displacement[1] -= base;
│ │ │ │ -
637
│ │ │ │ -
638 MPI_Type_create_struct( 2, blocklength, displacement, type, &datatype_);
│ │ │ │ -
639 MPI_Type_commit(&datatype_);
│ │ │ │ -
640 }
│ │ │ │ -
641
│ │ │ │ -
642 template<typename T>
│ │ │ │ -
643 void IndicesSyncer<T>::calculateMessageSizes()
│ │ │ │ -
644 {
│ │ │ │ -
645 auto iEnd = indexSet_.end();
│ │ │ │ -
646 auto collIter = remoteIndices_.template iterator<true>();
│ │ │ │ -
647
│ │ │ │ -
648 for(auto index = indexSet_.begin(); index != iEnd; ++index) {
│ │ │ │ -
649 collIter.advance(index->global(), index->local().attribute());
│ │ │ │ -
650 if(collIter.empty())
│ │ │ │ -
651 break;
│ │ │ │ -
652 int knownRemote=0;
│ │ │ │ -
653 auto end = collIter.end();
│ │ │ │ -
654
│ │ │ │ -
655 // Count the remote indices we know.
│ │ │ │ -
656 for(auto valid = collIter.begin(); valid != end; ++valid) {
│ │ │ │ -
657 ++knownRemote;
│ │ │ │ -
658 }
│ │ │ │ -
659
│ │ │ │ -
660 if(knownRemote>0) {
│ │ │ │ -
661 Dune::dverb<<rank_<<": publishing "<<knownRemote<<" for index "<<index->global()<< " for processes ";
│ │ │ │ -
662
│ │ │ │ -
663 // Update MessageInformation
│ │ │ │ -
664 for(auto valid = collIter.begin(); valid != end; ++valid) {
│ │ │ │ -
665 ++(infoSend_[valid.process()].publish);
│ │ │ │ -
666 (infoSend_[valid.process()].pairs) += knownRemote;
│ │ │ │ -
667 Dune::dverb<<valid.process()<<" ";
│ │ │ │ -
668 Dune::dverb<<"(publish="<<infoSend_[valid.process()].publish<<", pairs="<<infoSend_[valid.process()].pairs
│ │ │ │ -
669 <<") ";
│ │ │ │ -
670 }
│ │ │ │ -
671 Dune::dverb<<std::endl;
│ │ │ │ -
672 }
│ │ │ │ -
673 }
│ │ │ │ -
674
│ │ │ │ -
675 const auto end = infoSend_.end();
│ │ │ │ -
676
│ │ │ │ -
677 // Now determine the buffersizes needed for each neighbour using MPI_Pack_size
│ │ │ │ -
678 MessageInformation dummy;
│ │ │ │ -
679
│ │ │ │ -
680 auto messageIter= infoSend_.begin();
│ │ │ │ -
681 const auto rend = remoteIndices_.end();
│ │ │ │ -
682 int neighbour=0;
│ │ │ │ -
683
│ │ │ │ -
684 for(auto remote = remoteIndices_.begin(); remote != rend; ++remote, ++neighbour) {
│ │ │ │ -
685 MessageInformation* message;
│ │ │ │ -
686 MessageInformation recv;
│ │ │ │ -
687
│ │ │ │ -
688 if(messageIter != end && messageIter->first==remote->first) {
│ │ │ │ -
689 // We want to send message information to that process
│ │ │ │ -
690 message = const_cast<MessageInformation*>(&(messageIter->second));
│ │ │ │ -
691 ++messageIter;
│ │ │ │ -
692 }else
│ │ │ │ -
693 // We do not want to send information but the other process might.
│ │ │ │ -
694 message = &dummy;
│ │ │ │ -
695
│ │ │ │ -
696 sendBufferSizes_[neighbour]=0;
│ │ │ │ -
697 int tsize;
│ │ │ │ -
698 // The number of indices published
│ │ │ │ -
699 MPI_Pack_size(1, MPI_INT,remoteIndices_.communicator(), &tsize);
│ │ │ │ -
700 sendBufferSizes_[neighbour] += tsize;
│ │ │ │ -
701
│ │ │ │ -
702 for(int i=0; i < message->publish; ++i) {
│ │ │ │ -
703 // The global index
│ │ │ │ -
704 MPI_Pack_size(1, MPITraits<GlobalIndex>::getType(), remoteIndices_.communicator(), &tsize);
│ │ │ │ -
705 sendBufferSizes_[neighbour] += tsize;
│ │ │ │ -
706 // The attribute in the local index
│ │ │ │ -
707 MPI_Pack_size(1, MPI_CHAR, remoteIndices_.communicator(), &tsize);
│ │ │ │ -
708 sendBufferSizes_[neighbour] += tsize;
│ │ │ │ -
709 // The number of corresponding remote indices
│ │ │ │ -
710 MPI_Pack_size(1, MPI_INT, remoteIndices_.communicator(), &tsize);
│ │ │ │ -
711 sendBufferSizes_[neighbour] += tsize;
│ │ │ │ -
712 }
│ │ │ │ -
713 for(int i=0; i < message->pairs; ++i) {
│ │ │ │ -
714 // The process of the remote index
│ │ │ │ -
715 MPI_Pack_size(1, MPI_INT, remoteIndices_.communicator(), &tsize);
│ │ │ │ -
716 sendBufferSizes_[neighbour] += tsize;
│ │ │ │ -
717 // The attribute of the remote index
│ │ │ │ -
718 MPI_Pack_size(1, MPI_CHAR, remoteIndices_.communicator(), &tsize);
│ │ │ │ -
719 sendBufferSizes_[neighbour] += tsize;
│ │ │ │ -
720 }
│ │ │ │ -
721
│ │ │ │ -
722 Dune::dverb<<rank_<<": Buffer (neighbour="<<remote->first<<") size is "<< sendBufferSizes_[neighbour]<<" for publish="<<message->publish<<" pairs="<<message->pairs<<std::endl;
│ │ │ │ -
723 }
│ │ │ │ -
724
│ │ │ │ -
725 }
│ │ │ │ -
726
│ │ │ │ -
727 template<typename T>
│ │ │ │ - │ │ │ │ -
729 {
│ │ │ │ -
730 DefaultNumberer numberer;
│ │ │ │ -
731 sync(numberer);
│ │ │ │ -
732 }
│ │ │ │ -
733
│ │ │ │ -
734 template<typename T>
│ │ │ │ -
735 template<typename T1>
│ │ │ │ -
736 void IndicesSyncer<T>::sync(T1& numberer)
│ │ │ │ -
737 {
│ │ │ │ -
738 // The pointers to the local indices in the remote indices
│ │ │ │ -
739 // will become invalid due to the resorting of the index set.
│ │ │ │ -
740 // Therefore store the corresponding global indices.
│ │ │ │ -
741 // Mark all indices as not added
│ │ │ │ -
742 const auto end = remoteIndices_.end();
│ │ │ │ -
743
│ │ │ │ -
744 // Number of neighbours might change during the syncing.
│ │ │ │ -
745 // save the old neighbours
│ │ │ │ -
746 std::size_t noOldNeighbours = remoteIndices_.neighbours();
│ │ │ │ -
747 int* oldNeighbours = new int[noOldNeighbours];
│ │ │ │ -
748 sendBufferSizes_ = new std::size_t[noOldNeighbours];
│ │ │ │ -
749 std::size_t neighbourI = 0;
│ │ │ │ -
750
│ │ │ │ -
751 for(auto remote = remoteIndices_.begin(); remote != end; ++remote, ++neighbourI) {
│ │ │ │ -
752 oldNeighbours[neighbourI] = remote->first;
│ │ │ │ -
753
│ │ │ │ -
754 // Make sure we only have one remote index list.
│ │ │ │ -
755 assert(remote->second.first==remote->second.second);
│ │ │ │ -
756
│ │ │ │ -
757 RemoteIndexList& rList = *(remote->second.first);
│ │ │ │ -
758
│ │ │ │ -
759 // Store the corresponding global indices.
│ │ │ │ -
760 GlobalIndexList& global = globalMap_[remote->first];
│ │ │ │ -
761 BoolList& added = oldMap_[remote->first];
│ │ │ │ -
762 auto riEnd = rList.end();
│ │ │ │ -
763
│ │ │ │ -
764 for(auto index = rList.begin();
│ │ │ │ -
765 index != riEnd; ++index) {
│ │ │ │ -
766 global.push_back(std::make_pair(index->localIndexPair().global(),
│ │ │ │ -
767 index->localIndexPair().local().attribute()));
│ │ │ │ -
768 added.push_back(true);
│ │ │ │ -
769 }
│ │ │ │ -
770
│ │ │ │ -
771 Iterators iterators(rList, global, added);
│ │ │ │ -
772 iteratorsMap_.insert(std::make_pair(remote->first, iterators));
│ │ │ │ -
773 assert(checkReset(iteratorsMap_[remote->first], rList,global,added));
│ │ │ │ -
774 }
│ │ │ │ -
775
│ │ │ │ -
776 // Exchange indices with each neighbour
│ │ │ │ -
777 calculateMessageSizes();
│ │ │ │ -
778
│ │ │ │ -
779 // Allocate the buffers
│ │ │ │ -
780 receiveBufferSize_=1;
│ │ │ │ -
781 sendBuffers_ = new char*[noOldNeighbours];
│ │ │ │ -
782
│ │ │ │ -
783 for(std::size_t i=0; i<noOldNeighbours; ++i) {
│ │ │ │ -
784 sendBuffers_[i] = new char[sendBufferSizes_[i]];
│ │ │ │ -
785 receiveBufferSize_ = std::max(receiveBufferSize_, static_cast<int>(sendBufferSizes_[i]));
│ │ │ │ -
786 }
│ │ │ │ -
787
│ │ │ │ -
788 receiveBuffer_=new char[receiveBufferSize_];
│ │ │ │ -
789
│ │ │ │ -
790 indexSet_.beginResize();
│ │ │ │ -
791
│ │ │ │ -
792 Dune::dverb<<rank_<<": Neighbours: ";
│ │ │ │ -
793
│ │ │ │ -
794 for(std::size_t i = 0; i<noOldNeighbours; ++i)
│ │ │ │ -
795 Dune::dverb<<oldNeighbours[i]<<" ";
│ │ │ │ -
796
│ │ │ │ -
797 Dune::dverb<<std::endl;
│ │ │ │ -
798
│ │ │ │ -
799 MPI_Request* requests = new MPI_Request[noOldNeighbours];
│ │ │ │ -
800 MPI_Status* statuses = new MPI_Status[noOldNeighbours];
│ │ │ │ -
801
│ │ │ │ -
802 // Pack Message data and start the sends
│ │ │ │ -
803 for(std::size_t i = 0; i<noOldNeighbours; ++i)
│ │ │ │ -
804 packAndSend(oldNeighbours[i], sendBuffers_[i], sendBufferSizes_[i], requests[i]);
│ │ │ │ -
805
│ │ │ │ -
806 // Probe for incoming messages, receive and unpack them
│ │ │ │ -
807 for(std::size_t i = 0; i<noOldNeighbours; ++i)
│ │ │ │ -
808 recvAndUnpack(numberer);
│ │ │ │ -
809 // }else{
│ │ │ │ -
810 // recvAndUnpack(oldNeighbours[i], numberer);
│ │ │ │ -
811 // packAndSend(oldNeighbours[i]);
│ │ │ │ -
812 // }
│ │ │ │ -
813 // }
│ │ │ │ -
814
│ │ │ │ -
815 delete[] receiveBuffer_;
│ │ │ │ -
816
│ │ │ │ -
817 // Wait for the completion of the sends
│ │ │ │ -
818 // Wait for completion of sends
│ │ │ │ -
819 if(MPI_SUCCESS!=MPI_Waitall(noOldNeighbours, requests, statuses)) {
│ │ │ │ -
820 std::cerr<<": MPI_Error occurred while sending message"<<std::endl;
│ │ │ │ -
821 for(std::size_t i=0; i< noOldNeighbours; i++)
│ │ │ │ -
822 if(MPI_SUCCESS!=statuses[i].MPI_ERROR)
│ │ │ │ -
823 std::cerr<<"Destination "<<statuses[i].MPI_SOURCE<<" error code: "<<statuses[i].MPI_ERROR<<std::endl;
│ │ │ │ -
824 }
│ │ │ │ -
825
│ │ │ │ -
826 delete[] statuses;
│ │ │ │ -
827 delete[] requests;
│ │ │ │ -
828
│ │ │ │ -
829 for(std::size_t i=0; i<noOldNeighbours; ++i)
│ │ │ │ -
830 delete[] sendBuffers_[i];
│ │ │ │ -
831
│ │ │ │ -
832 delete[] sendBuffers_;
│ │ │ │ -
833 delete[] sendBufferSizes_;
│ │ │ │ -
834
│ │ │ │ -
835 // No need for the iterator tuples any more
│ │ │ │ -
836 iteratorsMap_.clear();
│ │ │ │ -
837
│ │ │ │ -
838 indexSet_.endResize();
│ │ │ │ -
839
│ │ │ │ -
840 delete[] oldNeighbours;
│ │ │ │ -
841
│ │ │ │ -
842 repairLocalIndexPointers(globalMap_, remoteIndices_, indexSet_);
│ │ │ │ -
843
│ │ │ │ -
844 oldMap_.clear();
│ │ │ │ -
845 globalMap_.clear();
│ │ │ │ -
846
│ │ │ │ -
847 // update the sequence number
│ │ │ │ -
848 remoteIndices_.sourceSeqNo_ = remoteIndices_.destSeqNo_ = indexSet_.seqNo();
│ │ │ │ -
849 }
│ │ │ │ -
850
│ │ │ │ -
851 template<typename T>
│ │ │ │ -
852 void IndicesSyncer<T>::packAndSend(int destination, char* buffer, std::size_t bufferSize, MPI_Request& request)
│ │ │ │ -
853 {
│ │ │ │ -
854 auto iEnd = indexSet_.end();
│ │ │ │ -
855 int bpos = 0;
│ │ │ │ -
856 int published = 0;
│ │ │ │ -
857 int pairs = 0;
│ │ │ │ -
858
│ │ │ │ -
859 assert(checkReset());
│ │ │ │ -
860
│ │ │ │ -
861 // Pack the number of indices we publish
│ │ │ │ -
862 MPI_Pack(&(infoSend_[destination].publish), 1, MPI_INT, buffer, bufferSize, &bpos,
│ │ │ │ -
863 remoteIndices_.communicator());
│ │ │ │ -
864
│ │ │ │ -
865 for(auto index = indexSet_.begin(); index != iEnd; ++index) {
│ │ │ │ -
866 // Search for corresponding remote indices in all iterator tuples
│ │ │ │ -
867 auto iteratorsEnd = iteratorsMap_.end();
│ │ │ │ -
868
│ │ │ │ -
869 // advance all iterators to a position with global index >= index->global()
│ │ │ │ -
870 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators; ++iterators) {
│ │ │ │ -
871 while(iterators->second.isNotAtEnd() &&
│ │ │ │ -
872 iterators->second.globalIndexPair().first < index->global())
│ │ │ │ -
873 ++(iterators->second);
│ │ │ │ -
874 assert(!iterators->second.isNotAtEnd() || iterators->second.globalIndexPair().first >= index->global());
│ │ │ │ -
875 }
│ │ │ │ -
876
│ │ │ │ -
877 // Add all remote indices positioned at global which were already present before calling sync
│ │ │ │ -
878 // to the message.
│ │ │ │ -
879 // Count how many remote indices we will send
│ │ │ │ -
880 int indices = 0;
│ │ │ │ -
881 bool knownRemote = false; // Is the remote process supposed to know this index?
│ │ │ │ -
882
│ │ │ │ -
883 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators; ++iterators)
│ │ │ │ -
884 {
│ │ │ │ -
885 std::pair<GlobalIndex,Attribute> p;
│ │ │ │ -
886 if (iterators->second.isNotAtEnd())
│ │ │ │ -
887 {
│ │ │ │ -
888 p = iterators->second.globalIndexPair();
│ │ │ │ -
889 }
│ │ │ │ -
890
│ │ │ │ -
891 if(iterators->second.isNotAtEnd() && iterators->second.isOld()
│ │ │ │ -
892 && iterators->second.globalIndexPair().first == index->global()) {
│ │ │ │ -
893 indices++;
│ │ │ │ -
894 if(destination == iterators->first)
│ │ │ │ -
895 knownRemote = true;
│ │ │ │ -
896 }
│ │ │ │ -
897 }
│ │ │ │ -
898
│ │ │ │ -
899 if(!knownRemote)
│ │ │ │ -
900 // We do not need to send any indices
│ │ │ │ -
901 continue;
│ │ │ │ -
902
│ │ │ │ -
903 Dune::dverb<<rank_<<": sending "<<indices<<" for index "<<index->global()<<" to "<<destination<<std::endl;
│ │ │ │ -
904
│ │ │ │ -
905
│ │ │ │ -
906 // Pack the global index, the attribute and the number
│ │ │ │ -
907 MPI_Pack(const_cast<GlobalIndex*>(&(index->global())), 1, MPITraits<GlobalIndex>::getType(), buffer, bufferSize, &bpos,
│ │ │ │ -
908 remoteIndices_.communicator());
│ │ │ │ -
909
│ │ │ │ -
910 char attr = index->local().attribute();
│ │ │ │ -
911 MPI_Pack(&attr, 1, MPI_CHAR, buffer, bufferSize, &bpos,
│ │ │ │ -
912 remoteIndices_.communicator());
│ │ │ │ -
913
│ │ │ │ -
914 // Pack the number of remote indices we send.
│ │ │ │ -
915 MPI_Pack(&indices, 1, MPI_INT, buffer, bufferSize, &bpos,
│ │ │ │ -
916 remoteIndices_.communicator());
│ │ │ │ -
917
│ │ │ │ -
918 // Pack the information about the remote indices
│ │ │ │ -
919 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators; ++iterators)
│ │ │ │ -
920 if(iterators->second.isNotAtEnd() && iterators->second.isOld()
│ │ │ │ -
921 && iterators->second.globalIndexPair().first == index->global()) {
│ │ │ │ -
922 int process = iterators->first;
│ │ │ │ -
923
│ │ │ │ -
924 ++pairs;
│ │ │ │ -
925 assert(pairs <= infoSend_[destination].pairs);
│ │ │ │ -
926 MPI_Pack(&process, 1, MPI_INT, buffer, bufferSize, &bpos,
│ │ │ │ -
927 remoteIndices_.communicator());
│ │ │ │ -
928 char attr2 = iterators->second.remoteIndex().attribute();
│ │ │ │ -
929
│ │ │ │ -
930 MPI_Pack(&attr2, 1, MPI_CHAR, buffer, bufferSize, &bpos,
│ │ │ │ -
931 remoteIndices_.communicator());
│ │ │ │ -
932 --indices;
│ │ │ │ -
933 }
│ │ │ │ -
934 assert(indices==0);
│ │ │ │ -
935 ++published;
│ │ │ │ -
936 Dune::dvverb<<" (publish="<<published<<", pairs="<<pairs<<")"<<std::endl;
│ │ │ │ -
937 assert(published <= infoSend_[destination].publish);
│ │ │ │ -
938 }
│ │ │ │ -
939
│ │ │ │ -
940 // Make sure we send all expected entries
│ │ │ │ -
941 assert(published == infoSend_[destination].publish);
│ │ │ │ -
942 assert(pairs == infoSend_[destination].pairs);
│ │ │ │ -
943 resetIteratorsMap();
│ │ │ │ -
944
│ │ │ │ -
945 Dune::dverb << rank_<<": Sending message of "<<bpos<<" bytes to "<<destination<<std::endl;
│ │ │ │ -
946
│ │ │ │ -
947 MPI_Issend(buffer, bpos, MPI_PACKED, destination, 345, remoteIndices_.communicator(),&request);
│ │ │ │ -
948 }
│ │ │ │ -
949
│ │ │ │ -
950 template<typename T>
│ │ │ │ -
951 inline void IndicesSyncer<T>::insertIntoRemoteIndexList(int process,
│ │ │ │ -
952 const std::pair<GlobalIndex,Attribute>& globalPair,
│ │ │ │ -
953 char attribute)
│ │ │ │ -
954 {
│ │ │ │ -
955 Dune::dverb<<"Inserting from "<<process<<" "<<globalPair.first<<", "<<
│ │ │ │ -
956 globalPair.second<<" "<<attribute<<std::endl;
│ │ │ │ -
957
│ │ │ │ -
958 resetIteratorsMap();
│ │ │ │ -
959
│ │ │ │ -
960 // There might be cases where there no remote indices for that process yet
│ │ │ │ -
961 typename IteratorsMap::iterator found = iteratorsMap_.find(process);
│ │ │ │ -
962
│ │ │ │ -
963 if( found == iteratorsMap_.end() ) {
│ │ │ │ -
964 Dune::dverb<<"Discovered new neighbour "<<process<<std::endl;
│ │ │ │ -
965 RemoteIndexList* rlist = new RemoteIndexList();
│ │ │ │ -
966 remoteIndices_.remoteIndices_.insert(std::make_pair(process,std::make_pair(rlist,rlist)));
│ │ │ │ -
967 Iterators iterators = Iterators(*rlist, globalMap_[process], oldMap_[process]);
│ │ │ │ -
968 found = iteratorsMap_.insert(std::make_pair(process, iterators)).first;
│ │ │ │ -
969 }
│ │ │ │ -
970
│ │ │ │ -
971 Iterators& iterators = found->second;
│ │ │ │ -
972
│ │ │ │ -
973 // Search for the remote index
│ │ │ │ -
974 while(iterators.isNotAtEnd() && iterators.globalIndexPair() < globalPair) {
│ │ │ │ -
975 // Increment all iterators
│ │ │ │ -
976 ++iterators;
│ │ │ │ -
977
│ │ │ │ -
978 }
│ │ │ │ -
979
│ │ │ │ -
980 if(iterators.isAtEnd() || iterators.globalIndexPair() != globalPair) {
│ │ │ │ -
981 // The entry is not yet known
│ │ │ │ -
982 // Insert in the list and do not change the first iterator.
│ │ │ │ -
983 iterators.insert(RemoteIndex(Attribute(attribute)),globalPair);
│ │ │ │ -
984 return;
│ │ │ │ -
985 }
│ │ │ │ -
986
│ │ │ │ -
987 // Global indices match
│ │ │ │ -
988 bool indexIsThere=false;
│ │ │ │ -
989 for(Iterators tmpIterators = iterators;
│ │ │ │ -
990 !tmpIterators.isAtEnd() && tmpIterators.globalIndexPair() == globalPair;
│ │ │ │ -
991 ++tmpIterators)
│ │ │ │ -
992 //entry already exists with the same attribute
│ │ │ │ -
993 if(tmpIterators.globalIndexPair().second == attribute) {
│ │ │ │ -
994 indexIsThere=true;
│ │ │ │ -
995 break;
│ │ │ │ -
996 }
│ │ │ │ -
997
│ │ │ │ -
998 if(!indexIsThere)
│ │ │ │ -
999 // The entry is not yet known
│ │ │ │ -
1000 // Insert in the list and do not change the first iterator.
│ │ │ │ -
1001 iterators.insert(RemoteIndex(Attribute(attribute)),globalPair);
│ │ │ │ -
1002 }
│ │ │ │ -
1003
│ │ │ │ -
1004 template<typename T>
│ │ │ │ -
1005 template<typename T1>
│ │ │ │ -
1006 void IndicesSyncer<T>::recvAndUnpack(T1& numberer)
│ │ │ │ -
1007 {
│ │ │ │ -
1008 const ParallelIndexSet& constIndexSet = indexSet_;
│ │ │ │ -
1009 auto iEnd = constIndexSet.end();
│ │ │ │ -
1010 auto index = constIndexSet.begin();
│ │ │ │ -
1011 int bpos = 0;
│ │ │ │ -
1012 int publish;
│ │ │ │ -
1013
│ │ │ │ -
1014 assert(checkReset());
│ │ │ │ -
1015
│ │ │ │ -
1016 MPI_Status status;
│ │ │ │ -
1017
│ │ │ │ -
1018 // We have to determine the message size and source before the receive
│ │ │ │ -
1019 MPI_Probe(MPI_ANY_SOURCE, 345, remoteIndices_.communicator(), &status);
│ │ │ │ -
1020
│ │ │ │ -
1021 int source=status.MPI_SOURCE;
│ │ │ │ -
1022 int count;
│ │ │ │ -
1023 MPI_Get_count(&status, MPI_PACKED, &count);
│ │ │ │ -
1024
│ │ │ │ -
1025 Dune::dvverb<<rank_<<": Receiving message from "<< source<<" with "<<count<<" bytes"<<std::endl;
│ │ │ │ -
1026
│ │ │ │ -
1027 if(count>receiveBufferSize_) {
│ │ │ │ -
1028 receiveBufferSize_=count;
│ │ │ │ -
1029 delete[] receiveBuffer_;
│ │ │ │ -
1030 receiveBuffer_ = new char[receiveBufferSize_];
│ │ │ │ -
1031 }
│ │ │ │ -
1032
│ │ │ │ -
1033 MPI_Recv(receiveBuffer_, count, MPI_PACKED, source, 345, remoteIndices_.communicator(), &status);
│ │ │ │ -
1034
│ │ │ │ -
1035 // How many global entries were published?
│ │ │ │ -
1036 MPI_Unpack(receiveBuffer_, count, &bpos, &publish, 1, MPI_INT, remoteIndices_.communicator());
│ │ │ │ -
1037
│ │ │ │ -
1038 // Now unpack the remote indices and add them.
│ │ │ │ -
1039 while(publish>0) {
│ │ │ │ -
1040
│ │ │ │ -
1041 // Unpack information about the local index on the source process
│ │ │ │ -
1042 GlobalIndex global; // global index of the current entry
│ │ │ │ -
1043 char sourceAttribute; // Attribute on the source process
│ │ │ │ -
1044 int pairs;
│ │ │ │ -
1045
│ │ │ │ -
1046 MPI_Unpack(receiveBuffer_, count, &bpos, &global, 1, MPITraits<GlobalIndex>::getType(),
│ │ │ │ -
1047 remoteIndices_.communicator());
│ │ │ │ -
1048 MPI_Unpack(receiveBuffer_, count, &bpos, &sourceAttribute, 1, MPI_CHAR,
│ │ │ │ -
1049 remoteIndices_.communicator());
│ │ │ │ -
1050 MPI_Unpack(receiveBuffer_, count, &bpos, &pairs, 1, MPI_INT,
│ │ │ │ -
1051 remoteIndices_.communicator());
│ │ │ │ -
1052
│ │ │ │ -
1053 // Insert the entry on the remote process to our
│ │ │ │ -
1054 // remote index list
│ │ │ │ -
1055 SLList<std::pair<int,Attribute> > sourceAttributeList;
│ │ │ │ -
1056 sourceAttributeList.push_back(std::make_pair(source,Attribute(sourceAttribute)));
│ │ │ │ -
1057#ifndef NDEBUG
│ │ │ │ -
1058 bool foundSelf = false;
│ │ │ │ -
1059#endif
│ │ │ │ -
1060 Attribute myAttribute=Attribute();
│ │ │ │ -
1061
│ │ │ │ -
1062 // Unpack the remote indices
│ │ │ │ -
1063 for(; pairs>0; --pairs) {
│ │ │ │ -
1064 // Unpack the process id that knows the index
│ │ │ │ -
1065 int process;
│ │ │ │ -
1066 char attribute;
│ │ │ │ -
1067 MPI_Unpack(receiveBuffer_, count, &bpos, &process, 1, MPI_INT,
│ │ │ │ -
1068 remoteIndices_.communicator());
│ │ │ │ -
1069 // Unpack the attribute
│ │ │ │ -
1070 MPI_Unpack(receiveBuffer_, count, &bpos, &attribute, 1, MPI_CHAR,
│ │ │ │ -
1071 remoteIndices_.communicator());
│ │ │ │ -
1072
│ │ │ │ -
1073 if(process==rank_) {
│ │ │ │ -
1074#ifndef NDEBUG
│ │ │ │ -
1075 foundSelf=true;
│ │ │ │ -
1076#endif
│ │ │ │ -
1077 myAttribute=Attribute(attribute);
│ │ │ │ -
1078 // Now we know the local attribute of the global index
│ │ │ │ -
1079 //Only add the index if it is unknown.
│ │ │ │ -
1080 // Do we know that global index already?
│ │ │ │ -
1081 auto pos = std::lower_bound(index, iEnd, IndexPair(global));
│ │ │ │ -
1082
│ │ │ │ -
1083 if(pos == iEnd || pos->global() != global) {
│ │ │ │ -
1084 // no entry with this global index
│ │ │ │ -
1085 indexSet_.add(global,
│ │ │ │ -
1086 ParallelLocalIndex<Attribute>(numberer(global),
│ │ │ │ -
1087 myAttribute, true));
│ │ │ │ -
1088 Dune::dvverb << "Adding "<<global<<" "<<myAttribute<<std::endl;
│ │ │ │ -
1089 continue;
│ │ │ │ -
1090 }
│ │ │ │ -
1091
│ │ │ │ -
1092 // because of above the global indices match. Add only if the attribute is different
│ │ │ │ -
1093 bool indexIsThere = false;
│ │ │ │ -
1094 index=pos;
│ │ │ │ -
1095
│ │ │ │ -
1096 for(; pos->global()==global; ++pos)
│ │ │ │ -
1097 if(pos->local().attribute() == myAttribute) {
│ │ │ │ -
1098 Dune::dvverb<<"found "<<global<<" "<<myAttribute<<std::endl;
│ │ │ │ -
1099 indexIsThere = true;
│ │ │ │ -
1100 break;
│ │ │ │ -
1101 }
│ │ │ │ -
1102
│ │ │ │ -
1103 if(!indexIsThere) {
│ │ │ │ -
1104 indexSet_.add(global,
│ │ │ │ -
1105 ParallelLocalIndex<Attribute>(numberer(global),
│ │ │ │ -
1106 myAttribute, true));
│ │ │ │ -
1107 Dune::dvverb << "Adding "<<global<<" "<<myAttribute<<std::endl;
│ │ │ │ -
1108 }
│ │ │ │ -
1109
│ │ │ │ -
1110 }else{
│ │ │ │ -
1111 sourceAttributeList.push_back(std::make_pair(process,Attribute(attribute)));
│ │ │ │ -
1112 }
│ │ │ │ -
1113 }
│ │ │ │ -
1114 assert(foundSelf);
│ │ │ │ -
1115 // Insert remote indices
│ │ │ │ -
1116 typedef typename SLList<std::pair<int,Attribute> >::const_iterator Iter;
│ │ │ │ -
1117 for(Iter i=sourceAttributeList.begin(), end=sourceAttributeList.end();
│ │ │ │ -
1118 i!=end; ++i)
│ │ │ │ -
1119 insertIntoRemoteIndexList(i->first, std::make_pair(global, myAttribute),
│ │ │ │ -
1120 i->second);
│ │ │ │ -
1121 --publish;
│ │ │ │ -
1122 }
│ │ │ │ -
1123
│ │ │ │ -
1124 resetIteratorsMap();
│ │ │ │ -
1125 }
│ │ │ │ -
1126
│ │ │ │ -
1127 template<typename T>
│ │ │ │ -
1128 void IndicesSyncer<T>::resetIteratorsMap(){
│ │ │ │ -
1129
│ │ │ │ -
1130 // Reset iterators in all tuples.
│ │ │ │ -
1131 const auto remoteEnd = remoteIndices_.remoteIndices_.end();
│ │ │ │ -
1132 auto iterators = iteratorsMap_.begin();
│ │ │ │ -
1133 auto global = globalMap_.begin();
│ │ │ │ -
1134 auto added = oldMap_.begin();
│ │ │ │ -
1135
│ │ │ │ -
1136 for(auto remote = remoteIndices_.remoteIndices_.begin();
│ │ │ │ -
1137 remote != remoteEnd; ++remote, ++global, ++added, ++iterators) {
│ │ │ │ -
1138 iterators->second.reset(*(remote->second.first), global->second, added->second);
│ │ │ │ -
1139 }
│ │ │ │ -
1140 }
│ │ │ │ -
1141
│ │ │ │ -
1142 template<typename T>
│ │ │ │ -
1143 bool IndicesSyncer<T>::checkReset(const Iterators& iterators, RemoteIndexList& rList, GlobalIndexList& gList,
│ │ │ │ -
1144 BoolList& bList){
│ │ │ │ -
1145
│ │ │ │ -
1146 if(std::get<0>(iterators.iterators_) != rList.begin())
│ │ │ │ -
1147 return false;
│ │ │ │ -
1148 if(std::get<1>(iterators.iterators_) != gList.begin())
│ │ │ │ -
1149 return false;
│ │ │ │ -
1150 if(std::get<2>(iterators.iterators_) != bList.begin())
│ │ │ │ -
1151 return false;
│ │ │ │ -
1152 return true;
│ │ │ │ -
1153 }
│ │ │ │ -
1154
│ │ │ │ -
1155
│ │ │ │ -
1156 template<typename T>
│ │ │ │ -
1157 bool IndicesSyncer<T>::checkReset(){
│ │ │ │ -
1158
│ │ │ │ -
1159 // Reset iterators in all tuples.
│ │ │ │ -
1160 const auto remoteEnd = remoteIndices_.remoteIndices_.end();
│ │ │ │ -
1161 auto iterators = iteratorsMap_.begin();
│ │ │ │ -
1162 auto global = globalMap_.begin();
│ │ │ │ -
1163 auto added = oldMap_.begin();
│ │ │ │ -
1164 bool ret = true;
│ │ │ │ -
1165
│ │ │ │ -
1166 for(auto remote = remoteIndices_.remoteIndices_.begin();
│ │ │ │ -
1167 remote != remoteEnd; ++remote, ++global, ++added, ++iterators) {
│ │ │ │ -
1168 if(!checkReset(iterators->second, *(remote->second.first), global->second,
│ │ │ │ -
1169 added->second))
│ │ │ │ -
1170 ret=false;
│ │ │ │ -
1171 }
│ │ │ │ -
1172 return ret;
│ │ │ │ -
1173 }
│ │ │ │ -
1174}
│ │ │ │ -
1175
│ │ │ │ -
1176#endif
│ │ │ │ -
1177#endif
│ │ │ │ -
Classes describing a distributed indexset.
│ │ │ │ -
Provides a map between global and local indices.
│ │ │ │ -
Implements a singly linked list together with the necessary iterators.
│ │ │ │ -
Standard Dune debug streams.
│ │ │ │ -
void push_back(const MemberType &item)
Add a new entry to the end of the list.
Definition: sllist.hh:643
│ │ │ │ -
SLListIterator< T, A > iterator
The mutable iterator of the list.
Definition: sllist.hh:69
│ │ │ │ -
iterator end()
Get an iterator pointing to the end of the list.
Definition: sllist.hh:774
│ │ │ │ -
ModifyIterator beginModify()
Get an iterator capable of deleting and inserting elements.
Definition: sllist.hh:787
│ │ │ │ -
SLListConstIterator< RemoteIndex, Allocator > const_iterator
The constant iterator of the list.
Definition: sllist.hh:74
│ │ │ │ -
SLListModifyIterator< T, A > ModifyIterator
The type of the iterator capable of deletion and insertion.
Definition: sllist.hh:103
│ │ │ │ -
iterator begin()
Get an iterator pointing to the first element in the list.
Definition: sllist.hh:762
│ │ │ │ -
EnableIfInterOperable< T1, T2, bool >::type operator<(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition: iteratorfacades.hh:637
│ │ │ │ -
EnableIfInterOperable< T1, T2, bool >::type operator==(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for equality.
Definition: iteratorfacades.hh:237
│ │ │ │ -
EnableIfInterOperable< T1, T2, bool >::type operator!=(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for inequality.
Definition: iteratorfacades.hh:259
│ │ │ │ -
Dune::RemoteIndices< ParallelIndexSet > RemoteIndices
Type of the remote indices.
Definition: indicessyncer.hh:59
│ │ │ │ -
int publish
The number of indices we publish for the other process.
Definition: indicessyncer.hh:126
│ │ │ │ -
void repairLocalIndexPointers(std::map< int, SLList< std::pair< typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > &globalMap, RemoteIndices< T, A1 > &remoteIndices, const T &indexSet)
Repair the pointers to the local indices in the remote indices.
Definition: indicessyncer.hh:487
│ │ │ │ -
ParallelIndexSet::GlobalIndex GlobalIndex
Type of the global index used in the index set.
Definition: indicessyncer.hh:51
│ │ │ │ -
int pairs
The number of pairs (attribute and process number) we publish to the neighbour process.
Definition: indicessyncer.hh:131
│ │ │ │ -
Attribute & attribute() const
│ │ │ │ -
ParallelIndexSet::LocalIndex::Attribute Attribute
Type of the attribute used in the index set.
Definition: indicessyncer.hh:54
│ │ │ │ -
IndicesSyncer(ParallelIndexSet &indexSet, RemoteIndices &remoteIndices)
Constructor.
Definition: indicessyncer.hh:536
│ │ │ │ -
T ParallelIndexSet
The type of the index set.
Definition: indicessyncer.hh:45
│ │ │ │ -
TG GlobalIndex
the type of the global index. This type has to provide at least a operator< for sorting.
Definition: indexset.hh:226
│ │ │ │ -
void storeGlobalIndicesOfRemoteIndices(std::map< int, SLList< std::pair< typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > &globalMap, const RemoteIndices< T, A1 > &remoteIndices)
Stores the corresponding global indices of the remote index information.
Definition: indicessyncer.hh:461
│ │ │ │ -
void sync()
Sync the index set.
Definition: indicessyncer.hh:728
│ │ │ │ -
int seqNo() const
Get the internal sequence number.
│ │ │ │ -
ParallelIndexSet::IndexPair IndexPair
The type of the index pair.
Definition: indicessyncer.hh:48
│ │ │ │ -
MessageInformation()
Definition: indicessyncer.hh:122
│ │ │ │ -
DVVerbType dvverb(std::cout)
stream for very verbose output.
Definition: stdstreams.hh:95
│ │ │ │ -
DVerbType dverb(std::cout)
Singleton of verbose debug stream.
Definition: stdstreams.hh:116
│ │ │ │ +
216
│ │ │ │ +
217
│ │ │ │ +
244template<class Matrix>
│ │ │ │ +
245auto transpose(const std::reference_wrapper<Matrix>& matrix) {
│ │ │ │ +
246 return Impl::TransposedMatrixWrapper(matrix);
│ │ │ │ +
247}
│ │ │ │ +
248
│ │ │ │ +
249
│ │ │ │ +
250
│ │ │ │ +
260template<class Matrix>
│ │ │ │ +
261auto transposedView(const Matrix& matrix) {
│ │ │ │ +
262 return transpose(std::cref(matrix));
│ │ │ │ +
263}
│ │ │ │ +
264
│ │ │ │ +
265
│ │ │ │ +
266
│ │ │ │ +
267
│ │ │ │ +
268
│ │ │ │ +
269} // namespace Dune
│ │ │ │ +
270
│ │ │ │ +
271#endif // DUNE_COMMON_TRANSPOSE_HH
│ │ │ │ +
Compute type of the result of an arithmetic operation involving two different number types.
│ │ │ │ +
Implements a matrix constructed from a given type representing a field and compile-time given number ...
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
This file implements a dense matrix with dynamic numbers of rows and columns.
│ │ │ │ +
auto sparseRange(Range &&range)
Allow structured-binding for-loops for sparse iterators.
Definition: rangeutilities.hh:821
│ │ │ │ +
constexpr T & resolveRef(T &gf) noexcept
Helper function to resolve std::reference_wrapper.
Definition: referencehelper.hh:47
│ │ │ │ +
typename detected_or< nonesuch, Op, Args... >::value_t is_detected
Detects whether Op<Args...> is valid.
Definition: type_traits.hh:141
│ │ │ │ +
STL namespace.
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
Definition: debugalign.hh:425
│ │ │ │ -
static MPI_Datatype getType()
Definition: mpitraits.hh:48
│ │ │ │ -
A pair consisting of a global and local index.
Definition: indexset.hh:85
│ │ │ │ -
Class for recomputing missing indices of a distributed index set.
Definition: indicessyncer.hh:41
│ │ │ │ -
An index present on the local process with an additional attribute flag.
Definition: plocalindex.hh:49
│ │ │ │ -
The indices present on remote processes.
Definition: remoteindices.hh:189
│ │ │ │ -
MPI_Comm communicator() const
Get the mpi communicator used.
Definition: remoteindices.hh:1696
│ │ │ │ -
const_iterator end() const
Get an iterator over all remote index lists.
Definition: remoteindices.hh:1529
│ │ │ │ -
int neighbours() const
Get the number of processors we share indices with.
Definition: remoteindices.hh:1446
│ │ │ │ -
typename std::allocator_traits< A >::template rebind_alloc< RemoteIndex > Allocator
The type of the allocator for the remote index list.
Definition: remoteindices.hh:237
│ │ │ │ -
const_iterator begin() const
Get an iterator over all remote index lists.
Definition: remoteindices.hh:1522
│ │ │ │ -
Information about an index residing on another processor.
Definition: remoteindices.hh:73
│ │ │ │ -
A mutable iterator for the SLList.
Definition: sllist.hh:271
│ │ │ │ -
A single linked list.
Definition: sllist.hh:44
│ │ │ │ +
auto transpose(const Matrix &matrix)
Return the transposed of the given matrix.
Definition: transpose.hh:183
│ │ │ │ +
auto transposedView(const Matrix &matrix)
Create a view modelling the transposed matrix.
Definition: transpose.hh:261
│ │ │ │ +
A dense n x m matrix.
Definition: fmatrix.hh:117
│ │ │ │ +
Construct a matrix with a dynamic size.
Definition: dynmatrix.hh:61
│ │ │ │ +
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
│ │ │ │ +
decltype(std::declval< T1 >()+std::declval< T2 >()) PromotedType
Definition: promotiontraits.hh:28
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,1171 +4,280 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -indicessyncer.hh │ │ │ │ │ +transpose.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 (C) 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_INDICESSYNCER_HH │ │ │ │ │ - 6#define DUNE_INDICESSYNCER_HH │ │ │ │ │ + 5#ifndef DUNE_COMMON_TRANSPOSE_HH │ │ │ │ │ + 6#define DUNE_COMMON_TRANSPOSE_HH │ │ │ │ │ 7 │ │ │ │ │ - 8#include "indexset.hh" │ │ │ │ │ - 9#include "remoteindices.hh" │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ - 16#include │ │ │ │ │ - 17#include │ │ │ │ │ - 18#include │ │ │ │ │ + 8#include │ │ │ │ │ + 9#include │ │ │ │ │ + 10 │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14#include │ │ │ │ │ + 15#include │ │ │ │ │ + 16#include │ │ │ │ │ + 17 │ │ │ │ │ + 18namespace Dune { │ │ │ │ │ 19 │ │ │ │ │ - 20#if HAVE_MPI │ │ │ │ │ - 21namespace Dune │ │ │ │ │ - 22{ │ │ │ │ │ - 39 template │ │ │ │ │ -40 class IndicesSyncer │ │ │ │ │ - 41 { │ │ │ │ │ - 42 public: │ │ │ │ │ - 43 │ │ │ │ │ -45 typedef T ParallelIndexSet; │ │ │ │ │ - 46 │ │ │ │ │ -48 typedef typename ParallelIndexSet::IndexPair IndexPair; │ │ │ │ │ - 49 │ │ │ │ │ -51 typedef typename ParallelIndexSet::GlobalIndex GlobalIndex; │ │ │ │ │ - 52 │ │ │ │ │ -54 typedef typename ParallelIndexSet::LocalIndex::Attribute Attribute; │ │ │ │ │ - 55 │ │ │ │ │ -59 typedef Dune::RemoteIndices RemoteIndices; │ │ │ │ │ - 60 │ │ │ │ │ - 70 IndicesSyncer(ParallelIndexSet& indexSet, │ │ │ │ │ - 71 RemoteIndices& remoteIndices); │ │ │ │ │ - 72 │ │ │ │ │ - 82 void sync(); │ │ │ │ │ - 83 │ │ │ │ │ - 94 template │ │ │ │ │ - 95 void sync(T1& numberer); │ │ │ │ │ - 96 │ │ │ │ │ - 97 private: │ │ │ │ │ + 20namespace Impl { │ │ │ │ │ + 21 │ │ │ │ │ + 22 │ │ │ │ │ + 23 │ │ │ │ │ + 24 template::value> │ │ │ │ │ + 25 struct TransposedDenseMatrixTraits │ │ │ │ │ + 26 { │ │ │ │ │ + 27 using type = Dune::FieldMatrix::field_type, M:: │ │ │ │ │ +cols, M::rows>; │ │ │ │ │ + 28 }; │ │ │ │ │ + 29 │ │ │ │ │ + 30 template │ │ │ │ │ + 31 struct TransposedDenseMatrixTraits │ │ │ │ │ + 32 { │ │ │ │ │ + 33 using type = Dune::DynamicMatrix::field_type>; │ │ │ │ │ + 34 }; │ │ │ │ │ + 35 │ │ │ │ │ + 36 template │ │ │ │ │ + 37 using TransposedDenseMatrixTraits_t = typename │ │ │ │ │ +TransposedDenseMatrixTraits::type; │ │ │ │ │ + 38 │ │ │ │ │ + 39 │ │ │ │ │ + 40 │ │ │ │ │ + 41 // CRTP mixin class to provide the static part of the interface, │ │ │ │ │ + 42 // namely enums rows and cols. │ │ │ │ │ + 43 template::value> │ │ │ │ │ + 44 class TransposedMatrixWrapperMixin {}; │ │ │ │ │ + 45 │ │ │ │ │ + 46 template │ │ │ │ │ + 47 class TransposedMatrixWrapperMixin │ │ │ │ │ + 48 { │ │ │ │ │ + 49 public: │ │ │ │ │ + 50 │ │ │ │ │ + 52 constexpr static int rows = WM::cols; │ │ │ │ │ + 54 constexpr static int cols = WM::rows; │ │ │ │ │ + 55 }; │ │ │ │ │ + 56 │ │ │ │ │ + 57 │ │ │ │ │ + 58 │ │ │ │ │ + 59 template │ │ │ │ │ + 60 class TransposedMatrixWrapper; │ │ │ │ │ + 61 │ │ │ │ │ + 62} // namespace Impl │ │ │ │ │ + 63 │ │ │ │ │ + 64// Specialization of FieldTraits needs to be in namespace Dune:: │ │ │ │ │ + 65template │ │ │ │ │ + 66struct FieldTraits< Impl::TransposedMatrixWrapper > │ │ │ │ │ + 67{ │ │ │ │ │ + 68 using field_type = typename FieldTraits>::field_type; │ │ │ │ │ + 69 using real_type = typename FieldTraits>::real_type; │ │ │ │ │ + 70}; │ │ │ │ │ + 71 │ │ │ │ │ + 72namespace Impl { │ │ │ │ │ + 73 │ │ │ │ │ + 74 // Wrapper representing the transposed of a matrix. │ │ │ │ │ + 75 // Creating the wrapper does not compute anything │ │ │ │ │ + 76 // but only serves for tagging the wrapped matrix │ │ │ │ │ + 77 // for transposition. This class will store M by value. │ │ │ │ │ + 78 // To support reference-semantic, it supports using │ │ │ │ │ + 79 // M=std::reference_wrapper. │ │ │ │ │ + 80 template │ │ │ │ │ + 81 class TransposedMatrixWrapper : │ │ │ │ │ + 82 public TransposedMatrixWrapperMixin> │ │ │ │ │ + 83 { │ │ │ │ │ + 84 constexpr static bool hasStaticSize = IsStaticSizeMatrix>:: │ │ │ │ │ +value; │ │ │ │ │ + 85 public: │ │ │ │ │ + 86 using WrappedMatrix = ResolveRef_t; │ │ │ │ │ + 87 │ │ │ │ │ + 88 const WrappedMatrix& wrappedMatrix() const { │ │ │ │ │ + 89 return resolveRef(matrix_); │ │ │ │ │ + 90 } │ │ │ │ │ + 91 │ │ │ │ │ + 92 │ │ │ │ │ + 93 using value_type = typename WrappedMatrix::value_type; │ │ │ │ │ + 94 using field_type = typename FieldTraits::field_type; │ │ │ │ │ + 95 │ │ │ │ │ + 96 TransposedMatrixWrapper(M&& matrix) : matrix_(std::move(matrix)) {} │ │ │ │ │ + 97 TransposedMatrixWrapper(const M& matrix) : matrix_(matrix) {} │ │ │ │ │ 98 │ │ │ │ │ - 100 ParallelIndexSet& indexSet_; │ │ │ │ │ - 101 │ │ │ │ │ - 103 RemoteIndices& remoteIndices_; │ │ │ │ │ - 104 │ │ │ │ │ - 106 char** sendBuffers_; │ │ │ │ │ - 107 │ │ │ │ │ - 109 char* receiveBuffer_; │ │ │ │ │ - 110 │ │ │ │ │ - 112 std::size_t* sendBufferSizes_; │ │ │ │ │ - 113 │ │ │ │ │ - 115 int receiveBufferSize_; // int because of MPI │ │ │ │ │ - 116 │ │ │ │ │ - 120 struct MessageInformation │ │ │ │ │ - 121 { │ │ │ │ │ -122 MessageInformation() │ │ │ │ │ - 123 : publish(), pairs() │ │ │ │ │ - 124 {} │ │ │ │ │ -126 int publish; │ │ │ │ │ -131 int pairs; │ │ │ │ │ - 132 }; │ │ │ │ │ + 99 template::value) or (not hasStaticSize)) │ │ │ │ │ + 102 and Impl::IsDenseMatrix_v, int> = 0> │ │ │ │ │ + 103 friend auto operator* (const MatrixA& matrixA, const │ │ │ │ │ +TransposedMatrixWrapper& matrixB) │ │ │ │ │ + 104 { │ │ │ │ │ + 105 using FieldA = typename FieldTraits::field_type; │ │ │ │ │ + 106 using FieldB = typename FieldTraits::field_type; │ │ │ │ │ + 107 using Field = typename PromotionTraits::PromotedType; │ │ │ │ │ + 108 │ │ │ │ │ + 109 // We exploit that the rows of AB^T are the columns of (AB^T)^T = BA^T. │ │ │ │ │ + 110 // Hence we get the row-vectors of AB^T by mutiplying B to the row-vectors │ │ │ │ │ + 111 // of A. │ │ │ │ │ + 112 if constexpr(IsStaticSizeMatrix_v and │ │ │ │ │ +IsStaticSizeMatrix_v) │ │ │ │ │ + 113 { │ │ │ │ │ + 114 FieldMatrix result; │ │ │ │ │ + 115 for (std::size_t j=0; j result(matrixA.N(), matrixB.wrappedMatrix().N()); │ │ │ │ │ + 122 for (std::size_t j=0; j │ │ │ │ │ + 129 void mv (const X& x, Y& y) const │ │ │ │ │ + 130 { │ │ │ │ │ + 131 wrappedMatrix().mtv(x,y); │ │ │ │ │ + 132 } │ │ │ │ │ 133 │ │ │ │ │ - 137 class DefaultNumberer │ │ │ │ │ - 138 { │ │ │ │ │ - 139 public: │ │ │ │ │ -145 std::size_t operator()([[maybe_unused]] const GlobalIndex& global) │ │ │ │ │ + 134 template │ │ │ │ │ + 135 void mtv (const X& x, Y& y) const │ │ │ │ │ + 136 { │ │ │ │ │ + 137 wrappedMatrix().mv(x,y); │ │ │ │ │ + 138 } │ │ │ │ │ + 139 │ │ │ │ │ + 140 // Return a classical representation of the matrix. │ │ │ │ │ + 141 // Since we do not know the internals of the wrapped │ │ │ │ │ + 142 // matrix, this will always be a dense matrix. Depending │ │ │ │ │ + 143 // on whether the matrix has static size or not, this │ │ │ │ │ + 144 // will be either a FieldMatrix or a DynamicMatrix. │ │ │ │ │ + 145 TransposedDenseMatrixTraits_t asDense() const │ │ │ │ │ 146 { │ │ │ │ │ - 147 return std::numeric_limits::max(); │ │ │ │ │ - 148 } │ │ │ │ │ - 149 }; │ │ │ │ │ - 150 │ │ │ │ │ - 152 MPI_Datatype datatype_; │ │ │ │ │ - 153 │ │ │ │ │ - 155 int rank_; │ │ │ │ │ - 156 │ │ │ │ │ - 161 typedef SLList, typename RemoteIndices:: │ │ │ │ │ -Allocator> GlobalIndexList; │ │ │ │ │ + 147 TransposedDenseMatrixTraits_t MT; │ │ │ │ │ + 148 if constexpr(not IsStaticSizeMatrix::value) │ │ │ │ │ + 149 { │ │ │ │ │ + 150 MT.resize(wrappedMatrix().M(), wrappedMatrix().N(), 0); │ │ │ │ │ + 151 } │ │ │ │ │ + 152 for(auto&& [M_i, i] : Dune::sparseRange(wrappedMatrix())) │ │ │ │ │ + 153 for(auto&& [M_ij, j] : Dune::sparseRange(M_i)) │ │ │ │ │ + 154 MT[j][i] = M_ij; │ │ │ │ │ + 155 return MT; │ │ │ │ │ + 156 } │ │ │ │ │ + 157 │ │ │ │ │ + 158 private: │ │ │ │ │ + 159 │ │ │ │ │ + 160 M matrix_; │ │ │ │ │ + 161 }; │ │ │ │ │ 162 │ │ │ │ │ - 164 typedef typename GlobalIndexList::ModifyIterator GlobalIndexModifier; │ │ │ │ │ + 163 template │ │ │ │ │ + 164 using MemberFunctionTransposedConcept = std::void_t().transposed())>; │ │ │ │ │ 165 │ │ │ │ │ - 169 typedef typename SLList:: │ │ │ │ │ -iterator │ │ │ │ │ - 170 GlobalIndexIterator; │ │ │ │ │ + 166 template │ │ │ │ │ + 167 struct HasMemberFunctionTransposed : public Dune::Std:: │ │ │ │ │ +is_detected {}; │ │ │ │ │ + 168 │ │ │ │ │ + 169} // namespace Impl │ │ │ │ │ + 170 │ │ │ │ │ 171 │ │ │ │ │ - 173 typedef std::map GlobalIndicesMap; │ │ │ │ │ - 174 │ │ │ │ │ - 183 GlobalIndicesMap globalMap_; │ │ │ │ │ - 184 │ │ │ │ │ - 188 typedef SLList BoolList; │ │ │ │ │ - 189 │ │ │ │ │ - 193 typedef typename BoolList::iterator BoolIterator; │ │ │ │ │ - 194 │ │ │ │ │ - 196 typedef typename BoolList::ModifyIterator BoolListModifier; │ │ │ │ │ - 197 │ │ │ │ │ - 199 typedef std::map BoolMap; │ │ │ │ │ - 200 │ │ │ │ │ - 205 BoolMap oldMap_; │ │ │ │ │ - 206 │ │ │ │ │ - 208 std::map infoSend_; │ │ │ │ │ - 209 │ │ │ │ │ - 211 typedef typename RemoteIndices::RemoteIndexList RemoteIndexList; │ │ │ │ │ - 212 │ │ │ │ │ - 214 typedef typename RemoteIndexList::ModifyIterator RemoteIndexModifier; │ │ │ │ │ + 172 │ │ │ │ │ + 181template::value, int> = │ │ │ │ │ +0> │ │ │ │ │ +183auto transpose(const Matrix& matrix) { │ │ │ │ │ + 184 return matrix.transposed(); │ │ │ │ │ + 185} │ │ │ │ │ + 186 │ │ │ │ │ + 187 │ │ │ │ │ + 188 │ │ │ │ │ + 210template>::value, int> = 0> │ │ │ │ │ +212auto transpose(Matrix&& matrix) { │ │ │ │ │ + 213 return Impl::TransposedMatrixWrapper(std::forward(matrix)); │ │ │ │ │ + 214} │ │ │ │ │ 215 │ │ │ │ │ - 217 typedef Dune::RemoteIndex RemoteIndex; │ │ │ │ │ - 218 │ │ │ │ │ - 220 typedef typename RemoteIndexList::iterator RemoteIndexIterator; │ │ │ │ │ - 221 │ │ │ │ │ - 223 typedef typename RemoteIndexList::const_iterator ConstRemoteIndexIterator; │ │ │ │ │ - 224 │ │ │ │ │ - 226 typedef std:: │ │ │ │ │ -tuple IteratorTuple; │ │ │ │ │ - 228 │ │ │ │ │ - 236 class Iterators │ │ │ │ │ - 237 { │ │ │ │ │ - 238 friend class IndicesSyncer; │ │ │ │ │ - 239 public: │ │ │ │ │ - 249 Iterators(RemoteIndexList& remoteIndices, GlobalIndexList& globalIndices, │ │ │ │ │ - 250 BoolList& booleans); │ │ │ │ │ - 251 │ │ │ │ │ - 255 Iterators(); │ │ │ │ │ - 256 │ │ │ │ │ - 260 Iterators& operator++(); │ │ │ │ │ - 261 │ │ │ │ │ - 267 void insert(const RemoteIndex& index, │ │ │ │ │ - 268 const std::pair& global); │ │ │ │ │ - 269 │ │ │ │ │ - 274 RemoteIndex& remoteIndex() const; │ │ │ │ │ - 275 │ │ │ │ │ - 280 std::pair& globalIndexPair() const; │ │ │ │ │ - 281 │ │ │ │ │ -282 Attribute& attribute() const; │ │ │ │ │ - 283 │ │ │ │ │ - 289 bool isOld() const; │ │ │ │ │ - 290 │ │ │ │ │ - 300 void reset(RemoteIndexList& remoteIndices, GlobalIndexList& globalIndices, │ │ │ │ │ - 301 BoolList& booleans); │ │ │ │ │ - 302 │ │ │ │ │ - 308 bool isNotAtEnd() const; │ │ │ │ │ - 309 │ │ │ │ │ - 315 bool isAtEnd() const; │ │ │ │ │ - 316 │ │ │ │ │ - 317 private: │ │ │ │ │ - 327 IteratorTuple iterators_; │ │ │ │ │ - 328 }; │ │ │ │ │ - 329 │ │ │ │ │ - 331 typedef std::map IteratorsMap; │ │ │ │ │ - 332 │ │ │ │ │ - 344 IteratorsMap iteratorsMap_; │ │ │ │ │ - 345 │ │ │ │ │ - 347 void calculateMessageSizes(); │ │ │ │ │ - 348 │ │ │ │ │ - 356 void packAndSend(int destination, char* buffer, std::size_t bufferSize, │ │ │ │ │ -MPI_Request& req); │ │ │ │ │ - 357 │ │ │ │ │ - 362 template │ │ │ │ │ - 363 void recvAndUnpack(T1& numberer); │ │ │ │ │ - 364 │ │ │ │ │ - 368 void registerMessageDatatype(); │ │ │ │ │ - 369 │ │ │ │ │ - 373 void insertIntoRemoteIndexList(int process, │ │ │ │ │ - 374 const std::pair& global, │ │ │ │ │ - 375 char attribute); │ │ │ │ │ - 376 │ │ │ │ │ - 380 void resetIteratorsMap(); │ │ │ │ │ - 381 │ │ │ │ │ - 386 bool checkReset(); │ │ │ │ │ - 387 │ │ │ │ │ - 396 bool checkReset(const Iterators& iterators, RemoteIndexList& rlist, │ │ │ │ │ -GlobalIndexList& gList, │ │ │ │ │ - 397 BoolList& bList); │ │ │ │ │ - 398 }; │ │ │ │ │ - 399 │ │ │ │ │ - 400 template │ │ │ │ │ -401 bool operator<(const IndexPair >& i1, │ │ │ │ │ - 402 const std::pair& i2) │ │ │ │ │ - 403 { │ │ │ │ │ - 404 return i1.global() < i2.first || │ │ │ │ │ - 405 (i1.global() == i2.first && i1.local().attribute() │ │ │ │ │ -409 bool operator<(const std::pair& i1, │ │ │ │ │ - 410 const IndexPair >& i2) │ │ │ │ │ - 411 { │ │ │ │ │ - 412 return i1.first < i2.global() || │ │ │ │ │ - 413 (i1.first == i2.global() && i1.second │ │ │ │ │ -417 bool operator==(const IndexPair >& i1, │ │ │ │ │ - 418 const std::pair& i2) │ │ │ │ │ - 419 { │ │ │ │ │ - 420 return (i1.global() == i2.first && i1.local().attribute()==i2.second); │ │ │ │ │ - 421 } │ │ │ │ │ - 422 │ │ │ │ │ - 423 template │ │ │ │ │ -424 bool operator!=(const IndexPair >& i1, │ │ │ │ │ - 425 const std::pair& i2) │ │ │ │ │ - 426 { │ │ │ │ │ - 427 return (i1.global() != i2.first || i1.local().attribute()!=i2.second); │ │ │ │ │ - 428 } │ │ │ │ │ - 429 │ │ │ │ │ - 430 template │ │ │ │ │ -431 bool operator==(const std::pair& i2, │ │ │ │ │ - 432 const IndexPair >& i1) │ │ │ │ │ - 433 { │ │ │ │ │ - 434 return (i1.global() == i2.first && i1.local().attribute()==i2.second); │ │ │ │ │ - 435 } │ │ │ │ │ - 436 │ │ │ │ │ - 437 template │ │ │ │ │ -438 bool operator!=(const std::pair& i2, │ │ │ │ │ - 439 const IndexPair >& i1) │ │ │ │ │ - 440 { │ │ │ │ │ - 441 return (i1.global() != i2.first || i1.local().attribute()!=i2.second); │ │ │ │ │ - 442 } │ │ │ │ │ - 443 │ │ │ │ │ - 460 template │ │ │ │ │ -461 void storeGlobalIndicesOfRemoteIndices(std::map,A> >& │ │ │ │ │ -globalMap, │ │ │ │ │ - 462 const RemoteIndices& remoteIndices) │ │ │ │ │ - 463 { │ │ │ │ │ - 464 for(auto remote = remoteIndices.begin(), end =remoteIndices.end(); remote │ │ │ │ │ -!= end; ++remote) { │ │ │ │ │ - 465 typedef typename RemoteIndices::RemoteIndexList RemoteIndexList; │ │ │ │ │ - 466 typedef SLList,A> GlobalIndexList; │ │ │ │ │ - 467 GlobalIndexList& global = globalMap[remote->first]; │ │ │ │ │ - 468 RemoteIndexList& rList = *(remote->second.first); │ │ │ │ │ - 469 │ │ │ │ │ - 470 for(auto index = rList.begin(), riEnd = rList.end(); │ │ │ │ │ - 471 index != riEnd; ++index) { │ │ │ │ │ - 472 global.push_back(std::make_pair(index->localIndexPair().global(), │ │ │ │ │ - 473 index->localIndexPair().local().attribute())); │ │ │ │ │ - 474 } │ │ │ │ │ - 475 } │ │ │ │ │ - 476 } │ │ │ │ │ - 477 │ │ │ │ │ - 486 template │ │ │ │ │ -487 inline void repairLocalIndexPointers(std::map,A> >& globalMap, │ │ │ │ │ - 490 RemoteIndices& remoteIndices, │ │ │ │ │ - 491 const T& indexSet) │ │ │ │ │ - 492 { │ │ │ │ │ - 493 assert(globalMap.size()==static_cast(remoteIndices.neighbours │ │ │ │ │ -())); │ │ │ │ │ - 494 // Repair pointers to index set in remote indices. │ │ │ │ │ - 495 auto global = globalMap.begin(); │ │ │ │ │ - 496 auto end = remoteIndices.remoteIndices_.end(); │ │ │ │ │ - 497 │ │ │ │ │ - 498 for(auto remote = remoteIndices.remoteIndices_.begin(); remote != end; │ │ │ │ │ -++remote, ++global) { │ │ │ │ │ - 499 assert(remote->first==global->first); │ │ │ │ │ - 500 assert(remote->second.first->size() == global->second.size()); │ │ │ │ │ - 501 │ │ │ │ │ - 502 auto riEnd = remote->second.first->end(); │ │ │ │ │ - 503 auto rIndex = remote->second.first->begin(); │ │ │ │ │ - 504 auto gIndex = global->second.begin(); │ │ │ │ │ - 505 auto index = indexSet.begin(); │ │ │ │ │ - 506 │ │ │ │ │ - 507 assert(rIndex==riEnd || gIndex != global->second.end()); │ │ │ │ │ - 508 while(rIndex != riEnd) { │ │ │ │ │ - 509 // Search for the index in the set. │ │ │ │ │ - 510 assert(gIndex != global->second.end()); │ │ │ │ │ - 511 │ │ │ │ │ - 512 while(!(index->global() == gIndex->first │ │ │ │ │ - 513 && index->local().attribute() == gIndex->second)) { │ │ │ │ │ - 514 ++index; │ │ │ │ │ - 515 // this is only needed for ALU, where there may exist │ │ │ │ │ - 516 // more entries with the same global index in the remote index set │ │ │ │ │ - 517 // than in the index set │ │ │ │ │ - 518 if (index->global() > gIndex->first) { │ │ │ │ │ - 519 index=indexSet.begin(); │ │ │ │ │ - 520 } │ │ │ │ │ - 521 } │ │ │ │ │ - 522 │ │ │ │ │ - 523 assert(index != indexSet.end() && *index == *gIndex); │ │ │ │ │ - 524 │ │ │ │ │ - 525 rIndex->localIndex_ = &(*index); │ │ │ │ │ - 526 ++index; │ │ │ │ │ - 527 ++rIndex; │ │ │ │ │ - 528 ++gIndex; │ │ │ │ │ - 529 } │ │ │ │ │ - 530 } │ │ │ │ │ - 531 remoteIndices.sourceSeqNo_ = remoteIndices.source_->seqNo(); │ │ │ │ │ - 532 remoteIndices.destSeqNo_ = remoteIndices.target_->seqNo(); │ │ │ │ │ - 533 } │ │ │ │ │ - 534 │ │ │ │ │ - 535 template │ │ │ │ │ -536 IndicesSyncer::IndicesSyncer(ParallelIndexSet& indexSet, │ │ │ │ │ - 537 RemoteIndices& remoteIndices) │ │ │ │ │ - 538 : indexSet_(indexSet), remoteIndices_(remoteIndices) │ │ │ │ │ - 539 { │ │ │ │ │ - 540 // index sets must match. │ │ │ │ │ - 541 assert(remoteIndices.source_ == remoteIndices.target_); │ │ │ │ │ - 542 assert(remoteIndices.source_ == &indexSet); │ │ │ │ │ - 543 MPI_Comm_rank(remoteIndices_.communicator(), &rank_); │ │ │ │ │ - 544 } │ │ │ │ │ - 545 │ │ │ │ │ - 546 template │ │ │ │ │ -547 IndicesSyncer::Iterators::Iterators(RemoteIndexList& remoteIndices, │ │ │ │ │ - 548 GlobalIndexList& globalIndices, │ │ │ │ │ - 549 BoolList& booleans) │ │ │ │ │ - 550 : iterators_(remoteIndices.beginModify(), globalIndices.beginModify(), │ │ │ │ │ - 551 booleans.beginModify(), remoteIndices.end()) │ │ │ │ │ - 552 { } │ │ │ │ │ - 553 │ │ │ │ │ - 554 template │ │ │ │ │ -555 IndicesSyncer::Iterators::Iterators() │ │ │ │ │ - 556 : iterators_() │ │ │ │ │ - 557 {} │ │ │ │ │ - 558 │ │ │ │ │ - 559 template │ │ │ │ │ -560 inline typename IndicesSyncer::Iterators& IndicesSyncer::Iterators:: │ │ │ │ │ -operator++() │ │ │ │ │ - 561 { │ │ │ │ │ - 562 ++(std::get<0>(iterators_)); │ │ │ │ │ - 563 ++(std::get<1>(iterators_)); │ │ │ │ │ - 564 ++(std::get<2>(iterators_)); │ │ │ │ │ - 565 return *this; │ │ │ │ │ - 566 } │ │ │ │ │ - 567 │ │ │ │ │ - 568 template │ │ │ │ │ -569 inline void IndicesSyncer::Iterators::insert(const RemoteIndex & index, │ │ │ │ │ - 570 const std::pair& global) │ │ │ │ │ - 571 { │ │ │ │ │ - 572 std::get<0>(iterators_).insert(index); │ │ │ │ │ - 573 std::get<1>(iterators_).insert(global); │ │ │ │ │ - 574 std::get<2>(iterators_).insert(false); │ │ │ │ │ - 575 } │ │ │ │ │ - 576 │ │ │ │ │ - 577 template │ │ │ │ │ - 578 inline typename IndicesSyncer::RemoteIndex& │ │ │ │ │ -579 IndicesSyncer::Iterators::remoteIndex() const │ │ │ │ │ - 580 { │ │ │ │ │ - 581 return *(std::get<0>(iterators_)); │ │ │ │ │ - 582 } │ │ │ │ │ - 583 │ │ │ │ │ - 584 template │ │ │ │ │ - 585 inline std::pair::GlobalIndex,typename │ │ │ │ │ -IndicesSyncer::Attribute>& │ │ │ │ │ -586 IndicesSyncer::Iterators::globalIndexPair() const │ │ │ │ │ - 587 { │ │ │ │ │ - 588 return *(std::get<1>(iterators_)); │ │ │ │ │ - 589 } │ │ │ │ │ - 590 │ │ │ │ │ - 591 template │ │ │ │ │ -592 inline bool IndicesSyncer::Iterators::isOld() const │ │ │ │ │ - 593 { │ │ │ │ │ - 594 return *(std::get<2>(iterators_)); │ │ │ │ │ - 595 } │ │ │ │ │ - 596 │ │ │ │ │ - 597 template │ │ │ │ │ -598 inline void IndicesSyncer::Iterators::reset(RemoteIndexList& │ │ │ │ │ -remoteIndices, │ │ │ │ │ - 599 GlobalIndexList& globalIndices, │ │ │ │ │ - 600 BoolList& booleans) │ │ │ │ │ - 601 { │ │ │ │ │ - 602 std::get<0>(iterators_) = remoteIndices.beginModify(); │ │ │ │ │ - 603 std::get<1>(iterators_) = globalIndices.beginModify(); │ │ │ │ │ - 604 std::get<2>(iterators_) = booleans.beginModify(); │ │ │ │ │ - 605 } │ │ │ │ │ - 606 │ │ │ │ │ - 607 template │ │ │ │ │ -608 inline bool IndicesSyncer::Iterators::isNotAtEnd() const │ │ │ │ │ - 609 { │ │ │ │ │ - 610 return std::get<0>(iterators_) != std::get<3>(iterators_); │ │ │ │ │ - 611 } │ │ │ │ │ - 612 │ │ │ │ │ - 613 template │ │ │ │ │ -614 inline bool IndicesSyncer::Iterators::isAtEnd() const │ │ │ │ │ - 615 { │ │ │ │ │ - 616 return std::get<0>(iterators_) == std::get<3>(iterators_); │ │ │ │ │ - 617 } │ │ │ │ │ - 618 │ │ │ │ │ - 619 template │ │ │ │ │ - 620 void IndicesSyncer::registerMessageDatatype() │ │ │ │ │ - 621 { │ │ │ │ │ - 622 MPI_Datatype type[2] = {MPI_INT, MPI_INT}; │ │ │ │ │ - 623 int blocklength[2] = {1,1}; │ │ │ │ │ - 624 MPI_Aint displacement[2]; │ │ │ │ │ - 625 MPI_Aint base; │ │ │ │ │ - 626 │ │ │ │ │ - 627 // Compute displacement │ │ │ │ │ - 628 MessageInformation message; │ │ │ │ │ - 629 │ │ │ │ │ - 630 MPI_Get_address( &(message.publish), displacement); │ │ │ │ │ - 631 MPI_Get_address( &(message.pairs), displacement+1); │ │ │ │ │ - 632 │ │ │ │ │ - 633 // Make the displacement relative │ │ │ │ │ - 634 MPI_Get_address(&message, &base); │ │ │ │ │ - 635 displacement[0] -= base; │ │ │ │ │ - 636 displacement[1] -= base; │ │ │ │ │ - 637 │ │ │ │ │ - 638 MPI_Type_create_struct( 2, blocklength, displacement, type, &datatype_); │ │ │ │ │ - 639 MPI_Type_commit(&datatype_); │ │ │ │ │ - 640 } │ │ │ │ │ - 641 │ │ │ │ │ - 642 template │ │ │ │ │ - 643 void IndicesSyncer::calculateMessageSizes() │ │ │ │ │ - 644 { │ │ │ │ │ - 645 auto iEnd = indexSet_.end(); │ │ │ │ │ - 646 auto collIter = remoteIndices_.template iterator(); │ │ │ │ │ - 647 │ │ │ │ │ - 648 for(auto index = indexSet_.begin(); index != iEnd; ++index) { │ │ │ │ │ - 649 collIter.advance(index->global(), index->local().attribute()); │ │ │ │ │ - 650 if(collIter.empty()) │ │ │ │ │ - 651 break; │ │ │ │ │ - 652 int knownRemote=0; │ │ │ │ │ - 653 auto end = collIter.end(); │ │ │ │ │ - 654 │ │ │ │ │ - 655 // Count the remote indices we know. │ │ │ │ │ - 656 for(auto valid = collIter.begin(); valid != end; ++valid) { │ │ │ │ │ - 657 ++knownRemote; │ │ │ │ │ - 658 } │ │ │ │ │ - 659 │ │ │ │ │ - 660 if(knownRemote>0) { │ │ │ │ │ - 661 Dune::dverb<global()<< " for processes "; │ │ │ │ │ - 662 │ │ │ │ │ - 663 // Update MessageInformation │ │ │ │ │ - 664 for(auto valid = collIter.begin(); valid != end; ++valid) { │ │ │ │ │ - 665 ++(infoSend_[valid.process()].publish); │ │ │ │ │ - 666 (infoSend_[valid.process()].pairs) += knownRemote; │ │ │ │ │ - 667 Dune::dverb<first==remote->first) { │ │ │ │ │ - 689 // We want to send message information to that process │ │ │ │ │ - 690 message = const_cast(&(messageIter->second)); │ │ │ │ │ - 691 ++messageIter; │ │ │ │ │ - 692 }else │ │ │ │ │ - 693 // We do not want to send information but the other process might. │ │ │ │ │ - 694 message = &dummy; │ │ │ │ │ - 695 │ │ │ │ │ - 696 sendBufferSizes_[neighbour]=0; │ │ │ │ │ - 697 int tsize; │ │ │ │ │ - 698 // The number of indices published │ │ │ │ │ - 699 MPI_Pack_size(1, MPI_INT,remoteIndices_.communicator(), &tsize); │ │ │ │ │ - 700 sendBufferSizes_[neighbour] += tsize; │ │ │ │ │ - 701 │ │ │ │ │ - 702 for(int i=0; i < message->publish; ++i) { │ │ │ │ │ - 703 // The global index │ │ │ │ │ - 704 MPI_Pack_size(1, MPITraits::getType(), │ │ │ │ │ -remoteIndices_.communicator(), &tsize); │ │ │ │ │ - 705 sendBufferSizes_[neighbour] += tsize; │ │ │ │ │ - 706 // The attribute in the local index │ │ │ │ │ - 707 MPI_Pack_size(1, MPI_CHAR, remoteIndices_.communicator(), &tsize); │ │ │ │ │ - 708 sendBufferSizes_[neighbour] += tsize; │ │ │ │ │ - 709 // The number of corresponding remote indices │ │ │ │ │ - 710 MPI_Pack_size(1, MPI_INT, remoteIndices_.communicator(), &tsize); │ │ │ │ │ - 711 sendBufferSizes_[neighbour] += tsize; │ │ │ │ │ - 712 } │ │ │ │ │ - 713 for(int i=0; i < message->pairs; ++i) { │ │ │ │ │ - 714 // The process of the remote index │ │ │ │ │ - 715 MPI_Pack_size(1, MPI_INT, remoteIndices_.communicator(), &tsize); │ │ │ │ │ - 716 sendBufferSizes_[neighbour] += tsize; │ │ │ │ │ - 717 // The attribute of the remote index │ │ │ │ │ - 718 MPI_Pack_size(1, MPI_CHAR, remoteIndices_.communicator(), &tsize); │ │ │ │ │ - 719 sendBufferSizes_[neighbour] += tsize; │ │ │ │ │ - 720 } │ │ │ │ │ - 721 │ │ │ │ │ - 722 Dune::dverb< │ │ │ │ │ - 852 void IndicesSyncer::packAndSend(int destination, char* buffer, std:: │ │ │ │ │ -size_t bufferSize, MPI_Request& request) │ │ │ │ │ - 853 { │ │ │ │ │ - 854 auto iEnd = indexSet_.end(); │ │ │ │ │ - 855 int bpos = 0; │ │ │ │ │ - 856 int published = 0; │ │ │ │ │ - 857 int pairs = 0; │ │ │ │ │ - 858 │ │ │ │ │ - 859 assert(checkReset()); │ │ │ │ │ - 860 │ │ │ │ │ - 861 // Pack the number of indices we publish │ │ │ │ │ - 862 MPI_Pack(&(infoSend_[destination].publish), 1, MPI_INT, buffer, │ │ │ │ │ -bufferSize, &bpos, │ │ │ │ │ - 863 remoteIndices_.communicator()); │ │ │ │ │ - 864 │ │ │ │ │ - 865 for(auto index = indexSet_.begin(); index != iEnd; ++index) { │ │ │ │ │ - 866 // Search for corresponding remote indices in all iterator tuples │ │ │ │ │ - 867 auto iteratorsEnd = iteratorsMap_.end(); │ │ │ │ │ - 868 │ │ │ │ │ - 869 // advance all iterators to a position with global index >= index->global │ │ │ │ │ -() │ │ │ │ │ - 870 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators; │ │ │ │ │ -++iterators) { │ │ │ │ │ - 871 while(iterators->second.isNotAtEnd() && │ │ │ │ │ - 872 iterators->second.globalIndexPair().first < index->global()) │ │ │ │ │ - 873 ++(iterators->second); │ │ │ │ │ - 874 assert(!iterators->second.isNotAtEnd() || iterators- │ │ │ │ │ ->second.globalIndexPair().first >= index->global()); │ │ │ │ │ - 875 } │ │ │ │ │ - 876 │ │ │ │ │ - 877 // Add all remote indices positioned at global which were already present │ │ │ │ │ -before calling sync │ │ │ │ │ - 878 // to the message. │ │ │ │ │ - 879 // Count how many remote indices we will send │ │ │ │ │ - 880 int indices = 0; │ │ │ │ │ - 881 bool knownRemote = false; // Is the remote process supposed to know this │ │ │ │ │ -index? │ │ │ │ │ - 882 │ │ │ │ │ - 883 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators; │ │ │ │ │ -++iterators) │ │ │ │ │ - 884 { │ │ │ │ │ - 885 std::pair p; │ │ │ │ │ - 886 if (iterators->second.isNotAtEnd()) │ │ │ │ │ - 887 { │ │ │ │ │ - 888 p = iterators->second.globalIndexPair(); │ │ │ │ │ - 889 } │ │ │ │ │ - 890 │ │ │ │ │ - 891 if(iterators->second.isNotAtEnd() && iterators->second.isOld() │ │ │ │ │ - 892 && iterators->second.globalIndexPair().first == index->global()) { │ │ │ │ │ - 893 indices++; │ │ │ │ │ - 894 if(destination == iterators->first) │ │ │ │ │ - 895 knownRemote = true; │ │ │ │ │ - 896 } │ │ │ │ │ - 897 } │ │ │ │ │ - 898 │ │ │ │ │ - 899 if(!knownRemote) │ │ │ │ │ - 900 // We do not need to send any indices │ │ │ │ │ - 901 continue; │ │ │ │ │ - 902 │ │ │ │ │ - 903 Dune::dverb<global │ │ │ │ │ -()<<" to "<(&(index->global())), 1, │ │ │ │ │ -MPITraits::getType(), buffer, bufferSize, &bpos, │ │ │ │ │ - 908 remoteIndices_.communicator()); │ │ │ │ │ - 909 │ │ │ │ │ - 910 char attr = index->local().attribute(); │ │ │ │ │ - 911 MPI_Pack(&attr, 1, MPI_CHAR, buffer, bufferSize, &bpos, │ │ │ │ │ - 912 remoteIndices_.communicator()); │ │ │ │ │ - 913 │ │ │ │ │ - 914 // Pack the number of remote indices we send. │ │ │ │ │ - 915 MPI_Pack(&indices, 1, MPI_INT, buffer, bufferSize, &bpos, │ │ │ │ │ - 916 remoteIndices_.communicator()); │ │ │ │ │ - 917 │ │ │ │ │ - 918 // Pack the information about the remote indices │ │ │ │ │ - 919 for(auto iterators = iteratorsMap_.begin(); iteratorsEnd != iterators; │ │ │ │ │ -++iterators) │ │ │ │ │ - 920 if(iterators->second.isNotAtEnd() && iterators->second.isOld() │ │ │ │ │ - 921 && iterators->second.globalIndexPair().first == index->global()) { │ │ │ │ │ - 922 int process = iterators->first; │ │ │ │ │ - 923 │ │ │ │ │ - 924 ++pairs; │ │ │ │ │ - 925 assert(pairs <= infoSend_[destination].pairs); │ │ │ │ │ - 926 MPI_Pack(&process, 1, MPI_INT, buffer, bufferSize, &bpos, │ │ │ │ │ - 927 remoteIndices_.communicator()); │ │ │ │ │ - 928 char attr2 = iterators->second.remoteIndex().attribute(); │ │ │ │ │ - 929 │ │ │ │ │ - 930 MPI_Pack(&attr2, 1, MPI_CHAR, buffer, bufferSize, &bpos, │ │ │ │ │ - 931 remoteIndices_.communicator()); │ │ │ │ │ - 932 --indices; │ │ │ │ │ - 933 } │ │ │ │ │ - 934 assert(indices==0); │ │ │ │ │ - 935 ++published; │ │ │ │ │ - 936 Dune::dvverb<<" (publish="< │ │ │ │ │ - 951 inline void IndicesSyncer::insertIntoRemoteIndexList(int process, │ │ │ │ │ - 952 const std::pair& globalPair, │ │ │ │ │ - 953 char attribute) │ │ │ │ │ - 954 { │ │ │ │ │ - 955 Dune::dverb<<"Inserting from "<second; │ │ │ │ │ - 972 │ │ │ │ │ - 973 // Search for the remote index │ │ │ │ │ - 974 while(iterators.isNotAtEnd() && iterators.globalIndexPair() < globalPair) │ │ │ │ │ -{ │ │ │ │ │ - 975 // Increment all iterators │ │ │ │ │ - 976 ++iterators; │ │ │ │ │ - 977 │ │ │ │ │ - 978 } │ │ │ │ │ - 979 │ │ │ │ │ - 980 if(iterators.isAtEnd() || iterators.globalIndexPair() != globalPair) { │ │ │ │ │ - 981 // The entry is not yet known │ │ │ │ │ - 982 // Insert in the list and do not change the first iterator. │ │ │ │ │ - 983 iterators.insert(RemoteIndex(Attribute(attribute)),globalPair); │ │ │ │ │ - 984 return; │ │ │ │ │ - 985 } │ │ │ │ │ - 986 │ │ │ │ │ - 987 // Global indices match │ │ │ │ │ - 988 bool indexIsThere=false; │ │ │ │ │ - 989 for(Iterators tmpIterators = iterators; │ │ │ │ │ - 990 !tmpIterators.isAtEnd() && tmpIterators.globalIndexPair() == globalPair; │ │ │ │ │ - 991 ++tmpIterators) │ │ │ │ │ - 992 //entry already exists with the same attribute │ │ │ │ │ - 993 if(tmpIterators.globalIndexPair().second == attribute) { │ │ │ │ │ - 994 indexIsThere=true; │ │ │ │ │ - 995 break; │ │ │ │ │ - 996 } │ │ │ │ │ - 997 │ │ │ │ │ - 998 if(!indexIsThere) │ │ │ │ │ - 999 // The entry is not yet known │ │ │ │ │ - 1000 // Insert in the list and do not change the first iterator. │ │ │ │ │ - 1001 iterators.insert(RemoteIndex(Attribute(attribute)),globalPair); │ │ │ │ │ - 1002 } │ │ │ │ │ - 1003 │ │ │ │ │ - 1004 template │ │ │ │ │ - 1005 template │ │ │ │ │ - 1006 void IndicesSyncer::recvAndUnpack(T1& numberer) │ │ │ │ │ - 1007 { │ │ │ │ │ - 1008 const ParallelIndexSet& constIndexSet = indexSet_; │ │ │ │ │ - 1009 auto iEnd = constIndexSet.end(); │ │ │ │ │ - 1010 auto index = constIndexSet.begin(); │ │ │ │ │ - 1011 int bpos = 0; │ │ │ │ │ - 1012 int publish; │ │ │ │ │ - 1013 │ │ │ │ │ - 1014 assert(checkReset()); │ │ │ │ │ - 1015 │ │ │ │ │ - 1016 MPI_Status status; │ │ │ │ │ - 1017 │ │ │ │ │ - 1018 // We have to determine the message size and source before the receive │ │ │ │ │ - 1019 MPI_Probe(MPI_ANY_SOURCE, 345, remoteIndices_.communicator(), &status); │ │ │ │ │ - 1020 │ │ │ │ │ - 1021 int source=status.MPI_SOURCE; │ │ │ │ │ - 1022 int count; │ │ │ │ │ - 1023 MPI_Get_count(&status, MPI_PACKED, &count); │ │ │ │ │ - 1024 │ │ │ │ │ - 1025 Dune::dvverb<receiveBufferSize_) { │ │ │ │ │ - 1028 receiveBufferSize_=count; │ │ │ │ │ - 1029 delete[] receiveBuffer_; │ │ │ │ │ - 1030 receiveBuffer_ = new char[receiveBufferSize_]; │ │ │ │ │ - 1031 } │ │ │ │ │ - 1032 │ │ │ │ │ - 1033 MPI_Recv(receiveBuffer_, count, MPI_PACKED, source, 345, │ │ │ │ │ -remoteIndices_.communicator(), &status); │ │ │ │ │ - 1034 │ │ │ │ │ - 1035 // How many global entries were published? │ │ │ │ │ - 1036 MPI_Unpack(receiveBuffer_, count, &bpos, &publish, 1, MPI_INT, │ │ │ │ │ -remoteIndices_.communicator()); │ │ │ │ │ - 1037 │ │ │ │ │ - 1038 // Now unpack the remote indices and add them. │ │ │ │ │ - 1039 while(publish>0) { │ │ │ │ │ - 1040 │ │ │ │ │ - 1041 // Unpack information about the local index on the source process │ │ │ │ │ - 1042 GlobalIndex global; // global index of the current entry │ │ │ │ │ - 1043 char sourceAttribute; // Attribute on the source process │ │ │ │ │ - 1044 int pairs; │ │ │ │ │ - 1045 │ │ │ │ │ - 1046 MPI_Unpack(receiveBuffer_, count, &bpos, &global, 1, │ │ │ │ │ -MPITraits::getType(), │ │ │ │ │ - 1047 remoteIndices_.communicator()); │ │ │ │ │ - 1048 MPI_Unpack(receiveBuffer_, count, &bpos, &sourceAttribute, 1, MPI_CHAR, │ │ │ │ │ - 1049 remoteIndices_.communicator()); │ │ │ │ │ - 1050 MPI_Unpack(receiveBuffer_, count, &bpos, &pairs, 1, MPI_INT, │ │ │ │ │ - 1051 remoteIndices_.communicator()); │ │ │ │ │ - 1052 │ │ │ │ │ - 1053 // Insert the entry on the remote process to our │ │ │ │ │ - 1054 // remote index list │ │ │ │ │ - 1055 SLList > sourceAttributeList; │ │ │ │ │ - 1056 sourceAttributeList.push_back(std::make_pair(source,Attribute │ │ │ │ │ -(sourceAttribute))); │ │ │ │ │ - 1057#ifndef NDEBUG │ │ │ │ │ - 1058 bool foundSelf = false; │ │ │ │ │ - 1059#endif │ │ │ │ │ - 1060 Attribute myAttribute=Attribute(); │ │ │ │ │ - 1061 │ │ │ │ │ - 1062 // Unpack the remote indices │ │ │ │ │ - 1063 for(; pairs>0; --pairs) { │ │ │ │ │ - 1064 // Unpack the process id that knows the index │ │ │ │ │ - 1065 int process; │ │ │ │ │ - 1066 char attribute; │ │ │ │ │ - 1067 MPI_Unpack(receiveBuffer_, count, &bpos, &process, 1, MPI_INT, │ │ │ │ │ - 1068 remoteIndices_.communicator()); │ │ │ │ │ - 1069 // Unpack the attribute │ │ │ │ │ - 1070 MPI_Unpack(receiveBuffer_, count, &bpos, &attribute, 1, MPI_CHAR, │ │ │ │ │ - 1071 remoteIndices_.communicator()); │ │ │ │ │ - 1072 │ │ │ │ │ - 1073 if(process==rank_) { │ │ │ │ │ - 1074#ifndef NDEBUG │ │ │ │ │ - 1075 foundSelf=true; │ │ │ │ │ - 1076#endif │ │ │ │ │ - 1077 myAttribute=Attribute(attribute); │ │ │ │ │ - 1078 // Now we know the local attribute of the global index │ │ │ │ │ - 1079 //Only add the index if it is unknown. │ │ │ │ │ - 1080 // Do we know that global index already? │ │ │ │ │ - 1081 auto pos = std::lower_bound(index, iEnd, IndexPair(global)); │ │ │ │ │ - 1082 │ │ │ │ │ - 1083 if(pos == iEnd || pos->global() != global) { │ │ │ │ │ - 1084 // no entry with this global index │ │ │ │ │ - 1085 indexSet_.add(global, │ │ │ │ │ - 1086 ParallelLocalIndex(numberer(global), │ │ │ │ │ - 1087 myAttribute, true)); │ │ │ │ │ - 1088 Dune::dvverb << "Adding "<global()==global; ++pos) │ │ │ │ │ - 1097 if(pos->local().attribute() == myAttribute) { │ │ │ │ │ - 1098 Dune::dvverb<<"found "<(numberer(global), │ │ │ │ │ - 1106 myAttribute, true)); │ │ │ │ │ - 1107 Dune::dvverb << "Adding "< >::const_iterator Iter; │ │ │ │ │ - 1117 for(Iter i=sourceAttributeList.begin(), end=sourceAttributeList.end(); │ │ │ │ │ - 1118 i!=end; ++i) │ │ │ │ │ - 1119 insertIntoRemoteIndexList(i->first, std::make_pair(global, myAttribute), │ │ │ │ │ - 1120 i->second); │ │ │ │ │ - 1121 --publish; │ │ │ │ │ - 1122 } │ │ │ │ │ - 1123 │ │ │ │ │ - 1124 resetIteratorsMap(); │ │ │ │ │ - 1125 } │ │ │ │ │ - 1126 │ │ │ │ │ - 1127 template │ │ │ │ │ - 1128 void IndicesSyncer::resetIteratorsMap(){ │ │ │ │ │ - 1129 │ │ │ │ │ - 1130 // Reset iterators in all tuples. │ │ │ │ │ - 1131 const auto remoteEnd = remoteIndices_.remoteIndices_.end(); │ │ │ │ │ - 1132 auto iterators = iteratorsMap_.begin(); │ │ │ │ │ - 1133 auto global = globalMap_.begin(); │ │ │ │ │ - 1134 auto added = oldMap_.begin(); │ │ │ │ │ - 1135 │ │ │ │ │ - 1136 for(auto remote = remoteIndices_.remoteIndices_.begin(); │ │ │ │ │ - 1137 remote != remoteEnd; ++remote, ++global, ++added, ++iterators) { │ │ │ │ │ - 1138 iterators->second.reset(*(remote->second.first), global->second, added- │ │ │ │ │ ->second); │ │ │ │ │ - 1139 } │ │ │ │ │ - 1140 } │ │ │ │ │ - 1141 │ │ │ │ │ - 1142 template │ │ │ │ │ - 1143 bool IndicesSyncer::checkReset(const Iterators& iterators, │ │ │ │ │ -RemoteIndexList& rList, GlobalIndexList& gList, │ │ │ │ │ - 1144 BoolList& bList){ │ │ │ │ │ - 1145 │ │ │ │ │ - 1146 if(std::get<0>(iterators.iterators_) != rList.begin()) │ │ │ │ │ - 1147 return false; │ │ │ │ │ - 1148 if(std::get<1>(iterators.iterators_) != gList.begin()) │ │ │ │ │ - 1149 return false; │ │ │ │ │ - 1150 if(std::get<2>(iterators.iterators_) != bList.begin()) │ │ │ │ │ - 1151 return false; │ │ │ │ │ - 1152 return true; │ │ │ │ │ - 1153 } │ │ │ │ │ - 1154 │ │ │ │ │ - 1155 │ │ │ │ │ - 1156 template │ │ │ │ │ - 1157 bool IndicesSyncer::checkReset(){ │ │ │ │ │ - 1158 │ │ │ │ │ - 1159 // Reset iterators in all tuples. │ │ │ │ │ - 1160 const auto remoteEnd = remoteIndices_.remoteIndices_.end(); │ │ │ │ │ - 1161 auto iterators = iteratorsMap_.begin(); │ │ │ │ │ - 1162 auto global = globalMap_.begin(); │ │ │ │ │ - 1163 auto added = oldMap_.begin(); │ │ │ │ │ - 1164 bool ret = true; │ │ │ │ │ - 1165 │ │ │ │ │ - 1166 for(auto remote = remoteIndices_.remoteIndices_.begin(); │ │ │ │ │ - 1167 remote != remoteEnd; ++remote, ++global, ++added, ++iterators) { │ │ │ │ │ - 1168 if(!checkReset(iterators->second, *(remote->second.first), global- │ │ │ │ │ ->second, │ │ │ │ │ - 1169 added->second)) │ │ │ │ │ - 1170 ret=false; │ │ │ │ │ - 1171 } │ │ │ │ │ - 1172 return ret; │ │ │ │ │ - 1173 } │ │ │ │ │ - 1174} │ │ │ │ │ - 1175 │ │ │ │ │ - 1176#endif │ │ │ │ │ - 1177#endif │ │ │ │ │ -remoteindices.hh │ │ │ │ │ -Classes describing a distributed indexset. │ │ │ │ │ -indexset.hh │ │ │ │ │ -Provides a map between global and local indices. │ │ │ │ │ -sllist.hh │ │ │ │ │ -Implements a singly linked list together with the necessary iterators. │ │ │ │ │ -stdstreams.hh │ │ │ │ │ -Standard Dune debug streams. │ │ │ │ │ -Dune::SLList::push_back │ │ │ │ │ -void push_back(const MemberType &item) │ │ │ │ │ -Add a new entry to the end of the list. │ │ │ │ │ -Definition: sllist.hh:643 │ │ │ │ │ -Dune::SLList::iterator │ │ │ │ │ -SLListIterator< T, A > iterator │ │ │ │ │ -The mutable iterator of the list. │ │ │ │ │ -Definition: sllist.hh:69 │ │ │ │ │ -Dune::SLList::end │ │ │ │ │ -iterator end() │ │ │ │ │ -Get an iterator pointing to the end of the list. │ │ │ │ │ -Definition: sllist.hh:774 │ │ │ │ │ -Dune::SLList::beginModify │ │ │ │ │ -ModifyIterator beginModify() │ │ │ │ │ -Get an iterator capable of deleting and inserting elements. │ │ │ │ │ -Definition: sllist.hh:787 │ │ │ │ │ -Dune::SLList<_RemoteIndex,_Allocator_>::const_iterator │ │ │ │ │ -SLListConstIterator< RemoteIndex, Allocator > const_iterator │ │ │ │ │ -The constant iterator of the list. │ │ │ │ │ -Definition: sllist.hh:74 │ │ │ │ │ -Dune::SLList::ModifyIterator │ │ │ │ │ -SLListModifyIterator< T, A > ModifyIterator │ │ │ │ │ -The type of the iterator capable of deletion and insertion. │ │ │ │ │ -Definition: sllist.hh:103 │ │ │ │ │ -Dune::SLList::begin │ │ │ │ │ -iterator begin() │ │ │ │ │ -Get an iterator pointing to the first element in the list. │ │ │ │ │ -Definition: sllist.hh:762 │ │ │ │ │ -Dune::operator< │ │ │ │ │ -EnableIfInterOperable< T1, T2, bool >::type operator<(const │ │ │ │ │ -RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const │ │ │ │ │ -RandomAccessIteratorFacade< T2, V2, R2, D > &rhs) │ │ │ │ │ -Comparison operator. │ │ │ │ │ -Definition: iteratorfacades.hh:637 │ │ │ │ │ -Dune::operator== │ │ │ │ │ -EnableIfInterOperable< T1, T2, bool >::type operator==(const │ │ │ │ │ -ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, │ │ │ │ │ -V2, R2, D > &rhs) │ │ │ │ │ -Checks for equality. │ │ │ │ │ -Definition: iteratorfacades.hh:237 │ │ │ │ │ -Dune::operator!= │ │ │ │ │ -EnableIfInterOperable< T1, T2, bool >::type operator!=(const │ │ │ │ │ -ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, │ │ │ │ │ -V2, R2, D > &rhs) │ │ │ │ │ -Checks for inequality. │ │ │ │ │ -Definition: iteratorfacades.hh:259 │ │ │ │ │ -Dune::IndicesSyncer::RemoteIndices │ │ │ │ │ -Dune::RemoteIndices< ParallelIndexSet > RemoteIndices │ │ │ │ │ -Type of the remote indices. │ │ │ │ │ -Definition: indicessyncer.hh:59 │ │ │ │ │ -Dune::IndicesSyncer::MessageInformation::publish │ │ │ │ │ -int publish │ │ │ │ │ -The number of indices we publish for the other process. │ │ │ │ │ -Definition: indicessyncer.hh:126 │ │ │ │ │ -Dune::repairLocalIndexPointers │ │ │ │ │ -void repairLocalIndexPointers(std::map< int, SLList< std::pair< typename T:: │ │ │ │ │ -GlobalIndex, typename T::LocalIndex::Attribute >, A > > &globalMap, │ │ │ │ │ -RemoteIndices< T, A1 > &remoteIndices, const T &indexSet) │ │ │ │ │ -Repair the pointers to the local indices in the remote indices. │ │ │ │ │ -Definition: indicessyncer.hh:487 │ │ │ │ │ -Dune::IndicesSyncer::GlobalIndex │ │ │ │ │ -ParallelIndexSet::GlobalIndex GlobalIndex │ │ │ │ │ -Type of the global index used in the index set. │ │ │ │ │ -Definition: indicessyncer.hh:51 │ │ │ │ │ -Dune::IndicesSyncer::MessageInformation::pairs │ │ │ │ │ -int pairs │ │ │ │ │ -The number of pairs (attribute and process number) we publish to the neighbour │ │ │ │ │ -process. │ │ │ │ │ -Definition: indicessyncer.hh:131 │ │ │ │ │ -Dune::IndicesSyncer::Iterators::attribute │ │ │ │ │ -Attribute & attribute() const │ │ │ │ │ -Dune::IndicesSyncer::Attribute │ │ │ │ │ -ParallelIndexSet::LocalIndex::Attribute Attribute │ │ │ │ │ -Type of the attribute used in the index set. │ │ │ │ │ -Definition: indicessyncer.hh:54 │ │ │ │ │ -Dune::IndicesSyncer::IndicesSyncer │ │ │ │ │ -IndicesSyncer(ParallelIndexSet &indexSet, RemoteIndices &remoteIndices) │ │ │ │ │ -Constructor. │ │ │ │ │ -Definition: indicessyncer.hh:536 │ │ │ │ │ -Dune::IndicesSyncer::ParallelIndexSet │ │ │ │ │ -T ParallelIndexSet │ │ │ │ │ -The type of the index set. │ │ │ │ │ -Definition: indicessyncer.hh:45 │ │ │ │ │ -Dune::ParallelIndexSet::GlobalIndex │ │ │ │ │ -TG GlobalIndex │ │ │ │ │ -the type of the global index. This type has to provide at least a operator< for │ │ │ │ │ -sorting. │ │ │ │ │ -Definition: indexset.hh:226 │ │ │ │ │ -Dune::storeGlobalIndicesOfRemoteIndices │ │ │ │ │ -void storeGlobalIndicesOfRemoteIndices(std::map< int, SLList< std::pair< │ │ │ │ │ -typename T::GlobalIndex, typename T::LocalIndex::Attribute >, A > > &globalMap, │ │ │ │ │ -const RemoteIndices< T, A1 > &remoteIndices) │ │ │ │ │ -Stores the corresponding global indices of the remote index information. │ │ │ │ │ -Definition: indicessyncer.hh:461 │ │ │ │ │ -Dune::IndicesSyncer::sync │ │ │ │ │ -void sync() │ │ │ │ │ -Sync the index set. │ │ │ │ │ -Definition: indicessyncer.hh:728 │ │ │ │ │ -Dune::ParallelIndexSet::seqNo │ │ │ │ │ -int seqNo() const │ │ │ │ │ -Get the internal sequence number. │ │ │ │ │ -Dune::IndicesSyncer::IndexPair │ │ │ │ │ -ParallelIndexSet::IndexPair IndexPair │ │ │ │ │ -The type of the index pair. │ │ │ │ │ -Definition: indicessyncer.hh:48 │ │ │ │ │ -Dune::IndicesSyncer::MessageInformation::MessageInformation │ │ │ │ │ -MessageInformation() │ │ │ │ │ -Definition: indicessyncer.hh:122 │ │ │ │ │ -Dune::dvverb │ │ │ │ │ -DVVerbType dvverb(std::cout) │ │ │ │ │ -stream for very verbose output. │ │ │ │ │ -Definition: stdstreams.hh:95 │ │ │ │ │ -Dune::dverb │ │ │ │ │ -DVerbType dverb(std::cout) │ │ │ │ │ -Singleton of verbose debug stream. │ │ │ │ │ -Definition: stdstreams.hh:116 │ │ │ │ │ + 216 │ │ │ │ │ + 217 │ │ │ │ │ + 244template │ │ │ │ │ +245auto transpose(const std::reference_wrapper& matrix) { │ │ │ │ │ + 246 return Impl::TransposedMatrixWrapper(matrix); │ │ │ │ │ + 247} │ │ │ │ │ + 248 │ │ │ │ │ + 249 │ │ │ │ │ + 250 │ │ │ │ │ + 260template │ │ │ │ │ +261auto transposedView(const Matrix& matrix) { │ │ │ │ │ + 262 return transpose(std::cref(matrix)); │ │ │ │ │ + 263} │ │ │ │ │ + 264 │ │ │ │ │ + 265 │ │ │ │ │ + 266 │ │ │ │ │ + 267 │ │ │ │ │ + 268 │ │ │ │ │ + 269} // namespace Dune │ │ │ │ │ + 270 │ │ │ │ │ + 271#endif // DUNE_COMMON_TRANSPOSE_HH │ │ │ │ │ +promotiontraits.hh │ │ │ │ │ +Compute type of the result of an arithmetic operation involving two different │ │ │ │ │ +number types. │ │ │ │ │ +fmatrix.hh │ │ │ │ │ +Implements a matrix constructed from a given type representing a field and │ │ │ │ │ +compile-time given number ... │ │ │ │ │ +matrixconcepts.hh │ │ │ │ │ +type_traits.hh │ │ │ │ │ +referencehelper.hh │ │ │ │ │ +dynmatrix.hh │ │ │ │ │ +This file implements a dense matrix with dynamic numbers of rows and columns. │ │ │ │ │ +Dune::sparseRange │ │ │ │ │ +auto sparseRange(Range &&range) │ │ │ │ │ +Allow structured-binding for-loops for sparse iterators. │ │ │ │ │ +Definition: rangeutilities.hh:821 │ │ │ │ │ +Dune::resolveRef │ │ │ │ │ +constexpr T & resolveRef(T &gf) noexcept │ │ │ │ │ +Helper function to resolve std::reference_wrapper. │ │ │ │ │ +Definition: referencehelper.hh:47 │ │ │ │ │ +Dune::Std::is_detected │ │ │ │ │ +typename detected_or< nonesuch, Op, Args... >::value_t is_detected │ │ │ │ │ +Detects whether Op is valid. │ │ │ │ │ +Definition: type_traits.hh:141 │ │ │ │ │ +std │ │ │ │ │ +STL namespace. │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::AlignedNumberImpl::max │ │ │ │ │ -auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > │ │ │ │ │ -&b) │ │ │ │ │ -Definition: debugalign.hh:425 │ │ │ │ │ -Dune::MPITraits::getType │ │ │ │ │ -static MPI_Datatype getType() │ │ │ │ │ -Definition: mpitraits.hh:48 │ │ │ │ │ -Dune::IndexPair │ │ │ │ │ -A pair consisting of a global and local index. │ │ │ │ │ -Definition: indexset.hh:85 │ │ │ │ │ -Dune::IndicesSyncer │ │ │ │ │ -Class for recomputing missing indices of a distributed index set. │ │ │ │ │ -Definition: indicessyncer.hh:41 │ │ │ │ │ -Dune::ParallelLocalIndex │ │ │ │ │ -An index present on the local process with an additional attribute flag. │ │ │ │ │ -Definition: plocalindex.hh:49 │ │ │ │ │ -Dune::RemoteIndices │ │ │ │ │ -The indices present on remote processes. │ │ │ │ │ -Definition: remoteindices.hh:189 │ │ │ │ │ -Dune::RemoteIndices::communicator │ │ │ │ │ -MPI_Comm communicator() const │ │ │ │ │ -Get the mpi communicator used. │ │ │ │ │ -Definition: remoteindices.hh:1696 │ │ │ │ │ -Dune::RemoteIndices::end │ │ │ │ │ -const_iterator end() const │ │ │ │ │ -Get an iterator over all remote index lists. │ │ │ │ │ -Definition: remoteindices.hh:1529 │ │ │ │ │ -Dune::RemoteIndices::neighbours │ │ │ │ │ -int neighbours() const │ │ │ │ │ -Get the number of processors we share indices with. │ │ │ │ │ -Definition: remoteindices.hh:1446 │ │ │ │ │ -Dune::RemoteIndices::Allocator │ │ │ │ │ -typename std::allocator_traits< A >::template rebind_alloc< RemoteIndex > │ │ │ │ │ -Allocator │ │ │ │ │ -The type of the allocator for the remote index list. │ │ │ │ │ -Definition: remoteindices.hh:237 │ │ │ │ │ -Dune::RemoteIndices::begin │ │ │ │ │ -const_iterator begin() const │ │ │ │ │ -Get an iterator over all remote index lists. │ │ │ │ │ -Definition: remoteindices.hh:1522 │ │ │ │ │ -Dune::RemoteIndex │ │ │ │ │ -Information about an index residing on another processor. │ │ │ │ │ -Definition: remoteindices.hh:73 │ │ │ │ │ -Dune::SLListIterator │ │ │ │ │ -A mutable iterator for the SLList. │ │ │ │ │ -Definition: sllist.hh:271 │ │ │ │ │ -Dune::SLList │ │ │ │ │ -A single linked list. │ │ │ │ │ -Definition: sllist.hh:44 │ │ │ │ │ +Dune::transpose │ │ │ │ │ +auto transpose(const Matrix &matrix) │ │ │ │ │ +Return the transposed of the given matrix. │ │ │ │ │ +Definition: transpose.hh:183 │ │ │ │ │ +Dune::transposedView │ │ │ │ │ +auto transposedView(const Matrix &matrix) │ │ │ │ │ +Create a view modelling the transposed matrix. │ │ │ │ │ +Definition: transpose.hh:261 │ │ │ │ │ +Dune::FieldMatrix │ │ │ │ │ +A dense n x m matrix. │ │ │ │ │ +Definition: fmatrix.hh:117 │ │ │ │ │ +Dune::DynamicMatrix │ │ │ │ │ +Construct a matrix with a dynamic size. │ │ │ │ │ +Definition: dynmatrix.hh:61 │ │ │ │ │ +Dune::FieldTraits::field_type │ │ │ │ │ +T field_type │ │ │ │ │ +export the type representing the field │ │ │ │ │ +Definition: ftraits.hh:28 │ │ │ │ │ +Dune::FieldTraits::real_type │ │ │ │ │ +T real_type │ │ │ │ │ +export the type representing the real type of the field │ │ │ │ │ +Definition: ftraits.hh:30 │ │ │ │ │ +Dune::PromotionTraits::PromotedType │ │ │ │ │ +decltype(std::declval< T1 >()+std::declval< T2 >()) PromotedType │ │ │ │ │ +Definition: promotiontraits.hh:28 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00047.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: mpicollectivecommunication.hh File Reference │ │ │ │ +dune-common: vc.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,24 +58,29 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
mpicollectivecommunication.hh File Reference
│ │ │ │ +
vc.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <dune/common/parallel/mpicommunication.hh>
│ │ │ │ -
│ │ │ │ + │ │ │ │ +

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

│ │ │ │ + │ │ │ │

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.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,14 +4,17 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -mpicollectivecommunication.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +vc.hh File Reference │ │ │ │ │ +Compatibility header for including More... │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ +***** Detailed Description ***** │ │ │ │ │ +Compatibility header for including │ │ │ │ │ +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. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00047_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: mpicollectivecommunication.hh Source File │ │ │ │ +dune-common: vc.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,27 +58,42 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
mpicollectivecommunication.hh
│ │ │ │ +
vc.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
3// Will be removed after the 2.7 release
│ │ │ │ -
4#warning "Deprecated header, use #include <dune/common/parallel/mpicommunication.hh> instead!"
│ │ │ │ - │ │ │ │ -
Implements an utility class that provides MPI's collective communication methods.
│ │ │ │ +
3#ifndef DUNE_COMMON_VC_HH
│ │ │ │ +
4#define DUNE_COMMON_VC_HH
│ │ │ │ +
5
│ │ │ │ +
15#if HAVE_VC
│ │ │ │ +
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
│ │ │ │ +
29
│ │ │ │ +
30#endif // DUNE_COMMON_VC_HH
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,23 +4,34 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -mpicollectivecommunication.hh │ │ │ │ │ +vc.hh │ │ │ │ │ Go_to_the_documentation_of_this_file. │ │ │ │ │ 1// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ - 3// Will be removed after the 2.7 release │ │ │ │ │ - 4#warning "Deprecated header, use #include instead!" │ │ │ │ │ - 5#include │ │ │ │ │ -mpicommunication.hh │ │ │ │ │ -Implements an utility class that provides MPI's collective communication │ │ │ │ │ -methods. │ │ │ │ │ + 3#ifndef DUNE_COMMON_VC_HH │ │ │ │ │ + 4#define DUNE_COMMON_VC_HH │ │ │ │ │ + 5 │ │ │ │ │ + 15#if HAVE_VC │ │ │ │ │ + 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 │ │ │ │ │ + 29 │ │ │ │ │ + 30#endif // DUNE_COMMON_VC_HH │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00050.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: mpidata.hh File Reference │ │ │ │ +dune-common: to_unique_ptr.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,61 +58,49 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ Namespaces | │ │ │ │ +Typedefs | │ │ │ │ Functions
│ │ │ │ -
mpidata.hh File Reference
│ │ │ │ +
to_unique_ptr.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

Interface class to translate objects to a MPI_Datatype, void* and size used for MPI calls. │ │ │ │ -More...

│ │ │ │ -
#include <vector>
│ │ │ │ -#include <string>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/common/std/type_traits.hh>
│ │ │ │ -#include <dune/common/parallel/mpitraits.hh>
│ │ │ │ +
#include <memory>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

struct  Dune::MPIData< T, Enable >
 
struct  Dune::MPIData< void >
 
struct  Dune::MPIData< T, std::void_t< std::tuple< decltype(std::declval< T >().data()), decltype(std::declval< T >().size()), typename std::decay_t< T >::value_type > > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ +Typedefs

template<class T >
using Dune::ToUniquePtr = std::unique_ptr< T >
 Alias for std::unique_ptr introduced as transition wrapper. More...
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<class T >
auto Dune::getMPIData (T &t)
 
template<class T , class... Args>
std::unique_ptr< T > Dune::makeToUnique (Args &&... args)
 Alias for std::make_unique introduced as transition wrapper. More...
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Interface class to translate objects to a MPI_Datatype, void* and size used for MPI calls.

│ │ │ │ -

Furthermore it can be used to resize the object if possible. This makes it possible to receive a message with variable size. See Communication::rrecv.

│ │ │ │ -

To 'register' a new dynamic type for MPI communication specialize MPIData or overload getMPIData.

│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,46 +4,29 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -Classes | Namespaces | Functions │ │ │ │ │ -mpidata.hh File Reference │ │ │ │ │ -Common » Parallel_Communication │ │ │ │ │ -Interface class to translate objects to a MPI_Datatype, void* and size used for │ │ │ │ │ -MPI calls. More... │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Namespaces | Typedefs | Functions │ │ │ │ │ +to_unique_ptr.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ - Classes │ │ │ │ │ -struct  Dune::MPIData<_T,_Enable_> │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::MPIData<_void_> │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::MPIData<_T,_std::void_t<_std::tuple<_decltype(std::declval<_T_> │ │ │ │ │ - ().data()),_decltype(std::declval<_T_>().size()),_typename_std:: │ │ │ │ │ - decay_t<_T_>::value_type_>_>_> │ │ │ │ │ -  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ - Functions │ │ │ │ │ + Typedefs │ │ │ │ │ template │ │ │ │ │ -auto Dune::getMPIData (T &t) │ │ │ │ │ +using Dune::ToUniquePtr = std::unique_ptr< T > │ │ │ │ │ +  Alias for std::unique_ptr introduced as transition wrapper. More... │ │ │ │ │ +  │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +std::unique_ptr< T > Dune::makeToUnique (Args &&... args) │ │ │ │ │ +  Alias for std::make_unique introduced as transition │ │ │ │ │ + wrapper. More... │ │ │ │ │   │ │ │ │ │ -***** Detailed Description ***** │ │ │ │ │ -Interface class to translate objects to a MPI_Datatype, void* and size used for │ │ │ │ │ -MPI calls. │ │ │ │ │ -Furthermore it can be used to resize the object if possible. This makes it │ │ │ │ │ -possible to receive a message with variable size. See Communication::rrecv. │ │ │ │ │ -To 'register' a new dynamic type for MPI communication specialize MPIData or │ │ │ │ │ -overload getMPIData. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00050_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: mpidata.hh Source File │ │ │ │ +dune-common: to_unique_ptr.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,164 +58,50 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
mpidata.hh
│ │ │ │ +
to_unique_ptr.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 (C) 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_COMMON_PARALLEL_MPIDATA_HH
│ │ │ │ -
7#define DUNE_COMMON_PARALLEL_MPIDATA_HH
│ │ │ │ +
6#ifndef DUNE_TO_UNIQUE_PTR_HH
│ │ │ │ +
7#define DUNE_TO_UNIQUE_PTR_HH
│ │ │ │
8
│ │ │ │ -
9#include <vector>
│ │ │ │ -
10#include <string>
│ │ │ │ -
11
│ │ │ │ -
12#if HAVE_MPI
│ │ │ │ -
13
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
17
│ │ │ │ -
37namespace Dune{
│ │ │ │ -
38
│ │ │ │ -
39 template<class, class = void>
│ │ │ │ -
40 struct MPIData;
│ │ │ │ -
41
│ │ │ │ -
42 template<class T>
│ │ │ │ -
43 auto getMPIData(T& t){
│ │ │ │ -
44 return MPIData<T>(t);
│ │ │ │ -
45 }
│ │ │ │ -
46
│ │ │ │ -
47 // Default implementation for static datatypes
│ │ │ │ -
48 template<class T, class Enable>
│ │ │ │ -
49 struct MPIData
│ │ │ │ -
50 {
│ │ │ │ -
51 friend auto getMPIData<T>(T&);
│ │ │ │ -
52 protected:
│ │ │ │ - │ │ │ │ -
54
│ │ │ │ -
55 MPIData(T& t)
│ │ │ │ -
56 : data_(t)
│ │ │ │ -
57 {}
│ │ │ │ -
58
│ │ │ │ -
59 public:
│ │ │ │ -
60 void* ptr() const {
│ │ │ │ -
61 return (void*)&data_;
│ │ │ │ -
62 }
│ │ │ │ -
63
│ │ │ │ -
64 // indicates whether the datatype can be resized
│ │ │ │ -
65 static constexpr bool static_size = true;
│ │ │ │ -
66
│ │ │ │ -
67 int size() const{
│ │ │ │ -
68 return 1;
│ │ │ │ -
69 }
│ │ │ │ -
70
│ │ │ │ -
71 MPI_Datatype type() const {
│ │ │ │ -
72 return MPITraits<std::decay_t<T>>::getType();
│ │ │ │ -
73 }
│ │ │ │ -
74 };
│ │ │ │ -
75
│ │ │ │ -
76 // dummy implementation for void
│ │ │ │ -
77 template<>
│ │ │ │ -
78 struct MPIData<void>{
│ │ │ │ -
79 protected:
│ │ │ │ - │ │ │ │ -
81
│ │ │ │ -
82 public:
│ │ │ │ -
83 void* ptr(){
│ │ │ │ -
84 return nullptr;
│ │ │ │ -
85 }
│ │ │ │ -
86 int size(){
│ │ │ │ -
87 return 0;
│ │ │ │ -
88 }
│ │ │ │ -
89 void get(){}
│ │ │ │ -
90 MPI_Datatype type() const{
│ │ │ │ -
91 return MPI_INT;
│ │ │ │ -
92 }
│ │ │ │ -
93 };
│ │ │ │ -
94
│ │ │ │ -
95 // specializations:
│ │ │ │ -
96 // std::vector of static sized elements or std::string
│ │ │ │ -
97 template<class T>
│ │ │ │ -
98 struct MPIData<T, std::void_t<std::tuple<decltype(std::declval<T>().data()),
│ │ │ │ -
99 decltype(std::declval<T>().size()),
│ │ │ │ -
100 typename std::decay_t<T>::value_type>>>{
│ │ │ │ -
101 private:
│ │ │ │ -
102 template<class U>
│ │ │ │ -
103 using hasResizeOp = decltype(std::declval<U>().resize(0));
│ │ │ │ -
104
│ │ │ │ -
105 protected:
│ │ │ │ -
106 friend auto getMPIData<T>(T&);
│ │ │ │ - │ │ │ │ -
108 : data_(t)
│ │ │ │ -
109 {}
│ │ │ │ -
110 public:
│ │ │ │ -
111 static constexpr bool static_size = std::is_const<T>::value || !Std::is_detected_v<hasResizeOp, T>;
│ │ │ │ -
112 void* ptr() {
│ │ │ │ -
113 return (void*) data_.data();
│ │ │ │ -
114 }
│ │ │ │ -
115 int size() {
│ │ │ │ -
116 return data_.size();
│ │ │ │ -
117 }
│ │ │ │ -
118 MPI_Datatype type() const{
│ │ │ │ - │ │ │ │ -
120 }
│ │ │ │ -
121
│ │ │ │ -
122 template<class S = T>
│ │ │ │ -
123 auto /*void*/ resize(int size)
│ │ │ │ -
124 -> std::enable_if_t<!std::is_const<S>::value || !Std::is_detected_v<hasResizeOp, S>>
│ │ │ │ -
125 {
│ │ │ │ -
126 data_.resize(size);
│ │ │ │ -
127 }
│ │ │ │ -
128
│ │ │ │ -
129 protected:
│ │ │ │ - │ │ │ │ -
131 };
│ │ │ │ -
132
│ │ │ │ -
133}
│ │ │ │ -
134
│ │ │ │ -
139#endif
│ │ │ │ -
140#endif
│ │ │ │ -
Traits classes for mapping types onto MPI_Datatype.
│ │ │ │ -
Traits for type conversions and type information.
│ │ │ │ - │ │ │ │ -
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
│ │ │ │ -
STL namespace.
│ │ │ │ +
9#warning to_unique_ptr.hh and ToUniquePtr are deprecated. Use std::unique_ptr or std::shared_ptr instead.
│ │ │ │ +
10
│ │ │ │ +
11#include <memory>
│ │ │ │ +
12
│ │ │ │ +
13namespace Dune
│ │ │ │ +
14{
│ │ │ │ +
17 template <class T>
│ │ │ │ +
18 using ToUniquePtr [[deprecated]] = std::unique_ptr<T>;
│ │ │ │ +
19
│ │ │ │ +
22 template <class T, class... Args>
│ │ │ │ +
23 [[deprecated]] std::unique_ptr<T> makeToUnique (Args&&... args)
│ │ │ │ +
24 {
│ │ │ │ +
25 return std::make_unique(std::forward<Args>(args)...);
│ │ │ │ +
26 }
│ │ │ │ +
27
│ │ │ │ +
28} // end namespace Dune
│ │ │ │ +
29
│ │ │ │ +
30#endif // DUNE_TO_UNIQUE_PTR_HH
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
auto getMPIData(T &t)
Definition: mpidata.hh:43
│ │ │ │ -
A traits class describing the mapping of types onto MPI_Datatypes.
Definition: mpitraits.hh:41
│ │ │ │ -
Definition: mpidata.hh:50
│ │ │ │ -
T & data_
Definition: mpidata.hh:53
│ │ │ │ -
MPI_Datatype type() const
Definition: mpidata.hh:71
│ │ │ │ -
void * ptr() const
Definition: mpidata.hh:60
│ │ │ │ -
int size() const
Definition: mpidata.hh:67
│ │ │ │ -
static constexpr bool static_size
Definition: mpidata.hh:65
│ │ │ │ -
MPIData(T &t)
Definition: mpidata.hh:55
│ │ │ │ -
void get()
Definition: mpidata.hh:89
│ │ │ │ -
MPIData()
Definition: mpidata.hh:80
│ │ │ │ -
int size()
Definition: mpidata.hh:86
│ │ │ │ -
void * ptr()
Definition: mpidata.hh:83
│ │ │ │ -
MPI_Datatype type() const
Definition: mpidata.hh:90
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
auto resize(int size) -> std::enable_if_t<!std::is_const< S >::value||!Std::is_detected_v< hasResizeOp, S > >
Definition: mpidata.hh:123
│ │ │ │ - │ │ │ │ +
std::unique_ptr< T > makeToUnique(Args &&... args)
Alias for std::make_unique introduced as transition wrapper.
Definition: to_unique_ptr.hh:23
│ │ │ │ +
std::unique_ptr< T > ToUniquePtr
Alias for std::unique_ptr introduced as transition wrapper.
Definition: to_unique_ptr.hh:18
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,219 +4,51 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -mpidata.hh │ │ │ │ │ +to_unique_ptr.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 (C) 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_COMMON_PARALLEL_MPIDATA_HH │ │ │ │ │ - 7#define DUNE_COMMON_PARALLEL_MPIDATA_HH │ │ │ │ │ + 6#ifndef DUNE_TO_UNIQUE_PTR_HH │ │ │ │ │ + 7#define DUNE_TO_UNIQUE_PTR_HH │ │ │ │ │ 8 │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11 │ │ │ │ │ - 12#if HAVE_MPI │ │ │ │ │ - 13 │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ - 16#include │ │ │ │ │ - 17 │ │ │ │ │ - 37namespace Dune{ │ │ │ │ │ - 38 │ │ │ │ │ - 39 template │ │ │ │ │ - 40 struct MPIData; │ │ │ │ │ - 41 │ │ │ │ │ - 42 template │ │ │ │ │ -43 auto getMPIData(T& t){ │ │ │ │ │ - 44 return MPIData(t); │ │ │ │ │ - 45 } │ │ │ │ │ - 46 │ │ │ │ │ - 47 // Default implementation for static datatypes │ │ │ │ │ - 48 template │ │ │ │ │ -49 struct MPIData │ │ │ │ │ - 50 { │ │ │ │ │ - 51 friend auto getMPIData(T&); │ │ │ │ │ - 52 protected: │ │ │ │ │ -53 T& data_; │ │ │ │ │ - 54 │ │ │ │ │ -55 MPIData(T& t) │ │ │ │ │ - 56 : data_(t) │ │ │ │ │ - 57 {} │ │ │ │ │ - 58 │ │ │ │ │ - 59 public: │ │ │ │ │ -60 void* ptr() const { │ │ │ │ │ - 61 return (void*)&data_; │ │ │ │ │ - 62 } │ │ │ │ │ - 63 │ │ │ │ │ - 64 // indicates whether the datatype can be resized │ │ │ │ │ -65 static constexpr bool static_size = true; │ │ │ │ │ - 66 │ │ │ │ │ -67 int size() const{ │ │ │ │ │ - 68 return 1; │ │ │ │ │ - 69 } │ │ │ │ │ - 70 │ │ │ │ │ -71 MPI_Datatype type() const { │ │ │ │ │ - 72 return MPITraits>::getType(); │ │ │ │ │ - 73 } │ │ │ │ │ - 74 }; │ │ │ │ │ - 75 │ │ │ │ │ - 76 // dummy implementation for void │ │ │ │ │ - 77 template<> │ │ │ │ │ -78 struct MPIData{ │ │ │ │ │ - 79 protected: │ │ │ │ │ -80 MPIData() {} │ │ │ │ │ - 81 │ │ │ │ │ - 82 public: │ │ │ │ │ -83 void* ptr(){ │ │ │ │ │ - 84 return nullptr; │ │ │ │ │ - 85 } │ │ │ │ │ -86 int size(){ │ │ │ │ │ - 87 return 0; │ │ │ │ │ - 88 } │ │ │ │ │ -89 void get(){} │ │ │ │ │ -90 MPI_Datatype type() const{ │ │ │ │ │ - 91 return MPI_INT; │ │ │ │ │ - 92 } │ │ │ │ │ - 93 }; │ │ │ │ │ - 94 │ │ │ │ │ - 95 // specializations: │ │ │ │ │ - 96 // std::vector of static sized elements or std::string │ │ │ │ │ - 97 template │ │ │ │ │ -98 struct MPIData().data()), │ │ │ │ │ - 99 decltype(std::declval().size()), │ │ │ │ │ - 100 typename std::decay_t::value_type>>>{ │ │ │ │ │ - 101 private: │ │ │ │ │ - 102 template │ │ │ │ │ - 103 using hasResizeOp = decltype(std::declval().resize(0)); │ │ │ │ │ - 104 │ │ │ │ │ - 105 protected: │ │ │ │ │ - 106 friend auto getMPIData(T&); │ │ │ │ │ -107 MPIData(T& t) │ │ │ │ │ - 108 : data_(t) │ │ │ │ │ - 109 {} │ │ │ │ │ - 110 public: │ │ │ │ │ -111 static constexpr bool static_size = std::is_const::value || !Std:: │ │ │ │ │ -is_detected_v; │ │ │ │ │ -112 void* ptr() { │ │ │ │ │ - 113 return (void*) data_.data(); │ │ │ │ │ - 114 } │ │ │ │ │ -115 int size() { │ │ │ │ │ - 116 return data_.size(); │ │ │ │ │ - 117 } │ │ │ │ │ -118 MPI_Datatype type() const{ │ │ │ │ │ - 119 return MPITraits::value_type>::getType(); │ │ │ │ │ - 120 } │ │ │ │ │ - 121 │ │ │ │ │ - 122 template │ │ │ │ │ -123 auto /*void*/ resize(int size) │ │ │ │ │ - 124 -> std::enable_if_t::value || !Std:: │ │ │ │ │ -is_detected_v> │ │ │ │ │ - 125 { │ │ │ │ │ - 126 data_.resize(size); │ │ │ │ │ - 127 } │ │ │ │ │ - 128 │ │ │ │ │ - 129 protected: │ │ │ │ │ -130 T& data_; │ │ │ │ │ - 131 }; │ │ │ │ │ - 132 │ │ │ │ │ - 133} │ │ │ │ │ - 134 │ │ │ │ │ - 139#endif │ │ │ │ │ - 140#endif │ │ │ │ │ -mpitraits.hh │ │ │ │ │ -Traits classes for mapping types onto MPI_Datatype. │ │ │ │ │ -typetraits.hh │ │ │ │ │ -Traits for type conversions and type information. │ │ │ │ │ -type_traits.hh │ │ │ │ │ -Dune::void_t │ │ │ │ │ -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 │ │ │ │ │ -std │ │ │ │ │ -STL namespace. │ │ │ │ │ + 9#warning to_unique_ptr.hh and ToUniquePtr are deprecated. Use std::unique_ptr │ │ │ │ │ +or std::shared_ptr instead. │ │ │ │ │ + 10 │ │ │ │ │ + 11#include │ │ │ │ │ + 12 │ │ │ │ │ + 13namespace Dune │ │ │ │ │ + 14{ │ │ │ │ │ + 17 template │ │ │ │ │ +18 using ToUniquePtr [[deprecated]] = std::unique_ptr; │ │ │ │ │ + 19 │ │ │ │ │ + 22 template │ │ │ │ │ +23 [[deprecated]] std::unique_ptr makeToUnique (Args&&... args) │ │ │ │ │ + 24 { │ │ │ │ │ + 25 return std::make_unique(std::forward(args)...); │ │ │ │ │ + 26 } │ │ │ │ │ + 27 │ │ │ │ │ + 28} // end namespace Dune │ │ │ │ │ + 29 │ │ │ │ │ + 30#endif // DUNE_TO_UNIQUE_PTR_HH │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::getMPIData │ │ │ │ │ -auto getMPIData(T &t) │ │ │ │ │ -Definition: mpidata.hh:43 │ │ │ │ │ -Dune::MPITraits │ │ │ │ │ -A traits class describing the mapping of types onto MPI_Datatypes. │ │ │ │ │ -Definition: mpitraits.hh:41 │ │ │ │ │ -Dune::MPIData │ │ │ │ │ -Definition: mpidata.hh:50 │ │ │ │ │ -Dune::MPIData::data_ │ │ │ │ │ -T & data_ │ │ │ │ │ -Definition: mpidata.hh:53 │ │ │ │ │ -Dune::MPIData::type │ │ │ │ │ -MPI_Datatype type() const │ │ │ │ │ -Definition: mpidata.hh:71 │ │ │ │ │ -Dune::MPIData::ptr │ │ │ │ │ -void * ptr() const │ │ │ │ │ -Definition: mpidata.hh:60 │ │ │ │ │ -Dune::MPIData::size │ │ │ │ │ -int size() const │ │ │ │ │ -Definition: mpidata.hh:67 │ │ │ │ │ -Dune::MPIData::static_size │ │ │ │ │ -static constexpr bool static_size │ │ │ │ │ -Definition: mpidata.hh:65 │ │ │ │ │ -Dune::MPIData::MPIData │ │ │ │ │ -MPIData(T &t) │ │ │ │ │ -Definition: mpidata.hh:55 │ │ │ │ │ -Dune::MPIData<_void_>::get │ │ │ │ │ -void get() │ │ │ │ │ -Definition: mpidata.hh:89 │ │ │ │ │ -Dune::MPIData<_void_>::MPIData │ │ │ │ │ -MPIData() │ │ │ │ │ -Definition: mpidata.hh:80 │ │ │ │ │ -Dune::MPIData<_void_>::size │ │ │ │ │ -int size() │ │ │ │ │ -Definition: mpidata.hh:86 │ │ │ │ │ -Dune::MPIData<_void_>::ptr │ │ │ │ │ -void * ptr() │ │ │ │ │ -Definition: mpidata.hh:83 │ │ │ │ │ -Dune::MPIData<_void_>::type │ │ │ │ │ -MPI_Datatype type() const │ │ │ │ │ -Definition: mpidata.hh:90 │ │ │ │ │ -Dune::MPIData<_T,_std::void_t<_std::tuple<_decltype(std::declval<_T_>().data │ │ │ │ │ -()),_decltype(std::declval<_T_>().size()),_typename_std::decay_t<_T_>:: │ │ │ │ │ -value_type_>_>_>::MPIData │ │ │ │ │ -MPIData(T &t) │ │ │ │ │ -Definition: mpidata.hh:107 │ │ │ │ │ -Dune::MPIData<_T,_std::void_t<_std::tuple<_decltype(std::declval<_T_>().data │ │ │ │ │ -()),_decltype(std::declval<_T_>().size()),_typename_std::decay_t<_T_>:: │ │ │ │ │ -value_type_>_>_>::ptr │ │ │ │ │ -void * ptr() │ │ │ │ │ -Definition: mpidata.hh:112 │ │ │ │ │ -Dune::MPIData<_T,_std::void_t<_std::tuple<_decltype(std::declval<_T_>().data │ │ │ │ │ -()),_decltype(std::declval<_T_>().size()),_typename_std::decay_t<_T_>:: │ │ │ │ │ -value_type_>_>_>::size │ │ │ │ │ -int size() │ │ │ │ │ -Definition: mpidata.hh:115 │ │ │ │ │ -Dune::MPIData<_T,_std::void_t<_std::tuple<_decltype(std::declval<_T_>().data │ │ │ │ │ -()),_decltype(std::declval<_T_>().size()),_typename_std::decay_t<_T_>:: │ │ │ │ │ -value_type_>_>_>::data_ │ │ │ │ │ -T & data_ │ │ │ │ │ -Definition: mpidata.hh:130 │ │ │ │ │ -Dune::MPIData<_T,_std::void_t<_std::tuple<_decltype(std::declval<_T_>().data │ │ │ │ │ -()),_decltype(std::declval<_T_>().size()),_typename_std::decay_t<_T_>:: │ │ │ │ │ -value_type_>_>_>::resize │ │ │ │ │ -auto resize(int size) -> std::enable_if_t::value||!Std:: │ │ │ │ │ -is_detected_v< hasResizeOp, S > > │ │ │ │ │ -Definition: mpidata.hh:123 │ │ │ │ │ -Dune::MPIData<_T,_std::void_t<_std::tuple<_decltype(std::declval<_T_>().data │ │ │ │ │ -()),_decltype(std::declval<_T_>().size()),_typename_std::decay_t<_T_>:: │ │ │ │ │ -value_type_>_>_>::type │ │ │ │ │ -MPI_Datatype type() const │ │ │ │ │ -Definition: mpidata.hh:118 │ │ │ │ │ +Dune::makeToUnique │ │ │ │ │ +std::unique_ptr< T > makeToUnique(Args &&... args) │ │ │ │ │ +Alias for std::make_unique introduced as transition wrapper. │ │ │ │ │ +Definition: to_unique_ptr.hh:23 │ │ │ │ │ +Dune::ToUniquePtr │ │ │ │ │ +std::unique_ptr< T > ToUniquePtr │ │ │ │ │ +Alias for std::unique_ptr introduced as transition wrapper. │ │ │ │ │ +Definition: to_unique_ptr.hh:18 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00053.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: collectivecommunication.hh File Reference │ │ │ │ +dune-common: loop.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,24 +58,680 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
collectivecommunication.hh File Reference
│ │ │ │ +
│ │ │ │ +Classes | │ │ │ │ +Namespaces | │ │ │ │ +Macros | │ │ │ │ +Functions
│ │ │ │ +
loop.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <dune/common/parallel/communication.hh>
│ │ │ │ +
#include <array>
│ │ │ │ +#include <cmath>
│ │ │ │ +#include <cstddef>
│ │ │ │ +#include <cstdlib>
│ │ │ │ +#include <ostream>
│ │ │ │ +#include <dune/common/math.hh>
│ │ │ │ +#include <dune/common/simd/simd.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Classes

class  Dune::LoopSIMD< T, S, A >
 
struct  Dune::Simd::Overloads::ScalarType< LoopSIMD< T, S, A > >
 
struct  Dune::Simd::Overloads::RebindType< U, LoopSIMD< T, S, A > >
 
struct  Dune::Simd::Overloads::LaneCount< LoopSIMD< T, S, A > >
 
struct  Dune::IsNumber< LoopSIMD< T, S, A > >
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::Simd
 Namespace for vectorization interface functions used by library developers.
 
namespace  Dune::Simd::Overloads
 Namespace for the overloads and specializations that make up a SIMD implementation.
 
namespace  Dune::MathOverloads
 namespace for customization of math functions with Dune-Semantics
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Macros

#define DUNE_PRAGMA_OMP_SIMD
 
#define DUNE_SIMD_LOOP_PREFIX_OP(SYMBOL)
 
#define DUNE_SIMD_LOOP_UNARY_OP(SYMBOL)
 
#define DUNE_SIMD_LOOP_POSTFIX_OP(SYMBOL)
 
#define DUNE_SIMD_LOOP_ASSIGNMENT_OP(SYMBOL)
 
#define DUNE_SIMD_LOOP_BINARY_OP(SYMBOL)
 
#define DUNE_SIMD_LOOP_BITSHIFT_OP(SYMBOL)
 
#define DUNE_SIMD_LOOP_COMPARISON_OP(SYMBOL)
 
#define DUNE_SIMD_LOOP_BOOLEAN_OP(SYMBOL)
 
#define DUNE_SIMD_LOOP_CMATH_UNARY_OP(expr)
 
#define DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN(expr, returnType)
 
#define DUNE_SIMD_LOOP_STD_UNARY_OP(expr)
 
#define DUNE_SIMD_LOOP_STD_BINARY_OP(expr)
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Functions

 Dune::DUNE_SIMD_LOOP_BINARY_OP (+)
 
 Dune::DUNE_SIMD_LOOP_BINARY_OP (-)
 
DUNE_SIMD_LOOP_BINARY_OP * Dune::DUNE_SIMD_LOOP_BINARY_OP (/);DUNE_SIMD_LOOP_BINARY_OP(%
 
DUNE_SIMD_LOOP_BINARY_OP & Dune::DUNE_SIMD_LOOP_BINARY_OP (|);DUNE_SIMD_LOOP_BINARY_OP(^
 
 Dune::DUNE_SIMD_LOOP_BITSHIFT_OP (<<)
 
 Dune::DUNE_SIMD_LOOP_BITSHIFT_OP (> >)
 
 Dune::DUNE_SIMD_LOOP_COMPARISON_OP (<)
 
 Dune::DUNE_SIMD_LOOP_COMPARISON_OP (<=)
 
 Dune::DUNE_SIMD_LOOP_COMPARISON_OP (>=)
 
 Dune::DUNE_SIMD_LOOP_COMPARISON_OP (!=)
 
DUNE_SIMD_LOOP_BOOLEAN_OP && Dune::DUNE_SIMD_LOOP_BOOLEAN_OP (||);template< class T, std::size_t S, std::size_t A > std::ostream &operator<<(std::ostream &os, const LoopSIMD< T, S, A > &v
 
template<class T , std::size_t S, std::size_t A>
auto Dune::Simd::Overloads::lane (ADLTag< 5 >, std::size_t l, LoopSIMD< T, S, A > &&v) -> decltype(std::move(Simd::lane(l%lanes< T >(), v[l/lanes< T >()])))
 
template<class T , std::size_t S, std::size_t A>
auto Dune::Simd::Overloads::lane (ADLTag< 5 >, std::size_t l, const LoopSIMD< T, S, A > &v) -> decltype(Simd::lane(l%lanes< T >(), v[l/lanes< T >()]))
 
template<class T , std::size_t S, std::size_t A>
auto Dune::Simd::Overloads::lane (ADLTag< 5 >, std::size_t l, LoopSIMD< T, S, A > &v) -> decltype(Simd::lane(l%lanes< T >(), v[l/lanes< T >()]))
 
template<class T , std::size_t S, std::size_t AM, std::size_t AD>
auto Dune::Simd::Overloads::cond (ADLTag< 5 >, Simd::Mask< LoopSIMD< T, S, AM > > mask, LoopSIMD< T, S, AD > ifTrue, LoopSIMD< T, S, AD > ifFalse)
 
template<class M , class T , std::size_t S, std::size_t A>
auto Dune::Simd::Overloads::cond (ADLTag< 5, std::is_same< bool, Simd::Scalar< M > >::value &&Simd::lanes< M >()==Simd::lanes< LoopSIMD< T, S, A > >()>, M mask, LoopSIMD< T, S, A > ifTrue, LoopSIMD< T, S, A > ifFalse)
 
template<class M , std::size_t S, std::size_t A>
bool Dune::Simd::Overloads::anyTrue (ADLTag< 5 >, LoopSIMD< M, S, A > mask)
 
template<class M , std::size_t S, std::size_t A>
bool Dune::Simd::Overloads::allTrue (ADLTag< 5 >, LoopSIMD< M, S, A > mask)
 
template<class M , std::size_t S, std::size_t A>
bool Dune::Simd::Overloads::anyFalse (ADLTag< 5 >, LoopSIMD< M, S, A > mask)
 
template<class M , std::size_t S, std::size_t A>
bool Dune::Simd::Overloads::allFalse (ADLTag< 5 >, LoopSIMD< M, S, A > mask)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (cos)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (sin)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (tan)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (acos)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (asin)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (atan)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (cosh)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (sinh)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (tanh)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (acosh)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (asinh)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (atanh)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (exp)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (log)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (log10)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (exp2)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (expm1)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN (ilogb, int)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (log1p)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (log2)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (logb)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (sqrt)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (cbrt)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (erf)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (erfc)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (tgamma)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (lgamma)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (ceil)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (floor)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (trunc)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (round)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN (lround, long)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN (llround, long long)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (rint)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN (lrint, long)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN (llrint, long long)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (nearbyint)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (fabs)
 
 Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (abs)
 
 Dune::DUNE_SIMD_LOOP_STD_UNARY_OP (real)
 
 Dune::DUNE_SIMD_LOOP_STD_UNARY_OP (imag)
 
 Dune::DUNE_SIMD_LOOP_STD_BINARY_OP (max)
 
 Dune::DUNE_SIMD_LOOP_STD_BINARY_OP (min)
 
template<class T , std::size_t S, std::size_t A>
auto Dune::MathOverloads::isNaN (const LoopSIMD< T, S, A > &v, PriorityTag< 3 >, ADLTag)
 
template<class T , std::size_t S, std::size_t A>
auto Dune::MathOverloads::isInf (const LoopSIMD< T, S, A > &v, PriorityTag< 3 >, ADLTag)
 
template<class T , std::size_t S, std::size_t A>
auto Dune::MathOverloads::isFinite (const LoopSIMD< T, S, A > &v, PriorityTag< 3 >, ADLTag)
 
│ │ │ │ +

Macro Definition Documentation

│ │ │ │ + │ │ │ │ +

◆ DUNE_PRAGMA_OMP_SIMD

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_PRAGMA_OMP_SIMD
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_LOOP_ASSIGNMENT_OP

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_LOOP_ASSIGNMENT_OP( SYMBOL)
│ │ │ │ +
│ │ │ │ +Value:
auto operator SYMBOL(const Simd::Scalar<T> s) { \
│ │ │ │ +
DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
(*this)[i] SYMBOL s; \
│ │ │ │ +
} \
│ │ │ │ +
return *this; \
│ │ │ │ +
} \
│ │ │ │ +
\
│ │ │ │ +
auto operator SYMBOL(const LoopSIMD<T,S,A> &v) { \
│ │ │ │ +
DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
(*this)[i] SYMBOL v[i]; \
│ │ │ │ +
} \
│ │ │ │ +
return *this; \
│ │ │ │ +
} \
│ │ │ │ +
static_assert(true, "expecting ;")
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_LOOP_BINARY_OP

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_LOOP_BINARY_OP( SYMBOL)
│ │ │ │ +
│ │ │ │ +Value:
template<class T, std::size_t S, std::size_t A> \
│ │ │ │ +
auto operator SYMBOL(const LoopSIMD<T,S,A> &v, const Simd::Scalar<T> s) { \
│ │ │ │ +
LoopSIMD<T,S,A> out; \
│ │ │ │ +
DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
out[i] = v[i] SYMBOL s; \
│ │ │ │ +
} \
│ │ │ │ +
return out; \
│ │ │ │ +
} \
│ │ │ │ +
template<class T, std::size_t S, std::size_t A> \
│ │ │ │ +
auto operator SYMBOL(const Simd::Scalar<T> s, const LoopSIMD<T,S,A> &v) { \
│ │ │ │ +
LoopSIMD<T,S,A> out; \
│ │ │ │ +
DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
out[i] = s SYMBOL v[i]; \
│ │ │ │ +
} \
│ │ │ │ +
return out; \
│ │ │ │ +
} \
│ │ │ │ +
template<class T, std::size_t S, std::size_t A> \
│ │ │ │ +
auto operator SYMBOL(const LoopSIMD<T,S,A> &v, \
│ │ │ │ +
const LoopSIMD<T,S,A> &w) { \
│ │ │ │ +
LoopSIMD<T,S,A> out; \
│ │ │ │ +
DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
out[i] = v[i] SYMBOL w[i]; \
│ │ │ │ +
} \
│ │ │ │ +
return out; \
│ │ │ │ +
} \
│ │ │ │ +
static_assert(true, "expecting ;")
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_LOOP_BITSHIFT_OP

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_LOOP_BITSHIFT_OP( SYMBOL)
│ │ │ │ +
│ │ │ │ +Value:
template<class T, std::size_t S, std::size_t A, class U> \
│ │ │ │ +
auto operator SYMBOL(const LoopSIMD<T,S,A> &v, const U s) { \
│ │ │ │ +
LoopSIMD<T,S,A> out; \
│ │ │ │ +
DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
out[i] = v[i] SYMBOL s; \
│ │ │ │ +
} \
│ │ │ │ +
return out; \
│ │ │ │ +
} \
│ │ │ │ +
template<class T, std::size_t S, std::size_t A, class U, std::size_t AU> \
│ │ │ │ +
auto operator SYMBOL(const LoopSIMD<T,S,A> &v, \
│ │ │ │ +
const LoopSIMD<U,S,AU> &w) { \
│ │ │ │ +
LoopSIMD<T,S,A> out; \
│ │ │ │ +
DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
out[i] = v[i] SYMBOL w[i]; \
│ │ │ │ +
} \
│ │ │ │ +
return out; \
│ │ │ │ +
} \
│ │ │ │ +
static_assert(true, "expecting ;")
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_LOOP_BOOLEAN_OP

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_LOOP_BOOLEAN_OP( SYMBOL)
│ │ │ │ +
│ │ │ │ +Value:
template<class T, std::size_t S, std::size_t A> \
│ │ │ │ +
auto operator SYMBOL(const LoopSIMD<T,S,A> &v, const Simd::Scalar<T> s) { \
│ │ │ │ +
Simd::Mask<LoopSIMD<T,S,A>> out; \
│ │ │ │ +
DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
out[i] = v[i] SYMBOL s; \
│ │ │ │ +
} \
│ │ │ │ +
return out; \
│ │ │ │ +
} \
│ │ │ │ +
template<class T, std::size_t S, std::size_t A> \
│ │ │ │ +
auto operator SYMBOL(const Simd::Mask<T> s, const LoopSIMD<T,S,A> &v) { \
│ │ │ │ +
Simd::Mask<LoopSIMD<T,S,A>> out; \
│ │ │ │ +
DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
out[i] = s SYMBOL v[i]; \
│ │ │ │ +
} \
│ │ │ │ +
return out; \
│ │ │ │ +
} \
│ │ │ │ +
template<class T, std::size_t S, std::size_t A> \
│ │ │ │ +
auto operator SYMBOL(const LoopSIMD<T,S,A> &v, \
│ │ │ │ +
const LoopSIMD<T,S,A> &w) { \
│ │ │ │ +
Simd::Mask<LoopSIMD<T,S,A>> out; \
│ │ │ │ +
DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
out[i] = v[i] SYMBOL w[i]; \
│ │ │ │ +
} \
│ │ │ │ +
return out; \
│ │ │ │ +
} \
│ │ │ │ +
static_assert(true, "expecting ;")
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_LOOP_CMATH_UNARY_OP

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_LOOP_CMATH_UNARY_OP( expr)
│ │ │ │ +
│ │ │ │ +Value:
template<class T, std::size_t S, std::size_t A, typename Sfinae = \
│ │ │ │ +
typename std::enable_if_t<!std::is_integral<Simd::Scalar<T>>::value> > \
│ │ │ │ +
auto expr(const LoopSIMD<T,S,A> &v) { \
│ │ │ │ +
using std::expr; \
│ │ │ │ +
LoopSIMD<T,S,A> out; \
│ │ │ │ +
for(std::size_t i=0; i<S; i++) { \
│ │ │ │ +
out[i] = expr(v[i]); \
│ │ │ │ +
} \
│ │ │ │ +
return out; \
│ │ │ │ +
} \
│ │ │ │ +
static_assert(true, "expecting ;")
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN( expr,
 returnType 
)
│ │ │ │ +
│ │ │ │ +Value:
template<class T, std::size_t S, std::size_t A, typename Sfinae = \
│ │ │ │ +
typename std::enable_if_t<!std::is_integral<Simd::Scalar<T>>::value> > \
│ │ │ │ +
auto expr(const LoopSIMD<T,S,A> &v) { \
│ │ │ │ +
using std::expr; \
│ │ │ │ +
LoopSIMD<returnType,S> out; \
│ │ │ │ +
for(std::size_t i=0; i<S; i++) { \
│ │ │ │ +
out[i] = expr(v[i]); \
│ │ │ │ +
} \
│ │ │ │ +
return out; \
│ │ │ │ +
} \
│ │ │ │ +
static_assert(true, "expecting ;")
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_LOOP_COMPARISON_OP

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_LOOP_COMPARISON_OP( SYMBOL)
│ │ │ │ +
│ │ │ │ +Value:
template<class T, std::size_t S, std::size_t A, class U> \
│ │ │ │ +
auto operator SYMBOL(const LoopSIMD<T,S,A> &v, const U s) { \
│ │ │ │ +
Simd::Mask<LoopSIMD<T,S,A>> out; \
│ │ │ │ +
DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
out[i] = v[i] SYMBOL s; \
│ │ │ │ +
} \
│ │ │ │ +
return out; \
│ │ │ │ +
} \
│ │ │ │ +
template<class T, std::size_t S, std::size_t A> \
│ │ │ │ +
auto operator SYMBOL(const Simd::Scalar<T> s, const LoopSIMD<T,S,A> &v) { \
│ │ │ │ +
Simd::Mask<LoopSIMD<T,S,A>> out; \
│ │ │ │ +
DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
out[i] = s SYMBOL v[i]; \
│ │ │ │ +
} \
│ │ │ │ +
return out; \
│ │ │ │ +
} \
│ │ │ │ +
template<class T, std::size_t S, std::size_t A> \
│ │ │ │ +
auto operator SYMBOL(const LoopSIMD<T,S,A> &v, \
│ │ │ │ +
const LoopSIMD<T,S,A> &w) { \
│ │ │ │ +
Simd::Mask<LoopSIMD<T,S,A>> out; \
│ │ │ │ +
DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
out[i] = v[i] SYMBOL w[i]; \
│ │ │ │ +
} \
│ │ │ │ +
return out; \
│ │ │ │ +
} \
│ │ │ │ +
static_assert(true, "expecting ;")
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_LOOP_POSTFIX_OP

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_LOOP_POSTFIX_OP( SYMBOL)
│ │ │ │ +
│ │ │ │ +Value:
auto operator SYMBOL(int){ \
│ │ │ │ +
LoopSIMD<T,S,A> out = *this; \
│ │ │ │ +
SYMBOL(*this); \
│ │ │ │ +
return out; \
│ │ │ │ +
} \
│ │ │ │ +
static_assert(true, "expecting ;")
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_LOOP_PREFIX_OP

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_LOOP_PREFIX_OP( SYMBOL)
│ │ │ │ +
│ │ │ │ +Value:
auto operator SYMBOL() { \
│ │ │ │ +
DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
SYMBOL(*this)[i]; \
│ │ │ │ +
} \
│ │ │ │ +
return *this; \
│ │ │ │ +
} \
│ │ │ │ +
static_assert(true, "expecting ;")
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_LOOP_STD_BINARY_OP

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_LOOP_STD_BINARY_OP( expr)
│ │ │ │ +
│ │ │ │ +Value:
template<class T, std::size_t S, std::size_t A> \
│ │ │ │ +
auto expr(const LoopSIMD<T,S,A> &v, const LoopSIMD<T,S,A> &w) { \
│ │ │ │ +
using std::expr; \
│ │ │ │ +
LoopSIMD<T,S,A> out; \
│ │ │ │ +
for(std::size_t i=0; i<S; i++) { \
│ │ │ │ +
out[i] = expr(v[i],w[i]); \
│ │ │ │ +
} \
│ │ │ │ +
return out; \
│ │ │ │ +
} \
│ │ │ │ +
static_assert(true, "expecting ;")
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_LOOP_STD_UNARY_OP

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_LOOP_STD_UNARY_OP( expr)
│ │ │ │ +
│ │ │ │ +Value:
template<class T, std::size_t S, std::size_t A> \
│ │ │ │ +
auto expr(const LoopSIMD<T,S,A> &v) { \
│ │ │ │ +
using std::expr; \
│ │ │ │ +
LoopSIMD<T,S,A> out; \
│ │ │ │ +
for(std::size_t i=0; i<S; i++) { \
│ │ │ │ +
out[i] = expr(v[i]); \
│ │ │ │ +
} \
│ │ │ │ +
return out; \
│ │ │ │ +
} \
│ │ │ │ +
\
│ │ │ │ +
template<class T, std::size_t S, std::size_t A> \
│ │ │ │ +
auto expr(const LoopSIMD<std::complex<T>,S,A> &v) { \
│ │ │ │ +
using std::expr; \
│ │ │ │ +
LoopSIMD<T,S,A> out; \
│ │ │ │ +
for(std::size_t i=0; i<S; i++) { \
│ │ │ │ +
out[i] = expr(v[i]); \
│ │ │ │ +
} \
│ │ │ │ +
return out; \
│ │ │ │ +
} \
│ │ │ │ +
static_assert(true, "expecting ;")
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_LOOP_UNARY_OP

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_LOOP_UNARY_OP( SYMBOL)
│ │ │ │ +
│ │ │ │ +Value:
auto operator SYMBOL() const { \
│ │ │ │ +
LoopSIMD<T,S,A> out; \
│ │ │ │ +
DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
out[i] = SYMBOL((*this)[i]); \
│ │ │ │ +
} \
│ │ │ │ +
return out; \
│ │ │ │ +
} \
│ │ │ │ +
static_assert(true, "expecting ;")
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,14 +4,490 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -collectivecommunication.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ + * simd │ │ │ │ │ +Classes | Namespaces | Macros | Functions │ │ │ │ │ +loop.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ + Classes │ │ │ │ │ + class  Dune::LoopSIMD<_T,_S,_A_> │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Simd::Overloads::ScalarType<_LoopSIMD<_T,_S,_A_>_> │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Simd::Overloads::RebindType<_U,_LoopSIMD<_T,_S,_A_>_> │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Simd::Overloads::LaneCount<_LoopSIMD<_T,_S,_A_>_> │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::IsNumber<_LoopSIMD<_T,_S,_A_>_> │ │ │ │ │ +  │ │ │ │ │ + Namespaces │ │ │ │ │ +namespace  Dune │ │ │ │ │ +  Dune namespace. │ │ │ │ │ +  │ │ │ │ │ +namespace  Dune::Simd │ │ │ │ │ +  Namespace for vectorization interface functions used by library │ │ │ │ │ + developers. │ │ │ │ │ +  │ │ │ │ │ +namespace  Dune::Simd::Overloads │ │ │ │ │ +  Namespace for the overloads and specializations that make up a SIMD │ │ │ │ │ + implementation. │ │ │ │ │ +  │ │ │ │ │ +namespace  Dune::MathOverloads │ │ │ │ │ +  namespace for customization of math functions with Dune-Semantics │ │ │ │ │ +  │ │ │ │ │ + Macros │ │ │ │ │ +#define DUNE_PRAGMA_OMP_SIMD │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_SIMD_LOOP_PREFIX_OP(SYMBOL) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_SIMD_LOOP_UNARY_OP(SYMBOL) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_SIMD_LOOP_POSTFIX_OP(SYMBOL) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_SIMD_LOOP_ASSIGNMENT_OP(SYMBOL) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_SIMD_LOOP_BINARY_OP(SYMBOL) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_SIMD_LOOP_BITSHIFT_OP(SYMBOL) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_SIMD_LOOP_COMPARISON_OP(SYMBOL) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_SIMD_LOOP_BOOLEAN_OP(SYMBOL) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_SIMD_LOOP_CMATH_UNARY_OP(expr) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN(expr, returnType) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_SIMD_LOOP_STD_UNARY_OP(expr) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_SIMD_LOOP_STD_BINARY_OP(expr) │ │ │ │ │ +  │ │ │ │ │ + Functions │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_BINARY_OP (+) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_BINARY_OP (-) │ │ │ │ │ +  │ │ │ │ │ + DUNE_SIMD_LOOP_BINARY_OP * Dune::DUNE_SIMD_LOOP_BINARY_OP (/ │ │ │ │ │ + );DUNE_SIMD_LOOP_BINARY_OP(% │ │ │ │ │ +  │ │ │ │ │ + DUNE_SIMD_LOOP_BINARY_OP & Dune::DUNE_SIMD_LOOP_BINARY_OP │ │ │ │ │ + (|);DUNE_SIMD_LOOP_BINARY_OP(^ │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_BITSHIFT_OP (<<) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_BITSHIFT_OP (> >) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_COMPARISON_OP (<) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_COMPARISON_OP (<=) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_COMPARISON_OP (>=) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_COMPARISON_OP (!=) │ │ │ │ │ +  │ │ │ │ │ +DUNE_SIMD_LOOP_BOOLEAN_OP && Dune::DUNE_SIMD_LOOP_BOOLEAN_OP (||);template< │ │ │ │ │ + class T, std::size_t S, std::size_t A > std:: │ │ │ │ │ + ostream &operator<<(std::ostream &os, const │ │ │ │ │ + LoopSIMD< T, S, A > &v │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::Simd::Overloads::lane (ADLTag< 5 >, std:: │ │ │ │ │ + size_t l, LoopSIMD< T, S, A > &&v) -> decltype │ │ │ │ │ + (std::move(Simd::lane(l%lanes< T >(), v[l/lanes< │ │ │ │ │ + T >()]))) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::Simd::Overloads::lane (ADLTag< 5 >, std:: │ │ │ │ │ + size_t l, const LoopSIMD< T, S, A > &v) - │ │ │ │ │ + > decltype(Simd::lane(l%lanes< T >(), v[l/lanes< │ │ │ │ │ + T >()])) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::Simd::Overloads::lane (ADLTag< 5 >, std:: │ │ │ │ │ + size_t l, LoopSIMD< T, S, A > &v) -> decltype │ │ │ │ │ + (Simd::lane(l%lanes< T >(), v[l/lanes< T >()])) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::Simd::Overloads::cond (ADLTag< 5 >, Simd:: │ │ │ │ │ + Mask< LoopSIMD< T, S, AM > > mask, LoopSIMD< T, │ │ │ │ │ + S, AD > ifTrue, LoopSIMD< T, S, AD > ifFalse) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::Simd::Overloads::cond (ADLTag< 5, std:: │ │ │ │ │ + is_same< bool, Simd::Scalar< M > >::value │ │ │ │ │ + &&Simd::lanes< M >()==Simd::lanes< LoopSIMD< T, │ │ │ │ │ + S, A > >()>, M mask, LoopSIMD< T, S, A > ifTrue, │ │ │ │ │ + LoopSIMD< T, S, A > ifFalse) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + bool Dune::Simd::Overloads::anyTrue (ADLTag< 5 >, │ │ │ │ │ + LoopSIMD< M, S, A > mask) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + bool Dune::Simd::Overloads::allTrue (ADLTag< 5 >, │ │ │ │ │ + LoopSIMD< M, S, A > mask) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + bool Dune::Simd::Overloads::anyFalse (ADLTag< 5 >, │ │ │ │ │ + LoopSIMD< M, S, A > mask) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + bool Dune::Simd::Overloads::allFalse (ADLTag< 5 >, │ │ │ │ │ + LoopSIMD< M, S, A > mask) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (cos) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (sin) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (tan) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (acos) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (asin) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (atan) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (cosh) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (sinh) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (tanh) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (acosh) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (asinh) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (atanh) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (exp) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (log) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (log10) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (exp2) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (expm1) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN │ │ │ │ │ + (ilogb, int) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (log1p) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (log2) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (logb) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (sqrt) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (cbrt) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (erf) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (erfc) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (tgamma) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (lgamma) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (ceil) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (floor) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (trunc) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (round) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN │ │ │ │ │ + (lround, long) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN │ │ │ │ │ + (llround, long long) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (rint) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN │ │ │ │ │ + (lrint, long) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN │ │ │ │ │ + (llrint, long long) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (nearbyint) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (fabs) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP (abs) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_STD_UNARY_OP (real) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_STD_UNARY_OP (imag) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_STD_BINARY_OP (max) │ │ │ │ │ +  │ │ │ │ │ +  Dune::DUNE_SIMD_LOOP_STD_BINARY_OP (min) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::MathOverloads::isNaN (const LoopSIMD< T, S, │ │ │ │ │ + A > &v, PriorityTag< 3 >, ADLTag) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::MathOverloads::isInf (const LoopSIMD< T, S, │ │ │ │ │ + A > &v, PriorityTag< 3 >, ADLTag) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::MathOverloads::isFinite (const LoopSIMD< T, │ │ │ │ │ + S, A > &v, PriorityTag< 3 >, ADLTag) │ │ │ │ │ +  │ │ │ │ │ +***** Macro Definition Documentation ***** │ │ │ │ │ +***** ◆ DUNE_PRAGMA_OMP_SIMD ***** │ │ │ │ │ +#define DUNE_PRAGMA_OMP_SIMD │ │ │ │ │ +***** ◆ DUNE_SIMD_LOOP_ASSIGNMENT_OP ***** │ │ │ │ │ +#define DUNE_SIMD_LOOP_ASSIGNMENT_OP (  SYMBOL ) │ │ │ │ │ +Value: │ │ │ │ │ +auto operator SYMBOL(const Simd::Scalar s) { \ │ │ │ │ │ +DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ +for(std::size_t i=0; i &v) { \ │ │ │ │ │ +DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ +for(std::size_t i=0; i \ │ │ │ │ │ +auto operator SYMBOL(const LoopSIMD &v, const Simd::Scalar s) { \ │ │ │ │ │ +LoopSIMD out; \ │ │ │ │ │ +DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ +for(std::size_t i=0; i \ │ │ │ │ │ +auto operator SYMBOL(const Simd::Scalar s, const LoopSIMD &v) { \ │ │ │ │ │ +LoopSIMD out; \ │ │ │ │ │ +DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ +for(std::size_t i=0; i \ │ │ │ │ │ +auto operator SYMBOL(const LoopSIMD &v, \ │ │ │ │ │ +const LoopSIMD &w) { \ │ │ │ │ │ +LoopSIMD out; \ │ │ │ │ │ +DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ +for(std::size_t i=0; i \ │ │ │ │ │ +auto operator SYMBOL(const LoopSIMD &v, const U s) { \ │ │ │ │ │ +LoopSIMD out; \ │ │ │ │ │ +DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ +for(std::size_t i=0; i \ │ │ │ │ │ +auto operator SYMBOL(const LoopSIMD &v, \ │ │ │ │ │ +const LoopSIMD &w) { \ │ │ │ │ │ +LoopSIMD out; \ │ │ │ │ │ +DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ +for(std::size_t i=0; i \ │ │ │ │ │ +auto operator SYMBOL(const LoopSIMD &v, const Simd::Scalar s) { \ │ │ │ │ │ +Simd::Mask> out; \ │ │ │ │ │ +DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ +for(std::size_t i=0; i \ │ │ │ │ │ +auto operator SYMBOL(const Simd::Mask s, const LoopSIMD &v) { \ │ │ │ │ │ +Simd::Mask> out; \ │ │ │ │ │ +DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ +for(std::size_t i=0; i \ │ │ │ │ │ +auto operator SYMBOL(const LoopSIMD &v, \ │ │ │ │ │ +const LoopSIMD &w) { \ │ │ │ │ │ +Simd::Mask> out; \ │ │ │ │ │ +DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ +for(std::size_t i=0; i>::value> > \ │ │ │ │ │ +auto expr(const LoopSIMD &v) { \ │ │ │ │ │ +using std::expr; \ │ │ │ │ │ +LoopSIMD out; \ │ │ │ │ │ +for(std::size_t i=0; i>::value> > \ │ │ │ │ │ +auto expr(const LoopSIMD &v) { \ │ │ │ │ │ +using std::expr; \ │ │ │ │ │ +LoopSIMD out; \ │ │ │ │ │ +for(std::size_t i=0; i \ │ │ │ │ │ +auto operator SYMBOL(const LoopSIMD &v, const U s) { \ │ │ │ │ │ +Simd::Mask> out; \ │ │ │ │ │ +DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ +for(std::size_t i=0; i \ │ │ │ │ │ +auto operator SYMBOL(const Simd::Scalar s, const LoopSIMD &v) { \ │ │ │ │ │ +Simd::Mask> out; \ │ │ │ │ │ +DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ +for(std::size_t i=0; i \ │ │ │ │ │ +auto operator SYMBOL(const LoopSIMD &v, \ │ │ │ │ │ +const LoopSIMD &w) { \ │ │ │ │ │ +Simd::Mask> out; \ │ │ │ │ │ +DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ +for(std::size_t i=0; i out = *this; \ │ │ │ │ │ +SYMBOL(*this); \ │ │ │ │ │ +return out; \ │ │ │ │ │ +} \ │ │ │ │ │ +static_assert(true, "expecting ;") │ │ │ │ │ +***** ◆ DUNE_SIMD_LOOP_PREFIX_OP ***** │ │ │ │ │ +#define DUNE_SIMD_LOOP_PREFIX_OP (  SYMBOL ) │ │ │ │ │ +Value: │ │ │ │ │ +auto operator SYMBOL() { \ │ │ │ │ │ +DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ +for(std::size_t i=0; i \ │ │ │ │ │ +auto expr(const LoopSIMD &v, const LoopSIMD &w) { \ │ │ │ │ │ +using std::expr; \ │ │ │ │ │ +LoopSIMD out; \ │ │ │ │ │ +for(std::size_t i=0; i \ │ │ │ │ │ +auto expr(const LoopSIMD &v) { \ │ │ │ │ │ +using std::expr; \ │ │ │ │ │ +LoopSIMD out; \ │ │ │ │ │ +for(std::size_t i=0; i \ │ │ │ │ │ +auto expr(const LoopSIMD,S,A> &v) { \ │ │ │ │ │ +using std::expr; \ │ │ │ │ │ +LoopSIMD out; \ │ │ │ │ │ +for(std::size_t i=0; i out; \ │ │ │ │ │ +DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ +for(std::size_t i=0; i │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: collectivecommunication.hh Source File │ │ │ │ +dune-common: loop.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,27 +58,705 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
collectivecommunication.hh
│ │ │ │ +
loop.hh
│ │ │ │
│ │ │ │
│ │ │ │ Go to the documentation of this file.
1// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ -
3// Will be removed after the 2.7 release
│ │ │ │ -
4#warning "Deprecated header, use #include <dune/common/parallel/communication.hh> instead!"
│ │ │ │ - │ │ │ │ -
Implements an utility class that provides collective communication methods for sequential programs.
│ │ │ │ +
3#ifndef DUNE_COMMON_SIMD_LOOP_HH
│ │ │ │ +
4#define DUNE_COMMON_SIMD_LOOP_HH
│ │ │ │ +
5
│ │ │ │ +
6#include <array>
│ │ │ │ +
7#include <cmath>
│ │ │ │ +
8#include <cstddef>
│ │ │ │ +
9#include <cstdlib>
│ │ │ │ +
10#include <ostream>
│ │ │ │ +
11
│ │ │ │ +
12#include <dune/common/math.hh>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
15
│ │ │ │ +
16namespace Dune {
│ │ │ │ +
17
│ │ │ │ +
18
│ │ │ │ +
19/*
│ │ │ │ +
20 * silence warnings from GCC about using integer operands on a bool
│ │ │ │ +
21 * (when instantiated for T=bool)
│ │ │ │ +
22 */
│ │ │ │ +
23#if __GNUC__ >= 7
│ │ │ │ +
24# pragma GCC diagnostic push
│ │ │ │ +
25# pragma GCC diagnostic ignored "-Wbool-operation"
│ │ │ │ +
26# pragma GCC diagnostic ignored "-Wint-in-bool-context"
│ │ │ │ +
27# define GCC_WARNING_DISABLED
│ │ │ │ +
28#endif
│ │ │ │ +
29
│ │ │ │ +
30/*
│ │ │ │ +
31 * silence warnings from Clang about using bitwise operands on
│ │ │ │ +
32 * a bool (when instantiated for T=bool)
│ │ │ │ +
33 */
│ │ │ │ +
34#ifdef __clang__
│ │ │ │ +
35#if __has_warning("-Wbitwise-instead-of-logical")
│ │ │ │ +
36# pragma clang diagnostic push
│ │ │ │ +
37# pragma clang diagnostic ignored "-Wbitwise-instead-of-logical"
│ │ │ │ +
38# define CLANG_WARNING_DISABLED
│ │ │ │ +
39#endif
│ │ │ │ +
40#endif
│ │ │ │ +
41
│ │ │ │ +
42/*
│ │ │ │ +
43 * Introduce a simd pragma if OpenMP is available in standard version >= 4
│ │ │ │ +
44 */
│ │ │ │ +
45#if _OPENMP >= 201307
│ │ │ │ +
46 #define DUNE_PRAGMA_OMP_SIMD _Pragma("omp simd")
│ │ │ │ +
47#else
│ │ │ │ +
48 #define DUNE_PRAGMA_OMP_SIMD
│ │ │ │ +
49#endif
│ │ │ │ +
50
│ │ │ │ +
51
│ │ │ │ +
63 template<class T, std::size_t S, std::size_t A = 0>
│ │ │ │ +
64 class alignas(A==0?alignof(T):A) LoopSIMD : public std::array<T,S> {
│ │ │ │ +
65
│ │ │ │ +
66 public:
│ │ │ │ +
67
│ │ │ │ +
68 //default constructor
│ │ │ │ + │ │ │ │ +
70 assert(reinterpret_cast<uintptr_t>(this) % std::min(alignof(LoopSIMD<T,S,A>),alignof(std::max_align_t)) == 0);
│ │ │ │ +
71 }
│ │ │ │ +
72
│ │ │ │ +
73 // broadcast constructor initializing the content with a given value
│ │ │ │ + │ │ │ │ +
75 this->fill(i);
│ │ │ │ +
76 }
│ │ │ │ +
77
│ │ │ │ +
78 template<std::size_t OA>
│ │ │ │ +
79 explicit LoopSIMD(const LoopSIMD<T,S,OA>& other)
│ │ │ │ +
80 : std::array<T,S>(other)
│ │ │ │ +
81 {
│ │ │ │ +
82 assert(reinterpret_cast<uintptr_t>(this) % std::min(alignof(LoopSIMD<T,S,A>),alignof(std::max_align_t)) == 0);
│ │ │ │ +
83 }
│ │ │ │ +
84
│ │ │ │ +
85 /*
│ │ │ │ +
86 * Definition of basic operators
│ │ │ │ +
87 */
│ │ │ │ +
88
│ │ │ │ +
89 //Prefix operators
│ │ │ │ +
90#define DUNE_SIMD_LOOP_PREFIX_OP(SYMBOL) \
│ │ │ │ +
91 auto operator SYMBOL() { \
│ │ │ │ +
92 DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
93 for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
94 SYMBOL(*this)[i]; \
│ │ │ │ +
95 } \
│ │ │ │ +
96 return *this; \
│ │ │ │ +
97 } \
│ │ │ │ +
98 static_assert(true, "expecting ;")
│ │ │ │ +
99
│ │ │ │ + │ │ │ │ + │ │ │ │ +
102#undef DUNE_SIMD_LOOP_PREFIX_OP
│ │ │ │ +
103
│ │ │ │ +
104 //Unary operators
│ │ │ │ +
105#define DUNE_SIMD_LOOP_UNARY_OP(SYMBOL) \
│ │ │ │ +
106 auto operator SYMBOL() const { \
│ │ │ │ +
107 LoopSIMD<T,S,A> out; \
│ │ │ │ +
108 DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
109 for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
110 out[i] = SYMBOL((*this)[i]); \
│ │ │ │ +
111 } \
│ │ │ │ +
112 return out; \
│ │ │ │ +
113 } \
│ │ │ │ +
114 static_assert(true, "expecting ;")
│ │ │ │ +
115
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
119
│ │ │ │ +
120 auto operator!() const {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
123 for(std::size_t i=0; i<S; i++){
│ │ │ │ +
124 out[i] = !((*this)[i]);
│ │ │ │ +
125 }
│ │ │ │ +
126 return out;
│ │ │ │ +
127 }
│ │ │ │ +
128#undef DUNE_SIMD_LOOP_UNARY_OP
│ │ │ │ +
129
│ │ │ │ +
130 //Postfix operators
│ │ │ │ +
131#define DUNE_SIMD_LOOP_POSTFIX_OP(SYMBOL) \
│ │ │ │ +
132 auto operator SYMBOL(int){ \
│ │ │ │ +
133 LoopSIMD<T,S,A> out = *this; \
│ │ │ │ +
134 SYMBOL(*this); \
│ │ │ │ +
135 return out; \
│ │ │ │ +
136 } \
│ │ │ │ +
137 static_assert(true, "expecting ;")
│ │ │ │ +
138
│ │ │ │ + │ │ │ │ + │ │ │ │ +
141#undef DUNE_SIMD_LOOP_POSTFIX_OP
│ │ │ │ +
142
│ │ │ │ +
143 //Assignment operators
│ │ │ │ +
144#define DUNE_SIMD_LOOP_ASSIGNMENT_OP(SYMBOL) \
│ │ │ │ +
145 auto operator SYMBOL(const Simd::Scalar<T> s) { \
│ │ │ │ +
146 DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
147 for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
148 (*this)[i] SYMBOL s; \
│ │ │ │ +
149 } \
│ │ │ │ +
150 return *this; \
│ │ │ │ +
151 } \
│ │ │ │ +
152 \
│ │ │ │ +
153 auto operator SYMBOL(const LoopSIMD<T,S,A> &v) { \
│ │ │ │ +
154 DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
155 for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
156 (*this)[i] SYMBOL v[i]; \
│ │ │ │ +
157 } \
│ │ │ │ +
158 return *this; \
│ │ │ │ +
159 } \
│ │ │ │ +
160 static_assert(true, "expecting ;")
│ │ │ │ +
161
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
172#undef DUNE_SIMD_LOOP_ASSIGNMENT_OP
│ │ │ │ +
173 };
│ │ │ │ +
174
│ │ │ │ +
175 //Arithmetic operators
│ │ │ │ +
176#define DUNE_SIMD_LOOP_BINARY_OP(SYMBOL) \
│ │ │ │ +
177 template<class T, std::size_t S, std::size_t A> \
│ │ │ │ +
178 auto operator SYMBOL(const LoopSIMD<T,S,A> &v, const Simd::Scalar<T> s) { \
│ │ │ │ +
179 LoopSIMD<T,S,A> out; \
│ │ │ │ +
180 DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
181 for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
182 out[i] = v[i] SYMBOL s; \
│ │ │ │ +
183 } \
│ │ │ │ +
184 return out; \
│ │ │ │ +
185 } \
│ │ │ │ +
186 template<class T, std::size_t S, std::size_t A> \
│ │ │ │ +
187 auto operator SYMBOL(const Simd::Scalar<T> s, const LoopSIMD<T,S,A> &v) { \
│ │ │ │ +
188 LoopSIMD<T,S,A> out; \
│ │ │ │ +
189 DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
190 for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
191 out[i] = s SYMBOL v[i]; \
│ │ │ │ +
192 } \
│ │ │ │ +
193 return out; \
│ │ │ │ +
194 } \
│ │ │ │ +
195 template<class T, std::size_t S, std::size_t A> \
│ │ │ │ +
196 auto operator SYMBOL(const LoopSIMD<T,S,A> &v, \
│ │ │ │ +
197 const LoopSIMD<T,S,A> &w) { \
│ │ │ │ +
198 LoopSIMD<T,S,A> out; \
│ │ │ │ +
199 DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
200 for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
201 out[i] = v[i] SYMBOL w[i]; \
│ │ │ │ +
202 } \
│ │ │ │ +
203 return out; \
│ │ │ │ +
204 } \
│ │ │ │ +
205 static_assert(true, "expecting ;")
│ │ │ │ +
206
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
212
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
216
│ │ │ │ +
217#undef DUNE_SIMD_LOOP_BINARY_OP
│ │ │ │ +
218
│ │ │ │ +
219 //Bitshift operators
│ │ │ │ +
220#define DUNE_SIMD_LOOP_BITSHIFT_OP(SYMBOL) \
│ │ │ │ +
221 template<class T, std::size_t S, std::size_t A, class U> \
│ │ │ │ +
222 auto operator SYMBOL(const LoopSIMD<T,S,A> &v, const U s) { \
│ │ │ │ +
223 LoopSIMD<T,S,A> out; \
│ │ │ │ +
224 DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
225 for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
226 out[i] = v[i] SYMBOL s; \
│ │ │ │ +
227 } \
│ │ │ │ +
228 return out; \
│ │ │ │ +
229 } \
│ │ │ │ +
230 template<class T, std::size_t S, std::size_t A, class U, std::size_t AU> \
│ │ │ │ +
231 auto operator SYMBOL(const LoopSIMD<T,S,A> &v, \
│ │ │ │ +
232 const LoopSIMD<U,S,AU> &w) { \
│ │ │ │ +
233 LoopSIMD<T,S,A> out; \
│ │ │ │ +
234 DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
235 for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
236 out[i] = v[i] SYMBOL w[i]; \
│ │ │ │ +
237 } \
│ │ │ │ +
238 return out; \
│ │ │ │ +
239 } \
│ │ │ │ +
240 static_assert(true, "expecting ;")
│ │ │ │ +
241
│ │ │ │ + │ │ │ │ + │ │ │ │ +
244
│ │ │ │ +
245#undef DUNE_SIMD_LOOP_BITSHIFT_OP
│ │ │ │ +
246
│ │ │ │ +
247 //Comparison operators
│ │ │ │ +
248#define DUNE_SIMD_LOOP_COMPARISON_OP(SYMBOL) \
│ │ │ │ +
249 template<class T, std::size_t S, std::size_t A, class U> \
│ │ │ │ +
250 auto operator SYMBOL(const LoopSIMD<T,S,A> &v, const U s) { \
│ │ │ │ +
251 Simd::Mask<LoopSIMD<T,S,A>> out; \
│ │ │ │ +
252 DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
253 for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
254 out[i] = v[i] SYMBOL s; \
│ │ │ │ +
255 } \
│ │ │ │ +
256 return out; \
│ │ │ │ +
257 } \
│ │ │ │ +
258 template<class T, std::size_t S, std::size_t A> \
│ │ │ │ +
259 auto operator SYMBOL(const Simd::Scalar<T> s, const LoopSIMD<T,S,A> &v) { \
│ │ │ │ +
260 Simd::Mask<LoopSIMD<T,S,A>> out; \
│ │ │ │ +
261 DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
262 for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
263 out[i] = s SYMBOL v[i]; \
│ │ │ │ +
264 } \
│ │ │ │ +
265 return out; \
│ │ │ │ +
266 } \
│ │ │ │ +
267 template<class T, std::size_t S, std::size_t A> \
│ │ │ │ +
268 auto operator SYMBOL(const LoopSIMD<T,S,A> &v, \
│ │ │ │ +
269 const LoopSIMD<T,S,A> &w) { \
│ │ │ │ +
270 Simd::Mask<LoopSIMD<T,S,A>> out; \
│ │ │ │ +
271 DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
272 for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
273 out[i] = v[i] SYMBOL w[i]; \
│ │ │ │ +
274 } \
│ │ │ │ +
275 return out; \
│ │ │ │ +
276 } \
│ │ │ │ +
277 static_assert(true, "expecting ;")
│ │ │ │ +
278
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
285#undef DUNE_SIMD_LOOP_COMPARISON_OP
│ │ │ │ +
286
│ │ │ │ +
287 //Boolean operators
│ │ │ │ +
288#define DUNE_SIMD_LOOP_BOOLEAN_OP(SYMBOL) \
│ │ │ │ +
289 template<class T, std::size_t S, std::size_t A> \
│ │ │ │ +
290 auto operator SYMBOL(const LoopSIMD<T,S,A> &v, const Simd::Scalar<T> s) { \
│ │ │ │ +
291 Simd::Mask<LoopSIMD<T,S,A>> out; \
│ │ │ │ +
292 DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
293 for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
294 out[i] = v[i] SYMBOL s; \
│ │ │ │ +
295 } \
│ │ │ │ +
296 return out; \
│ │ │ │ +
297 } \
│ │ │ │ +
298 template<class T, std::size_t S, std::size_t A> \
│ │ │ │ +
299 auto operator SYMBOL(const Simd::Mask<T> s, const LoopSIMD<T,S,A> &v) { \
│ │ │ │ +
300 Simd::Mask<LoopSIMD<T,S,A>> out; \
│ │ │ │ +
301 DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
302 for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
303 out[i] = s SYMBOL v[i]; \
│ │ │ │ +
304 } \
│ │ │ │ +
305 return out; \
│ │ │ │ +
306 } \
│ │ │ │ +
307 template<class T, std::size_t S, std::size_t A> \
│ │ │ │ +
308 auto operator SYMBOL(const LoopSIMD<T,S,A> &v, \
│ │ │ │ +
309 const LoopSIMD<T,S,A> &w) { \
│ │ │ │ +
310 Simd::Mask<LoopSIMD<T,S,A>> out; \
│ │ │ │ +
311 DUNE_PRAGMA_OMP_SIMD \
│ │ │ │ +
312 for(std::size_t i=0; i<S; i++){ \
│ │ │ │ +
313 out[i] = v[i] SYMBOL w[i]; \
│ │ │ │ +
314 } \
│ │ │ │ +
315 return out; \
│ │ │ │ +
316 } \
│ │ │ │ +
317 static_assert(true, "expecting ;")
│ │ │ │ +
318
│ │ │ │ + │ │ │ │ + │ │ │ │ +
321#undef DUNE_SIMD_LOOP_BOOLEAN_OP
│ │ │ │ +
322
│ │ │ │ +
323 //prints a given LoopSIMD
│ │ │ │ +
324 template<class T, std::size_t S, std::size_t A>
│ │ │ │ +
325 std::ostream& operator<< (std::ostream &os, const LoopSIMD<T,S,A> &v) {
│ │ │ │ +
326 os << "[";
│ │ │ │ +
327 for(std::size_t i=0; i<S-1; i++) {
│ │ │ │ +
328 os << v[i] << ", ";
│ │ │ │ +
329 }
│ │ │ │ +
330 os << v[S-1] << "]";
│ │ │ │ +
331 return os;
│ │ │ │ +
332 }
│ │ │ │ +
333
│ │ │ │ +
334 namespace Simd {
│ │ │ │ +
335 namespace Overloads {
│ │ │ │ +
336 /*
│ │ │ │ +
337 * Implementation/Overloads of the functions needed for
│ │ │ │ +
338 * SIMD-interface-compatibility
│ │ │ │ +
339 */
│ │ │ │ +
340
│ │ │ │ +
341 //Implementation of SIMD-interface-types
│ │ │ │ +
342 template<class T, std::size_t S, std::size_t A>
│ │ │ │ +
343 struct ScalarType<LoopSIMD<T,S,A>> {
│ │ │ │ + │ │ │ │ +
345 };
│ │ │ │ +
346
│ │ │ │ +
347 template<class U, class T, std::size_t S, std::size_t A>
│ │ │ │ +
348 struct RebindType<U, LoopSIMD<T,S,A>> {
│ │ │ │ + │ │ │ │ +
350 };
│ │ │ │ +
351
│ │ │ │ +
352 //Implementation of SIMD-interface-functionality
│ │ │ │ +
353 template<class T, std::size_t S, std::size_t A>
│ │ │ │ +
354 struct LaneCount<LoopSIMD<T,S,A>> : index_constant<S*lanes<T>()> {};
│ │ │ │ +
355
│ │ │ │ +
356 template<class T, std::size_t S, std::size_t A>
│ │ │ │ +
357 auto lane(ADLTag<5>, std::size_t l, LoopSIMD<T,S,A> &&v)
│ │ │ │ +
358 -> decltype(std::move(Simd::lane(l%lanes<T>(), v[l/lanes<T>()])))
│ │ │ │ +
359 {
│ │ │ │ +
360 return std::move(Simd::lane(l%lanes<T>(), v[l/lanes<T>()]));
│ │ │ │ +
361 }
│ │ │ │ +
362
│ │ │ │ +
363 template<class T, std::size_t S, std::size_t A>
│ │ │ │ +
364 auto lane(ADLTag<5>, std::size_t l, const LoopSIMD<T,S,A> &v)
│ │ │ │ +
365 -> decltype(Simd::lane(l%lanes<T>(), v[l/lanes<T>()]))
│ │ │ │ +
366 {
│ │ │ │ +
367 return Simd::lane(l%lanes<T>(), v[l/lanes<T>()]);
│ │ │ │ +
368 }
│ │ │ │ +
369
│ │ │ │ +
370 template<class T, std::size_t S, std::size_t A>
│ │ │ │ +
371 auto lane(ADLTag<5>, std::size_t l, LoopSIMD<T,S,A> &v)
│ │ │ │ +
372 -> decltype(Simd::lane(l%lanes<T>(), v[l/lanes<T>()]))
│ │ │ │ +
373 {
│ │ │ │ +
374 return Simd::lane(l%lanes<T>(), v[l/lanes<T>()]);
│ │ │ │ +
375 }
│ │ │ │ +
376
│ │ │ │ +
377 template<class T, std::size_t S, std::size_t AM, std::size_t AD>
│ │ │ │ + │ │ │ │ +
379 LoopSIMD<T,S,AD> ifTrue, LoopSIMD<T,S,AD> ifFalse) {
│ │ │ │ + │ │ │ │ +
381 for(std::size_t i=0; i<S; i++) {
│ │ │ │ +
382 out[i] = Simd::cond(mask[i], ifTrue[i], ifFalse[i]);
│ │ │ │ +
383 }
│ │ │ │ +
384 return out;
│ │ │ │ +
385 }
│ │ │ │ +
386
│ │ │ │ +
387 template<class M, class T, std::size_t S, std::size_t A>
│ │ │ │ +
388 auto cond(ADLTag<5, std::is_same<bool, Simd::Scalar<M> >::value
│ │ │ │ +
389 && Simd::lanes<M>() == Simd::lanes<LoopSIMD<T,S,A> >()>,
│ │ │ │ +
390 M mask, LoopSIMD<T,S,A> ifTrue, LoopSIMD<T,S,A> ifFalse)
│ │ │ │ +
391 {
│ │ │ │ +
392 LoopSIMD<T,S,A> out;
│ │ │ │ +
393 for(auto l : range(Simd::lanes(mask)))
│ │ │ │ +
394 Simd::lane(l, out) = Simd::lane(l, mask) ? Simd::lane(l, ifTrue) : Simd::lane(l, ifFalse);
│ │ │ │ +
395 return out;
│ │ │ │ +
396 }
│ │ │ │ +
397
│ │ │ │ +
398 template<class M, std::size_t S, std::size_t A>
│ │ │ │ + │ │ │ │ +
400 bool out = false;
│ │ │ │ +
401 for(std::size_t i=0; i<S; i++) {
│ │ │ │ +
402 out |= Simd::anyTrue(mask[i]);
│ │ │ │ +
403 }
│ │ │ │ +
404 return out;
│ │ │ │ +
405 }
│ │ │ │ +
406
│ │ │ │ +
407 template<class M, std::size_t S, std::size_t A>
│ │ │ │ + │ │ │ │ +
409 bool out = true;
│ │ │ │ +
410 for(std::size_t i=0; i<S; i++) {
│ │ │ │ +
411 out &= Simd::allTrue(mask[i]);
│ │ │ │ +
412 }
│ │ │ │ +
413 return out;
│ │ │ │ +
414 }
│ │ │ │ +
415
│ │ │ │ +
416 template<class M, std::size_t S, std::size_t A>
│ │ │ │ + │ │ │ │ +
418 bool out = false;
│ │ │ │ +
419 for(std::size_t i=0; i<S; i++) {
│ │ │ │ +
420 out |= Simd::anyFalse(mask[i]);
│ │ │ │ +
421 }
│ │ │ │ +
422 return out;
│ │ │ │ +
423 }
│ │ │ │ +
424
│ │ │ │ +
425 template<class M, std::size_t S, std::size_t A>
│ │ │ │ + │ │ │ │ +
427 bool out = true;
│ │ │ │ +
428 for(std::size_t i=0; i<S; i++) {
│ │ │ │ +
429 out &= Simd::allFalse(mask[i]);
│ │ │ │ +
430 }
│ │ │ │ +
431 return out;
│ │ │ │ +
432 }
│ │ │ │ +
433 } //namespace Overloads
│ │ │ │ +
434
│ │ │ │ +
435 } //namespace Simd
│ │ │ │ +
436
│ │ │ │ +
437
│ │ │ │ +
438 /*
│ │ │ │ +
439 * Overloads the unary cmath-operations. Operations requiring
│ │ │ │ +
440 * or returning more than one argument are not supported.
│ │ │ │ +
441 * Due to inconsistency with the return values, cmath-operations
│ │ │ │ +
442 * on integral types are also not supported-
│ │ │ │ +
443 */
│ │ │ │ +
444
│ │ │ │ +
445#define DUNE_SIMD_LOOP_CMATH_UNARY_OP(expr) \
│ │ │ │ +
446 template<class T, std::size_t S, std::size_t A, typename Sfinae = \
│ │ │ │ +
447 typename std::enable_if_t<!std::is_integral<Simd::Scalar<T>>::value> > \
│ │ │ │ +
448 auto expr(const LoopSIMD<T,S,A> &v) { \
│ │ │ │ +
449 using std::expr; \
│ │ │ │ +
450 LoopSIMD<T,S,A> out; \
│ │ │ │ +
451 for(std::size_t i=0; i<S; i++) { \
│ │ │ │ +
452 out[i] = expr(v[i]); \
│ │ │ │ +
453 } \
│ │ │ │ +
454 return out; \
│ │ │ │ +
455 } \
│ │ │ │ +
456 static_assert(true, "expecting ;")
│ │ │ │ +
457
│ │ │ │ +
458#define DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN(expr, returnType) \
│ │ │ │ +
459 template<class T, std::size_t S, std::size_t A, typename Sfinae = \
│ │ │ │ +
460 typename std::enable_if_t<!std::is_integral<Simd::Scalar<T>>::value> > \
│ │ │ │ +
461 auto expr(const LoopSIMD<T,S,A> &v) { \
│ │ │ │ +
462 using std::expr; \
│ │ │ │ +
463 LoopSIMD<returnType,S> out; \
│ │ │ │ +
464 for(std::size_t i=0; i<S; i++) { \
│ │ │ │ +
465 out[i] = expr(v[i]); \
│ │ │ │ +
466 } \
│ │ │ │ +
467 return out; \
│ │ │ │ +
468 } \
│ │ │ │ +
469 static_assert(true, "expecting ;")
│ │ │ │ +
470
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
483
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
493
│ │ │ │ + │ │ │ │ + │ │ │ │ +
496
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
501
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
512
│ │ │ │ + │ │ │ │ + │ │ │ │ +
515
│ │ │ │ +
516#undef DUNE_SIMD_LOOP_CMATH_UNARY_OP
│ │ │ │ +
517#undef DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN
│ │ │ │ +
518
│ │ │ │ +
519
│ │ │ │ +
520 /* not implemented cmath-functions:
│ │ │ │ +
521 * atan2
│ │ │ │ +
522 * frexp, idexp
│ │ │ │ +
523 * modf
│ │ │ │ +
524 * scalbn, scalbln
│ │ │ │ +
525 * pow
│ │ │ │ +
526 * hypot
│ │ │ │ +
527 * remainder, remquo
│ │ │ │ +
528 * copysign
│ │ │ │ +
529 * nan
│ │ │ │ +
530 * nextafter, nexttoward
│ │ │ │ +
531 * fdim, fmax, fmin
│ │ │ │ +
532 */
│ │ │ │ +
533
│ │ │ │ +
534 /*
│ │ │ │ +
535 * Overloads specific functions usually provided by the std library
│ │ │ │ +
536 * More overloads will be provided should the need arise.
│ │ │ │ +
537 */
│ │ │ │ +
538
│ │ │ │ +
539#define DUNE_SIMD_LOOP_STD_UNARY_OP(expr) \
│ │ │ │ +
540 template<class T, std::size_t S, std::size_t A> \
│ │ │ │ +
541 auto expr(const LoopSIMD<T,S,A> &v) { \
│ │ │ │ +
542 using std::expr; \
│ │ │ │ +
543 LoopSIMD<T,S,A> out; \
│ │ │ │ +
544 for(std::size_t i=0; i<S; i++) { \
│ │ │ │ +
545 out[i] = expr(v[i]); \
│ │ │ │ +
546 } \
│ │ │ │ +
547 return out; \
│ │ │ │ +
548 } \
│ │ │ │ +
549 \
│ │ │ │ +
550 template<class T, std::size_t S, std::size_t A> \
│ │ │ │ +
551 auto expr(const LoopSIMD<std::complex<T>,S,A> &v) { \
│ │ │ │ +
552 using std::expr; \
│ │ │ │ +
553 LoopSIMD<T,S,A> out; \
│ │ │ │ +
554 for(std::size_t i=0; i<S; i++) { \
│ │ │ │ +
555 out[i] = expr(v[i]); \
│ │ │ │ +
556 } \
│ │ │ │ +
557 return out; \
│ │ │ │ +
558 } \
│ │ │ │ +
559 static_assert(true, "expecting ;")
│ │ │ │ +
560
│ │ │ │ + │ │ │ │ + │ │ │ │ +
563
│ │ │ │ +
564#undef DUNE_SIMD_LOOP_STD_UNARY_OP
│ │ │ │ +
565
│ │ │ │ +
566#define DUNE_SIMD_LOOP_STD_BINARY_OP(expr) \
│ │ │ │ +
567 template<class T, std::size_t S, std::size_t A> \
│ │ │ │ +
568 auto expr(const LoopSIMD<T,S,A> &v, const LoopSIMD<T,S,A> &w) { \
│ │ │ │ +
569 using std::expr; \
│ │ │ │ +
570 LoopSIMD<T,S,A> out; \
│ │ │ │ +
571 for(std::size_t i=0; i<S; i++) { \
│ │ │ │ +
572 out[i] = expr(v[i],w[i]); \
│ │ │ │ +
573 } \
│ │ │ │ +
574 return out; \
│ │ │ │ +
575 } \
│ │ │ │ +
576 static_assert(true, "expecting ;")
│ │ │ │ +
577
│ │ │ │ + │ │ │ │ + │ │ │ │ +
580
│ │ │ │ +
581#undef DUNE_SIMD_LOOP_STD_BINARY_OP
│ │ │ │ +
582
│ │ │ │ +
583 namespace MathOverloads {
│ │ │ │ +
584 template<class T, std::size_t S, std::size_t A>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
587 for(auto l : range(S))
│ │ │ │ +
588 out[l] = Dune::isNaN(v[l]);
│ │ │ │ +
589 return out;
│ │ │ │ +
590 }
│ │ │ │ +
591
│ │ │ │ +
592 template<class T, std::size_t S, std::size_t A>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
595 for(auto l : range(S))
│ │ │ │ +
596 out[l] = Dune::isInf(v[l]);
│ │ │ │ +
597 return out;
│ │ │ │ +
598 }
│ │ │ │ +
599
│ │ │ │ +
600 template<class T, std::size_t S, std::size_t A>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
603 for(auto l : range(S))
│ │ │ │ +
604 out[l] = Dune::isFinite(v[l]);
│ │ │ │ +
605 return out;
│ │ │ │ +
606 }
│ │ │ │ +
607 } //namespace MathOverloads
│ │ │ │ +
608
│ │ │ │ +
609 template<class T, std::size_t S, std::size_t A>
│ │ │ │ +
610 struct IsNumber<LoopSIMD<T,S,A>> :
│ │ │ │ +
611 public std::integral_constant<bool, IsNumber<T>::value>{
│ │ │ │ +
612 };
│ │ │ │ +
613
│ │ │ │ +
614#ifdef CLANG_WARNING_DISABLED
│ │ │ │ +
615# pragma clang diagnostic pop
│ │ │ │ +
616# undef CLANG_WARNING_DISABLED
│ │ │ │ +
617#endif
│ │ │ │ +
618
│ │ │ │ +
619#ifdef GCC_WARNING_DISABLED
│ │ │ │ +
620# pragma GCC diagnostic pop
│ │ │ │ +
621# undef GCC_WARNING_DISABLED
│ │ │ │ +
622#endif
│ │ │ │ +
623
│ │ │ │ +
624} //namespace Dune
│ │ │ │ +
625
│ │ │ │ +
626#endif
│ │ │ │ +
#define DUNE_PRAGMA_OMP_SIMD
Definition: loop.hh:48
│ │ │ │ +
Traits for type conversions and type information.
│ │ │ │ +
Some useful basic math stuff.
│ │ │ │ +
std::integral_constant< std::size_t, i > index_constant
An index constant with value i.
Definition: indices.hh:30
│ │ │ │ +
static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from >, std::integral_constant< T, to >) noexcept
Definition: rangeutilities.hh:300
│ │ │ │ +
std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
Definition: bigunsignedint.hh:278
│ │ │ │ +
I round(const T &val, typename EpsilonType< T >::Type epsilon)
round using epsilon
Definition: float_cmp.cc:311
│ │ │ │ +
I trunc(const T &val, typename EpsilonType< T >::Type epsilon)
truncate using epsilon
Definition: float_cmp.cc:407
│ │ │ │ +
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
│ │ │ │ +
bool anyFalse(const Mask &mask)
Whether any entry is false
Definition: simd/interface.hh:449
│ │ │ │ +
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
│ │ │ │ +
Rebind< bool, V > Mask
Mask type type of some SIMD type.
Definition: simd/interface.hh:289
│ │ │ │ +
bool allFalse(const Mask &mask)
Whether all entries are false
Definition: simd/interface.hh:459
│ │ │ │ +
typename Overloads::ScalarType< std::decay_t< V > >::type Scalar
Element type of some SIMD type.
Definition: simd/interface.hh:235
│ │ │ │ +
Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v)
implements Simd::mask()
Definition: defaults.hh:153
│ │ │ │ +
bool allFalse(ADLTag< 0 >, const Mask &mask)
implements Simd::allFalse()
Definition: defaults.hh:124
│ │ │ │ +
bool allTrue(ADLTag< 0 >, const Mask &mask)
implements Simd::allTrue()
Definition: defaults.hh:104
│ │ │ │ +
bool anyFalse(ADLTag< 0 >, const Mask &mask)
implements Simd::anyFalse()
Definition: defaults.hh:114
│ │ │ │ +
STL namespace.
│ │ │ │ +
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ +
DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN(ilogb, int)
│ │ │ │ +
DUNE_SIMD_LOOP_STD_BINARY_OP(max)
│ │ │ │ +
DUNE_SIMD_LOOP_BOOLEAN_OP && DUNE_SIMD_LOOP_BOOLEAN_OP(||);template< class T, std::size_t S, std::size_t A > std::ostream &operator<<(std::ostream &os, const LoopSIMD< T, S, A > &v
Definition: loop.hh:320
│ │ │ │ +
DUNE_SIMD_LOOP_BINARY_OP(+)
│ │ │ │ +
DUNE_SIMD_LOOP_CMATH_UNARY_OP(cos)
│ │ │ │ +
DUNE_SIMD_LOOP_COMPARISON_OP(<)
│ │ │ │ +
DUNE_SIMD_LOOP_BITSHIFT_OP(<<)
│ │ │ │ +
DUNE_SIMD_LOOP_STD_UNARY_OP(real)
│ │ │ │ +
auto min(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
Definition: debugalign.hh:447
│ │ │ │ +
auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
Definition: debugalign.hh:425
│ │ │ │ +
bool anyTrue(ADLTag< 5 >, const AlignedNumber< bool, align > &mask)
Definition: debugalign.hh:543
│ │ │ │ +
const AlignedNumber< T, align > & cond(ADLTag< 5 >, AlignedNumber< bool, align > mask, const AlignedNumber< T, align > &ifTrue, const AlignedNumber< T, align > &ifFalse)
Definition: debugalign.hh:535
│ │ │ │ +
T & lane(ADLTag< 5 >, std::size_t l, AlignedNumber< T, align > &v)
Definition: debugalign.hh:520
│ │ │ │ +
bool isNaN(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
Definition: fvector.hh:604
│ │ │ │ +
bool isInf(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
Definition: fvector.hh:594
│ │ │ │ +
auto isFinite(const LoopSIMD< T, S, A > &v, PriorityTag< 3 >, ADLTag)
Definition: loop.hh:601
│ │ │ │ +
auto isNaN(const LoopSIMD< T, S, A > &v, PriorityTag< 3 >, ADLTag)
Definition: loop.hh:585
│ │ │ │ +
auto isFinite(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
Definition: fvector.hh:584
│ │ │ │ +
auto isInf(const LoopSIMD< T, S, A > &v, PriorityTag< 3 >, ADLTag)
Definition: loop.hh:593
│ │ │ │ +
Whether this type acts as a scalar in the context of (hierarchically blocked) containers.
Definition: typetraits.hh:194
│ │ │ │ +
Tag to make sure the functions in this namespace can be found by ADL.
Definition: math.hh:230
│ │ │ │ +
Tag used to force late-binding lookup in Dune::Simd::Overloads.
Definition: base.hh:182
│ │ │ │ +
should have a member type type
Definition: standard.hh:60
│ │ │ │ +
should have a member type type
Definition: standard.hh:67
│ │ │ │ +
should be derived from a Dune::index_constant
Definition: standard.hh:74
│ │ │ │ +
Definition: loop.hh:64
│ │ │ │ +
LoopSIMD(Simd::Scalar< T > i)
Definition: loop.hh:74
│ │ │ │ +
DUNE_SIMD_LOOP_PREFIX_OP(++)
│ │ │ │ +
auto operator!() const
Definition: loop.hh:120
│ │ │ │ +
DUNE_SIMD_LOOP_POSTFIX_OP(--)
│ │ │ │ +
DUNE_SIMD_LOOP_ASSIGNMENT_OP * DUNE_SIMD_LOOP_ASSIGNMENT_OP(/=);DUNE_SIMD_LOOP_ASSIGNMENT_OP(%=
│ │ │ │ +
DUNE_SIMD_LOOP_ASSIGNMENT_OP & DUNE_SIMD_LOOP_ASSIGNMENT_OP(|=);DUNE_SIMD_LOOP_ASSIGNMENT_OP(^=
│ │ │ │ +
DUNE_SIMD_LOOP_UNARY_OP(-)
│ │ │ │ +
DUNE_SIMD_LOOP_PREFIX_OP(--)
│ │ │ │ +
DUNE_SIMD_LOOP_POSTFIX_OP(++)
│ │ │ │ +
DUNE_SIMD_LOOP_ASSIGNMENT_OP(-=)
│ │ │ │ +
LoopSIMD(const LoopSIMD< T, S, OA > &other)
Definition: loop.hh:79
│ │ │ │ +
LoopSIMD()
Definition: loop.hh:69
│ │ │ │ +
DUNE_SIMD_LOOP_UNARY_OP(~)
│ │ │ │ +
DUNE_SIMD_LOOP_ASSIGNMENT_OP(+=)
│ │ │ │ +
DUNE_SIMD_LOOP_UNARY_OP(+)
│ │ │ │ +
DUNE_SIMD_LOOP_ASSIGNMENT_OP(<<=)
│ │ │ │ +
DUNE_SIMD_LOOP_ASSIGNMENT_OP(> >=)
│ │ │ │ +
Simd::Scalar< T > type
Definition: loop.hh:344
│ │ │ │ +
Helper class for tagging priorities.
Definition: typeutilities.hh:73
│ │ │ │ +
Include file for users of the SIMD abstraction layer.
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,23 +4,844 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -collectivecommunication.hh │ │ │ │ │ + * simd │ │ │ │ │ +loop.hh │ │ │ │ │ Go_to_the_documentation_of_this_file. │ │ │ │ │ 1// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ - 3// Will be removed after the 2.7 release │ │ │ │ │ - 4#warning "Deprecated header, use #include instead!" │ │ │ │ │ - 5#include │ │ │ │ │ -communication.hh │ │ │ │ │ -Implements an utility class that provides collective communication methods for │ │ │ │ │ -sequential programs. │ │ │ │ │ + 3#ifndef DUNE_COMMON_SIMD_LOOP_HH │ │ │ │ │ + 4#define DUNE_COMMON_SIMD_LOOP_HH │ │ │ │ │ + 5 │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ + 8#include │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11 │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14#include │ │ │ │ │ + 15 │ │ │ │ │ + 16namespace Dune { │ │ │ │ │ + 17 │ │ │ │ │ + 18 │ │ │ │ │ + 19/* │ │ │ │ │ + 20 * silence warnings from GCC about using integer operands on a bool │ │ │ │ │ + 21 * (when instantiated for T=bool) │ │ │ │ │ + 22 */ │ │ │ │ │ + 23#if __GNUC__ >= 7 │ │ │ │ │ + 24# pragma GCC diagnostic push │ │ │ │ │ + 25# pragma GCC diagnostic ignored "-Wbool-operation" │ │ │ │ │ + 26# pragma GCC diagnostic ignored "-Wint-in-bool-context" │ │ │ │ │ + 27# define GCC_WARNING_DISABLED │ │ │ │ │ + 28#endif │ │ │ │ │ + 29 │ │ │ │ │ + 30/* │ │ │ │ │ + 31 * silence warnings from Clang about using bitwise operands on │ │ │ │ │ + 32 * a bool (when instantiated for T=bool) │ │ │ │ │ + 33 */ │ │ │ │ │ + 34#ifdef __clang__ │ │ │ │ │ + 35#if __has_warning("-Wbitwise-instead-of-logical") │ │ │ │ │ + 36# pragma clang diagnostic push │ │ │ │ │ + 37# pragma clang diagnostic ignored "-Wbitwise-instead-of-logical" │ │ │ │ │ + 38# define CLANG_WARNING_DISABLED │ │ │ │ │ + 39#endif │ │ │ │ │ + 40#endif │ │ │ │ │ + 41 │ │ │ │ │ + 42/* │ │ │ │ │ + 43 * Introduce a simd pragma if OpenMP is available in standard version >= 4 │ │ │ │ │ + 44 */ │ │ │ │ │ + 45#if _OPENMP >= 201307 │ │ │ │ │ + 46 #define DUNE_PRAGMA_OMP_SIMD _Pragma("omp simd") │ │ │ │ │ + 47#else │ │ │ │ │ +48 #define DUNE_PRAGMA_OMP_SIMD │ │ │ │ │ + 49#endif │ │ │ │ │ + 50 │ │ │ │ │ + 51 │ │ │ │ │ + 63 template │ │ │ │ │ +64 class alignas(A==0?alignof(T):A) LoopSIMD : public std::array { │ │ │ │ │ + 65 │ │ │ │ │ + 66 public: │ │ │ │ │ + 67 │ │ │ │ │ + 68 //default constructor │ │ │ │ │ +69 LoopSIMD() { │ │ │ │ │ + 70 assert(reinterpret_cast(this) % std::min(alignof │ │ │ │ │ +(LoopSIMD),alignof(std::max_align_t)) == 0); │ │ │ │ │ + 71 } │ │ │ │ │ + 72 │ │ │ │ │ + 73 // broadcast constructor initializing the content with a given value │ │ │ │ │ +74 LoopSIMD(Simd::Scalar i) : LoopSIMD() { │ │ │ │ │ + 75 this->fill(i); │ │ │ │ │ + 76 } │ │ │ │ │ + 77 │ │ │ │ │ + 78 template │ │ │ │ │ +79 explicit LoopSIMD(const LoopSIMD& other) │ │ │ │ │ + 80 : std::array(other) │ │ │ │ │ + 81 { │ │ │ │ │ + 82 assert(reinterpret_cast(this) % std::min(alignof │ │ │ │ │ +(LoopSIMD),alignof(std::max_align_t)) == 0); │ │ │ │ │ + 83 } │ │ │ │ │ + 84 │ │ │ │ │ + 85 /* │ │ │ │ │ + 86 * Definition of basic operators │ │ │ │ │ + 87 */ │ │ │ │ │ + 88 │ │ │ │ │ + 89 //Prefix operators │ │ │ │ │ +90#define DUNE_SIMD_LOOP_PREFIX_OP(SYMBOL) \ │ │ │ │ │ + 91 auto operator SYMBOL() { \ │ │ │ │ │ + 92 DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ + 93 for(std::size_t i=0; i out; \ │ │ │ │ │ + 108 DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ + 109 for(std::size_t i=0; i> out; │ │ │ │ │ + 122 DUNE_PRAGMA_OMP_SIMD │ │ │ │ │ + 123 for(std::size_t i=0; i out = *this; \ │ │ │ │ │ + 134 SYMBOL(*this); \ │ │ │ │ │ + 135 return out; \ │ │ │ │ │ + 136 } \ │ │ │ │ │ + 137 static_assert(true, "expecting ;") │ │ │ │ │ + 138 │ │ │ │ │ +139 DUNE_SIMD_LOOP_POSTFIX_OP(++); │ │ │ │ │ +140 DUNE_SIMD_LOOP_POSTFIX_OP(--); │ │ │ │ │ + 141#undef DUNE_SIMD_LOOP_POSTFIX_OP │ │ │ │ │ + 142 │ │ │ │ │ + 143 //Assignment operators │ │ │ │ │ +144#define DUNE_SIMD_LOOP_ASSIGNMENT_OP(SYMBOL) \ │ │ │ │ │ + 145 auto operator SYMBOL(const Simd::Scalar s) { \ │ │ │ │ │ + 146 DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ + 147 for(std::size_t i=0; i &v) { \ │ │ │ │ │ + 154 DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ + 155 for(std::size_t i=0; i>=); │ │ │ │ │ +169 DUNE_SIMD_LOOP_ASSIGNMENT_OP(&=); │ │ │ │ │ + 170 DUNE_SIMD_LOOP_ASSIGNMENT_OP(|=); │ │ │ │ │ + 171 DUNE_SIMD_LOOP_ASSIGNMENT_OP(^=); │ │ │ │ │ + 172#undef DUNE_SIMD_LOOP_ASSIGNMENT_OP │ │ │ │ │ + 173 }; │ │ │ │ │ + 174 │ │ │ │ │ + 175 //Arithmetic operators │ │ │ │ │ +176#define DUNE_SIMD_LOOP_BINARY_OP(SYMBOL) \ │ │ │ │ │ + 177 template \ │ │ │ │ │ + 178 auto operator SYMBOL(const LoopSIMD &v, const Simd::Scalar s) │ │ │ │ │ +{ \ │ │ │ │ │ + 179 LoopSIMD out; \ │ │ │ │ │ + 180 DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ + 181 for(std::size_t i=0; i \ │ │ │ │ │ + 187 auto operator SYMBOL(const Simd::Scalar s, const LoopSIMD &v) │ │ │ │ │ +{ \ │ │ │ │ │ + 188 LoopSIMD out; \ │ │ │ │ │ + 189 DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ + 190 for(std::size_t i=0; i \ │ │ │ │ │ + 196 auto operator SYMBOL(const LoopSIMD &v, \ │ │ │ │ │ + 197 const LoopSIMD &w) { \ │ │ │ │ │ + 198 LoopSIMD out; \ │ │ │ │ │ + 199 DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ + 200 for(std::size_t i=0; i \ │ │ │ │ │ + 222 auto operator SYMBOL(const LoopSIMD &v, const U s) { \ │ │ │ │ │ + 223 LoopSIMD out; \ │ │ │ │ │ + 224 DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ + 225 for(std::size_t i=0; i \ │ │ │ │ │ + 231 auto operator SYMBOL(const LoopSIMD &v, \ │ │ │ │ │ + 232 const LoopSIMD &w) { \ │ │ │ │ │ + 233 LoopSIMD out; \ │ │ │ │ │ + 234 DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ + 235 for(std::size_t i=0; i>); │ │ │ │ │ + 244 │ │ │ │ │ + 245#undef DUNE_SIMD_LOOP_BITSHIFT_OP │ │ │ │ │ + 246 │ │ │ │ │ + 247 //Comparison operators │ │ │ │ │ +248#define DUNE_SIMD_LOOP_COMPARISON_OP(SYMBOL) \ │ │ │ │ │ + 249 template \ │ │ │ │ │ + 250 auto operator SYMBOL(const LoopSIMD &v, const U s) { \ │ │ │ │ │ + 251 Simd::Mask> out; \ │ │ │ │ │ + 252 DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ + 253 for(std::size_t i=0; i \ │ │ │ │ │ + 259 auto operator SYMBOL(const Simd::Scalar s, const LoopSIMD &v) │ │ │ │ │ +{ \ │ │ │ │ │ + 260 Simd::Mask> out; \ │ │ │ │ │ + 261 DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ + 262 for(std::size_t i=0; i \ │ │ │ │ │ + 268 auto operator SYMBOL(const LoopSIMD &v, \ │ │ │ │ │ + 269 const LoopSIMD &w) { \ │ │ │ │ │ + 270 Simd::Mask> out; \ │ │ │ │ │ + 271 DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ + 272 for(std::size_t i=0; i); │ │ │ │ │ +281 DUNE_SIMD_LOOP_COMPARISON_OP(<=); │ │ │ │ │ +282 DUNE_SIMD_LOOP_COMPARISON_OP(>=); │ │ │ │ │ + 283 DUNE_SIMD_LOOP_COMPARISON_OP(==); │ │ │ │ │ +284 DUNE_SIMD_LOOP_COMPARISON_OP(!=); │ │ │ │ │ + 285#undef DUNE_SIMD_LOOP_COMPARISON_OP │ │ │ │ │ + 286 │ │ │ │ │ + 287 //Boolean operators │ │ │ │ │ +288#define DUNE_SIMD_LOOP_BOOLEAN_OP(SYMBOL) \ │ │ │ │ │ + 289 template \ │ │ │ │ │ + 290 auto operator SYMBOL(const LoopSIMD &v, const Simd::Scalar s) │ │ │ │ │ +{ \ │ │ │ │ │ + 291 Simd::Mask> out; \ │ │ │ │ │ + 292 DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ + 293 for(std::size_t i=0; i \ │ │ │ │ │ + 299 auto operator SYMBOL(const Simd::Mask s, const LoopSIMD &v) { \ │ │ │ │ │ + 300 Simd::Mask> out; \ │ │ │ │ │ + 301 DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ + 302 for(std::size_t i=0; i \ │ │ │ │ │ + 308 auto operator SYMBOL(const LoopSIMD &v, \ │ │ │ │ │ + 309 const LoopSIMD &w) { \ │ │ │ │ │ + 310 Simd::Mask> out; \ │ │ │ │ │ + 311 DUNE_PRAGMA_OMP_SIMD \ │ │ │ │ │ + 312 for(std::size_t i=0; i │ │ │ │ │ + 325 std::ostream& operator<<(std::ostream &os, const LoopSIMD &v) { │ │ │ │ │ + 326 os << "["; │ │ │ │ │ + 327 for(std::size_t i=0; i │ │ │ │ │ +343 struct ScalarType> { │ │ │ │ │ +344 using type = Simd::Scalar; │ │ │ │ │ + 345 }; │ │ │ │ │ + 346 │ │ │ │ │ + 347 template │ │ │ │ │ +348 struct RebindType> { │ │ │ │ │ +349 using type = LoopSIMD,S,A>; │ │ │ │ │ + 350 }; │ │ │ │ │ + 351 │ │ │ │ │ + 352 //Implementation of SIMD-interface-functionality │ │ │ │ │ + 353 template │ │ │ │ │ +354 struct LaneCount> : index_constant()> {}; │ │ │ │ │ + 355 │ │ │ │ │ + 356 template │ │ │ │ │ +357 auto lane(ADLTag<5>, std::size_t l, LoopSIMD &&v) │ │ │ │ │ + 358 -> decltype(std::move(Simd::lane(l%lanes(), v[l/lanes()]))) │ │ │ │ │ + 359 { │ │ │ │ │ + 360 return std::move(Simd::lane(l%lanes(), v[l/lanes()])); │ │ │ │ │ + 361 } │ │ │ │ │ + 362 │ │ │ │ │ + 363 template │ │ │ │ │ +364 auto lane(ADLTag<5>, std::size_t l, const LoopSIMD &v) │ │ │ │ │ + 365 -> decltype(Simd::lane(l%lanes(), v[l/lanes()])) │ │ │ │ │ + 366 { │ │ │ │ │ + 367 return Simd::lane(l%lanes(), v[l/lanes()]); │ │ │ │ │ + 368 } │ │ │ │ │ + 369 │ │ │ │ │ + 370 template │ │ │ │ │ +371 auto lane(ADLTag<5>, std::size_t l, LoopSIMD &v) │ │ │ │ │ + 372 -> decltype(Simd::lane(l%lanes(), v[l/lanes()])) │ │ │ │ │ + 373 { │ │ │ │ │ + 374 return Simd::lane(l%lanes(), v[l/lanes()]); │ │ │ │ │ + 375 } │ │ │ │ │ + 376 │ │ │ │ │ + 377 template │ │ │ │ │ +378 auto cond(ADLTag<5>, Simd::Mask> mask, │ │ │ │ │ + 379 LoopSIMD ifTrue, LoopSIMD ifFalse) { │ │ │ │ │ + 380 LoopSIMD out; │ │ │ │ │ + 381 for(std::size_t i=0; i │ │ │ │ │ +388 auto cond(ADLTag<5, std::is_same >::value │ │ │ │ │ + 389 && Simd::lanes() == Simd::lanes >()>, │ │ │ │ │ + 390 M mask, LoopSIMD ifTrue, LoopSIMD ifFalse) │ │ │ │ │ + 391 { │ │ │ │ │ + 392 LoopSIMD out; │ │ │ │ │ + 393 for(auto l : range(Simd::lanes(mask))) │ │ │ │ │ + 394 Simd::lane(l, out) = Simd::lane(l, mask) ? Simd::lane(l, ifTrue) : Simd:: │ │ │ │ │ +lane(l, ifFalse); │ │ │ │ │ + 395 return out; │ │ │ │ │ + 396 } │ │ │ │ │ + 397 │ │ │ │ │ + 398 template │ │ │ │ │ +399 bool anyTrue(ADLTag<5>, LoopSIMD mask) { │ │ │ │ │ + 400 bool out = false; │ │ │ │ │ + 401 for(std::size_t i=0; i │ │ │ │ │ +408 bool allTrue(ADLTag<5>, LoopSIMD mask) { │ │ │ │ │ + 409 bool out = true; │ │ │ │ │ + 410 for(std::size_t i=0; i │ │ │ │ │ +417 bool anyFalse(ADLTag<5>, LoopSIMD mask) { │ │ │ │ │ + 418 bool out = false; │ │ │ │ │ + 419 for(std::size_t i=0; i │ │ │ │ │ +426 bool allFalse(ADLTag<5>, LoopSIMD mask) { │ │ │ │ │ + 427 bool out = true; │ │ │ │ │ + 428 for(std::size_t i=0; i>::value> > \ │ │ │ │ │ + 448 auto expr(const LoopSIMD &v) { \ │ │ │ │ │ + 449 using std::expr; \ │ │ │ │ │ + 450 LoopSIMD out; \ │ │ │ │ │ + 451 for(std::size_t i=0; i>::value> > \ │ │ │ │ │ + 461 auto expr(const LoopSIMD &v) { \ │ │ │ │ │ + 462 using std::expr; \ │ │ │ │ │ + 463 LoopSIMD out; \ │ │ │ │ │ + 464 for(std::size_t i=0; i \ │ │ │ │ │ + 541 auto expr(const LoopSIMD &v) { \ │ │ │ │ │ + 542 using std::expr; \ │ │ │ │ │ + 543 LoopSIMD out; \ │ │ │ │ │ + 544 for(std::size_t i=0; i \ │ │ │ │ │ + 551 auto expr(const LoopSIMD,S,A> &v) { \ │ │ │ │ │ + 552 using std::expr; \ │ │ │ │ │ + 553 LoopSIMD out; \ │ │ │ │ │ + 554 for(std::size_t i=0; i \ │ │ │ │ │ + 568 auto expr(const LoopSIMD &v, const LoopSIMD &w) { \ │ │ │ │ │ + 569 using std::expr; \ │ │ │ │ │ + 570 LoopSIMD out; \ │ │ │ │ │ + 571 for(std::size_t i=0; i │ │ │ │ │ +585 auto isNaN(const LoopSIMD &v, PriorityTag<3>, ADLTag) { │ │ │ │ │ + 586 Simd::Mask> out; │ │ │ │ │ + 587 for(auto l : range(S)) │ │ │ │ │ + 588 out[l] = Dune::isNaN(v[l]); │ │ │ │ │ + 589 return out; │ │ │ │ │ + 590 } │ │ │ │ │ + 591 │ │ │ │ │ + 592 template │ │ │ │ │ +593 auto isInf(const LoopSIMD &v, PriorityTag<3>, ADLTag) { │ │ │ │ │ + 594 Simd::Mask> out; │ │ │ │ │ + 595 for(auto l : range(S)) │ │ │ │ │ + 596 out[l] = Dune::isInf(v[l]); │ │ │ │ │ + 597 return out; │ │ │ │ │ + 598 } │ │ │ │ │ + 599 │ │ │ │ │ + 600 template │ │ │ │ │ +601 auto isFinite(const LoopSIMD &v, PriorityTag<3>, ADLTag) { │ │ │ │ │ + 602 Simd::Mask> out; │ │ │ │ │ + 603 for(auto l : range(S)) │ │ │ │ │ + 604 out[l] = Dune::isFinite(v[l]); │ │ │ │ │ + 605 return out; │ │ │ │ │ + 606 } │ │ │ │ │ + 607 } //namespace MathOverloads │ │ │ │ │ + 608 │ │ │ │ │ + 609 template │ │ │ │ │ +610 struct IsNumber> : │ │ │ │ │ + 611 public std::integral_constant::value>{ │ │ │ │ │ + 612 }; │ │ │ │ │ + 613 │ │ │ │ │ + 614#ifdef CLANG_WARNING_DISABLED │ │ │ │ │ + 615# pragma clang diagnostic pop │ │ │ │ │ + 616# undef CLANG_WARNING_DISABLED │ │ │ │ │ + 617#endif │ │ │ │ │ + 618 │ │ │ │ │ + 619#ifdef GCC_WARNING_DISABLED │ │ │ │ │ + 620# pragma GCC diagnostic pop │ │ │ │ │ + 621# undef GCC_WARNING_DISABLED │ │ │ │ │ + 622#endif │ │ │ │ │ + 623 │ │ │ │ │ + 624} //namespace Dune │ │ │ │ │ + 625 │ │ │ │ │ + 626#endif │ │ │ │ │ +DUNE_PRAGMA_OMP_SIMD │ │ │ │ │ +#define DUNE_PRAGMA_OMP_SIMD │ │ │ │ │ +Definition: loop.hh:48 │ │ │ │ │ +typetraits.hh │ │ │ │ │ +Traits for type conversions and type information. │ │ │ │ │ +math.hh │ │ │ │ │ +Some useful basic math stuff. │ │ │ │ │ +Dune::index_constant │ │ │ │ │ +std::integral_constant< std::size_t, i > index_constant │ │ │ │ │ +An index constant with value i. │ │ │ │ │ +Definition: indices.hh:30 │ │ │ │ │ +Dune::range │ │ │ │ │ +static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from │ │ │ │ │ +>, std::integral_constant< T, to >) noexcept │ │ │ │ │ +Definition: rangeutilities.hh:300 │ │ │ │ │ +Dune::operator<< │ │ │ │ │ +std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x) │ │ │ │ │ +Definition: bigunsignedint.hh:278 │ │ │ │ │ +Dune::FloatCmp::round │ │ │ │ │ +I round(const T &val, typename EpsilonType< T >::Type epsilon) │ │ │ │ │ +round using epsilon │ │ │ │ │ +Definition: float_cmp.cc:311 │ │ │ │ │ +Dune::FloatCmp::trunc │ │ │ │ │ +I trunc(const T &val, typename EpsilonType< T >::Type epsilon) │ │ │ │ │ +truncate using epsilon │ │ │ │ │ +Definition: float_cmp.cc:407 │ │ │ │ │ +Dune::Simd::anyTrue │ │ │ │ │ +bool anyTrue(const Mask &mask) │ │ │ │ │ +Whether any entry is true │ │ │ │ │ +Definition: simd/interface.hh:429 │ │ │ │ │ +Dune::Simd::cond │ │ │ │ │ +V cond(M &&mask, const V &ifTrue, const V &ifFalse) │ │ │ │ │ +Like the ?: operator. │ │ │ │ │ +Definition: simd/interface.hh:386 │ │ │ │ │ +Dune::Simd::allTrue │ │ │ │ │ +bool allTrue(const Mask &mask) │ │ │ │ │ +Whether all entries are true │ │ │ │ │ +Definition: simd/interface.hh:439 │ │ │ │ │ +Dune::Simd::anyFalse │ │ │ │ │ +bool anyFalse(const Mask &mask) │ │ │ │ │ +Whether any entry is false │ │ │ │ │ +Definition: simd/interface.hh:449 │ │ │ │ │ +Dune::Simd::lanes │ │ │ │ │ +constexpr std::size_t lanes() │ │ │ │ │ +Number of lanes in a SIMD type. │ │ │ │ │ +Definition: simd/interface.hh:305 │ │ │ │ │ +Dune::Simd::lane │ │ │ │ │ +decltype(auto) lane(std::size_t l, V &&v) │ │ │ │ │ +Extract an element of a SIMD type. │ │ │ │ │ +Definition: simd/interface.hh:324 │ │ │ │ │ +Dune::Simd::Mask │ │ │ │ │ +Rebind< bool, V > Mask │ │ │ │ │ +Mask type type of some SIMD type. │ │ │ │ │ +Definition: simd/interface.hh:289 │ │ │ │ │ +Dune::Simd::allFalse │ │ │ │ │ +bool allFalse(const Mask &mask) │ │ │ │ │ +Whether all entries are false │ │ │ │ │ +Definition: simd/interface.hh:459 │ │ │ │ │ +Dune::Simd::Scalar │ │ │ │ │ +typename Overloads::ScalarType< std::decay_t< V > >::type Scalar │ │ │ │ │ +Element type of some SIMD type. │ │ │ │ │ +Definition: simd/interface.hh:235 │ │ │ │ │ +Dune::Simd::Overloads::mask │ │ │ │ │ +Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v) │ │ │ │ │ +implements Simd::mask() │ │ │ │ │ +Definition: defaults.hh:153 │ │ │ │ │ +Dune::Simd::Overloads::allFalse │ │ │ │ │ +bool allFalse(ADLTag< 0 >, const Mask &mask) │ │ │ │ │ +implements Simd::allFalse() │ │ │ │ │ +Definition: defaults.hh:124 │ │ │ │ │ +Dune::Simd::Overloads::allTrue │ │ │ │ │ +bool allTrue(ADLTag< 0 >, const Mask &mask) │ │ │ │ │ +implements Simd::allTrue() │ │ │ │ │ +Definition: defaults.hh:104 │ │ │ │ │ +Dune::Simd::Overloads::anyFalse │ │ │ │ │ +bool anyFalse(ADLTag< 0 >, const Mask &mask) │ │ │ │ │ +implements Simd::anyFalse() │ │ │ │ │ +Definition: defaults.hh:114 │ │ │ │ │ +std │ │ │ │ │ +STL namespace. │ │ │ │ │ +Dune │ │ │ │ │ +Dune namespace. │ │ │ │ │ +Definition: alignedallocator.hh:13 │ │ │ │ │ +Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN │ │ │ │ │ +DUNE_SIMD_LOOP_CMATH_UNARY_OP_WITH_RETURN(ilogb, int) │ │ │ │ │ +Dune::DUNE_SIMD_LOOP_STD_BINARY_OP │ │ │ │ │ +DUNE_SIMD_LOOP_STD_BINARY_OP(max) │ │ │ │ │ +Dune::DUNE_SIMD_LOOP_BOOLEAN_OP │ │ │ │ │ +DUNE_SIMD_LOOP_BOOLEAN_OP && DUNE_SIMD_LOOP_BOOLEAN_OP(||);template< class T, │ │ │ │ │ +std::size_t S, std::size_t A > std::ostream &operator<<(std::ostream &os, const │ │ │ │ │ +LoopSIMD< T, S, A > &v │ │ │ │ │ +Definition: loop.hh:320 │ │ │ │ │ +Dune::DUNE_SIMD_LOOP_BINARY_OP │ │ │ │ │ +DUNE_SIMD_LOOP_BINARY_OP(+) │ │ │ │ │ +Dune::DUNE_SIMD_LOOP_CMATH_UNARY_OP │ │ │ │ │ +DUNE_SIMD_LOOP_CMATH_UNARY_OP(cos) │ │ │ │ │ +Dune::DUNE_SIMD_LOOP_COMPARISON_OP │ │ │ │ │ +DUNE_SIMD_LOOP_COMPARISON_OP(<) │ │ │ │ │ +Dune::DUNE_SIMD_LOOP_BITSHIFT_OP │ │ │ │ │ +DUNE_SIMD_LOOP_BITSHIFT_OP(<<) │ │ │ │ │ +Dune::DUNE_SIMD_LOOP_STD_UNARY_OP │ │ │ │ │ +DUNE_SIMD_LOOP_STD_UNARY_OP(real) │ │ │ │ │ +Dune::AlignedNumberImpl::min │ │ │ │ │ +auto min(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > │ │ │ │ │ +&b) │ │ │ │ │ +Definition: debugalign.hh:447 │ │ │ │ │ +Dune::AlignedNumberImpl::max │ │ │ │ │ +auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > │ │ │ │ │ +&b) │ │ │ │ │ +Definition: debugalign.hh:425 │ │ │ │ │ +Dune::Simd::Overloads::anyTrue │ │ │ │ │ +bool anyTrue(ADLTag< 5 >, const AlignedNumber< bool, align > &mask) │ │ │ │ │ +Definition: debugalign.hh:543 │ │ │ │ │ +Dune::Simd::Overloads::cond │ │ │ │ │ +const AlignedNumber< T, align > & cond(ADLTag< 5 >, AlignedNumber< bool, align │ │ │ │ │ +> mask, const AlignedNumber< T, align > &ifTrue, const AlignedNumber< T, align │ │ │ │ │ +> &ifFalse) │ │ │ │ │ +Definition: debugalign.hh:535 │ │ │ │ │ +Dune::Simd::Overloads::lane │ │ │ │ │ +T & lane(ADLTag< 5 >, std::size_t l, AlignedNumber< T, align > &v) │ │ │ │ │ +Definition: debugalign.hh:520 │ │ │ │ │ +Dune::MathOverloads::isNaN │ │ │ │ │ +bool isNaN(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag) │ │ │ │ │ +Definition: fvector.hh:604 │ │ │ │ │ +Dune::MathOverloads::isInf │ │ │ │ │ +bool isInf(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag) │ │ │ │ │ +Definition: fvector.hh:594 │ │ │ │ │ +Dune::MathOverloads::isFinite │ │ │ │ │ +auto isFinite(const LoopSIMD< T, S, A > &v, PriorityTag< 3 >, ADLTag) │ │ │ │ │ +Definition: loop.hh:601 │ │ │ │ │ +Dune::MathOverloads::isNaN │ │ │ │ │ +auto isNaN(const LoopSIMD< T, S, A > &v, PriorityTag< 3 >, ADLTag) │ │ │ │ │ +Definition: loop.hh:585 │ │ │ │ │ +Dune::MathOverloads::isFinite │ │ │ │ │ +auto isFinite(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag) │ │ │ │ │ +Definition: fvector.hh:584 │ │ │ │ │ +Dune::MathOverloads::isInf │ │ │ │ │ +auto isInf(const LoopSIMD< T, S, A > &v, PriorityTag< 3 >, ADLTag) │ │ │ │ │ +Definition: loop.hh:593 │ │ │ │ │ +Dune::IsNumber │ │ │ │ │ +Whether this type acts as a scalar in the context of (hierarchically blocked) │ │ │ │ │ +containers. │ │ │ │ │ +Definition: typetraits.hh:194 │ │ │ │ │ +Dune::MathOverloads::ADLTag │ │ │ │ │ +Tag to make sure the functions in this namespace can be found by ADL. │ │ │ │ │ +Definition: math.hh:230 │ │ │ │ │ +Dune::Simd::Overloads::ADLTag │ │ │ │ │ +Tag used to force late-binding lookup in Dune::Simd::Overloads. │ │ │ │ │ +Definition: base.hh:182 │ │ │ │ │ +Dune::Simd::Overloads::ScalarType │ │ │ │ │ +should have a member type type │ │ │ │ │ +Definition: standard.hh:60 │ │ │ │ │ +Dune::Simd::Overloads::RebindType │ │ │ │ │ +should have a member type type │ │ │ │ │ +Definition: standard.hh:67 │ │ │ │ │ +Dune::Simd::Overloads::LaneCount │ │ │ │ │ +should be derived from a Dune::index_constant │ │ │ │ │ +Definition: standard.hh:74 │ │ │ │ │ +Dune::LoopSIMD │ │ │ │ │ +Definition: loop.hh:64 │ │ │ │ │ +Dune::LoopSIMD::LoopSIMD │ │ │ │ │ +LoopSIMD(Simd::Scalar< T > i) │ │ │ │ │ +Definition: loop.hh:74 │ │ │ │ │ +Dune::LoopSIMD::DUNE_SIMD_LOOP_PREFIX_OP │ │ │ │ │ +DUNE_SIMD_LOOP_PREFIX_OP(++) │ │ │ │ │ +Dune::LoopSIMD::operator! │ │ │ │ │ +auto operator!() const │ │ │ │ │ +Definition: loop.hh:120 │ │ │ │ │ +Dune::LoopSIMD::DUNE_SIMD_LOOP_POSTFIX_OP │ │ │ │ │ +DUNE_SIMD_LOOP_POSTFIX_OP(--) │ │ │ │ │ +Dune::LoopSIMD::DUNE_SIMD_LOOP_ASSIGNMENT_OP │ │ │ │ │ +DUNE_SIMD_LOOP_ASSIGNMENT_OP * DUNE_SIMD_LOOP_ASSIGNMENT_OP(/ │ │ │ │ │ +=);DUNE_SIMD_LOOP_ASSIGNMENT_OP(%= │ │ │ │ │ +Dune::LoopSIMD::DUNE_SIMD_LOOP_ASSIGNMENT_OP │ │ │ │ │ +DUNE_SIMD_LOOP_ASSIGNMENT_OP & DUNE_SIMD_LOOP_ASSIGNMENT_OP │ │ │ │ │ +(|=);DUNE_SIMD_LOOP_ASSIGNMENT_OP(^= │ │ │ │ │ +Dune::LoopSIMD::DUNE_SIMD_LOOP_UNARY_OP │ │ │ │ │ +DUNE_SIMD_LOOP_UNARY_OP(-) │ │ │ │ │ +Dune::LoopSIMD::DUNE_SIMD_LOOP_PREFIX_OP │ │ │ │ │ +DUNE_SIMD_LOOP_PREFIX_OP(--) │ │ │ │ │ +Dune::LoopSIMD::DUNE_SIMD_LOOP_POSTFIX_OP │ │ │ │ │ +DUNE_SIMD_LOOP_POSTFIX_OP(++) │ │ │ │ │ +Dune::LoopSIMD::DUNE_SIMD_LOOP_ASSIGNMENT_OP │ │ │ │ │ +DUNE_SIMD_LOOP_ASSIGNMENT_OP(-=) │ │ │ │ │ +Dune::LoopSIMD::LoopSIMD │ │ │ │ │ +LoopSIMD(const LoopSIMD< T, S, OA > &other) │ │ │ │ │ +Definition: loop.hh:79 │ │ │ │ │ +Dune::LoopSIMD::LoopSIMD │ │ │ │ │ +LoopSIMD() │ │ │ │ │ +Definition: loop.hh:69 │ │ │ │ │ +Dune::LoopSIMD::DUNE_SIMD_LOOP_UNARY_OP │ │ │ │ │ +DUNE_SIMD_LOOP_UNARY_OP(~) │ │ │ │ │ +Dune::LoopSIMD::DUNE_SIMD_LOOP_ASSIGNMENT_OP │ │ │ │ │ +DUNE_SIMD_LOOP_ASSIGNMENT_OP(+=) │ │ │ │ │ +Dune::LoopSIMD::DUNE_SIMD_LOOP_UNARY_OP │ │ │ │ │ +DUNE_SIMD_LOOP_UNARY_OP(+) │ │ │ │ │ +Dune::LoopSIMD::DUNE_SIMD_LOOP_ASSIGNMENT_OP │ │ │ │ │ +DUNE_SIMD_LOOP_ASSIGNMENT_OP(<<=) │ │ │ │ │ +Dune::LoopSIMD::DUNE_SIMD_LOOP_ASSIGNMENT_OP │ │ │ │ │ +DUNE_SIMD_LOOP_ASSIGNMENT_OP(> >=) │ │ │ │ │ +Dune::Simd::Overloads::ScalarType<_LoopSIMD<_T,_S,_A_>_>::type │ │ │ │ │ +Simd::Scalar< T > type │ │ │ │ │ +Definition: loop.hh:344 │ │ │ │ │ +Dune::PriorityTag │ │ │ │ │ +Helper class for tagging priorities. │ │ │ │ │ +Definition: typeutilities.hh:73 │ │ │ │ │ +simd.hh │ │ │ │ │ +Include file for users of the SIMD abstraction layer. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00056.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: communicator.hh File Reference │ │ │ │ +dune-common: io.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,73 +58,76 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ - │ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ + │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

Provides utility classes for syncing distributed data via MPI communication. │ │ │ │ +

IO interface of the SIMD abstraction. │ │ │ │ More...

│ │ │ │ -
#include <cassert>
│ │ │ │ -#include <cstddef>
│ │ │ │ -#include <iostream>
│ │ │ │ -#include <map>
│ │ │ │ +
#include <ios>
│ │ │ │ #include <type_traits>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <mpi.h>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/common/parallel/interface.hh>
│ │ │ │ -#include <dune/common/parallel/remoteindices.hh>
│ │ │ │ -#include <dune/common/stdstreams.hh>
│ │ │ │ +#include <dune/common/rangeutilities.hh>
│ │ │ │ +#include <dune/common/simd/simd.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::SizeOne
 Flag for marking indexed data structures where data at each index is of the same size. More...
 
struct  Dune::VariableSize
 Flag for marking indexed data structures where the data at each index may be a variable multiple of another type. More...
 
struct  Dune::CommPolicy< V >
 Default policy used for communicating an indexed type. More...
 
struct  Dune::CommPolicy< V >::CommPolicy< VariableBlockVector< FieldVector< K, n >, A > >
 
class  Dune::CommPolicy< V >::CommunicationError
 Error thrown if there was a problem with the communication. More...
 
struct  Dune::CommPolicy< V >::CopyGatherScatter< T >
 GatherScatter default implementation that just copies data. More...
 
class  Dune::BufferedCommunicator
 A communicator that uses buffers to gather and scatter the data to be send or received. More...
class  Dune::SimdImpl::Inserter< T >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::SimdImpl
 
namespace  Dune::Simd
 Namespace for vectorization interface functions used by library developers.
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<class V , class = std::enable_if_t<Simd::lanes<V>() != 1>>
Inserter< V > Dune::SimdImpl::io (const V &v)
 
template<class V , class = std::enable_if_t<Simd::lanes<V>() == 1>>
Simd::Scalar< V > Dune::SimdImpl::io (const V &v)
 
IO interface

Templates and functions in this group provide syntactic sugar for IO. They are implemented using the functionality from SimdInterfaceBase, and are not customizable by implementations.

│ │ │ │ +
template<class V >
auto Dune::Simd::vio (const V &v)
 construct a stream inserter More...
 
template<class V >
auto Dune::Simd::io (const V &v)
 construct a stream inserter More...
 
│ │ │ │

Detailed Description

│ │ │ │ -

Provides utility classes for syncing distributed data via MPI communication.

│ │ │ │ -
Author
Markus Blatt
│ │ │ │ +

IO interface of the SIMD abstraction.

│ │ │ │ +

This file provides IO interface functions of the SIMD abstraction layer.

│ │ │ │ +

This file is intended for direct inclusion by header making use of the IO interface.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,61 +4,58 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -Classes | Namespaces │ │ │ │ │ -communicator.hh File Reference │ │ │ │ │ -Common » Parallel_Communication » Parallel_Computing_based_on_Indexsets │ │ │ │ │ -Provides utility classes for syncing distributed data via MPI communication. │ │ │ │ │ -More... │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * simd │ │ │ │ │ +Classes | Namespaces | Functions │ │ │ │ │ +io.hh File Reference │ │ │ │ │ +Common » Vectorization » Library_Developer's_Interface │ │ │ │ │ +IO interface of the SIMD abstraction. More... │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -struct  Dune::SizeOne │ │ │ │ │ -  Flag for marking indexed data structures where data at each index is │ │ │ │ │ - of the same size. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::VariableSize │ │ │ │ │ -  Flag for marking indexed data structures where the data at each index │ │ │ │ │ - may be a variable multiple of another type. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::CommPolicy<_V_> │ │ │ │ │ -  Default policy used for communicating an indexed type. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::CommPolicy<_V_>::CommPolicy<_VariableBlockVector<_FieldVector< │ │ │ │ │ - K,_n_>,_A_>_> │ │ │ │ │ -  │ │ │ │ │ - class  Dune::CommPolicy<_V_>::CommunicationError │ │ │ │ │ -  Error thrown if there was a problem with the communication. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::CommPolicy<_V_>::CopyGatherScatter<_T_> │ │ │ │ │ -  GatherScatter default implementation that just copies data. More... │ │ │ │ │ -  │ │ │ │ │ - class  Dune::BufferedCommunicator │ │ │ │ │ -  A communicator that uses buffers to gather and scatter the data to be │ │ │ │ │ - send or received. More... │ │ │ │ │ +class  Dune::SimdImpl::Inserter<_T_> │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ +namespace  Dune::SimdImpl │ │ │ │ │ +  │ │ │ │ │ +namespace  Dune::Simd │ │ │ │ │ +  Namespace for vectorization interface functions used by library │ │ │ │ │ + developers. │ │ │ │ │ +  │ │ │ │ │ + Functions │ │ │ │ │ +template() != 1>> │ │ │ │ │ + Inserter< V > Dune::SimdImpl::io (const V &v) │ │ │ │ │ +  │ │ │ │ │ +template() == 1>> │ │ │ │ │ +Simd::Scalar< V > Dune::SimdImpl::io (const V &v) │ │ │ │ │ +  │ │ │ │ │ +IO interface │ │ │ │ │ +Templates and functions in this group provide syntactic sugar for IO. They are │ │ │ │ │ +implemented using the functionality from SimdInterfaceBase, and are not │ │ │ │ │ +customizable by implementations. │ │ │ │ │ +template │ │ │ │ │ + auto Dune::Simd::vio (const V &v) │ │ │ │ │ +  construct a stream inserter More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::Simd::io (const V &v) │ │ │ │ │ +  construct a stream inserter More... │ │ │ │ │ +  │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -Provides utility classes for syncing distributed data via MPI communication. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ +IO interface of the SIMD abstraction. │ │ │ │ │ +This file provides IO interface functions of the SIMD abstraction layer. │ │ │ │ │ +This file is intended for direct inclusion by header making use of the IO │ │ │ │ │ +interface. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00056_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: communicator.hh Source File │ │ │ │ +dune-common: io.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,1026 +58,107 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
communicator.hh
│ │ │ │ +
io.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 (C) 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_COMMUNICATOR
│ │ │ │ -
6#define DUNE_COMMUNICATOR
│ │ │ │ -
7
│ │ │ │ -
8#if HAVE_MPI
│ │ │ │ -
9
│ │ │ │ -
10#include <cassert>
│ │ │ │ -
11#include <cstddef>
│ │ │ │ -
12#include <iostream>
│ │ │ │ -
13#include <map>
│ │ │ │ -
14#include <type_traits>
│ │ │ │ -
15#include <utility>
│ │ │ │ -
16
│ │ │ │ -
17#include <mpi.h>
│ │ │ │ +Go to the documentation of this file.
1// SPDX-FileCopyrightInfo: Copyright (C) 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_SIMD_IO_HH
│ │ │ │ +
4#define DUNE_COMMON_SIMD_IO_HH
│ │ │ │ +
5
│ │ │ │ +
16#include <ios>
│ │ │ │ +
17#include <type_traits>
│ │ │ │
18
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
23
│ │ │ │ -
24namespace Dune
│ │ │ │ -
25{
│ │ │ │ -
109 struct SizeOne
│ │ │ │ -
110 {};
│ │ │ │ -
111
│ │ │ │ - │ │ │ │ -
118 {};
│ │ │ │ -
119
│ │ │ │ -
120
│ │ │ │ -
126 template<class V>
│ │ │ │ - │ │ │ │ -
128 {
│ │ │ │ -
140 typedef V Type;
│ │ │ │ -
141
│ │ │ │ -
147 typedef typename V::value_type IndexedType;
│ │ │ │ -
148
│ │ │ │ - │ │ │ │ -
154
│ │ │ │ -
163 static const void* getAddress(const V& v, int index);
│ │ │ │ -
164
│ │ │ │ -
170 static int getSize(const V&, int index);
│ │ │ │ -
171 };
│ │ │ │ -
172
│ │ │ │ -
173 template<class K, int n> class FieldVector;
│ │ │ │ -
174
│ │ │ │ -
175 template<class B, class A> class VariableBlockVector;
│ │ │ │ -
176
│ │ │ │ -
177 template<class K, class A, int n>
│ │ │ │ - │ │ │ │ -
179 {
│ │ │ │ - │ │ │ │ -
181
│ │ │ │ -
182 typedef typename Type::B IndexedType;
│ │ │ │ -
183
│ │ │ │ - │ │ │ │ -
185
│ │ │ │ -
186 static const void* getAddress(const Type& v, int i);
│ │ │ │ -
187
│ │ │ │ -
188 static int getSize(const Type& v, int i);
│ │ │ │ -
189 };
│ │ │ │ -
190
│ │ │ │ - │ │ │ │ -
195 {};
│ │ │ │ -
196
│ │ │ │ -
200 template<class T>
│ │ │ │ - │ │ │ │ -
202 {
│ │ │ │ - │ │ │ │ -
204
│ │ │ │ -
205 static const IndexedType& gather(const T& vec, std::size_t i);
│ │ │ │ -
206
│ │ │ │ -
207 static void scatter(T& vec, const IndexedType& v, std::size_t i);
│ │ │ │ -
208
│ │ │ │ -
209 };
│ │ │ │ -
210
│ │ │ │ -
222 template<typename T>
│ │ │ │ -
223 class DatatypeCommunicator : public InterfaceBuilder
│ │ │ │ -
224 {
│ │ │ │ -
225 public:
│ │ │ │ -
226
│ │ │ │ -
230 typedef T ParallelIndexSet;
│ │ │ │ -
231
│ │ │ │ - │ │ │ │ -
236
│ │ │ │ -
240 typedef typename RemoteIndices::GlobalIndex GlobalIndex;
│ │ │ │ -
241
│ │ │ │ -
245 typedef typename RemoteIndices::Attribute Attribute;
│ │ │ │ -
246
│ │ │ │ -
250 typedef typename RemoteIndices::LocalIndex LocalIndex;
│ │ │ │ -
251
│ │ │ │ -
255 DatatypeCommunicator();
│ │ │ │ -
256
│ │ │ │ -
260 ~DatatypeCommunicator();
│ │ │ │ -
261
│ │ │ │ -
288 template<class T1, class T2, class V>
│ │ │ │ -
289 void build(const RemoteIndices& remoteIndices, const T1& sourceFlags, V& sendData, const T2& destFlags, V& receiveData);
│ │ │ │ -
290
│ │ │ │ -
294 void forward();
│ │ │ │ -
295
│ │ │ │ -
299 void backward();
│ │ │ │ -
300
│ │ │ │ -
304 void free();
│ │ │ │ -
305 private:
│ │ │ │ -
309 constexpr static int commTag_ = 234;
│ │ │ │ -
310
│ │ │ │ -
314 const RemoteIndices* remoteIndices_;
│ │ │ │ -
315
│ │ │ │ -
316 typedef std::map<int,std::pair<MPI_Datatype,MPI_Datatype> >
│ │ │ │ -
317 MessageTypeMap;
│ │ │ │ -
318
│ │ │ │ -
322 MessageTypeMap messageTypes;
│ │ │ │ -
323
│ │ │ │ -
327 void* data_;
│ │ │ │ -
328
│ │ │ │ -
329 MPI_Request* requests_[2];
│ │ │ │ -
330
│ │ │ │ -
334 bool created_;
│ │ │ │ -
335
│ │ │ │ -
339 template<class V, bool FORWARD>
│ │ │ │ -
340 void createRequests(V& sendData, V& receiveData);
│ │ │ │ -
341
│ │ │ │ -
345 template<class T1, class T2, class V, bool send>
│ │ │ │ -
346 void createDataTypes(const T1& source, const T2& destination, V& data);
│ │ │ │ -
347
│ │ │ │ -
351 void sendRecv(MPI_Request* req);
│ │ │ │ -
352
│ │ │ │ -
356 struct IndexedTypeInformation
│ │ │ │ -
357 {
│ │ │ │ -
363 void build(int i)
│ │ │ │ -
364 {
│ │ │ │ -
365 length = new int[i];
│ │ │ │ -
366 displ = new MPI_Aint[i];
│ │ │ │ -
367 size = i;
│ │ │ │ -
368 }
│ │ │ │ -
369
│ │ │ │ -
373 void free()
│ │ │ │ -
374 {
│ │ │ │ -
375 delete[] length;
│ │ │ │ -
376 delete[] displ;
│ │ │ │ -
377 }
│ │ │ │ -
379 int* length;
│ │ │ │ -
381 MPI_Aint* displ;
│ │ │ │ -
387 int elements;
│ │ │ │ -
391 int size;
│ │ │ │ -
392 };
│ │ │ │ -
393
│ │ │ │ -
399 template<class V>
│ │ │ │ -
400 struct MPIDatatypeInformation
│ │ │ │ -
401 {
│ │ │ │ -
406 MPIDatatypeInformation(const V& data) : data_(data)
│ │ │ │ -
407 {}
│ │ │ │ -
408
│ │ │ │ -
414 void reserve(int proc, int size)
│ │ │ │ -
415 {
│ │ │ │ -
416 information_[proc].build(size);
│ │ │ │ -
417 }
│ │ │ │ -
424 void add(int proc, int local)
│ │ │ │ -
425 {
│ │ │ │ -
426 IndexedTypeInformation& info=information_[proc];
│ │ │ │ -
427 assert((info.elements)<info.size);
│ │ │ │ -
428 MPI_Get_address( const_cast<void*>(CommPolicy<V>::getAddress(data_, local)),
│ │ │ │ -
429 info.displ+info.elements);
│ │ │ │ -
430 info.length[info.elements]=CommPolicy<V>::getSize(data_, local);
│ │ │ │ -
431 info.elements++;
│ │ │ │ -
432 }
│ │ │ │ -
433
│ │ │ │ -
438 std::map<int,IndexedTypeInformation> information_;
│ │ │ │ -
442 const V& data_;
│ │ │ │ -
443
│ │ │ │ -
444 };
│ │ │ │ -
445
│ │ │ │ -
446 };
│ │ │ │ -
447
│ │ │ │ - │ │ │ │ -
458 {
│ │ │ │ -
459
│ │ │ │ -
460 public:
│ │ │ │ - │ │ │ │ -
465
│ │ │ │ -
472 template<class Data, class Interface>
│ │ │ │ -
473 typename std::enable_if<std::is_same<SizeOne,typename CommPolicy<Data>::IndexedTypeFlag>::value, void>::type
│ │ │ │ -
474 build(const Interface& interface);
│ │ │ │ -
475
│ │ │ │ -
483 template<class Data, class Interface>
│ │ │ │ -
484 void build(const Data& source, const Data& target, const Interface& interface);
│ │ │ │ -
485
│ │ │ │ -
514 template<class GatherScatter, class Data>
│ │ │ │ -
515 void forward(const Data& source, Data& dest);
│ │ │ │ -
516
│ │ │ │ -
545 template<class GatherScatter, class Data>
│ │ │ │ -
546 void backward(Data& source, const Data& dest);
│ │ │ │ -
547
│ │ │ │ -
573 template<class GatherScatter, class Data>
│ │ │ │ -
574 void forward(Data& data);
│ │ │ │ -
575
│ │ │ │ -
601 template<class GatherScatter, class Data>
│ │ │ │ -
602 void backward(Data& data);
│ │ │ │ -
603
│ │ │ │ -
607 void free();
│ │ │ │ -
608
│ │ │ │ - │ │ │ │ -
613
│ │ │ │ -
614 private:
│ │ │ │ -
615
│ │ │ │ -
619 typedef std::map<int,std::pair<InterfaceInformation,InterfaceInformation> >
│ │ │ │ -
620 InterfaceMap;
│ │ │ │ -
621
│ │ │ │ -
622
│ │ │ │ -
626 template<class Data, typename IndexedTypeFlag>
│ │ │ │ -
627 struct MessageSizeCalculator
│ │ │ │ -
628 {};
│ │ │ │ -
629
│ │ │ │ -
634 template<class Data>
│ │ │ │ -
635 struct MessageSizeCalculator<Data,SizeOne>
│ │ │ │ -
636 {
│ │ │ │ -
643 inline int operator()(const InterfaceInformation& info) const;
│ │ │ │ -
652 inline int operator()(const Data& data, const InterfaceInformation& info) const;
│ │ │ │ -
653 };
│ │ │ │ -
654
│ │ │ │ -
659 template<class Data>
│ │ │ │ -
660 struct MessageSizeCalculator<Data,VariableSize>
│ │ │ │ -
661 {
│ │ │ │ -
670 inline int operator()(const Data& data, const InterfaceInformation& info) const;
│ │ │ │ -
671 };
│ │ │ │ -
672
│ │ │ │ -
676 template<class Data, class GatherScatter, bool send, typename IndexedTypeFlag>
│ │ │ │ -
677 struct MessageGatherer
│ │ │ │ -
678 {};
│ │ │ │ -
679
│ │ │ │ -
684 template<class Data, class GatherScatter, bool send>
│ │ │ │ -
685 struct MessageGatherer<Data,GatherScatter,send,SizeOne>
│ │ │ │ -
686 {
│ │ │ │ -
688 typedef typename CommPolicy<Data>::IndexedType Type;
│ │ │ │ -
689
│ │ │ │ -
694 typedef GatherScatter Gatherer;
│ │ │ │ -
695
│ │ │ │ -
701 constexpr static bool forward = send;
│ │ │ │ -
702
│ │ │ │ -
710 inline void operator()(const InterfaceMap& interface, const Data& data, Type* buffer, size_t bufferSize) const;
│ │ │ │ -
711 };
│ │ │ │ -
712
│ │ │ │ -
717 template<class Data, class GatherScatter, bool send>
│ │ │ │ -
718 struct MessageGatherer<Data,GatherScatter,send,VariableSize>
│ │ │ │ -
719 {
│ │ │ │ -
721 typedef typename CommPolicy<Data>::IndexedType Type;
│ │ │ │ -
722
│ │ │ │ -
727 typedef GatherScatter Gatherer;
│ │ │ │ -
728
│ │ │ │ -
734 constexpr static bool forward = send;
│ │ │ │ -
735
│ │ │ │ -
743 inline void operator()(const InterfaceMap& interface, const Data& data, Type* buffer, size_t bufferSize) const;
│ │ │ │ -
744 };
│ │ │ │ -
745
│ │ │ │ -
749 template<class Data, class GatherScatter, bool send, typename IndexedTypeFlag>
│ │ │ │ -
750 struct MessageScatterer
│ │ │ │ -
751 {};
│ │ │ │ -
752
│ │ │ │ -
757 template<class Data, class GatherScatter, bool send>
│ │ │ │ -
758 struct MessageScatterer<Data,GatherScatter,send,SizeOne>
│ │ │ │ -
759 {
│ │ │ │ -
761 typedef typename CommPolicy<Data>::IndexedType Type;
│ │ │ │ -
762
│ │ │ │ -
767 typedef GatherScatter Scatterer;
│ │ │ │ -
768
│ │ │ │ -
774 constexpr static bool forward = send;
│ │ │ │ -
775
│ │ │ │ -
783 inline void operator()(const InterfaceMap& interface, Data& data, Type* buffer, const int& proc) const;
│ │ │ │ -
784 };
│ │ │ │ -
789 template<class Data, class GatherScatter, bool send>
│ │ │ │ -
790 struct MessageScatterer<Data,GatherScatter,send,VariableSize>
│ │ │ │ -
791 {
│ │ │ │ -
793 typedef typename CommPolicy<Data>::IndexedType Type;
│ │ │ │ -
794
│ │ │ │ -
799 typedef GatherScatter Scatterer;
│ │ │ │ -
800
│ │ │ │ -
806 constexpr static bool forward = send;
│ │ │ │ -
807
│ │ │ │ -
815 inline void operator()(const InterfaceMap& interface, Data& data, Type* buffer, const int& proc) const;
│ │ │ │ -
816 };
│ │ │ │ -
817
│ │ │ │ -
821 struct MessageInformation
│ │ │ │ -
822 {
│ │ │ │ -
824 MessageInformation()
│ │ │ │ -
825 : start_(0), size_(0)
│ │ │ │ -
826 {}
│ │ │ │ -
827
│ │ │ │ -
835 MessageInformation(size_t start, size_t size)
│ │ │ │ -
836 : start_(start), size_(size)
│ │ │ │ -
837 {}
│ │ │ │ -
841 size_t start_;
│ │ │ │ -
845 size_t size_;
│ │ │ │ -
846 };
│ │ │ │ -
847
│ │ │ │ -
854 typedef std::map<int,std::pair<MessageInformation,MessageInformation> >
│ │ │ │ -
855 InformationMap;
│ │ │ │ -
859 InformationMap messageInformation_;
│ │ │ │ -
863 char* buffers_[2];
│ │ │ │ -
867 size_t bufferSize_[2];
│ │ │ │ -
868
│ │ │ │ -
872 constexpr static int commTag_ = 0;
│ │ │ │ -
873
│ │ │ │ -
877 std::map<int,std::pair<InterfaceInformation,InterfaceInformation> > interfaces_;
│ │ │ │ -
878
│ │ │ │ -
879 MPI_Comm communicator_;
│ │ │ │ -
880
│ │ │ │ -
884 template<class GatherScatter, bool FORWARD, class Data>
│ │ │ │ -
885 void sendRecv(const Data& source, Data& target);
│ │ │ │ -
886
│ │ │ │ -
887 };
│ │ │ │ -
888
│ │ │ │ -
889#ifndef DOXYGEN
│ │ │ │ -
890
│ │ │ │ -
891 template<class V>
│ │ │ │ -
892 inline const void* CommPolicy<V>::getAddress(const V& v, int index)
│ │ │ │ -
893 {
│ │ │ │ -
894 return &(v[index]);
│ │ │ │ -
895 }
│ │ │ │ -
896
│ │ │ │ -
897 template<class V>
│ │ │ │ -
898 inline int CommPolicy<V>::getSize([[maybe_unused]] const V& v, [[maybe_unused]] int index)
│ │ │ │ -
899 {
│ │ │ │ -
900 return 1;
│ │ │ │ -
901 }
│ │ │ │ -
902
│ │ │ │ -
903 template<class K, class A, int n>
│ │ │ │ -
904 inline const void* CommPolicy<VariableBlockVector<FieldVector<K, n>, A> >::getAddress(const Type& v, int index)
│ │ │ │ -
905 {
│ │ │ │ -
906 return &(v[index][0]);
│ │ │ │ -
907 }
│ │ │ │ -
908
│ │ │ │ -
909 template<class K, class A, int n>
│ │ │ │ -
910 inline int CommPolicy<VariableBlockVector<FieldVector<K, n>, A> >::getSize(const Type& v, int index)
│ │ │ │ -
911 {
│ │ │ │ -
912 return v[index].getsize();
│ │ │ │ -
913 }
│ │ │ │ -
914
│ │ │ │ -
915 template<class T>
│ │ │ │ -
916 inline const typename CopyGatherScatter<T>::IndexedType& CopyGatherScatter<T>::gather(const T & vec, std::size_t i)
│ │ │ │ -
917 {
│ │ │ │ -
918 return vec[i];
│ │ │ │ -
919 }
│ │ │ │ -
920
│ │ │ │ -
921 template<class T>
│ │ │ │ -
922 inline void CopyGatherScatter<T>::scatter(T& vec, const IndexedType& v, std::size_t i)
│ │ │ │ -
923 {
│ │ │ │ -
924 vec[i]=v;
│ │ │ │ -
925 }
│ │ │ │ -
926
│ │ │ │ -
927 template<typename T>
│ │ │ │ -
928 DatatypeCommunicator<T>::DatatypeCommunicator()
│ │ │ │ -
929 : remoteIndices_(0), created_(false)
│ │ │ │ -
930 {
│ │ │ │ -
931 requests_[0]=0;
│ │ │ │ -
932 requests_[1]=0;
│ │ │ │ -
933 }
│ │ │ │ -
934
│ │ │ │ -
935
│ │ │ │ -
936
│ │ │ │ -
937 template<typename T>
│ │ │ │ -
938 DatatypeCommunicator<T>::~DatatypeCommunicator()
│ │ │ │ -
939 {
│ │ │ │ -
940 free();
│ │ │ │ -
941 }
│ │ │ │ -
942
│ │ │ │ -
943 template<typename T>
│ │ │ │ -
944 template<class T1, class T2, class V>
│ │ │ │ -
945 inline void DatatypeCommunicator<T>::build(const RemoteIndices& remoteIndices,
│ │ │ │ -
946 const T1& source, V& sendData,
│ │ │ │ -
947 const T2& destination, V& receiveData)
│ │ │ │ -
948 {
│ │ │ │ -
949 remoteIndices_ = &remoteIndices;
│ │ │ │ -
950 free();
│ │ │ │ -
951 createDataTypes<T1,T2,V,false>(source,destination, receiveData);
│ │ │ │ -
952 createDataTypes<T1,T2,V,true>(source,destination, sendData);
│ │ │ │ -
953 createRequests<V,true>(sendData, receiveData);
│ │ │ │ -
954 createRequests<V,false>(receiveData, sendData);
│ │ │ │ -
955 created_=true;
│ │ │ │ -
956 }
│ │ │ │ -
957
│ │ │ │ -
958 template<typename T>
│ │ │ │ -
959 void DatatypeCommunicator<T>::free()
│ │ │ │ -
960 {
│ │ │ │ -
961 if(created_) {
│ │ │ │ -
962 delete[] requests_[0];
│ │ │ │ -
963 delete[] requests_[1];
│ │ │ │ -
964 typedef MessageTypeMap::iterator iterator;
│ │ │ │ -
965 typedef MessageTypeMap::const_iterator const_iterator;
│ │ │ │ -
966
│ │ │ │ -
967 const const_iterator end=messageTypes.end();
│ │ │ │ -
968
│ │ │ │ -
969 for(iterator process = messageTypes.begin(); process != end; ++process) {
│ │ │ │ -
970 MPI_Datatype *type = &(process->second.first);
│ │ │ │ -
971 int finalized=0;
│ │ │ │ -
972 MPI_Finalized(&finalized);
│ │ │ │ -
973 if(*type!=MPI_DATATYPE_NULL && !finalized)
│ │ │ │ -
974 MPI_Type_free(type);
│ │ │ │ -
975 type = &(process->second.second);
│ │ │ │ -
976 if(*type!=MPI_DATATYPE_NULL && !finalized)
│ │ │ │ -
977 MPI_Type_free(type);
│ │ │ │ -
978 }
│ │ │ │ -
979 messageTypes.clear();
│ │ │ │ -
980 created_=false;
│ │ │ │ -
981 }
│ │ │ │ -
982
│ │ │ │ -
983 }
│ │ │ │ -
984
│ │ │ │ -
985 template<typename T>
│ │ │ │ -
986 template<class T1, class T2, class V, bool send>
│ │ │ │ -
987 void DatatypeCommunicator<T>::createDataTypes(const T1& sourceFlags, const T2& destFlags, V& data)
│ │ │ │ -
988 {
│ │ │ │ -
989
│ │ │ │ -
990 MPIDatatypeInformation<V> dataInfo(data);
│ │ │ │ -
991 this->template buildInterface<RemoteIndices,T1,T2,MPIDatatypeInformation<V>,send>(*remoteIndices_,sourceFlags, destFlags, dataInfo);
│ │ │ │ -
992
│ │ │ │ -
993 typedef typename RemoteIndices::RemoteIndexMap::const_iterator const_iterator;
│ │ │ │ -
994 const const_iterator end=this->remoteIndices_->end();
│ │ │ │ -
995
│ │ │ │ -
996 // Allocate MPI_Datatypes and deallocate memory for the type construction.
│ │ │ │ -
997 for(const_iterator process=this->remoteIndices_->begin(); process != end; ++process) {
│ │ │ │ -
998 IndexedTypeInformation& info=dataInfo.information_[process->first];
│ │ │ │ -
999 // Shift the displacement
│ │ │ │ -
1000 MPI_Aint base;
│ │ │ │ -
1001 MPI_Get_address(const_cast<void *>(CommPolicy<V>::getAddress(data, 0)), &base);
│ │ │ │ -
1002
│ │ │ │ -
1003 for(int i=0; i< info.elements; i++) {
│ │ │ │ -
1004 info.displ[i]-=base;
│ │ │ │ -
1005 }
│ │ │ │ -
1006
│ │ │ │ -
1007 // Create data type
│ │ │ │ -
1008 MPI_Datatype* type = &( send ? messageTypes[process->first].first : messageTypes[process->first].second);
│ │ │ │ -
1009 MPI_Type_create_hindexed(info.elements, info.length, info.displ,
│ │ │ │ -
1010 MPITraits<typename CommPolicy<V>::IndexedType>::getType(), type);
│ │ │ │ -
1011 MPI_Type_commit(type);
│ │ │ │ -
1012 // Deallocate memory
│ │ │ │ -
1013 info.free();
│ │ │ │ -
1014 }
│ │ │ │ -
1015 }
│ │ │ │ -
1016
│ │ │ │ -
1017 template<typename T>
│ │ │ │ -
1018 template<class V, bool createForward>
│ │ │ │ -
1019 void DatatypeCommunicator<T>::createRequests(V& sendData, V& receiveData)
│ │ │ │ -
1020 {
│ │ │ │ -
1021 typedef std::map<int,std::pair<MPI_Datatype,MPI_Datatype> >::const_iterator MapIterator;
│ │ │ │ -
1022 int rank;
│ │ │ │ -
1023 static int index = createForward ? 1 : 0;
│ │ │ │ -
1024 int noMessages = messageTypes.size();
│ │ │ │ -
1025 // allocate request handles
│ │ │ │ -
1026 requests_[index] = new MPI_Request[2*noMessages];
│ │ │ │ -
1027 const MapIterator end = messageTypes.end();
│ │ │ │ -
1028 int request=0;
│ │ │ │ -
1029 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
│ │ │ │ -
1030
│ │ │ │ -
1031 // Set up the requests for receiving first
│ │ │ │ -
1032 for(MapIterator process = messageTypes.begin(); process != end;
│ │ │ │ -
1033 ++process, ++request) {
│ │ │ │ -
1034 MPI_Datatype type = createForward ? process->second.second : process->second.first;
│ │ │ │ -
1035 void* address = const_cast<void*>(CommPolicy<V>::getAddress(receiveData,0));
│ │ │ │ -
1036 MPI_Recv_init(address, 1, type, process->first, commTag_, this->remoteIndices_->communicator(), requests_[index]+request);
│ │ │ │ -
1037 }
│ │ │ │ -
1038
│ │ │ │ -
1039 // And now the send requests
│ │ │ │ -
1040
│ │ │ │ -
1041 for(MapIterator process = messageTypes.begin(); process != end;
│ │ │ │ -
1042 ++process, ++request) {
│ │ │ │ -
1043 MPI_Datatype type = createForward ? process->second.first : process->second.second;
│ │ │ │ -
1044 void* address = const_cast<void*>(CommPolicy<V>::getAddress(sendData, 0));
│ │ │ │ -
1045 MPI_Ssend_init(address, 1, type, process->first, commTag_, this->remoteIndices_->communicator(), requests_[index]+request);
│ │ │ │ -
1046 }
│ │ │ │ -
1047 }
│ │ │ │ -
1048
│ │ │ │ -
1049 template<typename T>
│ │ │ │ -
1050 void DatatypeCommunicator<T>::forward()
│ │ │ │ -
1051 {
│ │ │ │ -
1052 sendRecv(requests_[1]);
│ │ │ │ -
1053 }
│ │ │ │ -
1054
│ │ │ │ -
1055 template<typename T>
│ │ │ │ -
1056 void DatatypeCommunicator<T>::backward()
│ │ │ │ -
1057 {
│ │ │ │ -
1058 sendRecv(requests_[0]);
│ │ │ │ -
1059 }
│ │ │ │ -
1060
│ │ │ │ -
1061 template<typename T>
│ │ │ │ -
1062 void DatatypeCommunicator<T>::sendRecv(MPI_Request* requests)
│ │ │ │ -
1063 {
│ │ │ │ -
1064 int noMessages = messageTypes.size();
│ │ │ │ -
1065 // Start the receive calls first
│ │ │ │ -
1066 MPI_Startall(noMessages, requests);
│ │ │ │ -
1067 // Now the send calls
│ │ │ │ -
1068 MPI_Startall(noMessages, requests+noMessages);
│ │ │ │ -
1069
│ │ │ │ -
1070 // Wait for completion of the communication send first then receive
│ │ │ │ -
1071 MPI_Status* status=new MPI_Status[2*noMessages];
│ │ │ │ -
1072 for(int i=0; i<2*noMessages; i++)
│ │ │ │ -
1073 status[i].MPI_ERROR=MPI_SUCCESS;
│ │ │ │ -
1074
│ │ │ │ -
1075 int send = MPI_Waitall(noMessages, requests+noMessages, status+noMessages);
│ │ │ │ -
1076 int receive = MPI_Waitall(noMessages, requests, status);
│ │ │ │ -
1077
│ │ │ │ -
1078 // Error checks
│ │ │ │ -
1079 int success=1, globalSuccess=0;
│ │ │ │ -
1080 if(send==MPI_ERR_IN_STATUS) {
│ │ │ │ -
1081 int rank;
│ │ │ │ -
1082 MPI_Comm_rank(this->remoteIndices_->communicator(), &rank);
│ │ │ │ -
1083 std::cerr<<rank<<": Error in sending :"<<std::endl;
│ │ │ │ -
1084 // Search for the error
│ │ │ │ -
1085 for(int i=noMessages; i< 2*noMessages; i++)
│ │ │ │ -
1086 if(status[i].MPI_ERROR!=MPI_SUCCESS) {
│ │ │ │ -
1087 char message[300];
│ │ │ │ -
1088 int messageLength;
│ │ │ │ -
1089 MPI_Error_string(status[i].MPI_ERROR, message, &messageLength);
│ │ │ │ -
1090 std::cerr<<" source="<<status[i].MPI_SOURCE<<" message: ";
│ │ │ │ -
1091 for(int j = 0; j < messageLength; j++)
│ │ │ │ -
1092 std::cout << message[j];
│ │ │ │ -
1093 }
│ │ │ │ -
1094 std::cerr<<std::endl;
│ │ │ │ -
1095 success=0;
│ │ │ │ -
1096 }
│ │ │ │ -
1097
│ │ │ │ -
1098 if(receive==MPI_ERR_IN_STATUS) {
│ │ │ │ -
1099 int rank;
│ │ │ │ -
1100 MPI_Comm_rank(this->remoteIndices_->communicator(), &rank);
│ │ │ │ -
1101 std::cerr<<rank<<": Error in receiving!"<<std::endl;
│ │ │ │ -
1102 // Search for the error
│ │ │ │ -
1103 for(int i=0; i< noMessages; i++)
│ │ │ │ -
1104 if(status[i].MPI_ERROR!=MPI_SUCCESS) {
│ │ │ │ -
1105 char message[300];
│ │ │ │ -
1106 int messageLength;
│ │ │ │ -
1107 MPI_Error_string(status[i].MPI_ERROR, message, &messageLength);
│ │ │ │ -
1108 std::cerr<<" source="<<status[i].MPI_SOURCE<<" message: ";
│ │ │ │ -
1109 for(int j = 0; j < messageLength; j++)
│ │ │ │ -
1110 std::cerr << message[j];
│ │ │ │ -
1111 }
│ │ │ │ -
1112 std::cerr<<std::endl;
│ │ │ │ -
1113 success=0;
│ │ │ │ -
1114 }
│ │ │ │ -
1115
│ │ │ │ -
1116 MPI_Allreduce(&success, &globalSuccess, 1, MPI_INT, MPI_MIN, this->remoteIndices_->communicator());
│ │ │ │ -
1117
│ │ │ │ -
1118 delete[] status;
│ │ │ │ -
1119
│ │ │ │ -
1120 if(!globalSuccess)
│ │ │ │ -
1121 DUNE_THROW(CommunicationError, "A communication error occurred!");
│ │ │ │ -
1122
│ │ │ │ -
1123 }
│ │ │ │ -
1124
│ │ │ │ - │ │ │ │ -
1126 {
│ │ │ │ -
1127 buffers_[0]=0;
│ │ │ │ -
1128 buffers_[1]=0;
│ │ │ │ -
1129 bufferSize_[0]=0;
│ │ │ │ -
1130 bufferSize_[1]=0;
│ │ │ │ -
1131 }
│ │ │ │ -
1132
│ │ │ │ -
1133 template<class Data, class Interface>
│ │ │ │ -
1134 typename std::enable_if<std::is_same<SizeOne, typename CommPolicy<Data>::IndexedTypeFlag>::value, void>::type
│ │ │ │ -
1135 BufferedCommunicator::build(const Interface& interface)
│ │ │ │ -
1136 {
│ │ │ │ -
1137 interfaces_=interface.interfaces();
│ │ │ │ -
1138 communicator_=interface.communicator();
│ │ │ │ -
1139 typedef typename std::map<int,std::pair<InterfaceInformation,InterfaceInformation> >
│ │ │ │ -
1140 ::const_iterator const_iterator;
│ │ │ │ -
1141 typedef typename CommPolicy<Data>::IndexedTypeFlag Flag;
│ │ │ │ -
1142 const const_iterator end = interfaces_.end();
│ │ │ │ -
1143 int lrank;
│ │ │ │ -
1144 MPI_Comm_rank(communicator_, &lrank);
│ │ │ │ -
1145
│ │ │ │ -
1146 bufferSize_[0]=0;
│ │ │ │ -
1147 bufferSize_[1]=0;
│ │ │ │ -
1148
│ │ │ │ -
1149 for(const_iterator interfacePair = interfaces_.begin();
│ │ │ │ -
1150 interfacePair != end; ++interfacePair) {
│ │ │ │ -
1151 int noSend = MessageSizeCalculator<Data,Flag>() (interfacePair->second.first);
│ │ │ │ -
1152 int noRecv = MessageSizeCalculator<Data,Flag>() (interfacePair->second.second);
│ │ │ │ -
1153 if (noSend + noRecv > 0)
│ │ │ │ -
1154 messageInformation_.insert(std::make_pair(interfacePair->first,
│ │ │ │ -
1155 std::make_pair(MessageInformation(bufferSize_[0],
│ │ │ │ -
1156 noSend*sizeof(typename CommPolicy<Data>::IndexedType)),
│ │ │ │ -
1157 MessageInformation(bufferSize_[1],
│ │ │ │ -
1158 noRecv*sizeof(typename CommPolicy<Data>::IndexedType)))));
│ │ │ │ -
1159 bufferSize_[0] += noSend;
│ │ │ │ -
1160 bufferSize_[1] += noRecv;
│ │ │ │ -
1161 }
│ │ │ │ -
1162
│ │ │ │ -
1163 // allocate the buffers
│ │ │ │ -
1164 bufferSize_[0] *= sizeof(typename CommPolicy<Data>::IndexedType);
│ │ │ │ -
1165 bufferSize_[1] *= sizeof(typename CommPolicy<Data>::IndexedType);
│ │ │ │ -
1166
│ │ │ │ -
1167 buffers_[0] = new char[bufferSize_[0]];
│ │ │ │ -
1168 buffers_[1] = new char[bufferSize_[1]];
│ │ │ │ -
1169 }
│ │ │ │ -
1170
│ │ │ │ -
1171 template<class Data, class Interface>
│ │ │ │ -
1172 void BufferedCommunicator::build(const Data& source, const Data& dest, const Interface& interface)
│ │ │ │ -
1173 {
│ │ │ │ -
1174
│ │ │ │ -
1175 interfaces_=interface.interfaces();
│ │ │ │ -
1176 communicator_=interface.communicator();
│ │ │ │ -
1177 typedef typename std::map<int,std::pair<InterfaceInformation,InterfaceInformation> >
│ │ │ │ -
1178 ::const_iterator const_iterator;
│ │ │ │ -
1179 typedef typename CommPolicy<Data>::IndexedTypeFlag Flag;
│ │ │ │ -
1180 const const_iterator end = interfaces_.end();
│ │ │ │ -
1181
│ │ │ │ -
1182 bufferSize_[0]=0;
│ │ │ │ -
1183 bufferSize_[1]=0;
│ │ │ │ -
1184
│ │ │ │ -
1185 for(const_iterator interfacePair = interfaces_.begin();
│ │ │ │ -
1186 interfacePair != end; ++interfacePair) {
│ │ │ │ -
1187 int noSend = MessageSizeCalculator<Data,Flag>() (source, interfacePair->second.first);
│ │ │ │ -
1188 int noRecv = MessageSizeCalculator<Data,Flag>() (dest, interfacePair->second.second);
│ │ │ │ -
1189 if (noSend + noRecv > 0)
│ │ │ │ -
1190 messageInformation_.insert(std::make_pair(interfacePair->first,
│ │ │ │ -
1191 std::make_pair(MessageInformation(bufferSize_[0],
│ │ │ │ -
1192 noSend*sizeof(typename CommPolicy<Data>::IndexedType)),
│ │ │ │ -
1193 MessageInformation(bufferSize_[1],
│ │ │ │ -
1194 noRecv*sizeof(typename CommPolicy<Data>::IndexedType)))));
│ │ │ │ -
1195 bufferSize_[0] += noSend;
│ │ │ │ -
1196 bufferSize_[1] += noRecv;
│ │ │ │ -
1197 }
│ │ │ │ -
1198
│ │ │ │ -
1199 bufferSize_[0] *= sizeof(typename CommPolicy<Data>::IndexedType);
│ │ │ │ -
1200 bufferSize_[1] *= sizeof(typename CommPolicy<Data>::IndexedType);
│ │ │ │ -
1201 // allocate the buffers
│ │ │ │ -
1202 buffers_[0] = new char[bufferSize_[0]];
│ │ │ │ -
1203 buffers_[1] = new char[bufferSize_[1]];
│ │ │ │ -
1204 }
│ │ │ │ -
1205
│ │ │ │ -
1206 inline void BufferedCommunicator::free()
│ │ │ │ -
1207 {
│ │ │ │ -
1208 messageInformation_.clear();
│ │ │ │ -
1209 if(buffers_[0])
│ │ │ │ -
1210 delete[] buffers_[0];
│ │ │ │ -
1211
│ │ │ │ -
1212 if(buffers_[1])
│ │ │ │ -
1213 delete[] buffers_[1];
│ │ │ │ -
1214 buffers_[0]=buffers_[1]=0;
│ │ │ │ -
1215 }
│ │ │ │ -
1216
│ │ │ │ - │ │ │ │ -
1218 {
│ │ │ │ -
1219 free();
│ │ │ │ -
1220 }
│ │ │ │ -
1221
│ │ │ │ -
1222 template<class Data>
│ │ │ │ -
1223 inline int BufferedCommunicator::MessageSizeCalculator<Data,SizeOne>::operator()
│ │ │ │ -
1224 (const InterfaceInformation& info) const
│ │ │ │ -
1225 {
│ │ │ │ -
1226 return info.size();
│ │ │ │ -
1227 }
│ │ │ │ -
1228
│ │ │ │ -
1229
│ │ │ │ -
1230 template<class Data>
│ │ │ │ -
1231 inline int BufferedCommunicator::MessageSizeCalculator<Data,SizeOne>::operator()
│ │ │ │ -
1232 (const Data&, const InterfaceInformation& info) const
│ │ │ │ -
1233 {
│ │ │ │ -
1234 return operator()(info);
│ │ │ │ -
1235 }
│ │ │ │ -
1236
│ │ │ │ -
1237
│ │ │ │ -
1238 template<class Data>
│ │ │ │ -
1239 inline int BufferedCommunicator::MessageSizeCalculator<Data, VariableSize>::operator()
│ │ │ │ -
1240 (const Data& data, const InterfaceInformation& info) const
│ │ │ │ -
1241 {
│ │ │ │ -
1242 int entries=0;
│ │ │ │ -
1243
│ │ │ │ -
1244 for(size_t i=0; i < info.size(); i++)
│ │ │ │ -
1245 entries += CommPolicy<Data>::getSize(data,info[i]);
│ │ │ │ -
1246
│ │ │ │ -
1247 return entries;
│ │ │ │ -
1248 }
│ │ │ │ -
1249
│ │ │ │ -
1250
│ │ │ │ -
1251 template<class Data, class GatherScatter, bool FORWARD>
│ │ │ │ -
1252 inline void BufferedCommunicator::MessageGatherer<Data,GatherScatter,FORWARD,VariableSize>::operator()(const InterfaceMap& interfaces,const Data& data, Type* buffer, [[maybe_unused]] size_t bufferSize) const
│ │ │ │ -
1253 {
│ │ │ │ -
1254 typedef typename InterfaceMap::const_iterator
│ │ │ │ -
1255 const_iterator;
│ │ │ │ -
1256
│ │ │ │ -
1257 int rank;
│ │ │ │ -
1258 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
│ │ │ │ -
1259 const const_iterator end = interfaces.end();
│ │ │ │ -
1260 size_t index=0;
│ │ │ │ -
1261
│ │ │ │ -
1262 for(const_iterator interfacePair = interfaces.begin();
│ │ │ │ -
1263 interfacePair != end; ++interfacePair) {
│ │ │ │ -
1264 int size = forward ? interfacePair->second.first.size() :
│ │ │ │ -
1265 interfacePair->second.second.size();
│ │ │ │ -
1266
│ │ │ │ -
1267 for(int i=0; i < size; i++) {
│ │ │ │ -
1268 int local = forward ? interfacePair->second.first[i] :
│ │ │ │ -
1269 interfacePair->second.second[i];
│ │ │ │ -
1270 for(std::size_t j=0; j < CommPolicy<Data>::getSize(data, local); j++, index++) {
│ │ │ │ -
1271
│ │ │ │ -
1272#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1273 assert(bufferSize>=(index+1)*sizeof(typename CommPolicy<Data>::IndexedType));
│ │ │ │ -
1274#endif
│ │ │ │ -
1275 buffer[index]=GatherScatter::gather(data, local, j);
│ │ │ │ -
1276 }
│ │ │ │ -
1277
│ │ │ │ -
1278 }
│ │ │ │ -
1279 }
│ │ │ │ -
1280
│ │ │ │ -
1281 }
│ │ │ │ -
1282
│ │ │ │ -
1283
│ │ │ │ -
1284 template<class Data, class GatherScatter, bool FORWARD>
│ │ │ │ -
1285 inline void BufferedCommunicator::MessageGatherer<Data,GatherScatter,FORWARD,SizeOne>::operator()(
│ │ │ │ -
1286 const InterfaceMap& interfaces, const Data& data, Type* buffer, [[maybe_unused]] size_t bufferSize) const
│ │ │ │ -
1287 {
│ │ │ │ -
1288 typedef typename InterfaceMap::const_iterator
│ │ │ │ -
1289 const_iterator;
│ │ │ │ -
1290 const const_iterator end = interfaces.end();
│ │ │ │ -
1291 size_t index = 0;
│ │ │ │ -
1292
│ │ │ │ -
1293 int rank;
│ │ │ │ -
1294 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
│ │ │ │ -
1295
│ │ │ │ -
1296 for(const_iterator interfacePair = interfaces.begin();
│ │ │ │ -
1297 interfacePair != end; ++interfacePair) {
│ │ │ │ -
1298 size_t size = FORWARD ? interfacePair->second.first.size() :
│ │ │ │ -
1299 interfacePair->second.second.size();
│ │ │ │ -
1300
│ │ │ │ -
1301 for(size_t i=0; i < size; i++) {
│ │ │ │ -
1302
│ │ │ │ -
1303#ifdef DUNE_ISTL_WITH_CHECKING
│ │ │ │ -
1304 assert(bufferSize>=(index+1)*sizeof(typename CommPolicy<Data>::IndexedType));
│ │ │ │ -
1305#endif
│ │ │ │ -
1306
│ │ │ │ -
1307 buffer[index++] = GatherScatter::gather(data, FORWARD ? interfacePair->second.first[i] :
│ │ │ │ -
1308 interfacePair->second.second[i]);
│ │ │ │ -
1309 }
│ │ │ │ -
1310 }
│ │ │ │ -
1311
│ │ │ │ -
1312 }
│ │ │ │ -
1313
│ │ │ │ -
1314
│ │ │ │ -
1315 template<class Data, class GatherScatter, bool FORWARD>
│ │ │ │ -
1316 inline void BufferedCommunicator::MessageScatterer<Data,GatherScatter,FORWARD,VariableSize>::operator()(const InterfaceMap& interfaces, Data& data, Type* buffer, const int& proc) const
│ │ │ │ -
1317 {
│ │ │ │ -
1318 typedef typename InterfaceMap::value_type::second_type::first_type Information;
│ │ │ │ -
1319 const typename InterfaceMap::const_iterator infoPair = interfaces.find(proc);
│ │ │ │ -
1320
│ │ │ │ -
1321 assert(infoPair!=interfaces.end());
│ │ │ │ -
1322
│ │ │ │ -
1323 const Information& info = FORWARD ? infoPair->second.second :
│ │ │ │ -
1324 infoPair->second.first;
│ │ │ │ -
1325
│ │ │ │ -
1326 for(size_t i=0, index=0; i < info.size(); i++) {
│ │ │ │ -
1327 for(size_t j=0; j < CommPolicy<Data>::getSize(data, info[i]); j++)
│ │ │ │ -
1328 GatherScatter::scatter(data, buffer[index++], info[i], j);
│ │ │ │ -
1329 }
│ │ │ │ -
1330 }
│ │ │ │ -
1331
│ │ │ │ -
1332
│ │ │ │ -
1333 template<class Data, class GatherScatter, bool FORWARD>
│ │ │ │ -
1334 inline void BufferedCommunicator::MessageScatterer<Data,GatherScatter,FORWARD,SizeOne>::operator()(const InterfaceMap& interfaces, Data& data, Type* buffer, const int& proc) const
│ │ │ │ -
1335 {
│ │ │ │ -
1336 typedef typename InterfaceMap::value_type::second_type::first_type Information;
│ │ │ │ -
1337 const typename InterfaceMap::const_iterator infoPair = interfaces.find(proc);
│ │ │ │ -
1338
│ │ │ │ -
1339 assert(infoPair!=interfaces.end());
│ │ │ │ -
1340
│ │ │ │ -
1341 const Information& info = FORWARD ? infoPair->second.second :
│ │ │ │ -
1342 infoPair->second.first;
│ │ │ │ -
1343
│ │ │ │ -
1344 for(size_t i=0; i < info.size(); i++) {
│ │ │ │ -
1345 GatherScatter::scatter(data, buffer[i], info[i]);
│ │ │ │ -
1346 }
│ │ │ │ -
1347 }
│ │ │ │ -
1348
│ │ │ │ -
1349
│ │ │ │ -
1350 template<class GatherScatter,class Data>
│ │ │ │ -
1351 void BufferedCommunicator::forward(Data& data)
│ │ │ │ -
1352 {
│ │ │ │ -
1353 this->template sendRecv<GatherScatter,true>(data, data);
│ │ │ │ -
1354 }
│ │ │ │ -
1355
│ │ │ │ -
1356
│ │ │ │ -
1357 template<class GatherScatter, class Data>
│ │ │ │ -
1358 void BufferedCommunicator::backward(Data& data)
│ │ │ │ -
1359 {
│ │ │ │ -
1360 this->template sendRecv<GatherScatter,false>(data, data);
│ │ │ │ -
1361 }
│ │ │ │ -
1362
│ │ │ │ -
1363
│ │ │ │ -
1364 template<class GatherScatter, class Data>
│ │ │ │ -
1365 void BufferedCommunicator::forward(const Data& source, Data& dest)
│ │ │ │ -
1366 {
│ │ │ │ -
1367 this->template sendRecv<GatherScatter,true>(source, dest);
│ │ │ │ -
1368 }
│ │ │ │ -
1369
│ │ │ │ -
1370
│ │ │ │ -
1371 template<class GatherScatter, class Data>
│ │ │ │ -
1372 void BufferedCommunicator::backward(Data& source, const Data& dest)
│ │ │ │ -
1373 {
│ │ │ │ -
1374 this->template sendRecv<GatherScatter,false>(dest, source);
│ │ │ │ -
1375 }
│ │ │ │ -
1376
│ │ │ │ -
1377
│ │ │ │ -
1378 template<class GatherScatter, bool FORWARD, class Data>
│ │ │ │ -
1379 void BufferedCommunicator::sendRecv(const Data& source, Data& dest)
│ │ │ │ -
1380 {
│ │ │ │ -
1381 int rank, lrank;
│ │ │ │ -
1382
│ │ │ │ -
1383 MPI_Comm_rank(MPI_COMM_WORLD,&rank);
│ │ │ │ -
1384 MPI_Comm_rank(MPI_COMM_WORLD,&lrank);
│ │ │ │ -
1385
│ │ │ │ -
1386 typedef typename CommPolicy<Data>::IndexedType Type;
│ │ │ │ -
1387 Type *sendBuffer, *recvBuffer;
│ │ │ │ -
1388 size_t sendBufferSize;
│ │ │ │ -
1389#ifndef NDEBUG
│ │ │ │ -
1390 size_t recvBufferSize;
│ │ │ │ -
1391#endif
│ │ │ │ -
1392
│ │ │ │ -
1393 if(FORWARD) {
│ │ │ │ -
1394 sendBuffer = reinterpret_cast<Type*>(buffers_[0]);
│ │ │ │ -
1395 sendBufferSize = bufferSize_[0];
│ │ │ │ -
1396 recvBuffer = reinterpret_cast<Type*>(buffers_[1]);
│ │ │ │ -
1397#ifndef NDEBUG
│ │ │ │ -
1398 recvBufferSize = bufferSize_[1];
│ │ │ │ -
1399#endif
│ │ │ │ -
1400 }else{
│ │ │ │ -
1401 sendBuffer = reinterpret_cast<Type*>(buffers_[1]);
│ │ │ │ -
1402 sendBufferSize = bufferSize_[1];
│ │ │ │ -
1403 recvBuffer = reinterpret_cast<Type*>(buffers_[0]);
│ │ │ │ -
1404#ifndef NDEBUG
│ │ │ │ -
1405 recvBufferSize = bufferSize_[0];
│ │ │ │ -
1406#endif
│ │ │ │ -
1407 }
│ │ │ │ -
1408 typedef typename CommPolicy<Data>::IndexedTypeFlag Flag;
│ │ │ │ -
1409
│ │ │ │ -
1410 MessageGatherer<Data,GatherScatter,FORWARD,Flag>() (interfaces_, source, sendBuffer, sendBufferSize);
│ │ │ │ -
1411
│ │ │ │ -
1412 MPI_Request* sendRequests = new MPI_Request[messageInformation_.size()];
│ │ │ │ -
1413 MPI_Request* recvRequests = new MPI_Request[messageInformation_.size()];
│ │ │ │ -
1414 /* Number of recvRequests that are not MPI_REQUEST_NULL */
│ │ │ │ -
1415 size_t numberOfRealRecvRequests = 0;
│ │ │ │ -
1416
│ │ │ │ -
1417 // Setup receive first
│ │ │ │ -
1418 typedef typename InformationMap::const_iterator const_iterator;
│ │ │ │ -
1419
│ │ │ │ -
1420 const const_iterator end = messageInformation_.end();
│ │ │ │ -
1421 size_t i=0;
│ │ │ │ -
1422 int* processMap = new int[messageInformation_.size()];
│ │ │ │ -
1423
│ │ │ │ -
1424 for(const_iterator info = messageInformation_.begin(); info != end; ++info, ++i) {
│ │ │ │ -
1425 processMap[i]=info->first;
│ │ │ │ -
1426 if(FORWARD) {
│ │ │ │ -
1427 assert(info->second.second.start_*sizeof(typename CommPolicy<Data>::IndexedType)+info->second.second.size_ <= recvBufferSize );
│ │ │ │ -
1428 Dune::dvverb<<rank<<": receiving "<<info->second.second.size_<<" from "<<info->first<<std::endl;
│ │ │ │ -
1429 if(info->second.second.size_) {
│ │ │ │ -
1430 MPI_Irecv(recvBuffer+info->second.second.start_, info->second.second.size_,
│ │ │ │ -
1431 MPI_BYTE, info->first, commTag_, communicator_,
│ │ │ │ -
1432 recvRequests+i);
│ │ │ │ -
1433 numberOfRealRecvRequests += 1;
│ │ │ │ -
1434 } else {
│ │ │ │ -
1435 // Nothing to receive -> set request to inactive
│ │ │ │ -
1436 recvRequests[i]=MPI_REQUEST_NULL;
│ │ │ │ -
1437 }
│ │ │ │ -
1438 }else{
│ │ │ │ -
1439 assert(info->second.first.start_*sizeof(typename CommPolicy<Data>::IndexedType)+info->second.first.size_ <= recvBufferSize );
│ │ │ │ -
1440 Dune::dvverb<<rank<<": receiving "<<info->second.first.size_<<" to "<<info->first<<std::endl;
│ │ │ │ -
1441 if(info->second.first.size_) {
│ │ │ │ -
1442 MPI_Irecv(recvBuffer+info->second.first.start_, info->second.first.size_,
│ │ │ │ -
1443 MPI_BYTE, info->first, commTag_, communicator_,
│ │ │ │ -
1444 recvRequests+i);
│ │ │ │ -
1445 numberOfRealRecvRequests += 1;
│ │ │ │ -
1446 } else {
│ │ │ │ -
1447 // Nothing to receive -> set request to inactive
│ │ │ │ -
1448 recvRequests[i]=MPI_REQUEST_NULL;
│ │ │ │ -
1449 }
│ │ │ │ -
1450 }
│ │ │ │ -
1451 }
│ │ │ │ -
1452
│ │ │ │ -
1453 // now the send requests
│ │ │ │ -
1454 i=0;
│ │ │ │ -
1455 for(const_iterator info = messageInformation_.begin(); info != end; ++info, ++i)
│ │ │ │ -
1456 if(FORWARD) {
│ │ │ │ -
1457 assert(info->second.second.start_*sizeof(typename CommPolicy<Data>::IndexedType)+info->second.second.size_ <= recvBufferSize );
│ │ │ │ -
1458 Dune::dvverb<<rank<<": sending "<<info->second.first.size_<<" to "<<info->first<<std::endl;
│ │ │ │ -
1459 assert(info->second.first.start_*sizeof(typename CommPolicy<Data>::IndexedType)+info->second.first.size_ <= sendBufferSize );
│ │ │ │ -
1460 if(info->second.first.size_)
│ │ │ │ -
1461 MPI_Issend(sendBuffer+info->second.first.start_, info->second.first.size_,
│ │ │ │ -
1462 MPI_BYTE, info->first, commTag_, communicator_,
│ │ │ │ -
1463 sendRequests+i);
│ │ │ │ -
1464 else
│ │ │ │ -
1465 // Nothing to send -> set request to inactive
│ │ │ │ -
1466 sendRequests[i]=MPI_REQUEST_NULL;
│ │ │ │ -
1467 }else{
│ │ │ │ -
1468 assert(info->second.second.start_*sizeof(typename CommPolicy<Data>::IndexedType)+info->second.second.size_ <= sendBufferSize );
│ │ │ │ -
1469 Dune::dvverb<<rank<<": sending "<<info->second.second.size_<<" to "<<info->first<<std::endl;
│ │ │ │ -
1470 if(info->second.second.size_)
│ │ │ │ -
1471 MPI_Issend(sendBuffer+info->second.second.start_, info->second.second.size_,
│ │ │ │ -
1472 MPI_BYTE, info->first, commTag_, communicator_,
│ │ │ │ -
1473 sendRequests+i);
│ │ │ │ -
1474 else
│ │ │ │ -
1475 // Nothing to send -> set request to inactive
│ │ │ │ -
1476 sendRequests[i]=MPI_REQUEST_NULL;
│ │ │ │ -
1477 }
│ │ │ │ -
1478
│ │ │ │ -
1479 // Wait for completion of receive and immediately start scatter
│ │ │ │ -
1480 i=0;
│ │ │ │ -
1481 //int success = 1;
│ │ │ │ -
1482 int finished = MPI_UNDEFINED;
│ │ │ │ -
1483 MPI_Status status; //[messageInformation_.size()];
│ │ │ │ -
1484 //MPI_Waitall(messageInformation_.size(), recvRequests, status);
│ │ │ │ -
1485
│ │ │ │ -
1486 for(i=0; i< numberOfRealRecvRequests; i++) {
│ │ │ │ -
1487 status.MPI_ERROR=MPI_SUCCESS;
│ │ │ │ -
1488 MPI_Waitany(messageInformation_.size(), recvRequests, &finished, &status);
│ │ │ │ -
1489 assert(finished != MPI_UNDEFINED);
│ │ │ │ -
1490
│ │ │ │ -
1491 if(status.MPI_ERROR==MPI_SUCCESS) {
│ │ │ │ -
1492 int& proc = processMap[finished];
│ │ │ │ -
1493 typename InformationMap::const_iterator infoIter = messageInformation_.find(proc);
│ │ │ │ -
1494 assert(infoIter != messageInformation_.end());
│ │ │ │ -
1495
│ │ │ │ -
1496 MessageInformation info = (FORWARD) ? infoIter->second.second : infoIter->second.first;
│ │ │ │ -
1497 assert(info.start_+info.size_ <= recvBufferSize);
│ │ │ │ -
1498
│ │ │ │ -
1499 MessageScatterer<Data,GatherScatter,FORWARD,Flag>() (interfaces_, dest, recvBuffer+info.start_, proc);
│ │ │ │ -
1500 }else{
│ │ │ │ -
1501 std::cerr<<rank<<": MPI_Error occurred while receiving message from "<<processMap[finished]<<std::endl;
│ │ │ │ -
1502 //success=0;
│ │ │ │ -
1503 }
│ │ │ │ -
1504 }
│ │ │ │ -
1505
│ │ │ │ -
1506 MPI_Status recvStatus;
│ │ │ │ -
1507
│ │ │ │ -
1508 // Wait for completion of sends
│ │ │ │ -
1509 for(i=0; i< messageInformation_.size(); i++)
│ │ │ │ -
1510 if(MPI_SUCCESS!=MPI_Wait(sendRequests+i, &recvStatus)) {
│ │ │ │ -
1511 std::cerr<<rank<<": MPI_Error occurred while sending message to "<<processMap[finished]<<std::endl;
│ │ │ │ -
1512 //success=0;
│ │ │ │ -
1513 }
│ │ │ │ -
1514 /*
│ │ │ │ -
1515 int globalSuccess;
│ │ │ │ -
1516 MPI_Allreduce(&success, &globalSuccess, 1, MPI_INT, MPI_MIN, interface_->communicator());
│ │ │ │ -
1517
│ │ │ │ -
1518 if(!globalSuccess)
│ │ │ │ -
1519 DUNE_THROW(CommunicationError, "A communication error occurred!");
│ │ │ │ -
1520 */
│ │ │ │ -
1521 delete[] processMap;
│ │ │ │ -
1522 delete[] sendRequests;
│ │ │ │ -
1523 delete[] recvRequests;
│ │ │ │ -
1524
│ │ │ │ -
1525 }
│ │ │ │ -
1526
│ │ │ │ -
1527#endif // DOXYGEN
│ │ │ │ -
1528
│ │ │ │ -
1530}
│ │ │ │ -
1531
│ │ │ │ -
1532#endif // HAVE_MPI
│ │ │ │ -
1533
│ │ │ │ -
1534#endif
│ │ │ │ -
Classes describing a distributed indexset.
│ │ │ │ -
A few common exception classes.
│ │ │ │ -
Standard Dune debug streams.
│ │ │ │ -
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
│ │ │ │ -
DVVerbType dvverb(std::cout)
stream for very verbose output.
Definition: stdstreams.hh:95
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
22
│ │ │ │ +
23namespace Dune {
│ │ │ │ +
24
│ │ │ │ +
25 namespace SimdImpl {
│ │ │ │ +
26
│ │ │ │ +
27 template<class T>
│ │ │ │ +
28 class Inserter {
│ │ │ │ +
29 T value_;
│ │ │ │ +
30
│ │ │ │ +
31 public:
│ │ │ │ +
32 Inserter(const T &value) : value_(value) {}
│ │ │ │ +
33
│ │ │ │ +
34 template<class Stream,
│ │ │ │ +
35 class = std::enable_if_t<std::is_base_of<std::ios_base,
│ │ │ │ +
36 Stream>::value> >
│ │ │ │ +
37 friend Stream& operator<<(Stream &out, const Inserter &ins)
│ │ │ │ +
38 {
│ │ │ │ +
39 const char *sep = "<";
│ │ │ │ +
40 for(auto l : range(Simd::lanes(ins.value_)))
│ │ │ │ +
41 {
│ │ │ │ +
42 out << sep << autoCopy(Simd::lane(l, ins.value_));
│ │ │ │ +
43 sep = ", ";
│ │ │ │ +
44 }
│ │ │ │ +
45 out << '>';
│ │ │ │ +
46 return out;
│ │ │ │ +
47 }
│ │ │ │ +
48 };
│ │ │ │ +
49
│ │ │ │ +
50 template<class V, class = std::enable_if_t<Simd::lanes<V>() != 1> >
│ │ │ │ +
51 Inserter<V> io(const V &v)
│ │ │ │ +
52 {
│ │ │ │ +
53 return { v };
│ │ │ │ +
54 }
│ │ │ │ +
55
│ │ │ │ +
56 template<class V, class = std::enable_if_t<Simd::lanes<V>() == 1> >
│ │ │ │ +
57 Simd::Scalar<V> io(const V &v)
│ │ │ │ +
58 {
│ │ │ │ +
59 return Simd::lane(0, v);
│ │ │ │ +
60 }
│ │ │ │ +
61
│ │ │ │ +
62 }
│ │ │ │ +
63
│ │ │ │ +
64 namespace Simd {
│ │ │ │ +
65
│ │ │ │ +
82
│ │ │ │ +
89 template<class V>
│ │ │ │ +
90 auto vio(const V &v)
│ │ │ │ +
91 {
│ │ │ │ +
92 return SimdImpl::Inserter<V>{ v };
│ │ │ │ +
93 }
│ │ │ │ +
94
│ │ │ │ +
96
│ │ │ │ +
105 template<class V>
│ │ │ │ +
106 auto io(const V &v)
│ │ │ │ +
107 {
│ │ │ │ +
108 return SimdImpl::io(v);
│ │ │ │ +
109 }
│ │ │ │ +
110
│ │ │ │ +
112
│ │ │ │ +
114
│ │ │ │ +
115 } // namespace Simd
│ │ │ │ +
116} // namespace Dune
│ │ │ │ +
117
│ │ │ │ +
118#endif // DUNE_COMMON_SIMD_IO_HH
│ │ │ │ +
Traits for type conversions and type information.
│ │ │ │ +
Utilities for reduction like operations on ranges.
│ │ │ │ +
static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from >, std::integral_constant< T, to >) noexcept
Definition: rangeutilities.hh:300
│ │ │ │ +
constexpr AutonomousValue< T > autoCopy(T &&v)
Autonomous copy of an expression's value for use in auto type deduction.
Definition: typetraits.hh:642
│ │ │ │ +
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
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
Default exception class for I/O errors.
Definition: exceptions.hh:231
│ │ │ │ -
Flag for marking indexed data structures where data at each index is of the same size.
Definition: communicator.hh:110
│ │ │ │ -
Flag for marking indexed data structures where the data at each index may be a variable multiple of a...
Definition: communicator.hh:118
│ │ │ │ -
Default policy used for communicating an indexed type.
Definition: communicator.hh:128
│ │ │ │ -
V::value_type IndexedType
The type we get at each index with operator[].
Definition: communicator.hh:147
│ │ │ │ -
static int getSize(const V &, int index)
Get the number of primitive elements at that index.
│ │ │ │ -
SizeOne IndexedTypeFlag
Whether the indexed type has variable size or there is always one value at each index.
Definition: communicator.hh:153
│ │ │ │ -
static const void * getAddress(const V &v, int index)
Get the address of entry at an index.
│ │ │ │ -
V Type
The type the policy is for.
Definition: communicator.hh:140
│ │ │ │ -
Definition: communicator.hh:173
│ │ │ │ -
Definition: communicator.hh:175
│ │ │ │ - │ │ │ │ - │ │ │ │ -
VariableBlockVector< FieldVector< K, n >, A > Type
Definition: communicator.hh:180
│ │ │ │ - │ │ │ │ - │ │ │ │ -
Error thrown if there was a problem with the communication.
Definition: communicator.hh:195
│ │ │ │ -
GatherScatter default implementation that just copies data.
Definition: communicator.hh:202
│ │ │ │ -
static void scatter(T &vec, const IndexedType &v, std::size_t i)
│ │ │ │ -
CommPolicy< T >::IndexedType IndexedType
Definition: communicator.hh:203
│ │ │ │ -
static const IndexedType & gather(const T &vec, std::size_t i)
│ │ │ │ -
A communicator that uses buffers to gather and scatter the data to be send or received.
Definition: communicator.hh:458
│ │ │ │ -
void backward(Data &data)
Backward send where target and source are the same.
│ │ │ │ -
BufferedCommunicator()
Constructor.
│ │ │ │ -
~BufferedCommunicator()
Destructor.
│ │ │ │ -
void forward(const Data &source, Data &dest)
Send from source to target.
│ │ │ │ -
void free()
Free the allocated memory (i.e. buffers and message information.
│ │ │ │ -
std::enable_if< std::is_same< SizeOne, typenameCommPolicy< Data >::IndexedTypeFlag >::value, void >::type build(const Interface &interface)
Build the buffers and information for the communication process.
│ │ │ │ -
void backward(Data &source, const Data &dest)
Communicate in the reverse direction, i.e. send from target to source.
│ │ │ │ -
void build(const Data &source, const Data &target, const Interface &interface)
Build the buffers and information for the communication process.
│ │ │ │ -
void forward(Data &data)
Forward send where target and source are the same.
│ │ │ │ -
Manager class for the mapping between local indices and globally unique indices.
Definition: indexset.hh:218
│ │ │ │ -
Base class of all classes representing a communication interface.
Definition: parallel/interface.hh:35
│ │ │ │ -
Information describing an interface.
Definition: parallel/interface.hh:101
│ │ │ │ -
Communication interface between remote and local indices.
Definition: parallel/interface.hh:209
│ │ │ │ -
An index present on the local process.
Definition: localindex.hh:35
│ │ │ │ -
The indices present on remote processes.
Definition: remoteindices.hh:189
│ │ │ │ -
ParallelIndexSet::GlobalIndex GlobalIndex
The type of the global index.
Definition: remoteindices.hh:215
│ │ │ │ -
LocalIndex::Attribute Attribute
The type of the attribute.
Definition: remoteindices.hh:226
│ │ │ │ -
ParallelIndexSet::LocalIndex LocalIndex
The type of the local index.
Definition: remoteindices.hh:221
│ │ │ │ -
Provides classes for building the communication interface between remote indices.
│ │ │ │ +
Definition: io.hh:28
│ │ │ │ +
Inserter(const T &value)
Definition: io.hh:32
│ │ │ │ +
friend Stream & operator<<(Stream &out, const Inserter &ins)
Definition: io.hh:37
│ │ │ │ +
Include file for users of the SIMD abstraction layer.
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,1208 +4,122 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -communicator.hh │ │ │ │ │ + * simd │ │ │ │ │ +io.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 (C) DUNE Project contributors, see file │ │ │ │ │ + 1// SPDX-FileCopyrightInfo: Copyright (C) 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_COMMUNICATOR │ │ │ │ │ - 6#define DUNE_COMMUNICATOR │ │ │ │ │ - 7 │ │ │ │ │ - 8#if HAVE_MPI │ │ │ │ │ - 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ - 16 │ │ │ │ │ - 17#include │ │ │ │ │ + 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ + 3#ifndef DUNE_COMMON_SIMD_IO_HH │ │ │ │ │ + 4#define DUNE_COMMON_SIMD_IO_HH │ │ │ │ │ + 5 │ │ │ │ │ + 16#include │ │ │ │ │ + 17#include │ │ │ │ │ 18 │ │ │ │ │ - 19#include │ │ │ │ │ - 20#include │ │ │ │ │ - 21#include │ │ │ │ │ - 22#include │ │ │ │ │ - 23 │ │ │ │ │ - 24namespace Dune │ │ │ │ │ - 25{ │ │ │ │ │ -109 struct SizeOne │ │ │ │ │ - 110 {}; │ │ │ │ │ - 111 │ │ │ │ │ -117 struct VariableSize │ │ │ │ │ - 118 {}; │ │ │ │ │ - 119 │ │ │ │ │ - 120 │ │ │ │ │ - 126 template │ │ │ │ │ -127 struct CommPolicy │ │ │ │ │ - 128 { │ │ │ │ │ -140 typedef V Type; │ │ │ │ │ - 141 │ │ │ │ │ -147 typedef typename V::value_type IndexedType; │ │ │ │ │ - 148 │ │ │ │ │ -153 typedef SizeOne IndexedTypeFlag; │ │ │ │ │ - 154 │ │ │ │ │ -163 static const void* getAddress(const V& v, int index); │ │ │ │ │ - 164 │ │ │ │ │ -170 static int getSize(const V&, int index); │ │ │ │ │ - 171 }; │ │ │ │ │ - 172 │ │ │ │ │ -173 template class FieldVector; │ │ │ │ │ - 174 │ │ │ │ │ -175 template class VariableBlockVector; │ │ │ │ │ - 176 │ │ │ │ │ - 177 template │ │ │ │ │ -178 struct CommPolicy, A> > │ │ │ │ │ - 179 { │ │ │ │ │ -180 typedef VariableBlockVector, A> Type; │ │ │ │ │ - 181 │ │ │ │ │ -182 typedef typename Type::B IndexedType; │ │ │ │ │ - 183 │ │ │ │ │ -184 typedef VariableSize IndexedTypeFlag; │ │ │ │ │ - 185 │ │ │ │ │ -186 static const void* getAddress(const Type& v, int i); │ │ │ │ │ - 187 │ │ │ │ │ -188 static int getSize(const Type& v, int i); │ │ │ │ │ - 189 }; │ │ │ │ │ - 190 │ │ │ │ │ -194 class CommunicationError : public IOError │ │ │ │ │ - 195 {}; │ │ │ │ │ - 196 │ │ │ │ │ - 200 template │ │ │ │ │ -201 struct CopyGatherScatter │ │ │ │ │ - 202 { │ │ │ │ │ -203 typedef typename CommPolicy::IndexedType IndexedType; │ │ │ │ │ - 204 │ │ │ │ │ -205 static const IndexedType& gather(const T& vec, std::size_t i); │ │ │ │ │ - 206 │ │ │ │ │ -207 static void scatter(T& vec, const IndexedType& v, std::size_t i); │ │ │ │ │ - 208 │ │ │ │ │ - 209 }; │ │ │ │ │ - 210 │ │ │ │ │ - 222 template │ │ │ │ │ - 223 class DatatypeCommunicator : public InterfaceBuilder │ │ │ │ │ - 224 { │ │ │ │ │ - 225 public: │ │ │ │ │ - 226 │ │ │ │ │ - 230 typedef T ParallelIndexSet; │ │ │ │ │ - 231 │ │ │ │ │ - 235 typedef Dune::RemoteIndices RemoteIndices; │ │ │ │ │ - 236 │ │ │ │ │ - 240 typedef typename RemoteIndices::GlobalIndex GlobalIndex; │ │ │ │ │ - 241 │ │ │ │ │ - 245 typedef typename RemoteIndices::Attribute Attribute; │ │ │ │ │ - 246 │ │ │ │ │ - 250 typedef typename RemoteIndices::LocalIndex LocalIndex; │ │ │ │ │ - 251 │ │ │ │ │ - 255 DatatypeCommunicator(); │ │ │ │ │ - 256 │ │ │ │ │ - 260 ~DatatypeCommunicator(); │ │ │ │ │ - 261 │ │ │ │ │ - 288 template │ │ │ │ │ - 289 void build(const RemoteIndices& remoteIndices, const T1& sourceFlags, V& │ │ │ │ │ -sendData, const T2& destFlags, V& receiveData); │ │ │ │ │ - 290 │ │ │ │ │ - 294 void forward(); │ │ │ │ │ - 295 │ │ │ │ │ - 299 void backward(); │ │ │ │ │ - 300 │ │ │ │ │ - 304 void free(); │ │ │ │ │ - 305 private: │ │ │ │ │ - 309 constexpr static int commTag_ = 234; │ │ │ │ │ - 310 │ │ │ │ │ - 314 const RemoteIndices* remoteIndices_; │ │ │ │ │ - 315 │ │ │ │ │ - 316 typedef std::map > │ │ │ │ │ - 317 MessageTypeMap; │ │ │ │ │ - 318 │ │ │ │ │ - 322 MessageTypeMap messageTypes; │ │ │ │ │ - 323 │ │ │ │ │ - 327 void* data_; │ │ │ │ │ - 328 │ │ │ │ │ - 329 MPI_Request* requests_[2]; │ │ │ │ │ - 330 │ │ │ │ │ - 334 bool created_; │ │ │ │ │ - 335 │ │ │ │ │ - 339 template │ │ │ │ │ - 340 void createRequests(V& sendData, V& receiveData); │ │ │ │ │ - 341 │ │ │ │ │ - 345 template │ │ │ │ │ - 346 void createDataTypes(const T1& source, const T2& destination, V& data); │ │ │ │ │ - 347 │ │ │ │ │ - 351 void sendRecv(MPI_Request* req); │ │ │ │ │ - 352 │ │ │ │ │ - 356 struct IndexedTypeInformation │ │ │ │ │ - 357 { │ │ │ │ │ - 363 void build(int i) │ │ │ │ │ - 364 { │ │ │ │ │ - 365 length = new int[i]; │ │ │ │ │ - 366 displ = new MPI_Aint[i]; │ │ │ │ │ - 367 size = i; │ │ │ │ │ - 368 } │ │ │ │ │ - 369 │ │ │ │ │ - 373 void free() │ │ │ │ │ - 374 { │ │ │ │ │ - 375 delete[] length; │ │ │ │ │ - 376 delete[] displ; │ │ │ │ │ - 377 } │ │ │ │ │ - 379 int* length; │ │ │ │ │ - 381 MPI_Aint* displ; │ │ │ │ │ - 387 int elements; │ │ │ │ │ - 391 int size; │ │ │ │ │ - 392 }; │ │ │ │ │ - 393 │ │ │ │ │ - 399 template │ │ │ │ │ - 400 struct MPIDatatypeInformation │ │ │ │ │ - 401 { │ │ │ │ │ - 406 MPIDatatypeInformation(const V& data) : data_(data) │ │ │ │ │ - 407 {} │ │ │ │ │ - 408 │ │ │ │ │ - 414 void reserve(int proc, int size) │ │ │ │ │ - 415 { │ │ │ │ │ - 416 information_[proc].build(size); │ │ │ │ │ - 417 } │ │ │ │ │ - 424 void add(int proc, int local) │ │ │ │ │ - 425 { │ │ │ │ │ - 426 IndexedTypeInformation& info=information_[proc]; │ │ │ │ │ - 427 assert((info.elements)(CommPolicy::getAddress(data_, │ │ │ │ │ -local)), │ │ │ │ │ - 429 info.displ+info.elements); │ │ │ │ │ - 430 info.length[info.elements]=CommPolicy::getSize(data_, local); │ │ │ │ │ - 431 info.elements++; │ │ │ │ │ - 432 } │ │ │ │ │ - 433 │ │ │ │ │ - 438 std::map information_; │ │ │ │ │ - 442 const V& data_; │ │ │ │ │ - 443 │ │ │ │ │ - 444 }; │ │ │ │ │ - 445 │ │ │ │ │ - 446 }; │ │ │ │ │ - 447 │ │ │ │ │ -457 class BufferedCommunicator │ │ │ │ │ - 458 { │ │ │ │ │ - 459 │ │ │ │ │ - 460 public: │ │ │ │ │ -464 BufferedCommunicator(); │ │ │ │ │ - 465 │ │ │ │ │ - 472 template │ │ │ │ │ - 473 typename std::enable_if:: │ │ │ │ │ -IndexedTypeFlag>::value, void>::type │ │ │ │ │ -474 build(const Interface& interface); │ │ │ │ │ - 475 │ │ │ │ │ - 483 template │ │ │ │ │ -484 void build(const Data& source, const Data& target, const Interface& │ │ │ │ │ -interface); │ │ │ │ │ - 485 │ │ │ │ │ - 514 template │ │ │ │ │ -515 void forward(const Data& source, Data& dest); │ │ │ │ │ - 516 │ │ │ │ │ - 545 template │ │ │ │ │ -546 void backward(Data& source, const Data& dest); │ │ │ │ │ - 547 │ │ │ │ │ - 573 template │ │ │ │ │ -574 void forward(Data& data); │ │ │ │ │ - 575 │ │ │ │ │ - 601 template │ │ │ │ │ -602 void backward(Data& data); │ │ │ │ │ - 603 │ │ │ │ │ -607 void free(); │ │ │ │ │ - 608 │ │ │ │ │ -612 ~BufferedCommunicator(); │ │ │ │ │ - 613 │ │ │ │ │ - 614 private: │ │ │ │ │ - 615 │ │ │ │ │ - 619 typedef std::map │ │ │ │ │ -> │ │ │ │ │ - 620 InterfaceMap; │ │ │ │ │ - 621 │ │ │ │ │ - 622 │ │ │ │ │ - 626 template │ │ │ │ │ - 627 struct MessageSizeCalculator │ │ │ │ │ - 628 {}; │ │ │ │ │ - 629 │ │ │ │ │ - 634 template │ │ │ │ │ - 635 struct MessageSizeCalculator │ │ │ │ │ - 636 { │ │ │ │ │ - 643 inline int operator()(const InterfaceInformation& info) const; │ │ │ │ │ - 652 inline int operator()(const Data& data, const InterfaceInformation& info) │ │ │ │ │ -const; │ │ │ │ │ - 653 }; │ │ │ │ │ - 654 │ │ │ │ │ - 659 template │ │ │ │ │ - 660 struct MessageSizeCalculator │ │ │ │ │ - 661 { │ │ │ │ │ - 670 inline int operator()(const Data& data, const InterfaceInformation& info) │ │ │ │ │ -const; │ │ │ │ │ - 671 }; │ │ │ │ │ - 672 │ │ │ │ │ - 676 template │ │ │ │ │ - 677 struct MessageGatherer │ │ │ │ │ - 678 {}; │ │ │ │ │ - 679 │ │ │ │ │ - 684 template │ │ │ │ │ - 685 struct MessageGatherer │ │ │ │ │ - 686 { │ │ │ │ │ - 688 typedef typename CommPolicy::IndexedType Type; │ │ │ │ │ - 689 │ │ │ │ │ - 694 typedef GatherScatter Gatherer; │ │ │ │ │ - 695 │ │ │ │ │ - 701 constexpr static bool forward = send; │ │ │ │ │ - 702 │ │ │ │ │ - 710 inline void operator()(const InterfaceMap& interface, const Data& data, │ │ │ │ │ -Type* buffer, size_t bufferSize) const; │ │ │ │ │ - 711 }; │ │ │ │ │ - 712 │ │ │ │ │ - 717 template │ │ │ │ │ - 718 struct MessageGatherer │ │ │ │ │ - 719 { │ │ │ │ │ - 721 typedef typename CommPolicy::IndexedType Type; │ │ │ │ │ - 722 │ │ │ │ │ - 727 typedef GatherScatter Gatherer; │ │ │ │ │ - 728 │ │ │ │ │ - 734 constexpr static bool forward = send; │ │ │ │ │ - 735 │ │ │ │ │ - 743 inline void operator()(const InterfaceMap& interface, const Data& data, │ │ │ │ │ -Type* buffer, size_t bufferSize) const; │ │ │ │ │ - 744 }; │ │ │ │ │ - 745 │ │ │ │ │ - 749 template │ │ │ │ │ - 750 struct MessageScatterer │ │ │ │ │ - 751 {}; │ │ │ │ │ - 752 │ │ │ │ │ - 757 template │ │ │ │ │ - 758 struct MessageScatterer │ │ │ │ │ - 759 { │ │ │ │ │ - 761 typedef typename CommPolicy::IndexedType Type; │ │ │ │ │ - 762 │ │ │ │ │ - 767 typedef GatherScatter Scatterer; │ │ │ │ │ - 768 │ │ │ │ │ - 774 constexpr static bool forward = send; │ │ │ │ │ - 775 │ │ │ │ │ - 783 inline void operator()(const InterfaceMap& interface, Data& data, Type* │ │ │ │ │ -buffer, const int& proc) const; │ │ │ │ │ - 784 }; │ │ │ │ │ - 789 template │ │ │ │ │ - 790 struct MessageScatterer │ │ │ │ │ - 791 { │ │ │ │ │ - 793 typedef typename CommPolicy::IndexedType Type; │ │ │ │ │ - 794 │ │ │ │ │ - 799 typedef GatherScatter Scatterer; │ │ │ │ │ - 800 │ │ │ │ │ - 806 constexpr static bool forward = send; │ │ │ │ │ - 807 │ │ │ │ │ - 815 inline void operator()(const InterfaceMap& interface, Data& data, Type* │ │ │ │ │ -buffer, const int& proc) const; │ │ │ │ │ - 816 }; │ │ │ │ │ - 817 │ │ │ │ │ - 821 struct MessageInformation │ │ │ │ │ - 822 { │ │ │ │ │ - 824 MessageInformation() │ │ │ │ │ - 825 : start_(0), size_(0) │ │ │ │ │ - 826 {} │ │ │ │ │ - 827 │ │ │ │ │ - 835 MessageInformation(size_t start, size_t size) │ │ │ │ │ - 836 : start_(start), size_(size) │ │ │ │ │ - 837 {} │ │ │ │ │ - 841 size_t start_; │ │ │ │ │ - 845 size_t size_; │ │ │ │ │ - 846 }; │ │ │ │ │ - 847 │ │ │ │ │ - 854 typedef std::map > │ │ │ │ │ - 855 InformationMap; │ │ │ │ │ - 859 InformationMap messageInformation_; │ │ │ │ │ - 863 char* buffers_[2]; │ │ │ │ │ - 867 size_t bufferSize_[2]; │ │ │ │ │ - 868 │ │ │ │ │ - 872 constexpr static int commTag_ = 0; │ │ │ │ │ - 873 │ │ │ │ │ - 877 std::map > │ │ │ │ │ -interfaces_; │ │ │ │ │ - 878 │ │ │ │ │ - 879 MPI_Comm communicator_; │ │ │ │ │ - 880 │ │ │ │ │ - 884 template │ │ │ │ │ - 885 void sendRecv(const Data& source, Data& target); │ │ │ │ │ - 886 │ │ │ │ │ - 887 }; │ │ │ │ │ - 888 │ │ │ │ │ - 889#ifndef DOXYGEN │ │ │ │ │ - 890 │ │ │ │ │ - 891 template │ │ │ │ │ - 892 inline const void* CommPolicy::getAddress(const V& v, int index) │ │ │ │ │ - 893 { │ │ │ │ │ - 894 return &(v[index]); │ │ │ │ │ - 895 } │ │ │ │ │ - 896 │ │ │ │ │ - 897 template │ │ │ │ │ - 898 inline int CommPolicy::getSize([[maybe_unused]] const V& v, [ │ │ │ │ │ -[maybe_unused]] int index) │ │ │ │ │ - 899 { │ │ │ │ │ - 900 return 1; │ │ │ │ │ - 901 } │ │ │ │ │ - 902 │ │ │ │ │ - 903 template │ │ │ │ │ - 904 inline const void* CommPolicy, A> │ │ │ │ │ ->::getAddress(const Type& v, int index) │ │ │ │ │ - 905 { │ │ │ │ │ - 906 return &(v[index][0]); │ │ │ │ │ - 907 } │ │ │ │ │ - 908 │ │ │ │ │ - 909 template │ │ │ │ │ - 910 inline int CommPolicy, A> >::getSize │ │ │ │ │ -(const Type& v, int index) │ │ │ │ │ - 911 { │ │ │ │ │ - 912 return v[index].getsize(); │ │ │ │ │ - 913 } │ │ │ │ │ - 914 │ │ │ │ │ - 915 template │ │ │ │ │ - 916 inline const typename CopyGatherScatter::IndexedType& │ │ │ │ │ -CopyGatherScatter::gather(const T & vec, std::size_t i) │ │ │ │ │ - 917 { │ │ │ │ │ - 918 return vec[i]; │ │ │ │ │ - 919 } │ │ │ │ │ - 920 │ │ │ │ │ - 921 template │ │ │ │ │ - 922 inline void CopyGatherScatter::scatter(T& vec, const IndexedType& v, │ │ │ │ │ -std::size_t i) │ │ │ │ │ - 923 { │ │ │ │ │ - 924 vec[i]=v; │ │ │ │ │ - 925 } │ │ │ │ │ - 926 │ │ │ │ │ - 927 template │ │ │ │ │ - 928 DatatypeCommunicator::DatatypeCommunicator() │ │ │ │ │ - 929 : remoteIndices_(0), created_(false) │ │ │ │ │ - 930 { │ │ │ │ │ - 931 requests_[0]=0; │ │ │ │ │ - 932 requests_[1]=0; │ │ │ │ │ - 933 } │ │ │ │ │ - 934 │ │ │ │ │ - 935 │ │ │ │ │ - 936 │ │ │ │ │ - 937 template │ │ │ │ │ - 938 DatatypeCommunicator::~DatatypeCommunicator() │ │ │ │ │ - 939 { │ │ │ │ │ - 940 free(); │ │ │ │ │ - 941 } │ │ │ │ │ - 942 │ │ │ │ │ - 943 template │ │ │ │ │ - 944 template │ │ │ │ │ - 945 inline void DatatypeCommunicator::build(const RemoteIndices& │ │ │ │ │ -remoteIndices, │ │ │ │ │ - 946 const T1& source, V& sendData, │ │ │ │ │ - 947 const T2& destination, V& receiveData) │ │ │ │ │ - 948 { │ │ │ │ │ - 949 remoteIndices_ = &remoteIndices; │ │ │ │ │ - 950 free(); │ │ │ │ │ - 951 createDataTypes(source,destination, receiveData); │ │ │ │ │ - 952 createDataTypes(source,destination, sendData); │ │ │ │ │ - 953 createRequests(sendData, receiveData); │ │ │ │ │ - 954 createRequests(receiveData, sendData); │ │ │ │ │ - 955 created_=true; │ │ │ │ │ - 956 } │ │ │ │ │ - 957 │ │ │ │ │ - 958 template │ │ │ │ │ - 959 void DatatypeCommunicator::free() │ │ │ │ │ - 960 { │ │ │ │ │ - 961 if(created_) { │ │ │ │ │ - 962 delete[] requests_[0]; │ │ │ │ │ - 963 delete[] requests_[1]; │ │ │ │ │ - 964 typedef MessageTypeMap::iterator iterator; │ │ │ │ │ - 965 typedef MessageTypeMap::const_iterator const_iterator; │ │ │ │ │ - 966 │ │ │ │ │ - 967 const const_iterator end=messageTypes.end(); │ │ │ │ │ - 968 │ │ │ │ │ - 969 for(iterator process = messageTypes.begin(); process != end; ++process) { │ │ │ │ │ - 970 MPI_Datatype *type = &(process->second.first); │ │ │ │ │ - 971 int finalized=0; │ │ │ │ │ - 972 MPI_Finalized(&finalized); │ │ │ │ │ - 973 if(*type!=MPI_DATATYPE_NULL && !finalized) │ │ │ │ │ - 974 MPI_Type_free(type); │ │ │ │ │ - 975 type = &(process->second.second); │ │ │ │ │ - 976 if(*type!=MPI_DATATYPE_NULL && !finalized) │ │ │ │ │ - 977 MPI_Type_free(type); │ │ │ │ │ - 978 } │ │ │ │ │ - 979 messageTypes.clear(); │ │ │ │ │ - 980 created_=false; │ │ │ │ │ - 981 } │ │ │ │ │ - 982 │ │ │ │ │ - 983 } │ │ │ │ │ - 984 │ │ │ │ │ - 985 template │ │ │ │ │ - 986 template │ │ │ │ │ - 987 void DatatypeCommunicator::createDataTypes(const T1& sourceFlags, const │ │ │ │ │ -T2& destFlags, V& data) │ │ │ │ │ - 988 { │ │ │ │ │ - 989 │ │ │ │ │ - 990 MPIDatatypeInformation dataInfo(data); │ │ │ │ │ - 991 this->template │ │ │ │ │ -buildInterface,send> │ │ │ │ │ -(*remoteIndices_,sourceFlags, destFlags, dataInfo); │ │ │ │ │ - 992 │ │ │ │ │ - 993 typedef typename RemoteIndices::RemoteIndexMap::const_iterator │ │ │ │ │ -const_iterator; │ │ │ │ │ - 994 const const_iterator end=this->remoteIndices_->end(); │ │ │ │ │ - 995 │ │ │ │ │ - 996 // Allocate MPI_Datatypes and deallocate memory for the type construction. │ │ │ │ │ - 997 for(const_iterator process=this->remoteIndices_->begin(); process != end; │ │ │ │ │ -++process) { │ │ │ │ │ - 998 IndexedTypeInformation& info=dataInfo.information_[process->first]; │ │ │ │ │ - 999 // Shift the displacement │ │ │ │ │ - 1000 MPI_Aint base; │ │ │ │ │ - 1001 MPI_Get_address(const_cast(CommPolicy::getAddress(data, 0)), │ │ │ │ │ -&base); │ │ │ │ │ - 1002 │ │ │ │ │ - 1003 for(int i=0; i< info.elements; i++) { │ │ │ │ │ - 1004 info.displ[i]-=base; │ │ │ │ │ - 1005 } │ │ │ │ │ - 1006 │ │ │ │ │ - 1007 // Create data type │ │ │ │ │ - 1008 MPI_Datatype* type = &( send ? messageTypes[process->first].first : │ │ │ │ │ -messageTypes[process->first].second); │ │ │ │ │ - 1009 MPI_Type_create_hindexed(info.elements, info.length, info.displ, │ │ │ │ │ - 1010 MPITraits::IndexedType>::getType(), type); │ │ │ │ │ - 1011 MPI_Type_commit(type); │ │ │ │ │ - 1012 // Deallocate memory │ │ │ │ │ - 1013 info.free(); │ │ │ │ │ - 1014 } │ │ │ │ │ - 1015 } │ │ │ │ │ - 1016 │ │ │ │ │ - 1017 template │ │ │ │ │ - 1018 template │ │ │ │ │ - 1019 void DatatypeCommunicator::createRequests(V& sendData, V& receiveData) │ │ │ │ │ - 1020 { │ │ │ │ │ - 1021 typedef std::map >:: │ │ │ │ │ -const_iterator MapIterator; │ │ │ │ │ - 1022 int rank; │ │ │ │ │ - 1023 static int index = createForward ? 1 : 0; │ │ │ │ │ - 1024 int noMessages = messageTypes.size(); │ │ │ │ │ - 1025 // allocate request handles │ │ │ │ │ - 1026 requests_[index] = new MPI_Request[2*noMessages]; │ │ │ │ │ - 1027 const MapIterator end = messageTypes.end(); │ │ │ │ │ - 1028 int request=0; │ │ │ │ │ - 1029 MPI_Comm_rank(MPI_COMM_WORLD, &rank); │ │ │ │ │ - 1030 │ │ │ │ │ - 1031 // Set up the requests for receiving first │ │ │ │ │ - 1032 for(MapIterator process = messageTypes.begin(); process != end; │ │ │ │ │ - 1033 ++process, ++request) { │ │ │ │ │ - 1034 MPI_Datatype type = createForward ? process->second.second : process- │ │ │ │ │ ->second.first; │ │ │ │ │ - 1035 void* address = const_cast(CommPolicy::getAddress │ │ │ │ │ -(receiveData,0)); │ │ │ │ │ - 1036 MPI_Recv_init(address, 1, type, process->first, commTag_, this- │ │ │ │ │ ->remoteIndices_->communicator(), requests_[index]+request); │ │ │ │ │ - 1037 } │ │ │ │ │ - 1038 │ │ │ │ │ - 1039 // And now the send requests │ │ │ │ │ - 1040 │ │ │ │ │ - 1041 for(MapIterator process = messageTypes.begin(); process != end; │ │ │ │ │ - 1042 ++process, ++request) { │ │ │ │ │ - 1043 MPI_Datatype type = createForward ? process->second.first : process- │ │ │ │ │ ->second.second; │ │ │ │ │ - 1044 void* address = const_cast(CommPolicy::getAddress(sendData, │ │ │ │ │ -0)); │ │ │ │ │ - 1045 MPI_Ssend_init(address, 1, type, process->first, commTag_, this- │ │ │ │ │ ->remoteIndices_->communicator(), requests_[index]+request); │ │ │ │ │ - 1046 } │ │ │ │ │ - 1047 } │ │ │ │ │ - 1048 │ │ │ │ │ - 1049 template │ │ │ │ │ - 1050 void DatatypeCommunicator::forward() │ │ │ │ │ - 1051 { │ │ │ │ │ - 1052 sendRecv(requests_[1]); │ │ │ │ │ - 1053 } │ │ │ │ │ - 1054 │ │ │ │ │ - 1055 template │ │ │ │ │ - 1056 void DatatypeCommunicator::backward() │ │ │ │ │ - 1057 { │ │ │ │ │ - 1058 sendRecv(requests_[0]); │ │ │ │ │ - 1059 } │ │ │ │ │ - 1060 │ │ │ │ │ - 1061 template │ │ │ │ │ - 1062 void DatatypeCommunicator::sendRecv(MPI_Request* requests) │ │ │ │ │ - 1063 { │ │ │ │ │ - 1064 int noMessages = messageTypes.size(); │ │ │ │ │ - 1065 // Start the receive calls first │ │ │ │ │ - 1066 MPI_Startall(noMessages, requests); │ │ │ │ │ - 1067 // Now the send calls │ │ │ │ │ - 1068 MPI_Startall(noMessages, requests+noMessages); │ │ │ │ │ - 1069 │ │ │ │ │ - 1070 // Wait for completion of the communication send first then receive │ │ │ │ │ - 1071 MPI_Status* status=new MPI_Status[2*noMessages]; │ │ │ │ │ - 1072 for(int i=0; i<2*noMessages; i++) │ │ │ │ │ - 1073 status[i].MPI_ERROR=MPI_SUCCESS; │ │ │ │ │ - 1074 │ │ │ │ │ - 1075 int send = MPI_Waitall(noMessages, requests+noMessages, │ │ │ │ │ -status+noMessages); │ │ │ │ │ - 1076 int receive = MPI_Waitall(noMessages, requests, status); │ │ │ │ │ - 1077 │ │ │ │ │ - 1078 // Error checks │ │ │ │ │ - 1079 int success=1, globalSuccess=0; │ │ │ │ │ - 1080 if(send==MPI_ERR_IN_STATUS) { │ │ │ │ │ - 1081 int rank; │ │ │ │ │ - 1082 MPI_Comm_rank(this->remoteIndices_->communicator(), &rank); │ │ │ │ │ - 1083 std::cerr<remoteIndices_->communicator(), &rank); │ │ │ │ │ - 1101 std::cerr<remoteIndices_->communicator()); │ │ │ │ │ - 1117 │ │ │ │ │ - 1118 delete[] status; │ │ │ │ │ - 1119 │ │ │ │ │ - 1120 if(!globalSuccess) │ │ │ │ │ - 1121 DUNE_THROW(CommunicationError, "A communication error occurred!"); │ │ │ │ │ - 1122 │ │ │ │ │ - 1123 } │ │ │ │ │ - 1124 │ │ │ │ │ - 1125 inline BufferedCommunicator::BufferedCommunicator() │ │ │ │ │ - 1126 { │ │ │ │ │ - 1127 buffers_[0]=0; │ │ │ │ │ - 1128 buffers_[1]=0; │ │ │ │ │ - 1129 bufferSize_[0]=0; │ │ │ │ │ - 1130 bufferSize_[1]=0; │ │ │ │ │ - 1131 } │ │ │ │ │ - 1132 │ │ │ │ │ - 1133 template │ │ │ │ │ - 1134 typename std::enable_if:: │ │ │ │ │ -IndexedTypeFlag>::value, void>::type │ │ │ │ │ - 1135 BufferedCommunicator::build(const Interface& interface) │ │ │ │ │ - 1136 { │ │ │ │ │ - 1137 interfaces_=interface.interfaces(); │ │ │ │ │ - 1138 communicator_=interface.communicator(); │ │ │ │ │ - 1139 typedef typename std::map > │ │ │ │ │ - 1140 ::const_iterator const_iterator; │ │ │ │ │ - 1141 typedef typename CommPolicy::IndexedTypeFlag Flag; │ │ │ │ │ - 1142 const const_iterator end = interfaces_.end(); │ │ │ │ │ - 1143 int lrank; │ │ │ │ │ - 1144 MPI_Comm_rank(communicator_, &lrank); │ │ │ │ │ - 1145 │ │ │ │ │ - 1146 bufferSize_[0]=0; │ │ │ │ │ - 1147 bufferSize_[1]=0; │ │ │ │ │ - 1148 │ │ │ │ │ - 1149 for(const_iterator interfacePair = interfaces_.begin(); │ │ │ │ │ - 1150 interfacePair != end; ++interfacePair) { │ │ │ │ │ - 1151 int noSend = MessageSizeCalculator() (interfacePair- │ │ │ │ │ ->second.first); │ │ │ │ │ - 1152 int noRecv = MessageSizeCalculator() (interfacePair- │ │ │ │ │ ->second.second); │ │ │ │ │ - 1153 if (noSend + noRecv > 0) │ │ │ │ │ - 1154 messageInformation_.insert(std::make_pair(interfacePair->first, │ │ │ │ │ - 1155 std::make_pair(MessageInformation(bufferSize_[0], │ │ │ │ │ - 1156 noSend*sizeof(typename CommPolicy::IndexedType)), │ │ │ │ │ - 1157 MessageInformation(bufferSize_[1], │ │ │ │ │ - 1158 noRecv*sizeof(typename CommPolicy::IndexedType))))); │ │ │ │ │ - 1159 bufferSize_[0] += noSend; │ │ │ │ │ - 1160 bufferSize_[1] += noRecv; │ │ │ │ │ - 1161 } │ │ │ │ │ - 1162 │ │ │ │ │ - 1163 // allocate the buffers │ │ │ │ │ - 1164 bufferSize_[0] *= sizeof(typename CommPolicy::IndexedType); │ │ │ │ │ - 1165 bufferSize_[1] *= sizeof(typename CommPolicy::IndexedType); │ │ │ │ │ - 1166 │ │ │ │ │ - 1167 buffers_[0] = new char[bufferSize_[0]]; │ │ │ │ │ - 1168 buffers_[1] = new char[bufferSize_[1]]; │ │ │ │ │ - 1169 } │ │ │ │ │ - 1170 │ │ │ │ │ - 1171 template │ │ │ │ │ - 1172 void BufferedCommunicator::build(const Data& source, const Data& dest, │ │ │ │ │ -const Interface& interface) │ │ │ │ │ - 1173 { │ │ │ │ │ - 1174 │ │ │ │ │ - 1175 interfaces_=interface.interfaces(); │ │ │ │ │ - 1176 communicator_=interface.communicator(); │ │ │ │ │ - 1177 typedef typename std::map > │ │ │ │ │ - 1178 ::const_iterator const_iterator; │ │ │ │ │ - 1179 typedef typename CommPolicy::IndexedTypeFlag Flag; │ │ │ │ │ - 1180 const const_iterator end = interfaces_.end(); │ │ │ │ │ - 1181 │ │ │ │ │ - 1182 bufferSize_[0]=0; │ │ │ │ │ - 1183 bufferSize_[1]=0; │ │ │ │ │ - 1184 │ │ │ │ │ - 1185 for(const_iterator interfacePair = interfaces_.begin(); │ │ │ │ │ - 1186 interfacePair != end; ++interfacePair) { │ │ │ │ │ - 1187 int noSend = MessageSizeCalculator() (source, interfacePair- │ │ │ │ │ ->second.first); │ │ │ │ │ - 1188 int noRecv = MessageSizeCalculator() (dest, interfacePair- │ │ │ │ │ ->second.second); │ │ │ │ │ - 1189 if (noSend + noRecv > 0) │ │ │ │ │ - 1190 messageInformation_.insert(std::make_pair(interfacePair->first, │ │ │ │ │ - 1191 std::make_pair(MessageInformation(bufferSize_[0], │ │ │ │ │ - 1192 noSend*sizeof(typename CommPolicy::IndexedType)), │ │ │ │ │ - 1193 MessageInformation(bufferSize_[1], │ │ │ │ │ - 1194 noRecv*sizeof(typename CommPolicy::IndexedType))))); │ │ │ │ │ - 1195 bufferSize_[0] += noSend; │ │ │ │ │ - 1196 bufferSize_[1] += noRecv; │ │ │ │ │ - 1197 } │ │ │ │ │ - 1198 │ │ │ │ │ - 1199 bufferSize_[0] *= sizeof(typename CommPolicy::IndexedType); │ │ │ │ │ - 1200 bufferSize_[1] *= sizeof(typename CommPolicy::IndexedType); │ │ │ │ │ - 1201 // allocate the buffers │ │ │ │ │ - 1202 buffers_[0] = new char[bufferSize_[0]]; │ │ │ │ │ - 1203 buffers_[1] = new char[bufferSize_[1]]; │ │ │ │ │ - 1204 } │ │ │ │ │ - 1205 │ │ │ │ │ - 1206 inline void BufferedCommunicator::free() │ │ │ │ │ - 1207 { │ │ │ │ │ - 1208 messageInformation_.clear(); │ │ │ │ │ - 1209 if(buffers_[0]) │ │ │ │ │ - 1210 delete[] buffers_[0]; │ │ │ │ │ - 1211 │ │ │ │ │ - 1212 if(buffers_[1]) │ │ │ │ │ - 1213 delete[] buffers_[1]; │ │ │ │ │ - 1214 buffers_[0]=buffers_[1]=0; │ │ │ │ │ - 1215 } │ │ │ │ │ - 1216 │ │ │ │ │ - 1217 inline BufferedCommunicator::~BufferedCommunicator() │ │ │ │ │ - 1218 { │ │ │ │ │ - 1219 free(); │ │ │ │ │ - 1220 } │ │ │ │ │ - 1221 │ │ │ │ │ - 1222 template │ │ │ │ │ - 1223 inline int BufferedCommunicator::MessageSizeCalculator:: │ │ │ │ │ -operator() │ │ │ │ │ - 1224 (const InterfaceInformation& info) const │ │ │ │ │ - 1225 { │ │ │ │ │ - 1226 return info.size(); │ │ │ │ │ - 1227 } │ │ │ │ │ - 1228 │ │ │ │ │ - 1229 │ │ │ │ │ - 1230 template │ │ │ │ │ - 1231 inline int BufferedCommunicator::MessageSizeCalculator:: │ │ │ │ │ -operator() │ │ │ │ │ - 1232 (const Data&, const InterfaceInformation& info) const │ │ │ │ │ - 1233 { │ │ │ │ │ - 1234 return operator()(info); │ │ │ │ │ - 1235 } │ │ │ │ │ - 1236 │ │ │ │ │ - 1237 │ │ │ │ │ - 1238 template │ │ │ │ │ - 1239 inline int BufferedCommunicator::MessageSizeCalculator::operator() │ │ │ │ │ - 1240 (const Data& data, const InterfaceInformation& info) const │ │ │ │ │ - 1241 { │ │ │ │ │ - 1242 int entries=0; │ │ │ │ │ - 1243 │ │ │ │ │ - 1244 for(size_t i=0; i < info.size(); i++) │ │ │ │ │ - 1245 entries += CommPolicy::getSize(data,info[i]); │ │ │ │ │ - 1246 │ │ │ │ │ - 1247 return entries; │ │ │ │ │ - 1248 } │ │ │ │ │ - 1249 │ │ │ │ │ - 1250 │ │ │ │ │ - 1251 template │ │ │ │ │ - 1252 inline void BufferedCommunicator:: │ │ │ │ │ -MessageGatherer::operator()(const │ │ │ │ │ -InterfaceMap& interfaces,const Data& data, Type* buffer, [[maybe_unused]] │ │ │ │ │ -size_t bufferSize) const │ │ │ │ │ - 1253 { │ │ │ │ │ - 1254 typedef typename InterfaceMap::const_iterator │ │ │ │ │ - 1255 const_iterator; │ │ │ │ │ - 1256 │ │ │ │ │ - 1257 int rank; │ │ │ │ │ - 1258 MPI_Comm_rank(MPI_COMM_WORLD, &rank); │ │ │ │ │ - 1259 const const_iterator end = interfaces.end(); │ │ │ │ │ - 1260 size_t index=0; │ │ │ │ │ - 1261 │ │ │ │ │ - 1262 for(const_iterator interfacePair = interfaces.begin(); │ │ │ │ │ - 1263 interfacePair != end; ++interfacePair) { │ │ │ │ │ - 1264 int size = forward ? interfacePair->second.first.size() : │ │ │ │ │ - 1265 interfacePair->second.second.size(); │ │ │ │ │ - 1266 │ │ │ │ │ - 1267 for(int i=0; i < size; i++) { │ │ │ │ │ - 1268 int local = forward ? interfacePair->second.first[i] : │ │ │ │ │ - 1269 interfacePair->second.second[i]; │ │ │ │ │ - 1270 for(std::size_t j=0; j < CommPolicy::getSize(data, local); j++, │ │ │ │ │ -index++) { │ │ │ │ │ - 1271 │ │ │ │ │ - 1272#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ - 1273 assert(bufferSize>=(index+1)*sizeof(typename CommPolicy:: │ │ │ │ │ -IndexedType)); │ │ │ │ │ - 1274#endif │ │ │ │ │ - 1275 buffer[index]=GatherScatter::gather(data, local, j); │ │ │ │ │ - 1276 } │ │ │ │ │ - 1277 │ │ │ │ │ - 1278 } │ │ │ │ │ - 1279 } │ │ │ │ │ - 1280 │ │ │ │ │ - 1281 } │ │ │ │ │ - 1282 │ │ │ │ │ - 1283 │ │ │ │ │ - 1284 template │ │ │ │ │ - 1285 inline void BufferedCommunicator:: │ │ │ │ │ -MessageGatherer::operator()( │ │ │ │ │ - 1286 const InterfaceMap& interfaces, const Data& data, Type* buffer, [ │ │ │ │ │ -[maybe_unused]] size_t bufferSize) const │ │ │ │ │ - 1287 { │ │ │ │ │ - 1288 typedef typename InterfaceMap::const_iterator │ │ │ │ │ - 1289 const_iterator; │ │ │ │ │ - 1290 const const_iterator end = interfaces.end(); │ │ │ │ │ - 1291 size_t index = 0; │ │ │ │ │ - 1292 │ │ │ │ │ - 1293 int rank; │ │ │ │ │ - 1294 MPI_Comm_rank(MPI_COMM_WORLD, &rank); │ │ │ │ │ - 1295 │ │ │ │ │ - 1296 for(const_iterator interfacePair = interfaces.begin(); │ │ │ │ │ - 1297 interfacePair != end; ++interfacePair) { │ │ │ │ │ - 1298 size_t size = FORWARD ? interfacePair->second.first.size() : │ │ │ │ │ - 1299 interfacePair->second.second.size(); │ │ │ │ │ - 1300 │ │ │ │ │ - 1301 for(size_t i=0; i < size; i++) { │ │ │ │ │ - 1302 │ │ │ │ │ - 1303#ifdef DUNE_ISTL_WITH_CHECKING │ │ │ │ │ - 1304 assert(bufferSize>=(index+1)*sizeof(typename CommPolicy:: │ │ │ │ │ -IndexedType)); │ │ │ │ │ - 1305#endif │ │ │ │ │ - 1306 │ │ │ │ │ - 1307 buffer[index++] = GatherScatter::gather(data, FORWARD ? interfacePair- │ │ │ │ │ ->second.first[i] : │ │ │ │ │ - 1308 interfacePair->second.second[i]); │ │ │ │ │ - 1309 } │ │ │ │ │ - 1310 } │ │ │ │ │ - 1311 │ │ │ │ │ - 1312 } │ │ │ │ │ - 1313 │ │ │ │ │ - 1314 │ │ │ │ │ - 1315 template │ │ │ │ │ - 1316 inline void BufferedCommunicator:: │ │ │ │ │ -MessageScatterer::operator()(const │ │ │ │ │ -InterfaceMap& interfaces, Data& data, Type* buffer, const int& proc) const │ │ │ │ │ - 1317 { │ │ │ │ │ - 1318 typedef typename InterfaceMap::value_type::second_type::first_type │ │ │ │ │ -Information; │ │ │ │ │ - 1319 const typename InterfaceMap::const_iterator infoPair = interfaces.find │ │ │ │ │ -(proc); │ │ │ │ │ - 1320 │ │ │ │ │ - 1321 assert(infoPair!=interfaces.end()); │ │ │ │ │ - 1322 │ │ │ │ │ - 1323 const Information& info = FORWARD ? infoPair->second.second : │ │ │ │ │ - 1324 infoPair->second.first; │ │ │ │ │ - 1325 │ │ │ │ │ - 1326 for(size_t i=0, index=0; i < info.size(); i++) { │ │ │ │ │ - 1327 for(size_t j=0; j < CommPolicy::getSize(data, info[i]); j++) │ │ │ │ │ - 1328 GatherScatter::scatter(data, buffer[index++], info[i], j); │ │ │ │ │ - 1329 } │ │ │ │ │ - 1330 } │ │ │ │ │ - 1331 │ │ │ │ │ - 1332 │ │ │ │ │ - 1333 template │ │ │ │ │ - 1334 inline void BufferedCommunicator:: │ │ │ │ │ -MessageScatterer::operator()(const │ │ │ │ │ -InterfaceMap& interfaces, Data& data, Type* buffer, const int& proc) const │ │ │ │ │ - 1335 { │ │ │ │ │ - 1336 typedef typename InterfaceMap::value_type::second_type::first_type │ │ │ │ │ -Information; │ │ │ │ │ - 1337 const typename InterfaceMap::const_iterator infoPair = interfaces.find │ │ │ │ │ -(proc); │ │ │ │ │ - 1338 │ │ │ │ │ - 1339 assert(infoPair!=interfaces.end()); │ │ │ │ │ - 1340 │ │ │ │ │ - 1341 const Information& info = FORWARD ? infoPair->second.second : │ │ │ │ │ - 1342 infoPair->second.first; │ │ │ │ │ - 1343 │ │ │ │ │ - 1344 for(size_t i=0; i < info.size(); i++) { │ │ │ │ │ - 1345 GatherScatter::scatter(data, buffer[i], info[i]); │ │ │ │ │ - 1346 } │ │ │ │ │ - 1347 } │ │ │ │ │ - 1348 │ │ │ │ │ - 1349 │ │ │ │ │ - 1350 template │ │ │ │ │ - 1351 void BufferedCommunicator::forward(Data& data) │ │ │ │ │ - 1352 { │ │ │ │ │ - 1353 this->template sendRecv(data, data); │ │ │ │ │ - 1354 } │ │ │ │ │ - 1355 │ │ │ │ │ - 1356 │ │ │ │ │ - 1357 template │ │ │ │ │ - 1358 void BufferedCommunicator::backward(Data& data) │ │ │ │ │ - 1359 { │ │ │ │ │ - 1360 this->template sendRecv(data, data); │ │ │ │ │ - 1361 } │ │ │ │ │ - 1362 │ │ │ │ │ - 1363 │ │ │ │ │ - 1364 template │ │ │ │ │ - 1365 void BufferedCommunicator::forward(const Data& source, Data& dest) │ │ │ │ │ - 1366 { │ │ │ │ │ - 1367 this->template sendRecv(source, dest); │ │ │ │ │ - 1368 } │ │ │ │ │ - 1369 │ │ │ │ │ - 1370 │ │ │ │ │ - 1371 template │ │ │ │ │ - 1372 void BufferedCommunicator::backward(Data& source, const Data& dest) │ │ │ │ │ - 1373 { │ │ │ │ │ - 1374 this->template sendRecv(dest, source); │ │ │ │ │ - 1375 } │ │ │ │ │ - 1376 │ │ │ │ │ - 1377 │ │ │ │ │ - 1378 template │ │ │ │ │ - 1379 void BufferedCommunicator::sendRecv(const Data& source, Data& dest) │ │ │ │ │ - 1380 { │ │ │ │ │ - 1381 int rank, lrank; │ │ │ │ │ - 1382 │ │ │ │ │ - 1383 MPI_Comm_rank(MPI_COMM_WORLD,&rank); │ │ │ │ │ - 1384 MPI_Comm_rank(MPI_COMM_WORLD,&lrank); │ │ │ │ │ - 1385 │ │ │ │ │ - 1386 typedef typename CommPolicy::IndexedType Type; │ │ │ │ │ - 1387 Type *sendBuffer, *recvBuffer; │ │ │ │ │ - 1388 size_t sendBufferSize; │ │ │ │ │ - 1389#ifndef NDEBUG │ │ │ │ │ - 1390 size_t recvBufferSize; │ │ │ │ │ - 1391#endif │ │ │ │ │ - 1392 │ │ │ │ │ - 1393 if(FORWARD) { │ │ │ │ │ - 1394 sendBuffer = reinterpret_cast(buffers_[0]); │ │ │ │ │ - 1395 sendBufferSize = bufferSize_[0]; │ │ │ │ │ - 1396 recvBuffer = reinterpret_cast(buffers_[1]); │ │ │ │ │ - 1397#ifndef NDEBUG │ │ │ │ │ - 1398 recvBufferSize = bufferSize_[1]; │ │ │ │ │ - 1399#endif │ │ │ │ │ - 1400 }else{ │ │ │ │ │ - 1401 sendBuffer = reinterpret_cast(buffers_[1]); │ │ │ │ │ - 1402 sendBufferSize = bufferSize_[1]; │ │ │ │ │ - 1403 recvBuffer = reinterpret_cast(buffers_[0]); │ │ │ │ │ - 1404#ifndef NDEBUG │ │ │ │ │ - 1405 recvBufferSize = bufferSize_[0]; │ │ │ │ │ - 1406#endif │ │ │ │ │ - 1407 } │ │ │ │ │ - 1408 typedef typename CommPolicy::IndexedTypeFlag Flag; │ │ │ │ │ - 1409 │ │ │ │ │ - 1410 MessageGatherer() (interfaces_, source, │ │ │ │ │ -sendBuffer, sendBufferSize); │ │ │ │ │ - 1411 │ │ │ │ │ - 1412 MPI_Request* sendRequests = new MPI_Request[messageInformation_.size()]; │ │ │ │ │ - 1413 MPI_Request* recvRequests = new MPI_Request[messageInformation_.size()]; │ │ │ │ │ - 1414 /* Number of recvRequests that are not MPI_REQUEST_NULL */ │ │ │ │ │ - 1415 size_t numberOfRealRecvRequests = 0; │ │ │ │ │ - 1416 │ │ │ │ │ - 1417 // Setup receive first │ │ │ │ │ - 1418 typedef typename InformationMap::const_iterator const_iterator; │ │ │ │ │ - 1419 │ │ │ │ │ - 1420 const const_iterator end = messageInformation_.end(); │ │ │ │ │ - 1421 size_t i=0; │ │ │ │ │ - 1422 int* processMap = new int[messageInformation_.size()]; │ │ │ │ │ - 1423 │ │ │ │ │ - 1424 for(const_iterator info = messageInformation_.begin(); info != end; │ │ │ │ │ -++info, ++i) { │ │ │ │ │ - 1425 processMap[i]=info->first; │ │ │ │ │ - 1426 if(FORWARD) { │ │ │ │ │ - 1427 assert(info->second.second.start_*sizeof(typename CommPolicy:: │ │ │ │ │ -IndexedType)+info->second.second.size_ <= recvBufferSize ); │ │ │ │ │ - 1428 Dune::dvverb<second.second.size_<<" from │ │ │ │ │ -"<first<second.second.size_) { │ │ │ │ │ - 1430 MPI_Irecv(recvBuffer+info->second.second.start_, info- │ │ │ │ │ ->second.second.size_, │ │ │ │ │ - 1431 MPI_BYTE, info->first, commTag_, communicator_, │ │ │ │ │ - 1432 recvRequests+i); │ │ │ │ │ - 1433 numberOfRealRecvRequests += 1; │ │ │ │ │ - 1434 } else { │ │ │ │ │ - 1435 // Nothing to receive -> set request to inactive │ │ │ │ │ - 1436 recvRequests[i]=MPI_REQUEST_NULL; │ │ │ │ │ - 1437 } │ │ │ │ │ - 1438 }else{ │ │ │ │ │ - 1439 assert(info->second.first.start_*sizeof(typename CommPolicy:: │ │ │ │ │ -IndexedType)+info->second.first.size_ <= recvBufferSize ); │ │ │ │ │ - 1440 Dune::dvverb<second.first.size_<<" to │ │ │ │ │ -"<first<second.first.size_) { │ │ │ │ │ - 1442 MPI_Irecv(recvBuffer+info->second.first.start_, info->second.first.size_, │ │ │ │ │ - 1443 MPI_BYTE, info->first, commTag_, communicator_, │ │ │ │ │ - 1444 recvRequests+i); │ │ │ │ │ - 1445 numberOfRealRecvRequests += 1; │ │ │ │ │ - 1446 } else { │ │ │ │ │ - 1447 // Nothing to receive -> set request to inactive │ │ │ │ │ - 1448 recvRequests[i]=MPI_REQUEST_NULL; │ │ │ │ │ - 1449 } │ │ │ │ │ - 1450 } │ │ │ │ │ - 1451 } │ │ │ │ │ - 1452 │ │ │ │ │ - 1453 // now the send requests │ │ │ │ │ - 1454 i=0; │ │ │ │ │ - 1455 for(const_iterator info = messageInformation_.begin(); info != end; │ │ │ │ │ -++info, ++i) │ │ │ │ │ - 1456 if(FORWARD) { │ │ │ │ │ - 1457 assert(info->second.second.start_*sizeof(typename CommPolicy:: │ │ │ │ │ -IndexedType)+info->second.second.size_ <= recvBufferSize ); │ │ │ │ │ - 1458 Dune::dvverb<second.first.size_<<" to "<first<second.first.start_*sizeof(typename CommPolicy:: │ │ │ │ │ -IndexedType)+info->second.first.size_ <= sendBufferSize ); │ │ │ │ │ - 1460 if(info->second.first.size_) │ │ │ │ │ - 1461 MPI_Issend(sendBuffer+info->second.first.start_, info- │ │ │ │ │ ->second.first.size_, │ │ │ │ │ - 1462 MPI_BYTE, info->first, commTag_, communicator_, │ │ │ │ │ - 1463 sendRequests+i); │ │ │ │ │ - 1464 else │ │ │ │ │ - 1465 // Nothing to send -> set request to inactive │ │ │ │ │ - 1466 sendRequests[i]=MPI_REQUEST_NULL; │ │ │ │ │ - 1467 }else{ │ │ │ │ │ - 1468 assert(info->second.second.start_*sizeof(typename CommPolicy:: │ │ │ │ │ -IndexedType)+info->second.second.size_ <= sendBufferSize ); │ │ │ │ │ - 1469 Dune::dvverb<second.second.size_<<" to │ │ │ │ │ -"<first<second.second.size_) │ │ │ │ │ - 1471 MPI_Issend(sendBuffer+info->second.second.start_, info- │ │ │ │ │ ->second.second.size_, │ │ │ │ │ - 1472 MPI_BYTE, info->first, commTag_, communicator_, │ │ │ │ │ - 1473 sendRequests+i); │ │ │ │ │ - 1474 else │ │ │ │ │ - 1475 // Nothing to send -> set request to inactive │ │ │ │ │ - 1476 sendRequests[i]=MPI_REQUEST_NULL; │ │ │ │ │ - 1477 } │ │ │ │ │ - 1478 │ │ │ │ │ - 1479 // Wait for completion of receive and immediately start scatter │ │ │ │ │ - 1480 i=0; │ │ │ │ │ - 1481 //int success = 1; │ │ │ │ │ - 1482 int finished = MPI_UNDEFINED; │ │ │ │ │ - 1483 MPI_Status status; //[messageInformation_.size()]; │ │ │ │ │ - 1484 //MPI_Waitall(messageInformation_.size(), recvRequests, status); │ │ │ │ │ - 1485 │ │ │ │ │ - 1486 for(i=0; i< numberOfRealRecvRequests; i++) { │ │ │ │ │ - 1487 status.MPI_ERROR=MPI_SUCCESS; │ │ │ │ │ - 1488 MPI_Waitany(messageInformation_.size(), recvRequests, &finished, │ │ │ │ │ -&status); │ │ │ │ │ - 1489 assert(finished != MPI_UNDEFINED); │ │ │ │ │ - 1490 │ │ │ │ │ - 1491 if(status.MPI_ERROR==MPI_SUCCESS) { │ │ │ │ │ - 1492 int& proc = processMap[finished]; │ │ │ │ │ - 1493 typename InformationMap::const_iterator infoIter = │ │ │ │ │ -messageInformation_.find(proc); │ │ │ │ │ - 1494 assert(infoIter != messageInformation_.end()); │ │ │ │ │ - 1495 │ │ │ │ │ - 1496 MessageInformation info = (FORWARD) ? infoIter->second.second : infoIter- │ │ │ │ │ ->second.first; │ │ │ │ │ - 1497 assert(info.start_+info.size_ <= recvBufferSize); │ │ │ │ │ - 1498 │ │ │ │ │ - 1499 MessageScatterer() (interfaces_, dest, │ │ │ │ │ -recvBuffer+info.start_, proc); │ │ │ │ │ - 1500 }else{ │ │ │ │ │ - 1501 std::cerr<communicator()); │ │ │ │ │ - 1517 │ │ │ │ │ - 1518 if(!globalSuccess) │ │ │ │ │ - 1519 DUNE_THROW(CommunicationError, "A communication error occurred!"); │ │ │ │ │ - 1520 */ │ │ │ │ │ - 1521 delete[] processMap; │ │ │ │ │ - 1522 delete[] sendRequests; │ │ │ │ │ - 1523 delete[] recvRequests; │ │ │ │ │ - 1524 │ │ │ │ │ - 1525 } │ │ │ │ │ - 1526 │ │ │ │ │ - 1527#endif // DOXYGEN │ │ │ │ │ - 1528 │ │ │ │ │ - 1530} │ │ │ │ │ - 1531 │ │ │ │ │ - 1532#endif // HAVE_MPI │ │ │ │ │ - 1533 │ │ │ │ │ - 1534#endif │ │ │ │ │ -remoteindices.hh │ │ │ │ │ -Classes describing a distributed indexset. │ │ │ │ │ -exceptions.hh │ │ │ │ │ -A few common exception classes. │ │ │ │ │ -stdstreams.hh │ │ │ │ │ -Standard Dune debug streams. │ │ │ │ │ -DUNE_THROW │ │ │ │ │ -#define DUNE_THROW(E, m) │ │ │ │ │ -Definition: exceptions.hh:218 │ │ │ │ │ -Dune::dvverb │ │ │ │ │ -DVVerbType dvverb(std::cout) │ │ │ │ │ -stream for very verbose output. │ │ │ │ │ -Definition: stdstreams.hh:95 │ │ │ │ │ + 19#include │ │ │ │ │ + 20#include │ │ │ │ │ + 21#include │ │ │ │ │ + 22 │ │ │ │ │ + 23namespace Dune { │ │ │ │ │ + 24 │ │ │ │ │ +25 namespace SimdImpl { │ │ │ │ │ + 26 │ │ │ │ │ + 27 template │ │ │ │ │ +28 class Inserter { │ │ │ │ │ + 29 T value_; │ │ │ │ │ + 30 │ │ │ │ │ + 31 public: │ │ │ │ │ +32 Inserter(const T &value) : value_(value) {} │ │ │ │ │ + 33 │ │ │ │ │ + 34 template::value> > │ │ │ │ │ +37 friend Stream& operator<<(Stream &out, const Inserter &ins) │ │ │ │ │ + 38 { │ │ │ │ │ + 39 const char *sep = "<"; │ │ │ │ │ + 40 for(auto l : range(Simd::lanes(ins.value_))) │ │ │ │ │ + 41 { │ │ │ │ │ + 42 out << sep << autoCopy(Simd::lane(l, ins.value_)); │ │ │ │ │ + 43 sep = ", "; │ │ │ │ │ + 44 } │ │ │ │ │ + 45 out << '>'; │ │ │ │ │ + 46 return out; │ │ │ │ │ + 47 } │ │ │ │ │ + 48 }; │ │ │ │ │ + 49 │ │ │ │ │ + 50 template() != 1> > │ │ │ │ │ +51 Inserter io(const V &v) │ │ │ │ │ + 52 { │ │ │ │ │ + 53 return { v }; │ │ │ │ │ + 54 } │ │ │ │ │ + 55 │ │ │ │ │ + 56 template() == 1> > │ │ │ │ │ +57 Simd::Scalar io(const V &v) │ │ │ │ │ + 58 { │ │ │ │ │ + 59 return Simd::lane(0, v); │ │ │ │ │ + 60 } │ │ │ │ │ + 61 │ │ │ │ │ + 62 } │ │ │ │ │ + 63 │ │ │ │ │ + 64 namespace Simd { │ │ │ │ │ + 65 │ │ │ │ │ + 82 │ │ │ │ │ + 89 template │ │ │ │ │ +90 auto vio(const V &v) │ │ │ │ │ + 91 { │ │ │ │ │ + 92 return SimdImpl::Inserter{ v }; │ │ │ │ │ + 93 } │ │ │ │ │ + 94 │ │ │ │ │ + 96 │ │ │ │ │ + 105 template │ │ │ │ │ +106 auto io(const V &v) │ │ │ │ │ + 107 { │ │ │ │ │ + 108 return SimdImpl::io(v); │ │ │ │ │ + 109 } │ │ │ │ │ + 110 │ │ │ │ │ + 112 │ │ │ │ │ + 114 │ │ │ │ │ + 115 } // namespace Simd │ │ │ │ │ + 116} // namespace Dune │ │ │ │ │ + 117 │ │ │ │ │ + 118#endif // DUNE_COMMON_SIMD_IO_HH │ │ │ │ │ +typetraits.hh │ │ │ │ │ +Traits for type conversions and type information. │ │ │ │ │ +rangeutilities.hh │ │ │ │ │ +Utilities for reduction like operations on ranges. │ │ │ │ │ +Dune::range │ │ │ │ │ +static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from │ │ │ │ │ +>, std::integral_constant< T, to >) noexcept │ │ │ │ │ +Definition: rangeutilities.hh:300 │ │ │ │ │ +Dune::autoCopy │ │ │ │ │ +constexpr AutonomousValue< T > autoCopy(T &&v) │ │ │ │ │ +Autonomous copy of an expression's value for use in auto type deduction. │ │ │ │ │ +Definition: typetraits.hh:642 │ │ │ │ │ +Dune::Simd::lanes │ │ │ │ │ +constexpr std::size_t lanes() │ │ │ │ │ +Number of lanes in a SIMD type. │ │ │ │ │ +Definition: simd/interface.hh:305 │ │ │ │ │ +Dune::Simd::lane │ │ │ │ │ +decltype(auto) lane(std::size_t l, V &&v) │ │ │ │ │ +Extract an element of a SIMD type. │ │ │ │ │ +Definition: simd/interface.hh:324 │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::IOError │ │ │ │ │ -Default exception class for I/O errors. │ │ │ │ │ -Definition: exceptions.hh:231 │ │ │ │ │ -Dune::SizeOne │ │ │ │ │ -Flag for marking indexed data structures where data at each index is of the │ │ │ │ │ -same size. │ │ │ │ │ -Definition: communicator.hh:110 │ │ │ │ │ -Dune::VariableSize │ │ │ │ │ -Flag for marking indexed data structures where the data at each index may be a │ │ │ │ │ -variable multiple of a... │ │ │ │ │ -Definition: communicator.hh:118 │ │ │ │ │ -Dune::CommPolicy │ │ │ │ │ -Default policy used for communicating an indexed type. │ │ │ │ │ -Definition: communicator.hh:128 │ │ │ │ │ -Dune::CommPolicy::IndexedType │ │ │ │ │ -V::value_type IndexedType │ │ │ │ │ -The type we get at each index with operator[]. │ │ │ │ │ -Definition: communicator.hh:147 │ │ │ │ │ -Dune::CommPolicy::getSize │ │ │ │ │ -static int getSize(const V &, int index) │ │ │ │ │ -Get the number of primitive elements at that index. │ │ │ │ │ -Dune::CommPolicy::IndexedTypeFlag │ │ │ │ │ -SizeOne IndexedTypeFlag │ │ │ │ │ -Whether the indexed type has variable size or there is always one value at each │ │ │ │ │ -index. │ │ │ │ │ -Definition: communicator.hh:153 │ │ │ │ │ -Dune::CommPolicy::getAddress │ │ │ │ │ -static const void * getAddress(const V &v, int index) │ │ │ │ │ -Get the address of entry at an index. │ │ │ │ │ -Dune::CommPolicy::Type │ │ │ │ │ -V Type │ │ │ │ │ -The type the policy is for. │ │ │ │ │ -Definition: communicator.hh:140 │ │ │ │ │ -Dune::CommPolicy::FieldVector │ │ │ │ │ -Definition: communicator.hh:173 │ │ │ │ │ -Dune::CommPolicy::VariableBlockVector │ │ │ │ │ -Definition: communicator.hh:175 │ │ │ │ │ -Dune::CommPolicy::CommPolicy<_VariableBlockVector<_FieldVector<_K,_n_>,_A_>_>:: │ │ │ │ │ -getSize │ │ │ │ │ -static int getSize(const Type &v, int i) │ │ │ │ │ -Dune::CommPolicy::CommPolicy<_VariableBlockVector<_FieldVector<_K,_n_>,_A_>_>:: │ │ │ │ │ -IndexedTypeFlag │ │ │ │ │ -VariableSize IndexedTypeFlag │ │ │ │ │ -Definition: communicator.hh:184 │ │ │ │ │ -Dune::CommPolicy::CommPolicy<_VariableBlockVector<_FieldVector<_K,_n_>,_A_>_>:: │ │ │ │ │ -Type │ │ │ │ │ -VariableBlockVector< FieldVector< K, n >, A > Type │ │ │ │ │ -Definition: communicator.hh:180 │ │ │ │ │ -Dune::CommPolicy::CommPolicy<_VariableBlockVector<_FieldVector<_K,_n_>,_A_>_>:: │ │ │ │ │ -getAddress │ │ │ │ │ -static const void * getAddress(const Type &v, int i) │ │ │ │ │ -Dune::CommPolicy::CommPolicy<_VariableBlockVector<_FieldVector<_K,_n_>,_A_>_>:: │ │ │ │ │ -IndexedType │ │ │ │ │ -Type::B IndexedType │ │ │ │ │ -Definition: communicator.hh:182 │ │ │ │ │ -Dune::CommPolicy::CommunicationError │ │ │ │ │ -Error thrown if there was a problem with the communication. │ │ │ │ │ -Definition: communicator.hh:195 │ │ │ │ │ -Dune::CommPolicy::CopyGatherScatter │ │ │ │ │ -GatherScatter default implementation that just copies data. │ │ │ │ │ -Definition: communicator.hh:202 │ │ │ │ │ -Dune::CommPolicy::CopyGatherScatter::scatter │ │ │ │ │ -static void scatter(T &vec, const IndexedType &v, std::size_t i) │ │ │ │ │ -Dune::CommPolicy::CopyGatherScatter::IndexedType │ │ │ │ │ -CommPolicy< T >::IndexedType IndexedType │ │ │ │ │ -Definition: communicator.hh:203 │ │ │ │ │ -Dune::CommPolicy::CopyGatherScatter::gather │ │ │ │ │ -static const IndexedType & gather(const T &vec, std::size_t i) │ │ │ │ │ -Dune::BufferedCommunicator │ │ │ │ │ -A communicator that uses buffers to gather and scatter the data to be send or │ │ │ │ │ -received. │ │ │ │ │ -Definition: communicator.hh:458 │ │ │ │ │ -Dune::BufferedCommunicator::backward │ │ │ │ │ -void backward(Data &data) │ │ │ │ │ -Backward send where target and source are the same. │ │ │ │ │ -Dune::BufferedCommunicator::BufferedCommunicator │ │ │ │ │ -BufferedCommunicator() │ │ │ │ │ -Constructor. │ │ │ │ │ -Dune::BufferedCommunicator::~BufferedCommunicator │ │ │ │ │ -~BufferedCommunicator() │ │ │ │ │ -Destructor. │ │ │ │ │ -Dune::BufferedCommunicator::forward │ │ │ │ │ -void forward(const Data &source, Data &dest) │ │ │ │ │ -Send from source to target. │ │ │ │ │ -Dune::BufferedCommunicator::free │ │ │ │ │ -void free() │ │ │ │ │ -Free the allocated memory (i.e. buffers and message information. │ │ │ │ │ -Dune::BufferedCommunicator::build │ │ │ │ │ -std::enable_if< std::is_same< SizeOne, typenameCommPolicy< Data >:: │ │ │ │ │ -IndexedTypeFlag >::value, void >::type build(const Interface &interface) │ │ │ │ │ -Build the buffers and information for the communication process. │ │ │ │ │ -Dune::BufferedCommunicator::backward │ │ │ │ │ -void backward(Data &source, const Data &dest) │ │ │ │ │ -Communicate in the reverse direction, i.e. send from target to source. │ │ │ │ │ -Dune::BufferedCommunicator::build │ │ │ │ │ -void build(const Data &source, const Data &target, const Interface &interface) │ │ │ │ │ -Build the buffers and information for the communication process. │ │ │ │ │ -Dune::BufferedCommunicator::forward │ │ │ │ │ -void forward(Data &data) │ │ │ │ │ -Forward send where target and source are the same. │ │ │ │ │ -Dune::ParallelIndexSet │ │ │ │ │ -Manager class for the mapping between local indices and globally unique │ │ │ │ │ -indices. │ │ │ │ │ -Definition: indexset.hh:218 │ │ │ │ │ -Dune::InterfaceBuilder │ │ │ │ │ -Base class of all classes representing a communication interface. │ │ │ │ │ -Definition: parallel/interface.hh:35 │ │ │ │ │ -Dune::InterfaceInformation │ │ │ │ │ -Information describing an interface. │ │ │ │ │ -Definition: parallel/interface.hh:101 │ │ │ │ │ -Dune::Interface │ │ │ │ │ -Communication interface between remote and local indices. │ │ │ │ │ -Definition: parallel/interface.hh:209 │ │ │ │ │ -Dune::LocalIndex │ │ │ │ │ -An index present on the local process. │ │ │ │ │ -Definition: localindex.hh:35 │ │ │ │ │ -Dune::RemoteIndices │ │ │ │ │ -The indices present on remote processes. │ │ │ │ │ -Definition: remoteindices.hh:189 │ │ │ │ │ -Dune::RemoteIndices::GlobalIndex │ │ │ │ │ -ParallelIndexSet::GlobalIndex GlobalIndex │ │ │ │ │ -The type of the global index. │ │ │ │ │ -Definition: remoteindices.hh:215 │ │ │ │ │ -Dune::RemoteIndices::Attribute │ │ │ │ │ -LocalIndex::Attribute Attribute │ │ │ │ │ -The type of the attribute. │ │ │ │ │ -Definition: remoteindices.hh:226 │ │ │ │ │ -Dune::RemoteIndices::LocalIndex │ │ │ │ │ -ParallelIndexSet::LocalIndex LocalIndex │ │ │ │ │ -The type of the local index. │ │ │ │ │ -Definition: remoteindices.hh:221 │ │ │ │ │ -interface.hh │ │ │ │ │ -Provides classes for building the communication interface between remote │ │ │ │ │ -indices. │ │ │ │ │ +Dune::SimdImpl::Inserter │ │ │ │ │ +Definition: io.hh:28 │ │ │ │ │ +Dune::SimdImpl::Inserter::Inserter │ │ │ │ │ +Inserter(const T &value) │ │ │ │ │ +Definition: io.hh:32 │ │ │ │ │ +Dune::SimdImpl::Inserter::operator<< │ │ │ │ │ +friend Stream & operator<<(Stream &out, const Inserter &ins) │ │ │ │ │ +Definition: io.hh:37 │ │ │ │ │ +simd.hh │ │ │ │ │ +Include file for users of the SIMD abstraction layer. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00059.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: variablesizecommunicator.hh File Reference │ │ │ │ +dune-common: simd.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,79 +58,101 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
variablesizecommunicator.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Typedefs | │ │ │ │ +Functions
│ │ │ │ +
simd.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

A communicator that only needs to know the number of elements per index at the sender side. │ │ │ │ +

Abstractions for support of dedicated SIMD data types. │ │ │ │ More...

│ │ │ │ -
#include <algorithm>
│ │ │ │ -#include <cassert>
│ │ │ │ +
#include <cassert>
│ │ │ │ #include <cstddef>
│ │ │ │ -#include <functional>
│ │ │ │ -#include <map>
│ │ │ │ -#include <memory>
│ │ │ │ +#include <type_traits>
│ │ │ │ #include <utility>
│ │ │ │ -#include <vector>
│ │ │ │ -#include <mpi.h>
│ │ │ │ -#include <dune/common/concept.hh>
│ │ │ │ -#include <dune/common/parallel/interface.hh>
│ │ │ │ -#include <dune/common/parallel/mpitraits.hh>
│ │ │ │ +#include <dune/common/conditional.hh>
│ │ │ │ +#include <dune/common/debugalign.hh>
│ │ │ │ +#include <dune/common/rangeutilities.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/common/vc.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::Concept::HasFixedSize
struct  Dune::SimdScalarTypeTraits< T >
 
class  Dune::VariableSizeCommunicator< Allocator >
 A buffered communicator where the amount of data sent does not have to be known a priori. More...
struct  Dune::SimdScalarTypeTraits< AlignedNumber< T, align > >
 deduce the underlying scalar data type of an AlignedNumber More...
 
struct  Dune::SimdIndexTypeTraits< V, typename >
 
struct  Dune::SimdMaskTypeTraits< V, typename >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::Concept
 Namespace for concepts.
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Typedefs

template<typename T >
using Dune::SimdScalar = typename SimdScalarTypeTraits< T >::type
 
template<typename V >
using Dune::SimdIndex = typename SimdIndexTypeTraits< V >::type
 An simd vector of indices corresponding to a simd vector V. More...
 
template<typename V >
using Dune::SimdMask = typename SimdMaskTypeTraits< V >::type
 A simd vector of truth values corresponding to a simd vector V. More...
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<class T >
std::size_t Dune::lanes (const T &)
 get the number of lanes of a simd vector (scalar version) More...
 
template<class T >
Dune::lane (std::size_t l, const T &v)
 access a lane of a simd vector (scalar version) More...
 
template<class T >
T & Dune::lane (std::size_t l, T &v)
 access a lane of a simd vector (scalar version) More...
 
template<class T >
void Dune::assign (T &dst, const T &src, bool mask)
 masked Simd assignment (scalar version) More...
 
template<class T >
void Dune::swap (T &v1, T &v2, bool mask)
 
│ │ │ │

Detailed Description

│ │ │ │ -

A communicator that only needs to know the number of elements per index at the sender side.

│ │ │ │ -
Author
Markus Blatt
│ │ │ │ -

Variable Documentation

│ │ │ │ - │ │ │ │ -

◆ fixedSize

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
std::size_t fixedSize
│ │ │ │ -
│ │ │ │ - │ │ │ │ -

The number of data items per index if it is fixed, 0 otherwise.

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

Abstractions for support of dedicated SIMD data types.

│ │ │ │ +

Libraries like Vc (https://github.com/VcDevel/Vc) add high-level data types for SIMD (or vectorization) support in C++. Most of these operations mimic the behavior of a numerical data type. Some boolean operations can not be implemented in a compatible way to trivial data types.

│ │ │ │ +

This header contains additional abstractions to help writing code that works with trivial numerical data types (like double) and Vc vectorization data types.

│ │ │ │ +

See also the conditional.hh and range_utils.hh headers.

│ │ │ │ +
Deprecated:
Use the newer simd architecture from dune/common/simd/simd.hh instead.
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,52 +4,81 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -Classes | Namespaces │ │ │ │ │ -variablesizecommunicator.hh File Reference │ │ │ │ │ -Common » Parallel_Communication » Parallel_Computing_based_on_Indexsets │ │ │ │ │ -A communicator that only needs to know the number of elements per index at the │ │ │ │ │ -sender side. More... │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Typedefs | Functions │ │ │ │ │ +simd.hh File Reference │ │ │ │ │ +Abstractions for support of dedicated SIMD data types. More... │ │ │ │ │ #include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -struct  Dune::Concept::HasFixedSize │ │ │ │ │ +struct  Dune::SimdScalarTypeTraits<_T_> │ │ │ │ │   │ │ │ │ │ - class  Dune::VariableSizeCommunicator<_Allocator_> │ │ │ │ │ -  A buffered communicator where the amount of data sent does not have to │ │ │ │ │ - be known a priori. More... │ │ │ │ │ +struct  Dune::SimdScalarTypeTraits<_AlignedNumber<_T,_align_>_> │ │ │ │ │ +  deduce the underlying scalar data type of an AlignedNumber More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::SimdIndexTypeTraits<_V,_typename_> │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::SimdMaskTypeTraits<_V,_typename_> │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ -namespace  Dune::Concept │ │ │ │ │ -  Namespace for concepts. │ │ │ │ │ + Typedefs │ │ │ │ │ +template │ │ │ │ │ +using Dune::SimdScalar = typename SimdScalarTypeTraits< T >::type │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +using Dune::SimdIndex = typename SimdIndexTypeTraits< V >::type │ │ │ │ │ +  An simd vector of indices corresponding to a simd vector V. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +using Dune::SimdMask = typename SimdMaskTypeTraits< V >::type │ │ │ │ │ +  A simd vector of truth values corresponding to a simd vector V. More... │ │ │ │ │ +  │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +std::size_t Dune::lanes (const T &) │ │ │ │ │ +  get the number of lanes of a simd vector (scalar version) More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + T Dune::lane (std::size_t l, const T &v) │ │ │ │ │ +  access a lane of a simd vector (scalar version) More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + T & Dune::lane (std::size_t l, T &v) │ │ │ │ │ +  access a lane of a simd vector (scalar version) More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void Dune::assign (T &dst, const T &src, bool mask) │ │ │ │ │ +  masked Simd assignment (scalar version) More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void Dune::swap (T &v1, T &v2, bool mask) │ │ │ │ │   │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -A communicator that only needs to know the number of elements per index at the │ │ │ │ │ -sender side. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ -***** Variable Documentation ***** │ │ │ │ │ -***** ◆ fixedSize ***** │ │ │ │ │ -std::size_t fixedSize │ │ │ │ │ -The number of data items per index if it is fixed, 0 otherwise. │ │ │ │ │ +Abstractions for support of dedicated SIMD data types. │ │ │ │ │ +Libraries like Vc (https://github.com/VcDevel/Vc) add high-level data types for │ │ │ │ │ +SIMD (or vectorization) support in C++. Most of these operations mimic the │ │ │ │ │ +behavior of a numerical data type. Some boolean operations can not be │ │ │ │ │ +implemented in a compatible way to trivial data types. │ │ │ │ │ +This header contains additional abstractions to help writing code that works │ │ │ │ │ +with trivial numerical data types (like double) and Vc vectorization data │ │ │ │ │ +types. │ │ │ │ │ +See also the conditional.hh and range_utils.hh headers. │ │ │ │ │ + Deprecated: │ │ │ │ │ + Use the newer simd architecture from dune/common/simd/simd.hh instead. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00059_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: variablesizecommunicator.hh Source File │ │ │ │ +dune-common: simd.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,893 +58,507 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
variablesizecommunicator.hh
│ │ │ │ +
simd.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 (C) 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_PARALLEL_VARIABLESIZECOMMUNICATOR_HH // Still fits the line!
│ │ │ │ -
6#define DUNE_COMMON_PARALLEL_VARIABLESIZECOMMUNICATOR_HH
│ │ │ │ -
7
│ │ │ │ -
8#if HAVE_MPI
│ │ │ │ -
9
│ │ │ │ -
10#include <algorithm>
│ │ │ │ -
11#include <cassert>
│ │ │ │ -
12#include <cstddef>
│ │ │ │ -
13#include <functional>
│ │ │ │ -
14#include <map>
│ │ │ │ -
15#include <memory>
│ │ │ │ -
16#include <utility>
│ │ │ │ -
17#include <vector>
│ │ │ │ -
18#include <algorithm>
│ │ │ │ -
19
│ │ │ │ -
20#include <mpi.h>
│ │ │ │ -
21
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
25
│ │ │ │ -
38namespace Dune
│ │ │ │ -
39{
│ │ │ │ -
40
│ │ │ │ -
41namespace Concept {
│ │ │ │ -
42
│ │ │ │ - │ │ │ │ -
44 template <typename H> auto require(H &&h) -> decltype(h.fixedSize());
│ │ │ │ -
45};
│ │ │ │ -
46
│ │ │ │ -
47} // namespace Concept
│ │ │ │ +Go to the documentation of this file.
1// SPDX-FileCopyrightInfo: Copyright (C) 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_SIMD_HH
│ │ │ │ +
4#define DUNE_COMMON_SIMD_HH
│ │ │ │ +
5
│ │ │ │ +
6#warning dune/common/simd.hh is deprecated.
│ │ │ │ +
7#warning Use the new infrastructure from dune/common/simd/simd.h instead.
│ │ │ │ +
8
│ │ │ │ +
30#include <cassert>
│ │ │ │ +
31#include <cstddef>
│ │ │ │ +
32#include <type_traits>
│ │ │ │ +
33#include <utility>
│ │ │ │ +
34
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
38#if HAVE_VC
│ │ │ │ +
39// include Vc part of new simd interface to provide compatibility for
│ │ │ │ +
40// functionality that has been switched over.
│ │ │ │ + │ │ │ │ +
42#endif
│ │ │ │ + │ │ │ │ +
44#include <dune/common/vc.hh>
│ │ │ │ +
45
│ │ │ │ +
46namespace Dune
│ │ │ │ +
47{
│ │ │ │
48
│ │ │ │ -
49namespace Impl {
│ │ │ │ -
50
│ │ │ │ -
51template <typename H,
│ │ │ │ -
52 std::enable_if_t<models<Concept::HasFixedSize, H>(), int> = 0>
│ │ │ │ -
53constexpr bool callFixedSize(H &&handle) {
│ │ │ │ -
54 return handle.fixedSize();
│ │ │ │ -
55}
│ │ │ │ -
56
│ │ │ │ -
57} // namespace Impl
│ │ │ │ -
58
│ │ │ │ -
59namespace
│ │ │ │ -
60{
│ │ │ │ -
65template<class T, class Allocator=std::allocator<T> >
│ │ │ │ -
66class MessageBuffer
│ │ │ │ -
67{
│ │ │ │ -
68public:
│ │ │ │ -
73 explicit MessageBuffer(int size)
│ │ │ │ -
74 : buffer_(new T[size]), size_(size), position_(0)
│ │ │ │ -
75 {}
│ │ │ │ -
80 explicit MessageBuffer(const MessageBuffer& o)
│ │ │ │ -
81 : buffer_(new T[o.size_]), size_(o.size_), position_(o.position_)
│ │ │ │ -
82 {
│ │ │ │ -
83 }
│ │ │ │ -
85 ~MessageBuffer()
│ │ │ │ -
86 {
│ │ │ │ -
87 delete[] buffer_;
│ │ │ │ -
88 }
│ │ │ │ -
93 void write(const T& data)
│ │ │ │ -
94 {
│ │ │ │ -
95 buffer_[position_++]=data;
│ │ │ │ -
96 }
│ │ │ │ -
97
│ │ │ │ -
102 void read(T& data)
│ │ │ │ -
103 {
│ │ │ │ -
104 data=buffer_[position_++];
│ │ │ │ -
105 }
│ │ │ │ -
106
│ │ │ │ -
112 void reset()
│ │ │ │ -
113 {
│ │ │ │ -
114 position_=0;
│ │ │ │ -
115 }
│ │ │ │ -
116
│ │ │ │ -
121 bool finished()
│ │ │ │ -
122 {
│ │ │ │ -
123 return position_==size_;
│ │ │ │ -
124 }
│ │ │ │ -
125
│ │ │ │ -
131 bool hasSpaceForItems(int noItems)
│ │ │ │ -
132 {
│ │ │ │ -
133 return position_+noItems<=size_;
│ │ │ │ -
134 }
│ │ │ │ -
139 std::size_t size() const
│ │ │ │ -
140 {
│ │ │ │ -
141 return size_;
│ │ │ │ -
142 }
│ │ │ │ -
147 operator T*()
│ │ │ │ -
148 {
│ │ │ │ -
149 return buffer_;
│ │ │ │ -
150 }
│ │ │ │ -
151
│ │ │ │ -
152private:
│ │ │ │ -
156 T* buffer_;
│ │ │ │ -
160 std::size_t size_;
│ │ │ │ -
164 std::size_t position_;
│ │ │ │ -
165};
│ │ │ │ -
166
│ │ │ │ -
170class InterfaceTracker
│ │ │ │ -
171{
│ │ │ │ -
172public:
│ │ │ │ -
178 InterfaceTracker(int rank, InterfaceInformation info, std::size_t fixedsize=0,
│ │ │ │ -
179 bool allocateSizes=false)
│ │ │ │ -
180 : fixedSize(fixedsize),rank_(rank), index_(), interface_(info), sizes_()
│ │ │ │ -
181 {
│ │ │ │ -
182 if(allocateSizes)
│ │ │ │ -
183 {
│ │ │ │ -
184 sizes_.resize(info.size());
│ │ │ │ -
185 }
│ │ │ │ -
186 }
│ │ │ │ -
187
│ │ │ │ -
191 void moveToNextIndex()
│ │ │ │ -
192 {
│ │ │ │ -
193 index_++;
│ │ │ │ -
194 assert(index_<=interface_.size());
│ │ │ │ -
195 skipZeroIndices();
│ │ │ │ -
196 }
│ │ │ │ -
201 void increment(std::size_t i)
│ │ │ │ +
49#if HAVE_VC
│ │ │ │ +
50 namespace VcImpl {
│ │ │ │ +
52
│ │ │ │ +
61 template<class V>
│ │ │ │ +
62 class Proxy
│ │ │ │ +
63 {
│ │ │ │ +
64 static_assert(std::is_same<V, std::decay_t<V> >::value, "Class Proxy "
│ │ │ │ +
65 "may only be instantiated with unqualified types");
│ │ │ │ +
66 public:
│ │ │ │ +
67 using value_type = typename V::value_type;
│ │ │ │ +
68
│ │ │ │ +
69 private:
│ │ │ │ +
70 static_assert(std::is_arithmetic<value_type>::value,
│ │ │ │ +
71 "Only arithmetic types are supported");
│ │ │ │ +
72 V &vec_;
│ │ │ │ +
73 std::size_t idx_;
│ │ │ │ +
74
│ │ │ │ +
75 public:
│ │ │ │ +
76 Proxy(std::size_t idx, V &vec)
│ │ │ │ +
77 : vec_(vec), idx_(idx)
│ │ │ │ +
78 { }
│ │ │ │ +
79
│ │ │ │ +
80 operator value_type() const { return vec_[idx_]; }
│ │ │ │ +
81
│ │ │ │ +
82 // postfix operators
│ │ │ │ +
83
│ │ │ │ +
84 template<class T = value_type,
│ │ │ │ +
85 class = std::enable_if_t<!std::is_same<T, bool>::value> >
│ │ │ │ +
86 value_type operator++(int) { return vec_[idx_]++; }
│ │ │ │ +
87 template<class T = value_type,
│ │ │ │ +
88 class = std::enable_if_t<!std::is_same<T, bool>::value> >
│ │ │ │ +
89 value_type operator--(int) { return vec_[idx_]--; }
│ │ │ │ +
90
│ │ │ │ +
91 // unary (prefix) operators
│ │ │ │ +
92 template<class T = value_type,
│ │ │ │ +
93 class = std::enable_if_t<!std::is_same<T, bool>::value> >
│ │ │ │ +
94 Proxy &operator++() { ++(vec_[idx_]); return *this; }
│ │ │ │ +
95 template<class T = value_type,
│ │ │ │ +
96 class = std::enable_if_t<!std::is_same<T, bool>::value> >
│ │ │ │ +
97 Proxy &operator--() { --(vec_[idx_]); return *this; }
│ │ │ │ +
98 decltype(auto) operator!() const { return !(vec_[idx_]); }
│ │ │ │ +
99 decltype(auto) operator+() const { return +(vec_[idx_]); }
│ │ │ │ +
100 decltype(auto) operator-() const { return -(vec_[idx_]); }
│ │ │ │ +
101 template<class T = value_type,
│ │ │ │ +
102 class = std::enable_if_t<std::is_integral<T>::value> >
│ │ │ │ +
103 decltype(auto) operator~() const { return ~(vec_[idx_]); }
│ │ │ │ +
104
│ │ │ │ +
105 // binary operators
│ │ │ │ +
106#define DUNE_SIMD_VC_BINARY_OP(OP) \
│ │ │ │ +
107 template<class T> \
│ │ │ │ +
108 auto operator OP(T &&o) const \
│ │ │ │ +
109 -> decltype(vec_[idx_] OP valueCast(std::forward<T>(o))) \
│ │ │ │ +
110 { \
│ │ │ │ +
111 return vec_[idx_] OP valueCast(std::forward<T>(o)); \
│ │ │ │ +
112 } \
│ │ │ │ +
113 static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ +
114
│ │ │ │ +
115 DUNE_SIMD_VC_BINARY_OP(*);
│ │ │ │ +
116 DUNE_SIMD_VC_BINARY_OP(/);
│ │ │ │ +
117 DUNE_SIMD_VC_BINARY_OP(%);
│ │ │ │ +
118
│ │ │ │ +
119 DUNE_SIMD_VC_BINARY_OP(+);
│ │ │ │ +
120 DUNE_SIMD_VC_BINARY_OP(-);
│ │ │ │ +
121
│ │ │ │ +
122 DUNE_SIMD_VC_BINARY_OP(<<);
│ │ │ │ +
123 DUNE_SIMD_VC_BINARY_OP(>>);
│ │ │ │ +
124
│ │ │ │ +
125 DUNE_SIMD_VC_BINARY_OP(<);
│ │ │ │ +
126 DUNE_SIMD_VC_BINARY_OP(>);
│ │ │ │ +
127 DUNE_SIMD_VC_BINARY_OP(<=);
│ │ │ │ +
128 DUNE_SIMD_VC_BINARY_OP(>=);
│ │ │ │ +
129
│ │ │ │ +
130 DUNE_SIMD_VC_BINARY_OP(==);
│ │ │ │ +
131 DUNE_SIMD_VC_BINARY_OP(!=);
│ │ │ │ +
132
│ │ │ │ +
133 DUNE_SIMD_VC_BINARY_OP(&);
│ │ │ │ +
134 DUNE_SIMD_VC_BINARY_OP(^);
│ │ │ │ +
135 DUNE_SIMD_VC_BINARY_OP(|);
│ │ │ │ +
136
│ │ │ │ +
137 DUNE_SIMD_VC_BINARY_OP(&&);
│ │ │ │ +
138 DUNE_SIMD_VC_BINARY_OP(||);
│ │ │ │ +
139#undef DUNE_SIMD_VC_BINARY_OP
│ │ │ │ +
140
│ │ │ │ +
141#define DUNE_SIMD_VC_ASSIGNMENT(OP) \
│ │ │ │ +
142 template<class T> \
│ │ │ │ +
143 auto operator OP(T &&o) \
│ │ │ │ +
144 -> std::enable_if_t<AlwaysTrue<decltype( \
│ │ │ │ +
145 vec_[idx_] OP valueCast(std::forward<T>(o)) \
│ │ │ │ +
146 )>::value, Proxy&> \
│ │ │ │ +
147 { \
│ │ │ │ +
148 vec_[idx_] OP valueCast(std::forward<T>(o)); \
│ │ │ │ +
149 return *this; \
│ │ │ │ +
150 } \
│ │ │ │ +
151 static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ +
152
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
164#undef DUNE_SIMD_VC_ASSIGNMENT
│ │ │ │ +
165
│ │ │ │ +
166 // swap on proxies swaps the proxied vector entries. As such, it
│ │ │ │ +
167 // applies to rvalues of proxies too, not just lvalues
│ │ │ │ +
168 template<class V1, class V2>
│ │ │ │ +
169 friend void swap(Proxy<V1>, Proxy<V2>);
│ │ │ │ +
170
│ │ │ │ +
171 template<class T>
│ │ │ │ +
172 friend void swap(Proxy p1, T& s2)
│ │ │ │ +
173 {
│ │ │ │ +
174 // don't use swap() ourselves -- not supported by Vc 1.3.0 (but is
│ │ │ │ +
175 // supported by Vc 1.3.2)
│ │ │ │ +
176 T tmp = p1.vec_[p1.idx_];
│ │ │ │ +
177 p1.vec_[p1.idx_] = s2;
│ │ │ │ +
178 s2 = tmp;
│ │ │ │ +
179 }
│ │ │ │ +
180
│ │ │ │ +
181 template<class T>
│ │ │ │ +
182 friend void swap(T& s1, Proxy p2)
│ │ │ │ +
183 {
│ │ │ │ +
184 T tmp = s1;
│ │ │ │ +
185 s1 = p2.vec_[p2.idx_];
│ │ │ │ +
186 p2.vec_[p2.idx_] = tmp;
│ │ │ │ +
187 }
│ │ │ │ +
188 };
│ │ │ │ +
189
│ │ │ │ +
190 template<class V1, class V2>
│ │ │ │ +
191 void swap(Proxy<V1> p1, Proxy<V2> p2)
│ │ │ │ +
192 {
│ │ │ │ +
193 typename V1::value_type tmp = p1.vec_[p1.idx_];
│ │ │ │ +
194 p1.vec_[p1.idx_] = p2.vec_[p2.idx_];
│ │ │ │ +
195 p2.vec_[p2.idx_] = tmp;
│ │ │ │ +
196 }
│ │ │ │ +
197 } // namespace VcImpl
│ │ │ │ +
198#endif // HAVE_VC
│ │ │ │ +
199
│ │ │ │ +
200 template<typename T>
│ │ │ │ + │ │ │ │
202 {
│ │ │ │ -
203 index_+=i;
│ │ │ │ -
204 assert(index_<=interface_.size());
│ │ │ │ -
205 }
│ │ │ │ -
210 bool finished() const
│ │ │ │ -
211 {
│ │ │ │ -
212 return index_==interface_.size();
│ │ │ │ -
213 }
│ │ │ │ -
214
│ │ │ │ -
215 void skipZeroIndices()
│ │ │ │ -
216 {
│ │ │ │ -
217 // skip indices with size zero!
│ │ │ │ -
218 while(sizes_.size() && index_!=interface_.size() &&!size())
│ │ │ │ -
219 ++index_;
│ │ │ │ -
220 }
│ │ │ │ -
221
│ │ │ │ -
226 std::size_t index() const
│ │ │ │ -
227 {
│ │ │ │ -
228 return interface_[index_];
│ │ │ │ -
229 }
│ │ │ │ -
233 std::size_t size() const
│ │ │ │ -
234 {
│ │ │ │ -
235 assert(sizes_.size());
│ │ │ │ -
236 return sizes_[index_];
│ │ │ │ -
237 }
│ │ │ │ -
241 std::size_t* getSizesPointer()
│ │ │ │ -
242 {
│ │ │ │ -
243 return &sizes_[0];
│ │ │ │ -
244 }
│ │ │ │ -
249 bool empty() const
│ │ │ │ -
250 {
│ │ │ │ -
251 return !interface_.size();
│ │ │ │ -
252 }
│ │ │ │ +
203 using type = T;
│ │ │ │ +
204 };
│ │ │ │ +
205
│ │ │ │ +
206 template<typename T>
│ │ │ │ + │ │ │ │ +
208
│ │ │ │ +
209#if HAVE_VC
│ │ │ │ +
210 /*
│ │ │ │ +
211 Add Vc specializations for the SimdScalarTypeTraits trais class
│ │ │ │ +
212 */
│ │ │ │ +
213 template<typename T, typename A>
│ │ │ │ +
214 struct SimdScalarTypeTraits< Vc::Vector<T,A> >
│ │ │ │ +
215 {
│ │ │ │ +
216 using type = T;
│ │ │ │ +
217 };
│ │ │ │ +
218
│ │ │ │ +
219 template<typename T, std::size_t N, typename V, std::size_t M>
│ │ │ │ +
220 struct SimdScalarTypeTraits< Vc::SimdArray<T,N,V,M> >
│ │ │ │ +
221 {
│ │ │ │ +
222 using type = T;
│ │ │ │ +
223 };
│ │ │ │ +
224#endif // HAVE_VC
│ │ │ │ +
225
│ │ │ │ +
227 template<typename T, std::size_t align>
│ │ │ │ + │ │ │ │ +
229 {
│ │ │ │ +
230 using type = T;
│ │ │ │ +
231 };
│ │ │ │ +
232
│ │ │ │ +
233 template<typename V, typename = void>
│ │ │ │ + │ │ │ │ +
235 using type = std::size_t;
│ │ │ │ +
236 };
│ │ │ │ +
237
│ │ │ │ +
239
│ │ │ │ +
245 template<typename V>
│ │ │ │ + │ │ │ │ +
247
│ │ │ │ +
248#if HAVE_VC
│ │ │ │ +
249 template<typename T, typename A>
│ │ │ │ +
250 struct SimdIndexTypeTraits<Vc::Vector<T, A> > {
│ │ │ │ +
251 using type = typename Vc::Vector<T, A>::index_type;
│ │ │ │ +
252 };
│ │ │ │
253
│ │ │ │ -
258 std::size_t indicesLeft() const
│ │ │ │ -
259 {
│ │ │ │ -
260 return interface_.size()-index_;
│ │ │ │ -
261 }
│ │ │ │ -
265 std::size_t fixedSize;
│ │ │ │ -
269 int rank() const
│ │ │ │ -
270 {
│ │ │ │ -
271 return rank_;
│ │ │ │ -
272 }
│ │ │ │ -
276 std::size_t offset() const
│ │ │ │ -
277 {
│ │ │ │ -
278 return index_;
│ │ │ │ -
279 }
│ │ │ │ -
280private:
│ │ │ │ -
282 int rank_;
│ │ │ │ -
284 std::size_t index_;
│ │ │ │ -
286 InterfaceInformation interface_;
│ │ │ │ -
287 std::vector<std::size_t> sizes_;
│ │ │ │ -
288};
│ │ │ │ -
289
│ │ │ │ -
290
│ │ │ │ -
291} // end unnamed namespace
│ │ │ │ -
292
│ │ │ │ -
330template<class Allocator=std::allocator<std::pair<InterfaceInformation,InterfaceInformation> > >
│ │ │ │ - │ │ │ │ -
332{
│ │ │ │ -
333public:
│ │ │ │ -
338 typedef std::map<int,std::pair<InterfaceInformation,InterfaceInformation>,
│ │ │ │ -
339 std::less<int>,
│ │ │ │ -
340 typename std::allocator_traits<Allocator>::template rebind_alloc< std::pair<const int,std::pair<InterfaceInformation,InterfaceInformation> > > > InterfaceMap;
│ │ │ │ -
341
│ │ │ │ -
342#ifndef DUNE_PARALLEL_MAX_COMMUNICATION_BUFFER_SIZE
│ │ │ │ -
349 VariableSizeCommunicator(MPI_Comm comm, const InterfaceMap& inf)
│ │ │ │ -
350 : maxBufferSize_(32768), interface_(&inf)
│ │ │ │ -
351 {
│ │ │ │ -
352 MPI_Comm_dup(comm, &communicator_);
│ │ │ │ -
353 }
│ │ │ │ - │ │ │ │ -
359 : maxBufferSize_(32768), interface_(&inf.interfaces())
│ │ │ │ -
360 {
│ │ │ │ -
361 MPI_Comm_dup(inf.communicator(), &communicator_);
│ │ │ │ -
362 }
│ │ │ │ -
363#else
│ │ │ │ -
370 VariableSizeCommunicator(MPI_Comm comm, InterfaceMap& inf)
│ │ │ │ -
371 : maxBufferSize_(DUNE_PARALLEL_MAX_COMMUNICATION_BUFFER_SIZE),
│ │ │ │ -
372 interface_(&inf)
│ │ │ │ -
373 {
│ │ │ │ -
374 MPI_Comm_dup(comm, &communicator_);
│ │ │ │ -
375 }
│ │ │ │ -
380 VariableSizeCommunicator(const Interface& inf)
│ │ │ │ -
381 : maxBufferSize_(DUNE_PARALLEL_MAX_COMMUNICATION_BUFFER_SIZE),
│ │ │ │ -
382 interface_(&inf.interfaces())
│ │ │ │ +
254 template<typename T, std::size_t n, typename V>
│ │ │ │ +
255 struct SimdIndexTypeTraits<Vc::SimdArray<T, n, V> > {
│ │ │ │ +
256 using type = typename Vc::SimdArray<T, n, V>::index_type;
│ │ │ │ +
257 };
│ │ │ │ +
258#endif // HAVE_VC
│ │ │ │ +
259
│ │ │ │ +
260 template<typename V, typename = void>
│ │ │ │ + │ │ │ │ +
262 using type = bool;
│ │ │ │ +
263 };
│ │ │ │ +
264
│ │ │ │ +
266
│ │ │ │ +
269 template<typename V>
│ │ │ │ + │ │ │ │ +
271
│ │ │ │ +
272#if HAVE_VC
│ │ │ │ +
273 template<typename T, typename A>
│ │ │ │ +
274 struct SimdMaskTypeTraits<Vc::Vector<T, A> > {
│ │ │ │ +
275 using type = typename Vc::Vector<T, A>::mask_type;
│ │ │ │ +
276 };
│ │ │ │ +
277
│ │ │ │ +
278 template<typename T, std::size_t n, typename V>
│ │ │ │ +
279 struct SimdMaskTypeTraits<Vc::SimdArray<T, n, V> > {
│ │ │ │ +
280 using type = typename Vc::SimdArray<T, n, V>::mask_type;
│ │ │ │ +
281 };
│ │ │ │ +
282#endif // HAVE_VC
│ │ │ │ +
283
│ │ │ │ +
284#if HAVE_VC
│ │ │ │ +
285 /*
│ │ │ │ +
286 Add Vc specializations for cond(), see conditional.hh
│ │ │ │ +
287 */
│ │ │ │ +
288 template<typename T, typename A>
│ │ │ │ +
289 Vc::Vector<T,A> cond(const Vc::Mask<T,A> & b,
│ │ │ │ +
290 const Vc::Vector<T,A> & v1,
│ │ │ │ +
291 const Vc::Vector<T,A> & v2)
│ │ │ │ +
292 {
│ │ │ │ +
293 return std::move(Vc::iif(b, v1, v2));
│ │ │ │ +
294 }
│ │ │ │ +
295
│ │ │ │ +
296 template<typename T, std::size_t N, typename V, std::size_t M>
│ │ │ │ +
297 Vc::SimdArray<T,N,V,M> cond(const typename Vc::SimdArray<T,N,V,M>::mask_type & b,
│ │ │ │ +
298 const Vc::SimdArray<T,N,V,M> & v1,
│ │ │ │ +
299 const Vc::SimdArray<T,N,V,M> & v2)
│ │ │ │ +
300 {
│ │ │ │ +
301 return std::move(Vc::iif(b, v1, v2));
│ │ │ │ +
302 }
│ │ │ │ +
303#endif // HAVE_VC
│ │ │ │ +
304
│ │ │ │ +
305#if HAVE_VC
│ │ │ │ +
306 /*
│ │ │ │ +
307 Add Vc specializations for several boolean operations, see rangeutitlities.hh:
│ │ │ │ +
308
│ │ │ │ +
309 max_value, min_value, any_true, all_true
│ │ │ │ +
310 */
│ │ │ │ +
311 template<typename T, typename A>
│ │ │ │ +
312 T max_value(const Vc::Vector<T,A> & v)
│ │ │ │ +
313 {
│ │ │ │ +
314 return v.max();
│ │ │ │ +
315 }
│ │ │ │ +
316
│ │ │ │ +
317 template<typename T, std::size_t N, typename V, std::size_t M>
│ │ │ │ +
318 double max_value(const Vc::SimdArray<T,N,V,M> & v)
│ │ │ │ +
319 {
│ │ │ │ +
320 return v.max();
│ │ │ │ +
321 }
│ │ │ │ +
322
│ │ │ │ +
323 template<typename T, typename A>
│ │ │ │ +
324 T min_value(const Vc::Vector<T,A> & v)
│ │ │ │ +
325 {
│ │ │ │ +
326 return v.min();
│ │ │ │ +
327 }
│ │ │ │ +
328
│ │ │ │ +
329 template<typename T, std::size_t N, typename V, std::size_t M>
│ │ │ │ +
330 double min_value(const Vc::SimdArray<T,N,V,M> & v)
│ │ │ │ +
331 {
│ │ │ │ +
332 return v.min();
│ │ │ │ +
333 }
│ │ │ │ +
334
│ │ │ │ +
335 template<typename T, typename A>
│ │ │ │ +
336 bool any_true(const Vc::Mask<T,A> & v)
│ │ │ │ +
337 {
│ │ │ │ +
338 return Vc::any_of(v);
│ │ │ │ +
339 }
│ │ │ │ +
340
│ │ │ │ +
341 template<typename T, std::size_t N, typename V, std::size_t M>
│ │ │ │ +
342 bool any_true(const Vc::SimdMaskArray<T,N,V,M> & v)
│ │ │ │ +
343 {
│ │ │ │ +
344 return Vc::any_of(v);
│ │ │ │ +
345 }
│ │ │ │ +
346
│ │ │ │ +
347 template<typename T, typename A>
│ │ │ │ +
348 bool all_true(const Vc::Mask<T,A> & v)
│ │ │ │ +
349 {
│ │ │ │ +
350 return Vc::all_of(v);
│ │ │ │ +
351 }
│ │ │ │ +
352
│ │ │ │ +
353 template<typename T, std::size_t N, typename V, std::size_t M>
│ │ │ │ +
354 bool all_true(const Vc::SimdMaskArray<T,N,V,M> & v)
│ │ │ │ +
355 {
│ │ │ │ +
356 return Vc::all_of(v);
│ │ │ │ +
357 }
│ │ │ │ +
358#endif // HAVE_VC
│ │ │ │ +
359
│ │ │ │ +
361 template<class T>
│ │ │ │ +
362 std::size_t lanes(const T &) { return 1; }
│ │ │ │ +
363
│ │ │ │ +
365 template<class T>
│ │ │ │ +
366 T lane(std::size_t l, const T &v)
│ │ │ │ +
367 {
│ │ │ │ +
368 assert(l == 0);
│ │ │ │ +
369 return v;
│ │ │ │ +
370 }
│ │ │ │ +
371
│ │ │ │ +
373 template<class T>
│ │ │ │ +
374 T &lane(std::size_t l, T &v)
│ │ │ │ +
375 {
│ │ │ │ +
376 assert(l == 0);
│ │ │ │ +
377 return v;
│ │ │ │ +
378 }
│ │ │ │ +
379
│ │ │ │ +
380#if HAVE_VC
│ │ │ │ +
381 template<class T, class A>
│ │ │ │ +
382 std::size_t lanes(const Vc::Vector<T, A> &)
│ │ │ │
383 {
│ │ │ │ -
384 MPI_Comm_dup(inf.communicator(), &communicator_);
│ │ │ │ +
384 return Vc::Vector<T, A>::size();
│ │ │ │
385 }
│ │ │ │ -
386#endif
│ │ │ │ -
393 VariableSizeCommunicator(MPI_Comm comm, const InterfaceMap& inf, std::size_t max_buffer_size)
│ │ │ │ -
394 : maxBufferSize_(max_buffer_size), interface_(&inf)
│ │ │ │ -
395 {
│ │ │ │ -
396 MPI_Comm_dup(comm, &communicator_);
│ │ │ │ -
397 }
│ │ │ │ -
398
│ │ │ │ -
404 VariableSizeCommunicator(const Interface& inf, std::size_t max_buffer_size)
│ │ │ │ -
405 : maxBufferSize_(max_buffer_size), interface_(&inf.interfaces())
│ │ │ │ -
406 {
│ │ │ │ -
407 MPI_Comm_dup(inf.communicator(), &communicator_);
│ │ │ │ -
408 }
│ │ │ │ -
409
│ │ │ │ - │ │ │ │ -
411 {
│ │ │ │ -
412 MPI_Comm_free(&communicator_);
│ │ │ │ -
413 }
│ │ │ │ -
414
│ │ │ │ - │ │ │ │ -
420 maxBufferSize_ = other.maxBufferSize_;
│ │ │ │ -
421 interface_ = other.interface_;
│ │ │ │ -
422 MPI_Comm_dup(other.communicator_, &communicator_);
│ │ │ │ -
423 }
│ │ │ │ -
424
│ │ │ │ - │ │ │ │ -
430 if(this == &other) // don't do anything if objects are the same
│ │ │ │ -
431 return *this;
│ │ │ │ -
432
│ │ │ │ -
433 maxBufferSize_ = other.maxBufferSize_;
│ │ │ │ -
434 interface_ = other.interface_;
│ │ │ │ -
435 MPI_Comm_free(&communicator_);
│ │ │ │ -
436 MPI_Comm_dup(other.communicator_, &communicator_);
│ │ │ │ -
437
│ │ │ │ -
438 return *this;
│ │ │ │ +
386
│ │ │ │ +
387 template<class T, class A>
│ │ │ │ +
388 T lane(std::size_t l, const Vc::Vector<T, A> &v)
│ │ │ │ +
389 {
│ │ │ │ +
390 assert(l < lanes(v));
│ │ │ │ +
391 return v[l];
│ │ │ │ +
392 }
│ │ │ │ +
393
│ │ │ │ +
394 template<class T, class A>
│ │ │ │ +
395 auto lane(std::size_t l, Vc::Vector<T, A> &v)
│ │ │ │ +
396 {
│ │ │ │ +
397 assert(l < lanes(v));
│ │ │ │ +
398 return VcImpl::Proxy<Vc::Vector<T, A> >{l, v};
│ │ │ │ +
399 }
│ │ │ │ +
400
│ │ │ │ +
401 template<class T, std::size_t n, class V>
│ │ │ │ +
402 std::size_t lanes(const Vc::SimdArray<T, n, V> &)
│ │ │ │ +
403 {
│ │ │ │ +
404 return n;
│ │ │ │ +
405 }
│ │ │ │ +
406
│ │ │ │ +
407 template<class T, std::size_t n, class V>
│ │ │ │ +
408 T lane(std::size_t l, const Vc::SimdArray<T, n, V> &v)
│ │ │ │ +
409 {
│ │ │ │ +
410 assert(l < n);
│ │ │ │ +
411 return v[l];
│ │ │ │ +
412 }
│ │ │ │ +
413
│ │ │ │ +
414 template<class T, std::size_t n, class V>
│ │ │ │ +
415 auto lane(std::size_t l, Vc::SimdArray<T, n, V> &v)
│ │ │ │ +
416 {
│ │ │ │ +
417 assert(l < n);
│ │ │ │ +
418 return VcImpl::Proxy<Vc::SimdArray<T, n, V> >{l, v};
│ │ │ │ +
419 }
│ │ │ │ +
420
│ │ │ │ +
421 template<class T, std::size_t n, class V>
│ │ │ │ +
422 std::size_t lanes(const Vc::SimdMaskArray<T, n, V> &)
│ │ │ │ +
423 {
│ │ │ │ +
424 return n;
│ │ │ │ +
425 }
│ │ │ │ +
426
│ │ │ │ +
427 template<class T, std::size_t n, class V>
│ │ │ │ +
428 bool lane(std::size_t l, const Vc::SimdMaskArray<T, n, V> &v)
│ │ │ │ +
429 {
│ │ │ │ +
430 assert(l < n);
│ │ │ │ +
431 return v[l];
│ │ │ │ +
432 }
│ │ │ │ +
433
│ │ │ │ +
434 template<class T, std::size_t n, class V>
│ │ │ │ +
435 auto lane(std::size_t l, Vc::SimdMaskArray<T, n, V> &v)
│ │ │ │ +
436 {
│ │ │ │ +
437 assert(l < n);
│ │ │ │ +
438 return VcImpl::Proxy<Vc::SimdMaskArray<T, n, V> >{l, v};
│ │ │ │
439 }
│ │ │ │ -
440
│ │ │ │ -
460 template<class DataHandle>
│ │ │ │ -
461 void forward(DataHandle& handle)
│ │ │ │ -
462 {
│ │ │ │ -
463 communicate<true>(handle);
│ │ │ │ -
464 }
│ │ │ │ -
465
│ │ │ │ -
485 template<class DataHandle>
│ │ │ │ -
486 void backward(DataHandle& handle)
│ │ │ │ -
487 {
│ │ │ │ -
488 communicate<false>(handle);
│ │ │ │ +
440#endif // HAVE_VC
│ │ │ │ +
441
│ │ │ │ +
443
│ │ │ │ +
446 template<class T>
│ │ │ │ +
447 void assign(T &dst, const T &src, bool mask)
│ │ │ │ +
448 {
│ │ │ │ +
449 if(mask) dst = src;
│ │ │ │ +
450 }
│ │ │ │ +
451
│ │ │ │ +
452#if HAVE_VC
│ │ │ │ +
453 /*
│ │ │ │ +
454 Add Vc specializations for masked assignment
│ │ │ │ +
455 */
│ │ │ │ +
456 template<class T, class A>
│ │ │ │ +
457 void assign(Vc::Vector<T, A> &dst, const Vc::Vector<T, A> &src,
│ │ │ │ +
458 typename Vc::Vector<T, A>::mask_type mask)
│ │ │ │ +
459 {
│ │ │ │ +
460 dst(mask) = src;
│ │ │ │ +
461 }
│ │ │ │ +
462
│ │ │ │ +
463 template<class T, std::size_t n, class V>
│ │ │ │ +
464 void assign(Vc::SimdArray<T, n, V> &dst, const Vc::SimdArray<T, n, V> &src,
│ │ │ │ +
465 typename Vc::SimdArray<T, n, V>::mask_type mask)
│ │ │ │ +
466 {
│ │ │ │ +
467 dst(mask) = src;
│ │ │ │ +
468 }
│ │ │ │ +
469#endif // HAVE_VC
│ │ │ │ +
470
│ │ │ │ +
471 template<class T>
│ │ │ │ +
472 void swap(T &v1, T &v2, bool mask)
│ │ │ │ +
473 {
│ │ │ │ +
474 using std::swap;
│ │ │ │ +
475 if(mask) swap(v1, v2);
│ │ │ │ +
476 }
│ │ │ │ +
477
│ │ │ │ +
478#if HAVE_VC
│ │ │ │ +
479 /*
│ │ │ │ +
480 Add Vc specializations for masked swap
│ │ │ │ +
481 */
│ │ │ │ +
482 template<class T, class A>
│ │ │ │ +
483 void swap(Vc::Vector<T, A> &v1, Vc::Vector<T, A> &v2,
│ │ │ │ +
484 typename Vc::Vector<T, A>::mask_type mask)
│ │ │ │ +
485 {
│ │ │ │ +
486 auto tmp = v1;
│ │ │ │ +
487 v1(mask) = v2;
│ │ │ │ +
488 v2(mask) = tmp;
│ │ │ │
489 }
│ │ │ │
490
│ │ │ │ -
491private:
│ │ │ │ -
492 template<bool FORWARD, class DataHandle>
│ │ │ │ -
493 void communicateSizes(DataHandle& handle,
│ │ │ │ -
494 std::vector<InterfaceTracker>& recv_trackers);
│ │ │ │ -
495
│ │ │ │ -
502 template<bool forward,class DataHandle>
│ │ │ │ -
503 void communicate(DataHandle& handle);
│ │ │ │ -
513 template<bool FORWARD, class DataHandle>
│ │ │ │ -
514 void setupInterfaceTrackers(DataHandle& handle,
│ │ │ │ -
515 std::vector<InterfaceTracker>& send_trackers,
│ │ │ │ -
516 std::vector<InterfaceTracker>& recv_trackers);
│ │ │ │ -
524 template<bool FORWARD, class DataHandle>
│ │ │ │ -
525 void communicateFixedSize(DataHandle& handle);
│ │ │ │ -
533 template<bool FORWARD, class DataHandle>
│ │ │ │ -
534 void communicateVariableSize(DataHandle& handle);
│ │ │ │ -
541 std::size_t maxBufferSize_;
│ │ │ │ -
549 const InterfaceMap* interface_;
│ │ │ │ -
555 MPI_Comm communicator_;
│ │ │ │ -
556};
│ │ │ │ -
557
│ │ │ │ -
559namespace
│ │ │ │ -
560{
│ │ │ │ -
564template<class DataHandle>
│ │ │ │ -
565class SizeDataHandle
│ │ │ │ -
566{
│ │ │ │ -
567public:
│ │ │ │ -
568 typedef std::size_t DataType;
│ │ │ │ -
569
│ │ │ │ -
570 SizeDataHandle(DataHandle& data,
│ │ │ │ -
571 std::vector<InterfaceTracker>& trackers)
│ │ │ │ -
572 : data_(data), trackers_(trackers), index_()
│ │ │ │ -
573 {}
│ │ │ │ -
574 bool fixedSize()
│ │ │ │ -
575 {
│ │ │ │ -
576 return true;
│ │ │ │ -
577 }
│ │ │ │ -
578 std::size_t size([[maybe_unused]] std::size_t i)
│ │ │ │ -
579 {
│ │ │ │ -
580 return 1;
│ │ │ │ -
581 }
│ │ │ │ -
582 template<class B>
│ │ │ │ -
583 void gather(B& buf, int i)
│ │ │ │ -
584 {
│ │ │ │ -
585 buf.write(data_.size(i));
│ │ │ │ -
586 }
│ │ │ │ -
587 void setReceivingIndex(std::size_t i)
│ │ │ │ -
588 {
│ │ │ │ -
589 index_=i;
│ │ │ │ -
590 }
│ │ │ │ -
591 std::size_t* getSizesPointer()
│ │ │ │ -
592 {
│ │ │ │ -
593 return trackers_[index_].getSizesPointer();
│ │ │ │ -
594 }
│ │ │ │ -
595
│ │ │ │ -
596private:
│ │ │ │ -
597 DataHandle& data_;
│ │ │ │ -
598 std::vector<InterfaceTracker>& trackers_;
│ │ │ │ -
599 int index_;
│ │ │ │ -
600};
│ │ │ │ -
601
│ │ │ │ -
602template<class T>
│ │ │ │ -
603void setReceivingIndex(T&, int)
│ │ │ │ -
604{}
│ │ │ │ -
605
│ │ │ │ -
606template<class T>
│ │ │ │ -
607void setReceivingIndex(SizeDataHandle<T>& t, int i)
│ │ │ │ -
608{
│ │ │ │ -
609 t.setReceivingIndex(i);
│ │ │ │ -
610}
│ │ │ │ -
611
│ │ │ │ -
612
│ │ │ │ -
618template<bool FORWARD>
│ │ │ │ -
619struct InterfaceInformationChooser
│ │ │ │ -
620{
│ │ │ │ -
624 static const InterfaceInformation&
│ │ │ │ -
625 getSend(const std::pair<InterfaceInformation,InterfaceInformation>& info)
│ │ │ │ -
626 {
│ │ │ │ -
627 return info.first;
│ │ │ │ -
628 }
│ │ │ │ -
629
│ │ │ │ -
633 static const InterfaceInformation&
│ │ │ │ -
634 getReceive(const std::pair<InterfaceInformation,InterfaceInformation>& info)
│ │ │ │ -
635 {
│ │ │ │ -
636 return info.second;
│ │ │ │ -
637 }
│ │ │ │ -
638};
│ │ │ │ -
639
│ │ │ │ -
640template<>
│ │ │ │ -
641struct InterfaceInformationChooser<false>
│ │ │ │ -
642{
│ │ │ │ -
643 static const InterfaceInformation&
│ │ │ │ -
644 getSend(const std::pair<InterfaceInformation,InterfaceInformation>& info)
│ │ │ │ -
645 {
│ │ │ │ -
646 return info.second;
│ │ │ │ -
647 }
│ │ │ │ -
648
│ │ │ │ -
649 static const InterfaceInformation&
│ │ │ │ -
650 getReceive(const std::pair<InterfaceInformation,InterfaceInformation>& info)
│ │ │ │ -
651 {
│ │ │ │ -
652 return info.first;
│ │ │ │ -
653 }
│ │ │ │ -
654};
│ │ │ │ -
655
│ │ │ │ -
661template<class DataHandle>
│ │ │ │ -
662struct PackEntries
│ │ │ │ -
663{
│ │ │ │ -
664
│ │ │ │ -
665 int operator()(DataHandle& handle, InterfaceTracker& tracker,
│ │ │ │ -
666 MessageBuffer<typename DataHandle::DataType>& buffer,
│ │ │ │ -
667 [[maybe_unused]] int i) const
│ │ │ │ -
668 {
│ │ │ │ -
669 return operator()(handle,tracker,buffer);
│ │ │ │ -
670 }
│ │ │ │ -
671
│ │ │ │ -
679 int operator()(DataHandle& handle, InterfaceTracker& tracker,
│ │ │ │ -
680 MessageBuffer<typename DataHandle::DataType>& buffer) const
│ │ │ │ -
681 {
│ │ │ │ -
682 if(tracker.fixedSize) // fixed size if variable is >0!
│ │ │ │ -
683 {
│ │ │ │ -
684
│ │ │ │ -
685 std::size_t noIndices=std::min(buffer.size()/tracker.fixedSize, tracker.indicesLeft());
│ │ │ │ -
686 for(std::size_t i=0; i< noIndices; ++i)
│ │ │ │ -
687 {
│ │ │ │ -
688 handle.gather(buffer, tracker.index());
│ │ │ │ -
689 tracker.moveToNextIndex();
│ │ │ │ -
690 }
│ │ │ │ -
691 return noIndices*tracker.fixedSize;
│ │ │ │ -
692 }
│ │ │ │ -
693 else
│ │ │ │ -
694 {
│ │ │ │ -
695 int packed=0;
│ │ │ │ -
696 tracker.skipZeroIndices();
│ │ │ │ -
697 while(!tracker.finished())
│ │ │ │ -
698 if(buffer.hasSpaceForItems(handle.size(tracker.index())))
│ │ │ │ -
699 {
│ │ │ │ -
700 handle.gather(buffer, tracker.index());
│ │ │ │ -
701 packed+=handle.size(tracker.index());
│ │ │ │ -
702 tracker.moveToNextIndex();
│ │ │ │ -
703 }
│ │ │ │ -
704 else
│ │ │ │ -
705 break;
│ │ │ │ -
706 return packed;
│ │ │ │ -
707 }
│ │ │ │ -
708 }
│ │ │ │ -
709};
│ │ │ │ -
710
│ │ │ │ -
716template<class DataHandle>
│ │ │ │ -
717struct UnpackEntries{
│ │ │ │ -
718
│ │ │ │ -
726 bool operator()(DataHandle& handle, InterfaceTracker& tracker,
│ │ │ │ -
727 MessageBuffer<typename DataHandle::DataType>& buffer,
│ │ │ │ -
728 int count=0)
│ │ │ │ -
729 {
│ │ │ │ -
730 if(tracker.fixedSize) // fixed size if variable is >0!
│ │ │ │ -
731 {
│ │ │ │ -
732 std::size_t noIndices=std::min(buffer.size()/tracker.fixedSize, tracker.indicesLeft());
│ │ │ │ -
733
│ │ │ │ -
734 for(std::size_t i=0; i< noIndices; ++i)
│ │ │ │ -
735 {
│ │ │ │ -
736 handle.scatter(buffer, tracker.index(), tracker.fixedSize);
│ │ │ │ -
737 tracker.moveToNextIndex();
│ │ │ │ -
738 }
│ │ │ │ -
739 return tracker.finished();
│ │ │ │ -
740 }
│ │ │ │ -
741 else
│ │ │ │ -
742 {
│ │ │ │ -
743 assert(count);
│ │ │ │ -
744 for(int unpacked=0;unpacked<count;)
│ │ │ │ -
745 {
│ │ │ │ -
746 assert(!tracker.finished());
│ │ │ │ -
747 assert(buffer.hasSpaceForItems(tracker.size()));
│ │ │ │ -
748 handle.scatter(buffer, tracker.index(), tracker.size());
│ │ │ │ -
749 unpacked+=tracker.size();
│ │ │ │ -
750 tracker.moveToNextIndex();
│ │ │ │ -
751 }
│ │ │ │ -
752 return tracker.finished();
│ │ │ │ -
753 }
│ │ │ │ -
754 }
│ │ │ │ -
755};
│ │ │ │ -
756
│ │ │ │ -
757
│ │ │ │ -
761template<class DataHandle>
│ │ │ │ -
762struct UnpackSizeEntries{
│ │ │ │ -
763
│ │ │ │ -
771 bool operator()(SizeDataHandle<DataHandle>& handle, InterfaceTracker& tracker,
│ │ │ │ -
772 MessageBuffer<typename SizeDataHandle<DataHandle>::DataType>& buffer) const
│ │ │ │ -
773 {
│ │ │ │ -
774 std::size_t noIndices=std::min(buffer.size(), tracker.indicesLeft());
│ │ │ │ -
775 std::copy(static_cast<std::size_t*>(buffer), static_cast<std::size_t*>(buffer)+noIndices,
│ │ │ │ -
776 handle.getSizesPointer()+tracker.offset());
│ │ │ │ -
777 tracker.increment(noIndices);
│ │ │ │ -
778 return noIndices;
│ │ │ │ -
779 }
│ │ │ │ -
780 bool operator()(SizeDataHandle<DataHandle>& handle, InterfaceTracker& tracker,
│ │ │ │ -
781 MessageBuffer<typename SizeDataHandle<DataHandle>::DataType>& buffer, int) const
│ │ │ │ -
782 {
│ │ │ │ -
783 return operator()(handle,tracker,buffer);
│ │ │ │ -
784 }
│ │ │ │ -
785};
│ │ │ │ -
786
│ │ │ │ -
794void sendFixedSize(std::vector<InterfaceTracker>& send_trackers,
│ │ │ │ -
795 std::vector<MPI_Request>& send_requests,
│ │ │ │ -
796 std::vector<InterfaceTracker>& recv_trackers,
│ │ │ │ -
797 std::vector<MPI_Request>& recv_requests,
│ │ │ │ -
798 MPI_Comm communicator)
│ │ │ │ -
799{
│ │ │ │ -
800 typedef std::vector<InterfaceTracker>::iterator TIter;
│ │ │ │ -
801 std::vector<MPI_Request>::iterator mIter=recv_requests.begin();
│ │ │ │ -
802
│ │ │ │ -
803 for(TIter iter=recv_trackers.begin(), end=recv_trackers.end(); iter!=end;
│ │ │ │ -
804 ++iter, ++mIter)
│ │ │ │ -
805 {
│ │ │ │ -
806 MPI_Irecv(&(iter->fixedSize), 1, MPITraits<std::size_t>::getType(),
│ │ │ │ -
807 iter->rank(), 933881, communicator, &(*mIter));
│ │ │ │ -
808 }
│ │ │ │ -
809
│ │ │ │ -
810 // Send our size to all neighbours using non-blocking synchronous communication.
│ │ │ │ -
811 std::vector<MPI_Request>::iterator mIter1=send_requests.begin();
│ │ │ │ -
812 for(TIter iter=send_trackers.begin(), end=send_trackers.end();
│ │ │ │ -
813 iter!=end;
│ │ │ │ -
814 ++iter, ++mIter1)
│ │ │ │ -
815 {
│ │ │ │ -
816 MPI_Issend(&(iter->fixedSize), 1, MPITraits<std::size_t>::getType(),
│ │ │ │ -
817 iter->rank(), 933881, communicator, &(*mIter1));
│ │ │ │ -
818 }
│ │ │ │ -
819}
│ │ │ │ -
820
│ │ │ │ -
821
│ │ │ │ -
826template<class DataHandle>
│ │ │ │ -
827struct SetupSendRequest{
│ │ │ │ -
828 void operator()(DataHandle& handle,
│ │ │ │ -
829 InterfaceTracker& tracker,
│ │ │ │ -
830 MessageBuffer<typename DataHandle::DataType>& buffer,
│ │ │ │ -
831 MPI_Request& request,
│ │ │ │ -
832 MPI_Comm comm) const
│ │ │ │ -
833 {
│ │ │ │ -
834 buffer.reset();
│ │ │ │ -
835 int size=PackEntries<DataHandle>()(handle, tracker, buffer);
│ │ │ │ -
836 // Skip indices of zero size.
│ │ │ │ -
837 while(!tracker.finished() && !handle.size(tracker.index()))
│ │ │ │ -
838 tracker.moveToNextIndex();
│ │ │ │ -
839 if(size)
│ │ │ │ -
840 MPI_Issend(buffer, size, MPITraits<typename DataHandle::DataType>::getType(),
│ │ │ │ -
841 tracker.rank(), 933399, comm, &request);
│ │ │ │ -
842 }
│ │ │ │ -
843};
│ │ │ │ -
844
│ │ │ │ -
845
│ │ │ │ -
850template<class DataHandle>
│ │ │ │ -
851struct SetupRecvRequest{
│ │ │ │ -
852 void operator()(DataHandle& /*handle*/,
│ │ │ │ -
853 InterfaceTracker& tracker,
│ │ │ │ -
854 MessageBuffer<typename DataHandle::DataType>& buffer,
│ │ │ │ -
855 MPI_Request& request,
│ │ │ │ -
856 MPI_Comm comm) const
│ │ │ │ -
857 {
│ │ │ │ -
858 buffer.reset();
│ │ │ │ -
859 if(tracker.indicesLeft())
│ │ │ │ -
860 MPI_Irecv(buffer, buffer.size(), MPITraits<typename DataHandle::DataType>::getType(),
│ │ │ │ -
861 tracker.rank(), 933399, comm, &request);
│ │ │ │ -
862 }
│ │ │ │ -
863};
│ │ │ │ -
864
│ │ │ │ -
868template<class DataHandle>
│ │ │ │ -
869struct NullPackUnpackFunctor
│ │ │ │ -
870{
│ │ │ │ -
871 int operator()(DataHandle&, InterfaceTracker&,
│ │ │ │ -
872 MessageBuffer<typename DataHandle::DataType>&, int)
│ │ │ │ -
873 {
│ │ │ │ -
874 return 0;
│ │ │ │ -
875 }
│ │ │ │ -
876 int operator()(DataHandle&, InterfaceTracker&,
│ │ │ │ -
877 MessageBuffer<typename DataHandle::DataType>&)
│ │ │ │ -
878 {
│ │ │ │ -
879 return 0;
│ │ │ │ -
880 }
│ │ │ │ -
881};
│ │ │ │ -
882
│ │ │ │ -
897template<class DataHandle, class BufferFunctor, class CommunicationFunctor>
│ │ │ │ -
898std::size_t checkAndContinue(DataHandle& handle,
│ │ │ │ -
899 std::vector<InterfaceTracker>& trackers,
│ │ │ │ -
900 std::vector<MPI_Request>& requests,
│ │ │ │ -
901 std::vector<MPI_Request>& requests2,
│ │ │ │ -
902 std::vector<MessageBuffer<typename DataHandle::DataType> >& buffers,
│ │ │ │ -
903 MPI_Comm comm,
│ │ │ │ -
904 BufferFunctor buffer_func,
│ │ │ │ -
905 CommunicationFunctor comm_func,
│ │ │ │ -
906 bool valid=true,
│ │ │ │ -
907 bool getCount=false)
│ │ │ │ -
908{
│ │ │ │ -
909 std::size_t size=requests.size();
│ │ │ │ -
910 std::vector<MPI_Status> statuses(size);
│ │ │ │ -
911 int no_completed;
│ │ │ │ -
912 std::vector<int> indices(size, -1); // the indices for which the communication finished.
│ │ │ │ -
913
│ │ │ │ -
914 MPI_Testsome(size, &(requests[0]), &no_completed, &(indices[0]), &(statuses[0]));
│ │ │ │ -
915 indices.resize(no_completed);
│ │ │ │ -
916 for(std::vector<int>::iterator index=indices.begin(), end=indices.end();
│ │ │ │ -
917 index!=end; ++index)
│ │ │ │ -
918 {
│ │ │ │ -
919 InterfaceTracker& tracker=trackers[*index];
│ │ │ │ -
920 setReceivingIndex(handle, *index);
│ │ │ │ -
921 if(getCount)
│ │ │ │ -
922 {
│ │ │ │ -
923 // Get the number of entries received
│ │ │ │ -
924 int count;
│ │ │ │ -
925 MPI_Get_count(&(statuses[index-indices.begin()]),
│ │ │ │ - │ │ │ │ -
927 &count);
│ │ │ │ -
928 // Communication completed, we can reuse the buffers, e.g. unpack or repack
│ │ │ │ -
929 buffer_func(handle, tracker, buffers[*index], count);
│ │ │ │ -
930 }else
│ │ │ │ -
931 buffer_func(handle, tracker, buffers[*index]);
│ │ │ │ -
932 tracker.skipZeroIndices();
│ │ │ │ -
933 if(!tracker.finished()){
│ │ │ │ -
934 // Maybe start another communication.
│ │ │ │ -
935 comm_func(handle, tracker, buffers[*index], requests2[*index], comm);
│ │ │ │ -
936 tracker.skipZeroIndices();
│ │ │ │ -
937 if(valid)
│ │ │ │ -
938 --no_completed; // communication not finished, decrement counter for finished ones.
│ │ │ │ -
939 }
│ │ │ │ -
940 }
│ │ │ │ -
941 return no_completed;
│ │ │ │ -
942
│ │ │ │ -
943}
│ │ │ │ -
944
│ │ │ │ -
954template<class DataHandle>
│ │ │ │ -
955std::size_t receiveSizeAndSetupReceive(DataHandle& handle,
│ │ │ │ -
956 std::vector<InterfaceTracker>& trackers,
│ │ │ │ -
957 std::vector<MPI_Request>& size_requests,
│ │ │ │ -
958 std::vector<MPI_Request>& data_requests,
│ │ │ │ -
959 std::vector<MessageBuffer<typename DataHandle::DataType> >& buffers,
│ │ │ │ -
960 MPI_Comm comm)
│ │ │ │ -
961{
│ │ │ │ -
962 return checkAndContinue(handle, trackers, size_requests, data_requests, buffers, comm,
│ │ │ │ -
963 NullPackUnpackFunctor<DataHandle>(), SetupRecvRequest<DataHandle>(), false);
│ │ │ │ -
964}
│ │ │ │ -
965
│ │ │ │ -
974template<class DataHandle>
│ │ │ │ -
975std::size_t checkSendAndContinueSending(DataHandle& handle,
│ │ │ │ -
976 std::vector<InterfaceTracker>& trackers,
│ │ │ │ -
977 std::vector<MPI_Request>& requests,
│ │ │ │ -
978 std::vector<MessageBuffer<typename DataHandle::DataType> >& buffers,
│ │ │ │ -
979 MPI_Comm comm)
│ │ │ │ -
980{
│ │ │ │ -
981 return checkAndContinue(handle, trackers, requests, requests, buffers, comm,
│ │ │ │ -
982 NullPackUnpackFunctor<DataHandle>(), SetupSendRequest<DataHandle>());
│ │ │ │ -
983}
│ │ │ │ -
984
│ │ │ │ -
993template<class DataHandle>
│ │ │ │ -
994std::size_t checkReceiveAndContinueReceiving(DataHandle& handle,
│ │ │ │ -
995 std::vector<InterfaceTracker>& trackers,
│ │ │ │ -
996 std::vector<MPI_Request>& requests,
│ │ │ │ -
997 std::vector<MessageBuffer<typename DataHandle::DataType> >& buffers,
│ │ │ │ -
998 MPI_Comm comm)
│ │ │ │ -
999{
│ │ │ │ -
1000 return checkAndContinue(handle, trackers, requests, requests, buffers, comm,
│ │ │ │ -
1001 UnpackEntries<DataHandle>(), SetupRecvRequest<DataHandle>(),
│ │ │ │ -
1002 true, !Impl::callFixedSize(handle));
│ │ │ │ -
1003}
│ │ │ │ -
1004
│ │ │ │ -
1005
│ │ │ │ -
1006bool validRecvRequests(const std::vector<MPI_Request> reqs)
│ │ │ │ -
1007{
│ │ │ │ -
1008 for(std::vector<MPI_Request>::const_iterator i=reqs.begin(), end=reqs.end();
│ │ │ │ -
1009 i!=end; ++i)
│ │ │ │ -
1010 if(*i!=MPI_REQUEST_NULL)
│ │ │ │ -
1011 return true;
│ │ │ │ -
1012 return false;
│ │ │ │ -
1013}
│ │ │ │ -
1014
│ │ │ │ -
1025template<class DataHandle, class Functor>
│ │ │ │ -
1026std::size_t setupRequests(DataHandle& handle,
│ │ │ │ -
1027 std::vector<InterfaceTracker>& trackers,
│ │ │ │ -
1028 std::vector<MessageBuffer<typename DataHandle::DataType> >& buffers,
│ │ │ │ -
1029 std::vector<MPI_Request>& requests,
│ │ │ │ -
1030 const Functor& setupFunctor,
│ │ │ │ -
1031 MPI_Comm communicator)
│ │ │ │ -
1032{
│ │ │ │ -
1033 typedef typename std::vector<InterfaceTracker>::iterator TIter;
│ │ │ │ -
1034 typename std::vector<MessageBuffer<typename DataHandle::DataType> >::iterator
│ │ │ │ -
1035 biter=buffers.begin();
│ │ │ │ -
1036 typename std::vector<MPI_Request>::iterator riter=requests.begin();
│ │ │ │ -
1037 std::size_t complete=0;
│ │ │ │ -
1038 for(TIter titer=trackers.begin(), end=trackers.end(); titer!=end; ++titer, ++biter, ++riter)
│ │ │ │ -
1039 {
│ │ │ │ -
1040 setupFunctor(handle, *titer, *biter, *riter, communicator);
│ │ │ │ -
1041 complete+=titer->finished();
│ │ │ │ -
1042 }
│ │ │ │ -
1043 return complete;
│ │ │ │ -
1044}
│ │ │ │ -
1045} // end unnamed namespace
│ │ │ │ -
1046
│ │ │ │ -
1047template<class Allocator>
│ │ │ │ -
1048template<bool FORWARD, class DataHandle>
│ │ │ │ -
1049void VariableSizeCommunicator<Allocator>::setupInterfaceTrackers(DataHandle& handle,
│ │ │ │ -
1050 std::vector<InterfaceTracker>& send_trackers,
│ │ │ │ -
1051 std::vector<InterfaceTracker>& recv_trackers)
│ │ │ │ -
1052{
│ │ │ │ -
1053 if(interface_->size()==0)
│ │ │ │ -
1054 return;
│ │ │ │ -
1055 send_trackers.reserve(interface_->size());
│ │ │ │ -
1056 recv_trackers.reserve(interface_->size());
│ │ │ │ -
1057
│ │ │ │ -
1058 int fixedsize=0;
│ │ │ │ -
1059 if(Impl::callFixedSize(handle))
│ │ │ │ -
1060 ++fixedsize;
│ │ │ │ -
1061
│ │ │ │ -
1062
│ │ │ │ -
1063 typedef typename InterfaceMap::const_iterator IIter;
│ │ │ │ -
1064 for(IIter inf=interface_->begin(), end=interface_->end(); inf!=end; ++inf)
│ │ │ │ -
1065 {
│ │ │ │ -
1066
│ │ │ │ -
1067 if(Impl::callFixedSize(handle) && InterfaceInformationChooser<FORWARD>::getSend(inf->second).size())
│ │ │ │ -
1068 fixedsize=handle.size(InterfaceInformationChooser<FORWARD>::getSend(inf->second)[0]);
│ │ │ │ -
1069 assert(!Impl::callFixedSize(handle)||fixedsize>0);
│ │ │ │ -
1070 send_trackers.push_back(InterfaceTracker(inf->first,
│ │ │ │ -
1071 InterfaceInformationChooser<FORWARD>::getSend(inf->second), fixedsize));
│ │ │ │ -
1072 recv_trackers.push_back(InterfaceTracker(inf->first,
│ │ │ │ -
1073 InterfaceInformationChooser<FORWARD>::getReceive(inf->second), fixedsize, fixedsize==0));
│ │ │ │ -
1074 }
│ │ │ │ -
1075}
│ │ │ │ -
1076
│ │ │ │ -
1077template<class Allocator>
│ │ │ │ -
1078template<bool FORWARD, class DataHandle>
│ │ │ │ -
1079void VariableSizeCommunicator<Allocator>::communicateFixedSize(DataHandle& handle)
│ │ │ │ -
1080{
│ │ │ │ -
1081 std::vector<MPI_Request> size_send_req(interface_->size());
│ │ │ │ -
1082 std::vector<MPI_Request> size_recv_req(interface_->size());
│ │ │ │ -
1083
│ │ │ │ -
1084 std::vector<InterfaceTracker> send_trackers;
│ │ │ │ -
1085 std::vector<InterfaceTracker> recv_trackers;
│ │ │ │ -
1086 setupInterfaceTrackers<FORWARD>(handle,send_trackers, recv_trackers);
│ │ │ │ -
1087 sendFixedSize(send_trackers, size_send_req, recv_trackers, size_recv_req, communicator_);
│ │ │ │ -
1088
│ │ │ │ -
1089 std::vector<MPI_Request> data_send_req(interface_->size(), MPI_REQUEST_NULL);
│ │ │ │ -
1090 std::vector<MPI_Request> data_recv_req(interface_->size(), MPI_REQUEST_NULL);
│ │ │ │ -
1091 typedef typename DataHandle::DataType DataType;
│ │ │ │ -
1092 std::vector<MessageBuffer<DataType> > send_buffers(interface_->size(), MessageBuffer<DataType>(maxBufferSize_)),
│ │ │ │ -
1093 recv_buffers(interface_->size(), MessageBuffer<DataType>(maxBufferSize_));
│ │ │ │ -
1094
│ │ │ │ -
1095
│ │ │ │ -
1096 setupRequests(handle, send_trackers, send_buffers, data_send_req,
│ │ │ │ -
1097 SetupSendRequest<DataHandle>(), communicator_);
│ │ │ │ -
1098
│ │ │ │ -
1099 std::size_t no_size_to_recv, no_to_send, no_to_recv, old_size;
│ │ │ │ -
1100 no_size_to_recv = no_to_send = no_to_recv = old_size = interface_->size();
│ │ │ │ -
1101
│ │ │ │ -
1102 // Skip empty interfaces.
│ │ │ │ -
1103 typedef typename std::vector<InterfaceTracker>::const_iterator Iter;
│ │ │ │ -
1104 for(Iter i=recv_trackers.begin(), end=recv_trackers.end(); i!=end; ++i)
│ │ │ │ -
1105 if(i->empty())
│ │ │ │ -
1106 --no_to_recv;
│ │ │ │ -
1107 for(Iter i=send_trackers.begin(), end=send_trackers.end(); i!=end; ++i)
│ │ │ │ -
1108 if(i->empty())
│ │ │ │ -
1109 --no_to_send;
│ │ │ │ -
1110
│ │ │ │ -
1111 while(no_size_to_recv+no_to_send+no_to_recv)
│ │ │ │ -
1112 {
│ │ │ │ -
1113 // Receive the fixedsize and setup receives accordingly
│ │ │ │ -
1114 if(no_size_to_recv)
│ │ │ │ -
1115 no_size_to_recv -= receiveSizeAndSetupReceive(handle,recv_trackers, size_recv_req,
│ │ │ │ -
1116 data_recv_req, recv_buffers,
│ │ │ │ -
1117 communicator_);
│ │ │ │ -
1118
│ │ │ │ -
1119 // Check send completion and initiate other necessary sends
│ │ │ │ -
1120 if(no_to_send)
│ │ │ │ -
1121 no_to_send -= checkSendAndContinueSending(handle, send_trackers, data_send_req,
│ │ │ │ -
1122 send_buffers, communicator_);
│ │ │ │ -
1123 if(validRecvRequests(data_recv_req))
│ │ │ │ -
1124 // Receive data and setup new unblocking receives if necessary
│ │ │ │ -
1125 no_to_recv -= checkReceiveAndContinueReceiving(handle, recv_trackers, data_recv_req,
│ │ │ │ -
1126 recv_buffers, communicator_);
│ │ │ │ -
1127 }
│ │ │ │ -
1128
│ │ │ │ -
1129 // Wait for completion of sending the size.
│ │ │ │ -
1130 //std::vector<MPI_Status> statuses(interface_->size(), MPI_STATUSES_IGNORE);
│ │ │ │ -
1131 MPI_Waitall(size_send_req.size(), &(size_send_req[0]), MPI_STATUSES_IGNORE);
│ │ │ │ -
1132
│ │ │ │ -
1133}
│ │ │ │ -
1134
│ │ │ │ -
1135template<class Allocator>
│ │ │ │ -
1136template<bool FORWARD, class DataHandle>
│ │ │ │ -
1137void VariableSizeCommunicator<Allocator>::communicateSizes(DataHandle& handle,
│ │ │ │ -
1138 std::vector<InterfaceTracker>& data_recv_trackers)
│ │ │ │ -
1139{
│ │ │ │ -
1140 std::vector<InterfaceTracker> send_trackers;
│ │ │ │ -
1141 std::vector<InterfaceTracker> recv_trackers;
│ │ │ │ -
1142 std::size_t size = interface_->size();
│ │ │ │ -
1143 std::vector<MPI_Request> send_requests(size, MPI_REQUEST_NULL);
│ │ │ │ -
1144 std::vector<MPI_Request> recv_requests(size, MPI_REQUEST_NULL);
│ │ │ │ -
1145 std::vector<MessageBuffer<std::size_t> >
│ │ │ │ -
1146 send_buffers(size, MessageBuffer<std::size_t>(maxBufferSize_)),
│ │ │ │ -
1147 recv_buffers(size, MessageBuffer<std::size_t>(maxBufferSize_));
│ │ │ │ -
1148 SizeDataHandle<DataHandle> size_handle(handle,data_recv_trackers);
│ │ │ │ -
1149 setupInterfaceTrackers<FORWARD>(size_handle,send_trackers, recv_trackers);
│ │ │ │ -
1150 setupRequests(size_handle, send_trackers, send_buffers, send_requests,
│ │ │ │ -
1151 SetupSendRequest<SizeDataHandle<DataHandle> >(), communicator_);
│ │ │ │ -
1152 setupRequests(size_handle, recv_trackers, recv_buffers, recv_requests,
│ │ │ │ -
1153 SetupRecvRequest<SizeDataHandle<DataHandle> >(), communicator_);
│ │ │ │ -
1154
│ │ │ │ -
1155 // Count valid requests that we have to wait for.
│ │ │ │ -
1156 auto valid_req_func =
│ │ │ │ -
1157 [](const MPI_Request& req) { return req != MPI_REQUEST_NULL; };
│ │ │ │ -
1158
│ │ │ │ -
1159 auto size_to_send = std::count_if(send_requests.begin(), send_requests.end(),
│ │ │ │ -
1160 valid_req_func);
│ │ │ │ -
1161 auto size_to_recv = std::count_if(recv_requests.begin(), recv_requests.end(),
│ │ │ │ -
1162 valid_req_func);
│ │ │ │ -
1163
│ │ │ │ -
1164 while(size_to_send+size_to_recv)
│ │ │ │ -
1165 {
│ │ │ │ -
1166 if(size_to_send)
│ │ │ │ -
1167 size_to_send -=
│ │ │ │ -
1168 checkSendAndContinueSending(size_handle, send_trackers, send_requests,
│ │ │ │ -
1169 send_buffers, communicator_);
│ │ │ │ -
1170 if(size_to_recv)
│ │ │ │ -
1171 // Could have done this using checkSendAndContinueSending
│ │ │ │ -
1172 // But the call below is more efficient as UnpackSizeEntries
│ │ │ │ -
1173 // uses std::copy.
│ │ │ │ -
1174 size_to_recv -=
│ │ │ │ -
1175 checkAndContinue(size_handle, recv_trackers, recv_requests, recv_requests,
│ │ │ │ -
1176 recv_buffers, communicator_, UnpackSizeEntries<DataHandle>(),
│ │ │ │ -
1177 SetupRecvRequest<SizeDataHandle<DataHandle> >());
│ │ │ │ -
1178 }
│ │ │ │ -
1179}
│ │ │ │ -
1180
│ │ │ │ -
1181template<class Allocator>
│ │ │ │ -
1182template<bool FORWARD, class DataHandle>
│ │ │ │ -
1183void VariableSizeCommunicator<Allocator>::communicateVariableSize(DataHandle& handle)
│ │ │ │ -
1184{
│ │ │ │ -
1185
│ │ │ │ -
1186 std::vector<InterfaceTracker> send_trackers;
│ │ │ │ -
1187 std::vector<InterfaceTracker> recv_trackers;
│ │ │ │ -
1188 setupInterfaceTrackers<FORWARD>(handle, send_trackers, recv_trackers);
│ │ │ │ -
1189
│ │ │ │ -
1190 std::vector<MPI_Request> send_requests(interface_->size(), MPI_REQUEST_NULL);
│ │ │ │ -
1191 std::vector<MPI_Request> recv_requests(interface_->size(), MPI_REQUEST_NULL);
│ │ │ │ -
1192 typedef typename DataHandle::DataType DataType;
│ │ │ │ -
1193 std::vector<MessageBuffer<DataType> >
│ │ │ │ -
1194 send_buffers(interface_->size(), MessageBuffer<DataType>(maxBufferSize_)),
│ │ │ │ -
1195 recv_buffers(interface_->size(), MessageBuffer<DataType>(maxBufferSize_));
│ │ │ │ -
1196
│ │ │ │ -
1197 communicateSizes<FORWARD>(handle, recv_trackers);
│ │ │ │ -
1198 // Setup requests for sending and receiving.
│ │ │ │ -
1199 setupRequests(handle, send_trackers, send_buffers, send_requests,
│ │ │ │ -
1200 SetupSendRequest<DataHandle>(), communicator_);
│ │ │ │ -
1201 setupRequests(handle, recv_trackers, recv_buffers, recv_requests,
│ │ │ │ -
1202 SetupRecvRequest<DataHandle>(), communicator_);
│ │ │ │ -
1203
│ │ │ │ -
1204 // Determine number of valid requests.
│ │ │ │ -
1205 auto valid_req_func =
│ │ │ │ -
1206 [](const MPI_Request& req) { return req != MPI_REQUEST_NULL;};
│ │ │ │ -
1207
│ │ │ │ -
1208 auto no_to_send = std::count_if(send_requests.begin(), send_requests.end(),
│ │ │ │ -
1209 valid_req_func);
│ │ │ │ -
1210 auto no_to_recv = std::count_if(recv_requests.begin(), recv_requests.end(),
│ │ │ │ -
1211 valid_req_func);
│ │ │ │ -
1212 while(no_to_send+no_to_recv)
│ │ │ │ -
1213 {
│ │ │ │ -
1214 // Check send completion and initiate other necessary sends
│ │ │ │ -
1215 if(no_to_send)
│ │ │ │ -
1216 no_to_send -= checkSendAndContinueSending(handle, send_trackers, send_requests,
│ │ │ │ -
1217 send_buffers, communicator_);
│ │ │ │ -
1218 if(no_to_recv)
│ │ │ │ -
1219 // Receive data and setup new unblocking receives if necessary
│ │ │ │ -
1220 no_to_recv -= checkReceiveAndContinueReceiving(handle, recv_trackers, recv_requests,
│ │ │ │ -
1221 recv_buffers, communicator_);
│ │ │ │ -
1222 }
│ │ │ │ -
1223}
│ │ │ │ -
1224
│ │ │ │ -
1225template<class Allocator>
│ │ │ │ -
1226template<bool FORWARD, class DataHandle>
│ │ │ │ -
1227void VariableSizeCommunicator<Allocator>::communicate(DataHandle& handle)
│ │ │ │ -
1228{
│ │ │ │ -
1229 if( interface_->size() == 0)
│ │ │ │ -
1230 // Simply return as otherwise we will index an empty container
│ │ │ │ -
1231 // either for MPI_Wait_all or MPI_Test_some.
│ │ │ │ -
1232 return;
│ │ │ │ -
1233
│ │ │ │ -
1234 if(Impl::callFixedSize(handle))
│ │ │ │ -
1235 communicateFixedSize<FORWARD>(handle);
│ │ │ │ -
1236 else
│ │ │ │ -
1237 communicateVariableSize<FORWARD>(handle);
│ │ │ │ -
1238}
│ │ │ │ -
1239} // end namespace Dune
│ │ │ │ -
1240
│ │ │ │ -
1241#endif // HAVE_MPI
│ │ │ │ -
1242
│ │ │ │ -
1243#endif
│ │ │ │ -
Traits classes for mapping types onto MPI_Datatype.
│ │ │ │ -
std::size_t fixedSize
The number of data items per index if it is fixed, 0 otherwise.
Definition: variablesizecommunicator.hh:265
│ │ │ │ -
Infrastructure for concepts.
│ │ │ │ -
MPI_Comm communicator() const
Get the MPI Communicator.
Definition: parallel/interface.hh:417
│ │ │ │ +
491 template<class T, std::size_t n, class V>
│ │ │ │ +
492 void swap(Vc::SimdArray<T, n, V> &v1, Vc::SimdArray<T, n, V> &v2,
│ │ │ │ +
493 typename Vc::SimdArray<T, n, V>::mask_type mask)
│ │ │ │ +
494 {
│ │ │ │ +
495 auto tmp = v1;
│ │ │ │ +
496 v1(mask) = v2;
│ │ │ │ +
497 v2(mask) = tmp;
│ │ │ │ +
498 }
│ │ │ │ +
499#endif // HAVE_VC
│ │ │ │ +
500
│ │ │ │ +
501} // end namespace Dune
│ │ │ │ +
502
│ │ │ │ +
503#endif // DUNE_COMMON_SIMD_HH
│ │ │ │ +
Compatibility header for including <Vc/Vc>
│ │ │ │ +
Traits for type conversions and type information.
│ │ │ │ + │ │ │ │ + │ │ │ │ +
Utilities for reduction like operations on ranges.
│ │ │ │ +
Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v)
implements Simd::mask()
Definition: defaults.hh:153
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
auto min(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
Definition: debugalign.hh:447
│ │ │ │ -
static MPI_Datatype getType()
Definition: mpitraits.hh:48
│ │ │ │ -
size_t size() const
Get the number of entries in the interface.
Definition: parallel/interface.hh:108
│ │ │ │ -
Communication interface between remote and local indices.
Definition: parallel/interface.hh:209
│ │ │ │ -
Definition: variablesizecommunicator.hh:43
│ │ │ │ -
auto require(H &&h) -> decltype(h.fixedSize())
│ │ │ │ -
A buffered communicator where the amount of data sent does not have to be known a priori.
Definition: variablesizecommunicator.hh:332
│ │ │ │ -
VariableSizeCommunicator(const Interface &inf, std::size_t max_buffer_size)
Creates a communicator with a specific maximum buffer size.
Definition: variablesizecommunicator.hh:404
│ │ │ │ -
void backward(DataHandle &handle)
Communicate backwards.
Definition: variablesizecommunicator.hh:486
│ │ │ │ -
~VariableSizeCommunicator()
Definition: variablesizecommunicator.hh:410
│ │ │ │ -
VariableSizeCommunicator(MPI_Comm comm, const InterfaceMap &inf, std::size_t max_buffer_size)
Creates a communicator with a specific maximum buffer size.
Definition: variablesizecommunicator.hh:393
│ │ │ │ -
VariableSizeCommunicator(const VariableSizeCommunicator &other)
Copy-constructs a communicator.
Definition: variablesizecommunicator.hh:419
│ │ │ │ -
void forward(DataHandle &handle)
Communicate forward.
Definition: variablesizecommunicator.hh:461
│ │ │ │ -
VariableSizeCommunicator & operator=(const VariableSizeCommunicator &other)
Copy-assignes a communicator.
Definition: variablesizecommunicator.hh:429
│ │ │ │ -
std::map< int, std::pair< InterfaceInformation, InterfaceInformation >, std::less< int >, typename std::allocator_traits< Allocator >::template rebind_alloc< std::pair< const int, std::pair< InterfaceInformation, InterfaceInformation > > > > InterfaceMap
The type of the map from process number to InterfaceInformation for sending and receiving to and from...
Definition: variablesizecommunicator.hh:340
│ │ │ │ -
VariableSizeCommunicator(MPI_Comm comm, const InterfaceMap &inf)
Creates a communicator with the default maximum buffer size.
Definition: variablesizecommunicator.hh:349
│ │ │ │ -
VariableSizeCommunicator(const Interface &inf)
Creates a communicator with the default maximum buffer size.
Definition: variablesizecommunicator.hh:358
│ │ │ │ -
Provides classes for building the communication interface between remote indices.
│ │ │ │ +
bool any_true(const AlignedNumber< bool, align > &val)
Definition: debugalign.hh:493
│ │ │ │ +
bool all_true(const AlignedNumber< bool, align > &val)
Definition: debugalign.hh:499
│ │ │ │ +
typename SimdIndexTypeTraits< V >::type SimdIndex
An simd vector of indices corresponding to a simd vector V.
Definition: simd.hh:246
│ │ │ │ +
typename SimdScalarTypeTraits< T >::type SimdScalar
Definition: simd.hh:207
│ │ │ │ +
typename SimdMaskTypeTraits< V >::type SimdMask
A simd vector of truth values corresponding to a simd vector V.
Definition: simd.hh:270
│ │ │ │ +
T lane(std::size_t l, const T &v)
access a lane of a simd vector (scalar version)
Definition: simd.hh:366
│ │ │ │ +
void swap(T &v1, T &v2, bool mask)
Definition: simd.hh:472
│ │ │ │ +
void assign(T &dst, const T &src, bool mask)
masked Simd assignment (scalar version)
Definition: simd.hh:447
│ │ │ │ +
const T1 cond(bool b, const T1 &v1, const T2 &v2)
conditional evaluate
Definition: conditional.hh:28
│ │ │ │ +
T max_value(const AlignedNumber< T, align > &val)
Definition: debugalign.hh:481
│ │ │ │ +
T min_value(const AlignedNumber< T, align > &val)
Definition: debugalign.hh:487
│ │ │ │ +
std::size_t lanes(const T &)
get the number of lanes of a simd vector (scalar version)
Definition: simd.hh:362
│ │ │ │ +
aligned wrappers for arithmetic types
Definition: debugalign.hh:115
│ │ │ │ +
Definition: simd.hh:202
│ │ │ │ +
T type
Definition: simd.hh:203
│ │ │ │ + │ │ │ │ +
Definition: simd.hh:234
│ │ │ │ +
std::size_t type
Definition: simd.hh:235
│ │ │ │ +
Definition: simd.hh:261
│ │ │ │ +
bool type
Definition: simd.hh:262
│ │ │ │ +
SIMD abstractions for Vc.
│ │ │ │ +
#define DUNE_SIMD_VC_ASSIGNMENT(OP)
Definition: simd/vc.hh:224
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,1008 +4,556 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -variablesizecommunicator.hh │ │ │ │ │ +simd.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 (C) DUNE Project contributors, see file │ │ │ │ │ + 1// SPDX-FileCopyrightInfo: Copyright (C) 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_PARALLEL_VARIABLESIZECOMMUNICATOR_HH // Still fits the │ │ │ │ │ -line! │ │ │ │ │ - 6#define DUNE_COMMON_PARALLEL_VARIABLESIZECOMMUNICATOR_HH │ │ │ │ │ - 7 │ │ │ │ │ - 8#if HAVE_MPI │ │ │ │ │ - 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ - 16#include │ │ │ │ │ - 17#include │ │ │ │ │ - 18#include │ │ │ │ │ - 19 │ │ │ │ │ - 20#include │ │ │ │ │ - 21 │ │ │ │ │ - 22#include │ │ │ │ │ - 23#include │ │ │ │ │ - 24#include │ │ │ │ │ - 25 │ │ │ │ │ - 38namespace Dune │ │ │ │ │ - 39{ │ │ │ │ │ - 40 │ │ │ │ │ - 41namespace Concept { │ │ │ │ │ - 42 │ │ │ │ │ -43struct HasFixedSize { │ │ │ │ │ -44 template auto require(H &&h) -> decltype(h.fixedSize()); │ │ │ │ │ - 45}; │ │ │ │ │ - 46 │ │ │ │ │ - 47} // namespace Concept │ │ │ │ │ + 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ + 3#ifndef DUNE_COMMON_SIMD_HH │ │ │ │ │ + 4#define DUNE_COMMON_SIMD_HH │ │ │ │ │ + 5 │ │ │ │ │ + 6#warning dune/common/simd.hh is deprecated. │ │ │ │ │ + 7#warning Use the new infrastructure from dune/common/simd/simd.h instead. │ │ │ │ │ + 8 │ │ │ │ │ + 30#include │ │ │ │ │ + 31#include │ │ │ │ │ + 32#include │ │ │ │ │ + 33#include │ │ │ │ │ + 34 │ │ │ │ │ + 35#include │ │ │ │ │ + 36#include │ │ │ │ │ + 37#include │ │ │ │ │ + 38#if HAVE_VC │ │ │ │ │ + 39// include Vc part of new simd interface to provide compatibility for │ │ │ │ │ + 40// functionality that has been switched over. │ │ │ │ │ + 41#include │ │ │ │ │ + 42#endif │ │ │ │ │ + 43#include │ │ │ │ │ + 44#include │ │ │ │ │ + 45 │ │ │ │ │ + 46namespace Dune │ │ │ │ │ + 47{ │ │ │ │ │ 48 │ │ │ │ │ - 49namespace Impl { │ │ │ │ │ - 50 │ │ │ │ │ - 51template (), int> = 0> │ │ │ │ │ - 53constexpr bool callFixedSize(H &&handle) { │ │ │ │ │ - 54 return handle.fixedSize(); │ │ │ │ │ - 55} │ │ │ │ │ - 56 │ │ │ │ │ - 57} // namespace Impl │ │ │ │ │ - 58 │ │ │ │ │ - 59namespace │ │ │ │ │ - 60{ │ │ │ │ │ - 65template > │ │ │ │ │ - 66class MessageBuffer │ │ │ │ │ - 67{ │ │ │ │ │ - 68public: │ │ │ │ │ - 73 explicit MessageBuffer(int size) │ │ │ │ │ - 74 : buffer_(new T[size]), size_(size), position_(0) │ │ │ │ │ - 75 {} │ │ │ │ │ - 80 explicit MessageBuffer(const MessageBuffer& o) │ │ │ │ │ - 81 : buffer_(new T[o.size_]), size_(o.size_), position_(o.position_) │ │ │ │ │ - 82 { │ │ │ │ │ - 83 } │ │ │ │ │ - 85 ~MessageBuffer() │ │ │ │ │ - 86 { │ │ │ │ │ - 87 delete[] buffer_; │ │ │ │ │ - 88 } │ │ │ │ │ - 93 void write(const T& data) │ │ │ │ │ - 94 { │ │ │ │ │ - 95 buffer_[position_++]=data; │ │ │ │ │ - 96 } │ │ │ │ │ - 97 │ │ │ │ │ - 102 void read(T& data) │ │ │ │ │ - 103 { │ │ │ │ │ - 104 data=buffer_[position_++]; │ │ │ │ │ - 105 } │ │ │ │ │ - 106 │ │ │ │ │ - 112 void reset() │ │ │ │ │ - 113 { │ │ │ │ │ - 114 position_=0; │ │ │ │ │ - 115 } │ │ │ │ │ - 116 │ │ │ │ │ - 121 bool finished() │ │ │ │ │ - 122 { │ │ │ │ │ - 123 return position_==size_; │ │ │ │ │ - 124 } │ │ │ │ │ - 125 │ │ │ │ │ - 131 bool hasSpaceForItems(int noItems) │ │ │ │ │ - 132 { │ │ │ │ │ - 133 return position_+noItems<=size_; │ │ │ │ │ - 134 } │ │ │ │ │ - 139 std::size_t size() const │ │ │ │ │ - 140 { │ │ │ │ │ - 141 return size_; │ │ │ │ │ - 142 } │ │ │ │ │ - 147 operator T*() │ │ │ │ │ - 148 { │ │ │ │ │ - 149 return buffer_; │ │ │ │ │ - 150 } │ │ │ │ │ - 151 │ │ │ │ │ - 152private: │ │ │ │ │ - 156 T* buffer_; │ │ │ │ │ - 160 std::size_t size_; │ │ │ │ │ - 164 std::size_t position_; │ │ │ │ │ - 165}; │ │ │ │ │ - 166 │ │ │ │ │ - 170class InterfaceTracker │ │ │ │ │ - 171{ │ │ │ │ │ - 172public: │ │ │ │ │ - 178 InterfaceTracker(int rank, InterfaceInformation info, std::size_t │ │ │ │ │ -fixedsize=0, │ │ │ │ │ - 179 bool allocateSizes=false) │ │ │ │ │ - 180 : fixedSize(fixedsize),rank_(rank), index_(), interface_(info), sizes_() │ │ │ │ │ - 181 { │ │ │ │ │ - 182 if(allocateSizes) │ │ │ │ │ + 49#if HAVE_VC │ │ │ │ │ + 50 namespace VcImpl { │ │ │ │ │ + 52 │ │ │ │ │ + 61 template │ │ │ │ │ + 62 class Proxy │ │ │ │ │ + 63 { │ │ │ │ │ + 64 static_assert(std::is_same >::value, "Class Proxy " │ │ │ │ │ + 65 "may only be instantiated with unqualified types"); │ │ │ │ │ + 66 public: │ │ │ │ │ + 67 using value_type = typename V::value_type; │ │ │ │ │ + 68 │ │ │ │ │ + 69 private: │ │ │ │ │ + 70 static_assert(std::is_arithmetic::value, │ │ │ │ │ + 71 "Only arithmetic types are supported"); │ │ │ │ │ + 72 V &vec_; │ │ │ │ │ + 73 std::size_t idx_; │ │ │ │ │ + 74 │ │ │ │ │ + 75 public: │ │ │ │ │ + 76 Proxy(std::size_t idx, V &vec) │ │ │ │ │ + 77 : vec_(vec), idx_(idx) │ │ │ │ │ + 78 { } │ │ │ │ │ + 79 │ │ │ │ │ + 80 operator value_type() const { return vec_[idx_]; } │ │ │ │ │ + 81 │ │ │ │ │ + 82 // postfix operators │ │ │ │ │ + 83 │ │ │ │ │ + 84 template::value> > │ │ │ │ │ + 86 value_type operator++(int) { return vec_[idx_]++; } │ │ │ │ │ + 87 template::value> > │ │ │ │ │ + 89 value_type operator--(int) { return vec_[idx_]--; } │ │ │ │ │ + 90 │ │ │ │ │ + 91 // unary (prefix) operators │ │ │ │ │ + 92 template::value> > │ │ │ │ │ + 94 Proxy &operator++() { ++(vec_[idx_]); return *this; } │ │ │ │ │ + 95 template::value> > │ │ │ │ │ + 97 Proxy &operator--() { --(vec_[idx_]); return *this; } │ │ │ │ │ + 98 decltype(auto) operator!() const { return !(vec_[idx_]); } │ │ │ │ │ + 99 decltype(auto) operator+() const { return +(vec_[idx_]); } │ │ │ │ │ + 100 decltype(auto) operator-() const { return -(vec_[idx_]); } │ │ │ │ │ + 101 template::value> > │ │ │ │ │ + 103 decltype(auto) operator~() const { return ~(vec_[idx_]); } │ │ │ │ │ + 104 │ │ │ │ │ + 105 // binary operators │ │ │ │ │ + 106#define DUNE_SIMD_VC_BINARY_OP(OP) \ │ │ │ │ │ + 107 template \ │ │ │ │ │ + 108 auto operator OP(T &&o) const \ │ │ │ │ │ + 109 -> decltype(vec_[idx_] OP valueCast(std::forward(o))) \ │ │ │ │ │ + 110 { \ │ │ │ │ │ + 111 return vec_[idx_] OP valueCast(std::forward(o)); \ │ │ │ │ │ + 112 } \ │ │ │ │ │ + 113 static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ + 114 │ │ │ │ │ + 115 DUNE_SIMD_VC_BINARY_OP(*); │ │ │ │ │ + 116 DUNE_SIMD_VC_BINARY_OP(/); │ │ │ │ │ + 117 DUNE_SIMD_VC_BINARY_OP(%); │ │ │ │ │ + 118 │ │ │ │ │ + 119 DUNE_SIMD_VC_BINARY_OP(+); │ │ │ │ │ + 120 DUNE_SIMD_VC_BINARY_OP(-); │ │ │ │ │ + 121 │ │ │ │ │ + 122 DUNE_SIMD_VC_BINARY_OP(<<); │ │ │ │ │ + 123 DUNE_SIMD_VC_BINARY_OP(>>); │ │ │ │ │ + 124 │ │ │ │ │ + 125 DUNE_SIMD_VC_BINARY_OP(<); │ │ │ │ │ + 126 DUNE_SIMD_VC_BINARY_OP(>); │ │ │ │ │ + 127 DUNE_SIMD_VC_BINARY_OP(<=); │ │ │ │ │ + 128 DUNE_SIMD_VC_BINARY_OP(>=); │ │ │ │ │ + 129 │ │ │ │ │ + 130 DUNE_SIMD_VC_BINARY_OP(==); │ │ │ │ │ + 131 DUNE_SIMD_VC_BINARY_OP(!=); │ │ │ │ │ + 132 │ │ │ │ │ + 133 DUNE_SIMD_VC_BINARY_OP(&); │ │ │ │ │ + 134 DUNE_SIMD_VC_BINARY_OP(^); │ │ │ │ │ + 135 DUNE_SIMD_VC_BINARY_OP(|); │ │ │ │ │ + 136 │ │ │ │ │ + 137 DUNE_SIMD_VC_BINARY_OP(&&); │ │ │ │ │ + 138 DUNE_SIMD_VC_BINARY_OP(||); │ │ │ │ │ + 139#undef DUNE_SIMD_VC_BINARY_OP │ │ │ │ │ + 140 │ │ │ │ │ + 141#define DUNE_SIMD_VC_ASSIGNMENT(OP) \ │ │ │ │ │ + 142 template \ │ │ │ │ │ + 143 auto operator OP(T &&o) \ │ │ │ │ │ + 144 -> std::enable_if_t(o)) \ │ │ │ │ │ + 146 )>::value, Proxy&> \ │ │ │ │ │ + 147 { \ │ │ │ │ │ + 148 vec_[idx_] OP valueCast(std::forward(o)); \ │ │ │ │ │ + 149 return *this; \ │ │ │ │ │ + 150 } \ │ │ │ │ │ + 151 static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ + 152 │ │ │ │ │ + 153 DUNE_SIMD_VC_ASSIGNMENT(=); │ │ │ │ │ + 154 DUNE_SIMD_VC_ASSIGNMENT(*=); │ │ │ │ │ + 155 DUNE_SIMD_VC_ASSIGNMENT(/=); │ │ │ │ │ + 156 DUNE_SIMD_VC_ASSIGNMENT(%=); │ │ │ │ │ + 157 DUNE_SIMD_VC_ASSIGNMENT(+=); │ │ │ │ │ + 158 DUNE_SIMD_VC_ASSIGNMENT(-=); │ │ │ │ │ + 159 DUNE_SIMD_VC_ASSIGNMENT(<<=); │ │ │ │ │ + 160 DUNE_SIMD_VC_ASSIGNMENT(>>=); │ │ │ │ │ + 161 DUNE_SIMD_VC_ASSIGNMENT(&=); │ │ │ │ │ + 162 DUNE_SIMD_VC_ASSIGNMENT(^=); │ │ │ │ │ + 163 DUNE_SIMD_VC_ASSIGNMENT(|=); │ │ │ │ │ + 164#undef DUNE_SIMD_VC_ASSIGNMENT │ │ │ │ │ + 165 │ │ │ │ │ + 166 // swap on proxies swaps the proxied vector entries. As such, it │ │ │ │ │ + 167 // applies to rvalues of proxies too, not just lvalues │ │ │ │ │ + 168 template │ │ │ │ │ + 169 friend void swap(Proxy, Proxy); │ │ │ │ │ + 170 │ │ │ │ │ + 171 template │ │ │ │ │ + 172 friend void swap(Proxy p1, T& s2) │ │ │ │ │ + 173 { │ │ │ │ │ + 174 // don't use swap() ourselves -- not supported by Vc 1.3.0 (but is │ │ │ │ │ + 175 // supported by Vc 1.3.2) │ │ │ │ │ + 176 T tmp = p1.vec_[p1.idx_]; │ │ │ │ │ + 177 p1.vec_[p1.idx_] = s2; │ │ │ │ │ + 178 s2 = tmp; │ │ │ │ │ + 179 } │ │ │ │ │ + 180 │ │ │ │ │ + 181 template │ │ │ │ │ + 182 friend void swap(T& s1, Proxy p2) │ │ │ │ │ 183 { │ │ │ │ │ - 184 sizes_.resize(info.size()); │ │ │ │ │ - 185 } │ │ │ │ │ - 186 } │ │ │ │ │ - 187 │ │ │ │ │ - 191 void moveToNextIndex() │ │ │ │ │ + 184 T tmp = s1; │ │ │ │ │ + 185 s1 = p2.vec_[p2.idx_]; │ │ │ │ │ + 186 p2.vec_[p2.idx_] = tmp; │ │ │ │ │ + 187 } │ │ │ │ │ + 188 }; │ │ │ │ │ + 189 │ │ │ │ │ + 190 template │ │ │ │ │ + 191 void swap(Proxy p1, Proxy p2) │ │ │ │ │ 192 { │ │ │ │ │ - 193 index_++; │ │ │ │ │ - 194 assert(index_<=interface_.size()); │ │ │ │ │ - 195 skipZeroIndices(); │ │ │ │ │ + 193 typename V1::value_type tmp = p1.vec_[p1.idx_]; │ │ │ │ │ + 194 p1.vec_[p1.idx_] = p2.vec_[p2.idx_]; │ │ │ │ │ + 195 p2.vec_[p2.idx_] = tmp; │ │ │ │ │ 196 } │ │ │ │ │ - 201 void increment(std::size_t i) │ │ │ │ │ + 197 } // namespace VcImpl │ │ │ │ │ + 198#endif // HAVE_VC │ │ │ │ │ + 199 │ │ │ │ │ + 200 template │ │ │ │ │ +201 struct SimdScalarTypeTraits │ │ │ │ │ 202 { │ │ │ │ │ - 203 index_+=i; │ │ │ │ │ - 204 assert(index_<=interface_.size()); │ │ │ │ │ - 205 } │ │ │ │ │ - 210 bool finished() const │ │ │ │ │ - 211 { │ │ │ │ │ - 212 return index_==interface_.size(); │ │ │ │ │ - 213 } │ │ │ │ │ - 214 │ │ │ │ │ - 215 void skipZeroIndices() │ │ │ │ │ - 216 { │ │ │ │ │ - 217 // skip indices with size zero! │ │ │ │ │ - 218 while(sizes_.size() && index_!=interface_.size() &&!size()) │ │ │ │ │ - 219 ++index_; │ │ │ │ │ - 220 } │ │ │ │ │ - 221 │ │ │ │ │ - 226 std::size_t index() const │ │ │ │ │ - 227 { │ │ │ │ │ - 228 return interface_[index_]; │ │ │ │ │ - 229 } │ │ │ │ │ - 233 std::size_t size() const │ │ │ │ │ - 234 { │ │ │ │ │ - 235 assert(sizes_.size()); │ │ │ │ │ - 236 return sizes_[index_]; │ │ │ │ │ - 237 } │ │ │ │ │ - 241 std::size_t* getSizesPointer() │ │ │ │ │ - 242 { │ │ │ │ │ - 243 return &sizes_[0]; │ │ │ │ │ - 244 } │ │ │ │ │ - 249 bool empty() const │ │ │ │ │ - 250 { │ │ │ │ │ - 251 return !interface_.size(); │ │ │ │ │ - 252 } │ │ │ │ │ +203 using type = T; │ │ │ │ │ + 204 }; │ │ │ │ │ + 205 │ │ │ │ │ + 206 template │ │ │ │ │ +207 using SimdScalar = typename SimdScalarTypeTraits::type; │ │ │ │ │ + 208 │ │ │ │ │ + 209#if HAVE_VC │ │ │ │ │ + 210 /* │ │ │ │ │ + 211 Add Vc specializations for the SimdScalarTypeTraits trais class │ │ │ │ │ + 212 */ │ │ │ │ │ + 213 template │ │ │ │ │ + 214 struct SimdScalarTypeTraits< Vc::Vector > │ │ │ │ │ + 215 { │ │ │ │ │ + 216 using type = T; │ │ │ │ │ + 217 }; │ │ │ │ │ + 218 │ │ │ │ │ + 219 template │ │ │ │ │ + 220 struct SimdScalarTypeTraits< Vc::SimdArray > │ │ │ │ │ + 221 { │ │ │ │ │ + 222 using type = T; │ │ │ │ │ + 223 }; │ │ │ │ │ + 224#endif // HAVE_VC │ │ │ │ │ + 225 │ │ │ │ │ + 227 template │ │ │ │ │ +228 struct SimdScalarTypeTraits< AlignedNumber > │ │ │ │ │ + 229 { │ │ │ │ │ +230 using type = T; │ │ │ │ │ + 231 }; │ │ │ │ │ + 232 │ │ │ │ │ + 233 template │ │ │ │ │ +234 struct SimdIndexTypeTraits { │ │ │ │ │ +235 using type = std::size_t; │ │ │ │ │ + 236 }; │ │ │ │ │ + 237 │ │ │ │ │ + 239 │ │ │ │ │ + 245 template │ │ │ │ │ +246 using SimdIndex = typename SimdIndexTypeTraits::type; │ │ │ │ │ + 247 │ │ │ │ │ + 248#if HAVE_VC │ │ │ │ │ + 249 template │ │ │ │ │ + 250 struct SimdIndexTypeTraits > { │ │ │ │ │ + 251 using type = typename Vc::Vector::index_type; │ │ │ │ │ + 252 }; │ │ │ │ │ 253 │ │ │ │ │ - 258 std::size_t indicesLeft() const │ │ │ │ │ - 259 { │ │ │ │ │ - 260 return interface_.size()-index_; │ │ │ │ │ - 261 } │ │ │ │ │ -265 std::size_t fixedSize; │ │ │ │ │ - 269 int rank() const │ │ │ │ │ - 270 { │ │ │ │ │ - 271 return rank_; │ │ │ │ │ - 272 } │ │ │ │ │ - 276 std::size_t offset() const │ │ │ │ │ - 277 { │ │ │ │ │ - 278 return index_; │ │ │ │ │ - 279 } │ │ │ │ │ - 280private: │ │ │ │ │ - 282 int rank_; │ │ │ │ │ - 284 std::size_t index_; │ │ │ │ │ - 286 InterfaceInformation interface_; │ │ │ │ │ - 287 std::vector sizes_; │ │ │ │ │ - 288}; │ │ │ │ │ - 289 │ │ │ │ │ - 290 │ │ │ │ │ - 291} // end unnamed namespace │ │ │ │ │ - 292 │ │ │ │ │ - 330template > > │ │ │ │ │ -331class VariableSizeCommunicator │ │ │ │ │ - 332{ │ │ │ │ │ - 333public: │ │ │ │ │ - 338 typedef std::map, │ │ │ │ │ - 339 std::less, │ │ │ │ │ -340 typename std::allocator_traits::template rebind_alloc< std:: │ │ │ │ │ -pair > > > │ │ │ │ │ -InterfaceMap; │ │ │ │ │ - 341 │ │ │ │ │ - 342#ifndef DUNE_PARALLEL_MAX_COMMUNICATION_BUFFER_SIZE │ │ │ │ │ -349 VariableSizeCommunicator(MPI_Comm comm, const InterfaceMap& inf) │ │ │ │ │ - 350 : maxBufferSize_(32768), interface_(&inf) │ │ │ │ │ - 351 { │ │ │ │ │ - 352 MPI_Comm_dup(comm, &communicator_); │ │ │ │ │ - 353 } │ │ │ │ │ -358 VariableSizeCommunicator(const Interface& inf) │ │ │ │ │ - 359 : maxBufferSize_(32768), interface_(&inf.interfaces()) │ │ │ │ │ - 360 { │ │ │ │ │ - 361 MPI_Comm_dup(inf.communicator(), &communicator_); │ │ │ │ │ - 362 } │ │ │ │ │ - 363#else │ │ │ │ │ - 370 VariableSizeCommunicator(MPI_Comm comm, InterfaceMap& inf) │ │ │ │ │ - 371 : maxBufferSize_(DUNE_PARALLEL_MAX_COMMUNICATION_BUFFER_SIZE), │ │ │ │ │ - 372 interface_(&inf) │ │ │ │ │ - 373 { │ │ │ │ │ - 374 MPI_Comm_dup(comm, &communicator_); │ │ │ │ │ - 375 } │ │ │ │ │ - 380 VariableSizeCommunicator(const Interface& inf) │ │ │ │ │ - 381 : maxBufferSize_(DUNE_PARALLEL_MAX_COMMUNICATION_BUFFER_SIZE), │ │ │ │ │ - 382 interface_(&inf.interfaces()) │ │ │ │ │ + 254 template │ │ │ │ │ + 255 struct SimdIndexTypeTraits > { │ │ │ │ │ + 256 using type = typename Vc::SimdArray::index_type; │ │ │ │ │ + 257 }; │ │ │ │ │ + 258#endif // HAVE_VC │ │ │ │ │ + 259 │ │ │ │ │ + 260 template │ │ │ │ │ +261 struct SimdMaskTypeTraits { │ │ │ │ │ +262 using type = bool; │ │ │ │ │ + 263 }; │ │ │ │ │ + 264 │ │ │ │ │ + 266 │ │ │ │ │ + 269 template │ │ │ │ │ +270 using SimdMask = typename SimdMaskTypeTraits::type; │ │ │ │ │ + 271 │ │ │ │ │ + 272#if HAVE_VC │ │ │ │ │ + 273 template │ │ │ │ │ + 274 struct SimdMaskTypeTraits > { │ │ │ │ │ + 275 using type = typename Vc::Vector::mask_type; │ │ │ │ │ + 276 }; │ │ │ │ │ + 277 │ │ │ │ │ + 278 template │ │ │ │ │ + 279 struct SimdMaskTypeTraits > { │ │ │ │ │ + 280 using type = typename Vc::SimdArray::mask_type; │ │ │ │ │ + 281 }; │ │ │ │ │ + 282#endif // HAVE_VC │ │ │ │ │ + 283 │ │ │ │ │ + 284#if HAVE_VC │ │ │ │ │ + 285 /* │ │ │ │ │ + 286 Add Vc specializations for cond(), see conditional.hh │ │ │ │ │ + 287 */ │ │ │ │ │ + 288 template │ │ │ │ │ + 289 Vc::Vector cond(const Vc::Mask & b, │ │ │ │ │ + 290 const Vc::Vector & v1, │ │ │ │ │ + 291 const Vc::Vector & v2) │ │ │ │ │ + 292 { │ │ │ │ │ + 293 return std::move(Vc::iif(b, v1, v2)); │ │ │ │ │ + 294 } │ │ │ │ │ + 295 │ │ │ │ │ + 296 template │ │ │ │ │ + 297 Vc::SimdArray cond(const typename Vc::SimdArray:: │ │ │ │ │ +mask_type & b, │ │ │ │ │ + 298 const Vc::SimdArray & v1, │ │ │ │ │ + 299 const Vc::SimdArray & v2) │ │ │ │ │ + 300 { │ │ │ │ │ + 301 return std::move(Vc::iif(b, v1, v2)); │ │ │ │ │ + 302 } │ │ │ │ │ + 303#endif // HAVE_VC │ │ │ │ │ + 304 │ │ │ │ │ + 305#if HAVE_VC │ │ │ │ │ + 306 /* │ │ │ │ │ + 307 Add Vc specializations for several boolean operations, see │ │ │ │ │ +rangeutitlities.hh: │ │ │ │ │ + 308 │ │ │ │ │ + 309 max_value, min_value, any_true, all_true │ │ │ │ │ + 310 */ │ │ │ │ │ + 311 template │ │ │ │ │ + 312 T max_value(const Vc::Vector & v) │ │ │ │ │ + 313 { │ │ │ │ │ + 314 return v.max(); │ │ │ │ │ + 315 } │ │ │ │ │ + 316 │ │ │ │ │ + 317 template │ │ │ │ │ + 318 double max_value(const Vc::SimdArray & v) │ │ │ │ │ + 319 { │ │ │ │ │ + 320 return v.max(); │ │ │ │ │ + 321 } │ │ │ │ │ + 322 │ │ │ │ │ + 323 template │ │ │ │ │ + 324 T min_value(const Vc::Vector & v) │ │ │ │ │ + 325 { │ │ │ │ │ + 326 return v.min(); │ │ │ │ │ + 327 } │ │ │ │ │ + 328 │ │ │ │ │ + 329 template │ │ │ │ │ + 330 double min_value(const Vc::SimdArray & v) │ │ │ │ │ + 331 { │ │ │ │ │ + 332 return v.min(); │ │ │ │ │ + 333 } │ │ │ │ │ + 334 │ │ │ │ │ + 335 template │ │ │ │ │ + 336 bool any_true(const Vc::Mask & v) │ │ │ │ │ + 337 { │ │ │ │ │ + 338 return Vc::any_of(v); │ │ │ │ │ + 339 } │ │ │ │ │ + 340 │ │ │ │ │ + 341 template │ │ │ │ │ + 342 bool any_true(const Vc::SimdMaskArray & v) │ │ │ │ │ + 343 { │ │ │ │ │ + 344 return Vc::any_of(v); │ │ │ │ │ + 345 } │ │ │ │ │ + 346 │ │ │ │ │ + 347 template │ │ │ │ │ + 348 bool all_true(const Vc::Mask & v) │ │ │ │ │ + 349 { │ │ │ │ │ + 350 return Vc::all_of(v); │ │ │ │ │ + 351 } │ │ │ │ │ + 352 │ │ │ │ │ + 353 template │ │ │ │ │ + 354 bool all_true(const Vc::SimdMaskArray & v) │ │ │ │ │ + 355 { │ │ │ │ │ + 356 return Vc::all_of(v); │ │ │ │ │ + 357 } │ │ │ │ │ + 358#endif // HAVE_VC │ │ │ │ │ + 359 │ │ │ │ │ + 361 template │ │ │ │ │ +362 std::size_t lanes(const T &) { return 1; } │ │ │ │ │ + 363 │ │ │ │ │ + 365 template │ │ │ │ │ +366 T lane(std::size_t l, const T &v) │ │ │ │ │ + 367 { │ │ │ │ │ + 368 assert(l == 0); │ │ │ │ │ + 369 return v; │ │ │ │ │ + 370 } │ │ │ │ │ + 371 │ │ │ │ │ + 373 template │ │ │ │ │ +374 T &lane(std::size_t l, T &v) │ │ │ │ │ + 375 { │ │ │ │ │ + 376 assert(l == 0); │ │ │ │ │ + 377 return v; │ │ │ │ │ + 378 } │ │ │ │ │ + 379 │ │ │ │ │ + 380#if HAVE_VC │ │ │ │ │ + 381 template │ │ │ │ │ + 382 std::size_t lanes(const Vc::Vector &) │ │ │ │ │ 383 { │ │ │ │ │ - 384 MPI_Comm_dup(inf.communicator(), &communicator_); │ │ │ │ │ + 384 return Vc::Vector::size(); │ │ │ │ │ 385 } │ │ │ │ │ - 386#endif │ │ │ │ │ -393 VariableSizeCommunicator(MPI_Comm comm, const InterfaceMap& inf, std:: │ │ │ │ │ -size_t max_buffer_size) │ │ │ │ │ - 394 : maxBufferSize_(max_buffer_size), interface_(&inf) │ │ │ │ │ - 395 { │ │ │ │ │ - 396 MPI_Comm_dup(comm, &communicator_); │ │ │ │ │ - 397 } │ │ │ │ │ - 398 │ │ │ │ │ -404 VariableSizeCommunicator(const Interface& inf, std::size_t max_buffer_size) │ │ │ │ │ - 405 : maxBufferSize_(max_buffer_size), interface_(&inf.interfaces()) │ │ │ │ │ - 406 { │ │ │ │ │ - 407 MPI_Comm_dup(inf.communicator(), &communicator_); │ │ │ │ │ - 408 } │ │ │ │ │ - 409 │ │ │ │ │ -410 ~VariableSizeCommunicator() │ │ │ │ │ - 411 { │ │ │ │ │ - 412 MPI_Comm_free(&communicator_); │ │ │ │ │ - 413 } │ │ │ │ │ - 414 │ │ │ │ │ -419 VariableSizeCommunicator(const VariableSizeCommunicator& other) { │ │ │ │ │ - 420 maxBufferSize_ = other.maxBufferSize_; │ │ │ │ │ - 421 interface_ = other.interface_; │ │ │ │ │ - 422 MPI_Comm_dup(other.communicator_, &communicator_); │ │ │ │ │ - 423 } │ │ │ │ │ - 424 │ │ │ │ │ -429 VariableSizeCommunicator& operator=(const VariableSizeCommunicator& other) │ │ │ │ │ -{ │ │ │ │ │ - 430 if(this == &other) // don't do anything if objects are the same │ │ │ │ │ - 431 return *this; │ │ │ │ │ - 432 │ │ │ │ │ - 433 maxBufferSize_ = other.maxBufferSize_; │ │ │ │ │ - 434 interface_ = other.interface_; │ │ │ │ │ - 435 MPI_Comm_free(&communicator_); │ │ │ │ │ - 436 MPI_Comm_dup(other.communicator_, &communicator_); │ │ │ │ │ - 437 │ │ │ │ │ - 438 return *this; │ │ │ │ │ + 386 │ │ │ │ │ + 387 template │ │ │ │ │ + 388 T lane(std::size_t l, const Vc::Vector &v) │ │ │ │ │ + 389 { │ │ │ │ │ + 390 assert(l < lanes(v)); │ │ │ │ │ + 391 return v[l]; │ │ │ │ │ + 392 } │ │ │ │ │ + 393 │ │ │ │ │ + 394 template │ │ │ │ │ + 395 auto lane(std::size_t l, Vc::Vector &v) │ │ │ │ │ + 396 { │ │ │ │ │ + 397 assert(l < lanes(v)); │ │ │ │ │ + 398 return VcImpl::Proxy >{l, v}; │ │ │ │ │ + 399 } │ │ │ │ │ + 400 │ │ │ │ │ + 401 template │ │ │ │ │ + 402 std::size_t lanes(const Vc::SimdArray &) │ │ │ │ │ + 403 { │ │ │ │ │ + 404 return n; │ │ │ │ │ + 405 } │ │ │ │ │ + 406 │ │ │ │ │ + 407 template │ │ │ │ │ + 408 T lane(std::size_t l, const Vc::SimdArray &v) │ │ │ │ │ + 409 { │ │ │ │ │ + 410 assert(l < n); │ │ │ │ │ + 411 return v[l]; │ │ │ │ │ + 412 } │ │ │ │ │ + 413 │ │ │ │ │ + 414 template │ │ │ │ │ + 415 auto lane(std::size_t l, Vc::SimdArray &v) │ │ │ │ │ + 416 { │ │ │ │ │ + 417 assert(l < n); │ │ │ │ │ + 418 return VcImpl::Proxy >{l, v}; │ │ │ │ │ + 419 } │ │ │ │ │ + 420 │ │ │ │ │ + 421 template │ │ │ │ │ + 422 std::size_t lanes(const Vc::SimdMaskArray &) │ │ │ │ │ + 423 { │ │ │ │ │ + 424 return n; │ │ │ │ │ + 425 } │ │ │ │ │ + 426 │ │ │ │ │ + 427 template │ │ │ │ │ + 428 bool lane(std::size_t l, const Vc::SimdMaskArray &v) │ │ │ │ │ + 429 { │ │ │ │ │ + 430 assert(l < n); │ │ │ │ │ + 431 return v[l]; │ │ │ │ │ + 432 } │ │ │ │ │ + 433 │ │ │ │ │ + 434 template │ │ │ │ │ + 435 auto lane(std::size_t l, Vc::SimdMaskArray &v) │ │ │ │ │ + 436 { │ │ │ │ │ + 437 assert(l < n); │ │ │ │ │ + 438 return VcImpl::Proxy >{l, v}; │ │ │ │ │ 439 } │ │ │ │ │ - 440 │ │ │ │ │ - 460 template │ │ │ │ │ -461 void forward(DataHandle& handle) │ │ │ │ │ - 462 { │ │ │ │ │ - 463 communicate(handle); │ │ │ │ │ - 464 } │ │ │ │ │ - 465 │ │ │ │ │ - 485 template │ │ │ │ │ -486 void backward(DataHandle& handle) │ │ │ │ │ - 487 { │ │ │ │ │ - 488 communicate(handle); │ │ │ │ │ + 440#endif // HAVE_VC │ │ │ │ │ + 441 │ │ │ │ │ + 443 │ │ │ │ │ + 446 template │ │ │ │ │ +447 void assign(T &dst, const T &src, bool mask) │ │ │ │ │ + 448 { │ │ │ │ │ + 449 if(mask) dst = src; │ │ │ │ │ + 450 } │ │ │ │ │ + 451 │ │ │ │ │ + 452#if HAVE_VC │ │ │ │ │ + 453 /* │ │ │ │ │ + 454 Add Vc specializations for masked assignment │ │ │ │ │ + 455 */ │ │ │ │ │ + 456 template │ │ │ │ │ + 457 void assign(Vc::Vector &dst, const Vc::Vector &src, │ │ │ │ │ + 458 typename Vc::Vector::mask_type mask) │ │ │ │ │ + 459 { │ │ │ │ │ + 460 dst(mask) = src; │ │ │ │ │ + 461 } │ │ │ │ │ + 462 │ │ │ │ │ + 463 template │ │ │ │ │ + 464 void assign(Vc::SimdArray &dst, const Vc::SimdArray │ │ │ │ │ +&src, │ │ │ │ │ + 465 typename Vc::SimdArray::mask_type mask) │ │ │ │ │ + 466 { │ │ │ │ │ + 467 dst(mask) = src; │ │ │ │ │ + 468 } │ │ │ │ │ + 469#endif // HAVE_VC │ │ │ │ │ + 470 │ │ │ │ │ + 471 template │ │ │ │ │ +472 void swap(T &v1, T &v2, bool mask) │ │ │ │ │ + 473 { │ │ │ │ │ + 474 using std::swap; │ │ │ │ │ + 475 if(mask) swap(v1, v2); │ │ │ │ │ + 476 } │ │ │ │ │ + 477 │ │ │ │ │ + 478#if HAVE_VC │ │ │ │ │ + 479 /* │ │ │ │ │ + 480 Add Vc specializations for masked swap │ │ │ │ │ + 481 */ │ │ │ │ │ + 482 template │ │ │ │ │ + 483 void swap(Vc::Vector &v1, Vc::Vector &v2, │ │ │ │ │ + 484 typename Vc::Vector::mask_type mask) │ │ │ │ │ + 485 { │ │ │ │ │ + 486 auto tmp = v1; │ │ │ │ │ + 487 v1(mask) = v2; │ │ │ │ │ + 488 v2(mask) = tmp; │ │ │ │ │ 489 } │ │ │ │ │ 490 │ │ │ │ │ - 491private: │ │ │ │ │ - 492 template │ │ │ │ │ - 493 void communicateSizes(DataHandle& handle, │ │ │ │ │ - 494 std::vector& recv_trackers); │ │ │ │ │ - 495 │ │ │ │ │ - 502 template │ │ │ │ │ - 503 void communicate(DataHandle& handle); │ │ │ │ │ - 513 template │ │ │ │ │ - 514 void setupInterfaceTrackers(DataHandle& handle, │ │ │ │ │ - 515 std::vector& send_trackers, │ │ │ │ │ - 516 std::vector& recv_trackers); │ │ │ │ │ - 524 template │ │ │ │ │ - 525 void communicateFixedSize(DataHandle& handle); │ │ │ │ │ - 533 template │ │ │ │ │ - 534 void communicateVariableSize(DataHandle& handle); │ │ │ │ │ - 541 std::size_t maxBufferSize_; │ │ │ │ │ - 549 const InterfaceMap* interface_; │ │ │ │ │ - 555 MPI_Comm communicator_; │ │ │ │ │ - 556}; │ │ │ │ │ - 557 │ │ │ │ │ - 559namespace │ │ │ │ │ - 560{ │ │ │ │ │ - 564template │ │ │ │ │ - 565class SizeDataHandle │ │ │ │ │ - 566{ │ │ │ │ │ - 567public: │ │ │ │ │ - 568 typedef std::size_t DataType; │ │ │ │ │ - 569 │ │ │ │ │ - 570 SizeDataHandle(DataHandle& data, │ │ │ │ │ - 571 std::vector& trackers) │ │ │ │ │ - 572 : data_(data), trackers_(trackers), index_() │ │ │ │ │ - 573 {} │ │ │ │ │ - 574 bool fixedSize() │ │ │ │ │ - 575 { │ │ │ │ │ - 576 return true; │ │ │ │ │ - 577 } │ │ │ │ │ - 578 std::size_t size([[maybe_unused]] std::size_t i) │ │ │ │ │ - 579 { │ │ │ │ │ - 580 return 1; │ │ │ │ │ - 581 } │ │ │ │ │ - 582 template │ │ │ │ │ - 583 void gather(B& buf, int i) │ │ │ │ │ - 584 { │ │ │ │ │ - 585 buf.write(data_.size(i)); │ │ │ │ │ - 586 } │ │ │ │ │ - 587 void setReceivingIndex(std::size_t i) │ │ │ │ │ - 588 { │ │ │ │ │ - 589 index_=i; │ │ │ │ │ - 590 } │ │ │ │ │ - 591 std::size_t* getSizesPointer() │ │ │ │ │ - 592 { │ │ │ │ │ - 593 return trackers_[index_].getSizesPointer(); │ │ │ │ │ - 594 } │ │ │ │ │ - 595 │ │ │ │ │ - 596private: │ │ │ │ │ - 597 DataHandle& data_; │ │ │ │ │ - 598 std::vector& trackers_; │ │ │ │ │ - 599 int index_; │ │ │ │ │ - 600}; │ │ │ │ │ - 601 │ │ │ │ │ - 602template │ │ │ │ │ - 603void setReceivingIndex(T&, int) │ │ │ │ │ - 604{} │ │ │ │ │ - 605 │ │ │ │ │ - 606template │ │ │ │ │ - 607void setReceivingIndex(SizeDataHandle& t, int i) │ │ │ │ │ - 608{ │ │ │ │ │ - 609 t.setReceivingIndex(i); │ │ │ │ │ - 610} │ │ │ │ │ - 611 │ │ │ │ │ - 612 │ │ │ │ │ - 618template │ │ │ │ │ - 619struct InterfaceInformationChooser │ │ │ │ │ - 620{ │ │ │ │ │ - 624 static const InterfaceInformation& │ │ │ │ │ - 625 getSend(const std::pair& info) │ │ │ │ │ - 626 { │ │ │ │ │ - 627 return info.first; │ │ │ │ │ - 628 } │ │ │ │ │ - 629 │ │ │ │ │ - 633 static const InterfaceInformation& │ │ │ │ │ - 634 getReceive(const std::pair& │ │ │ │ │ -info) │ │ │ │ │ - 635 { │ │ │ │ │ - 636 return info.second; │ │ │ │ │ - 637 } │ │ │ │ │ - 638}; │ │ │ │ │ - 639 │ │ │ │ │ - 640template<> │ │ │ │ │ - 641struct InterfaceInformationChooser │ │ │ │ │ - 642{ │ │ │ │ │ - 643 static const InterfaceInformation& │ │ │ │ │ - 644 getSend(const std::pair& info) │ │ │ │ │ - 645 { │ │ │ │ │ - 646 return info.second; │ │ │ │ │ - 647 } │ │ │ │ │ - 648 │ │ │ │ │ - 649 static const InterfaceInformation& │ │ │ │ │ - 650 getReceive(const std::pair& │ │ │ │ │ -info) │ │ │ │ │ - 651 { │ │ │ │ │ - 652 return info.first; │ │ │ │ │ - 653 } │ │ │ │ │ - 654}; │ │ │ │ │ - 655 │ │ │ │ │ - 661template │ │ │ │ │ - 662struct PackEntries │ │ │ │ │ - 663{ │ │ │ │ │ - 664 │ │ │ │ │ - 665 int operator()(DataHandle& handle, InterfaceTracker& tracker, │ │ │ │ │ - 666 MessageBuffer& buffer, │ │ │ │ │ - 667 [[maybe_unused]] int i) const │ │ │ │ │ - 668 { │ │ │ │ │ - 669 return operator()(handle,tracker,buffer); │ │ │ │ │ - 670 } │ │ │ │ │ - 671 │ │ │ │ │ - 679 int operator()(DataHandle& handle, InterfaceTracker& tracker, │ │ │ │ │ - 680 MessageBuffer& buffer) const │ │ │ │ │ - 681 { │ │ │ │ │ - 682 if(tracker.fixedSize) // fixed size if variable is >0! │ │ │ │ │ - 683 { │ │ │ │ │ - 684 │ │ │ │ │ - 685 std::size_t noIndices=std::min(buffer.size()/tracker.fixedSize, │ │ │ │ │ -tracker.indicesLeft()); │ │ │ │ │ - 686 for(std::size_t i=0; i< noIndices; ++i) │ │ │ │ │ - 687 { │ │ │ │ │ - 688 handle.gather(buffer, tracker.index()); │ │ │ │ │ - 689 tracker.moveToNextIndex(); │ │ │ │ │ - 690 } │ │ │ │ │ - 691 return noIndices*tracker.fixedSize; │ │ │ │ │ - 692 } │ │ │ │ │ - 693 else │ │ │ │ │ - 694 { │ │ │ │ │ - 695 int packed=0; │ │ │ │ │ - 696 tracker.skipZeroIndices(); │ │ │ │ │ - 697 while(!tracker.finished()) │ │ │ │ │ - 698 if(buffer.hasSpaceForItems(handle.size(tracker.index()))) │ │ │ │ │ - 699 { │ │ │ │ │ - 700 handle.gather(buffer, tracker.index()); │ │ │ │ │ - 701 packed+=handle.size(tracker.index()); │ │ │ │ │ - 702 tracker.moveToNextIndex(); │ │ │ │ │ - 703 } │ │ │ │ │ - 704 else │ │ │ │ │ - 705 break; │ │ │ │ │ - 706 return packed; │ │ │ │ │ - 707 } │ │ │ │ │ - 708 } │ │ │ │ │ - 709}; │ │ │ │ │ - 710 │ │ │ │ │ - 716template │ │ │ │ │ - 717struct UnpackEntries{ │ │ │ │ │ - 718 │ │ │ │ │ - 726 bool operator()(DataHandle& handle, InterfaceTracker& tracker, │ │ │ │ │ - 727 MessageBuffer& buffer, │ │ │ │ │ - 728 int count=0) │ │ │ │ │ - 729 { │ │ │ │ │ - 730 if(tracker.fixedSize) // fixed size if variable is >0! │ │ │ │ │ - 731 { │ │ │ │ │ - 732 std::size_t noIndices=std::min(buffer.size()/tracker.fixedSize, │ │ │ │ │ -tracker.indicesLeft()); │ │ │ │ │ - 733 │ │ │ │ │ - 734 for(std::size_t i=0; i< noIndices; ++i) │ │ │ │ │ - 735 { │ │ │ │ │ - 736 handle.scatter(buffer, tracker.index(), tracker.fixedSize); │ │ │ │ │ - 737 tracker.moveToNextIndex(); │ │ │ │ │ - 738 } │ │ │ │ │ - 739 return tracker.finished(); │ │ │ │ │ - 740 } │ │ │ │ │ - 741 else │ │ │ │ │ - 742 { │ │ │ │ │ - 743 assert(count); │ │ │ │ │ - 744 for(int unpacked=0;unpacked │ │ │ │ │ - 762struct UnpackSizeEntries{ │ │ │ │ │ - 763 │ │ │ │ │ - 771 bool operator()(SizeDataHandle& handle, InterfaceTracker& │ │ │ │ │ -tracker, │ │ │ │ │ - 772 MessageBuffer::DataType>& buffer) │ │ │ │ │ -const │ │ │ │ │ - 773 { │ │ │ │ │ - 774 std::size_t noIndices=std::min(buffer.size(), tracker.indicesLeft()); │ │ │ │ │ - 775 std::copy(static_cast(buffer), static_cast │ │ │ │ │ -(buffer)+noIndices, │ │ │ │ │ - 776 handle.getSizesPointer()+tracker.offset()); │ │ │ │ │ - 777 tracker.increment(noIndices); │ │ │ │ │ - 778 return noIndices; │ │ │ │ │ - 779 } │ │ │ │ │ - 780 bool operator()(SizeDataHandle& handle, InterfaceTracker& │ │ │ │ │ -tracker, │ │ │ │ │ - 781 MessageBuffer::DataType>& buffer, int) │ │ │ │ │ -const │ │ │ │ │ - 782 { │ │ │ │ │ - 783 return operator()(handle,tracker,buffer); │ │ │ │ │ - 784 } │ │ │ │ │ - 785}; │ │ │ │ │ - 786 │ │ │ │ │ - 794void sendFixedSize(std::vector& send_trackers, │ │ │ │ │ - 795 std::vector& send_requests, │ │ │ │ │ - 796 std::vector& recv_trackers, │ │ │ │ │ - 797 std::vector& recv_requests, │ │ │ │ │ - 798 MPI_Comm communicator) │ │ │ │ │ - 799{ │ │ │ │ │ - 800 typedef std::vector::iterator TIter; │ │ │ │ │ - 801 std::vector::iterator mIter=recv_requests.begin(); │ │ │ │ │ - 802 │ │ │ │ │ - 803 for(TIter iter=recv_trackers.begin(), end=recv_trackers.end(); iter!=end; │ │ │ │ │ - 804 ++iter, ++mIter) │ │ │ │ │ - 805 { │ │ │ │ │ - 806 MPI_Irecv(&(iter->fixedSize), 1, MPITraits::getType(), │ │ │ │ │ - 807 iter->rank(), 933881, communicator, &(*mIter)); │ │ │ │ │ - 808 } │ │ │ │ │ - 809 │ │ │ │ │ - 810 // Send our size to all neighbours using non-blocking synchronous │ │ │ │ │ -communication. │ │ │ │ │ - 811 std::vector::iterator mIter1=send_requests.begin(); │ │ │ │ │ - 812 for(TIter iter=send_trackers.begin(), end=send_trackers.end(); │ │ │ │ │ - 813 iter!=end; │ │ │ │ │ - 814 ++iter, ++mIter1) │ │ │ │ │ - 815 { │ │ │ │ │ - 816 MPI_Issend(&(iter->fixedSize), 1, MPITraits::getType(), │ │ │ │ │ - 817 iter->rank(), 933881, communicator, &(*mIter1)); │ │ │ │ │ - 818 } │ │ │ │ │ - 819} │ │ │ │ │ - 820 │ │ │ │ │ - 821 │ │ │ │ │ - 826template │ │ │ │ │ - 827struct SetupSendRequest{ │ │ │ │ │ - 828 void operator()(DataHandle& handle, │ │ │ │ │ - 829 InterfaceTracker& tracker, │ │ │ │ │ - 830 MessageBuffer& buffer, │ │ │ │ │ - 831 MPI_Request& request, │ │ │ │ │ - 832 MPI_Comm comm) const │ │ │ │ │ - 833 { │ │ │ │ │ - 834 buffer.reset(); │ │ │ │ │ - 835 int size=PackEntries()(handle, tracker, buffer); │ │ │ │ │ - 836 // Skip indices of zero size. │ │ │ │ │ - 837 while(!tracker.finished() && !handle.size(tracker.index())) │ │ │ │ │ - 838 tracker.moveToNextIndex(); │ │ │ │ │ - 839 if(size) │ │ │ │ │ - 840 MPI_Issend(buffer, size, MPITraits::getType │ │ │ │ │ -(), │ │ │ │ │ - 841 tracker.rank(), 933399, comm, &request); │ │ │ │ │ - 842 } │ │ │ │ │ - 843}; │ │ │ │ │ - 844 │ │ │ │ │ - 845 │ │ │ │ │ - 850template │ │ │ │ │ - 851struct SetupRecvRequest{ │ │ │ │ │ - 852 void operator()(DataHandle& /*handle*/, │ │ │ │ │ - 853 InterfaceTracker& tracker, │ │ │ │ │ - 854 MessageBuffer& buffer, │ │ │ │ │ - 855 MPI_Request& request, │ │ │ │ │ - 856 MPI_Comm comm) const │ │ │ │ │ - 857 { │ │ │ │ │ - 858 buffer.reset(); │ │ │ │ │ - 859 if(tracker.indicesLeft()) │ │ │ │ │ - 860 MPI_Irecv(buffer, buffer.size(), MPITraits::getType(), │ │ │ │ │ - 861 tracker.rank(), 933399, comm, &request); │ │ │ │ │ - 862 } │ │ │ │ │ - 863}; │ │ │ │ │ - 864 │ │ │ │ │ - 868template │ │ │ │ │ - 869struct NullPackUnpackFunctor │ │ │ │ │ - 870{ │ │ │ │ │ - 871 int operator()(DataHandle&, InterfaceTracker&, │ │ │ │ │ - 872 MessageBuffer&, int) │ │ │ │ │ - 873 { │ │ │ │ │ - 874 return 0; │ │ │ │ │ - 875 } │ │ │ │ │ - 876 int operator()(DataHandle&, InterfaceTracker&, │ │ │ │ │ - 877 MessageBuffer&) │ │ │ │ │ - 878 { │ │ │ │ │ - 879 return 0; │ │ │ │ │ - 880 } │ │ │ │ │ - 881}; │ │ │ │ │ - 882 │ │ │ │ │ - 897template │ │ │ │ │ - 898std::size_t checkAndContinue(DataHandle& handle, │ │ │ │ │ - 899 std::vector& trackers, │ │ │ │ │ - 900 std::vector& requests, │ │ │ │ │ - 901 std::vector& requests2, │ │ │ │ │ - 902 std::vector >& buffers, │ │ │ │ │ - 903 MPI_Comm comm, │ │ │ │ │ - 904 BufferFunctor buffer_func, │ │ │ │ │ - 905 CommunicationFunctor comm_func, │ │ │ │ │ - 906 bool valid=true, │ │ │ │ │ - 907 bool getCount=false) │ │ │ │ │ - 908{ │ │ │ │ │ - 909 std::size_t size=requests.size(); │ │ │ │ │ - 910 std::vector statuses(size); │ │ │ │ │ - 911 int no_completed; │ │ │ │ │ - 912 std::vector indices(size, -1); // the indices for which the │ │ │ │ │ -communication finished. │ │ │ │ │ - 913 │ │ │ │ │ - 914 MPI_Testsome(size, &(requests[0]), &no_completed, &(indices[0]), & │ │ │ │ │ -(statuses[0])); │ │ │ │ │ - 915 indices.resize(no_completed); │ │ │ │ │ - 916 for(std::vector::iterator index=indices.begin(), end=indices.end(); │ │ │ │ │ - 917 index!=end; ++index) │ │ │ │ │ - 918 { │ │ │ │ │ - 919 InterfaceTracker& tracker=trackers[*index]; │ │ │ │ │ - 920 setReceivingIndex(handle, *index); │ │ │ │ │ - 921 if(getCount) │ │ │ │ │ - 922 { │ │ │ │ │ - 923 // Get the number of entries received │ │ │ │ │ - 924 int count; │ │ │ │ │ - 925 MPI_Get_count(&(statuses[index-indices.begin()]), │ │ │ │ │ - 926 MPITraits::getType(), │ │ │ │ │ - 927 &count); │ │ │ │ │ - 928 // Communication completed, we can reuse the buffers, e.g. unpack or │ │ │ │ │ -repack │ │ │ │ │ - 929 buffer_func(handle, tracker, buffers[*index], count); │ │ │ │ │ - 930 }else │ │ │ │ │ - 931 buffer_func(handle, tracker, buffers[*index]); │ │ │ │ │ - 932 tracker.skipZeroIndices(); │ │ │ │ │ - 933 if(!tracker.finished()){ │ │ │ │ │ - 934 // Maybe start another communication. │ │ │ │ │ - 935 comm_func(handle, tracker, buffers[*index], requests2[*index], comm); │ │ │ │ │ - 936 tracker.skipZeroIndices(); │ │ │ │ │ - 937 if(valid) │ │ │ │ │ - 938 --no_completed; // communication not finished, decrement counter for │ │ │ │ │ -finished ones. │ │ │ │ │ - 939 } │ │ │ │ │ - 940 } │ │ │ │ │ - 941 return no_completed; │ │ │ │ │ - 942 │ │ │ │ │ - 943} │ │ │ │ │ - 944 │ │ │ │ │ - 954template │ │ │ │ │ - 955std::size_t receiveSizeAndSetupReceive(DataHandle& handle, │ │ │ │ │ - 956 std::vector& trackers, │ │ │ │ │ - 957 std::vector& size_requests, │ │ │ │ │ - 958 std::vector& data_requests, │ │ │ │ │ - 959 std::vector >& buffers, │ │ │ │ │ - 960 MPI_Comm comm) │ │ │ │ │ - 961{ │ │ │ │ │ - 962 return checkAndContinue(handle, trackers, size_requests, data_requests, │ │ │ │ │ -buffers, comm, │ │ │ │ │ - 963 NullPackUnpackFunctor(), SetupRecvRequest(), │ │ │ │ │ -false); │ │ │ │ │ - 964} │ │ │ │ │ - 965 │ │ │ │ │ - 974template │ │ │ │ │ - 975std::size_t checkSendAndContinueSending(DataHandle& handle, │ │ │ │ │ - 976 std::vector& trackers, │ │ │ │ │ - 977 std::vector& requests, │ │ │ │ │ - 978 std::vector >& buffers, │ │ │ │ │ - 979 MPI_Comm comm) │ │ │ │ │ - 980{ │ │ │ │ │ - 981 return checkAndContinue(handle, trackers, requests, requests, buffers, │ │ │ │ │ -comm, │ │ │ │ │ - 982 NullPackUnpackFunctor(), SetupSendRequest()); │ │ │ │ │ - 983} │ │ │ │ │ - 984 │ │ │ │ │ - 993template │ │ │ │ │ - 994std::size_t checkReceiveAndContinueReceiving(DataHandle& handle, │ │ │ │ │ - 995 std::vector& trackers, │ │ │ │ │ - 996 std::vector& requests, │ │ │ │ │ - 997 std::vector >& buffers, │ │ │ │ │ - 998 MPI_Comm comm) │ │ │ │ │ - 999{ │ │ │ │ │ - 1000 return checkAndContinue(handle, trackers, requests, requests, buffers, │ │ │ │ │ -comm, │ │ │ │ │ - 1001 UnpackEntries(), SetupRecvRequest(), │ │ │ │ │ - 1002 true, !Impl::callFixedSize(handle)); │ │ │ │ │ - 1003} │ │ │ │ │ - 1004 │ │ │ │ │ - 1005 │ │ │ │ │ - 1006bool validRecvRequests(const std::vector reqs) │ │ │ │ │ - 1007{ │ │ │ │ │ - 1008 for(std::vector::const_iterator i=reqs.begin(), end=reqs.end │ │ │ │ │ -(); │ │ │ │ │ - 1009 i!=end; ++i) │ │ │ │ │ - 1010 if(*i!=MPI_REQUEST_NULL) │ │ │ │ │ - 1011 return true; │ │ │ │ │ - 1012 return false; │ │ │ │ │ - 1013} │ │ │ │ │ - 1014 │ │ │ │ │ - 1025template │ │ │ │ │ - 1026std::size_t setupRequests(DataHandle& handle, │ │ │ │ │ - 1027 std::vector& trackers, │ │ │ │ │ - 1028 std::vector >& buffers, │ │ │ │ │ - 1029 std::vector& requests, │ │ │ │ │ - 1030 const Functor& setupFunctor, │ │ │ │ │ - 1031 MPI_Comm communicator) │ │ │ │ │ - 1032{ │ │ │ │ │ - 1033 typedef typename std::vector::iterator TIter; │ │ │ │ │ - 1034 typename std::vector >:: │ │ │ │ │ -iterator │ │ │ │ │ - 1035 biter=buffers.begin(); │ │ │ │ │ - 1036 typename std::vector::iterator riter=requests.begin(); │ │ │ │ │ - 1037 std::size_t complete=0; │ │ │ │ │ - 1038 for(TIter titer=trackers.begin(), end=trackers.end(); titer!=end; │ │ │ │ │ -++titer, ++biter, ++riter) │ │ │ │ │ - 1039 { │ │ │ │ │ - 1040 setupFunctor(handle, *titer, *biter, *riter, communicator); │ │ │ │ │ - 1041 complete+=titer->finished(); │ │ │ │ │ - 1042 } │ │ │ │ │ - 1043 return complete; │ │ │ │ │ - 1044} │ │ │ │ │ - 1045} // end unnamed namespace │ │ │ │ │ - 1046 │ │ │ │ │ - 1047template │ │ │ │ │ - 1048template │ │ │ │ │ - 1049void VariableSizeCommunicator::setupInterfaceTrackers │ │ │ │ │ -(DataHandle& handle, │ │ │ │ │ - 1050 std::vector& send_trackers, │ │ │ │ │ - 1051 std::vector& recv_trackers) │ │ │ │ │ - 1052{ │ │ │ │ │ - 1053 if(interface_->size()==0) │ │ │ │ │ - 1054 return; │ │ │ │ │ - 1055 send_trackers.reserve(interface_->size()); │ │ │ │ │ - 1056 recv_trackers.reserve(interface_->size()); │ │ │ │ │ - 1057 │ │ │ │ │ - 1058 int fixedsize=0; │ │ │ │ │ - 1059 if(Impl::callFixedSize(handle)) │ │ │ │ │ - 1060 ++fixedsize; │ │ │ │ │ - 1061 │ │ │ │ │ - 1062 │ │ │ │ │ - 1063 typedef typename InterfaceMap::const_iterator IIter; │ │ │ │ │ - 1064 for(IIter inf=interface_->begin(), end=interface_->end(); inf!=end; │ │ │ │ │ -++inf) │ │ │ │ │ - 1065 { │ │ │ │ │ - 1066 │ │ │ │ │ - 1067 if(Impl::callFixedSize(handle) && InterfaceInformationChooser:: │ │ │ │ │ -getSend(inf->second).size()) │ │ │ │ │ - 1068 fixedsize=handle.size(InterfaceInformationChooser::getSend(inf- │ │ │ │ │ ->second)[0]); │ │ │ │ │ - 1069 assert(!Impl::callFixedSize(handle)||fixedsize>0); │ │ │ │ │ - 1070 send_trackers.push_back(InterfaceTracker(inf->first, │ │ │ │ │ - 1071 InterfaceInformationChooser::getSend(inf->second), fixedsize)); │ │ │ │ │ - 1072 recv_trackers.push_back(InterfaceTracker(inf->first, │ │ │ │ │ - 1073 InterfaceInformationChooser::getReceive(inf->second), fixedsize, │ │ │ │ │ -fixedsize==0)); │ │ │ │ │ - 1074 } │ │ │ │ │ - 1075} │ │ │ │ │ - 1076 │ │ │ │ │ - 1077template │ │ │ │ │ - 1078template │ │ │ │ │ - 1079void VariableSizeCommunicator::communicateFixedSize(DataHandle& │ │ │ │ │ -handle) │ │ │ │ │ - 1080{ │ │ │ │ │ - 1081 std::vector size_send_req(interface_->size()); │ │ │ │ │ - 1082 std::vector size_recv_req(interface_->size()); │ │ │ │ │ - 1083 │ │ │ │ │ - 1084 std::vector send_trackers; │ │ │ │ │ - 1085 std::vector recv_trackers; │ │ │ │ │ - 1086 setupInterfaceTrackers(handle,send_trackers, recv_trackers); │ │ │ │ │ - 1087 sendFixedSize(send_trackers, size_send_req, recv_trackers, size_recv_req, │ │ │ │ │ -communicator_); │ │ │ │ │ - 1088 │ │ │ │ │ - 1089 std::vector data_send_req(interface_->size(), │ │ │ │ │ -MPI_REQUEST_NULL); │ │ │ │ │ - 1090 std::vector data_recv_req(interface_->size(), │ │ │ │ │ -MPI_REQUEST_NULL); │ │ │ │ │ - 1091 typedef typename DataHandle::DataType DataType; │ │ │ │ │ - 1092 std::vector > send_buffers(interface_->size(), │ │ │ │ │ -MessageBuffer(maxBufferSize_)), │ │ │ │ │ - 1093 recv_buffers(interface_->size(), MessageBuffer │ │ │ │ │ -(maxBufferSize_)); │ │ │ │ │ - 1094 │ │ │ │ │ - 1095 │ │ │ │ │ - 1096 setupRequests(handle, send_trackers, send_buffers, data_send_req, │ │ │ │ │ - 1097 SetupSendRequest(), communicator_); │ │ │ │ │ - 1098 │ │ │ │ │ - 1099 std::size_t no_size_to_recv, no_to_send, no_to_recv, old_size; │ │ │ │ │ - 1100 no_size_to_recv = no_to_send = no_to_recv = old_size = interface_->size │ │ │ │ │ -(); │ │ │ │ │ - 1101 │ │ │ │ │ - 1102 // Skip empty interfaces. │ │ │ │ │ - 1103 typedef typename std::vector::const_iterator Iter; │ │ │ │ │ - 1104 for(Iter i=recv_trackers.begin(), end=recv_trackers.end(); i!=end; ++i) │ │ │ │ │ - 1105 if(i->empty()) │ │ │ │ │ - 1106 --no_to_recv; │ │ │ │ │ - 1107 for(Iter i=send_trackers.begin(), end=send_trackers.end(); i!=end; ++i) │ │ │ │ │ - 1108 if(i->empty()) │ │ │ │ │ - 1109 --no_to_send; │ │ │ │ │ - 1110 │ │ │ │ │ - 1111 while(no_size_to_recv+no_to_send+no_to_recv) │ │ │ │ │ - 1112 { │ │ │ │ │ - 1113 // Receive the fixedsize and setup receives accordingly │ │ │ │ │ - 1114 if(no_size_to_recv) │ │ │ │ │ - 1115 no_size_to_recv -= receiveSizeAndSetupReceive(handle,recv_trackers, │ │ │ │ │ -size_recv_req, │ │ │ │ │ - 1116 data_recv_req, recv_buffers, │ │ │ │ │ - 1117 communicator_); │ │ │ │ │ - 1118 │ │ │ │ │ - 1119 // Check send completion and initiate other necessary sends │ │ │ │ │ - 1120 if(no_to_send) │ │ │ │ │ - 1121 no_to_send -= checkSendAndContinueSending(handle, send_trackers, │ │ │ │ │ -data_send_req, │ │ │ │ │ - 1122 send_buffers, communicator_); │ │ │ │ │ - 1123 if(validRecvRequests(data_recv_req)) │ │ │ │ │ - 1124 // Receive data and setup new unblocking receives if necessary │ │ │ │ │ - 1125 no_to_recv -= checkReceiveAndContinueReceiving(handle, recv_trackers, │ │ │ │ │ -data_recv_req, │ │ │ │ │ - 1126 recv_buffers, communicator_); │ │ │ │ │ - 1127 } │ │ │ │ │ - 1128 │ │ │ │ │ - 1129 // Wait for completion of sending the size. │ │ │ │ │ - 1130 //std::vector statuses(interface_->size(), │ │ │ │ │ -MPI_STATUSES_IGNORE); │ │ │ │ │ - 1131 MPI_Waitall(size_send_req.size(), &(size_send_req[0]), │ │ │ │ │ -MPI_STATUSES_IGNORE); │ │ │ │ │ - 1132 │ │ │ │ │ - 1133} │ │ │ │ │ - 1134 │ │ │ │ │ - 1135template │ │ │ │ │ - 1136template │ │ │ │ │ - 1137void VariableSizeCommunicator::communicateSizes(DataHandle& │ │ │ │ │ -handle, │ │ │ │ │ - 1138 std::vector& data_recv_trackers) │ │ │ │ │ - 1139{ │ │ │ │ │ - 1140 std::vector send_trackers; │ │ │ │ │ - 1141 std::vector recv_trackers; │ │ │ │ │ - 1142 std::size_t size = interface_->size(); │ │ │ │ │ - 1143 std::vector send_requests(size, MPI_REQUEST_NULL); │ │ │ │ │ - 1144 std::vector recv_requests(size, MPI_REQUEST_NULL); │ │ │ │ │ - 1145 std::vector > │ │ │ │ │ - 1146 send_buffers(size, MessageBuffer(maxBufferSize_)), │ │ │ │ │ - 1147 recv_buffers(size, MessageBuffer(maxBufferSize_)); │ │ │ │ │ - 1148 SizeDataHandle size_handle(handle,data_recv_trackers); │ │ │ │ │ - 1149 setupInterfaceTrackers(size_handle,send_trackers, │ │ │ │ │ -recv_trackers); │ │ │ │ │ - 1150 setupRequests(size_handle, send_trackers, send_buffers, send_requests, │ │ │ │ │ - 1151 SetupSendRequest >(), communicator_); │ │ │ │ │ - 1152 setupRequests(size_handle, recv_trackers, recv_buffers, recv_requests, │ │ │ │ │ - 1153 SetupRecvRequest >(), communicator_); │ │ │ │ │ - 1154 │ │ │ │ │ - 1155 // Count valid requests that we have to wait for. │ │ │ │ │ - 1156 auto valid_req_func = │ │ │ │ │ - 1157 [](const MPI_Request& req) { return req != MPI_REQUEST_NULL; }; │ │ │ │ │ - 1158 │ │ │ │ │ - 1159 auto size_to_send = std::count_if(send_requests.begin(), │ │ │ │ │ -send_requests.end(), │ │ │ │ │ - 1160 valid_req_func); │ │ │ │ │ - 1161 auto size_to_recv = std::count_if(recv_requests.begin(), │ │ │ │ │ -recv_requests.end(), │ │ │ │ │ - 1162 valid_req_func); │ │ │ │ │ - 1163 │ │ │ │ │ - 1164 while(size_to_send+size_to_recv) │ │ │ │ │ - 1165 { │ │ │ │ │ - 1166 if(size_to_send) │ │ │ │ │ - 1167 size_to_send -= │ │ │ │ │ - 1168 checkSendAndContinueSending(size_handle, send_trackers, send_requests, │ │ │ │ │ - 1169 send_buffers, communicator_); │ │ │ │ │ - 1170 if(size_to_recv) │ │ │ │ │ - 1171 // Could have done this using checkSendAndContinueSending │ │ │ │ │ - 1172 // But the call below is more efficient as UnpackSizeEntries │ │ │ │ │ - 1173 // uses std::copy. │ │ │ │ │ - 1174 size_to_recv -= │ │ │ │ │ - 1175 checkAndContinue(size_handle, recv_trackers, recv_requests, │ │ │ │ │ -recv_requests, │ │ │ │ │ - 1176 recv_buffers, communicator_, UnpackSizeEntries(), │ │ │ │ │ - 1177 SetupRecvRequest >()); │ │ │ │ │ - 1178 } │ │ │ │ │ - 1179} │ │ │ │ │ - 1180 │ │ │ │ │ - 1181template │ │ │ │ │ - 1182template │ │ │ │ │ - 1183void VariableSizeCommunicator::communicateVariableSize │ │ │ │ │ -(DataHandle& handle) │ │ │ │ │ - 1184{ │ │ │ │ │ - 1185 │ │ │ │ │ - 1186 std::vector send_trackers; │ │ │ │ │ - 1187 std::vector recv_trackers; │ │ │ │ │ - 1188 setupInterfaceTrackers(handle, send_trackers, recv_trackers); │ │ │ │ │ - 1189 │ │ │ │ │ - 1190 std::vector send_requests(interface_->size(), │ │ │ │ │ -MPI_REQUEST_NULL); │ │ │ │ │ - 1191 std::vector recv_requests(interface_->size(), │ │ │ │ │ -MPI_REQUEST_NULL); │ │ │ │ │ - 1192 typedef typename DataHandle::DataType DataType; │ │ │ │ │ - 1193 std::vector > │ │ │ │ │ - 1194 send_buffers(interface_->size(), MessageBuffer │ │ │ │ │ -(maxBufferSize_)), │ │ │ │ │ - 1195 recv_buffers(interface_->size(), MessageBuffer │ │ │ │ │ -(maxBufferSize_)); │ │ │ │ │ - 1196 │ │ │ │ │ - 1197 communicateSizes(handle, recv_trackers); │ │ │ │ │ - 1198 // Setup requests for sending and receiving. │ │ │ │ │ - 1199 setupRequests(handle, send_trackers, send_buffers, send_requests, │ │ │ │ │ - 1200 SetupSendRequest(), communicator_); │ │ │ │ │ - 1201 setupRequests(handle, recv_trackers, recv_buffers, recv_requests, │ │ │ │ │ - 1202 SetupRecvRequest(), communicator_); │ │ │ │ │ - 1203 │ │ │ │ │ - 1204 // Determine number of valid requests. │ │ │ │ │ - 1205 auto valid_req_func = │ │ │ │ │ - 1206 [](const MPI_Request& req) { return req != MPI_REQUEST_NULL;}; │ │ │ │ │ - 1207 │ │ │ │ │ - 1208 auto no_to_send = std::count_if(send_requests.begin(), send_requests.end │ │ │ │ │ -(), │ │ │ │ │ - 1209 valid_req_func); │ │ │ │ │ - 1210 auto no_to_recv = std::count_if(recv_requests.begin(), recv_requests.end │ │ │ │ │ -(), │ │ │ │ │ - 1211 valid_req_func); │ │ │ │ │ - 1212 while(no_to_send+no_to_recv) │ │ │ │ │ - 1213 { │ │ │ │ │ - 1214 // Check send completion and initiate other necessary sends │ │ │ │ │ - 1215 if(no_to_send) │ │ │ │ │ - 1216 no_to_send -= checkSendAndContinueSending(handle, send_trackers, │ │ │ │ │ -send_requests, │ │ │ │ │ - 1217 send_buffers, communicator_); │ │ │ │ │ - 1218 if(no_to_recv) │ │ │ │ │ - 1219 // Receive data and setup new unblocking receives if necessary │ │ │ │ │ - 1220 no_to_recv -= checkReceiveAndContinueReceiving(handle, recv_trackers, │ │ │ │ │ -recv_requests, │ │ │ │ │ - 1221 recv_buffers, communicator_); │ │ │ │ │ - 1222 } │ │ │ │ │ - 1223} │ │ │ │ │ - 1224 │ │ │ │ │ - 1225template │ │ │ │ │ - 1226template │ │ │ │ │ - 1227void VariableSizeCommunicator::communicate(DataHandle& handle) │ │ │ │ │ - 1228{ │ │ │ │ │ - 1229 if( interface_->size() == 0) │ │ │ │ │ - 1230 // Simply return as otherwise we will index an empty container │ │ │ │ │ - 1231 // either for MPI_Wait_all or MPI_Test_some. │ │ │ │ │ - 1232 return; │ │ │ │ │ - 1233 │ │ │ │ │ - 1234 if(Impl::callFixedSize(handle)) │ │ │ │ │ - 1235 communicateFixedSize(handle); │ │ │ │ │ - 1236 else │ │ │ │ │ - 1237 communicateVariableSize(handle); │ │ │ │ │ - 1238} │ │ │ │ │ - 1239} // end namespace Dune │ │ │ │ │ - 1240 │ │ │ │ │ - 1241#endif // HAVE_MPI │ │ │ │ │ - 1242 │ │ │ │ │ - 1243#endif │ │ │ │ │ -mpitraits.hh │ │ │ │ │ -Traits classes for mapping types onto MPI_Datatype. │ │ │ │ │ -fixedSize │ │ │ │ │ -std::size_t fixedSize │ │ │ │ │ -The number of data items per index if it is fixed, 0 otherwise. │ │ │ │ │ -Definition: variablesizecommunicator.hh:265 │ │ │ │ │ -concept.hh │ │ │ │ │ -Infrastructure for concepts. │ │ │ │ │ -Dune::Interface::communicator │ │ │ │ │ -MPI_Comm communicator() const │ │ │ │ │ -Get the MPI Communicator. │ │ │ │ │ -Definition: parallel/interface.hh:417 │ │ │ │ │ + 491 template │ │ │ │ │ + 492 void swap(Vc::SimdArray &v1, Vc::SimdArray &v2, │ │ │ │ │ + 493 typename Vc::SimdArray::mask_type mask) │ │ │ │ │ + 494 { │ │ │ │ │ + 495 auto tmp = v1; │ │ │ │ │ + 496 v1(mask) = v2; │ │ │ │ │ + 497 v2(mask) = tmp; │ │ │ │ │ + 498 } │ │ │ │ │ + 499#endif // HAVE_VC │ │ │ │ │ + 500 │ │ │ │ │ + 501} // end namespace Dune │ │ │ │ │ + 502 │ │ │ │ │ + 503#endif // DUNE_COMMON_SIMD_HH │ │ │ │ │ +vc.hh │ │ │ │ │ +Compatibility header for including │ │ │ │ │ +typetraits.hh │ │ │ │ │ +Traits for type conversions and type information. │ │ │ │ │ +conditional.hh │ │ │ │ │ +debugalign.hh │ │ │ │ │ +rangeutilities.hh │ │ │ │ │ +Utilities for reduction like operations on ranges. │ │ │ │ │ +Dune::Simd::Overloads::mask │ │ │ │ │ +Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v) │ │ │ │ │ +implements Simd::mask() │ │ │ │ │ +Definition: defaults.hh:153 │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::AlignedNumberImpl::min │ │ │ │ │ -auto min(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > │ │ │ │ │ -&b) │ │ │ │ │ -Definition: debugalign.hh:447 │ │ │ │ │ -Dune::MPITraits::getType │ │ │ │ │ -static MPI_Datatype getType() │ │ │ │ │ -Definition: mpitraits.hh:48 │ │ │ │ │ -Dune::InterfaceInformation::size │ │ │ │ │ -size_t size() const │ │ │ │ │ -Get the number of entries in the interface. │ │ │ │ │ -Definition: parallel/interface.hh:108 │ │ │ │ │ -Dune::Interface │ │ │ │ │ -Communication interface between remote and local indices. │ │ │ │ │ -Definition: parallel/interface.hh:209 │ │ │ │ │ -Dune::Concept::HasFixedSize │ │ │ │ │ -Definition: variablesizecommunicator.hh:43 │ │ │ │ │ -Dune::Concept::HasFixedSize::require │ │ │ │ │ -auto require(H &&h) -> decltype(h.fixedSize()) │ │ │ │ │ -Dune::VariableSizeCommunicator │ │ │ │ │ -A buffered communicator where the amount of data sent does not have to be known │ │ │ │ │ -a priori. │ │ │ │ │ -Definition: variablesizecommunicator.hh:332 │ │ │ │ │ -Dune::VariableSizeCommunicator::VariableSizeCommunicator │ │ │ │ │ -VariableSizeCommunicator(const Interface &inf, std::size_t max_buffer_size) │ │ │ │ │ -Creates a communicator with a specific maximum buffer size. │ │ │ │ │ -Definition: variablesizecommunicator.hh:404 │ │ │ │ │ -Dune::VariableSizeCommunicator::backward │ │ │ │ │ -void backward(DataHandle &handle) │ │ │ │ │ -Communicate backwards. │ │ │ │ │ -Definition: variablesizecommunicator.hh:486 │ │ │ │ │ -Dune::VariableSizeCommunicator::~VariableSizeCommunicator │ │ │ │ │ -~VariableSizeCommunicator() │ │ │ │ │ -Definition: variablesizecommunicator.hh:410 │ │ │ │ │ -Dune::VariableSizeCommunicator::VariableSizeCommunicator │ │ │ │ │ -VariableSizeCommunicator(MPI_Comm comm, const InterfaceMap &inf, std::size_t │ │ │ │ │ -max_buffer_size) │ │ │ │ │ -Creates a communicator with a specific maximum buffer size. │ │ │ │ │ -Definition: variablesizecommunicator.hh:393 │ │ │ │ │ -Dune::VariableSizeCommunicator::VariableSizeCommunicator │ │ │ │ │ -VariableSizeCommunicator(const VariableSizeCommunicator &other) │ │ │ │ │ -Copy-constructs a communicator. │ │ │ │ │ -Definition: variablesizecommunicator.hh:419 │ │ │ │ │ -Dune::VariableSizeCommunicator::forward │ │ │ │ │ -void forward(DataHandle &handle) │ │ │ │ │ -Communicate forward. │ │ │ │ │ -Definition: variablesizecommunicator.hh:461 │ │ │ │ │ -Dune::VariableSizeCommunicator::operator= │ │ │ │ │ -VariableSizeCommunicator & operator=(const VariableSizeCommunicator &other) │ │ │ │ │ -Copy-assignes a communicator. │ │ │ │ │ -Definition: variablesizecommunicator.hh:429 │ │ │ │ │ -Dune::VariableSizeCommunicator::InterfaceMap │ │ │ │ │ -std::map< int, std::pair< InterfaceInformation, InterfaceInformation >, std:: │ │ │ │ │ -less< int >, typename std::allocator_traits< Allocator >::template │ │ │ │ │ -rebind_alloc< std::pair< const int, std::pair< InterfaceInformation, │ │ │ │ │ -InterfaceInformation > > > > InterfaceMap │ │ │ │ │ -The type of the map from process number to InterfaceInformation for sending and │ │ │ │ │ -receiving to and from... │ │ │ │ │ -Definition: variablesizecommunicator.hh:340 │ │ │ │ │ -Dune::VariableSizeCommunicator::VariableSizeCommunicator │ │ │ │ │ -VariableSizeCommunicator(MPI_Comm comm, const InterfaceMap &inf) │ │ │ │ │ -Creates a communicator with the default maximum buffer size. │ │ │ │ │ -Definition: variablesizecommunicator.hh:349 │ │ │ │ │ -Dune::VariableSizeCommunicator::VariableSizeCommunicator │ │ │ │ │ -VariableSizeCommunicator(const Interface &inf) │ │ │ │ │ -Creates a communicator with the default maximum buffer size. │ │ │ │ │ -Definition: variablesizecommunicator.hh:358 │ │ │ │ │ -interface.hh │ │ │ │ │ -Provides classes for building the communication interface between remote │ │ │ │ │ -indices. │ │ │ │ │ +Dune::any_true │ │ │ │ │ +bool any_true(const AlignedNumber< bool, align > &val) │ │ │ │ │ +Definition: debugalign.hh:493 │ │ │ │ │ +Dune::all_true │ │ │ │ │ +bool all_true(const AlignedNumber< bool, align > &val) │ │ │ │ │ +Definition: debugalign.hh:499 │ │ │ │ │ +Dune::SimdIndex │ │ │ │ │ +typename SimdIndexTypeTraits< V >::type SimdIndex │ │ │ │ │ +An simd vector of indices corresponding to a simd vector V. │ │ │ │ │ +Definition: simd.hh:246 │ │ │ │ │ +Dune::SimdScalar │ │ │ │ │ +typename SimdScalarTypeTraits< T >::type SimdScalar │ │ │ │ │ +Definition: simd.hh:207 │ │ │ │ │ +Dune::SimdMask │ │ │ │ │ +typename SimdMaskTypeTraits< V >::type SimdMask │ │ │ │ │ +A simd vector of truth values corresponding to a simd vector V. │ │ │ │ │ +Definition: simd.hh:270 │ │ │ │ │ +Dune::lane │ │ │ │ │ +T lane(std::size_t l, const T &v) │ │ │ │ │ +access a lane of a simd vector (scalar version) │ │ │ │ │ +Definition: simd.hh:366 │ │ │ │ │ +Dune::swap │ │ │ │ │ +void swap(T &v1, T &v2, bool mask) │ │ │ │ │ +Definition: simd.hh:472 │ │ │ │ │ +Dune::assign │ │ │ │ │ +void assign(T &dst, const T &src, bool mask) │ │ │ │ │ +masked Simd assignment (scalar version) │ │ │ │ │ +Definition: simd.hh:447 │ │ │ │ │ +Dune::cond │ │ │ │ │ +const T1 cond(bool b, const T1 &v1, const T2 &v2) │ │ │ │ │ +conditional evaluate │ │ │ │ │ +Definition: conditional.hh:28 │ │ │ │ │ +Dune::max_value │ │ │ │ │ +T max_value(const AlignedNumber< T, align > &val) │ │ │ │ │ +Definition: debugalign.hh:481 │ │ │ │ │ +Dune::min_value │ │ │ │ │ +T min_value(const AlignedNumber< T, align > &val) │ │ │ │ │ +Definition: debugalign.hh:487 │ │ │ │ │ +Dune::lanes │ │ │ │ │ +std::size_t lanes(const T &) │ │ │ │ │ +get the number of lanes of a simd vector (scalar version) │ │ │ │ │ +Definition: simd.hh:362 │ │ │ │ │ +Dune::AlignedNumberImpl::AlignedNumber │ │ │ │ │ +aligned wrappers for arithmetic types │ │ │ │ │ +Definition: debugalign.hh:115 │ │ │ │ │ +Dune::SimdScalarTypeTraits │ │ │ │ │ +Definition: simd.hh:202 │ │ │ │ │ +Dune::SimdScalarTypeTraits::type │ │ │ │ │ +T type │ │ │ │ │ +Definition: simd.hh:203 │ │ │ │ │ +Dune::SimdScalarTypeTraits<_AlignedNumber<_T,_align_>_>::type │ │ │ │ │ +T type │ │ │ │ │ +Definition: simd.hh:230 │ │ │ │ │ +Dune::SimdIndexTypeTraits │ │ │ │ │ +Definition: simd.hh:234 │ │ │ │ │ +Dune::SimdIndexTypeTraits::type │ │ │ │ │ +std::size_t type │ │ │ │ │ +Definition: simd.hh:235 │ │ │ │ │ +Dune::SimdMaskTypeTraits │ │ │ │ │ +Definition: simd.hh:261 │ │ │ │ │ +Dune::SimdMaskTypeTraits::type │ │ │ │ │ +bool type │ │ │ │ │ +Definition: simd.hh:262 │ │ │ │ │ +vc.hh │ │ │ │ │ +SIMD abstractions for Vc. │ │ │ │ │ +DUNE_SIMD_VC_ASSIGNMENT │ │ │ │ │ +#define DUNE_SIMD_VC_ASSIGNMENT(OP) │ │ │ │ │ +Definition: simd/vc.hh:224 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00062.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: localindex.hh File Reference │ │ │ │ +dune-common: defaults.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,55 +58,127 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces | │ │ │ │ -Enumerations
│ │ │ │ - │ │ │ │ +Namespaces
│ │ │ │ + │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

Provides classes for use as the local index in ParallelIndexSet. │ │ │ │ +

Default implementations for SIMD Implementations. │ │ │ │ More...

│ │ │ │ -
#include <cstddef>
│ │ │ │ +
#include <algorithm>
│ │ │ │ +#include <cstddef>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <dune/common/rangeutilities.hh>
│ │ │ │ +#include <dune/common/simd/base.hh>
│ │ │ │ +#include <dune/common/simd/interface.hh>
│ │ │ │ +#include <dune/common/typelist.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::LocalIndex
 An index present on the local process. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::Simd
 Namespace for vectorization interface functions used by library developers.
 
namespace  Dune::Simd::Overloads
 Namespace for the overloads and specializations that make up a SIMD implementation.
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Enumerations

enum  Dune::LocalIndexState { Dune::VALID │ │ │ │ -, Dune::DELETED │ │ │ │ - }
 The states available for the local indices. More...
 

│ │ │ │ +Functions

Overloadable and default functions

This group contains functions that you, as an abstraction developer, must implement. All functions that are deleted must be provided, functions that have a default implementation may be left unimplemented if the default behaviour is satisfactory.

│ │ │ │ +
template<class V >
decltype(auto) Dune::Simd::Overloads::lane (ADLTag< 0 >, std::size_t l, V v)=delete
 implements Simd::lane() More...
 
template<class V >
constexpr V Dune::Simd::Overloads::implCast (ADLTag< 0 >, MetaType< V >, const V &u)
 implements Simd::implCast<V>(V) More...
 
template<class V , class U >
constexpr V Dune::Simd::Overloads::implCast (ADLTag< 0 >, MetaType< V >, const U &u)
 implements Simd::implCast<V>(U) More...
 
template<class V , class S >
auto Dune::Simd::Overloads::broadcast (ADLTag< 0 >, MetaType< V >, S s)
 implements Simd::broadcast<V>() More...
 
template<class V >
Dune::Simd::Overloads::cond (ADLTag< 0 >, const Mask< V > &mask, const V &ifTrue, const V &ifFalse)=delete
 implements Simd::cond() More...
 
template<class V >
auto Dune::Simd::Overloads::max (ADLTag< 0 >, const V &v1, const V &v2)
 implements binary Simd::max() More...
 
template<class V >
auto Dune::Simd::Overloads::min (ADLTag< 0 >, const V &v1, const V &v2)
 implements binary Simd::min() More...
 
template<class Mask >
bool Dune::Simd::Overloads::anyTrue (ADLTag< 0 >, const Mask &mask)=delete
 implements Simd::anyTrue() More...
 
template<class Mask >
bool Dune::Simd::Overloads::allTrue (ADLTag< 0 >, const Mask &mask)
 implements Simd::allTrue() More...
 
template<class Mask >
bool Dune::Simd::Overloads::anyFalse (ADLTag< 0 >, const Mask &mask)
 implements Simd::anyFalse() More...
 
template<class Mask >
bool Dune::Simd::Overloads::allFalse (ADLTag< 0 >, const Mask &mask)
 implements Simd::allFalse() More...
 
template<class V >
auto Dune::Simd::Overloads::max (ADLTag< 0 >, const V &v)
 implements Simd::maxValue() More...
 
template<class V >
auto Dune::Simd::Overloads::min (ADLTag< 0 >, const V &v)
 implements Simd::minValue() More...
 
template<class V >
Mask< V > Dune::Simd::Overloads::mask (ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v)
 implements Simd::mask() More...
 
template<class V >
auto Dune::Simd::Overloads::mask (ADLTag< 0, !std::is_same< V, Mask< V > >::value >, const V &v)
 implements Simd::mask() More...
 
template<class V1 , class V2 >
auto Dune::Simd::Overloads::maskOr (ADLTag< 0 >, const V1 &v1, const V2 &v2)
 implements Simd::maskOr() More...
 
template<class V1 , class V2 >
auto Dune::Simd::Overloads::maskAnd (ADLTag< 0 >, const V1 &v1, const V2 &v2)
 implements Simd::maskAnd() More...
 
│ │ │ │

Detailed Description

│ │ │ │ -

Provides classes for use as the local index in ParallelIndexSet.

│ │ │ │ -
Author
Markus Blatt
│ │ │ │ +

Default implementations for SIMD Implementations.

│ │ │ │ +

This file provides default overloads for SIMD implementation functions, and deleted placeholders where there are no default implementations.

│ │ │ │ +

This file should never be included by users of the SIMD abstraction. Include <dune/common/simd/simd.hh> instead.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,33 +4,128 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -Classes | Namespaces | Enumerations │ │ │ │ │ -localindex.hh File Reference │ │ │ │ │ -Common » Parallel_Communication » Parallel_Computing_based_on_Indexsets │ │ │ │ │ -Provides classes for use as the local index in ParallelIndexSet. More... │ │ │ │ │ + * simd │ │ │ │ │ +Namespaces │ │ │ │ │ +defaults.hh File Reference │ │ │ │ │ +Common » Vectorization » Abstraction_Developer's_Interface │ │ │ │ │ +Default implementations for SIMD Implementations. More... │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ - Classes │ │ │ │ │ -class  Dune::LocalIndex │ │ │ │ │ -  An index present on the local process. More... │ │ │ │ │ -  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ - Enumerations │ │ │ │ │ -enum  Dune::LocalIndexState { Dune::VALID , Dune::DELETED } │ │ │ │ │ -  The states available for the local indices. More... │ │ │ │ │ +namespace  Dune::Simd │ │ │ │ │ +  Namespace for vectorization interface functions used by library │ │ │ │ │ + developers. │ │ │ │ │ +  │ │ │ │ │ +namespace  Dune::Simd::Overloads │ │ │ │ │ +  Namespace for the overloads and specializations that make up a SIMD │ │ │ │ │ + implementation. │ │ │ │ │ +  │ │ │ │ │ + Functions │ │ │ │ │ +Overloadable and default functions │ │ │ │ │ +This group contains functions that you, as an abstraction developer, must │ │ │ │ │ +implement. All functions that are deleted must be provided, functions that have │ │ │ │ │ +a default implementation may be left unimplemented if the default behaviour is │ │ │ │ │ +satisfactory. │ │ │ │ │ +template │ │ │ │ │ +decltype(auto) Dune::Simd::Overloads::lane (ADLTag< 0 >, std::size_t l, V │ │ │ │ │ + v)=delete │ │ │ │ │ +  implements Simd::lane() More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + constexpr V Dune::Simd::Overloads::implCast (ADLTag< 0 >, MetaType< V >, │ │ │ │ │ + const V &u) │ │ │ │ │ +  implements Simd::implCast(V) More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + constexpr V Dune::Simd::Overloads::implCast (ADLTag< 0 >, MetaType< V >, │ │ │ │ │ + const U &u) │ │ │ │ │ +  implements Simd::implCast(U) More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::Simd::Overloads::broadcast (ADLTag< 0 >, MetaType< V >, S │ │ │ │ │ + s) │ │ │ │ │ +  implements Simd::broadcast() More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + V Dune::Simd::Overloads::cond (ADLTag< 0 >, const Mask< V > │ │ │ │ │ + &mask, const V &ifTrue, const V &ifFalse)=delete │ │ │ │ │ +  implements Simd::cond() More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::Simd::Overloads::max (ADLTag< 0 >, const V &v1, const V │ │ │ │ │ + &v2) │ │ │ │ │ +  implements binary Simd::max() More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::Simd::Overloads::min (ADLTag< 0 >, const V &v1, const V │ │ │ │ │ + &v2) │ │ │ │ │ +  implements binary Simd::min() More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + bool Dune::Simd::Overloads::anyTrue (ADLTag< 0 >, const Mask │ │ │ │ │ + &mask)=delete │ │ │ │ │ +  implements Simd::anyTrue() More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + bool Dune::Simd::Overloads::allTrue (ADLTag< 0 >, const Mask &mask) │ │ │ │ │ +  implements Simd::allTrue() More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + bool Dune::Simd::Overloads::anyFalse (ADLTag< 0 >, const Mask &mask) │ │ │ │ │ +  implements Simd::anyFalse() More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + bool Dune::Simd::Overloads::allFalse (ADLTag< 0 >, const Mask &mask) │ │ │ │ │ +  implements Simd::allFalse() More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::Simd::Overloads::max (ADLTag< 0 >, const V &v) │ │ │ │ │ +  implements Simd::maxValue() More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::Simd::Overloads::min (ADLTag< 0 >, const V &v) │ │ │ │ │ +  implements Simd::minValue() More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + Mask< V > Dune::Simd::Overloads::mask (ADLTag< 0, std::is_same< V, Mask< │ │ │ │ │ + V > >::value >, const V &v) │ │ │ │ │ +  implements Simd::mask() More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::Simd::Overloads::mask (ADLTag< 0, !std::is_same< V, Mask< │ │ │ │ │ + V > >::value >, const V &v) │ │ │ │ │ +  implements Simd::mask() More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::Simd::Overloads::maskOr (ADLTag< 0 >, const V1 &v1, const │ │ │ │ │ + V2 &v2) │ │ │ │ │ +  implements Simd::maskOr() More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::Simd::Overloads::maskAnd (ADLTag< 0 >, const V1 &v1, │ │ │ │ │ + const V2 &v2) │ │ │ │ │ +  implements Simd::maskAnd() More... │ │ │ │ │   │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -Provides classes for use as the local index in ParallelIndexSet. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ +Default implementations for SIMD Implementations. │ │ │ │ │ +This file provides default overloads for SIMD implementation functions, and │ │ │ │ │ +deleted placeholders where there are no default implementations. │ │ │ │ │ +This file should never be included by users of the SIMD abstraction. Include │ │ │ │ │ + instead. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00062_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: localindex.hh Source File │ │ │ │ +dune-common: defaults.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,101 +58,190 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
localindex.hh
│ │ │ │ +
defaults.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 (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │ -
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ +Go to the documentation of this file.
1// SPDX-FileCopyrightInfo: Copyright (C) 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_SIMD_DEFAULTS_HH
│ │ │ │ +
4#define DUNE_COMMON_SIMD_DEFAULTS_HH
│ │ │ │
5
│ │ │ │ -
6#ifndef DUNE_COMMON_LOCALINDEX_HH
│ │ │ │ -
7#define DUNE_COMMON_LOCALINDEX_HH
│ │ │ │ -
8
│ │ │ │ -
9#include <cstddef>
│ │ │ │ -
10
│ │ │ │ -
11namespace Dune
│ │ │ │ -
12{
│ │ │ │ -
13
│ │ │ │ -
14
│ │ │ │ - │ │ │ │ -
29
│ │ │ │ +
17#include <algorithm>
│ │ │ │ +
18#include <cstddef>
│ │ │ │ +
19#include <type_traits>
│ │ │ │ +
20
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
26
│ │ │ │ +
27namespace Dune {
│ │ │ │ +
28 namespace Simd {
│ │ │ │ +
29 namespace Overloads {
│ │ │ │
30
│ │ │ │ - │ │ │ │ -
35 {
│ │ │ │ -
36 public:
│ │ │ │ - │ │ │ │ -
42 localIndex_(0), state_(VALID){}
│ │ │ │ -
43
│ │ │ │ -
44
│ │ │ │ -
49 LocalIndex(std::size_t index) :
│ │ │ │ -
50 localIndex_(index), state_(VALID){}
│ │ │ │ -
55 inline const std::size_t& local() const;
│ │ │ │ +
47 template<class V>
│ │ │ │ +
48 decltype(auto) lane(ADLTag<0>, std::size_t l, V v) = delete;
│ │ │ │ +
49
│ │ │ │ +
51 template<class V>
│ │ │ │ +
52 constexpr V implCast(ADLTag<0>, MetaType<V>, const V &u)
│ │ │ │ +
53 {
│ │ │ │ +
54 return u;
│ │ │ │ +
55 }
│ │ │ │
56
│ │ │ │ -
60 inline operator std::size_t() const;
│ │ │ │ -
61
│ │ │ │ -
67 inline LocalIndex& operator=(std::size_t index);
│ │ │ │ -
68
│ │ │ │ -
73 inline LocalIndexState state() const;
│ │ │ │ -
74
│ │ │ │ -
79 inline void setState(LocalIndexState state);
│ │ │ │ -
80
│ │ │ │ -
81 private:
│ │ │ │ -
83 std::size_t localIndex_;
│ │ │ │ -
84
│ │ │ │ -
91 char state_;
│ │ │ │ -
92
│ │ │ │ -
93 };
│ │ │ │ +
58 template<class V, class U>
│ │ │ │ +
59 constexpr V implCast(ADLTag<0>, MetaType<V>, const U &u)
│ │ │ │ +
60 {
│ │ │ │ +
61 V result(Simd::Scalar<V>(0));
│ │ │ │ +
62 for(auto l : range(Simd::lanes(u)))
│ │ │ │ +
63 Simd::lane(l, result) = Simd::lane(l, u);
│ │ │ │ +
64 return result;
│ │ │ │ +
65 }
│ │ │ │ +
66
│ │ │ │ +
68 template<class V, class S>
│ │ │ │ + │ │ │ │ +
70 {
│ │ │ │ +
71 return V(Simd::Scalar<V>(s));
│ │ │ │ +
72 }
│ │ │ │ +
73
│ │ │ │ +
75 template<class V>
│ │ │ │ + │ │ │ │ +
77 const V &ifTrue, const V &ifFalse) = delete;
│ │ │ │ +
78
│ │ │ │ +
80 template<class V>
│ │ │ │ +
81 auto max(ADLTag<0>, const V &v1, const V &v2)
│ │ │ │ +
82 {
│ │ │ │ +
83 using std::max;
│ │ │ │ +
84 return max(v1, v2);
│ │ │ │ +
85 }
│ │ │ │ +
86
│ │ │ │ +
88 template<class V>
│ │ │ │ +
89 auto min(ADLTag<0>, const V &v1, const V &v2)
│ │ │ │ +
90 {
│ │ │ │ +
91 using std::min;
│ │ │ │ +
92 return min(v1, v2);
│ │ │ │ +
93 }
│ │ │ │
94
│ │ │ │ -
95
│ │ │ │ -
96
│ │ │ │ -
97 inline const std::size_t& LocalIndex::local() const {
│ │ │ │ -
98 return localIndex_;
│ │ │ │ -
99 }
│ │ │ │ +
96 template<class Mask>
│ │ │ │ +
97 bool anyTrue(ADLTag<0>, const Mask &mask) = delete;
│ │ │ │ +
98
│ │ │ │
100
│ │ │ │ -
101 inline LocalIndex::operator std::size_t() const {
│ │ │ │ -
102 return localIndex_;
│ │ │ │ -
103 }
│ │ │ │ -
104
│ │ │ │ -
105 inline LocalIndex& LocalIndex::operator=(std::size_t index){
│ │ │ │ -
106 localIndex_ = index;
│ │ │ │ -
107 return *this;
│ │ │ │ -
108 }
│ │ │ │ -
109
│ │ │ │ - │ │ │ │ -
111 return static_cast<LocalIndexState>(state_);
│ │ │ │ -
112 }
│ │ │ │ -
113
│ │ │ │ - │ │ │ │ -
115 state_ = static_cast<char>(state);
│ │ │ │ -
116 }
│ │ │ │ -
117
│ │ │ │ -
120} // namespace Dune
│ │ │ │ -
121
│ │ │ │ -
122#endif
│ │ │ │ -
LocalIndexState
The states available for the local indices.
Definition: localindex.hh:28
│ │ │ │ -
LocalIndex & operator=(std::size_t index)
Assign a new local index.
Definition: localindex.hh:105
│ │ │ │ -
LocalIndexState state() const
Get the state.
Definition: localindex.hh:110
│ │ │ │ -
const std::size_t & local() const
get the local index.
Definition: localindex.hh:97
│ │ │ │ -
void setState(LocalIndexState state)
Set the state.
Definition: localindex.hh:114
│ │ │ │ -
@ VALID
Definition: localindex.hh:28
│ │ │ │ -
@ DELETED
Definition: localindex.hh:28
│ │ │ │ +
103 template<class Mask>
│ │ │ │ + │ │ │ │ +
105 {
│ │ │ │ +
106 return !Dune::Simd::anyTrue(!mask);
│ │ │ │ +
107 }
│ │ │ │ +
108
│ │ │ │ +
110
│ │ │ │ +
113 template<class Mask>
│ │ │ │ + │ │ │ │ +
115 {
│ │ │ │ +
116 return Dune::Simd::anyTrue(!mask);
│ │ │ │ +
117 }
│ │ │ │ +
118
│ │ │ │ +
120
│ │ │ │ +
123 template<class Mask>
│ │ │ │ + │ │ │ │ +
125 {
│ │ │ │ +
126 return !Dune::Simd::anyTrue(mask);
│ │ │ │ +
127 }
│ │ │ │ +
128
│ │ │ │ +
130 template<class V>
│ │ │ │ +
131 auto max(ADLTag<0>, const V &v)
│ │ │ │ +
132 {
│ │ │ │ +
133 Scalar<V> m = Simd::lane(0, v);
│ │ │ │ +
134 for(std::size_t l = 1; l < Simd::lanes(v); ++l)
│ │ │ │ +
135 if(m < Simd::lane(l, v))
│ │ │ │ +
136 m = Simd::lane(l, v);
│ │ │ │ +
137 return m;
│ │ │ │ +
138 }
│ │ │ │ +
139
│ │ │ │ +
141 template<class V>
│ │ │ │ +
142 auto min(ADLTag<0>, const V &v)
│ │ │ │ +
143 {
│ │ │ │ +
144 Scalar<V> m = Simd::lane(0, v);
│ │ │ │ +
145 for(std::size_t l = 1; l < Simd::lanes(v); ++l)
│ │ │ │ +
146 if(Simd::lane(l, v) < m)
│ │ │ │ +
147 m = Simd::lane(l, v);
│ │ │ │ +
148 return m;
│ │ │ │ +
149 }
│ │ │ │ +
150
│ │ │ │ +
152 template<class V>
│ │ │ │ +
153 Mask<V> mask(ADLTag<0, std::is_same<V, Mask<V> >::value>,
│ │ │ │ +
154 const V &v)
│ │ │ │ +
155 {
│ │ │ │ +
156 return v;
│ │ │ │ +
157 }
│ │ │ │ +
158
│ │ │ │ +
160 template<class V>
│ │ │ │ +
161 auto mask(ADLTag<0, !std::is_same<V, Mask<V> >::value>,
│ │ │ │ +
162 const V &v)
│ │ │ │ +
163 {
│ │ │ │ +
164 using Copy = AutonomousValue<V>; // just in case we are handed a proxy
│ │ │ │ +
165 return v != Copy(Scalar<Copy>(0));
│ │ │ │ +
166 }
│ │ │ │ +
167
│ │ │ │ +
169 template<class V1, class V2>
│ │ │ │ +
170 auto maskOr(ADLTag<0>, const V1 &v1, const V2 &v2)
│ │ │ │ +
171 {
│ │ │ │ +
172 return Simd::mask(v1) || Simd::mask(v2);
│ │ │ │ +
173 }
│ │ │ │ +
174
│ │ │ │ +
176 template<class V1, class V2>
│ │ │ │ +
177 auto maskAnd(ADLTag<0>, const V1 &v1, const V2 &v2)
│ │ │ │ +
178 {
│ │ │ │ +
179 return Simd::mask(v1) && Simd::mask(v2);
│ │ │ │ +
180 }
│ │ │ │ +
181
│ │ │ │ +
184 } // namespace Overloads
│ │ │ │ +
185 } // namespace Simd
│ │ │ │ +
186} // namespace Dune
│ │ │ │ +
187
│ │ │ │ +
188#endif // DUNE_COMMON_SIMD_DEFAULTS_HH
│ │ │ │ + │ │ │ │ +
Basic definitions for SIMD Implementations.
│ │ │ │ +
Traits for type conversions and type information.
│ │ │ │ +
Utilities for reduction like operations on ranges.
│ │ │ │ +
static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from >, std::integral_constant< T, to >) noexcept
Definition: rangeutilities.hh:300
│ │ │ │ +
typename AutonomousValueType< T >::type AutonomousValue
Type free of internal references that T can be converted to.
Definition: typetraits.hh:558
│ │ │ │ +
bool anyTrue(const Mask &mask)
Whether any entry is true
Definition: simd/interface.hh:429
│ │ │ │ +
auto mask(const V &v)
Convert to mask, analogue of bool(s) for scalars.
Definition: simd/interface.hh:489
│ │ │ │ +
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
│ │ │ │ +
Rebind< bool, V > Mask
Mask type type of some SIMD type.
Definition: simd/interface.hh:289
│ │ │ │ +
typename Overloads::ScalarType< std::decay_t< V > >::type Scalar
Element type of some SIMD type.
Definition: simd/interface.hh:235
│ │ │ │ +
Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v)
implements Simd::mask()
Definition: defaults.hh:153
│ │ │ │ +
constexpr V implCast(ADLTag< 0 >, MetaType< V >, const V &u)
implements Simd::implCast<V>(V)
Definition: defaults.hh:52
│ │ │ │ +
auto min(ADLTag< 0 >, const V &v)
implements Simd::minValue()
Definition: defaults.hh:142
│ │ │ │ +
bool allFalse(ADLTag< 0 >, const Mask &mask)
implements Simd::allFalse()
Definition: defaults.hh:124
│ │ │ │ +
bool allTrue(ADLTag< 0 >, const Mask &mask)
implements Simd::allTrue()
Definition: defaults.hh:104
│ │ │ │ +
auto max(ADLTag< 0 >, const V &v)
implements Simd::maxValue()
Definition: defaults.hh:131
│ │ │ │ +
auto maskAnd(ADLTag< 0 >, const V1 &v1, const V2 &v2)
implements Simd::maskAnd()
Definition: defaults.hh:177
│ │ │ │ +
auto maskOr(ADLTag< 0 >, const V1 &v1, const V2 &v2)
implements Simd::maskOr()
Definition: defaults.hh:170
│ │ │ │ +
bool anyFalse(ADLTag< 0 >, const Mask &mask)
implements Simd::anyFalse()
Definition: defaults.hh:114
│ │ │ │ +
auto min(ADLTag< 0 >, const V &v1, const V &v2)
implements binary Simd::min()
Definition: defaults.hh:89
│ │ │ │ +
auto broadcast(ADLTag< 0 >, MetaType< V >, S s)
implements Simd::broadcast<V>()
Definition: defaults.hh:69
│ │ │ │ +
auto max(ADLTag< 0 >, const V &v1, const V &v2)
implements binary Simd::max()
Definition: defaults.hh:81
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
An index present on the local process.
Definition: localindex.hh:35
│ │ │ │ -
LocalIndex()
Constructor. known to other processes.
Definition: localindex.hh:41
│ │ │ │ -
LocalIndex(std::size_t index)
Constructor.
Definition: localindex.hh:49
│ │ │ │ +
bool anyTrue(ADLTag< 5 >, const AlignedNumber< bool, align > &mask)
Definition: debugalign.hh:543
│ │ │ │ +
const AlignedNumber< T, align > & cond(ADLTag< 5 >, AlignedNumber< bool, align > mask, const AlignedNumber< T, align > &ifTrue, const AlignedNumber< T, align > &ifFalse)
Definition: debugalign.hh:535
│ │ │ │ +
T & lane(ADLTag< 5 >, std::size_t l, AlignedNumber< T, align > &v)
Definition: debugalign.hh:520
│ │ │ │ +
Tag used to force late-binding lookup in Dune::Simd::Overloads.
Definition: base.hh:182
│ │ │ │ +
Definition: base.hh:188
│ │ │ │ +
A type that refers to another type.
Definition: typelist.hh:33
│ │ │ │ +
User interface of the SIMD abstraction.
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,123 +4,262 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -localindex.hh │ │ │ │ │ + * simd │ │ │ │ │ +defaults.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 (C) DUNE Project contributors, see file │ │ │ │ │ + 1// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ - 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ + 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ + 3#ifndef DUNE_COMMON_SIMD_DEFAULTS_HH │ │ │ │ │ + 4#define DUNE_COMMON_SIMD_DEFAULTS_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#ifndef DUNE_COMMON_LOCALINDEX_HH │ │ │ │ │ - 7#define DUNE_COMMON_LOCALINDEX_HH │ │ │ │ │ - 8 │ │ │ │ │ - 9#include │ │ │ │ │ - 10 │ │ │ │ │ - 11namespace Dune │ │ │ │ │ - 12{ │ │ │ │ │ - 13 │ │ │ │ │ - 14 │ │ │ │ │ -28 enum LocalIndexState {VALID, DELETED}; │ │ │ │ │ - 29 │ │ │ │ │ + 17#include │ │ │ │ │ + 18#include │ │ │ │ │ + 19#include │ │ │ │ │ + 20 │ │ │ │ │ + 21#include │ │ │ │ │ + 22#include │ │ │ │ │ + 23#include │ │ │ │ │ + 24#include │ │ │ │ │ + 25#include │ │ │ │ │ + 26 │ │ │ │ │ + 27namespace Dune { │ │ │ │ │ + 28 namespace Simd { │ │ │ │ │ + 29 namespace Overloads { │ │ │ │ │ 30 │ │ │ │ │ -34 class LocalIndex │ │ │ │ │ - 35 { │ │ │ │ │ - 36 public: │ │ │ │ │ -41 LocalIndex() : │ │ │ │ │ - 42 localIndex_(0), state_(VALID){} │ │ │ │ │ - 43 │ │ │ │ │ - 44 │ │ │ │ │ -49 LocalIndex(std::size_t index) : │ │ │ │ │ - 50 localIndex_(index), state_(VALID){} │ │ │ │ │ - 55 inline const std::size_t& local() const; │ │ │ │ │ + 47 template │ │ │ │ │ +48 decltype(auto) lane(ADLTag<0>, std::size_t l, V v) = delete; │ │ │ │ │ + 49 │ │ │ │ │ + 51 template │ │ │ │ │ +52 constexpr V implCast(ADLTag<0>, MetaType, const V &u) │ │ │ │ │ + 53 { │ │ │ │ │ + 54 return u; │ │ │ │ │ + 55 } │ │ │ │ │ 56 │ │ │ │ │ - 60 inline operator std::size_t() const; │ │ │ │ │ - 61 │ │ │ │ │ - 67 inline LocalIndex& operator=(std::size_t index); │ │ │ │ │ - 68 │ │ │ │ │ - 73 inline LocalIndexState state() const; │ │ │ │ │ - 74 │ │ │ │ │ - 79 inline void setState(LocalIndexState state); │ │ │ │ │ - 80 │ │ │ │ │ - 81 private: │ │ │ │ │ - 83 std::size_t localIndex_; │ │ │ │ │ - 84 │ │ │ │ │ - 91 char state_; │ │ │ │ │ - 92 │ │ │ │ │ - 93 }; │ │ │ │ │ + 58 template │ │ │ │ │ +59 constexpr V implCast(ADLTag<0>, MetaType, const U &u) │ │ │ │ │ + 60 { │ │ │ │ │ + 61 V result(Simd::Scalar(0)); │ │ │ │ │ + 62 for(auto l : range(Simd::lanes(u))) │ │ │ │ │ + 63 Simd::lane(l, result) = Simd::lane(l, u); │ │ │ │ │ + 64 return result; │ │ │ │ │ + 65 } │ │ │ │ │ + 66 │ │ │ │ │ + 68 template │ │ │ │ │ +69 auto broadcast(ADLTag<0>, MetaType, S s) │ │ │ │ │ + 70 { │ │ │ │ │ + 71 return V(Simd::Scalar(s)); │ │ │ │ │ + 72 } │ │ │ │ │ + 73 │ │ │ │ │ + 75 template │ │ │ │ │ +76 V cond(ADLTag<0>, const Mask &mask, │ │ │ │ │ + 77 const V &ifTrue, const V &ifFalse) = delete; │ │ │ │ │ + 78 │ │ │ │ │ + 80 template │ │ │ │ │ +81 auto max(ADLTag<0>, const V &v1, const V &v2) │ │ │ │ │ + 82 { │ │ │ │ │ + 83 using std::max; │ │ │ │ │ + 84 return max(v1, v2); │ │ │ │ │ + 85 } │ │ │ │ │ + 86 │ │ │ │ │ + 88 template │ │ │ │ │ +89 auto min(ADLTag<0>, const V &v1, const V &v2) │ │ │ │ │ + 90 { │ │ │ │ │ + 91 using std::min; │ │ │ │ │ + 92 return min(v1, v2); │ │ │ │ │ + 93 } │ │ │ │ │ 94 │ │ │ │ │ - 95 │ │ │ │ │ - 96 │ │ │ │ │ -97 inline const std::size_t& LocalIndex::local() const { │ │ │ │ │ - 98 return localIndex_; │ │ │ │ │ - 99 } │ │ │ │ │ + 96 template │ │ │ │ │ +97 bool anyTrue(ADLTag<0>, const Mask &mask) = delete; │ │ │ │ │ + 98 │ │ │ │ │ 100 │ │ │ │ │ -101 inline LocalIndex::operator std::size_t() const { │ │ │ │ │ - 102 return localIndex_; │ │ │ │ │ - 103 } │ │ │ │ │ - 104 │ │ │ │ │ -105 inline LocalIndex& LocalIndex::operator=(std::size_t index){ │ │ │ │ │ - 106 localIndex_ = index; │ │ │ │ │ - 107 return *this; │ │ │ │ │ - 108 } │ │ │ │ │ - 109 │ │ │ │ │ -110 inline LocalIndexState LocalIndex::state() const { │ │ │ │ │ - 111 return static_cast(state_); │ │ │ │ │ - 112 } │ │ │ │ │ - 113 │ │ │ │ │ -114 inline void LocalIndex::setState(LocalIndexState state){ │ │ │ │ │ - 115 state_ = static_cast(state); │ │ │ │ │ - 116 } │ │ │ │ │ - 117 │ │ │ │ │ - 120} // namespace Dune │ │ │ │ │ - 121 │ │ │ │ │ - 122#endif │ │ │ │ │ -Dune::LocalIndexState │ │ │ │ │ -LocalIndexState │ │ │ │ │ -The states available for the local indices. │ │ │ │ │ -Definition: localindex.hh:28 │ │ │ │ │ -Dune::LocalIndex::operator= │ │ │ │ │ -LocalIndex & operator=(std::size_t index) │ │ │ │ │ -Assign a new local index. │ │ │ │ │ -Definition: localindex.hh:105 │ │ │ │ │ -Dune::LocalIndex::state │ │ │ │ │ -LocalIndexState state() const │ │ │ │ │ -Get the state. │ │ │ │ │ -Definition: localindex.hh:110 │ │ │ │ │ -Dune::LocalIndex::local │ │ │ │ │ -const std::size_t & local() const │ │ │ │ │ -get the local index. │ │ │ │ │ -Definition: localindex.hh:97 │ │ │ │ │ -Dune::LocalIndex::setState │ │ │ │ │ -void setState(LocalIndexState state) │ │ │ │ │ -Set the state. │ │ │ │ │ -Definition: localindex.hh:114 │ │ │ │ │ -Dune::VALID │ │ │ │ │ -@ VALID │ │ │ │ │ -Definition: localindex.hh:28 │ │ │ │ │ -Dune::DELETED │ │ │ │ │ -@ DELETED │ │ │ │ │ -Definition: localindex.hh:28 │ │ │ │ │ + 103 template │ │ │ │ │ +104 bool allTrue(ADLTag<0>, const Mask &mask) │ │ │ │ │ + 105 { │ │ │ │ │ + 106 return !Dune::Simd::anyTrue(!mask); │ │ │ │ │ + 107 } │ │ │ │ │ + 108 │ │ │ │ │ + 110 │ │ │ │ │ + 113 template │ │ │ │ │ +114 bool anyFalse(ADLTag<0>, const Mask &mask) │ │ │ │ │ + 115 { │ │ │ │ │ + 116 return Dune::Simd::anyTrue(!mask); │ │ │ │ │ + 117 } │ │ │ │ │ + 118 │ │ │ │ │ + 120 │ │ │ │ │ + 123 template │ │ │ │ │ +124 bool allFalse(ADLTag<0>, const Mask &mask) │ │ │ │ │ + 125 { │ │ │ │ │ + 126 return !Dune::Simd::anyTrue(mask); │ │ │ │ │ + 127 } │ │ │ │ │ + 128 │ │ │ │ │ + 130 template │ │ │ │ │ +131 auto max(ADLTag<0>, const V &v) │ │ │ │ │ + 132 { │ │ │ │ │ + 133 Scalar m = Simd::lane(0, v); │ │ │ │ │ + 134 for(std::size_t l = 1; l < Simd::lanes(v); ++l) │ │ │ │ │ + 135 if(m < Simd::lane(l, v)) │ │ │ │ │ + 136 m = Simd::lane(l, v); │ │ │ │ │ + 137 return m; │ │ │ │ │ + 138 } │ │ │ │ │ + 139 │ │ │ │ │ + 141 template │ │ │ │ │ +142 auto min(ADLTag<0>, const V &v) │ │ │ │ │ + 143 { │ │ │ │ │ + 144 Scalar m = Simd::lane(0, v); │ │ │ │ │ + 145 for(std::size_t l = 1; l < Simd::lanes(v); ++l) │ │ │ │ │ + 146 if(Simd::lane(l, v) < m) │ │ │ │ │ + 147 m = Simd::lane(l, v); │ │ │ │ │ + 148 return m; │ │ │ │ │ + 149 } │ │ │ │ │ + 150 │ │ │ │ │ + 152 template │ │ │ │ │ +153 Mask mask(ADLTag<0, std::is_same >::value>, │ │ │ │ │ + 154 const V &v) │ │ │ │ │ + 155 { │ │ │ │ │ + 156 return v; │ │ │ │ │ + 157 } │ │ │ │ │ + 158 │ │ │ │ │ + 160 template │ │ │ │ │ +161 auto mask(ADLTag<0, !std::is_same >::value>, │ │ │ │ │ + 162 const V &v) │ │ │ │ │ + 163 { │ │ │ │ │ + 164 using Copy = AutonomousValue; // just in case we are handed a proxy │ │ │ │ │ + 165 return v != Copy(Scalar(0)); │ │ │ │ │ + 166 } │ │ │ │ │ + 167 │ │ │ │ │ + 169 template │ │ │ │ │ +170 auto maskOr(ADLTag<0>, const V1 &v1, const V2 &v2) │ │ │ │ │ + 171 { │ │ │ │ │ + 172 return Simd::mask(v1) || Simd::mask(v2); │ │ │ │ │ + 173 } │ │ │ │ │ + 174 │ │ │ │ │ + 176 template │ │ │ │ │ +177 auto maskAnd(ADLTag<0>, const V1 &v1, const V2 &v2) │ │ │ │ │ + 178 { │ │ │ │ │ + 179 return Simd::mask(v1) && Simd::mask(v2); │ │ │ │ │ + 180 } │ │ │ │ │ + 181 │ │ │ │ │ + 184 } // namespace Overloads │ │ │ │ │ + 185 } // namespace Simd │ │ │ │ │ + 186} // namespace Dune │ │ │ │ │ + 187 │ │ │ │ │ + 188#endif // DUNE_COMMON_SIMD_DEFAULTS_HH │ │ │ │ │ +typelist.hh │ │ │ │ │ +base.hh │ │ │ │ │ +Basic definitions for SIMD Implementations. │ │ │ │ │ +typetraits.hh │ │ │ │ │ +Traits for type conversions and type information. │ │ │ │ │ +rangeutilities.hh │ │ │ │ │ +Utilities for reduction like operations on ranges. │ │ │ │ │ +Dune::range │ │ │ │ │ +static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from │ │ │ │ │ +>, std::integral_constant< T, to >) noexcept │ │ │ │ │ +Definition: rangeutilities.hh:300 │ │ │ │ │ +Dune::AutonomousValue │ │ │ │ │ +typename AutonomousValueType< T >::type AutonomousValue │ │ │ │ │ +Type free of internal references that T can be converted to. │ │ │ │ │ +Definition: typetraits.hh:558 │ │ │ │ │ +Dune::Simd::anyTrue │ │ │ │ │ +bool anyTrue(const Mask &mask) │ │ │ │ │ +Whether any entry is true │ │ │ │ │ +Definition: simd/interface.hh:429 │ │ │ │ │ +Dune::Simd::mask │ │ │ │ │ +auto mask(const V &v) │ │ │ │ │ +Convert to mask, analogue of bool(s) for scalars. │ │ │ │ │ +Definition: simd/interface.hh:489 │ │ │ │ │ +Dune::Simd::lanes │ │ │ │ │ +constexpr std::size_t lanes() │ │ │ │ │ +Number of lanes in a SIMD type. │ │ │ │ │ +Definition: simd/interface.hh:305 │ │ │ │ │ +Dune::Simd::lane │ │ │ │ │ +decltype(auto) lane(std::size_t l, V &&v) │ │ │ │ │ +Extract an element of a SIMD type. │ │ │ │ │ +Definition: simd/interface.hh:324 │ │ │ │ │ +Dune::Simd::Mask │ │ │ │ │ +Rebind< bool, V > Mask │ │ │ │ │ +Mask type type of some SIMD type. │ │ │ │ │ +Definition: simd/interface.hh:289 │ │ │ │ │ +Dune::Simd::Scalar │ │ │ │ │ +typename Overloads::ScalarType< std::decay_t< V > >::type Scalar │ │ │ │ │ +Element type of some SIMD type. │ │ │ │ │ +Definition: simd/interface.hh:235 │ │ │ │ │ +Dune::Simd::Overloads::mask │ │ │ │ │ +Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v) │ │ │ │ │ +implements Simd::mask() │ │ │ │ │ +Definition: defaults.hh:153 │ │ │ │ │ +Dune::Simd::Overloads::implCast │ │ │ │ │ +constexpr V implCast(ADLTag< 0 >, MetaType< V >, const V &u) │ │ │ │ │ +implements Simd::implCast(V) │ │ │ │ │ +Definition: defaults.hh:52 │ │ │ │ │ +Dune::Simd::Overloads::min │ │ │ │ │ +auto min(ADLTag< 0 >, const V &v) │ │ │ │ │ +implements Simd::minValue() │ │ │ │ │ +Definition: defaults.hh:142 │ │ │ │ │ +Dune::Simd::Overloads::allFalse │ │ │ │ │ +bool allFalse(ADLTag< 0 >, const Mask &mask) │ │ │ │ │ +implements Simd::allFalse() │ │ │ │ │ +Definition: defaults.hh:124 │ │ │ │ │ +Dune::Simd::Overloads::allTrue │ │ │ │ │ +bool allTrue(ADLTag< 0 >, const Mask &mask) │ │ │ │ │ +implements Simd::allTrue() │ │ │ │ │ +Definition: defaults.hh:104 │ │ │ │ │ +Dune::Simd::Overloads::max │ │ │ │ │ +auto max(ADLTag< 0 >, const V &v) │ │ │ │ │ +implements Simd::maxValue() │ │ │ │ │ +Definition: defaults.hh:131 │ │ │ │ │ +Dune::Simd::Overloads::maskAnd │ │ │ │ │ +auto maskAnd(ADLTag< 0 >, const V1 &v1, const V2 &v2) │ │ │ │ │ +implements Simd::maskAnd() │ │ │ │ │ +Definition: defaults.hh:177 │ │ │ │ │ +Dune::Simd::Overloads::maskOr │ │ │ │ │ +auto maskOr(ADLTag< 0 >, const V1 &v1, const V2 &v2) │ │ │ │ │ +implements Simd::maskOr() │ │ │ │ │ +Definition: defaults.hh:170 │ │ │ │ │ +Dune::Simd::Overloads::anyFalse │ │ │ │ │ +bool anyFalse(ADLTag< 0 >, const Mask &mask) │ │ │ │ │ +implements Simd::anyFalse() │ │ │ │ │ +Definition: defaults.hh:114 │ │ │ │ │ +Dune::Simd::Overloads::min │ │ │ │ │ +auto min(ADLTag< 0 >, const V &v1, const V &v2) │ │ │ │ │ +implements binary Simd::min() │ │ │ │ │ +Definition: defaults.hh:89 │ │ │ │ │ +Dune::Simd::Overloads::broadcast │ │ │ │ │ +auto broadcast(ADLTag< 0 >, MetaType< V >, S s) │ │ │ │ │ +implements Simd::broadcast() │ │ │ │ │ +Definition: defaults.hh:69 │ │ │ │ │ +Dune::Simd::Overloads::max │ │ │ │ │ +auto max(ADLTag< 0 >, const V &v1, const V &v2) │ │ │ │ │ +implements binary Simd::max() │ │ │ │ │ +Definition: defaults.hh:81 │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::LocalIndex │ │ │ │ │ -An index present on the local process. │ │ │ │ │ -Definition: localindex.hh:35 │ │ │ │ │ -Dune::LocalIndex::LocalIndex │ │ │ │ │ -LocalIndex() │ │ │ │ │ -Constructor. known to other processes. │ │ │ │ │ -Definition: localindex.hh:41 │ │ │ │ │ -Dune::LocalIndex::LocalIndex │ │ │ │ │ -LocalIndex(std::size_t index) │ │ │ │ │ -Constructor. │ │ │ │ │ -Definition: localindex.hh:49 │ │ │ │ │ +Dune::Simd::Overloads::anyTrue │ │ │ │ │ +bool anyTrue(ADLTag< 5 >, const AlignedNumber< bool, align > &mask) │ │ │ │ │ +Definition: debugalign.hh:543 │ │ │ │ │ +Dune::Simd::Overloads::cond │ │ │ │ │ +const AlignedNumber< T, align > & cond(ADLTag< 5 >, AlignedNumber< bool, align │ │ │ │ │ +> mask, const AlignedNumber< T, align > &ifTrue, const AlignedNumber< T, align │ │ │ │ │ +> &ifFalse) │ │ │ │ │ +Definition: debugalign.hh:535 │ │ │ │ │ +Dune::Simd::Overloads::lane │ │ │ │ │ +T & lane(ADLTag< 5 >, std::size_t l, AlignedNumber< T, align > &v) │ │ │ │ │ +Definition: debugalign.hh:520 │ │ │ │ │ +Dune::Simd::Overloads::ADLTag │ │ │ │ │ +Tag used to force late-binding lookup in Dune::Simd::Overloads. │ │ │ │ │ +Definition: base.hh:182 │ │ │ │ │ +Dune::Simd::Overloads::ADLTag<_0_> │ │ │ │ │ +Definition: base.hh:188 │ │ │ │ │ +Dune::MetaType │ │ │ │ │ +A type that refers to another type. │ │ │ │ │ +Definition: typelist.hh:33 │ │ │ │ │ +interface.hh │ │ │ │ │ +User interface of the SIMD abstraction. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00065.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: mpifuture.hh File Reference │ │ │ │ +dune-common: standard.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,51 +58,86 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
mpifuture.hh File Reference
│ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ -
#include <optional>
│ │ │ │ -#include <dune/common/parallel/communication.hh>
│ │ │ │ -#include <dune/common/parallel/future.hh>
│ │ │ │ -#include <dune/common/parallel/mpidata.hh>
│ │ │ │ + │ │ │ │ +

SIMD abstractions for the standard built-in types. │ │ │ │ +More...

│ │ │ │ +
#include <cstddef>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <dune/common/indices.hh>
│ │ │ │ +#include <dune/common/simd/base.hh>
│ │ │ │ +#include <dune/common/simd/defaults.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::impl::Buffer< T >
 
struct  Dune::impl::Buffer< T & >
struct  Dune::Simd::Overloads::ScalarType< V, class >
 should have a member type type More...
 
struct  Dune::impl::Buffer< void >
struct  Dune::Simd::Overloads::RebindType< S, class, class >
 should have a member type type More...
 
class  Dune::MPIFuture< R, S >
 Provides a future-like object for MPI communication. It contains the object that will be received and might contain also a sending object, which must be hold (keep alive) until the communication has been completed. More...
struct  Dune::Simd::Overloads::LaneCount< class, class >
 should be derived from a Dune::index_constant More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::impl
namespace  Dune::Simd
 Namespace for vectorization interface functions used by library developers.
 
namespace  Dune::Simd::Overloads
 Namespace for the overloads and specializations that make up a SIMD implementation.
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

Specialized classes and overloaded functions
template<class V >
Dune::Simd::Overloads::lane (ADLTag< 2 >, std::size_t, V v)
 implements Simd::lane() More...
 
template<class V >
V & Dune::Simd::Overloads::lane (ADLTag< 3 >, std::size_t, V &v)
 
bool Dune::Simd::Overloads::anyTrue (ADLTag< 2 >, bool mask)
 implements Simd::anyTrue() More...
 
bool Dune::Simd::Overloads::allTrue (ADLTag< 2 >, bool mask)
 implements Simd::allTrue() More...
 
bool Dune::Simd::Overloads::anyFalse (ADLTag< 2 >, bool mask)
 implements Simd::anyFalse() More...
 
bool Dune::Simd::Overloads::allFalse (ADLTag< 2 >, bool mask)
 implements Simd::allFalse() More...
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

SIMD abstractions for the standard built-in types.

│ │ │ │ +

This file should not normally be included by users of the SIMD abstraction (i.e. other Dune headers). Neither should it be included by the translation units passing built-in types to Dune headers that in turn support SIMD types through the SIMD abstraction. Dune-functionality always supports built-in types. Either because that functionality does not support SIMD types and so only supports built-in types, or if it does support SIMD types it must include <dune/common/simd/simd.hh>, which in turn includes this header.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,37 +4,75 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ + * simd │ │ │ │ │ Classes | Namespaces │ │ │ │ │ -mpifuture.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +standard.hh File Reference │ │ │ │ │ +Common » Vectorization » Application_Developer's_Interface » SIMD_Abstraction │ │ │ │ │ +Implementation_for_standard_types │ │ │ │ │ +SIMD abstractions for the standard built-in types. More... │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -struct  Dune::impl::Buffer<_T_> │ │ │ │ │ +struct  Dune::Simd::Overloads::ScalarType<_V,_class_> │ │ │ │ │ +  should have a member type type More... │ │ │ │ │   │ │ │ │ │ -struct  Dune::impl::Buffer<_T_&_> │ │ │ │ │ +struct  Dune::Simd::Overloads::RebindType<_S,_class,_class_> │ │ │ │ │ +  should have a member type type More... │ │ │ │ │   │ │ │ │ │ -struct  Dune::impl::Buffer<_void_> │ │ │ │ │ -  │ │ │ │ │ - class  Dune::MPIFuture<_R,_S_> │ │ │ │ │ - Provides a future-like object for MPI communication. It contains the │ │ │ │ │ -  object that will be received and might contain also a sending object, │ │ │ │ │ - which must be hold (keep alive) until the communication has been │ │ │ │ │ - completed. More... │ │ │ │ │ +struct  Dune::Simd::Overloads::LaneCount<_class,_class_> │ │ │ │ │ +  should be derived from a Dune::index_constant More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ -namespace  Dune::impl │ │ │ │ │ -  │ │ │ │ │ +namespace  Dune::Simd │ │ │ │ │ +  Namespace for vectorization interface functions used by library │ │ │ │ │ + developers. │ │ │ │ │ +  │ │ │ │ │ +namespace  Dune::Simd::Overloads │ │ │ │ │ +  Namespace for the overloads and specializations that make up a SIMD │ │ │ │ │ + implementation. │ │ │ │ │ +  │ │ │ │ │ + Functions │ │ │ │ │ +Specialized classes and overloaded functions │ │ │ │ │ +template │ │ │ │ │ + V Dune::Simd::Overloads::lane (ADLTag< 2 >, std::size_t, V v) │ │ │ │ │ +  implements Simd::lane() More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + V & Dune::Simd::Overloads::lane (ADLTag< 3 >, std::size_t, V &v) │ │ │ │ │ +  │ │ │ │ │ +bool Dune::Simd::Overloads::anyTrue (ADLTag< 2 >, bool mask) │ │ │ │ │ +  implements Simd::anyTrue() More... │ │ │ │ │ +  │ │ │ │ │ +bool Dune::Simd::Overloads::allTrue (ADLTag< 2 >, bool mask) │ │ │ │ │ +  implements Simd::allTrue() More... │ │ │ │ │ +  │ │ │ │ │ +bool Dune::Simd::Overloads::anyFalse (ADLTag< 2 >, bool mask) │ │ │ │ │ +  implements Simd::anyFalse() More... │ │ │ │ │ +  │ │ │ │ │ +bool Dune::Simd::Overloads::allFalse (ADLTag< 2 >, bool mask) │ │ │ │ │ +  implements Simd::allFalse() More... │ │ │ │ │ +  │ │ │ │ │ +***** Detailed Description ***** │ │ │ │ │ +SIMD abstractions for the standard built-in types. │ │ │ │ │ +This file should not normally be included by users of the SIMD abstraction │ │ │ │ │ +(i.e. other Dune headers). Neither should it be included by the translation │ │ │ │ │ +units passing built-in types to Dune headers that in turn support SIMD types │ │ │ │ │ +through the SIMD abstraction. Dune-functionality always supports built-in │ │ │ │ │ +types. Either because that functionality does not support SIMD types and so │ │ │ │ │ +only supports built-in types, or if it does support SIMD types it must include │ │ │ │ │ +, which in turn includes this header. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00065_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: mpifuture.hh Source File │ │ │ │ +dune-common: standard.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,231 +58,98 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
mpifuture.hh
│ │ │ │ +
standard.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 (C) 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_PARALLEL_MPIFUTURE_HH
│ │ │ │ -
6#define DUNE_COMMON_PARALLEL_MPIFUTURE_HH
│ │ │ │ -
7
│ │ │ │ -
8#include <optional>
│ │ │ │ -
9
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
13
│ │ │ │ -
14#if HAVE_MPI
│ │ │ │ -
15namespace Dune{
│ │ │ │ -
16
│ │ │ │ -
17 namespace impl{
│ │ │ │ -
18 template<class T>
│ │ │ │ -
19 struct Buffer{
│ │ │ │ -
20 Buffer(bool valid){
│ │ │ │ -
21 if(valid)
│ │ │ │ -
22 value = std::make_unique<T>();
│ │ │ │ -
23 }
│ │ │ │ -
24 template<class V>
│ │ │ │ -
25 Buffer(V&& t)
│ │ │ │ -
26 : value(std::make_unique<T>(std::forward<V>(t)))
│ │ │ │ -
27 {}
│ │ │ │ -
28 std::unique_ptr<T> value;
│ │ │ │ -
29 T get(){
│ │ │ │ -
30 T tmp = std::move(*value);
│ │ │ │ -
31 value.reset();
│ │ │ │ -
32 return tmp;
│ │ │ │ -
33 }
│ │ │ │ -
34 operator bool () const {
│ │ │ │ -
35 return (bool)value;
│ │ │ │ -
36 }
│ │ │ │ -
37 T& operator *() const{
│ │ │ │ -
38 return *value;
│ │ │ │ -
39 }
│ │ │ │ -
40 };
│ │ │ │ -
41
│ │ │ │ -
42 template<class T>
│ │ │ │ -
43 struct Buffer<T&>{
│ │ │ │ -
44 Buffer(bool valid = false)
│ │ │ │ -
45 {
│ │ │ │ -
46 if(valid)
│ │ │ │ -
47 value = T();
│ │ │ │ -
48 }
│ │ │ │ -
49 template<class V>
│ │ │ │ -
50 Buffer(V&& t)
│ │ │ │ -
51 : value(std::forward<V>(t))
│ │ │ │ -
52 {}
│ │ │ │ -
53 std::optional<std::reference_wrapper<T>> value;
│ │ │ │ -
54 T& get(){
│ │ │ │ -
55 T& tmp = *value;
│ │ │ │ -
56 value.reset();
│ │ │ │ -
57 return tmp;
│ │ │ │ -
58 }
│ │ │ │ -
59 operator bool () const{
│ │ │ │ -
60 return (bool)value;
│ │ │ │ -
61 }
│ │ │ │ -
62 T& operator *() const{
│ │ │ │ -
63 return *value;
│ │ │ │ -
64 }
│ │ │ │ -
65 };
│ │ │ │ -
66
│ │ │ │ -
67 template<>
│ │ │ │ -
68 struct Buffer<void>{
│ │ │ │ -
69 bool valid_;
│ │ │ │ -
70 Buffer(bool valid = false)
│ │ │ │ -
71 : valid_(valid)
│ │ │ │ -
72 {}
│ │ │ │ -
73 operator bool () const{
│ │ │ │ -
74 return valid_;
│ │ │ │ -
75 }
│ │ │ │ -
76 void get(){}
│ │ │ │ -
77 };
│ │ │ │ -
78 }
│ │ │ │ -
79
│ │ │ │ -
84 template<class R, class S = void>
│ │ │ │ -
85 class MPIFuture{
│ │ │ │ -
86 mutable MPI_Request req_;
│ │ │ │ -
87 mutable MPI_Status status_;
│ │ │ │ -
88 impl::Buffer<R> data_;
│ │ │ │ -
89 impl::Buffer<S> send_data_;
│ │ │ │ -
90 friend class Communication<MPI_Comm>;
│ │ │ │ -
91 public:
│ │ │ │ -
92 MPIFuture(bool valid = false)
│ │ │ │ -
93 : req_(MPI_REQUEST_NULL)
│ │ │ │ -
94 , data_(valid)
│ │ │ │ -
95 {}
│ │ │ │ -
96
│ │ │ │ -
97 // Hide this constructor if R or S is void
│ │ │ │ -
98 template<class V = R, class U = S>
│ │ │ │ -
99 MPIFuture(V&& recv_data, U&& send_data, typename std::enable_if_t<!std::is_void<V>::value && !std::is_void<U>::value>* = 0) :
│ │ │ │ -
100 req_(MPI_REQUEST_NULL)
│ │ │ │ -
101 , data_(std::forward<R>(recv_data))
│ │ │ │ -
102 , send_data_(std::forward<S>(send_data))
│ │ │ │ -
103 {}
│ │ │ │ -
104
│ │ │ │ -
105 // hide this constructor if R is void
│ │ │ │ -
106 template<class V = R>
│ │ │ │ -
107 MPIFuture(V&& recv_data, typename std::enable_if_t<!std::is_void<V>::value>* = 0)
│ │ │ │ -
108 : req_(MPI_REQUEST_NULL)
│ │ │ │ -
109 , data_(std::forward<V>(recv_data))
│ │ │ │ -
110 {}
│ │ │ │ -
111
│ │ │ │ - │ │ │ │ -
113 if(req_ != MPI_REQUEST_NULL){
│ │ │ │ -
114 try{ // might fail when it is a collective communication
│ │ │ │ -
115 MPI_Cancel(&req_);
│ │ │ │ -
116 MPI_Request_free(&req_);
│ │ │ │ -
117 }catch(...){
│ │ │ │ -
118 }
│ │ │ │ -
119 }
│ │ │ │ -
120 }
│ │ │ │ -
121
│ │ │ │ - │ │ │ │ -
123 : req_(MPI_REQUEST_NULL)
│ │ │ │ -
124 , data_(std::move(f.data_))
│ │ │ │ -
125 , send_data_(std::move(f.send_data_))
│ │ │ │ -
126 {
│ │ │ │ -
127 std::swap(req_, f.req_);
│ │ │ │ -
128 std::swap(status_, f.status_);
│ │ │ │ -
129 }
│ │ │ │ -
130
│ │ │ │ - │ │ │ │ -
132 std::swap(req_, f.req_);
│ │ │ │ -
133 std::swap(status_, f.status_);
│ │ │ │ -
134 std::swap(data_, f.data_);
│ │ │ │ -
135 std::swap(send_data_, f.send_data_);
│ │ │ │ -
136 return *this;
│ │ │ │ -
137 }
│ │ │ │ -
138
│ │ │ │ -
139 bool valid() const{
│ │ │ │ -
140 return (bool)data_;
│ │ │ │ -
141 }
│ │ │ │ -
142
│ │ │ │ -
143 void wait(){
│ │ │ │ -
144 if(!valid())
│ │ │ │ -
145 DUNE_THROW(InvalidFutureException, "The MPIFuture is not valid!");
│ │ │ │ -
146 MPI_Wait(&req_, &status_);
│ │ │ │ -
147 }
│ │ │ │ -
148
│ │ │ │ -
149 bool ready() const{
│ │ │ │ -
150 int flag = -1;
│ │ │ │ -
151 MPI_Test(&req_, &flag, &status_);
│ │ │ │ -
152 return flag;
│ │ │ │ -
153 }
│ │ │ │ -
154
│ │ │ │ -
155 R get() {
│ │ │ │ -
156 wait();
│ │ │ │ -
157 return data_.get();
│ │ │ │ -
158 }
│ │ │ │ -
159
│ │ │ │ - │ │ │ │ -
161 wait();
│ │ │ │ -
162 return send_data_.get();
│ │ │ │ -
163 }
│ │ │ │ -
164
│ │ │ │ - │ │ │ │ -
166 return getMPIData(*data_);
│ │ │ │ -
167 }
│ │ │ │ -
168
│ │ │ │ - │ │ │ │ -
170 return getMPIData(*send_data_);
│ │ │ │ -
171 }
│ │ │ │ -
172 };
│ │ │ │ -
173
│ │ │ │ -
174}
│ │ │ │ -
175#endif
│ │ │ │ -
176#endif
│ │ │ │ - │ │ │ │ -
Implements an utility class that provides collective communication methods for sequential programs.
│ │ │ │ -
Interface class to translate objects to a MPI_Datatype, void* and size used for MPI calls.
│ │ │ │ -
bigunsignedint< k > operator*(const bigunsignedint< k > &x, std::uintmax_t y)
Definition: bigunsignedint.hh:549
│ │ │ │ -
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
│ │ │ │ -
STL namespace.
│ │ │ │ +Go to the documentation of this file.
1// SPDX-FileCopyrightInfo: Copyright (C) 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_SIMD_STANDARD_HH
│ │ │ │ +
4#define DUNE_COMMON_SIMD_STANDARD_HH
│ │ │ │ +
5
│ │ │ │ +
20#include <cstddef>
│ │ │ │ +
21#include <type_traits>
│ │ │ │ +
22#include <utility>
│ │ │ │ +
23
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
27
│ │ │ │ +
45namespace Dune {
│ │ │ │ +
46 namespace Simd {
│ │ │ │ +
47
│ │ │ │ +
48 namespace Overloads {
│ │ │ │ +
49
│ │ │ │ +
56
│ │ │ │ +
59 template<class V, class>
│ │ │ │ +
60 struct ScalarType { using type = V; };
│ │ │ │ +
61
│ │ │ │ +
63
│ │ │ │ +
66 template<class S, class, class>
│ │ │ │ +
67 struct RebindType { using type = S; };
│ │ │ │ +
68
│ │ │ │ +
70
│ │ │ │ +
73 template<class, class>
│ │ │ │ +
74 struct LaneCount : public index_constant<1> { };
│ │ │ │ +
75
│ │ │ │ +
77
│ │ │ │ +
86 template<class V>
│ │ │ │ +
87 V lane(ADLTag<2>, std::size_t, V v)
│ │ │ │ +
88 {
│ │ │ │ +
89 return v;
│ │ │ │ +
90 }
│ │ │ │ +
91
│ │ │ │ +
92 template<class V>
│ │ │ │ +
93 V &lane(ADLTag<3>, std::size_t, V &v)
│ │ │ │ +
94 {
│ │ │ │ +
95 return v;
│ │ │ │ +
96 }
│ │ │ │ +
97
│ │ │ │ +
98 // No Simd::cond() implementation, the overload for bool masks in the
│ │ │ │ +
99 // interface is sufficient
│ │ │ │ +
100
│ │ │ │ +
102 inline bool anyTrue(ADLTag<2>, bool mask) { return mask; }
│ │ │ │ +
103
│ │ │ │ +
105 inline bool allTrue(ADLTag<2>, bool mask) { return mask; }
│ │ │ │ +
106
│ │ │ │ +
108 inline bool anyFalse(ADLTag<2>, bool mask) { return !mask; }
│ │ │ │ +
109
│ │ │ │ +
111 inline bool allFalse(ADLTag<2>, bool mask) { return !mask; }
│ │ │ │ +
112
│ │ │ │ +
114
│ │ │ │ +
115 } // namespace Overloads
│ │ │ │ +
116 } // namespace Simd
│ │ │ │ +
117} // namespace Dune
│ │ │ │ +
118
│ │ │ │ +
119#endif // DUNE_COMMON_SIMD_STANDARD_HH
│ │ │ │ +
Default implementations for SIMD Implementations.
│ │ │ │ +
Basic definitions for SIMD Implementations.
│ │ │ │ + │ │ │ │ +
std::integral_constant< std::size_t, i > index_constant
An index constant with value i.
Definition: indices.hh:30
│ │ │ │ +
Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v)
implements Simd::mask()
Definition: defaults.hh:153
│ │ │ │ +
bool allFalse(ADLTag< 0 >, const Mask &mask)
implements Simd::allFalse()
Definition: defaults.hh:124
│ │ │ │ +
bool allTrue(ADLTag< 0 >, const Mask &mask)
implements Simd::allTrue()
Definition: defaults.hh:104
│ │ │ │ +
bool anyFalse(ADLTag< 0 >, const Mask &mask)
implements Simd::anyFalse()
Definition: defaults.hh:114
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
auto getMPIData(T &t)
Definition: mpidata.hh:43
│ │ │ │ -
void swap(T &v1, T &v2, bool mask)
Definition: simd.hh:472
│ │ │ │ -
Collective communication interface and sequential default implementation.
Definition: communication.hh:100
│ │ │ │ -
This exception is thrown when ready(), wait() or get() is called on an invalid future....
Definition: future.hh:18
│ │ │ │ -
Definition: mpifuture.hh:19
│ │ │ │ -
std::unique_ptr< T > value
Definition: mpifuture.hh:28
│ │ │ │ -
T & operator*() const
Definition: mpifuture.hh:37
│ │ │ │ -
Buffer(V &&t)
Definition: mpifuture.hh:25
│ │ │ │ -
T get()
Definition: mpifuture.hh:29
│ │ │ │ -
Buffer(bool valid)
Definition: mpifuture.hh:20
│ │ │ │ -
std::optional< std::reference_wrapper< T > > value
Definition: mpifuture.hh:53
│ │ │ │ -
Buffer(bool valid=false)
Definition: mpifuture.hh:44
│ │ │ │ -
T & get()
Definition: mpifuture.hh:54
│ │ │ │ -
Buffer(V &&t)
Definition: mpifuture.hh:50
│ │ │ │ -
bool valid_
Definition: mpifuture.hh:69
│ │ │ │ -
void get()
Definition: mpifuture.hh:76
│ │ │ │ -
Buffer(bool valid=false)
Definition: mpifuture.hh:70
│ │ │ │ -
Provides a future-like object for MPI communication. It contains the object that will be received and...
Definition: mpifuture.hh:85
│ │ │ │ -
MPIFuture(V &&recv_data, typename std::enable_if_t<!std::is_void< V >::value > *=0)
Definition: mpifuture.hh:107
│ │ │ │ -
bool ready() const
Definition: mpifuture.hh:149
│ │ │ │ -
bool valid() const
Definition: mpifuture.hh:139
│ │ │ │ -
~MPIFuture()
Definition: mpifuture.hh:112
│ │ │ │ -
MPIFuture(bool valid=false)
Definition: mpifuture.hh:92
│ │ │ │ -
MPIFuture & operator=(MPIFuture &&f)
Definition: mpifuture.hh:131
│ │ │ │ -
auto get_send_mpidata()
Definition: mpifuture.hh:169
│ │ │ │ -
void wait()
Definition: mpifuture.hh:143
│ │ │ │ -
auto get_mpidata()
Definition: mpifuture.hh:165
│ │ │ │ -
R get()
Definition: mpifuture.hh:155
│ │ │ │ -
MPIFuture(V &&recv_data, U &&send_data, typename std::enable_if_t<!std::is_void< V >::value &&!std::is_void< U >::value > *=0)
Definition: mpifuture.hh:99
│ │ │ │ -
S get_send_data()
Definition: mpifuture.hh:160
│ │ │ │ -
MPIFuture(MPIFuture &&f)
Definition: mpifuture.hh:122
│ │ │ │ +
bool anyTrue(ADLTag< 5 >, const AlignedNumber< bool, align > &mask)
Definition: debugalign.hh:543
│ │ │ │ +
T & lane(ADLTag< 5 >, std::size_t l, AlignedNumber< T, align > &v)
Definition: debugalign.hh:520
│ │ │ │ +
Tag used to force late-binding lookup in Dune::Simd::Overloads.
Definition: base.hh:182
│ │ │ │ +
should have a member type type
Definition: standard.hh:60
│ │ │ │ +
V type
Definition: standard.hh:60
│ │ │ │ +
should have a member type type
Definition: standard.hh:67
│ │ │ │ +
S type
Definition: standard.hh:67
│ │ │ │ +
should be derived from a Dune::index_constant
Definition: standard.hh:74
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,302 +4,126 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -mpifuture.hh │ │ │ │ │ + * simd │ │ │ │ │ +standard.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 (C) DUNE Project contributors, see file │ │ │ │ │ + 1// SPDX-FileCopyrightInfo: Copyright (C) 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_PARALLEL_MPIFUTURE_HH │ │ │ │ │ - 6#define DUNE_COMMON_PARALLEL_MPIFUTURE_HH │ │ │ │ │ - 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13 │ │ │ │ │ - 14#if HAVE_MPI │ │ │ │ │ - 15namespace Dune{ │ │ │ │ │ - 16 │ │ │ │ │ -17 namespace impl{ │ │ │ │ │ - 18 template │ │ │ │ │ -19 struct Buffer{ │ │ │ │ │ -20 Buffer(bool valid){ │ │ │ │ │ - 21 if(valid) │ │ │ │ │ - 22 value = std::make_unique(); │ │ │ │ │ - 23 } │ │ │ │ │ - 24 template │ │ │ │ │ -25 Buffer(V&& t) │ │ │ │ │ - 26 : value(std::make_unique(std::forward(t))) │ │ │ │ │ - 27 {} │ │ │ │ │ -28 std::unique_ptr value; │ │ │ │ │ -29 T get(){ │ │ │ │ │ - 30 T tmp = std::move(*value); │ │ │ │ │ - 31 value.reset(); │ │ │ │ │ - 32 return tmp; │ │ │ │ │ - 33 } │ │ │ │ │ -34 operator bool () const { │ │ │ │ │ - 35 return (bool)value; │ │ │ │ │ - 36 } │ │ │ │ │ -37 T& operator_*() const{ │ │ │ │ │ - 38 return *value; │ │ │ │ │ - 39 } │ │ │ │ │ - 40 }; │ │ │ │ │ - 41 │ │ │ │ │ - 42 template │ │ │ │ │ -43 struct Buffer{ │ │ │ │ │ -44 Buffer(bool valid = false) │ │ │ │ │ - 45 { │ │ │ │ │ - 46 if(valid) │ │ │ │ │ - 47 value = T(); │ │ │ │ │ - 48 } │ │ │ │ │ - 49 template │ │ │ │ │ -50 Buffer(V&& t) │ │ │ │ │ - 51 : value(std::forward(t)) │ │ │ │ │ - 52 {} │ │ │ │ │ -53 std::optional> value; │ │ │ │ │ -54 T& get(){ │ │ │ │ │ - 55 T& tmp = *value; │ │ │ │ │ - 56 value.reset(); │ │ │ │ │ - 57 return tmp; │ │ │ │ │ - 58 } │ │ │ │ │ -59 operator bool () const{ │ │ │ │ │ - 60 return (bool)value; │ │ │ │ │ - 61 } │ │ │ │ │ -62 T& operator_*() const{ │ │ │ │ │ - 63 return *value; │ │ │ │ │ - 64 } │ │ │ │ │ - 65 }; │ │ │ │ │ - 66 │ │ │ │ │ - 67 template<> │ │ │ │ │ -68 struct Buffer{ │ │ │ │ │ -69 bool valid_; │ │ │ │ │ -70 Buffer(bool valid = false) │ │ │ │ │ - 71 : valid_(valid) │ │ │ │ │ - 72 {} │ │ │ │ │ -73 operator bool () const{ │ │ │ │ │ - 74 return valid_; │ │ │ │ │ - 75 } │ │ │ │ │ -76 void get(){} │ │ │ │ │ - 77 }; │ │ │ │ │ - 78 } │ │ │ │ │ - 79 │ │ │ │ │ - 84 template │ │ │ │ │ -85 class MPIFuture{ │ │ │ │ │ - 86 mutable MPI_Request req_; │ │ │ │ │ - 87 mutable MPI_Status status_; │ │ │ │ │ - 88 impl::Buffer data_; │ │ │ │ │ -89 impl::Buffer send_data_; │ │ │ │ │ - 90 friend class Communication; │ │ │ │ │ - 91 public: │ │ │ │ │ -92 MPIFuture(bool valid = false) │ │ │ │ │ - 93 : req_(MPI_REQUEST_NULL) │ │ │ │ │ - 94 , data_(valid) │ │ │ │ │ - 95 {} │ │ │ │ │ - 96 │ │ │ │ │ - 97 // Hide this constructor if R or S is void │ │ │ │ │ - 98 template │ │ │ │ │ -99 MPIFuture(V&& recv_data, U&& send_data, typename std::enable_if_t::value && !std::is_void::value>* = 0) : │ │ │ │ │ - 100 req_(MPI_REQUEST_NULL) │ │ │ │ │ - 101 , data_(std::forward(recv_data)) │ │ │ │ │ - 102 , send_data_(std::forward(send_data)) │ │ │ │ │ - 103 {} │ │ │ │ │ - 104 │ │ │ │ │ - 105 // hide this constructor if R is void │ │ │ │ │ - 106 template │ │ │ │ │ -107 MPIFuture(V&& recv_data, typename std::enable_if_t:: │ │ │ │ │ -value>* = 0) │ │ │ │ │ - 108 : req_(MPI_REQUEST_NULL) │ │ │ │ │ - 109 , data_(std::forward(recv_data)) │ │ │ │ │ - 110 {} │ │ │ │ │ - 111 │ │ │ │ │ -112 ~MPIFuture() { │ │ │ │ │ - 113 if(req_ != MPI_REQUEST_NULL){ │ │ │ │ │ - 114 try{ // might fail when it is a collective communication │ │ │ │ │ - 115 MPI_Cancel(&req_); │ │ │ │ │ - 116 MPI_Request_free(&req_); │ │ │ │ │ - 117 }catch(...){ │ │ │ │ │ - 118 } │ │ │ │ │ - 119 } │ │ │ │ │ - 120 } │ │ │ │ │ - 121 │ │ │ │ │ -122 MPIFuture(MPIFuture&& f) │ │ │ │ │ - 123 : req_(MPI_REQUEST_NULL) │ │ │ │ │ - 124 , data_(std::move(f.data_)) │ │ │ │ │ - 125 , send_data_(std::move(f.send_data_)) │ │ │ │ │ - 126 { │ │ │ │ │ - 127 std::swap(req_, f.req_); │ │ │ │ │ - 128 std::swap(status_, f.status_); │ │ │ │ │ - 129 } │ │ │ │ │ - 130 │ │ │ │ │ -131 MPIFuture& operator=(MPIFuture&& f){ │ │ │ │ │ - 132 std::swap(req_, f.req_); │ │ │ │ │ - 133 std::swap(status_, f.status_); │ │ │ │ │ - 134 std::swap(data_, f.data_); │ │ │ │ │ - 135 std::swap(send_data_, f.send_data_); │ │ │ │ │ - 136 return *this; │ │ │ │ │ - 137 } │ │ │ │ │ - 138 │ │ │ │ │ -139 bool valid() const{ │ │ │ │ │ - 140 return (bool)data_; │ │ │ │ │ - 141 } │ │ │ │ │ - 142 │ │ │ │ │ -143 void wait(){ │ │ │ │ │ - 144 if(!valid()) │ │ │ │ │ - 145 DUNE_THROW(InvalidFutureException, "The MPIFuture is not valid!"); │ │ │ │ │ - 146 MPI_Wait(&req_, &status_); │ │ │ │ │ - 147 } │ │ │ │ │ - 148 │ │ │ │ │ -149 bool ready() const{ │ │ │ │ │ - 150 int flag = -1; │ │ │ │ │ - 151 MPI_Test(&req_, &flag, &status_); │ │ │ │ │ - 152 return flag; │ │ │ │ │ - 153 } │ │ │ │ │ - 154 │ │ │ │ │ -155 R get() { │ │ │ │ │ - 156 wait(); │ │ │ │ │ - 157 return data_.get(); │ │ │ │ │ - 158 } │ │ │ │ │ - 159 │ │ │ │ │ -160 S get_send_data(){ │ │ │ │ │ - 161 wait(); │ │ │ │ │ - 162 return send_data_.get(); │ │ │ │ │ - 163 } │ │ │ │ │ - 164 │ │ │ │ │ -165 auto get_mpidata(){ │ │ │ │ │ - 166 return getMPIData(*data_); │ │ │ │ │ - 167 } │ │ │ │ │ - 168 │ │ │ │ │ -169 auto get_send_mpidata(){ │ │ │ │ │ - 170 return getMPIData(*send_data_); │ │ │ │ │ - 171 } │ │ │ │ │ - 172 }; │ │ │ │ │ - 173 │ │ │ │ │ - 174} │ │ │ │ │ - 175#endif │ │ │ │ │ - 176#endif │ │ │ │ │ -future.hh │ │ │ │ │ -communication.hh │ │ │ │ │ -Implements an utility class that provides collective communication methods for │ │ │ │ │ -sequential programs. │ │ │ │ │ -mpidata.hh │ │ │ │ │ -Interface class to translate objects to a MPI_Datatype, void* and size used for │ │ │ │ │ -MPI calls. │ │ │ │ │ -Dune::operator* │ │ │ │ │ -bigunsignedint< k > operator*(const bigunsignedint< k > &x, std::uintmax_t y) │ │ │ │ │ -Definition: bigunsignedint.hh:549 │ │ │ │ │ -DUNE_THROW │ │ │ │ │ -#define DUNE_THROW(E, m) │ │ │ │ │ -Definition: exceptions.hh:218 │ │ │ │ │ -std │ │ │ │ │ -STL namespace. │ │ │ │ │ + 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ + 3#ifndef DUNE_COMMON_SIMD_STANDARD_HH │ │ │ │ │ + 4#define DUNE_COMMON_SIMD_STANDARD_HH │ │ │ │ │ + 5 │ │ │ │ │ + 20#include │ │ │ │ │ + 21#include │ │ │ │ │ + 22#include │ │ │ │ │ + 23 │ │ │ │ │ + 24#include │ │ │ │ │ + 25#include │ │ │ │ │ + 26#include │ │ │ │ │ + 27 │ │ │ │ │ + 45namespace Dune { │ │ │ │ │ + 46 namespace Simd { │ │ │ │ │ + 47 │ │ │ │ │ + 48 namespace Overloads { │ │ │ │ │ + 49 │ │ │ │ │ + 56 │ │ │ │ │ + 59 template │ │ │ │ │ +60 struct ScalarType { using type = V; }; │ │ │ │ │ + 61 │ │ │ │ │ + 63 │ │ │ │ │ + 66 template │ │ │ │ │ +67 struct RebindType { using type = S; }; │ │ │ │ │ + 68 │ │ │ │ │ + 70 │ │ │ │ │ + 73 template │ │ │ │ │ +74 struct LaneCount : public index_constant<1> { }; │ │ │ │ │ + 75 │ │ │ │ │ + 77 │ │ │ │ │ + 86 template │ │ │ │ │ +87 V lane(ADLTag<2>, std::size_t, V v) │ │ │ │ │ + 88 { │ │ │ │ │ + 89 return v; │ │ │ │ │ + 90 } │ │ │ │ │ + 91 │ │ │ │ │ + 92 template │ │ │ │ │ +93 V &lane(ADLTag<3>, std::size_t, V &v) │ │ │ │ │ + 94 { │ │ │ │ │ + 95 return v; │ │ │ │ │ + 96 } │ │ │ │ │ + 97 │ │ │ │ │ + 98 // No Simd::cond() implementation, the overload for bool masks in the │ │ │ │ │ + 99 // interface is sufficient │ │ │ │ │ + 100 │ │ │ │ │ +102 inline bool anyTrue(ADLTag<2>, bool mask) { return mask; } │ │ │ │ │ + 103 │ │ │ │ │ +105 inline bool allTrue(ADLTag<2>, bool mask) { return mask; } │ │ │ │ │ + 106 │ │ │ │ │ +108 inline bool anyFalse(ADLTag<2>, bool mask) { return !mask; } │ │ │ │ │ + 109 │ │ │ │ │ +111 inline bool allFalse(ADLTag<2>, bool mask) { return !mask; } │ │ │ │ │ + 112 │ │ │ │ │ + 114 │ │ │ │ │ + 115 } // namespace Overloads │ │ │ │ │ + 116 } // namespace Simd │ │ │ │ │ + 117} // namespace Dune │ │ │ │ │ + 118 │ │ │ │ │ + 119#endif // DUNE_COMMON_SIMD_STANDARD_HH │ │ │ │ │ +defaults.hh │ │ │ │ │ +Default implementations for SIMD Implementations. │ │ │ │ │ +base.hh │ │ │ │ │ +Basic definitions for SIMD Implementations. │ │ │ │ │ +indices.hh │ │ │ │ │ +Dune::index_constant │ │ │ │ │ +std::integral_constant< std::size_t, i > index_constant │ │ │ │ │ +An index constant with value i. │ │ │ │ │ +Definition: indices.hh:30 │ │ │ │ │ +Dune::Simd::Overloads::mask │ │ │ │ │ +Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v) │ │ │ │ │ +implements Simd::mask() │ │ │ │ │ +Definition: defaults.hh:153 │ │ │ │ │ +Dune::Simd::Overloads::allFalse │ │ │ │ │ +bool allFalse(ADLTag< 0 >, const Mask &mask) │ │ │ │ │ +implements Simd::allFalse() │ │ │ │ │ +Definition: defaults.hh:124 │ │ │ │ │ +Dune::Simd::Overloads::allTrue │ │ │ │ │ +bool allTrue(ADLTag< 0 >, const Mask &mask) │ │ │ │ │ +implements Simd::allTrue() │ │ │ │ │ +Definition: defaults.hh:104 │ │ │ │ │ +Dune::Simd::Overloads::anyFalse │ │ │ │ │ +bool anyFalse(ADLTag< 0 >, const Mask &mask) │ │ │ │ │ +implements Simd::anyFalse() │ │ │ │ │ +Definition: defaults.hh:114 │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::getMPIData │ │ │ │ │ -auto getMPIData(T &t) │ │ │ │ │ -Definition: mpidata.hh:43 │ │ │ │ │ -Dune::swap │ │ │ │ │ -void swap(T &v1, T &v2, bool mask) │ │ │ │ │ -Definition: simd.hh:472 │ │ │ │ │ -Dune::Communication │ │ │ │ │ -Collective communication interface and sequential default implementation. │ │ │ │ │ -Definition: communication.hh:100 │ │ │ │ │ -Dune::InvalidFutureException │ │ │ │ │ -This exception is thrown when ready(), wait() or get() is called on an invalid │ │ │ │ │ -future.... │ │ │ │ │ -Definition: future.hh:18 │ │ │ │ │ -Dune::impl::Buffer │ │ │ │ │ -Definition: mpifuture.hh:19 │ │ │ │ │ -Dune::impl::Buffer::value │ │ │ │ │ -std::unique_ptr< T > value │ │ │ │ │ -Definition: mpifuture.hh:28 │ │ │ │ │ -Dune::impl::Buffer::operator* │ │ │ │ │ -T & operator*() const │ │ │ │ │ -Definition: mpifuture.hh:37 │ │ │ │ │ -Dune::impl::Buffer::Buffer │ │ │ │ │ -Buffer(V &&t) │ │ │ │ │ -Definition: mpifuture.hh:25 │ │ │ │ │ -Dune::impl::Buffer::get │ │ │ │ │ -T get() │ │ │ │ │ -Definition: mpifuture.hh:29 │ │ │ │ │ -Dune::impl::Buffer::Buffer │ │ │ │ │ -Buffer(bool valid) │ │ │ │ │ -Definition: mpifuture.hh:20 │ │ │ │ │ -Dune::impl::Buffer<_T_&_>::value │ │ │ │ │ -std::optional< std::reference_wrapper< T > > value │ │ │ │ │ -Definition: mpifuture.hh:53 │ │ │ │ │ -Dune::impl::Buffer<_T_&_>::Buffer │ │ │ │ │ -Buffer(bool valid=false) │ │ │ │ │ -Definition: mpifuture.hh:44 │ │ │ │ │ -Dune::impl::Buffer<_T_&_>::get │ │ │ │ │ -T & get() │ │ │ │ │ -Definition: mpifuture.hh:54 │ │ │ │ │ -Dune::impl::Buffer<_T_&_>::Buffer │ │ │ │ │ -Buffer(V &&t) │ │ │ │ │ -Definition: mpifuture.hh:50 │ │ │ │ │ -Dune::impl::Buffer<_void_>::valid_ │ │ │ │ │ -bool valid_ │ │ │ │ │ -Definition: mpifuture.hh:69 │ │ │ │ │ -Dune::impl::Buffer<_void_>::get │ │ │ │ │ -void get() │ │ │ │ │ -Definition: mpifuture.hh:76 │ │ │ │ │ -Dune::impl::Buffer<_void_>::Buffer │ │ │ │ │ -Buffer(bool valid=false) │ │ │ │ │ -Definition: mpifuture.hh:70 │ │ │ │ │ -Dune::MPIFuture │ │ │ │ │ -Provides a future-like object for MPI communication. It contains the object │ │ │ │ │ -that will be received and... │ │ │ │ │ -Definition: mpifuture.hh:85 │ │ │ │ │ -Dune::MPIFuture::MPIFuture │ │ │ │ │ -MPIFuture(V &&recv_data, typename std::enable_if_t::value > │ │ │ │ │ -*=0) │ │ │ │ │ -Definition: mpifuture.hh:107 │ │ │ │ │ -Dune::MPIFuture::ready │ │ │ │ │ -bool ready() const │ │ │ │ │ -Definition: mpifuture.hh:149 │ │ │ │ │ -Dune::MPIFuture::valid │ │ │ │ │ -bool valid() const │ │ │ │ │ -Definition: mpifuture.hh:139 │ │ │ │ │ -Dune::MPIFuture::~MPIFuture │ │ │ │ │ -~MPIFuture() │ │ │ │ │ -Definition: mpifuture.hh:112 │ │ │ │ │ -Dune::MPIFuture::MPIFuture │ │ │ │ │ -MPIFuture(bool valid=false) │ │ │ │ │ -Definition: mpifuture.hh:92 │ │ │ │ │ -Dune::MPIFuture::operator= │ │ │ │ │ -MPIFuture & operator=(MPIFuture &&f) │ │ │ │ │ -Definition: mpifuture.hh:131 │ │ │ │ │ -Dune::MPIFuture::get_send_mpidata │ │ │ │ │ -auto get_send_mpidata() │ │ │ │ │ -Definition: mpifuture.hh:169 │ │ │ │ │ -Dune::MPIFuture::wait │ │ │ │ │ -void wait() │ │ │ │ │ -Definition: mpifuture.hh:143 │ │ │ │ │ -Dune::MPIFuture::get_mpidata │ │ │ │ │ -auto get_mpidata() │ │ │ │ │ -Definition: mpifuture.hh:165 │ │ │ │ │ -Dune::MPIFuture::get │ │ │ │ │ -R get() │ │ │ │ │ -Definition: mpifuture.hh:155 │ │ │ │ │ -Dune::MPIFuture::MPIFuture │ │ │ │ │ -MPIFuture(V &&recv_data, U &&send_data, typename std::enable_if_t::value &&!std::is_void< U >::value > *=0) │ │ │ │ │ -Definition: mpifuture.hh:99 │ │ │ │ │ -Dune::MPIFuture::get_send_data │ │ │ │ │ -S get_send_data() │ │ │ │ │ -Definition: mpifuture.hh:160 │ │ │ │ │ -Dune::MPIFuture::MPIFuture │ │ │ │ │ -MPIFuture(MPIFuture &&f) │ │ │ │ │ -Definition: mpifuture.hh:122 │ │ │ │ │ +Dune::Simd::Overloads::anyTrue │ │ │ │ │ +bool anyTrue(ADLTag< 5 >, const AlignedNumber< bool, align > &mask) │ │ │ │ │ +Definition: debugalign.hh:543 │ │ │ │ │ +Dune::Simd::Overloads::lane │ │ │ │ │ +T & lane(ADLTag< 5 >, std::size_t l, AlignedNumber< T, align > &v) │ │ │ │ │ +Definition: debugalign.hh:520 │ │ │ │ │ +Dune::Simd::Overloads::ADLTag │ │ │ │ │ +Tag used to force late-binding lookup in Dune::Simd::Overloads. │ │ │ │ │ +Definition: base.hh:182 │ │ │ │ │ +Dune::Simd::Overloads::ScalarType │ │ │ │ │ +should have a member type type │ │ │ │ │ +Definition: standard.hh:60 │ │ │ │ │ +Dune::Simd::Overloads::ScalarType::type │ │ │ │ │ +V type │ │ │ │ │ +Definition: standard.hh:60 │ │ │ │ │ +Dune::Simd::Overloads::RebindType │ │ │ │ │ +should have a member type type │ │ │ │ │ +Definition: standard.hh:67 │ │ │ │ │ +Dune::Simd::Overloads::RebindType::type │ │ │ │ │ +S type │ │ │ │ │ +Definition: standard.hh:67 │ │ │ │ │ +Dune::Simd::Overloads::LaneCount │ │ │ │ │ +should be derived from a Dune::index_constant │ │ │ │ │ +Definition: standard.hh:74 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00068.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: plocalindex.hh File Reference │ │ │ │ +dune-common: base.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,67 +58,53 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ - │ │ │ │ +Namespaces
│ │ │ │ + │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

Provides classes for use as the local index in ParallelIndexSet for distributed computing. │ │ │ │ +

Basic definitions for SIMD Implementations. │ │ │ │ More...

│ │ │ │ -
#include "localindex.hh"
│ │ │ │ -#include "indexset.hh"
│ │ │ │ -#include "mpitraits.hh"
│ │ │ │ -#include <iostream>
│ │ │ │ -
│ │ │ │ + │ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::ParallelLocalIndex< T >
 An index present on the local process with an additional attribute flag. More...
 
struct  Dune::LocalIndexComparator< ParallelLocalIndex< T > >
struct  Dune::Simd::Overloads::ADLTag< i >
 
class  Dune::MPITraits< ParallelLocalIndex< T > >
struct  Dune::Simd::Overloads::ADLTag< 0 >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

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

│ │ │ │ -Functions

template<class T >
std::ostream & Dune::operator<< (std::ostream &os, const ParallelLocalIndex< T > &index)
 Print the local index to a stream. More...
 
template<typename T >
bool Dune::operator== (const ParallelLocalIndex< T > &p1, const ParallelLocalIndex< T > &p2)
 
template<typename T >
bool Dune::operator!= (const ParallelLocalIndex< T > &p1, const ParallelLocalIndex< T > &p2)
 
namespace  Dune::Simd
 Namespace for vectorization interface functions used by library developers.
 
namespace  Dune::Simd::Overloads
 Namespace for the overloads and specializations that make up a SIMD implementation.
 
│ │ │ │

Detailed Description

│ │ │ │ -

Provides classes for use as the local index in ParallelIndexSet for distributed computing.

│ │ │ │ -
Author
Markus Blatt
│ │ │ │ +

Basic definitions for SIMD Implementations.

│ │ │ │ +

This file provides basic definitions and template declarations that are used to write SIMD abstraction layers.

│ │ │ │ +

This file should never be included by users of the SIMD abstraction. Include <dune/common/simd/simd.hh> instead.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,53 +4,39 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -Classes | Namespaces | Functions │ │ │ │ │ -plocalindex.hh File Reference │ │ │ │ │ -Common » Parallel_Communication » Parallel_Computing_based_on_Indexsets │ │ │ │ │ -Provides classes for use as the local index in ParallelIndexSet for distributed │ │ │ │ │ -computing. More... │ │ │ │ │ -#include "localindex.hh" │ │ │ │ │ -#include "indexset.hh" │ │ │ │ │ -#include "mpitraits.hh" │ │ │ │ │ -#include │ │ │ │ │ + * simd │ │ │ │ │ +Classes | Namespaces │ │ │ │ │ +base.hh File Reference │ │ │ │ │ +Common » Vectorization » Abstraction_Developer's_Interface │ │ │ │ │ +Basic definitions for SIMD Implementations. More... │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ - class  Dune::ParallelLocalIndex<_T_> │ │ │ │ │ -  An index present on the local process with an additional attribute │ │ │ │ │ - flag. More... │ │ │ │ │ +struct  Dune::Simd::Overloads::ADLTag<_i_> │ │ │ │ │   │ │ │ │ │ -struct  Dune::LocalIndexComparator<_ParallelLocalIndex<_T_>_> │ │ │ │ │ -  │ │ │ │ │ - class  Dune::MPITraits<_ParallelLocalIndex<_T_>_> │ │ │ │ │ +struct  Dune::Simd::Overloads::ADLTag<_0_> │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ - Functions │ │ │ │ │ -template │ │ │ │ │ -std::ostream & Dune::operator<< (std::ostream &os, const ParallelLocalIndex< T │ │ │ │ │ - > &index) │ │ │ │ │ -  Print the local index to a stream. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - bool Dune::operator== (const ParallelLocalIndex< T > &p1, const │ │ │ │ │ - ParallelLocalIndex< T > &p2) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - bool Dune::operator!= (const ParallelLocalIndex< T > &p1, const │ │ │ │ │ - ParallelLocalIndex< T > &p2) │ │ │ │ │ +namespace  Dune::Simd │ │ │ │ │ +  Namespace for vectorization interface functions used by library │ │ │ │ │ + developers. │ │ │ │ │ +  │ │ │ │ │ +namespace  Dune::Simd::Overloads │ │ │ │ │ +  Namespace for the overloads and specializations that make up a SIMD │ │ │ │ │ + implementation. │ │ │ │ │   │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -Provides classes for use as the local index in ParallelIndexSet for distributed │ │ │ │ │ -computing. │ │ │ │ │ - Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ +Basic definitions for SIMD Implementations. │ │ │ │ │ +This file provides basic definitions and template declarations that are used to │ │ │ │ │ +write SIMD abstraction layers. │ │ │ │ │ +This file should never be included by users of the SIMD abstraction. Include │ │ │ │ │ + instead. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00068_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: plocalindex.hh Source File │ │ │ │ +dune-common: base.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,268 +58,66 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
plocalindex.hh
│ │ │ │ +
base.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 (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │ -
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ +Go to the documentation of this file.
1// SPDX-FileCopyrightInfo: Copyright (C) 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_SIMD_BASE_HH
│ │ │ │ +
4#define DUNE_COMMON_SIMD_BASE_HH
│ │ │ │
5
│ │ │ │ -
6#ifndef DUNE_PLOCALINDEX_HH
│ │ │ │ -
7#define DUNE_PLOCALINDEX_HH
│ │ │ │ -
8
│ │ │ │ -
9#include "localindex.hh"
│ │ │ │ -
10#include "indexset.hh"
│ │ │ │ -
11#include "mpitraits.hh"
│ │ │ │ -
12
│ │ │ │ -
13#include <iostream>
│ │ │ │ -
14
│ │ │ │ -
15namespace Dune
│ │ │ │ -
16{
│ │ │ │ -
17
│ │ │ │ -
18
│ │ │ │ -
29 template<class T> class ParallelLocalIndex;
│ │ │ │ -
30
│ │ │ │ -
36 template<class T>
│ │ │ │ -
37 std::ostream& operator<<(std::ostream& os, const ParallelLocalIndex<T>& index)
│ │ │ │ -
38 {
│ │ │ │ -
39 os<<"{local="<<index.localIndex_<<", attr="<<T(index.attribute_)<<", public="
│ │ │ │ -
40 <<(index.public_ ? true : false)<<"}";
│ │ │ │ -
41 return os;
│ │ │ │ -
42 }
│ │ │ │ -
43
│ │ │ │ -
47 template<typename T>
│ │ │ │ - │ │ │ │ -
49 {
│ │ │ │ -
50#if HAVE_MPI
│ │ │ │ -
51 // friend declaration needed for MPITraits
│ │ │ │ -
52 friend struct MPITraits<ParallelLocalIndex<T> >;
│ │ │ │ -
53#endif
│ │ │ │ -
54 friend std::ostream& operator<<<>(std::ostream& os, const ParallelLocalIndex<T>& index);
│ │ │ │ -
55
│ │ │ │ -
56 public:
│ │ │ │ -
64 typedef T Attribute;
│ │ │ │ - │ │ │ │ -
74
│ │ │ │ -
83 ParallelLocalIndex(size_t localIndex, const Attribute& attribute, bool isPublic=true);
│ │ │ │ - │ │ │ │ -
90
│ │ │ │ -
91#if 0
│ │ │ │ - │ │ │ │ -
102#endif
│ │ │ │ -
103
│ │ │ │ -
108 inline const Attribute attribute() const;
│ │ │ │ -
109
│ │ │ │ -
114 inline void setAttribute(const Attribute& attribute);
│ │ │ │ -
115
│ │ │ │ -
120 inline size_t local() const;
│ │ │ │ -
121
│ │ │ │ -
125 inline operator size_t() const;
│ │ │ │ -
126
│ │ │ │ -
132 inline ParallelLocalIndex<Attribute>& operator=(size_t index);
│ │ │ │ -
133
│ │ │ │ -
138 inline bool isPublic() const;
│ │ │ │ -
139
│ │ │ │ -
144 inline LocalIndexState state() const;
│ │ │ │ -
145
│ │ │ │ -
150 inline void setState(const LocalIndexState& state);
│ │ │ │ -
151
│ │ │ │ -
152 private:
│ │ │ │ -
154 size_t localIndex_;
│ │ │ │ -
155
│ │ │ │ -
157 char attribute_;
│ │ │ │ -
158
│ │ │ │ -
160 char public_;
│ │ │ │ -
161
│ │ │ │ -
168 char state_;
│ │ │ │ -
169
│ │ │ │ -
170 };
│ │ │ │ -
171
│ │ │ │ -
172 template<typename T>
│ │ │ │ - │ │ │ │ -
174 const ParallelLocalIndex<T>& p2)
│ │ │ │ -
175 {
│ │ │ │ -
176 if(p1.local()!=p2.local())
│ │ │ │ -
177 return false;
│ │ │ │ -
178 if(p1.attribute()!=p2.attribute())
│ │ │ │ -
179 return false;
│ │ │ │ -
180 if(p1.isPublic()!=p2.isPublic())
│ │ │ │ -
181 return false;
│ │ │ │ -
182 return true;
│ │ │ │ -
183 }
│ │ │ │ -
184 template<typename T>
│ │ │ │ - │ │ │ │ -
186 const ParallelLocalIndex<T>& p2)
│ │ │ │ -
187 {
│ │ │ │ -
188 return !(p1==p2);
│ │ │ │ -
189 }
│ │ │ │ -
190
│ │ │ │ +
92namespace Dune {
│ │ │ │ +
93 namespace Simd {
│ │ │ │ +
94
│ │ │ │ +
97
│ │ │ │ +
112 namespace Overloads {
│ │ │ │ +
113
│ │ │ │ +
116
│ │ │ │ +
118
│ │ │ │ +
181 template<unsigned i, bool = true>
│ │ │ │ +
182 struct ADLTag;
│ │ │ │ +
183
│ │ │ │ +
184 template<unsigned i>
│ │ │ │ +
185 struct ADLTag<i> : ADLTag<i-1> {};
│ │ │ │ +
186
│ │ │ │ +
187 template<>
│ │ │ │ +
188 struct ADLTag<0> {};
│ │ │ │ +
189
│ │ │ │
191
│ │ │ │ -
192 template<typename T>
│ │ │ │ - │ │ │ │ -
194 {
│ │ │ │ -
195 static bool compare(const ParallelLocalIndex<T>& t1,
│ │ │ │ -
196 const ParallelLocalIndex<T>& t2){
│ │ │ │ -
197 return t1.attribute()<t2.attribute();
│ │ │ │ -
198 }
│ │ │ │ -
199 };
│ │ │ │ -
200
│ │ │ │ -
201
│ │ │ │ -
202#if HAVE_MPI
│ │ │ │ -
203
│ │ │ │ -
205 template<typename T>
│ │ │ │ - │ │ │ │ -
207 {
│ │ │ │ -
208 public:
│ │ │ │ -
209 static MPI_Datatype getType();
│ │ │ │ -
210 private:
│ │ │ │ -
211 static MPI_Datatype type;
│ │ │ │ -
212
│ │ │ │ -
213 };
│ │ │ │ -
214
│ │ │ │ -
215#endif
│ │ │ │ -
216
│ │ │ │ -
217 template<class T>
│ │ │ │ -
218 ParallelLocalIndex<T>::ParallelLocalIndex(const T& attribute, bool isPublic)
│ │ │ │ -
219 : localIndex_(0), attribute_(static_cast<char>(attribute)),
│ │ │ │ -
220 public_(static_cast<char>(isPublic)), state_(static_cast<char>(VALID))
│ │ │ │ -
221 {}
│ │ │ │ -
222
│ │ │ │ -
223
│ │ │ │ -
224 template<class T>
│ │ │ │ -
225 ParallelLocalIndex<T>::ParallelLocalIndex(size_t local, const T& attribute, bool isPublic)
│ │ │ │ -
226 : localIndex_(local), attribute_(static_cast<char>(attribute)),
│ │ │ │ -
227 public_(static_cast<char>(isPublic)), state_(static_cast<char>(VALID))
│ │ │ │ -
228 {}
│ │ │ │ -
229
│ │ │ │ -
230 template<class T>
│ │ │ │ - │ │ │ │ -
232 : localIndex_(0), attribute_(), public_(static_cast<char>(false)),
│ │ │ │ -
233 state_(static_cast<char>(VALID))
│ │ │ │ -
234 {}
│ │ │ │ -
235
│ │ │ │ -
236 template<class T>
│ │ │ │ -
237 inline const T ParallelLocalIndex<T>::attribute() const
│ │ │ │ -
238 {
│ │ │ │ -
239 return T(attribute_);
│ │ │ │ -
240 }
│ │ │ │ -
241
│ │ │ │ -
242 template<class T>
│ │ │ │ -
243 inline void
│ │ │ │ - │ │ │ │ -
245 {
│ │ │ │ -
246 attribute_ = attribute;
│ │ │ │ -
247 }
│ │ │ │ -
248
│ │ │ │ -
249 template<class T>
│ │ │ │ -
250 inline size_t ParallelLocalIndex<T>::local() const
│ │ │ │ -
251 {
│ │ │ │ -
252 return localIndex_;
│ │ │ │ -
253 }
│ │ │ │ -
254
│ │ │ │ -
255 template<class T>
│ │ │ │ - │ │ │ │ -
257 {
│ │ │ │ -
258 return localIndex_;
│ │ │ │ -
259 }
│ │ │ │ -
260
│ │ │ │ -
261 template<class T>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
264 {
│ │ │ │ -
265 localIndex_=index;
│ │ │ │ -
266 return *this;
│ │ │ │ -
267 }
│ │ │ │ -
268
│ │ │ │ -
269 template<class T>
│ │ │ │ - │ │ │ │ -
271 {
│ │ │ │ -
272 return static_cast<bool>(public_);
│ │ │ │ -
273 }
│ │ │ │ -
274
│ │ │ │ -
275 template<class T>
│ │ │ │ - │ │ │ │ -
277 {
│ │ │ │ -
278 return LocalIndexState(state_);
│ │ │ │ -
279 }
│ │ │ │ -
280
│ │ │ │ -
281 template<class T>
│ │ │ │ - │ │ │ │ -
283 {
│ │ │ │ -
284 state_=static_cast<char>(state);
│ │ │ │ -
285 }
│ │ │ │ -
286
│ │ │ │ -
287#if HAVE_MPI
│ │ │ │ -
288
│ │ │ │ -
289 template<typename T>
│ │ │ │ -
290 MPI_Datatype MPITraits<ParallelLocalIndex<T> >::getType()
│ │ │ │ -
291 {
│ │ │ │ -
292
│ │ │ │ -
293 if(type==MPI_DATATYPE_NULL) {
│ │ │ │ -
294 int length = 1;
│ │ │ │ -
295 MPI_Aint base, disp;
│ │ │ │ -
296 MPI_Datatype types[1] = {MPITraits<char>::getType()};
│ │ │ │ - │ │ │ │ -
298 MPI_Get_address(&rep, &base);
│ │ │ │ -
299 MPI_Get_address(&(rep.attribute_), &disp);
│ │ │ │ -
300 disp -= base;
│ │ │ │ -
301
│ │ │ │ -
302 MPI_Datatype tmp;
│ │ │ │ -
303 MPI_Type_create_struct(1, &length, &disp, types, &tmp);
│ │ │ │ -
304
│ │ │ │ -
305 MPI_Type_create_resized(tmp, 0, sizeof(ParallelLocalIndex<T>), &type);
│ │ │ │ -
306 MPI_Type_commit(&type);
│ │ │ │ -
307
│ │ │ │ -
308 MPI_Type_free(&tmp);
│ │ │ │ -
309 }
│ │ │ │ -
310 return type;
│ │ │ │ -
311 }
│ │ │ │ -
312
│ │ │ │ -
313 template<typename T>
│ │ │ │ -
314 MPI_Datatype MPITraits<ParallelLocalIndex<T> >::type = MPI_DATATYPE_NULL;
│ │ │ │ -
315
│ │ │ │ -
316#endif
│ │ │ │ -
317
│ │ │ │ -
318
│ │ │ │ -
320} // namespace Dune
│ │ │ │ -
321
│ │ │ │ -
322#endif
│ │ │ │ -
Traits classes for mapping types onto MPI_Datatype.
│ │ │ │ -
Provides a map between global and local indices.
│ │ │ │ -
Provides classes for use as the local index in ParallelIndexSet.
│ │ │ │ -
std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
Definition: bigunsignedint.hh:278
│ │ │ │ -
EnableIfInterOperable< T1, T2, bool >::type operator==(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for equality.
Definition: iteratorfacades.hh:237
│ │ │ │ -
EnableIfInterOperable< T1, T2, bool >::type operator!=(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for inequality.
Definition: iteratorfacades.hh:259
│ │ │ │ -
bool isPublic() const
Check whether the index might also be known other processes.
Definition: plocalindex.hh:270
│ │ │ │ -
void setAttribute(const Attribute &attribute)
Set the attribute of the index.
Definition: plocalindex.hh:244
│ │ │ │ -
size_t local() const
get the local index.
Definition: plocalindex.hh:250
│ │ │ │ -
LocalIndexState
The states available for the local indices.
Definition: localindex.hh:28
│ │ │ │ -
void setState(const LocalIndexState &state)
Set the state.
Definition: plocalindex.hh:282
│ │ │ │ -
ParallelLocalIndex< Attribute > & operator=(size_t index)
Assign a new local index.
Definition: plocalindex.hh:263
│ │ │ │ -
LocalIndexState state() const
Get the state.
Definition: plocalindex.hh:276
│ │ │ │ -
ParallelLocalIndex()
Parameterless constructor.
Definition: plocalindex.hh:231
│ │ │ │ -
const Attribute attribute() const
Get the attribute of the index.
Definition: plocalindex.hh:237
│ │ │ │ -
@ VALID
Definition: localindex.hh:28
│ │ │ │ +
195 template<class V, class SFINAETag = void>
│ │ │ │ +
196 struct ScalarType;
│ │ │ │ +
197
│ │ │ │ +
199
│ │ │ │ +
203 template<class S, class V, class SFINAETag = void>
│ │ │ │ +
204 struct RebindType;
│ │ │ │ +
205
│ │ │ │ +
207
│ │ │ │ +
211 template<class V, class SFINAETag = void>
│ │ │ │ +
212 struct LaneCount;
│ │ │ │ +
213
│ │ │ │ +
215
│ │ │ │ +
216 } // namespace Overloads
│ │ │ │ +
217 } // namespace Simd
│ │ │ │ +
218} // namespace Dune
│ │ │ │ +
219
│ │ │ │ +
220#endif // DUNE_COMMON_SIMD_BASE_HH
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
A traits class describing the mapping of types onto MPI_Datatypes.
Definition: mpitraits.hh:41
│ │ │ │ -
static MPI_Datatype getType()
Definition: mpitraits.hh:48
│ │ │ │ -
Definition: indexset.hh:615
│ │ │ │ -
An index present on the local process with an additional attribute flag.
Definition: plocalindex.hh:49
│ │ │ │ -
T Attribute
The type of the attributes. Normally this will be an enumeration like.
Definition: plocalindex.hh:64
│ │ │ │ -
static bool compare(const ParallelLocalIndex< T > &t1, const ParallelLocalIndex< T > &t2)
Definition: plocalindex.hh:195
│ │ │ │ +
Tag used to force late-binding lookup in Dune::Simd::Overloads.
Definition: base.hh:182
│ │ │ │ +
should have a member type type
Definition: standard.hh:60
│ │ │ │ +
should have a member type type
Definition: standard.hh:67
│ │ │ │ +
should be derived from a Dune::index_constant
Definition: standard.hh:74
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,327 +4,69 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ - * parallel │ │ │ │ │ -plocalindex.hh │ │ │ │ │ + * simd │ │ │ │ │ +base.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 (C) DUNE Project contributors, see file │ │ │ │ │ + 1// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ - 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ + 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ + 3#ifndef DUNE_COMMON_SIMD_BASE_HH │ │ │ │ │ + 4#define DUNE_COMMON_SIMD_BASE_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#ifndef DUNE_PLOCALINDEX_HH │ │ │ │ │ - 7#define DUNE_PLOCALINDEX_HH │ │ │ │ │ - 8 │ │ │ │ │ - 9#include "localindex.hh" │ │ │ │ │ - 10#include "indexset.hh" │ │ │ │ │ - 11#include "mpitraits.hh" │ │ │ │ │ - 12 │ │ │ │ │ - 13#include │ │ │ │ │ - 14 │ │ │ │ │ - 15namespace Dune │ │ │ │ │ - 16{ │ │ │ │ │ - 17 │ │ │ │ │ - 18 │ │ │ │ │ - 29 template class ParallelLocalIndex; │ │ │ │ │ - 30 │ │ │ │ │ - 36 template │ │ │ │ │ -37 std::ostream& operator<<(std::ostream& os, const ParallelLocalIndex& │ │ │ │ │ -index) │ │ │ │ │ - 38 { │ │ │ │ │ - 39 os<<"{local="< │ │ │ │ │ -48 class ParallelLocalIndex │ │ │ │ │ - 49 { │ │ │ │ │ - 50#if HAVE_MPI │ │ │ │ │ - 51 // friend declaration needed for MPITraits │ │ │ │ │ - 52 friend struct MPITraits >; │ │ │ │ │ - 53#endif │ │ │ │ │ - 54 friend std::ostream& operator<<<>(std::ostream& os, const │ │ │ │ │ -ParallelLocalIndex& index); │ │ │ │ │ - 55 │ │ │ │ │ - 56 public: │ │ │ │ │ -64 typedef T Attribute; │ │ │ │ │ - 73 ParallelLocalIndex(const Attribute& attribute, bool isPublic); │ │ │ │ │ - 74 │ │ │ │ │ - 83 ParallelLocalIndex(size_t localIndex, const Attribute& attribute, bool │ │ │ │ │ -isPublic=true); │ │ │ │ │ - 89 ParallelLocalIndex(); │ │ │ │ │ - 90 │ │ │ │ │ - 91#if 0 │ │ │ │ │ - 101 ParallelLocalIndex(const Attribute& attribute, size_t local, bool │ │ │ │ │ -isPublic); │ │ │ │ │ - 102#endif │ │ │ │ │ - 103 │ │ │ │ │ - 108 inline const Attribute attribute() const; │ │ │ │ │ - 109 │ │ │ │ │ - 114 inline void setAttribute(const Attribute& attribute); │ │ │ │ │ - 115 │ │ │ │ │ - 120 inline size_t local() const; │ │ │ │ │ - 121 │ │ │ │ │ - 125 inline operator size_t() const; │ │ │ │ │ - 126 │ │ │ │ │ - 132 inline ParallelLocalIndex& operator=(size_t index); │ │ │ │ │ - 133 │ │ │ │ │ - 138 inline bool isPublic() const; │ │ │ │ │ - 139 │ │ │ │ │ - 144 inline LocalIndexState state() const; │ │ │ │ │ - 145 │ │ │ │ │ - 150 inline void setState(const LocalIndexState& state); │ │ │ │ │ - 151 │ │ │ │ │ - 152 private: │ │ │ │ │ - 154 size_t localIndex_; │ │ │ │ │ - 155 │ │ │ │ │ - 157 char attribute_; │ │ │ │ │ - 158 │ │ │ │ │ - 160 char public_; │ │ │ │ │ - 161 │ │ │ │ │ - 168 char state_; │ │ │ │ │ - 169 │ │ │ │ │ - 170 }; │ │ │ │ │ - 171 │ │ │ │ │ - 172 template │ │ │ │ │ -173 bool operator==(const ParallelLocalIndex& p1, │ │ │ │ │ - 174 const ParallelLocalIndex& p2) │ │ │ │ │ - 175 { │ │ │ │ │ - 176 if(p1.local()!=p2.local()) │ │ │ │ │ - 177 return false; │ │ │ │ │ - 178 if(p1.attribute()!=p2.attribute()) │ │ │ │ │ - 179 return false; │ │ │ │ │ - 180 if(p1.isPublic()!=p2.isPublic()) │ │ │ │ │ - 181 return false; │ │ │ │ │ - 182 return true; │ │ │ │ │ - 183 } │ │ │ │ │ - 184 template │ │ │ │ │ -185 bool operator!=(const ParallelLocalIndex& p1, │ │ │ │ │ - 186 const ParallelLocalIndex& p2) │ │ │ │ │ - 187 { │ │ │ │ │ - 188 return !(p1==p2); │ │ │ │ │ - 189 } │ │ │ │ │ - 190 │ │ │ │ │ + 92namespace Dune { │ │ │ │ │ + 93 namespace Simd { │ │ │ │ │ + 94 │ │ │ │ │ + 97 │ │ │ │ │ + 112 namespace Overloads { │ │ │ │ │ + 113 │ │ │ │ │ + 116 │ │ │ │ │ + 118 │ │ │ │ │ + 181 template │ │ │ │ │ +182 struct ADLTag; │ │ │ │ │ + 183 │ │ │ │ │ + 184 template │ │ │ │ │ +185 struct ADLTag : ADLTag {}; │ │ │ │ │ + 186 │ │ │ │ │ + 187 template<> │ │ │ │ │ +188 struct ADLTag<0> {}; │ │ │ │ │ + 189 │ │ │ │ │ 191 │ │ │ │ │ - 192 template │ │ │ │ │ -193 struct LocalIndexComparator > │ │ │ │ │ - 194 { │ │ │ │ │ -195 static bool compare(const ParallelLocalIndex& t1, │ │ │ │ │ - 196 const ParallelLocalIndex& t2){ │ │ │ │ │ - 197 return t1.attribute() │ │ │ │ │ -206 class MPITraits > │ │ │ │ │ - 207 { │ │ │ │ │ - 208 public: │ │ │ │ │ - 209 static MPI_Datatype getType(); │ │ │ │ │ - 210 private: │ │ │ │ │ - 211 static MPI_Datatype type; │ │ │ │ │ - 212 │ │ │ │ │ - 213 }; │ │ │ │ │ - 214 │ │ │ │ │ - 215#endif │ │ │ │ │ - 216 │ │ │ │ │ - 217 template │ │ │ │ │ -218 ParallelLocalIndex::ParallelLocalIndex(const T& attribute, bool │ │ │ │ │ -isPublic) │ │ │ │ │ - 219 : localIndex_(0), attribute_(static_cast(attribute)), │ │ │ │ │ - 220 public_(static_cast(isPublic)), state_(static_cast(VALID)) │ │ │ │ │ - 221 {} │ │ │ │ │ - 222 │ │ │ │ │ - 223 │ │ │ │ │ - 224 template │ │ │ │ │ -225 ParallelLocalIndex::ParallelLocalIndex(size_t local, const T& attribute, │ │ │ │ │ -bool isPublic) │ │ │ │ │ - 226 : localIndex_(local), attribute_(static_cast(attribute)), │ │ │ │ │ - 227 public_(static_cast(isPublic)), state_(static_cast(VALID)) │ │ │ │ │ - 228 {} │ │ │ │ │ - 229 │ │ │ │ │ - 230 template │ │ │ │ │ -231 ParallelLocalIndex::ParallelLocalIndex() │ │ │ │ │ - 232 : localIndex_(0), attribute_(), public_(static_cast(false)), │ │ │ │ │ - 233 state_(static_cast(VALID)) │ │ │ │ │ - 234 {} │ │ │ │ │ - 235 │ │ │ │ │ - 236 template │ │ │ │ │ -237 inline const T ParallelLocalIndex::attribute() const │ │ │ │ │ - 238 { │ │ │ │ │ - 239 return T(attribute_); │ │ │ │ │ - 240 } │ │ │ │ │ - 241 │ │ │ │ │ - 242 template │ │ │ │ │ - 243 inline void │ │ │ │ │ -244 ParallelLocalIndex::setAttribute(const Attribute& attribute) │ │ │ │ │ - 245 { │ │ │ │ │ - 246 attribute_ = attribute; │ │ │ │ │ - 247 } │ │ │ │ │ - 248 │ │ │ │ │ - 249 template │ │ │ │ │ -250 inline size_t ParallelLocalIndex::local() const │ │ │ │ │ - 251 { │ │ │ │ │ - 252 return localIndex_; │ │ │ │ │ - 253 } │ │ │ │ │ - 254 │ │ │ │ │ - 255 template │ │ │ │ │ -256 inline ParallelLocalIndex::operator size_t() const │ │ │ │ │ - 257 { │ │ │ │ │ - 258 return localIndex_; │ │ │ │ │ - 259 } │ │ │ │ │ - 260 │ │ │ │ │ - 261 template │ │ │ │ │ - 262 inline ParallelLocalIndex& │ │ │ │ │ -263 ParallelLocalIndex::operator=(size_t index) │ │ │ │ │ - 264 { │ │ │ │ │ - 265 localIndex_=index; │ │ │ │ │ - 266 return *this; │ │ │ │ │ - 267 } │ │ │ │ │ - 268 │ │ │ │ │ - 269 template │ │ │ │ │ -270 inline bool ParallelLocalIndex::isPublic() const │ │ │ │ │ - 271 { │ │ │ │ │ - 272 return static_cast(public_); │ │ │ │ │ - 273 } │ │ │ │ │ - 274 │ │ │ │ │ - 275 template │ │ │ │ │ -276 inline LocalIndexState ParallelLocalIndex::state() const │ │ │ │ │ - 277 { │ │ │ │ │ - 278 return LocalIndexState(state_); │ │ │ │ │ - 279 } │ │ │ │ │ - 280 │ │ │ │ │ - 281 template │ │ │ │ │ -282 inline void ParallelLocalIndex::setState(const LocalIndexState& state) │ │ │ │ │ - 283 { │ │ │ │ │ - 284 state_=static_cast(state); │ │ │ │ │ - 285 } │ │ │ │ │ - 286 │ │ │ │ │ - 287#if HAVE_MPI │ │ │ │ │ - 288 │ │ │ │ │ - 289 template │ │ │ │ │ -290 MPI_Datatype MPITraits >::getType() │ │ │ │ │ - 291 { │ │ │ │ │ - 292 │ │ │ │ │ - 293 if(type==MPI_DATATYPE_NULL) { │ │ │ │ │ - 294 int length = 1; │ │ │ │ │ - 295 MPI_Aint base, disp; │ │ │ │ │ - 296 MPI_Datatype types[1] = {MPITraits::getType()}; │ │ │ │ │ - 297 ParallelLocalIndex rep; │ │ │ │ │ - 298 MPI_Get_address(&rep, &base); │ │ │ │ │ - 299 MPI_Get_address(&(rep.attribute_), &disp); │ │ │ │ │ - 300 disp -= base; │ │ │ │ │ - 301 │ │ │ │ │ - 302 MPI_Datatype tmp; │ │ │ │ │ - 303 MPI_Type_create_struct(1, &length, &disp, types, &tmp); │ │ │ │ │ - 304 │ │ │ │ │ - 305 MPI_Type_create_resized(tmp, 0, sizeof(ParallelLocalIndex), &type); │ │ │ │ │ - 306 MPI_Type_commit(&type); │ │ │ │ │ - 307 │ │ │ │ │ - 308 MPI_Type_free(&tmp); │ │ │ │ │ - 309 } │ │ │ │ │ - 310 return type; │ │ │ │ │ - 311 } │ │ │ │ │ - 312 │ │ │ │ │ - 313 template │ │ │ │ │ -314 MPI_Datatype MPITraits >::type = MPI_DATATYPE_NULL; │ │ │ │ │ - 315 │ │ │ │ │ - 316#endif │ │ │ │ │ - 317 │ │ │ │ │ - 318 │ │ │ │ │ - 320} // namespace Dune │ │ │ │ │ - 321 │ │ │ │ │ - 322#endif │ │ │ │ │ -mpitraits.hh │ │ │ │ │ -Traits classes for mapping types onto MPI_Datatype. │ │ │ │ │ -indexset.hh │ │ │ │ │ -Provides a map between global and local indices. │ │ │ │ │ -localindex.hh │ │ │ │ │ -Provides classes for use as the local index in ParallelIndexSet. │ │ │ │ │ -Dune::operator<< │ │ │ │ │ -std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x) │ │ │ │ │ -Definition: bigunsignedint.hh:278 │ │ │ │ │ -Dune::operator== │ │ │ │ │ -EnableIfInterOperable< T1, T2, bool >::type operator==(const │ │ │ │ │ -ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, │ │ │ │ │ -V2, R2, D > &rhs) │ │ │ │ │ -Checks for equality. │ │ │ │ │ -Definition: iteratorfacades.hh:237 │ │ │ │ │ -Dune::operator!= │ │ │ │ │ -EnableIfInterOperable< T1, T2, bool >::type operator!=(const │ │ │ │ │ -ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, │ │ │ │ │ -V2, R2, D > &rhs) │ │ │ │ │ -Checks for inequality. │ │ │ │ │ -Definition: iteratorfacades.hh:259 │ │ │ │ │ -Dune::ParallelLocalIndex::isPublic │ │ │ │ │ -bool isPublic() const │ │ │ │ │ -Check whether the index might also be known other processes. │ │ │ │ │ -Definition: plocalindex.hh:270 │ │ │ │ │ -Dune::ParallelLocalIndex::setAttribute │ │ │ │ │ -void setAttribute(const Attribute &attribute) │ │ │ │ │ -Set the attribute of the index. │ │ │ │ │ -Definition: plocalindex.hh:244 │ │ │ │ │ -Dune::ParallelLocalIndex::local │ │ │ │ │ -size_t local() const │ │ │ │ │ -get the local index. │ │ │ │ │ -Definition: plocalindex.hh:250 │ │ │ │ │ -Dune::LocalIndexState │ │ │ │ │ -LocalIndexState │ │ │ │ │ -The states available for the local indices. │ │ │ │ │ -Definition: localindex.hh:28 │ │ │ │ │ -Dune::ParallelLocalIndex::setState │ │ │ │ │ -void setState(const LocalIndexState &state) │ │ │ │ │ -Set the state. │ │ │ │ │ -Definition: plocalindex.hh:282 │ │ │ │ │ -Dune::ParallelLocalIndex::operator= │ │ │ │ │ -ParallelLocalIndex< Attribute > & operator=(size_t index) │ │ │ │ │ -Assign a new local index. │ │ │ │ │ -Definition: plocalindex.hh:263 │ │ │ │ │ -Dune::ParallelLocalIndex::state │ │ │ │ │ -LocalIndexState state() const │ │ │ │ │ -Get the state. │ │ │ │ │ -Definition: plocalindex.hh:276 │ │ │ │ │ -Dune::ParallelLocalIndex::ParallelLocalIndex │ │ │ │ │ -ParallelLocalIndex() │ │ │ │ │ -Parameterless constructor. │ │ │ │ │ -Definition: plocalindex.hh:231 │ │ │ │ │ -Dune::ParallelLocalIndex::attribute │ │ │ │ │ -const Attribute attribute() const │ │ │ │ │ -Get the attribute of the index. │ │ │ │ │ -Definition: plocalindex.hh:237 │ │ │ │ │ -Dune::VALID │ │ │ │ │ -@ VALID │ │ │ │ │ -Definition: localindex.hh:28 │ │ │ │ │ + 195 template │ │ │ │ │ + 196 struct ScalarType; │ │ │ │ │ + 197 │ │ │ │ │ + 199 │ │ │ │ │ + 203 template │ │ │ │ │ + 204 struct RebindType; │ │ │ │ │ + 205 │ │ │ │ │ + 207 │ │ │ │ │ + 211 template │ │ │ │ │ + 212 struct LaneCount; │ │ │ │ │ + 213 │ │ │ │ │ + 215 │ │ │ │ │ + 216 } // namespace Overloads │ │ │ │ │ + 217 } // namespace Simd │ │ │ │ │ + 218} // namespace Dune │ │ │ │ │ + 219 │ │ │ │ │ + 220#endif // DUNE_COMMON_SIMD_BASE_HH │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::MPITraits │ │ │ │ │ -A traits class describing the mapping of types onto MPI_Datatypes. │ │ │ │ │ -Definition: mpitraits.hh:41 │ │ │ │ │ -Dune::MPITraits::getType │ │ │ │ │ -static MPI_Datatype getType() │ │ │ │ │ -Definition: mpitraits.hh:48 │ │ │ │ │ -Dune::LocalIndexComparator │ │ │ │ │ -Definition: indexset.hh:615 │ │ │ │ │ -Dune::ParallelLocalIndex │ │ │ │ │ -An index present on the local process with an additional attribute flag. │ │ │ │ │ -Definition: plocalindex.hh:49 │ │ │ │ │ -Dune::ParallelLocalIndex::Attribute │ │ │ │ │ -T Attribute │ │ │ │ │ -The type of the attributes. Normally this will be an enumeration like. │ │ │ │ │ -Definition: plocalindex.hh:64 │ │ │ │ │ -Dune::LocalIndexComparator<_ParallelLocalIndex<_T_>_>::compare │ │ │ │ │ -static bool compare(const ParallelLocalIndex< T > &t1, const │ │ │ │ │ -ParallelLocalIndex< T > &t2) │ │ │ │ │ -Definition: plocalindex.hh:195 │ │ │ │ │ +Dune::Simd::Overloads::ADLTag │ │ │ │ │ +Tag used to force late-binding lookup in Dune::Simd::Overloads. │ │ │ │ │ +Definition: base.hh:182 │ │ │ │ │ +Dune::Simd::Overloads::ScalarType │ │ │ │ │ +should have a member type type │ │ │ │ │ +Definition: standard.hh:60 │ │ │ │ │ +Dune::Simd::Overloads::RebindType │ │ │ │ │ +should have a member type type │ │ │ │ │ +Definition: standard.hh:67 │ │ │ │ │ +Dune::Simd::Overloads::LaneCount │ │ │ │ │ +should be derived from a Dune::index_constant │ │ │ │ │ +Definition: standard.hh:74 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00074.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: stdthread.cc File Reference │ │ │ │ +dune-common: test.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,41 +58,25 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
│ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
stdthread.cc File Reference
│ │ │ │ +
test.cc File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <cstdlib>
│ │ │ │ -#include <iostream>
│ │ │ │ -#include <mutex>
│ │ │ │ +
#include <config.h>
│ │ │ │ #include <ostream>
│ │ │ │ -#include <dune/common/stdthread.hh>
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Namespaces

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

│ │ │ │ -Functions

void Dune::doAssertCallOnce (const char *file, int line, const char *function)
 
│ │ │ │ -
│ │ │ │ +#include <string>
│ │ │ │ +#include <dune/common/simd/test.hh>
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,24 +4,16 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Namespaces | Functions │ │ │ │ │ -stdthread.cc File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ + * simd │ │ │ │ │ +test.cc File Reference │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ - Namespaces │ │ │ │ │ -namespace  Dune │ │ │ │ │ -  Dune namespace. │ │ │ │ │ -  │ │ │ │ │ - Functions │ │ │ │ │ -void Dune::doAssertCallOnce (const char *file, int line, const char *function) │ │ │ │ │ -  │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00077.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: promotiontraits.hh File Reference │ │ │ │ +dune-common: test.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,48 +58,496 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
promotiontraits.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Macros | │ │ │ │ +Typedefs
│ │ │ │ +
test.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

Compute type of the result of an arithmetic operation involving two different number types. │ │ │ │ +

Common tests for simd abstraction implementations. │ │ │ │ More...

│ │ │ │ -
#include <utility>
│ │ │ │ +
#include <algorithm>
│ │ │ │ +#include <cstddef>
│ │ │ │ +#include <iostream>
│ │ │ │ +#include <sstream>
│ │ │ │ +#include <string>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <typeindex>
│ │ │ │ +#include <typeinfo>
│ │ │ │ +#include <unordered_set>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <dune/common/classname.hh>
│ │ │ │ +#include <dune/common/hybridutilities.hh>
│ │ │ │ +#include <dune/common/rangeutilities.hh>
│ │ │ │ +#include <dune/common/simd/io.hh>
│ │ │ │ +#include <dune/common/simd/loop.hh>
│ │ │ │ +#include <dune/common/simd/simd.hh>
│ │ │ │ +#include <dune/common/std/type_traits.hh>
│ │ │ │ +#include <dune/common/typelist.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::PromotionTraits< T1, T2 >
 Compute type of the result of an arithmetic operation involving two different number types. More...
struct  Dune::Simd::EndMark
 final element marker for RebindList More...
 
struct  Dune::PromotionTraits< T1, T1 >
class  Dune::Simd::UnitTest
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::Simd
 Namespace for vectorization interface functions used by library developers.
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Macros

#define DUNE_SIMD_CHECK(expr)    ((expr) ? void() : complain(__FILE__, __LINE__, __func__, #expr))
 
#define DUNE_SIMD_CHECK_OP(expr)
 
#define DUNE_SIMD_POSTFIX_OP(NAME, SYMBOL)
 
#define DUNE_SIMD_PREFIX_OP(NAME, SYMBOL)
 
#define DUNE_SIMD_OPNAME   (className<Op(V)>())
 
#define DUNE_SIMD_INFIX_OP(NAME, SYMBOL)
 
#define DUNE_SIMD_ASSIGN_OP(NAME, SYMBOL)
 
#define DUNE_SIMD_REPL_OP(NAME, REPLFN, SYMBOL)
 
#define DUNE_SIMD_OPNAME   (className<OpInfixComma(T1, T2)>())
 
#define DUNE_SIMD_OPNAME   (className<Op(V1, V2)>())
 
#define DUNE_SIMD_OPNAME   (className<Op(V1, T2)>())
 
#define DUNE_SIMD_OPNAME   (className<Op(V1, T2)>())
 
#define DUNE_SIMD_OPNAME   (className<Op(V1, P2)>())
 
#define DUNE_SIMD_DO(M1, M2, M3, V1, V2, V3, NAME)
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Typedefs

template<class... Types>
using Dune::Simd::RebindList = typename Impl::RemoveEnd< EndMark, TypeList< Types... > >::type
 A list of types with the final element removed. More...
 
template<class T >
using Dune::Simd::IsLoop = typename Impl::IsLoop< T >::type
 check whether a type is an instance of LoopSIMD More...
 
│ │ │ │

Detailed Description

│ │ │ │ -

Compute type of the result of an arithmetic operation involving two different number types.

│ │ │ │ -
Author
Matthias Wohlmuth
│ │ │ │ -
│ │ │ │ +

Common tests for simd abstraction implementations.

│ │ │ │ +

This file is an interface header and may be included without restrictions.

│ │ │ │ +

Macro Definition Documentation

│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_ASSIGN_OP

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_ASSIGN_OP( NAME,
 SYMBOL 
)
│ │ │ │ +
│ │ │ │ +Value:
struct OpInfix##NAME \
│ │ │ │ +
{ \
│ │ │ │ +
template<class V1, class V2> \
│ │ │ │ +
decltype(auto) operator()(V1&& v1, V2&& v2) const \
│ │ │ │ +
{ \
│ │ │ │ +
return std::forward<V1>(v1) SYMBOL std::forward<V2>(v2); \
│ │ │ │ +
} \
│ │ │ │ +
template<class S1, class S2> \
│ │ │ │ +
auto scalar(S1& s1, S2&& s2) const \
│ │ │ │ +
-> decltype(s1 SYMBOL std::forward<S2>(s2)); \
│ │ │ │ +
}
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_CHECK

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_CHECK( expr)    ((expr) ? void() : complain(__FILE__, __LINE__, __func__, #expr))
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_CHECK_OP

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_CHECK_OP( expr)
│ │ │ │ +
│ │ │ │ +Value:
((expr) ? void() : complain(__FILE__, __LINE__, __func__, \
│ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_OPNAME
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_DO

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_DO( M1,
 M2,
 M3,
 V1,
 V2,
 V3,
 NAME 
)
│ │ │ │ +
│ │ │ │ +Value:
checker(bool_constant<isMask ? do_##M1 : do_##V1>{}, \
│ │ │ │ +
bool_constant<isMask ? do_##M2 : do_##V2>{}, \
│ │ │ │ +
bool_constant<isMask ? do_##M3 : do_##V3>{}, \
│ │ │ │ +
Op##NAME{})
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_INFIX_OP

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_INFIX_OP( NAME,
 SYMBOL 
)
│ │ │ │ +
│ │ │ │ +Value:
struct OpInfix##NAME \
│ │ │ │ +
{ \
│ │ │ │ +
template<class V1, class V2> \
│ │ │ │ +
decltype(auto) operator()(V1&& v1, V2&& v2) const \
│ │ │ │ +
{ \
│ │ │ │ +
return std::forward<V1>(v1) SYMBOL std::forward<V2>(v2); \
│ │ │ │ +
} \
│ │ │ │ +
template<class S1, class S2> \
│ │ │ │ +
auto scalar(S1&& s1, S2&& s2) const \
│ │ │ │ +
-> decltype(std::forward<S1>(s1) SYMBOL std::forward<S2>(s2)); \
│ │ │ │ +
}
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_OPNAME [1/6]

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_OPNAME   (className<Op(V)>())
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_OPNAME [2/6]

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_OPNAME   (className<OpInfixComma(T1, T2)>())
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_OPNAME [3/6]

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_OPNAME   (className<Op(V1, V2)>())
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_OPNAME [4/6]

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_OPNAME   (className<Op(V1, T2)>())
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_OPNAME [5/6]

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_OPNAME   (className<Op(V1, T2)>())
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_OPNAME [6/6]

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_OPNAME   (className<Op(V1, P2)>())
│ │ │ │ +
│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_POSTFIX_OP

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_POSTFIX_OP( NAME,
 SYMBOL 
)
│ │ │ │ +
│ │ │ │ +Value:
struct OpPostfix##NAME \
│ │ │ │ +
{ \
│ │ │ │ +
template<class V> \
│ │ │ │ +
auto operator()(V&& v) const \
│ │ │ │ +
-> decltype(std::forward<V>(v) SYMBOL) \
│ │ │ │ +
{ \
│ │ │ │ +
return std::forward<V>(v) SYMBOL; \
│ │ │ │ +
} \
│ │ │ │ +
}
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_PREFIX_OP

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_PREFIX_OP( NAME,
 SYMBOL 
)
│ │ │ │ +
│ │ │ │ +Value:
struct OpPrefix##NAME \
│ │ │ │ +
{ \
│ │ │ │ +
template<class V> \
│ │ │ │ +
auto operator()(V&& v) const \
│ │ │ │ +
-> decltype(SYMBOL std::forward<V>(v)) \
│ │ │ │ +
{ \
│ │ │ │ +
return SYMBOL std::forward<V>(v); \
│ │ │ │ +
} \
│ │ │ │ +
}
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_SIMD_REPL_OP

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_SIMD_REPL_OP( NAME,
 REPLFN,
 SYMBOL 
)
│ │ │ │ +
│ │ │ │ +Value:
struct OpInfix##NAME \
│ │ │ │ +
{ \
│ │ │ │ +
template<class V1, class V2> \
│ │ │ │ +
decltype(auto) operator()(V1&& v1, V2&& v2) const \
│ │ │ │ +
{ \
│ │ │ │ +
return Simd::REPLFN(std::forward<V1>(v1), std::forward<V2>(v2)); \
│ │ │ │ +
} \
│ │ │ │ +
template<class S1, class S2> \
│ │ │ │ +
auto scalar(S1&& s1, S2&& s2) const \
│ │ │ │ +
-> decltype(std::forward<S1>(s1) SYMBOL std::forward<S2>(s2)); \
│ │ │ │ +
}
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,32 +4,205 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Classes | Namespaces │ │ │ │ │ -promotiontraits.hh File Reference │ │ │ │ │ -Compute type of the result of an arithmetic operation involving two different │ │ │ │ │ -number types. More... │ │ │ │ │ + * simd │ │ │ │ │ +Classes | Namespaces | Macros | Typedefs │ │ │ │ │ +test.hh File Reference │ │ │ │ │ +Common tests for simd abstraction implementations. More... │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -struct  Dune::PromotionTraits<_T1,_T2_> │ │ │ │ │ -  Compute type of the result of an arithmetic operation involving two │ │ │ │ │ - different number types. More... │ │ │ │ │ +struct  Dune::Simd::EndMark │ │ │ │ │ +  final element marker for RebindList More... │ │ │ │ │   │ │ │ │ │ -struct  Dune::PromotionTraits<_T1,_T1_> │ │ │ │ │ + class  Dune::Simd::UnitTest │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ +namespace  Dune::Simd │ │ │ │ │ +  Namespace for vectorization interface functions used by library │ │ │ │ │ + developers. │ │ │ │ │ +  │ │ │ │ │ + Macros │ │ │ │ │ +#define DUNE_SIMD_CHECK(expr)    ((expr) ? void() : complain(__FILE__, __LINE__, │ │ │ │ │ + __func__, #expr)) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_SIMD_CHECK_OP(expr) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_SIMD_POSTFIX_OP(NAME, SYMBOL) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_SIMD_PREFIX_OP(NAME, SYMBOL) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_SIMD_OPNAME   (className()) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_SIMD_INFIX_OP(NAME, SYMBOL) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_SIMD_ASSIGN_OP(NAME, SYMBOL) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_SIMD_REPL_OP(NAME, REPLFN, SYMBOL) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_SIMD_OPNAME   (className()) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_SIMD_OPNAME   (className()) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_SIMD_OPNAME   (className()) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_SIMD_OPNAME   (className()) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_SIMD_OPNAME   (className()) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_SIMD_DO(M1, M2, M3, V1, V2, V3, NAME) │ │ │ │ │ +  │ │ │ │ │ + Typedefs │ │ │ │ │ +template │ │ │ │ │ +using Dune::Simd::RebindList = typename Impl::RemoveEnd< EndMark, TypeList< │ │ │ │ │ + Types... > >::type │ │ │ │ │ +  A list of types with the final element removed. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +using Dune::Simd::IsLoop = typename Impl::IsLoop< T >::type │ │ │ │ │ +  check whether a type is an instance of LoopSIMD More... │ │ │ │ │ +  │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -Compute type of the result of an arithmetic operation involving two different │ │ │ │ │ -number types. │ │ │ │ │ - Author │ │ │ │ │ - Matthias Wohlmuth │ │ │ │ │ +Common tests for simd abstraction implementations. │ │ │ │ │ +This file is an interface header and may be included without restrictions. │ │ │ │ │ +***** Macro Definition Documentation ***** │ │ │ │ │ +***** ◆ DUNE_SIMD_ASSIGN_OP ***** │ │ │ │ │ +#define DUNE_SIMD_ASSIGN_OP (  NAME, │ │ │ │ │ +  SYMBOL  │ │ │ │ │ + ) │ │ │ │ │ +Value: │ │ │ │ │ +struct OpInfix##NAME \ │ │ │ │ │ +{ \ │ │ │ │ │ +template \ │ │ │ │ │ +decltype(auto) operator()(V1&& v1, V2&& v2) const \ │ │ │ │ │ +{ \ │ │ │ │ │ +return std::forward(v1) SYMBOL std::forward(v2); \ │ │ │ │ │ +} \ │ │ │ │ │ +template \ │ │ │ │ │ +auto scalar(S1& s1, S2&& s2) const \ │ │ │ │ │ +-> decltype(s1 SYMBOL std::forward(s2)); \ │ │ │ │ │ +} │ │ │ │ │ +***** ◆ DUNE_SIMD_CHECK ***** │ │ │ │ │ +#define (  expr )     ((expr) ? void() : complain(__FILE__, __LINE__, __func__, │ │ │ │ │ +DUNE_SIMD_CHECK #expr)) │ │ │ │ │ +***** ◆ DUNE_SIMD_CHECK_OP ***** │ │ │ │ │ +#define DUNE_SIMD_CHECK_OP (  expr ) │ │ │ │ │ +Value: │ │ │ │ │ +((expr) ? void() : complain(__FILE__, __LINE__, __func__, \ │ │ │ │ │ +DUNE_SIMD_OPNAME, #expr)) │ │ │ │ │ +DUNE_SIMD_OPNAME │ │ │ │ │ +#define DUNE_SIMD_OPNAME │ │ │ │ │ +***** ◆ DUNE_SIMD_DO ***** │ │ │ │ │ +#define DUNE_SIMD_DO (  M1, │ │ │ │ │ +  M2, │ │ │ │ │ +  M3, │ │ │ │ │ +  V1, │ │ │ │ │ +  V2, │ │ │ │ │ +  V3, │ │ │ │ │ +  NAME  │ │ │ │ │ + ) │ │ │ │ │ +Value: │ │ │ │ │ +checker(bool_constant{}, \ │ │ │ │ │ +bool_constant{}, \ │ │ │ │ │ +bool_constant{}, \ │ │ │ │ │ +Op##NAME{}) │ │ │ │ │ +***** ◆ DUNE_SIMD_INFIX_OP ***** │ │ │ │ │ +#define DUNE_SIMD_INFIX_OP (  NAME, │ │ │ │ │ +  SYMBOL  │ │ │ │ │ + ) │ │ │ │ │ +Value: │ │ │ │ │ +struct OpInfix##NAME \ │ │ │ │ │ +{ \ │ │ │ │ │ +template \ │ │ │ │ │ +decltype(auto) operator()(V1&& v1, V2&& v2) const \ │ │ │ │ │ +{ \ │ │ │ │ │ +return std::forward(v1) SYMBOL std::forward(v2); \ │ │ │ │ │ +} \ │ │ │ │ │ +template \ │ │ │ │ │ +auto scalar(S1&& s1, S2&& s2) const \ │ │ │ │ │ +-> decltype(std::forward(s1) SYMBOL std::forward(s2)); \ │ │ │ │ │ +} │ │ │ │ │ +***** ◆ DUNE_SIMD_OPNAME [1/6] ***** │ │ │ │ │ +#define DUNE_SIMD_OPNAME   (className()) │ │ │ │ │ +***** ◆ DUNE_SIMD_OPNAME [2/6] ***** │ │ │ │ │ +#define DUNE_SIMD_OPNAME   (className()) │ │ │ │ │ +***** ◆ DUNE_SIMD_OPNAME [3/6] ***** │ │ │ │ │ +#define DUNE_SIMD_OPNAME   (className()) │ │ │ │ │ +***** ◆ DUNE_SIMD_OPNAME [4/6] ***** │ │ │ │ │ +#define DUNE_SIMD_OPNAME   (className()) │ │ │ │ │ +***** ◆ DUNE_SIMD_OPNAME [5/6] ***** │ │ │ │ │ +#define DUNE_SIMD_OPNAME   (className()) │ │ │ │ │ +***** ◆ DUNE_SIMD_OPNAME [6/6] ***** │ │ │ │ │ +#define DUNE_SIMD_OPNAME   (className()) │ │ │ │ │ +***** ◆ DUNE_SIMD_POSTFIX_OP ***** │ │ │ │ │ +#define DUNE_SIMD_POSTFIX_OP (  NAME, │ │ │ │ │ +  SYMBOL  │ │ │ │ │ + ) │ │ │ │ │ +Value: │ │ │ │ │ +struct OpPostfix##NAME \ │ │ │ │ │ +{ \ │ │ │ │ │ +template \ │ │ │ │ │ +auto operator()(V&& v) const \ │ │ │ │ │ +-> decltype(std::forward(v) SYMBOL) \ │ │ │ │ │ +{ \ │ │ │ │ │ +return std::forward(v) SYMBOL; \ │ │ │ │ │ +} \ │ │ │ │ │ +} │ │ │ │ │ +***** ◆ DUNE_SIMD_PREFIX_OP ***** │ │ │ │ │ +#define DUNE_SIMD_PREFIX_OP (  NAME, │ │ │ │ │ +  SYMBOL  │ │ │ │ │ + ) │ │ │ │ │ +Value: │ │ │ │ │ +struct OpPrefix##NAME \ │ │ │ │ │ +{ \ │ │ │ │ │ +template \ │ │ │ │ │ +auto operator()(V&& v) const \ │ │ │ │ │ +-> decltype(SYMBOL std::forward(v)) \ │ │ │ │ │ +{ \ │ │ │ │ │ +return SYMBOL std::forward(v); \ │ │ │ │ │ +} \ │ │ │ │ │ +} │ │ │ │ │ +***** ◆ DUNE_SIMD_REPL_OP ***** │ │ │ │ │ +#define DUNE_SIMD_REPL_OP (  NAME, │ │ │ │ │ +  REPLFN, │ │ │ │ │ +  SYMBOL  │ │ │ │ │ + ) │ │ │ │ │ +Value: │ │ │ │ │ +struct OpInfix##NAME \ │ │ │ │ │ +{ \ │ │ │ │ │ +template \ │ │ │ │ │ +decltype(auto) operator()(V1&& v1, V2&& v2) const \ │ │ │ │ │ +{ \ │ │ │ │ │ +return Simd::REPLFN(std::forward(v1), std::forward(v2)); \ │ │ │ │ │ +} \ │ │ │ │ │ +template \ │ │ │ │ │ +auto scalar(S1&& s1, S2&& s2) const \ │ │ │ │ │ +-> decltype(std::forward(s1) SYMBOL std::forward(s2)); \ │ │ │ │ │ +} │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00077_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: promotiontraits.hh Source File │ │ │ │ +dune-common: test.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,51 +58,1985 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
promotiontraits.hh
│ │ │ │ +
test.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 (C) 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_PROMOTIONTRAITS_HH
│ │ │ │ -
6#define DUNE_PROMOTIONTRAITS_HH
│ │ │ │ -
7
│ │ │ │ -
8#include <utility>
│ │ │ │ -
9
│ │ │ │ -
10namespace Dune {
│ │ │ │ -
25 template <typename T1, typename T2>
│ │ │ │ - │ │ │ │ -
27 {
│ │ │ │ -
28 typedef decltype(std::declval<T1>()+std::declval<T2>()) PromotedType;
│ │ │ │ -
29 };
│ │ │ │ -
30
│ │ │ │ -
31 // Specialization for the case of two equal types
│ │ │ │ -
32 // One should think that the generic template should handle this case as well.
│ │ │ │ -
33 // However, the fvectortest.cc unit test fails without it if ENABLE_GMP is set.
│ │ │ │ -
34 template <typename T1>
│ │ │ │ -
35 struct PromotionTraits<T1,T1> { typedef T1 PromotedType; };
│ │ │ │ -
36
│ │ │ │ -
38} // end namespace
│ │ │ │ -
39
│ │ │ │ -
40
│ │ │ │ -
41#endif // DUNE_PROMOTIONTRAITS_HH
│ │ │ │ +Go to the documentation of this file.
1// SPDX-FileCopyrightInfo: Copyright (C) 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_SIMD_TEST_HH
│ │ │ │ +
4#define DUNE_COMMON_SIMD_TEST_HH
│ │ │ │ +
5
│ │ │ │ +
12#include <algorithm>
│ │ │ │ +
13#include <cstddef>
│ │ │ │ +
14#include <iostream>
│ │ │ │ +
15#include <sstream>
│ │ │ │ +
16#include <string>
│ │ │ │ +
17#include <type_traits>
│ │ │ │ +
18#include <typeindex>
│ │ │ │ +
19#include <typeinfo>
│ │ │ │ +
20#include <unordered_set>
│ │ │ │ +
21#include <utility>
│ │ │ │ +
22
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
32
│ │ │ │ +
33namespace Dune {
│ │ │ │ +
34 namespace Simd {
│ │ │ │ +
35
│ │ │ │ +
36 namespace Impl {
│ │ │ │ +
37
│ │ │ │ +
38 template<class T, class SFINAE = void>
│ │ │ │ +
39 struct LessThenComparable : std::false_type {};
│ │ │ │ +
40 template<class T>
│ │ │ │ +
41 struct LessThenComparable<T, std::void_t<decltype(std::declval<T>()
│ │ │ │ +
42 < std::declval<T>())> > :
│ │ │ │ +
43 std::true_type
│ │ │ │ +
44 {};
│ │ │ │ +
45
│ │ │ │ +
46 template<class Dst, class Src>
│ │ │ │ +
47 struct CopyConstHelper
│ │ │ │ +
48 {
│ │ │ │ +
49 using type = Dst;
│ │ │ │ +
50 };
│ │ │ │ +
51 template<class Dst, class Src>
│ │ │ │ +
52 struct CopyConstHelper<Dst, const Src>
│ │ │ │ +
53 {
│ │ │ │ +
54 using type = std::add_const_t<Dst>;
│ │ │ │ +
55 };
│ │ │ │ +
56
│ │ │ │ +
57 template<class Dst, class Src>
│ │ │ │ +
58 struct CopyVolatileHelper
│ │ │ │ +
59 {
│ │ │ │ +
60 using type = Dst;
│ │ │ │ +
61 };
│ │ │ │ +
62 template<class Dst, class Src>
│ │ │ │ +
63 struct CopyVolatileHelper<Dst, volatile Src>
│ │ │ │ +
64 {
│ │ │ │ +
65 using type = std::add_volatile_t<Dst>;
│ │ │ │ +
66 };
│ │ │ │ +
67
│ │ │ │ +
68 template<class Dst, class Src>
│ │ │ │ +
69 struct CopyReferenceHelper
│ │ │ │ +
70 {
│ │ │ │ +
71 using type = Dst;
│ │ │ │ +
72 };
│ │ │ │ +
73 template<class Dst, class Src>
│ │ │ │ +
74 struct CopyReferenceHelper<Dst, Src&>
│ │ │ │ +
75 {
│ │ │ │ +
76 using type = std::add_lvalue_reference_t<Dst>;
│ │ │ │ +
77 };
│ │ │ │ +
78
│ │ │ │ +
79 template<class Dst, class Src>
│ │ │ │ +
80 struct CopyReferenceHelper<Dst, Src&&>
│ │ │ │ +
81 {
│ │ │ │ +
82 using type = std::add_rvalue_reference_t<Dst>;
│ │ │ │ +
83 };
│ │ │ │ +
84
│ │ │ │ +
85 template<class Dst, class Src>
│ │ │ │ +
86 using CopyRefQual = typename CopyReferenceHelper<
│ │ │ │ +
87 typename CopyVolatileHelper<
│ │ │ │ +
88 typename CopyConstHelper<
│ │ │ │ +
89 std::decay_t<Dst>,
│ │ │ │ +
90 std::remove_reference_t<Src>
│ │ │ │ +
91 >::type,
│ │ │ │ +
92 std::remove_reference_t<Src>
│ │ │ │ +
93 >::type,
│ │ │ │ +
94 Src
│ │ │ │ +
95 >::type;
│ │ │ │ +
96
│ │ │ │ +
97 template<class Mark, class Types,
│ │ │ │ +
98 class Indices =
│ │ │ │ +
99 std::make_index_sequence<TypeListSize<Types>::value - 1> >
│ │ │ │ +
100 struct RemoveEnd;
│ │ │ │ +
101 template<class Mark, class Types, std::size_t... I>
│ │ │ │ +
102 struct RemoveEnd<Mark, Types, std::index_sequence<I...>>
│ │ │ │ +
103 {
│ │ │ │ +
104 using Back = TypeListEntry_t<TypeListSize<Types>::value - 1, Types>;
│ │ │ │ +
105 static_assert(std::is_same<Mark, Back>::value,
│ │ │ │ +
106 "TypeList not terminated by proper EndMark");
│ │ │ │ +
107 using type = TypeList<TypeListEntry_t<I, Types>...>;
│ │ │ │ +
108 };
│ │ │ │ +
109
│ │ │ │ +
110 template<class T, class List, class = void>
│ │ │ │ +
111 struct TypeInList;
│ │ │ │ +
112
│ │ │ │ +
113 template<class T>
│ │ │ │ +
114 struct TypeInList<T, TypeList<> > : std::false_type {};
│ │ │ │ +
115
│ │ │ │ +
116 template<class T, class... Rest>
│ │ │ │ +
117 struct TypeInList<T, TypeList<T, Rest...> > : std::true_type {};
│ │ │ │ +
118
│ │ │ │ +
119 template<class T, class Head, class... Rest>
│ │ │ │ +
120 struct TypeInList<T, TypeList<Head, Rest...>,
│ │ │ │ +
121 std::enable_if_t<!std::is_same<T, Head>::value> > :
│ │ │ │ +
122 TypeInList<T, TypeList<Rest...> >::type
│ │ │ │ +
123 {};
│ │ │ │ +
124
│ │ │ │ +
125 template<class T>
│ │ │ │ +
126 struct IsLoop : std::false_type {};
│ │ │ │ +
127 template<class T, std::size_t S>
│ │ │ │ +
128 struct IsLoop<LoopSIMD<T, S> > : std::true_type {};
│ │ │ │ +
129
│ │ │ │ +
130 // used inside static_assert to trick the compiler into printing a list
│ │ │ │ +
131 // of types:
│ │ │ │ +
132 //
│ │ │ │ +
133 // static_assert(debugTypes<V>(Std::bool_constant<condition>{}), "msg");
│ │ │ │ +
134 //
│ │ │ │ +
135 // Should include what the type `V` expands to in the error message.
│ │ │ │ +
136 template<class...>
│ │ │ │ +
137 constexpr bool debugTypes(std::true_type) { return true; }
│ │ │ │ +
138 template<class... Types>
│ │ │ │ +
139 [[deprecated]]
│ │ │ │ +
140 constexpr bool debugTypes(std::false_type) { return false; }
│ │ │ │ +
141
│ │ │ │ +
142 } // namespace Impl
│ │ │ │ +
143
│ │ │ │ +
145 struct EndMark {};
│ │ │ │ +
147
│ │ │ │ +
156 template<class... Types>
│ │ │ │ + │ │ │ │ +
158 typename Impl::RemoveEnd<EndMark, TypeList<Types...> >::type;
│ │ │ │ +
159
│ │ │ │ +
161 template<class T>
│ │ │ │ +
162 using IsLoop = typename Impl::IsLoop<T>::type;
│ │ │ │ +
163
│ │ │ │ +
164 class UnitTest {
│ │ │ │ +
165 bool good_ = true;
│ │ │ │ +
166 std::ostream &log_ = std::cerr;
│ │ │ │ +
167 // records the types for which checks have started running to avoid
│ │ │ │ +
168 // infinite recursion
│ │ │ │ +
169 std::unordered_set<std::type_index> seen_;
│ │ │ │ +
170
│ │ │ │ +
172 //
│ │ │ │ +
173 // Helper functions
│ │ │ │ +
174 //
│ │ │ │ +
175
│ │ │ │ +
176 void complain(const char *file, int line, const char *func,
│ │ │ │ +
177 const char *expr);
│ │ │ │ +
178
│ │ │ │ +
179 void complain(const char *file, int line, const char *func,
│ │ │ │ +
180 const std::string &opname, const char *expr);
│ │ │ │ +
181
│ │ │ │ +
182 // This macro is defined only within this file, do not use anywhere
│ │ │ │ +
183 // else. Doing the actual printing in an external function dramatically
│ │ │ │ +
184 // reduces memory use during compilation. Defined in such a way that
│ │ │ │ +
185 // the call will only happen for failed checks.
│ │ │ │ +
186#define DUNE_SIMD_CHECK(expr) \
│ │ │ │ +
187 ((expr) ? void() : complain(__FILE__, __LINE__, __func__, #expr))
│ │ │ │ +
188
│ │ │ │ +
189 // the function using this macro must define a way to compute the
│ │ │ │ +
190 // operator name in DUNE_SIMD_OPNAME
│ │ │ │ +
191#define DUNE_SIMD_CHECK_OP(expr) \
│ │ │ │ +
192 ((expr) ? void() : complain(__FILE__, __LINE__, __func__, \
│ │ │ │ +
193 DUNE_SIMD_OPNAME, #expr))
│ │ │ │ +
194
│ │ │ │ +
195 // "cast" into a prvalue
│ │ │ │ +
196 template<class T>
│ │ │ │ +
197 static std::decay_t<T> prvalue(T &&t)
│ │ │ │ +
198 {
│ │ │ │ +
199 return std::forward<T>(t);
│ │ │ │ +
200 }
│ │ │ │ +
201
│ │ │ │ +
202 // whether the vector is 42 in all lanes
│ │ │ │ +
203 template<class V>
│ │ │ │ +
204 static bool is42(const V &v)
│ │ │ │ +
205 {
│ │ │ │ +
206 bool good = true;
│ │ │ │ +
207
│ │ │ │ +
208 for(std::size_t l = 0; l < lanes(v); ++l)
│ │ │ │ +
209 // need to cast in case we have a mask type
│ │ │ │ +
210 good &= (lane(l, v) == Scalar<V>(42));
│ │ │ │ +
211
│ │ │ │ +
212 return good;
│ │ │ │ +
213 }
│ │ │ │ +
214
│ │ │ │ +
215 // make a vector that contains the sequence { 1, 2, ... }
│ │ │ │ +
216 template<class V>
│ │ │ │ +
217 static V make123()
│ │ │ │ +
218 {
│ │ │ │ +
219 // initialize to avoid undefined behaviour if assigning to lane()
│ │ │ │ +
220 // involves lvalue-to-rvalue conversions, e.g. due to bitmask
│ │ │ │ +
221 // operations. Avoid using broadcast<V>() for initialization to avoid
│ │ │ │ +
222 // test interdependencies.
│ │ │ │ +
223 V vec(Scalar<V>(0));
│ │ │ │ +
224 for(std::size_t l = 0; l < lanes(vec); ++l)
│ │ │ │ +
225 lane(l, vec) = l + 1;
│ │ │ │ +
226 return vec;
│ │ │ │ +
227 }
│ │ │ │ +
228
│ │ │ │ +
229 // whether the vector contains the sequence { 1, 2, ... }
│ │ │ │ +
230 template<class V>
│ │ │ │ +
231 static bool is123(const V &v)
│ │ │ │ +
232 {
│ │ │ │ +
233 bool good = true;
│ │ │ │ +
234
│ │ │ │ +
235 for(std::size_t l = 0; l < lanes(v); ++l)
│ │ │ │ +
236 // need to cast in case we have a mask type
│ │ │ │ +
237 good &= (lane(l, v) == Scalar<V>(l+1));
│ │ │ │ +
238
│ │ │ │ +
239 return good;
│ │ │ │ +
240 }
│ │ │ │ +
241
│ │ │ │ +
242 template<class V>
│ │ │ │ +
243 static V leftVector()
│ │ │ │ +
244 {
│ │ │ │ +
245 // Avoid using broadcast<V>() for initialization to avoid test
│ │ │ │ +
246 // interdependencies.
│ │ │ │ +
247 V res(Scalar<V>(0));
│ │ │ │ +
248 for(std::size_t l = 0; l < lanes(res); ++l)
│ │ │ │ +
249 lane(l, res) = Scalar<V>(l+1);
│ │ │ │ +
250 return res;
│ │ │ │ +
251 }
│ │ │ │ +
252
│ │ │ │ +
253 template<class V>
│ │ │ │ +
254 static V rightVector()
│ │ │ │ +
255 {
│ │ │ │ +
256 // Avoid using broadcast<V>() for initialization to avoid test
│ │ │ │ +
257 // interdependencies.
│ │ │ │ +
258 V res(Scalar<V>(0));
│ │ │ │ +
259 for(std::size_t l = 0; l < lanes(res); ++l)
│ │ │ │ +
260 // do not exceed number of bits in char (for shifts)
│ │ │ │ +
261 // avoid 0 (for / and %)
│ │ │ │ +
262 lane(l, res) = Scalar<V>((l)%7+1);
│ │ │ │ +
263 return res;
│ │ │ │ +
264 }
│ │ │ │ +
265
│ │ │ │ +
266 template<class T>
│ │ │ │ +
267 static T leftScalar()
│ │ │ │ +
268 {
│ │ │ │ +
269 return T(42);
│ │ │ │ +
270 }
│ │ │ │ +
271
│ │ │ │ +
272 template<class T>
│ │ │ │ +
273 static T rightScalar()
│ │ │ │ +
274 {
│ │ │ │ +
275 // do not exceed number of bits in char (for shifts)
│ │ │ │ +
276 // avoid 0 (for / and %)
│ │ │ │ +
277 return T(5);
│ │ │ │ +
278 }
│ │ │ │ +
279
│ │ │ │ +
280 template<class Dst, class Src>
│ │ │ │ +
281 using CopyRefQual = Impl::CopyRefQual<Dst, Src>;
│ │ │ │ +
282
│ │ │ │ +
283 // test whether the Op supports the operation on scalars. We do not use
│ │ │ │ +
284 // `lane()` to obtain the scalars, because that might return a proxy
│ │ │ │ +
285 // object, and we are interested in what exactly the scalar type can do,
│ │ │ │ +
286 // no a proxy that might have more overloads than needed. In addition,
│ │ │ │ +
287 // `lane()` may not preserve `const` and reference qualifiers.
│ │ │ │ +
288 template<class Op, class... Vectors>
│ │ │ │ +
289 using ScalarResult =
│ │ │ │ +
290 decltype(std::declval<Op>().
│ │ │ │ +
291 scalar(std::declval<CopyRefQual<Scalar<Vectors>,
│ │ │ │ +
292 Vectors> >()...));
│ │ │ │ +
293
│ │ │ │ +
295 //
│ │ │ │ +
296 // Check associated types
│ │ │ │ +
297 //
│ │ │ │ +
298
│ │ │ │ +
299 template<class V>
│ │ │ │ +
300 void checkScalar()
│ │ │ │ +
301 {
│ │ │ │ +
302 // check that the type Scalar<V> exists
│ │ │ │ +
303 using T = Scalar<V>;
│ │ │ │ +
304
│ │ │ │ +
305 static_assert(std::is_same<T, std::decay_t<T> >::value, "Scalar types "
│ │ │ │ +
306 "must not be references, and must not include "
│ │ │ │ +
307 "cv-qualifiers");
│ │ │ │ +
308 [[maybe_unused]] T a{};
│ │ │ │ +
309 }
│ │ │ │ +
310
│ │ │ │ +
311 template<class V>
│ │ │ │ +
312 [[deprecated("Warning: please include bool in the Rebinds for "
│ │ │ │ +
313 "simd type V, as Masks are not checked otherwise.")]]
│ │ │ │ +
314 void warnMissingMaskRebind(std::true_type) {}
│ │ │ │ +
315 template<class V>
│ │ │ │ +
316 void warnMissingMaskRebind(std::false_type) {}
│ │ │ │ +
317
│ │ │ │ +
318 template<class V, class Rebinds, template<class> class RebindPrune,
│ │ │ │ +
319 template<class> class RebindAccept, class Recurse>
│ │ │ │ +
320 void checkRebindOf(Recurse recurse)
│ │ │ │ +
321 {
│ │ │ │ +
322 Hybrid::forEach(Rebinds{}, [this,recurse](auto target) {
│ │ │ │ +
323 using T = typename decltype(target)::type;
│ │ │ │ +
324
│ │ │ │ +
325 // check that the rebound type exists
│ │ │ │ +
326 using W = Rebind<T, V>;
│ │ │ │ +
327 log_ << "Type " << className<V>() << " rebound to "
│ │ │ │ +
328 << className<T>() << " is " << className<W>() << std::endl;
│ │ │ │ +
329
│ │ │ │ +
330 static_assert(std::is_same<W, std::decay_t<W> >::value, "Rebound "
│ │ │ │ +
331 "types must not be references, and must not include "
│ │ │ │ +
332 "cv-qualifiers");
│ │ │ │ +
333 static_assert(lanes<V>() == lanes<W>(), "Rebound types must have "
│ │ │ │ +
334 "the same number of lanes as the original vector "
│ │ │ │ +
335 "types");
│ │ │ │ +
336 static_assert(std::is_same<T, Scalar<W> >::value, "Rebound types "
│ │ │ │ +
337 "must have the bound-to scalar type");
│ │ │ │ +
338
│ │ │ │ +
339 if constexpr (RebindPrune<W>{}) {
│ │ │ │ +
340 log_ << "Pruning check of Simd type " << className<W>()
│ │ │ │ +
341 << std::endl;
│ │ │ │ +
342 }
│ │ │ │ +
343 else {
│ │ │ │ +
344 using Impl::debugTypes;
│ │ │ │ +
345 static_assert(debugTypes<T, V, W>(RebindAccept<W>{}),
│ │ │ │ +
346 "Rebind<T, V> is W, but that is not accepted "
│ │ │ │ +
347 "by RebindAccept");
│ │ │ │ +
348 recurse(MetaType<W>{});
│ │ │ │ +
349 }
│ │ │ │ +
350 });
│ │ │ │ +
351
│ │ │ │ +
352 static_assert(std::is_same<Rebind<Scalar<V>, V>, V>::value, "A type "
│ │ │ │ +
353 "rebound to its own scalar type must be the same type "
│ │ │ │ +
354 "as the original type");
│ │ │ │ +
355 static_assert(std::is_same<Rebind<bool, V>, Mask<V> >::value, "A type "
│ │ │ │ +
356 "rebound to bool must be the mask type for that type");
│ │ │ │ +
357
│ │ │ │ +
358 constexpr bool hasBool = Impl::TypeInList<bool, Rebinds>::value;
│ │ │ │ +
359 warnMissingMaskRebind<V>(Std::bool_constant<!hasBool>{});
│ │ │ │ +
360 }
│ │ │ │ +
361
│ │ │ │ +
363 //
│ │ │ │ +
364 // Fundamental checks
│ │ │ │ +
365 //
│ │ │ │ +
366
│ │ │ │ +
367 template<class V>
│ │ │ │ +
368 void checkLanes()
│ │ │ │ +
369 {
│ │ │ │ +
370 // check lanes
│ │ │ │ +
371 static_assert(std::is_same<std::size_t, decltype(lanes<V>())>::value,
│ │ │ │ +
372 "return type of lanes<V>() should be std::size_t");
│ │ │ │ +
373 static_assert(std::is_same<std::size_t, decltype(lanes(V{}))>::value,
│ │ │ │ +
374 "return type of lanes(V{}) should be std::size_t");
│ │ │ │ +
375
│ │ │ │ +
376 // the result of lanes<V>() must be constexpr
│ │ │ │ +
377 [[maybe_unused]] constexpr auto size = lanes<V>();
│ │ │ │ +
378 // but the result of lanes(vec) does not need to be constexpr
│ │ │ │ +
379 DUNE_SIMD_CHECK(lanes<V>() == lanes(V{}));
│ │ │ │ +
380 }
│ │ │ │ +
381
│ │ │ │ +
382 template<class V>
│ │ │ │ +
383 void checkDefaultConstruct()
│ │ │ │ +
384 {
│ │ │ │ +
385 { [[maybe_unused]] V vec; }
│ │ │ │ +
386 { [[maybe_unused]] V vec{}; }
│ │ │ │ +
387 { [[maybe_unused]] V vec = {}; }
│ │ │ │ +
388 }
│ │ │ │ +
389
│ │ │ │ +
390 template<class V>
│ │ │ │ +
391 void checkLane()
│ │ │ │ +
392 {
│ │ │ │ +
393 // Avoid using broadcast<V>() for initialization to avoid test
│ │ │ │ +
394 // interdependencies.
│ │ │ │ +
395 V vec(Scalar<V>(0));
│ │ │ │ +
396 // check lane() on mutable lvalues
│ │ │ │ +
397 for(std::size_t l = 0; l < lanes(vec); ++l)
│ │ │ │ +
398 lane(l, vec) = l + 1;
│ │ │ │ +
399 for(std::size_t l = 0; l < lanes(vec); ++l)
│ │ │ │ +
400 DUNE_SIMD_CHECK(lane(l, vec) == Scalar<V>(l + 1));
│ │ │ │ +
401 using MLRes = decltype(lane(0, vec));
│ │ │ │ +
402 static_assert(std::is_same<MLRes, Scalar<V>&>::value ||
│ │ │ │ +
403 std::is_same<MLRes, std::decay_t<MLRes> >::value,
│ │ │ │ +
404 "Result of lane() on a mutable lvalue vector must "
│ │ │ │ +
405 "either be a mutable reference to a scalar of that "
│ │ │ │ +
406 "vector or a proxy object (which itself may not be a "
│ │ │ │ +
407 "reference nor const).");
│ │ │ │ +
408
│ │ │ │ +
409 // check lane() on const lvalues
│ │ │ │ +
410 const V &vec2 = vec;
│ │ │ │ +
411 for(std::size_t l = 0; l < lanes(vec); ++l)
│ │ │ │ +
412 DUNE_SIMD_CHECK(lane(l, vec2) == Scalar<V>(l + 1));
│ │ │ │ +
413 using CLRes = decltype(lane(0, vec2));
│ │ │ │ +
414 static_assert(std::is_same<CLRes, const Scalar<V>&>::value ||
│ │ │ │ +
415 std::is_same<CLRes, std::decay_t<CLRes> >::value,
│ │ │ │ +
416 "Result of lane() on a const lvalue vector must "
│ │ │ │ +
417 "either be a const lvalue reference to a scalar of that "
│ │ │ │ +
418 "vector or a proxy object (which itself may not be a "
│ │ │ │ +
419 "reference nor const).");
│ │ │ │ +
420 static_assert(!std::is_assignable<CLRes, Scalar<V> >::value,
│ │ │ │ +
421 "Result of lane() on a const lvalue vector must not be "
│ │ │ │ +
422 "assignable from a scalar.");
│ │ │ │ +
423
│ │ │ │ +
424 // check lane() on rvalues
│ │ │ │ +
425 for(std::size_t l = 0; l < lanes(vec); ++l)
│ │ │ │ +
426 DUNE_SIMD_CHECK(lane(l, prvalue(vec)) == Scalar<V>(l + 1));
│ │ │ │ +
427 using RRes = decltype(lane(0, prvalue(vec)));
│ │ │ │ +
428 // TODO: do we really want to allow Scalar<V>&& here? If we allow it,
│ │ │ │ +
429 // then `auto &&res = lane(0, vec*vec);` creates a dangling reference,
│ │ │ │ +
430 // and the scalar (and even the vector types) are small enough to be
│ │ │ │ +
431 // passed in registers anyway. On the other hand, the only comparable
│ │ │ │ +
432 // accessor function in the standard library that I can think of is
│ │ │ │ +
433 // std::get(), and that does return an rvalue reference in this
│ │ │ │ +
434 // situation. However, that cannot assume anything about the size of
│ │ │ │ +
435 // the returned types.
│ │ │ │ +
436 static_assert(std::is_same<RRes, Scalar<V> >::value ||
│ │ │ │ +
437 std::is_same<RRes, Scalar<V>&&>::value,
│ │ │ │ +
438 "Result of lane() on a rvalue vector V must be "
│ │ │ │ +
439 "Scalar<V> or Scalar<V>&&.");
│ │ │ │ +
440 // Can't assert non-assignable, fails for any typical class,
│ │ │ │ +
441 // e.g. std::complex<>. Would need to return const Scalar<V> or const
│ │ │ │ +
442 // Scalar<V>&&, which would inhibit moving from the return value.
│ │ │ │ +
443 // static_assert(!std::is_assignable<RRes, Scalar<V> >::value,
│ │ │ │ +
444 // "Result of lane() on a rvalue vector must not be "
│ │ │ │ +
445 // "assignable from a scalar.");
│ │ │ │ +
446 }
│ │ │ │ +
447
│ │ │ │ +
448 // check non-default constructors
│ │ │ │ +
449 template<class V>
│ │ │ │ +
450 void checkCopyMoveConstruct()
│ │ │ │ +
451 {
│ │ │ │ +
452 // elided copy/move constructors
│ │ │ │ +
453 { V vec (make123<V>()); DUNE_SIMD_CHECK(is123(vec)); }
│ │ │ │ +
454 { V vec = make123<V>() ; DUNE_SIMD_CHECK(is123(vec)); }
│ │ │ │ +
455 { V vec {make123<V>()}; DUNE_SIMD_CHECK(is123(vec)); }
│ │ │ │ +
456 { V vec = {make123<V>()}; DUNE_SIMD_CHECK(is123(vec)); }
│ │ │ │ +
457
│ │ │ │ +
458 // copy constructors
│ │ │ │ +
459 { V ref(make123<V>()); V vec (ref);
│ │ │ │ +
460 DUNE_SIMD_CHECK(is123(vec)); DUNE_SIMD_CHECK(is123(ref)); }
│ │ │ │ +
461 { V ref(make123<V>()); V vec = ref ;
│ │ │ │ +
462 DUNE_SIMD_CHECK(is123(vec)); DUNE_SIMD_CHECK(is123(ref)); }
│ │ │ │ +
463 { V ref(make123<V>()); V vec {ref};
│ │ │ │ +
464 DUNE_SIMD_CHECK(is123(vec)); DUNE_SIMD_CHECK(is123(ref)); }
│ │ │ │ +
465 { V ref(make123<V>()); V vec = {ref};
│ │ │ │ +
466 DUNE_SIMD_CHECK(is123(vec)); DUNE_SIMD_CHECK(is123(ref)); }
│ │ │ │ +
467 { const V ref(make123<V>()); V vec (ref);
│ │ │ │ +
468 DUNE_SIMD_CHECK(is123(vec)); }
│ │ │ │ +
469 { const V ref(make123<V>()); V vec = ref ;
│ │ │ │ +
470 DUNE_SIMD_CHECK(is123(vec)); }
│ │ │ │ +
471 { const V ref(make123<V>()); V vec {ref};
│ │ │ │ +
472 DUNE_SIMD_CHECK(is123(vec)); }
│ │ │ │ +
473 { const V ref(make123<V>()); V vec = {ref};
│ │ │ │ +
474 DUNE_SIMD_CHECK(is123(vec)); }
│ │ │ │ +
475
│ │ │ │ +
476 // move constructors
│ │ │ │ +
477 { V ref(make123<V>()); V vec (std::move(ref));
│ │ │ │ +
478 DUNE_SIMD_CHECK(is123(vec)); }
│ │ │ │ +
479 { V ref(make123<V>()); V vec = std::move(ref) ;
│ │ │ │ +
480 DUNE_SIMD_CHECK(is123(vec)); }
│ │ │ │ +
481 { V ref(make123<V>()); V vec {std::move(ref)};
│ │ │ │ +
482 DUNE_SIMD_CHECK(is123(vec)); }
│ │ │ │ +
483 { V ref(make123<V>()); V vec = {std::move(ref)};
│ │ │ │ +
484 DUNE_SIMD_CHECK(is123(vec)); }
│ │ │ │ +
485 }
│ │ │ │ +
486
│ │ │ │ +
487 template<class V>
│ │ │ │ +
488 void checkBroadcastVectorConstruct()
│ │ │ │ +
489 {
│ │ │ │ +
490 // broadcast copy constructors
│ │ │ │ +
491 { Scalar<V> ref = 42; V vec (ref);
│ │ │ │ +
492 DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
│ │ │ │ +
493 { Scalar<V> ref = 42; V vec = ref ;
│ │ │ │ +
494 DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
│ │ │ │ +
495 // { Scalar<V> ref = 42; V vec {ref};
│ │ │ │ +
496 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
│ │ │ │ +
497 // { Scalar<V> ref = 42; V vec = {ref};
│ │ │ │ +
498 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
│ │ │ │ +
499 { const Scalar<V> ref = 42; V vec (ref);
│ │ │ │ +
500 DUNE_SIMD_CHECK(is42(vec)); }
│ │ │ │ +
501 { const Scalar<V> ref = 42; V vec = ref ;
│ │ │ │ +
502 DUNE_SIMD_CHECK(is42(vec)); }
│ │ │ │ +
503 // { const Scalar<V> ref = 42; V vec {ref};
│ │ │ │ +
504 // DUNE_SIMD_CHECK(is42(vec)); }
│ │ │ │ +
505 // { const Scalar<V> ref = 42; V vec = {ref};
│ │ │ │ +
506 // DUNE_SIMD_CHECK(is42(vec)); }
│ │ │ │ +
507
│ │ │ │ +
508 // broadcast move constructors
│ │ │ │ +
509 { Scalar<V> ref = 42; V vec (std::move(ref));
│ │ │ │ +
510 DUNE_SIMD_CHECK(is42(vec)); }
│ │ │ │ +
511 { Scalar<V> ref = 42; V vec = std::move(ref) ;
│ │ │ │ +
512 DUNE_SIMD_CHECK(is42(vec)); }
│ │ │ │ +
513 // { Scalar<V> ref = 42; V vec {std::move(ref)};
│ │ │ │ +
514 // DUNE_SIMD_CHECK(is42(vec)); }
│ │ │ │ +
515 // { Scalar<V> ref = 42; V vec = {std::move(ref)};
│ │ │ │ +
516 // DUNE_SIMD_CHECK(is42(vec)); }
│ │ │ │ +
517 }
│ │ │ │ +
518
│ │ │ │ +
519 template<class V>
│ │ │ │ +
520 void checkBroadcastMaskConstruct()
│ │ │ │ +
521 {
│ │ │ │ +
522 // broadcast copy constructors
│ │ │ │ +
523 { Scalar<V> ref = 42; V vec (ref);
│ │ │ │ +
524 DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
│ │ │ │ +
525 // { Scalar<V> ref = 42; V vec = ref ;
│ │ │ │ +
526 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
│ │ │ │ +
527 { Scalar<V> ref = 42; V vec {ref};
│ │ │ │ +
528 DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
│ │ │ │ +
529 // { Scalar<V> ref = 42; V vec = {ref};
│ │ │ │ +
530 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
│ │ │ │ +
531 { const Scalar<V> ref = 42; V vec (ref);
│ │ │ │ +
532 DUNE_SIMD_CHECK(is42(vec)); }
│ │ │ │ +
533 // { const Scalar<V> ref = 42; V vec = ref ;
│ │ │ │ +
534 // DUNE_SIMD_CHECK(is42(vec)); }
│ │ │ │ +
535 { const Scalar<V> ref = 42; V vec {ref};
│ │ │ │ +
536 DUNE_SIMD_CHECK(is42(vec)); }
│ │ │ │ +
537 // { const Scalar<V> ref = 42; V vec = {ref};
│ │ │ │ +
538 // DUNE_SIMD_CHECK(is42(vec)); }
│ │ │ │ +
539
│ │ │ │ +
540 // broadcast move constructors
│ │ │ │ +
541 { Scalar<V> ref = 42; V vec (std::move(ref));
│ │ │ │ +
542 DUNE_SIMD_CHECK(is42(vec)); }
│ │ │ │ +
543 // { Scalar<V> ref = 42; V vec = std::move(ref) ;
│ │ │ │ +
544 // DUNE_SIMD_CHECK(is42(vec)); }
│ │ │ │ +
545 { Scalar<V> ref = 42; V vec {std::move(ref)};
│ │ │ │ +
546 DUNE_SIMD_CHECK(is42(vec)); }
│ │ │ │ +
547 // { Scalar<V> ref = 42; V vec = {std::move(ref)};
│ │ │ │ +
548 // DUNE_SIMD_CHECK(is42(vec)); }
│ │ │ │ +
549 }
│ │ │ │ +
550
│ │ │ │ +
551 // check the implCast function
│ │ │ │ +
552 template<class FromV, class ToV>
│ │ │ │ +
553 void checkImplCast()
│ │ │ │ +
554 {
│ │ │ │ +
555 { // lvalue arg
│ │ │ │ +
556 FromV fromVec = make123<FromV>();
│ │ │ │ +
557 auto toVec = implCast<ToV>(fromVec);
│ │ │ │ +
558 static_assert(std::is_same<decltype(toVec), ToV>::value,
│ │ │ │ +
559 "Unexpected result type for implCast<ToV>(FromV&)");
│ │ │ │ +
560 DUNE_SIMD_CHECK(is123(fromVec));
│ │ │ │ +
561 DUNE_SIMD_CHECK(is123(toVec));
│ │ │ │ +
562 }
│ │ │ │ +
563
│ │ │ │ +
564 { // const lvalue arg
│ │ │ │ +
565 const FromV fromVec = make123<FromV>();
│ │ │ │ +
566 auto toVec = implCast<ToV>(fromVec);
│ │ │ │ +
567 static_assert(std::is_same<decltype(toVec), ToV>::value,
│ │ │ │ +
568 "Unexpected result type for implCast<ToV>(const "
│ │ │ │ +
569 "FromV&)");
│ │ │ │ +
570 DUNE_SIMD_CHECK(is123(toVec));
│ │ │ │ +
571 }
│ │ │ │ +
572
│ │ │ │ +
573 { // rvalue arg
│ │ │ │ +
574 auto toVec = implCast<ToV>(make123<FromV>());
│ │ │ │ +
575 static_assert(std::is_same<decltype(toVec), ToV>::value,
│ │ │ │ +
576 "Unexpected result type for implCast<ToV>(FromV&&)");
│ │ │ │ +
577 DUNE_SIMD_CHECK(is123(toVec));
│ │ │ │ +
578 }
│ │ │ │ +
579 }
│ │ │ │ +
580
│ │ │ │ +
581 // check the implCast function
│ │ │ │ +
582 template<class V>
│ │ │ │ +
583 void checkImplCast()
│ │ │ │ +
584 {
│ │ │ │ +
585 // check against LoopSIMD
│ │ │ │ +
586 using LoopV = Dune::LoopSIMD<Scalar<V>, lanes<V>()>;
│ │ │ │ +
587
│ │ │ │ +
588 checkImplCast<V, V>();
│ │ │ │ +
589 checkImplCast<V, LoopV>();
│ │ │ │ +
590 checkImplCast<LoopV, V>();
│ │ │ │ +
591 }
│ │ │ │ +
592
│ │ │ │ +
593 // check the broadcast function
│ │ │ │ +
594 template<class V>
│ │ │ │ +
595 void checkBroadcast()
│ │ │ │ +
596 {
│ │ │ │ +
597 // broadcast function
│ │ │ │ +
598 { // lvalue arg
│ │ │ │ +
599 Scalar<V> ref = 42;
│ │ │ │ +
600 auto vec = broadcast<V>(ref);
│ │ │ │ +
601 static_assert(std::is_same<decltype(vec), V>::value,
│ │ │ │ +
602 "Unexpected result type for broadcast<V>()");
│ │ │ │ +
603 DUNE_SIMD_CHECK(is42(vec));
│ │ │ │ +
604 DUNE_SIMD_CHECK(ref == Scalar<V>(42));
│ │ │ │ +
605 }
│ │ │ │ +
606
│ │ │ │ +
607 { // const lvalue arg
│ │ │ │ +
608 const Scalar<V> ref = 42;
│ │ │ │ +
609 auto vec = broadcast<V>(ref);
│ │ │ │ +
610 static_assert(std::is_same<decltype(vec), V>::value,
│ │ │ │ +
611 "Unexpected result type for broadcast<V>()");
│ │ │ │ +
612 DUNE_SIMD_CHECK(is42(vec));
│ │ │ │ +
613 }
│ │ │ │ +
614
│ │ │ │ +
615 { // rvalue arg
│ │ │ │ +
616 auto vec = broadcast<V>(Scalar<V>(42));
│ │ │ │ +
617 static_assert(std::is_same<decltype(vec), V>::value,
│ │ │ │ +
618 "Unexpected result type for broadcast<V>()");
│ │ │ │ +
619 DUNE_SIMD_CHECK(is42(vec));
│ │ │ │ +
620 }
│ │ │ │ +
621
│ │ │ │ +
622 { // int arg
│ │ │ │ +
623 auto vec = broadcast<V>(42);
│ │ │ │ +
624 static_assert(std::is_same<decltype(vec), V>::value,
│ │ │ │ +
625 "Unexpected result type for broadcast<V>()");
│ │ │ │ +
626 DUNE_SIMD_CHECK(is42(vec));
│ │ │ │ +
627 }
│ │ │ │ +
628
│ │ │ │ +
629 { // double arg
│ │ │ │ +
630 auto vec = broadcast<V>(42.0);
│ │ │ │ +
631 static_assert(std::is_same<decltype(vec), V>::value,
│ │ │ │ +
632 "Unexpected result type for broadcast<V>()");
│ │ │ │ +
633 DUNE_SIMD_CHECK(is42(vec));
│ │ │ │ +
634 }
│ │ │ │ +
635 }
│ │ │ │ +
636
│ │ │ │ +
637 template<class V>
│ │ │ │ +
638 void checkBracedAssign()
│ │ │ │ +
639 {
│ │ │ │ +
640 // copy assignment
│ │ │ │ +
641 { V ref = make123<V>(); V vec; vec = {ref};
│ │ │ │ +
642 DUNE_SIMD_CHECK(is123(vec)); DUNE_SIMD_CHECK(is123(ref)); }
│ │ │ │ +
643 { const V ref = make123<V>(); V vec; vec = {ref};
│ │ │ │ +
644 DUNE_SIMD_CHECK(is123(vec)); DUNE_SIMD_CHECK(is123(ref)); }
│ │ │ │ +
645
│ │ │ │ +
646 // move assignment
│ │ │ │ +
647 { V vec; vec = {make123<V>()}; DUNE_SIMD_CHECK(is123(vec)); }
│ │ │ │ +
648 }
│ │ │ │ +
649
│ │ │ │ +
650 template<class V>
│ │ │ │ +
651 void checkBracedBroadcastAssign()
│ │ │ │ +
652 {
│ │ │ │ +
653 // nothing works here
│ │ │ │ +
654 // // broadcast copy assignment
│ │ │ │ +
655 // { Scalar<V> ref = 42; V vec; vec = {ref};
│ │ │ │ +
656 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar<V>(42)); }
│ │ │ │ +
657 // { const Scalar<V> ref = 42; V vec; vec = {ref};
│ │ │ │ +
658 // DUNE_SIMD_CHECK(is42(vec)); }
│ │ │ │ +
659
│ │ │ │ +
660 // // broadcast move assignment
│ │ │ │ +
661 // { Scalar<V> ref = 42; V vec; vec = {std::move(ref)};
│ │ │ │ +
662 // DUNE_SIMD_CHECK(is42(vec)); }
│ │ │ │ +
663 }
│ │ │ │ +
664
│ │ │ │ +
666 //
│ │ │ │ +
667 // checks for unary operators
│ │ │ │ +
668 //
│ │ │ │ +
669
│ │ │ │ +
670#define DUNE_SIMD_POSTFIX_OP(NAME, SYMBOL) \
│ │ │ │ +
671 struct OpPostfix##NAME \
│ │ │ │ +
672 { \
│ │ │ │ +
673 template<class V> \
│ │ │ │ +
674 auto operator()(V&& v) const \
│ │ │ │ +
675 -> decltype(std::forward<V>(v) SYMBOL) \
│ │ │ │ +
676 { \
│ │ │ │ +
677 return std::forward<V>(v) SYMBOL; \
│ │ │ │ +
678 } \
│ │ │ │ +
679 }
│ │ │ │ +
680
│ │ │ │ +
681#define DUNE_SIMD_PREFIX_OP(NAME, SYMBOL) \
│ │ │ │ +
682 struct OpPrefix##NAME \
│ │ │ │ +
683 { \
│ │ │ │ +
684 template<class V> \
│ │ │ │ +
685 auto operator()(V&& v) const \
│ │ │ │ +
686 -> decltype(SYMBOL std::forward<V>(v)) \
│ │ │ │ +
687 { \
│ │ │ │ +
688 return SYMBOL std::forward<V>(v); \
│ │ │ │ +
689 } \
│ │ │ │ +
690 }
│ │ │ │ +
691
│ │ │ │ +
692 DUNE_SIMD_POSTFIX_OP(Decrement, -- );
│ │ │ │ +
693 DUNE_SIMD_POSTFIX_OP(Increment, ++ );
│ │ │ │ +
694
│ │ │ │ +
695 DUNE_SIMD_PREFIX_OP (Decrement, -- );
│ │ │ │ +
696 DUNE_SIMD_PREFIX_OP (Increment, ++ );
│ │ │ │ +
697
│ │ │ │ +
698 DUNE_SIMD_PREFIX_OP (Plus, + );
│ │ │ │ +
699 DUNE_SIMD_PREFIX_OP (Minus, - );
│ │ │ │ +
700 DUNE_SIMD_PREFIX_OP (LogicNot, ! );
│ │ │ │ +
701 // Do not warn about ~ being applied to bool. (1) Yes, doing that is
│ │ │ │ +
702 // weird, but we do want to test the weird stuff too. (2) It avoids
│ │ │ │ +
703 // running into <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82040> on
│ │ │ │ +
704 // g++-7.0 through 7.2. Also, ignore -Wpragmas to not warn about an
│ │ │ │ +
705 // unknown -Wbool-operation on compilers that do not know that option.
│ │ │ │ +
706#pragma GCC diagnostic push
│ │ │ │ +
707#pragma GCC diagnostic ignored "-Wpragmas"
│ │ │ │ +
708#pragma GCC diagnostic ignored "-Wunknown-warning-option" // clang 6.0.1
│ │ │ │ +
709#pragma GCC diagnostic ignored "-Wbool-operation"
│ │ │ │ +
710 DUNE_SIMD_PREFIX_OP (BitNot, ~ );
│ │ │ │ +
711#pragma GCC diagnostic pop
│ │ │ │ +
712
│ │ │ │ +
713#undef DUNE_SIMD_POSTFIX_OP
│ │ │ │ +
714#undef DUNE_SIMD_PREFIX_OP
│ │ │ │ +
715
│ │ │ │ +
716 template<class V, class Op>
│ │ │ │ +
717 std::enable_if_t<
│ │ │ │ +
718 IsCallable<Op(decltype(lane(0, std::declval<V>())))>::value>
│ │ │ │ +
719 checkUnaryOpV(Op op)
│ │ │ │ +
720 {
│ │ │ │ +
721#define DUNE_SIMD_OPNAME (className<Op(V)>())
│ │ │ │ +
722 // arguments
│ │ │ │ +
723 auto val = leftVector<std::decay_t<V>>();
│ │ │ │ +
724
│ │ │ │ +
725 // copy the arguments in case V is a references
│ │ │ │ +
726 auto arg = val;
│ │ │ │ +
727 auto &&result = op(static_cast<V>(arg));
│ │ │ │ +
728 using T = Scalar<std::decay_t<decltype(result)> >;
│ │ │ │ +
729 for(std::size_t l = 0; l < lanes(val); ++l)
│ │ │ │ +
730 {
│ │ │ │ +
731 // `op` might promote the argument. This is a problem if the
│ │ │ │ +
732 // argument of the operation on the right of the `==` is
│ │ │ │ +
733 // e.g. `(unsigned short)1` and the operation is e.g. unary `-`.
│ │ │ │ +
734 // Then the argument is promoted to `int` before applying the
│ │ │ │ +
735 // negation, and the result is `(int)-1`. However, the left side of
│ │ │ │ +
736 // the `==` is still `(unsigned short)-1`, which typically is the
│ │ │ │ +
737 // same as `(unsigned short)65535`. The `==` promotes the left side
│ │ │ │ +
738 // before comparing, so that becomes `(int)65535`. It will then
│ │ │ │ +
739 // compare `(int)65535` and `(int)-1` and rightly declare them to be
│ │ │ │ +
740 // not equal.
│ │ │ │ +
741
│ │ │ │ +
742 // To work around this, we explicitly convert the right side of the
│ │ │ │ +
743 // `==` to the scalar type before comparing.
│ │ │ │ + │ │ │ │ +
745 (lane(l, result)
│ │ │ │ +
746 == static_cast<T>(op(lane(l, static_cast<V>(val)))));
│ │ │ │ +
747 }
│ │ │ │ +
748 // op might modify val, verify that any such modification also happens
│ │ │ │ +
749 // in the vector case
│ │ │ │ +
750 for(std::size_t l = 0; l < lanes<std::decay_t<V> >(); ++l)
│ │ │ │ +
751 DUNE_SIMD_CHECK_OP(lane(l, val) == lane(l, arg));
│ │ │ │ +
752#undef DUNE_SIMD_OPNAME
│ │ │ │ +
753 }
│ │ │ │ +
754
│ │ │ │ +
755 template<class V, class Op>
│ │ │ │ +
756 std::enable_if_t<
│ │ │ │ +
757 not IsCallable<Op(decltype(lane(0, std::declval<V>())))>::value>
│ │ │ │ +
758 checkUnaryOpV(Op op)
│ │ │ │ +
759 {
│ │ │ │ +
760 // log_ << "No " << className<Op(decltype(lane(0, std::declval<V>())))>()
│ │ │ │ +
761 // << std::endl
│ │ │ │ +
762 // << " ==> Not checking " << className<Op(V)>() << std::endl;
│ │ │ │ +
763 }
│ │ │ │ +
764
│ │ │ │ +
765 template<class V, class Op>
│ │ │ │ +
766 void checkUnaryOpsV(Op op)
│ │ │ │ +
767 {
│ │ │ │ +
768 checkUnaryOpV<V&>(op);
│ │ │ │ +
769 checkUnaryOpV<const V&>(op);
│ │ │ │ +
770 checkUnaryOpV<V&&>(op);
│ │ │ │ +
771 }
│ │ │ │ +
772
│ │ │ │ +
774 //
│ │ │ │ +
775 // checks for binary operators
│ │ │ │ +
776 //
│ │ │ │ +
777
│ │ │ │ +
778 // The operators contain an `operator()`, which will be invoked for both
│ │ │ │ +
779 // scalar and vector arguments. The function `scalar()` is used the
│ │ │ │ +
780 // test whether the scalar types support the operation (via
│ │ │ │ +
781 // `ScalarResult`). The difference is that `scalar()` should only ever
│ │ │ │ +
782 // receive `const`-ref-qualified version of `Scalar<V>`, while the
│ │ │ │ +
783 // `operator()` may also be called with proxies representing scalars.
│ │ │ │ +
784#define DUNE_SIMD_INFIX_OP(NAME, SYMBOL) \
│ │ │ │ +
785 struct OpInfix##NAME \
│ │ │ │ +
786 { \
│ │ │ │ +
787 template<class V1, class V2> \
│ │ │ │ +
788 decltype(auto) operator()(V1&& v1, V2&& v2) const \
│ │ │ │ +
789 { \
│ │ │ │ +
790 return std::forward<V1>(v1) SYMBOL std::forward<V2>(v2); \
│ │ │ │ +
791 } \
│ │ │ │ +
792 template<class S1, class S2> \
│ │ │ │ +
793 auto scalar(S1&& s1, S2&& s2) const \
│ │ │ │ +
794 -> decltype(std::forward<S1>(s1) SYMBOL std::forward<S2>(s2)); \
│ │ │ │ +
795 }
│ │ │ │ +
796
│ │ │ │ +
797 // for assign ops, accept only non-const lvalue arguments for scalars.
│ │ │ │ +
798 // This is needed for class scalars (e.g. std::complex) because
│ │ │ │ +
799 // non-const class rvalues are actually usually assignable. Though that
│ │ │ │ +
800 // assignment happens to a temporary, and thus is lost. Except that the
│ │ │ │ +
801 // tests would bind the result of the assignment to a reference. And
│ │ │ │ +
802 // because that result is returned from a function by reference, even
│ │ │ │ +
803 // though it is a temporary passed as an argument to that function,
│ │ │ │ +
804 // accessing the result later is undefined behaviour.
│ │ │ │ +
805#define DUNE_SIMD_ASSIGN_OP(NAME, SYMBOL) \
│ │ │ │ +
806 struct OpInfix##NAME \
│ │ │ │ +
807 { \
│ │ │ │ +
808 template<class V1, class V2> \
│ │ │ │ +
809 decltype(auto) operator()(V1&& v1, V2&& v2) const \
│ │ │ │ +
810 { \
│ │ │ │ +
811 return std::forward<V1>(v1) SYMBOL std::forward<V2>(v2); \
│ │ │ │ +
812 } \
│ │ │ │ +
813 template<class S1, class S2> \
│ │ │ │ +
814 auto scalar(S1& s1, S2&& s2) const \
│ │ │ │ +
815 -> decltype(s1 SYMBOL std::forward<S2>(s2)); \
│ │ │ │ +
816 }
│ │ │ │ +
817
│ │ │ │ +
818#define DUNE_SIMD_REPL_OP(NAME, REPLFN, SYMBOL) \
│ │ │ │ +
819 struct OpInfix##NAME \
│ │ │ │ +
820 { \
│ │ │ │ +
821 template<class V1, class V2> \
│ │ │ │ +
822 decltype(auto) operator()(V1&& v1, V2&& v2) const \
│ │ │ │ +
823 { \
│ │ │ │ +
824 return Simd::REPLFN(std::forward<V1>(v1), std::forward<V2>(v2)); \
│ │ │ │ +
825 } \
│ │ │ │ +
826 template<class S1, class S2> \
│ │ │ │ +
827 auto scalar(S1&& s1, S2&& s2) const \
│ │ │ │ +
828 -> decltype(std::forward<S1>(s1) SYMBOL std::forward<S2>(s2)); \
│ │ │ │ +
829 }
│ │ │ │ +
830
│ │ │ │ +
831 DUNE_SIMD_INFIX_OP(Mul, * );
│ │ │ │ +
832 DUNE_SIMD_INFIX_OP(Div, / );
│ │ │ │ +
833 DUNE_SIMD_INFIX_OP(Remainder, % );
│ │ │ │ +
834
│ │ │ │ +
835 DUNE_SIMD_INFIX_OP(Plus, + );
│ │ │ │ +
836 DUNE_SIMD_INFIX_OP(Minus, - );
│ │ │ │ +
837
│ │ │ │ +
838 DUNE_SIMD_INFIX_OP(LeftShift, << );
│ │ │ │ +
839 DUNE_SIMD_INFIX_OP(RightShift, >> );
│ │ │ │ +
840
│ │ │ │ +
841 DUNE_SIMD_INFIX_OP(Less, < );
│ │ │ │ +
842 DUNE_SIMD_INFIX_OP(Greater, > );
│ │ │ │ +
843 DUNE_SIMD_INFIX_OP(LessEqual, <= );
│ │ │ │ +
844 DUNE_SIMD_INFIX_OP(GreaterEqual, >= );
│ │ │ │ +
845
│ │ │ │ +
846 DUNE_SIMD_INFIX_OP(Equal, == );
│ │ │ │ +
847 DUNE_SIMD_INFIX_OP(NotEqual, != );
│ │ │ │ +
848
│ │ │ │ +
849 DUNE_SIMD_INFIX_OP(BitAnd, & );
│ │ │ │ +
850 DUNE_SIMD_INFIX_OP(BitXor, ^ );
│ │ │ │ +
851 DUNE_SIMD_INFIX_OP(BitOr, | );
│ │ │ │ +
852
│ │ │ │ +
853 // Those are not supported in any meaningful way by vectorclass
│ │ │ │ +
854 // We need to test replacement functions maskAnd() and maskOr() instead.
│ │ │ │ +
855 DUNE_SIMD_REPL_OP(LogicAnd, maskAnd, && );
│ │ │ │ +
856 DUNE_SIMD_REPL_OP(LogicOr, maskOr, || );
│ │ │ │ +
857
│ │ │ │ +
858 DUNE_SIMD_ASSIGN_OP(Assign, = );
│ │ │ │ +
859 DUNE_SIMD_ASSIGN_OP(AssignMul, *= );
│ │ │ │ +
860 DUNE_SIMD_ASSIGN_OP(AssignDiv, /= );
│ │ │ │ +
861 DUNE_SIMD_ASSIGN_OP(AssignRemainder, %= );
│ │ │ │ +
862 DUNE_SIMD_ASSIGN_OP(AssignPlus, += );
│ │ │ │ +
863 DUNE_SIMD_ASSIGN_OP(AssignMinus, -= );
│ │ │ │ +
864 DUNE_SIMD_ASSIGN_OP(AssignLeftShift, <<=);
│ │ │ │ +
865 DUNE_SIMD_ASSIGN_OP(AssignRightShift, >>=);
│ │ │ │ +
866 DUNE_SIMD_ASSIGN_OP(AssignAnd, &= );
│ │ │ │ +
867 DUNE_SIMD_ASSIGN_OP(AssignXor, ^= );
│ │ │ │ +
868 DUNE_SIMD_ASSIGN_OP(AssignOr, |= );
│ │ │ │ +
869
│ │ │ │ +
870#undef DUNE_SIMD_INFIX_OP
│ │ │ │ +
871#undef DUNE_SIMD_REPL_OP
│ │ │ │ +
872#undef DUNE_SIMD_ASSIGN_OP
│ │ │ │ +
873
│ │ │ │ +
874 // just used as a tag
│ │ │ │ +
875 struct OpInfixComma {};
│ │ │ │ +
876
│ │ │ │ +
877 template<class T1, class T2>
│ │ │ │ +
878 void checkCommaOp(const std::decay_t<T1> &val1,
│ │ │ │ +
879 const std::decay_t<T2> &val2)
│ │ │ │ +
880 {
│ │ │ │ +
881#define DUNE_SIMD_OPNAME (className<OpInfixComma(T1, T2)>())
│ │ │ │ +
882 static_assert(std::is_same<decltype((std::declval<T1>(),
│ │ │ │ +
883 std::declval<T2>())), T2>::value,
│ │ │ │ +
884 "Type and value category of the comma operator must "
│ │ │ │ +
885 "match that of the second operand");
│ │ │ │ +
886
│ │ │ │ +
887 // copy the arguments in case T1 or T2 are references
│ │ │ │ +
888 auto arg1 = val1;
│ │ │ │ +
889 auto arg2 = val2;
│ │ │ │ +
890 // Do not warn that the left side of the comma operator is unused.
│ │ │ │ +
891 // Seems to work for g++-4.9 and clang++-3.8. Appears to be harmless
│ │ │ │ +
892 // for icpc (14 and 17), and icpc does not seem to issue a warning
│ │ │ │ +
893 // anyway.
│ │ │ │ +
894#pragma GCC diagnostic push
│ │ │ │ +
895#pragma GCC diagnostic ignored "-Wunused-value"
│ │ │ │ +
896 auto &&result = (static_cast<T1>(arg1),
│ │ │ │ +
897 static_cast<T2>(arg2));
│ │ │ │ +
898#pragma GCC diagnostic pop
│ │ │ │ +
899 if(std::is_reference<T2>::value)
│ │ │ │ +
900 {
│ │ │ │ +
901 // comma should return the same object as the second argument for
│ │ │ │ +
902 // lvalues and xvalues
│ │ │ │ +
903 DUNE_SIMD_CHECK_OP(&result == &arg2);
│ │ │ │ +
904 // it should not modify any arguments
│ │ │ │ +
905 DUNE_SIMD_CHECK_OP(allTrue(val1 == arg1));
│ │ │ │ +
906 DUNE_SIMD_CHECK_OP(allTrue(val2 == arg2));
│ │ │ │ +
907 }
│ │ │ │ +
908 else
│ │ │ │ +
909 {
│ │ │ │ +
910 // comma should return the same value as the second argument for
│ │ │ │ +
911 // prvalues
│ │ │ │ +
912 DUNE_SIMD_CHECK_OP(allTrue(result == arg2));
│ │ │ │ +
913 // it should not modify any arguments
│ │ │ │ +
914 DUNE_SIMD_CHECK_OP(allTrue(val1 == arg1));
│ │ │ │ +
915 // second argument is a prvalue, any modifications happen to a
│ │ │ │ +
916 // temporary and we can't detect them
│ │ │ │ +
917 }
│ │ │ │ +
918#undef DUNE_SIMD_OPNAME
│ │ │ │ +
919 }
│ │ │ │ +
920
│ │ │ │ +
922 //
│ │ │ │ +
923 // checks for vector-vector binary operations
│ │ │ │ +
924 //
│ │ │ │ +
925
│ │ │ │ +
926 // We check the following candidate operation
│ │ │ │ +
927 //
│ │ │ │ +
928 // vopres = vop1 @ vop2
│ │ │ │ +
929 //
│ │ │ │ +
930 // against the reference operation
│ │ │ │ +
931 //
│ │ │ │ +
932 // arefres[l] = aref1[l] @ aref2[l] foreach l
│ │ │ │ +
933 //
│ │ │ │ +
934 // v... variables are simd-vectors and a... variables are arrays. The
│ │ │ │ +
935 // operation may modify the operands, but if is does the modification
│ │ │ │ +
936 // needs to happen in both the candidate and the reference.
│ │ │ │ +
937 //
│ │ │ │ +
938 // We do the following checks:
│ │ │ │ +
939 // 1. lanes(vopres) == lanes(vop1)
│ │ │ │ +
940 // 2. lane(l, vopres) == arefres[l] foreach l
│ │ │ │ +
941 // 3. lane(l, vop1) == aref1[l] foreach l
│ │ │ │ +
942 // 4. lane(l, vop2) == aref2[l] foreach l
│ │ │ │ +
943 template<class V1, class V2, class Op>
│ │ │ │ +
944 std::enable_if_t<Std::is_detected_v<ScalarResult, Op, V1, V2> >
│ │ │ │ +
945 checkBinaryOpVV(MetaType<V1>, MetaType<V2>, Op op)
│ │ │ │ +
946 {
│ │ │ │ +
947#define DUNE_SIMD_OPNAME (className<Op(V1, V2)>())
│ │ │ │ +
948 static_assert(std::is_same<std::decay_t<V1>, std::decay_t<V2> >::value,
│ │ │ │ +
949 "Internal testsystem error: called with two types that "
│ │ │ │ +
950 "don't decay to the same thing");
│ │ │ │ +
951
│ │ │ │ +
952 // reference arguments
│ │ │ │ +
953 auto vref1 = leftVector<std::decay_t<V1>>();
│ │ │ │ +
954 auto vref2 = rightVector<std::decay_t<V2>>();
│ │ │ │ +
955
│ │ │ │ +
956 // candidate arguments
│ │ │ │ +
957 auto vop1 = vref1;
│ │ │ │ +
958 auto vop2 = vref2;
│ │ │ │ +
959
│ │ │ │ +
960 // candidate operation
│ │ │ │ +
961 auto &&vopres = op(static_cast<V1>(vop1), static_cast<V2>(vop2));
│ │ │ │ +
962 using VR = decltype(vopres);
│ │ │ │ +
963
│ │ │ │ +
964 // check 1. lanes(vopres) == lanes(vop1)
│ │ │ │ +
965 static_assert(lanes<std::decay_t<VR> >() == lanes<std::decay_t<V1> >(),
│ │ │ │ +
966 "The result must have the same number of lanes as the "
│ │ │ │ +
967 "operands.");
│ │ │ │ +
968
│ │ │ │ +
969 // do the reference operation, and simultaneously
│ │ │ │ +
970 // check 2. lane(l, vopres) == arefres[l] foreach l
│ │ │ │ +
971 using T = Scalar<std::decay_t<VR> >;
│ │ │ │ +
972 for(auto l : range(lanes(vopres)))
│ │ │ │ +
973 {
│ │ │ │ +
974 // see the lengthy comment in `checkUnaryOpV()` as to why the
│ │ │ │ +
975 // `static_cast` around the `op()` is necessary
│ │ │ │ + │ │ │ │ +
977 (lane(l, vopres)
│ │ │ │ +
978 == static_cast<T>(op(lane(l, static_cast<V1>(vref1)),
│ │ │ │ +
979 lane(l, static_cast<V2>(vref2)))));
│ │ │ │ +
980 }
│ │ │ │ +
981
│ │ │ │ +
982 // check 3. lane(l, vop1) == aref1[l] foreach l
│ │ │ │ +
983 for(auto l : range(lanes(vop1)))
│ │ │ │ +
984 DUNE_SIMD_CHECK_OP(lane(l, vop1) == lane(l, vref1));
│ │ │ │ +
985
│ │ │ │ +
986 // check 4. lane(l, vop2) == aref2[l] foreach l
│ │ │ │ +
987 for(auto l : range(lanes(vop2)))
│ │ │ │ +
988 DUNE_SIMD_CHECK_OP(lane(l, vop2) == lane(l, vref2));
│ │ │ │ +
989
│ │ │ │ +
990#undef DUNE_SIMD_OPNAME
│ │ │ │ +
991 }
│ │ │ │ +
992
│ │ │ │ +
993 template<class V1, class V2, class Op>
│ │ │ │ +
994 std::enable_if_t<!Std::is_detected_v<ScalarResult, Op, V1, V2> >
│ │ │ │ +
995 checkBinaryOpVV(MetaType<V1>, MetaType<V2>, Op op)
│ │ │ │ +
996 {
│ │ │ │ +
997 // log_ << "No " << className<Op(decltype(lane(0, std::declval<V1>())),
│ │ │ │ +
998 // decltype(lane(0, std::declval<V2>())))>()
│ │ │ │ +
999 // << std::endl
│ │ │ │ +
1000 // << " ==> Not checking " << className<Op(V1, V2)>() << std::endl;
│ │ │ │ +
1001 }
│ │ │ │ +
1002
│ │ │ │ +
1003 template<class V1, class V2>
│ │ │ │ +
1004 void checkBinaryOpVV(MetaType<V1>, MetaType<V2>, OpInfixComma)
│ │ │ │ +
1005 {
│ │ │ │ +
1006 static_assert(std::is_same<std::decay_t<V1>, std::decay_t<V2> >::value,
│ │ │ │ +
1007 "Internal testsystem error: called with two types that "
│ │ │ │ +
1008 "don't decay to the same thing");
│ │ │ │ +
1009
│ │ │ │ +
1010 checkCommaOp<V1, V2>(leftVector<std::decay_t<V1>>(),
│ │ │ │ +
1011 rightVector<std::decay_t<V2>>());
│ │ │ │ +
1012 }
│ │ │ │ +
1013
│ │ │ │ +
1015 //
│ │ │ │ +
1016 // checks for vector-scalar binary operations
│ │ │ │ +
1017 //
│ │ │ │ +
1018
│ │ │ │ +
1019 // We check the following candidate operation
│ │ │ │ +
1020 //
│ │ │ │ +
1021 // vopres = vop1 @ sop2
│ │ │ │ +
1022 //
│ │ │ │ +
1023 // against the reference operation
│ │ │ │ +
1024 //
│ │ │ │ +
1025 // arefres[l] = aref1[l] @ sref2 foreach l
│ │ │ │ +
1026 //
│ │ │ │ +
1027 // v... variables are simd-vectors, a... variables are arrays, and
│ │ │ │ +
1028 // s... variables are scalars. The operation may modify the left
│ │ │ │ +
1029 // operand, but if is does the modifications needs to happen in both the
│ │ │ │ +
1030 // candidate and the reference.
│ │ │ │ +
1031 //
│ │ │ │ +
1032 // We do the following checks:
│ │ │ │ +
1033 // 1. lanes(vopres) == lanes(vop1)
│ │ │ │ +
1034 // 2. lane(l, vopres) == arefres[l] foreach l
│ │ │ │ +
1035 // 3. lane(l, vop1) == aref1[l] foreach l
│ │ │ │ +
1036 // 4. sop2 is never modified
│ │ │ │ +
1037 // 5. sref2 is never modified
│ │ │ │ +
1038 //
│ │ │ │ +
1039 // In fact, if the property "sref2 is never modified" is violated that
│ │ │ │ +
1040 // means the operation is unsuitable for an automatic broadcast of the
│ │ │ │ +
1041 // second operand and should not be checked. There are no operations in
│ │ │ │ +
1042 // the standard where the second operand is modified like this, but
│ │ │ │ +
1043 // there are operations where the first operand is modified -- and this
│ │ │ │ +
1044 // check is used for those ops as well by exchanging the first and second
│ │ │ │ +
1045 // argument below.
│ │ │ │ +
1046
│ │ │ │ +
1047 template<class V1, class T2, class Op>
│ │ │ │ +
1048 std::enable_if_t<Std::is_detected_v<ScalarResult, Op, V1, T2> >
│ │ │ │ +
1049 checkBinaryOpVS(MetaType<V1>, MetaType<T2>, Op op)
│ │ │ │ +
1050 {
│ │ │ │ +
1051#define DUNE_SIMD_OPNAME (className<Op(V1, T2)>())
│ │ │ │ +
1052 static_assert(std::is_same<Scalar<std::decay_t<V1> >,
│ │ │ │ +
1053 std::decay_t<T2> >::value,
│ │ │ │ +
1054 "Internal testsystem error: called with a scalar that "
│ │ │ │ +
1055 "does not match the vector type.");
│ │ │ │ +
1056
│ │ │ │ +
1057 // initial values
│ │ │ │ +
1058 auto sinit2 = rightScalar<std::decay_t<T2>>();
│ │ │ │ +
1059
│ │ │ │ +
1060 // reference arguments
│ │ │ │ +
1061 auto vref1 = leftVector<std::decay_t<V1>>();
│ │ │ │ +
1062 auto sref2 = sinit2;
│ │ │ │ +
1063
│ │ │ │ +
1064 // candidate arguments
│ │ │ │ +
1065 auto vop1 = vref1;
│ │ │ │ +
1066 auto sop2 = sref2;
│ │ │ │ +
1067
│ │ │ │ +
1068 // candidate operation
│ │ │ │ +
1069 auto &&vopres = op(static_cast<V1>(vop1), static_cast<T2>(sop2));
│ │ │ │ +
1070 using VR = decltype(vopres);
│ │ │ │ +
1071
│ │ │ │ +
1072 // check 1. lanes(vopres) == lanes(vop1)
│ │ │ │ +
1073 static_assert(lanes<std::decay_t<VR> >() == lanes<std::decay_t<V1> >(),
│ │ │ │ +
1074 "The result must have the same number of lanes as the "
│ │ │ │ +
1075 "operands.");
│ │ │ │ +
1076
│ │ │ │ +
1077 // check 4. sop2 is never modified
│ │ │ │ +
1078 DUNE_SIMD_CHECK_OP(sop2 == sinit2);
│ │ │ │ +
1079
│ │ │ │ +
1080 // do the reference operation, and simultaneously check 2. and 5.
│ │ │ │ +
1081 using T = Scalar<std::decay_t<decltype(vopres)> >;
│ │ │ │ +
1082 for(auto l : range(lanes(vopres)))
│ │ │ │ +
1083 {
│ │ │ │ +
1084 // check 2. lane(l, vopres) == arefres[l] foreach l
│ │ │ │ +
1085 // see the lengthy comment in `checkUnaryOpV()` as to why the
│ │ │ │ +
1086 // `static_cast` around the `op()` is necessary
│ │ │ │ + │ │ │ │ +
1088 (lane(l, vopres)
│ │ │ │ +
1089 == static_cast<T>(op(lane(l, static_cast<V1>(vref1)),
│ │ │ │ +
1090 static_cast<T2>(sref2) )));
│ │ │ │ +
1091 // check 5. sref2 is never modified
│ │ │ │ +
1092 DUNE_SIMD_CHECK_OP(sref2 == sinit2);
│ │ │ │ +
1093 }
│ │ │ │ +
1094
│ │ │ │ +
1095 // check 3. lane(l, vop1) == aref1[l] foreach l
│ │ │ │ +
1096 for(auto l : range(lanes(vop1)))
│ │ │ │ +
1097 DUNE_SIMD_CHECK_OP(lane(l, vop1) == lane(l, vref1));
│ │ │ │ +
1098
│ │ │ │ +
1099#undef DUNE_SIMD_OPNAME
│ │ │ │ +
1100 }
│ │ │ │ +
1101
│ │ │ │ +
1102 template<class V1, class T2, class Op>
│ │ │ │ +
1103 std::enable_if_t<!Std::is_detected_v<ScalarResult, Op, V1, T2> >
│ │ │ │ +
1104 checkBinaryOpVS(MetaType<V1>, MetaType<T2>, Op op)
│ │ │ │ +
1105 {
│ │ │ │ +
1106 // log_ << "No "
│ │ │ │ +
1107 // << className<Op(decltype(lane(0, std::declval<V1>())), T2)>()
│ │ │ │ +
1108 // << std::endl
│ │ │ │ +
1109 // << " ==> Not checking " << className<Op(V1, T2)>() << std::endl;
│ │ │ │ +
1110 }
│ │ │ │ +
1111
│ │ │ │ +
1112 template<class V1, class T2>
│ │ │ │ +
1113 void checkBinaryOpVS(MetaType<V1>, MetaType<T2>, OpInfixComma)
│ │ │ │ +
1114 {
│ │ │ │ +
1115 static_assert(std::is_same<Scalar<std::decay_t<V1> >,
│ │ │ │ +
1116 std::decay_t<T2> >::value,
│ │ │ │ +
1117 "Internal testsystem error: called with a scalar that "
│ │ │ │ +
1118 "does not match the vector type.");
│ │ │ │ +
1119
│ │ │ │ +
1120 checkCommaOp<V1, T2>(leftVector<std::decay_t<V1>>(),
│ │ │ │ +
1121 rightScalar<std::decay_t<T2>>());
│ │ │ │ +
1122 }
│ │ │ │ +
1123
│ │ │ │ +
1125 //
│ │ │ │ +
1126 // cross-check scalar-vector binary operations against vector-vector
│ │ │ │ +
1127 //
│ │ │ │ +
1128
│ │ │ │ +
1129 // We check the following candidate operation
│ │ │ │ +
1130 //
│ │ │ │ +
1131 // vopres = vop1 @ vop2, where vop2 = broadcast(sref2)
│ │ │ │ +
1132 //
│ │ │ │ +
1133 // against the reference operation
│ │ │ │ +
1134 //
│ │ │ │ +
1135 // vrefres = vref1 @ sref2
│ │ │ │ +
1136 //
│ │ │ │ +
1137 // v... variables are simd-vectors, a... variables are arrays, and
│ │ │ │ +
1138 // s... variables are scalars.
│ │ │ │ +
1139 //
│ │ │ │ +
1140 // We could check the following properties
│ │ │ │ +
1141 // 1. lanes(vopres) == lanes(vop1)
│ │ │ │ +
1142 // 2. lane(l, vopres) == lane(l, vrefres) foreach l
│ │ │ │ +
1143 // 3. lane(l, vop1) == lane(l, vref1) foreach l
│ │ │ │ +
1144 // but these are given by checking the operation against the scalar
│ │ │ │ +
1145 // operation in the vector@vector and vector@scalar cases above.
│ │ │ │ +
1146 //
│ │ │ │ +
1147 // The only thing left to check is:
│ │ │ │ +
1148 // 4. lane(l, vop2) foreach l is never modified
│ │ │ │ +
1149
│ │ │ │ +
1150 template<class V1, class T2, class Op>
│ │ │ │ +
1151 std::enable_if_t<Std::is_detected_v<ScalarResult, Op, V1, T2> >
│ │ │ │ +
1152 checkBinaryOpVVAgainstVS(MetaType<V1>, MetaType<T2>, Op op)
│ │ │ │ +
1153 {
│ │ │ │ +
1154#define DUNE_SIMD_OPNAME (className<Op(V1, T2)>())
│ │ │ │ +
1155 static_assert(std::is_same<Scalar<std::decay_t<V1> >,
│ │ │ │ +
1156 std::decay_t<T2> >::value,
│ │ │ │ +
1157 "Internal testsystem error: called with a scalar that "
│ │ │ │ +
1158 "does not match the vector type.");
│ │ │ │ +
1159
│ │ │ │ +
1160 // initial values
│ │ │ │ +
1161 auto sinit2 = rightScalar<std::decay_t<T2>>();
│ │ │ │ +
1162
│ │ │ │ +
1163 // reference arguments
│ │ │ │ +
1164 auto vop1 = leftVector<std::decay_t<V1>>();
│ │ │ │ +
1165 using V2 = CopyRefQual<V1, T2>;
│ │ │ │ +
1166 std::decay_t<V2> vop2(sinit2);
│ │ │ │ +
1167
│ │ │ │ +
1168 // candidate operation
│ │ │ │ +
1169 op(static_cast<V1>(vop1), static_cast<V2>(vop2));
│ │ │ │ +
1170
│ │ │ │ +
1171 // 4. lane(l, vop2) foreach l is never modified
│ │ │ │ +
1172 for(auto l : range(lanes(vop2)))
│ │ │ │ +
1173 DUNE_SIMD_CHECK_OP(lane(l, vop2) == sinit2);
│ │ │ │ +
1174
│ │ │ │ +
1175#undef DUNE_SIMD_OPNAME
│ │ │ │ +
1176 }
│ │ │ │ +
1177
│ │ │ │ +
1178 template<class V1, class T2, class Op>
│ │ │ │ +
1179 std::enable_if_t<!Std::is_detected_v<ScalarResult, Op, V1, T2> >
│ │ │ │ +
1180 checkBinaryOpVVAgainstVS(MetaType<V1>, MetaType<T2>, Op op)
│ │ │ │ +
1181 {
│ │ │ │ +
1182 // log_ << "No "
│ │ │ │ +
1183 // << className<Op(decltype(lane(0, std::declval<V1>())), T2)>()
│ │ │ │ +
1184 // << std::endl
│ │ │ │ +
1185 // << " ==> Not checking " << className<Op(V1, T2)>() << std::endl;
│ │ │ │ +
1186 }
│ │ │ │ +
1187
│ │ │ │ +
1188 template<class V1, class T2>
│ │ │ │ +
1189 void checkBinaryOpVVAgainstVS(MetaType<V1>, MetaType<T2>, OpInfixComma)
│ │ │ │ +
1190 { }
│ │ │ │ +
1191
│ │ │ │ +
1193 //
│ │ │ │ +
1194 // checks for vector-proxy binary operations
│ │ │ │ +
1195 //
│ │ │ │ +
1196
│ │ │ │ +
1197 // We check the following candidate operation
│ │ │ │ +
1198 //
│ │ │ │ +
1199 // vopres = vop1 @ pop2
│ │ │ │ +
1200 //
│ │ │ │ +
1201 // against the reference operation
│ │ │ │ +
1202 //
│ │ │ │ +
1203 // arefres[l] = aref1[l] @ sref2 foreach l
│ │ │ │ +
1204 //
│ │ │ │ +
1205 // v... variables are simd-vectors, a... variables are arrays,
│ │ │ │ +
1206 // p... variables are proxies of simd-vector entries and s... variables
│ │ │ │ +
1207 // are scalars. The operation may modify the left operand, but if is
│ │ │ │ +
1208 // does the modifications needs to happen in both the candidate and the
│ │ │ │ +
1209 // reference.
│ │ │ │ +
1210 //
│ │ │ │ +
1211 // We do the following checks:
│ │ │ │ +
1212 // 1. lanes(vopres) == lanes(vop1)
│ │ │ │ +
1213 // 2. lane(l, vopres) == arefres[l] foreach l
│ │ │ │ +
1214 // 3. lane(l, vop1) == aref1[l] foreach l
│ │ │ │ +
1215 // 4. pop2 is never modified
│ │ │ │ +
1216 // 5. sref2 is never modified
│ │ │ │ +
1217 //
│ │ │ │ +
1218 // In fact, if the property "sref2 is never modified" is violated that
│ │ │ │ +
1219 // means the operation is unsuitable for an automatic broadcast of the
│ │ │ │ +
1220 // second operand and should not be checked. There are no operations in
│ │ │ │ +
1221 // the standard where the second operand is modified like this, but
│ │ │ │ +
1222 // there are operations where the first operand is modified -- and this
│ │ │ │ +
1223 // check is used for those ops as well by exchanging the first and second
│ │ │ │ +
1224 // argument below.
│ │ │ │ +
1225
│ │ │ │ +
1226 template<class V1, class V2, class Op>
│ │ │ │ +
1227 std::enable_if_t<Std::is_detected_v<ScalarResult, Op, V1, V2> >
│ │ │ │ +
1228 checkBinaryOpVP(MetaType<V1>, MetaType<V2>, Op op)
│ │ │ │ +
1229 {
│ │ │ │ +
1230 using P2 = decltype(lane(0, std::declval<V2>()));
│ │ │ │ +
1231 using T2 = CopyRefQual<Scalar<V2>, V2>;
│ │ │ │ +
1232#define DUNE_SIMD_OPNAME (className<Op(V1, P2)>())
│ │ │ │ +
1233 static_assert(std::is_same<Scalar<V1>, Scalar<V2> >::value,
│ │ │ │ +
1234 "Internal testsystem error: called with two vector "
│ │ │ │ +
1235 "types whose scalar types don't match.");
│ │ │ │ +
1236
│ │ │ │ +
1237 // initial values
│ │ │ │ +
1238 auto sinit2 = rightScalar<Scalar<V2>>();
│ │ │ │ +
1239
│ │ │ │ +
1240 // reference arguments
│ │ │ │ +
1241 auto vref1 = leftVector<std::decay_t<V1>>();
│ │ │ │ +
1242 auto sref2 = sinit2;
│ │ │ │ +
1243
│ │ │ │ +
1244 // candidate arguments
│ │ │ │ +
1245 auto vop1 = vref1;
│ │ │ │ +
1246 auto vop2 = std::decay_t<V2>(Scalar<V2>(0));
│ │ │ │ +
1247 lane(0, vop2) = sref2; // pop2 is just a name for `lane(0, vop2)`
│ │ │ │ +
1248
│ │ │ │ +
1249 // candidate operation
│ │ │ │ +
1250 auto &&vopres =
│ │ │ │ +
1251 op(static_cast<V1>(vop1), lane(0, static_cast<V2>(vop2)));
│ │ │ │ +
1252 using VR = decltype(vopres);
│ │ │ │ +
1253
│ │ │ │ +
1254 // check 1. lanes(vopres) == lanes(vop1)
│ │ │ │ +
1255 static_assert(lanes<std::decay_t<VR> >() == lanes<std::decay_t<V1> >(),
│ │ │ │ +
1256 "The result must have the same number of lanes as the "
│ │ │ │ +
1257 "operands.");
│ │ │ │ +
1258
│ │ │ │ +
1259 // check 4. pop2 is never modified
│ │ │ │ +
1260 DUNE_SIMD_CHECK_OP(lane(0, vop2) == sinit2);
│ │ │ │ +
1261
│ │ │ │ +
1262 // do the reference operation, and simultaneously check 2. and 5.
│ │ │ │ +
1263 using T = Scalar<decltype(vopres)>;
│ │ │ │ +
1264 for(auto l : range(lanes(vopres)))
│ │ │ │ +
1265 {
│ │ │ │ +
1266 // check 2. lane(l, vopres) == arefres[l] foreach l
│ │ │ │ +
1267 // see the lengthy comment in `checkUnaryOpV()` as to why the
│ │ │ │ +
1268 // `static_cast` around the `op()` is necessary
│ │ │ │ + │ │ │ │ +
1270 (lane(l, vopres)
│ │ │ │ +
1271 == static_cast<T>(op(lane(l, static_cast<V1>(vref1)),
│ │ │ │ +
1272 static_cast<T2>(sref2) )));
│ │ │ │ +
1273 // check 5. sref2 is never modified
│ │ │ │ +
1274 DUNE_SIMD_CHECK_OP(sref2 == sinit2);
│ │ │ │ +
1275 }
│ │ │ │ +
1276
│ │ │ │ +
1277 // check 3. lane(l, vop1) == aref1[l] foreach l
│ │ │ │ +
1278 for(auto l : range(lanes(vop1)))
│ │ │ │ +
1279 DUNE_SIMD_CHECK_OP(lane(l, vop1) == lane(l, vref1));
│ │ │ │ +
1280
│ │ │ │ +
1281#undef DUNE_SIMD_OPNAME
│ │ │ │ +
1282 }
│ │ │ │ +
1283
│ │ │ │ +
1284 template<class V1, class V2, class Op>
│ │ │ │ +
1285 std::enable_if_t<!Std::is_detected_v<ScalarResult, Op, V1, V2> >
│ │ │ │ +
1286 checkBinaryOpVP(MetaType<V1>, MetaType<V2>, Op op)
│ │ │ │ +
1287 {
│ │ │ │ +
1288 // log_ << "No "
│ │ │ │ +
1289 // << className<Op(decltype(lane(0, std::declval<V1>())), T2)>()
│ │ │ │ +
1290 // << std::endl
│ │ │ │ +
1291 // << " ==> Not checking " << className<Op(V1, T2)>() << std::endl;
│ │ │ │ +
1292 }
│ │ │ │ +
1293
│ │ │ │ +
1294 template<class V1, class V2>
│ │ │ │ +
1295 void checkBinaryOpVP(MetaType<V1>, MetaType<V2>, OpInfixComma)
│ │ │ │ +
1296 {
│ │ │ │ +
1297 // Don't really know how to check comma operator for proxies
│ │ │ │ +
1298 }
│ │ │ │ +
1299
│ │ │ │ +
1301 //
│ │ │ │ +
1302 // checks for (scalar/proxy)-vector binary operations
│ │ │ │ +
1303 //
│ │ │ │ +
1304
│ │ │ │ +
1305 template<class Op>
│ │ │ │ +
1306 struct OpInfixSwappedArgs
│ │ │ │ +
1307 {
│ │ │ │ +
1308 Op orig;
│ │ │ │ +
1309
│ │ │ │ +
1310 template<class V1, class V2>
│ │ │ │ +
1311 decltype(auto) operator()(V1&& v1, V2&& v2) const
│ │ │ │ +
1312 {
│ │ │ │ +
1313 return orig(std::forward<V2>(v2), std::forward<V1>(v1));
│ │ │ │ +
1314 }
│ │ │ │ +
1315 template<class S1, class S2>
│ │ │ │ +
1316 auto scalar(S1&& s1, S2&& s2) const
│ │ │ │ +
1317 -> decltype(orig.scalar(std::forward<S2>(s2), std::forward<S1>(s1)));
│ │ │ │ +
1318 };
│ │ │ │ +
1319
│ │ │ │ +
1320 template<class T1, class V2, class Op>
│ │ │ │ +
1321 void checkBinaryOpSV(MetaType<T1> t1, MetaType<V2> v2, Op op)
│ │ │ │ +
1322 {
│ │ │ │ +
1323 checkBinaryOpVS(v2, t1, OpInfixSwappedArgs<Op>{op});
│ │ │ │ +
1324 }
│ │ │ │ +
1325
│ │ │ │ +
1326 template<class T1, class V2>
│ │ │ │ +
1327 void checkBinaryOpSV(MetaType<T1>, MetaType<V2>, OpInfixComma)
│ │ │ │ +
1328 {
│ │ │ │ +
1329 static_assert(std::is_same<std::decay_t<T1>,
│ │ │ │ +
1330 Scalar<std::decay_t<V2> > >::value,
│ │ │ │ +
1331 "Internal testsystem error: called with a scalar that "
│ │ │ │ +
1332 "does not match the vector type.");
│ │ │ │ +
1333
│ │ │ │ +
1334 checkCommaOp<T1, V2>(leftScalar<std::decay_t<T1>>(),
│ │ │ │ +
1335 rightVector<std::decay_t<V2>>());
│ │ │ │ +
1336 }
│ │ │ │ +
1337
│ │ │ │ +
1338 template<class V1, class V2, class Op>
│ │ │ │ +
1339 void checkBinaryOpPV(MetaType<V1> v1, MetaType<V2> v2, Op op)
│ │ │ │ +
1340 {
│ │ │ │ +
1341 checkBinaryOpVP(v2, v1, OpInfixSwappedArgs<Op>{op});
│ │ │ │ +
1342 }
│ │ │ │ +
1343
│ │ │ │ +
1344 template<class V1, class V2>
│ │ │ │ +
1345 void checkBinaryOpPV(MetaType<V1>, MetaType<V2>, OpInfixComma)
│ │ │ │ +
1346 {
│ │ │ │ +
1347 // Don't really know how to check comma operator for proxies
│ │ │ │ +
1348 }
│ │ │ │ +
1349
│ │ │ │ +
1351 //
│ │ │ │ +
1352 // cross-check scalar-vector binary operations against vector-vector
│ │ │ │ +
1353 //
│ │ │ │ +
1354
│ │ │ │ +
1355 // We check the following candidate operation
│ │ │ │ +
1356 //
│ │ │ │ +
1357 // vopres = vop1 @ vop2, where vop2 = broadcast(sref2)
│ │ │ │ +
1358 //
│ │ │ │ +
1359 // against the reference operation
│ │ │ │ +
1360 //
│ │ │ │ +
1361 // vrefres = vref1 @ sref2
│ │ │ │ +
1362 //
│ │ │ │ +
1363 // v... variables are simd-vectors, a... variables are arrays, and
│ │ │ │ +
1364 // s... variables are scalars.
│ │ │ │ +
1365 //
│ │ │ │ +
1366 // We could check the following properties
│ │ │ │ +
1367 // 1. lanes(vopres) == lanes(vop1)
│ │ │ │ +
1368 // 2. lane(l, vopres) == lane(l, vrefres) foreach l
│ │ │ │ +
1369 // 3. lane(l, vop1) == lane(l, vref1) foreach l
│ │ │ │ +
1370 // but these are given by checking the operation against the scalar
│ │ │ │ +
1371 // operation in the vector@vector and vector@scalar cases above.
│ │ │ │ +
1372 //
│ │ │ │ +
1373 // The only thing left to check is:
│ │ │ │ +
1374 // 4. lane(l, vop2) foreach l is never modified
│ │ │ │ +
1375
│ │ │ │ +
1376 template<class T1, class V2, class Op>
│ │ │ │ +
1377 void checkBinaryOpVVAgainstSV(MetaType<T1> t1, MetaType<V2> v2, Op op)
│ │ │ │ +
1378 {
│ │ │ │ +
1379 checkBinaryOpVVAgainstVS(v2, t1, OpInfixSwappedArgs<Op>{op});
│ │ │ │ +
1380 }
│ │ │ │ +
1381
│ │ │ │ +
1382 template<class V1, class T2>
│ │ │ │ +
1383 void checkBinaryOpVVAgainstSV(MetaType<V1>, MetaType<T2>, OpInfixComma)
│ │ │ │ +
1384 { }
│ │ │ │ +
1385
│ │ │ │ +
1387 //
│ │ │ │ +
1388 // Invoke the checks for all combinations
│ │ │ │ +
1389 //
│ │ │ │ +
1390
│ │ │ │ +
1391 template<class T1, class T2, bool condition, class Checker>
│ │ │ │ +
1392 void checkBinaryRefQual(Checker checker)
│ │ │ │ +
1393 {
│ │ │ │ +
1394 if constexpr (condition) {
│ │ │ │ +
1395 Hybrid::forEach(TypeList<T1&, const T1&, T1&&>{}, [=] (auto t1) {
│ │ │ │ +
1396 Hybrid::forEach(TypeList<T2&, const T2&, T2&&>{}, [=] (auto t2) {
│ │ │ │ +
1397 checker(t1, t2);
│ │ │ │ +
1398 });
│ │ │ │ +
1399 });
│ │ │ │ +
1400 }
│ │ │ │ +
1401 }
│ │ │ │ +
1402
│ │ │ │ +
1403 template<class V, class Checker>
│ │ │ │ +
1404 void checkBinaryOps(Checker checker)
│ │ │ │ +
1405 {
│ │ │ │ +
1406 using Std::bool_constant;
│ │ │ │ +
1407
│ │ │ │ +
1408 constexpr bool isMask = std::is_same<Scalar<V>, bool>::value;
│ │ │ │ +
1409
│ │ │ │ +
1410 constexpr bool do_ = false;
│ │ │ │ +
1411 constexpr bool do_SV = true;
│ │ │ │ +
1412 constexpr bool do_VV = true;
│ │ │ │ +
1413 constexpr bool do_VS = true;
│ │ │ │ +
1414
│ │ │ │ +
1415#define DUNE_SIMD_DO(M1, M2, M3, V1, V2, V3, NAME) \
│ │ │ │ +
1416 checker(bool_constant<isMask ? do_##M1 : do_##V1>{}, \
│ │ │ │ +
1417 bool_constant<isMask ? do_##M2 : do_##V2>{}, \
│ │ │ │ +
1418 bool_constant<isMask ? do_##M3 : do_##V3>{}, \
│ │ │ │ +
1419 Op##NAME{})
│ │ │ │ +
1420
│ │ │ │ +
1421 // (Mask , Vector , Name );
│ │ │ │ +
1422
│ │ │ │ +
1423 DUNE_SIMD_DO( , , , SV, VV, VS, InfixMul );
│ │ │ │ +
1424 DUNE_SIMD_DO( , , , SV, VV, VS, InfixDiv );
│ │ │ │ +
1425 DUNE_SIMD_DO( , , , SV, VV, VS, InfixRemainder );
│ │ │ │ +
1426
│ │ │ │ +
1427 DUNE_SIMD_DO( , , , SV, VV, VS, InfixPlus );
│ │ │ │ +
1428 DUNE_SIMD_DO( , , , SV, VV, VS, InfixMinus );
│ │ │ │ +
1429
│ │ │ │ +
1430 DUNE_SIMD_DO( , , , , VV, VS, InfixLeftShift );
│ │ │ │ +
1431 DUNE_SIMD_DO( , , , , VV, VS, InfixRightShift );
│ │ │ │ +
1432
│ │ │ │ +
1433 DUNE_SIMD_DO( , , , SV, VV, VS, InfixLess );
│ │ │ │ +
1434 DUNE_SIMD_DO( , , , SV, VV, VS, InfixGreater );
│ │ │ │ +
1435 DUNE_SIMD_DO( , , , SV, VV, VS, InfixLessEqual );
│ │ │ │ +
1436 DUNE_SIMD_DO( , , , SV, VV, VS, InfixGreaterEqual );
│ │ │ │ +
1437
│ │ │ │ +
1438 DUNE_SIMD_DO( , , , SV, VV, VS, InfixEqual );
│ │ │ │ +
1439 DUNE_SIMD_DO( , , , SV, VV, VS, InfixNotEqual );
│ │ │ │ +
1440
│ │ │ │ +
1441 DUNE_SIMD_DO( , VV, , SV, VV, VS, InfixBitAnd );
│ │ │ │ +
1442 DUNE_SIMD_DO( , VV, , SV, VV, VS, InfixBitXor );
│ │ │ │ +
1443 DUNE_SIMD_DO( , VV, , SV, VV, VS, InfixBitOr );
│ │ │ │ +
1444
│ │ │ │ +
1445 DUNE_SIMD_DO(SV, VV, VS, SV, VV, VS, InfixLogicAnd );
│ │ │ │ +
1446 DUNE_SIMD_DO(SV, VV, VS, SV, VV, VS, InfixLogicOr );
│ │ │ │ +
1447
│ │ │ │ +
1448 DUNE_SIMD_DO( , VV, , , VV, VS, InfixAssign );
│ │ │ │ +
1449 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignMul );
│ │ │ │ +
1450 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignDiv );
│ │ │ │ +
1451 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignRemainder );
│ │ │ │ +
1452 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignPlus );
│ │ │ │ +
1453 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignMinus );
│ │ │ │ +
1454 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignLeftShift );
│ │ │ │ +
1455 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignRightShift);
│ │ │ │ +
1456 DUNE_SIMD_DO( , VV, , , VV, VS, InfixAssignAnd );
│ │ │ │ +
1457 DUNE_SIMD_DO( , VV, , , VV, VS, InfixAssignXor );
│ │ │ │ +
1458 DUNE_SIMD_DO( , VV, , , VV, VS, InfixAssignOr );
│ │ │ │ +
1459
│ │ │ │ +
1460 DUNE_SIMD_DO(SV, VV, VS, SV, , VS, InfixComma );
│ │ │ │ +
1461
│ │ │ │ +
1462#undef DUNE_SIMD_DO
│ │ │ │ +
1463 }
│ │ │ │ +
1464
│ │ │ │ +
1466 //
│ │ │ │ +
1467 // SIMD interface functions
│ │ │ │ +
1468 //
│ │ │ │ +
1469
│ │ │ │ +
1470 template<class V>
│ │ │ │ +
1471 void checkAutoCopy()
│ │ │ │ +
1472 {
│ │ │ │ +
1473 using RValueResult = decltype(autoCopy(lane(0, std::declval<V>())));
│ │ │ │ +
1474 static_assert(std::is_same<RValueResult, Scalar<V> >::value,
│ │ │ │ +
1475 "Result of autoCopy() must always be Scalar<V>");
│ │ │ │ +
1476
│ │ │ │ +
1477 using MutableLValueResult =
│ │ │ │ +
1478 decltype(autoCopy(lane(0, std::declval<V&>())));
│ │ │ │ +
1479 static_assert(std::is_same<MutableLValueResult, Scalar<V> >::value,
│ │ │ │ +
1480 "Result of autoCopy() must always be Scalar<V>");
│ │ │ │ +
1481
│ │ │ │ +
1482 using ConstLValueResult =
│ │ │ │ +
1483 decltype(autoCopy(lane(0, std::declval<const V&>())));
│ │ │ │ +
1484 static_assert(std::is_same<ConstLValueResult, Scalar<V> >::value,
│ │ │ │ +
1485 "Result of autoCopy() must always be Scalar<V>");
│ │ │ │ +
1486
│ │ │ │ +
1487 V vec = make123<V>();
│ │ │ │ +
1488 for(std::size_t l = 0; l < lanes(vec); ++l)
│ │ │ │ +
1489 DUNE_SIMD_CHECK(autoCopy(lane(l, vec)) == Scalar<V>(l+1));
│ │ │ │ +
1490 }
│ │ │ │ +
1491
│ │ │ │ +
1492 // may only be called for mask types
│ │ │ │ +
1493 template<class M>
│ │ │ │ +
1494 void checkBoolReductions()
│ │ │ │ +
1495 {
│ │ │ │ +
1496 M trueVec(true);
│ │ │ │ +
1497
│ │ │ │ +
1498 // mutable lvalue
│ │ │ │ +
1499 DUNE_SIMD_CHECK(allTrue (static_cast<M&>(trueVec)) == true);
│ │ │ │ +
1500 DUNE_SIMD_CHECK(anyTrue (static_cast<M&>(trueVec)) == true);
│ │ │ │ +
1501 DUNE_SIMD_CHECK(allFalse(static_cast<M&>(trueVec)) == false);
│ │ │ │ +
1502 DUNE_SIMD_CHECK(anyFalse(static_cast<M&>(trueVec)) == false);
│ │ │ │ +
1503
│ │ │ │ +
1504 // const lvalue
│ │ │ │ +
1505 DUNE_SIMD_CHECK(allTrue (static_cast<const M&>(trueVec)) == true);
│ │ │ │ +
1506 DUNE_SIMD_CHECK(anyTrue (static_cast<const M&>(trueVec)) == true);
│ │ │ │ +
1507 DUNE_SIMD_CHECK(allFalse(static_cast<const M&>(trueVec)) == false);
│ │ │ │ +
1508 DUNE_SIMD_CHECK(anyFalse(static_cast<const M&>(trueVec)) == false);
│ │ │ │ +
1509
│ │ │ │ +
1510 // rvalue
│ │ │ │ +
1511 DUNE_SIMD_CHECK(allTrue (M(true)) == true);
│ │ │ │ +
1512 DUNE_SIMD_CHECK(anyTrue (M(true)) == true);
│ │ │ │ +
1513 DUNE_SIMD_CHECK(allFalse(M(true)) == false);
│ │ │ │ +
1514 DUNE_SIMD_CHECK(anyFalse(M(true)) == false);
│ │ │ │ +
1515
│ │ │ │ +
1516 M falseVec(false);
│ │ │ │ +
1517
│ │ │ │ +
1518 // mutable lvalue
│ │ │ │ +
1519 DUNE_SIMD_CHECK(allTrue (static_cast<M&>(falseVec)) == false);
│ │ │ │ +
1520 DUNE_SIMD_CHECK(anyTrue (static_cast<M&>(falseVec)) == false);
│ │ │ │ +
1521 DUNE_SIMD_CHECK(allFalse(static_cast<M&>(falseVec)) == true);
│ │ │ │ +
1522 DUNE_SIMD_CHECK(anyFalse(static_cast<M&>(falseVec)) == true);
│ │ │ │ +
1523
│ │ │ │ +
1524 // const lvalue
│ │ │ │ +
1525 DUNE_SIMD_CHECK(allTrue (static_cast<const M&>(falseVec)) == false);
│ │ │ │ +
1526 DUNE_SIMD_CHECK(anyTrue (static_cast<const M&>(falseVec)) == false);
│ │ │ │ +
1527 DUNE_SIMD_CHECK(allFalse(static_cast<const M&>(falseVec)) == true);
│ │ │ │ +
1528 DUNE_SIMD_CHECK(anyFalse(static_cast<const M&>(falseVec)) == true);
│ │ │ │ +
1529
│ │ │ │ +
1530 // rvalue
│ │ │ │ +
1531 DUNE_SIMD_CHECK(allTrue (M(false)) == false);
│ │ │ │ +
1532 DUNE_SIMD_CHECK(anyTrue (M(false)) == false);
│ │ │ │ +
1533 DUNE_SIMD_CHECK(allFalse(M(false)) == true);
│ │ │ │ +
1534 DUNE_SIMD_CHECK(anyFalse(M(false)) == true);
│ │ │ │ +
1535
│ │ │ │ +
1536 auto mixedVec = broadcast<M>(0);
│ │ │ │ +
1537 for(std::size_t l = 0; l < lanes(mixedVec); ++l)
│ │ │ │ +
1538 lane(l, mixedVec) = (l % 2);
│ │ │ │ +
1539
│ │ │ │ +
1540 // mutable lvalue
│ │ │ │ + │ │ │ │ +
1542 (allTrue (static_cast<M&>(mixedVec)) == false);
│ │ │ │ + │ │ │ │ +
1544 (anyTrue (static_cast<M&>(mixedVec)) == (lanes<M>() > 1));
│ │ │ │ + │ │ │ │ +
1546 (allFalse(static_cast<M&>(mixedVec)) == (lanes<M>() == 1));
│ │ │ │ + │ │ │ │ +
1548 (anyFalse(static_cast<M&>(mixedVec)) == true);
│ │ │ │ +
1549
│ │ │ │ +
1550 // const lvalue
│ │ │ │ + │ │ │ │ +
1552 (allTrue (static_cast<const M&>(mixedVec)) == false);
│ │ │ │ + │ │ │ │ +
1554 (anyTrue (static_cast<const M&>(mixedVec)) == (lanes<M>() > 1));
│ │ │ │ + │ │ │ │ +
1556 (allFalse(static_cast<const M&>(mixedVec)) == (lanes<M>() == 1));
│ │ │ │ + │ │ │ │ +
1558 (anyFalse(static_cast<const M&>(mixedVec)) == true);
│ │ │ │ +
1559
│ │ │ │ +
1560 // rvalue
│ │ │ │ +
1561 DUNE_SIMD_CHECK(allTrue (M(mixedVec)) == false);
│ │ │ │ +
1562 DUNE_SIMD_CHECK(anyTrue (M(mixedVec)) == (lanes<M>() > 1));
│ │ │ │ +
1563 DUNE_SIMD_CHECK(allFalse(M(mixedVec)) == (lanes<M>() == 1));
│ │ │ │ +
1564 DUNE_SIMD_CHECK(anyFalse(M(mixedVec)) == true);
│ │ │ │ +
1565 }
│ │ │ │ +
1566
│ │ │ │ +
1567 template<class V>
│ │ │ │ +
1568 void checkCond()
│ │ │ │ +
1569 {
│ │ │ │ +
1570 using M = Mask<V>;
│ │ │ │ +
1571
│ │ │ │ +
1572 static_assert
│ │ │ │ +
1573 (std::is_same<decltype(cond(std::declval<M>(), std::declval<V>(),
│ │ │ │ +
1574 std::declval<V>())), V>::value,
│ │ │ │ +
1575 "The result of cond(M, V, V) should have exactly the type V");
│ │ │ │ +
1576
│ │ │ │ +
1577 static_assert
│ │ │ │ +
1578 (std::is_same<decltype(cond(std::declval<const M&>(),
│ │ │ │ +
1579 std::declval<const V&>(),
│ │ │ │ +
1580 std::declval<const V&>())), V>::value,
│ │ │ │ +
1581 "The result of cond(const M&, const V&, const V&) should have "
│ │ │ │ +
1582 "exactly the type V");
│ │ │ │ +
1583
│ │ │ │ +
1584 static_assert
│ │ │ │ +
1585 (std::is_same<decltype(cond(std::declval<M&>(), std::declval<V&>(),
│ │ │ │ +
1586 std::declval<V&>())), V>::value,
│ │ │ │ +
1587 "The result of cond(M&, V&, V&) should have exactly the type V");
│ │ │ │ +
1588
│ │ │ │ +
1589 V vec1 = leftVector<V>();
│ │ │ │ +
1590 V vec2 = rightVector<V>();
│ │ │ │ +
1591
│ │ │ │ +
1592 DUNE_SIMD_CHECK(allTrue(cond(M(true), vec1, vec2) == vec1));
│ │ │ │ +
1593 DUNE_SIMD_CHECK(allTrue(cond(M(false), vec1, vec2) == vec2));
│ │ │ │ +
1594
│ │ │ │ +
1595 auto mixedResult = broadcast<V>(0);
│ │ │ │ +
1596 auto mixedMask = broadcast<M>(false);
│ │ │ │ +
1597 for(std::size_t l = 0; l < lanes(mixedMask); ++l)
│ │ │ │ +
1598 {
│ │ │ │ +
1599 lane(l, mixedMask ) = (l % 2);
│ │ │ │ +
1600 lane(l, mixedResult) = lane(l, (l % 2) ? vec1 : vec2);
│ │ │ │ +
1601 }
│ │ │ │ +
1602
│ │ │ │ +
1603 DUNE_SIMD_CHECK(allTrue(cond(mixedMask, vec1, vec2) == mixedResult));
│ │ │ │ +
1604 }
│ │ │ │ +
1605
│ │ │ │ +
1606 template<class V>
│ │ │ │ +
1607 void checkBoolCond()
│ │ │ │ +
1608 {
│ │ │ │ +
1609 static_assert
│ │ │ │ +
1610 (std::is_same<decltype(cond(std::declval<bool>(), std::declval<V>(),
│ │ │ │ +
1611 std::declval<V>())), V>::value,
│ │ │ │ +
1612 "The result of cond(bool, V, V) should have exactly the type V");
│ │ │ │ +
1613
│ │ │ │ +
1614 static_assert
│ │ │ │ +
1615 (std::is_same<decltype(cond(std::declval<const bool&>(),
│ │ │ │ +
1616 std::declval<const V&>(),
│ │ │ │ +
1617 std::declval<const V&>())), V>::value,
│ │ │ │ +
1618 "The result of cond(const bool&, const V&, const V&) should have "
│ │ │ │ +
1619 "exactly the type V");
│ │ │ │ +
1620
│ │ │ │ +
1621 static_assert
│ │ │ │ +
1622 (std::is_same<decltype(cond(std::declval<bool&>(),
│ │ │ │ +
1623 std::declval<V&>(),
│ │ │ │ +
1624 std::declval<V&>())), V>::value,
│ │ │ │ +
1625 "The result of cond(bool&, V&, V&) should have exactly the type V");
│ │ │ │ +
1626
│ │ │ │ +
1627 V vec1 = leftVector<V>();
│ │ │ │ +
1628 V vec2 = rightVector<V>();
│ │ │ │ +
1629
│ │ │ │ +
1630 DUNE_SIMD_CHECK(allTrue(cond(true, vec1, vec2) == vec1));
│ │ │ │ +
1631 DUNE_SIMD_CHECK(allTrue(cond(false, vec1, vec2) == vec2));
│ │ │ │ +
1632 }
│ │ │ │ +
1633
│ │ │ │ +
1634 template<class V>
│ │ │ │ +
1635 std::enable_if_t<!Impl::LessThenComparable<Scalar<V> >::value>
│ │ │ │ +
1636 checkHorizontalMinMax() {}
│ │ │ │ +
1637
│ │ │ │ +
1638 template<class V>
│ │ │ │ +
1639 std::enable_if_t<Impl::LessThenComparable<Scalar<V> >::value>
│ │ │ │ +
1640 checkHorizontalMinMax()
│ │ │ │ +
1641 {
│ │ │ │ +
1642 static_assert
│ │ │ │ +
1643 (std::is_same<decltype(max(std::declval<V>())), Scalar<V> >::value,
│ │ │ │ +
1644 "The result of max(V) should be exactly Scalar<V>");
│ │ │ │ +
1645
│ │ │ │ +
1646 static_assert
│ │ │ │ +
1647 (std::is_same<decltype(min(std::declval<V>())), Scalar<V> >::value,
│ │ │ │ +
1648 "The result of min(V) should be exactly Scalar<V>");
│ │ │ │ +
1649
│ │ │ │ +
1650 static_assert
│ │ │ │ +
1651 (std::is_same<decltype(max(std::declval<V&>())), Scalar<V> >::value,
│ │ │ │ +
1652 "The result of max(V) should be exactly Scalar<V>");
│ │ │ │ +
1653
│ │ │ │ +
1654 static_assert
│ │ │ │ +
1655 (std::is_same<decltype(min(std::declval<V&>())), Scalar<V> >::value,
│ │ │ │ +
1656 "The result of min(V) should be exactly Scalar<V>");
│ │ │ │ +
1657
│ │ │ │ +
1658 const V vec1 = leftVector<V>();
│ │ │ │ +
1659
│ │ │ │ +
1660 DUNE_SIMD_CHECK(max(vec1) == Scalar<V>(lanes(vec1)));
│ │ │ │ +
1661 DUNE_SIMD_CHECK(min(vec1) == Scalar<V>(1));
│ │ │ │ +
1662 }
│ │ │ │ +
1663
│ │ │ │ +
1664 template<class V>
│ │ │ │ +
1665 std::enable_if_t<!Impl::LessThenComparable<Scalar<V> >::value>
│ │ │ │ +
1666 checkBinaryMinMax() {}
│ │ │ │ +
1667
│ │ │ │ +
1668 template<class V>
│ │ │ │ +
1669 std::enable_if_t<Impl::LessThenComparable<Scalar<V> >::value>
│ │ │ │ +
1670 checkBinaryMinMax()
│ │ │ │ +
1671 {
│ │ │ │ +
1672 using std::max;
│ │ │ │ +
1673 using std::min;
│ │ │ │ +
1674
│ │ │ │ +
1675 static_assert
│ │ │ │ +
1676 (std::is_same<decltype(Simd::max(std::declval<V>(),
│ │ │ │ +
1677 std::declval<V>())), V>::value,
│ │ │ │ +
1678 "The result of Simd::max(V, V) should be exactly V");
│ │ │ │ +
1679 static_assert
│ │ │ │ +
1680 (std::is_same<decltype(Simd::min(std::declval<V>(),
│ │ │ │ +
1681 std::declval<V>())), V>::value,
│ │ │ │ +
1682 "The result of Simd::min(V, V) should be exactly V");
│ │ │ │ +
1683
│ │ │ │ +
1684 static_assert
│ │ │ │ +
1685 (std::is_same<decltype(Simd::max(std::declval<V&>(),
│ │ │ │ +
1686 std::declval<V&>())), V>::value,
│ │ │ │ +
1687 "The result of Simd::max(V&, V&) should be exactly V");
│ │ │ │ +
1688 static_assert
│ │ │ │ +
1689 (std::is_same<decltype(Simd::min(std::declval<V&>(),
│ │ │ │ +
1690 std::declval<V&>())), V>::value,
│ │ │ │ +
1691 "The result of Simd::min(V&, V&) should be exactly V");
│ │ │ │ +
1692
│ │ │ │ +
1693 const V arg1 = leftVector<V>();
│ │ │ │ +
1694 const V arg2 = rightVector<V>();
│ │ │ │ +
1695
│ │ │ │ +
1696 V maxExp(Scalar<V>(0)), minExp(Scalar<V>(0));
│ │ │ │ +
1697 for(auto l : range(lanes<V>()))
│ │ │ │ +
1698 {
│ │ │ │ +
1699 lane(l, maxExp) = max(lane(l, arg1), lane(l, arg2));
│ │ │ │ +
1700 lane(l, minExp) = min(lane(l, arg1), lane(l, arg2));
│ │ │ │ +
1701 }
│ │ │ │ +
1702
│ │ │ │ +
1703 DUNE_SIMD_CHECK(allTrue(maxExp == Simd::max(arg1, arg2)));
│ │ │ │ +
1704 DUNE_SIMD_CHECK(allTrue(minExp == Simd::min(arg1, arg2)));
│ │ │ │ +
1705 }
│ │ │ │ +
1706
│ │ │ │ +
1707 template<class V>
│ │ │ │ +
1708 void checkIO()
│ │ │ │ +
1709 {
│ │ │ │ +
1710 const V vec1 = leftVector<V>();
│ │ │ │ +
1711
│ │ │ │ +
1712 std::string reference;
│ │ │ │ +
1713 {
│ │ │ │ +
1714 const char *sep = "";
│ │ │ │ +
1715 for(auto l : range(lanes(vec1)))
│ │ │ │ +
1716 {
│ │ │ │ +
1717 std::ostringstream stream;
│ │ │ │ +
1718 stream << lane(l, vec1);
│ │ │ │ +
1719
│ │ │ │ +
1720 reference += sep;
│ │ │ │ +
1721 reference += stream.str();
│ │ │ │ +
1722 sep = ", ";
│ │ │ │ +
1723 }
│ │ │ │ +
1724 }
│ │ │ │ +
1725
│ │ │ │ +
1726 {
│ │ │ │ +
1727 std::ostringstream stream;
│ │ │ │ +
1728 stream << io(vec1);
│ │ │ │ +
1729 if(lanes(vec1) == 1)
│ │ │ │ +
1730 DUNE_SIMD_CHECK(stream.str() == reference);
│ │ │ │ +
1731 else
│ │ │ │ +
1732 DUNE_SIMD_CHECK(stream.str() == "<" + reference + ">");
│ │ │ │ +
1733 }
│ │ │ │ +
1734
│ │ │ │ +
1735 {
│ │ │ │ +
1736 std::ostringstream stream;
│ │ │ │ +
1737 stream << vio(vec1);
│ │ │ │ +
1738 DUNE_SIMD_CHECK(stream.str() == "<" + reference + ">");
│ │ │ │ +
1739 }
│ │ │ │ +
1740 }
│ │ │ │ +
1741
│ │ │ │ +
1742#undef DUNE_SIMD_CHECK
│ │ │ │ +
1743
│ │ │ │ +
1744 public:
│ │ │ │ +
1807 template<class V> void checkType();
│ │ │ │ +
1808 template<class V> void checkNonOps();
│ │ │ │ +
1809 template<class V> void checkUnaryOps();
│ │ │ │ +
1810 template<class V> void checkBinaryOps();
│ │ │ │ +
1811 template<class V> void checkBinaryOpsVectorVector();
│ │ │ │ +
1812 template<class V> void checkBinaryOpsScalarVector();
│ │ │ │ +
1813 template<class V> void checkBinaryOpsVectorScalar();
│ │ │ │ +
1814 template<class V> void checkBinaryOpsProxyVector();
│ │ │ │ +
1815 template<class V> void checkBinaryOpsVectorProxy();
│ │ │ │ +
1819
│ │ │ │ +
1836 template<class V, class Rebinds,
│ │ │ │ +
1837 template<class> class RebindPrune = IsLoop,
│ │ │ │ +
1838 template<class> class RebindAccept = Dune::AlwaysTrue>
│ │ │ │ +
1839 void check() {
│ │ │ │ +
1840 // check whether the test for this type already started
│ │ │ │ +
1841 if(seen_.emplace(typeid (V)).second == false)
│ │ │ │ +
1842 {
│ │ │ │ +
1843 // type already seen, nothing to do
│ │ │ │ +
1844 return;
│ │ │ │ +
1845 }
│ │ │ │ +
1846
│ │ │ │ +
1847 // do these first so everything that appears after "Checking SIMD type
│ │ │ │ +
1848 // ..." really pertains to that type
│ │ │ │ +
1849 auto recurse = [this](auto w) {
│ │ │ │ +
1850 using W = typename decltype(w)::type;
│ │ │ │ +
1851 this->template check<W, Rebinds, RebindPrune, RebindAccept>();
│ │ │ │ +
1852 };
│ │ │ │ +
1853 checkRebindOf<V, Rebinds, RebindPrune, RebindAccept>(recurse);
│ │ │ │ +
1854
│ │ │ │ +
1855 checkType<V>();
│ │ │ │ +
1856 }
│ │ │ │ +
1857
│ │ │ │ +
1859 bool good() const
│ │ │ │ +
1860 {
│ │ │ │ +
1861 return good_;
│ │ │ │ +
1862 }
│ │ │ │ +
1863
│ │ │ │ +
1864 }; // class UnitTest
│ │ │ │ +
1865
│ │ │ │ +
1866 template<class V> void UnitTest::checkType()
│ │ │ │ +
1867 {
│ │ │ │ +
1868 static_assert(std::is_same<V, std::decay_t<V> >::value, "Simd types "
│ │ │ │ +
1869 "must not be references, and must not include "
│ │ │ │ +
1870 "cv-qualifiers");
│ │ │ │ +
1871
│ │ │ │ +
1872 log_ << "Checking SIMD type " << className<V>() << std::endl;
│ │ │ │ +
1873
│ │ │ │ +
1874 checkNonOps<V>();
│ │ │ │ +
1875 checkUnaryOps<V>();
│ │ │ │ +
1876 checkBinaryOps<V>();
│ │ │ │ +
1877 }
│ │ │ │ +
1878 template<class V> void UnitTest::checkNonOps()
│ │ │ │ +
1879 {
│ │ │ │ +
1880 constexpr auto isMask = typename std::is_same<Scalar<V>, bool>::type{};
│ │ │ │ +
1881
│ │ │ │ +
1882 checkLanes<V>();
│ │ │ │ +
1883 checkScalar<V>();
│ │ │ │ +
1884
│ │ │ │ +
1885 checkDefaultConstruct<V>();
│ │ │ │ +
1886 checkLane<V>();
│ │ │ │ +
1887 checkCopyMoveConstruct<V>();
│ │ │ │ +
1888 checkImplCast<V>();
│ │ │ │ +
1889 checkBroadcast<V>();
│ │ │ │ +
1890 if constexpr (isMask)
│ │ │ │ +
1891 this->template checkBroadcastMaskConstruct<V>();
│ │ │ │ +
1892 else
│ │ │ │ +
1893 this->template checkBroadcastVectorConstruct<V>();
│ │ │ │ +
1894 checkBracedAssign<V>();
│ │ │ │ +
1895 checkBracedBroadcastAssign<V>();
│ │ │ │ +
1896
│ │ │ │ +
1897 checkAutoCopy<V>();
│ │ │ │ +
1898 checkCond<V>();
│ │ │ │ +
1899 checkBoolCond<V>();
│ │ │ │ +
1900
│ │ │ │ +
1901 if constexpr (isMask)
│ │ │ │ +
1902 this->template checkBoolReductions<V>();
│ │ │ │ +
1903 // checkBoolReductions() is not applicable for non-masks
│ │ │ │ +
1904
│ │ │ │ +
1905 checkHorizontalMinMax<V>();
│ │ │ │ +
1906 checkBinaryMinMax<V>();
│ │ │ │ +
1907 checkIO<V>();
│ │ │ │ +
1908 }
│ │ │ │ +
1909 template<class V> void UnitTest::checkUnaryOps()
│ │ │ │ +
1910 {
│ │ │ │ +
1911 if constexpr (std::is_same_v<Scalar<V>, bool>) {
│ │ │ │ +
1912 // check mask
│ │ │ │ +
1913 auto check = [this](auto op) {
│ │ │ │ +
1914 this->template checkUnaryOpsV<V>(op);
│ │ │ │ +
1915 };
│ │ │ │ +
1916
│ │ │ │ +
1917 // postfix
│ │ │ │ +
1918 // check(OpPostfixDecrement{});
│ │ │ │ +
1919 // clang deprecation warning if bool++ is tested
│ │ │ │ +
1920 // check(OpPostfixIncrement{});
│ │ │ │ +
1921
│ │ │ │ +
1922 // prefix
│ │ │ │ +
1923 // check(OpPrefixDecrement{});
│ │ │ │ +
1924 // clang deprecation warning if ++bool is tested
│ │ │ │ +
1925 // check(OpPrefixIncrement{});
│ │ │ │ +
1926
│ │ │ │ +
1927 // check(OpPrefixPlus{});
│ │ │ │ +
1928 // check(OpPrefixMinus{});
│ │ │ │ +
1929 check(OpPrefixLogicNot{});
│ │ │ │ +
1930 // check(OpPrefixBitNot{});
│ │ │ │ +
1931 }
│ │ │ │ +
1932 else {
│ │ │ │ +
1933 // check vector
│ │ │ │ +
1934 auto check = [this](auto op) {
│ │ │ │ +
1935 this->template checkUnaryOpsV<V>(op);
│ │ │ │ +
1936 };
│ │ │ │ +
1937
│ │ │ │ +
1938 // postfix
│ │ │ │ +
1939 // check(OpPostfixDecrement{});
│ │ │ │ +
1940 // check(OpPostfixIncrement{});
│ │ │ │ +
1941
│ │ │ │ +
1942 // prefix
│ │ │ │ +
1943 // check(OpPrefixDecrement{});
│ │ │ │ +
1944 // check(OpPrefixIncrement{});
│ │ │ │ +
1945
│ │ │ │ +
1946 // check(OpPrefixPlus{});
│ │ │ │ +
1947 check(OpPrefixMinus{});
│ │ │ │ +
1948 check(OpPrefixLogicNot{});
│ │ │ │ +
1949 check(OpPrefixBitNot{});
│ │ │ │ +
1950 }
│ │ │ │ +
1951 }
│ │ │ │ +
1952 template<class V> void UnitTest::checkBinaryOps()
│ │ │ │ +
1953 {
│ │ │ │ +
1954 checkBinaryOpsVectorVector<V>();
│ │ │ │ +
1955 checkBinaryOpsScalarVector<V>();
│ │ │ │ +
1956 checkBinaryOpsVectorScalar<V>();
│ │ │ │ +
1957 checkBinaryOpsProxyVector<V>();
│ │ │ │ +
1958 checkBinaryOpsVectorProxy<V>();
│ │ │ │ +
1959 }
│ │ │ │ + │ │ │ │ +
1961 {
│ │ │ │ +
1962 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) {
│ │ │ │ +
1963 auto check = [this,op](auto t1, auto t2) {
│ │ │ │ +
1964 this->checkBinaryOpVV(t1, t2, op);
│ │ │ │ +
1965 };
│ │ │ │ +
1966 this->checkBinaryRefQual<V, V, doVV>(check);
│ │ │ │ +
1967 };
│ │ │ │ +
1968 checkBinaryOps<V>(checker);
│ │ │ │ +
1969 }
│ │ │ │ + │ │ │ │ +
1971 {
│ │ │ │ +
1972 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) {
│ │ │ │ +
1973 auto check = [this,op](auto t1, auto t2) {
│ │ │ │ +
1974 this->checkBinaryOpSV(t1, t2, op);
│ │ │ │ +
1975 };
│ │ │ │ +
1976 this->checkBinaryRefQual<Scalar<V>, V, doSV>(check);
│ │ │ │ +
1977
│ │ │ │ +
1978 auto crossCheck = [this,op](auto t1, auto t2) {
│ │ │ │ +
1979 this->checkBinaryOpVVAgainstSV(t1, t2, op);
│ │ │ │ +
1980 };
│ │ │ │ +
1981 this->checkBinaryRefQual<Scalar<V>, V, doSV && doVV>(crossCheck);
│ │ │ │ +
1982 };
│ │ │ │ +
1983 checkBinaryOps<V>(checker);
│ │ │ │ +
1984 }
│ │ │ │ + │ │ │ │ +
1986 {
│ │ │ │ +
1987 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) {
│ │ │ │ +
1988 auto check = [this,op](auto t1, auto t2) {
│ │ │ │ +
1989 this->checkBinaryOpVS(t1, t2, op);
│ │ │ │ +
1990 };
│ │ │ │ +
1991 this->checkBinaryRefQual<V, Scalar<V>, doVS>(check);
│ │ │ │ +
1992
│ │ │ │ +
1993 auto crossCheck = [this,op](auto t1, auto t2) {
│ │ │ │ +
1994 this->checkBinaryOpVVAgainstVS(t1, t2, op);
│ │ │ │ +
1995 };
│ │ │ │ +
1996 this->checkBinaryRefQual<V, Scalar<V>, doVV && doVS>(crossCheck);
│ │ │ │ +
1997 };
│ │ │ │ +
1998 checkBinaryOps<V>(checker);
│ │ │ │ +
1999 }
│ │ │ │ + │ │ │ │ +
2001 {
│ │ │ │ +
2002 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) {
│ │ │ │ +
2003 auto check = [this,op](auto t1, auto t2) {
│ │ │ │ +
2004 this->checkBinaryOpPV(t1, t2, op);
│ │ │ │ +
2005 };
│ │ │ │ +
2006 this->checkBinaryRefQual<V, V, doSV>(check);
│ │ │ │ +
2007 };
│ │ │ │ +
2008 checkBinaryOps<V>(checker);
│ │ │ │ +
2009 }
│ │ │ │ + │ │ │ │ +
2011 {
│ │ │ │ +
2012 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) {
│ │ │ │ +
2013 auto check = [this,op](auto t1, auto t2) {
│ │ │ │ +
2014 this->checkBinaryOpVP(t1, t2, op);
│ │ │ │ +
2015 };
│ │ │ │ +
2016 this->checkBinaryRefQual<V, V, doVS>(check);
│ │ │ │ +
2017 };
│ │ │ │ +
2018 checkBinaryOps<V>(checker);
│ │ │ │ +
2019 }
│ │ │ │ +
2020
│ │ │ │ +
2021 } // namespace Simd
│ │ │ │ +
2022} // namespace Dune
│ │ │ │ +
2023
│ │ │ │ +
2024#endif // DUNE_COMMON_SIMD_TEST_HH
│ │ │ │ +
A free function to provide the demangled class name of a given object or type as a string.
│ │ │ │ + │ │ │ │ + │ │ │ │ +
IO interface of the SIMD abstraction.
│ │ │ │ +
#define DUNE_SIMD_CHECK_OP(expr)
Definition: test.hh:191
│ │ │ │ +
#define DUNE_SIMD_CHECK(expr)
Definition: test.hh:186
│ │ │ │ +
#define DUNE_SIMD_DO(M1, M2, M3, V1, V2, V3, NAME)
│ │ │ │ +
Traits for type conversions and type information.
│ │ │ │ + │ │ │ │ +
Utilities for reduction like operations on ranges.
│ │ │ │ + │ │ │ │ +
static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from >, std::integral_constant< T, to >) noexcept
Definition: rangeutilities.hh:300
│ │ │ │ +
std::tuple< MetaType< T >... > TypeList
A simple type list.
Definition: typelist.hh:87
│ │ │ │ +
constexpr void forEach(Range &&range, F &&f)
Range based for loop.
Definition: hybridutilities.hh:268
│ │ │ │ +
constexpr AutonomousValue< T > autoCopy(T &&v)
Autonomous copy of an expression's value for use in auto type deduction.
Definition: typetraits.hh:642
│ │ │ │ +
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
│ │ │ │ +
bool anyTrue(const Mask &mask)
Whether any entry is true
Definition: simd/interface.hh:429
│ │ │ │ +
auto maskOr(const V1 &v1, const V2 &v2)
Logic or of masks.
Definition: simd/interface.hh:499
│ │ │ │ +
V cond(M &&mask, const V &ifTrue, const V &ifFalse)
Like the ?: operator.
Definition: simd/interface.hh:386
│ │ │ │ +
auto io(const V &v)
construct a stream inserter
Definition: io.hh:106
│ │ │ │ +
bool allTrue(const Mask &mask)
Whether all entries are true
Definition: simd/interface.hh:439
│ │ │ │ +
auto vio(const V &v)
construct a stream inserter
Definition: io.hh:90
│ │ │ │ +
auto max(const V &v1, const V &v2)
The binary maximum value over two simd objects.
Definition: simd/interface.hh:409
│ │ │ │ +
bool anyFalse(const Mask &mask)
Whether any entry is false
Definition: simd/interface.hh:449
│ │ │ │ +
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
│ │ │ │ +
bool allFalse(const Mask &mask)
Whether all entries are false
Definition: simd/interface.hh:459
│ │ │ │ +
auto maskAnd(const V1 &v1, const V2 &v2)
Logic and of masks.
Definition: simd/interface.hh:509
│ │ │ │ +
typename Overloads::ScalarType< std::decay_t< V > >::type Scalar
Element type of some SIMD type.
Definition: simd/interface.hh:235
│ │ │ │ +
auto min(const V &v1, const V &v2)
The binary minimum value over two simd objects.
Definition: simd/interface.hh:419
│ │ │ │ +
STL namespace.
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
Compute type of the result of an arithmetic operation involving two different number types.
Definition: promotiontraits.hh:27
│ │ │ │ -
decltype(std::declval< T1 >()+std::declval< T2 >()) PromotedType
Definition: promotiontraits.hh:28
│ │ │ │ -
T1 PromotedType
Definition: promotiontraits.hh:35
│ │ │ │ +
auto min(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
Definition: debugalign.hh:447
│ │ │ │ +
auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
Definition: debugalign.hh:425
│ │ │ │ +
typename Impl::RemoveEnd< EndMark, TypeList< Types... > >::type RebindList
A list of types with the final element removed.
Definition: test.hh:158
│ │ │ │ +
typename Impl::IsLoop< T >::type IsLoop
check whether a type is an instance of LoopSIMD
Definition: test.hh:162
│ │ │ │ +
Definition: loop.hh:64
│ │ │ │ +
final element marker for RebindList
Definition: test.hh:145
│ │ │ │ +
Definition: test.hh:164
│ │ │ │ +
void checkUnaryOps()
Definition: test.hh:1909
│ │ │ │ +
void checkBinaryOps()
Definition: test.hh:1952
│ │ │ │ +
void checkBinaryOpsScalarVector()
Definition: test.hh:1970
│ │ │ │ +
void checkType()
Definition: test.hh:1866
│ │ │ │ +
void check()
run unit tests for simd vector type V
Definition: test.hh:1839
│ │ │ │ +
void checkBinaryOpsVectorScalar()
Definition: test.hh:1985
│ │ │ │ +
bool good() const
whether all tests succeeded
Definition: test.hh:1859
│ │ │ │ +
void checkBinaryOpsVectorVector()
Definition: test.hh:1960
│ │ │ │ +
void checkNonOps()
Definition: test.hh:1878
│ │ │ │ +
void checkBinaryOpsVectorProxy()
Definition: test.hh:2010
│ │ │ │ +
void checkBinaryOpsProxyVector()
Definition: test.hh:2000
│ │ │ │ +
template which always yields a true value
Definition: typetraits.hh:134
│ │ │ │ +
Include file for users of the SIMD abstraction layer.
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,54 +4,2091 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -promotiontraits.hh │ │ │ │ │ + * simd │ │ │ │ │ +test.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 (C) DUNE Project contributors, see file │ │ │ │ │ + 1// SPDX-FileCopyrightInfo: Copyright (C) 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_PROMOTIONTRAITS_HH │ │ │ │ │ - 6#define DUNE_PROMOTIONTRAITS_HH │ │ │ │ │ - 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9 │ │ │ │ │ - 10namespace Dune { │ │ │ │ │ - 25 template │ │ │ │ │ -26 struct PromotionTraits │ │ │ │ │ - 27 { │ │ │ │ │ -28 typedef decltype(std::declval()+std::declval()) PromotedType; │ │ │ │ │ - 29 }; │ │ │ │ │ - 30 │ │ │ │ │ - 31 // Specialization for the case of two equal types │ │ │ │ │ - 32 // One should think that the generic template should handle this case as │ │ │ │ │ -well. │ │ │ │ │ - 33 // However, the fvectortest.cc unit test fails without it if ENABLE_GMP is │ │ │ │ │ -set. │ │ │ │ │ - 34 template │ │ │ │ │ -35 struct PromotionTraits { typedef T1 PromotedType; }; │ │ │ │ │ - 36 │ │ │ │ │ - 38} // end namespace │ │ │ │ │ - 39 │ │ │ │ │ - 40 │ │ │ │ │ - 41#endif // DUNE_PROMOTIONTRAITS_HH │ │ │ │ │ + 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ + 3#ifndef DUNE_COMMON_SIMD_TEST_HH │ │ │ │ │ + 4#define DUNE_COMMON_SIMD_TEST_HH │ │ │ │ │ + 5 │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14#include │ │ │ │ │ + 15#include │ │ │ │ │ + 16#include │ │ │ │ │ + 17#include │ │ │ │ │ + 18#include │ │ │ │ │ + 19#include │ │ │ │ │ + 20#include │ │ │ │ │ + 21#include │ │ │ │ │ + 22 │ │ │ │ │ + 23#include │ │ │ │ │ + 24#include │ │ │ │ │ + 25#include │ │ │ │ │ + 26#include │ │ │ │ │ + 27#include │ │ │ │ │ + 28#include │ │ │ │ │ + 29#include │ │ │ │ │ + 30#include │ │ │ │ │ + 31#include │ │ │ │ │ + 32 │ │ │ │ │ + 33namespace Dune { │ │ │ │ │ + 34 namespace Simd { │ │ │ │ │ + 35 │ │ │ │ │ + 36 namespace Impl { │ │ │ │ │ + 37 │ │ │ │ │ + 38 template │ │ │ │ │ + 39 struct LessThenComparable : std::false_type {}; │ │ │ │ │ + 40 template │ │ │ │ │ + 41 struct LessThenComparable() │ │ │ │ │ + 42 < std::declval())> > : │ │ │ │ │ + 43 std::true_type │ │ │ │ │ + 44 {}; │ │ │ │ │ + 45 │ │ │ │ │ + 46 template │ │ │ │ │ + 47 struct CopyConstHelper │ │ │ │ │ + 48 { │ │ │ │ │ + 49 using type = Dst; │ │ │ │ │ + 50 }; │ │ │ │ │ + 51 template │ │ │ │ │ + 52 struct CopyConstHelper │ │ │ │ │ + 53 { │ │ │ │ │ + 54 using type = std::add_const_t; │ │ │ │ │ + 55 }; │ │ │ │ │ + 56 │ │ │ │ │ + 57 template │ │ │ │ │ + 58 struct CopyVolatileHelper │ │ │ │ │ + 59 { │ │ │ │ │ + 60 using type = Dst; │ │ │ │ │ + 61 }; │ │ │ │ │ + 62 template │ │ │ │ │ + 63 struct CopyVolatileHelper │ │ │ │ │ + 64 { │ │ │ │ │ + 65 using type = std::add_volatile_t; │ │ │ │ │ + 66 }; │ │ │ │ │ + 67 │ │ │ │ │ + 68 template │ │ │ │ │ + 69 struct CopyReferenceHelper │ │ │ │ │ + 70 { │ │ │ │ │ + 71 using type = Dst; │ │ │ │ │ + 72 }; │ │ │ │ │ + 73 template │ │ │ │ │ + 74 struct CopyReferenceHelper │ │ │ │ │ + 75 { │ │ │ │ │ + 76 using type = std::add_lvalue_reference_t; │ │ │ │ │ + 77 }; │ │ │ │ │ + 78 │ │ │ │ │ + 79 template │ │ │ │ │ + 80 struct CopyReferenceHelper │ │ │ │ │ + 81 { │ │ │ │ │ + 82 using type = std::add_rvalue_reference_t; │ │ │ │ │ + 83 }; │ │ │ │ │ + 84 │ │ │ │ │ + 85 template │ │ │ │ │ + 86 using CopyRefQual = typename CopyReferenceHelper< │ │ │ │ │ + 87 typename CopyVolatileHelper< │ │ │ │ │ + 88 typename CopyConstHelper< │ │ │ │ │ + 89 std::decay_t, │ │ │ │ │ + 90 std::remove_reference_t │ │ │ │ │ + 91 >::type, │ │ │ │ │ + 92 std::remove_reference_t │ │ │ │ │ + 93 >::type, │ │ │ │ │ + 94 Src │ │ │ │ │ + 95 >::type; │ │ │ │ │ + 96 │ │ │ │ │ + 97 template::value - 1> > │ │ │ │ │ + 100 struct RemoveEnd; │ │ │ │ │ + 101 template │ │ │ │ │ + 102 struct RemoveEnd> │ │ │ │ │ + 103 { │ │ │ │ │ + 104 using Back = TypeListEntry_t::value - 1, Types>; │ │ │ │ │ + 105 static_assert(std::is_same::value, │ │ │ │ │ + 106 "TypeList not terminated by proper EndMark"); │ │ │ │ │ + 107 using type = TypeList...>; │ │ │ │ │ + 108 }; │ │ │ │ │ + 109 │ │ │ │ │ + 110 template │ │ │ │ │ + 111 struct TypeInList; │ │ │ │ │ + 112 │ │ │ │ │ + 113 template │ │ │ │ │ + 114 struct TypeInList > : std::false_type {}; │ │ │ │ │ + 115 │ │ │ │ │ + 116 template │ │ │ │ │ + 117 struct TypeInList > : std::true_type {}; │ │ │ │ │ + 118 │ │ │ │ │ + 119 template │ │ │ │ │ + 120 struct TypeInList, │ │ │ │ │ + 121 std::enable_if_t::value> > : │ │ │ │ │ + 122 TypeInList >::type │ │ │ │ │ + 123 {}; │ │ │ │ │ + 124 │ │ │ │ │ + 125 template │ │ │ │ │ + 126 struct IsLoop : std::false_type {}; │ │ │ │ │ + 127 template │ │ │ │ │ + 128 struct IsLoop > : std::true_type {}; │ │ │ │ │ + 129 │ │ │ │ │ + 130 // used inside static_assert to trick the compiler into printing a list │ │ │ │ │ + 131 // of types: │ │ │ │ │ + 132 // │ │ │ │ │ + 133 // static_assert(debugTypes(Std::bool_constant{}), "msg"); │ │ │ │ │ + 134 // │ │ │ │ │ + 135 // Should include what the type `V` expands to in the error message. │ │ │ │ │ + 136 template │ │ │ │ │ + 137 constexpr bool debugTypes(std::true_type) { return true; } │ │ │ │ │ + 138 template │ │ │ │ │ + 139 [[deprecated]] │ │ │ │ │ + 140 constexpr bool debugTypes(std::false_type) { return false; } │ │ │ │ │ + 141 │ │ │ │ │ + 142 } // namespace Impl │ │ │ │ │ + 143 │ │ │ │ │ +145 struct EndMark {}; │ │ │ │ │ + 147 │ │ │ │ │ + 156 template │ │ │ │ │ +157 using RebindList = │ │ │ │ │ + 158 typename Impl::RemoveEnd >::type; │ │ │ │ │ + 159 │ │ │ │ │ + 161 template │ │ │ │ │ +162 using IsLoop = typename Impl::IsLoop::type; │ │ │ │ │ + 163 │ │ │ │ │ +164 class UnitTest { │ │ │ │ │ + 165 bool good_ = true; │ │ │ │ │ + 166 std::ostream &log_ = std::cerr; │ │ │ │ │ + 167 // records the types for which checks have started running to avoid │ │ │ │ │ + 168 // infinite recursion │ │ │ │ │ + 169 std::unordered_set seen_; │ │ │ │ │ + 170 │ │ │ │ │ + 172 // │ │ │ │ │ + 173 // Helper functions │ │ │ │ │ + 174 // │ │ │ │ │ + 175 │ │ │ │ │ + 176 void complain(const char *file, int line, const char *func, │ │ │ │ │ + 177 const char *expr); │ │ │ │ │ + 178 │ │ │ │ │ + 179 void complain(const char *file, int line, const char *func, │ │ │ │ │ + 180 const std::string &opname, const char *expr); │ │ │ │ │ + 181 │ │ │ │ │ + 182 // This macro is defined only within this file, do not use anywhere │ │ │ │ │ + 183 // else. Doing the actual printing in an external function dramatically │ │ │ │ │ + 184 // reduces memory use during compilation. Defined in such a way that │ │ │ │ │ + 185 // the call will only happen for failed checks. │ │ │ │ │ +186#define DUNE_SIMD_CHECK(expr) \ │ │ │ │ │ + 187 ((expr) ? void() : complain(__FILE__, __LINE__, __func__, #expr)) │ │ │ │ │ + 188 │ │ │ │ │ + 189 // the function using this macro must define a way to compute the │ │ │ │ │ + 190 // operator name in DUNE_SIMD_OPNAME │ │ │ │ │ +191#define DUNE_SIMD_CHECK_OP(expr) \ │ │ │ │ │ + 192 ((expr) ? void() : complain(__FILE__, __LINE__, __func__, \ │ │ │ │ │ + 193 DUNE_SIMD_OPNAME, #expr)) │ │ │ │ │ + 194 │ │ │ │ │ + 195 // "cast" into a prvalue │ │ │ │ │ + 196 template │ │ │ │ │ + 197 static std::decay_t prvalue(T &&t) │ │ │ │ │ + 198 { │ │ │ │ │ + 199 return std::forward(t); │ │ │ │ │ + 200 } │ │ │ │ │ + 201 │ │ │ │ │ + 202 // whether the vector is 42 in all lanes │ │ │ │ │ + 203 template │ │ │ │ │ + 204 static bool is42(const V &v) │ │ │ │ │ + 205 { │ │ │ │ │ + 206 bool good = true; │ │ │ │ │ + 207 │ │ │ │ │ + 208 for(std::size_t l = 0; l < lanes(v); ++l) │ │ │ │ │ + 209 // need to cast in case we have a mask type │ │ │ │ │ + 210 good &= (lane(l, v) == Scalar(42)); │ │ │ │ │ + 211 │ │ │ │ │ + 212 return good; │ │ │ │ │ + 213 } │ │ │ │ │ + 214 │ │ │ │ │ + 215 // make a vector that contains the sequence { 1, 2, ... } │ │ │ │ │ + 216 template │ │ │ │ │ + 217 static V make123() │ │ │ │ │ + 218 { │ │ │ │ │ + 219 // initialize to avoid undefined behaviour if assigning to lane() │ │ │ │ │ + 220 // involves lvalue-to-rvalue conversions, e.g. due to bitmask │ │ │ │ │ + 221 // operations. Avoid using broadcast() for initialization to avoid │ │ │ │ │ + 222 // test interdependencies. │ │ │ │ │ + 223 V vec(Scalar(0)); │ │ │ │ │ + 224 for(std::size_t l = 0; l < lanes(vec); ++l) │ │ │ │ │ + 225 lane(l, vec) = l + 1; │ │ │ │ │ + 226 return vec; │ │ │ │ │ + 227 } │ │ │ │ │ + 228 │ │ │ │ │ + 229 // whether the vector contains the sequence { 1, 2, ... } │ │ │ │ │ + 230 template │ │ │ │ │ + 231 static bool is123(const V &v) │ │ │ │ │ + 232 { │ │ │ │ │ + 233 bool good = true; │ │ │ │ │ + 234 │ │ │ │ │ + 235 for(std::size_t l = 0; l < lanes(v); ++l) │ │ │ │ │ + 236 // need to cast in case we have a mask type │ │ │ │ │ + 237 good &= (lane(l, v) == Scalar(l+1)); │ │ │ │ │ + 238 │ │ │ │ │ + 239 return good; │ │ │ │ │ + 240 } │ │ │ │ │ + 241 │ │ │ │ │ + 242 template │ │ │ │ │ + 243 static V leftVector() │ │ │ │ │ + 244 { │ │ │ │ │ + 245 // Avoid using broadcast() for initialization to avoid test │ │ │ │ │ + 246 // interdependencies. │ │ │ │ │ + 247 V res(Scalar(0)); │ │ │ │ │ + 248 for(std::size_t l = 0; l < lanes(res); ++l) │ │ │ │ │ + 249 lane(l, res) = Scalar(l+1); │ │ │ │ │ + 250 return res; │ │ │ │ │ + 251 } │ │ │ │ │ + 252 │ │ │ │ │ + 253 template │ │ │ │ │ + 254 static V rightVector() │ │ │ │ │ + 255 { │ │ │ │ │ + 256 // Avoid using broadcast() for initialization to avoid test │ │ │ │ │ + 257 // interdependencies. │ │ │ │ │ + 258 V res(Scalar(0)); │ │ │ │ │ + 259 for(std::size_t l = 0; l < lanes(res); ++l) │ │ │ │ │ + 260 // do not exceed number of bits in char (for shifts) │ │ │ │ │ + 261 // avoid 0 (for / and %) │ │ │ │ │ + 262 lane(l, res) = Scalar((l)%7+1); │ │ │ │ │ + 263 return res; │ │ │ │ │ + 264 } │ │ │ │ │ + 265 │ │ │ │ │ + 266 template │ │ │ │ │ + 267 static T leftScalar() │ │ │ │ │ + 268 { │ │ │ │ │ + 269 return T(42); │ │ │ │ │ + 270 } │ │ │ │ │ + 271 │ │ │ │ │ + 272 template │ │ │ │ │ + 273 static T rightScalar() │ │ │ │ │ + 274 { │ │ │ │ │ + 275 // do not exceed number of bits in char (for shifts) │ │ │ │ │ + 276 // avoid 0 (for / and %) │ │ │ │ │ + 277 return T(5); │ │ │ │ │ + 278 } │ │ │ │ │ + 279 │ │ │ │ │ + 280 template │ │ │ │ │ + 281 using CopyRefQual = Impl::CopyRefQual; │ │ │ │ │ + 282 │ │ │ │ │ + 283 // test whether the Op supports the operation on scalars. We do not use │ │ │ │ │ + 284 // `lane()` to obtain the scalars, because that might return a proxy │ │ │ │ │ + 285 // object, and we are interested in what exactly the scalar type can do, │ │ │ │ │ + 286 // no a proxy that might have more overloads than needed. In addition, │ │ │ │ │ + 287 // `lane()` may not preserve `const` and reference qualifiers. │ │ │ │ │ + 288 template │ │ │ │ │ + 289 using ScalarResult = │ │ │ │ │ + 290 decltype(std::declval(). │ │ │ │ │ + 291 scalar(std::declval, │ │ │ │ │ + 292 Vectors> >()...)); │ │ │ │ │ + 293 │ │ │ │ │ + 295 // │ │ │ │ │ + 296 // Check associated types │ │ │ │ │ + 297 // │ │ │ │ │ + 298 │ │ │ │ │ + 299 template │ │ │ │ │ + 300 void checkScalar() │ │ │ │ │ + 301 { │ │ │ │ │ + 302 // check that the type Scalar exists │ │ │ │ │ + 303 using T = Scalar; │ │ │ │ │ + 304 │ │ │ │ │ + 305 static_assert(std::is_same >::value, "Scalar types " │ │ │ │ │ + 306 "must not be references, and must not include " │ │ │ │ │ + 307 "cv-qualifiers"); │ │ │ │ │ + 308 [[maybe_unused]] T a{}; │ │ │ │ │ + 309 } │ │ │ │ │ + 310 │ │ │ │ │ + 311 template │ │ │ │ │ + 312 [[deprecated("Warning: please include bool in the Rebinds for " │ │ │ │ │ + 313 "simd type V, as Masks are not checked otherwise.")]] │ │ │ │ │ + 314 void warnMissingMaskRebind(std::true_type) {} │ │ │ │ │ + 315 template │ │ │ │ │ + 316 void warnMissingMaskRebind(std::false_type) {} │ │ │ │ │ + 317 │ │ │ │ │ + 318 template class RebindPrune, │ │ │ │ │ + 319 template class RebindAccept, class Recurse> │ │ │ │ │ + 320 void checkRebindOf(Recurse recurse) │ │ │ │ │ + 321 { │ │ │ │ │ + 322 Hybrid::forEach(Rebinds{}, [this,recurse](auto target) { │ │ │ │ │ + 323 using T = typename decltype(target)::type; │ │ │ │ │ + 324 │ │ │ │ │ + 325 // check that the rebound type exists │ │ │ │ │ + 326 using W = Rebind; │ │ │ │ │ + 327 log_ << "Type " << className() << " rebound to " │ │ │ │ │ + 328 << className() << " is " << className() << std::endl; │ │ │ │ │ + 329 │ │ │ │ │ + 330 static_assert(std::is_same >::value, "Rebound " │ │ │ │ │ + 331 "types must not be references, and must not include " │ │ │ │ │ + 332 "cv-qualifiers"); │ │ │ │ │ + 333 static_assert(lanes() == lanes(), "Rebound types must have " │ │ │ │ │ + 334 "the same number of lanes as the original vector " │ │ │ │ │ + 335 "types"); │ │ │ │ │ + 336 static_assert(std::is_same >::value, "Rebound types " │ │ │ │ │ + 337 "must have the bound-to scalar type"); │ │ │ │ │ + 338 │ │ │ │ │ + 339 if constexpr (RebindPrune{}) { │ │ │ │ │ + 340 log_ << "Pruning check of Simd type " << className() │ │ │ │ │ + 341 << std::endl; │ │ │ │ │ + 342 } │ │ │ │ │ + 343 else { │ │ │ │ │ + 344 using Impl::debugTypes; │ │ │ │ │ + 345 static_assert(debugTypes(RebindAccept{}), │ │ │ │ │ + 346 "Rebind is W, but that is not accepted " │ │ │ │ │ + 347 "by RebindAccept"); │ │ │ │ │ + 348 recurse(MetaType{}); │ │ │ │ │ + 349 } │ │ │ │ │ + 350 }); │ │ │ │ │ + 351 │ │ │ │ │ + 352 static_assert(std::is_same, V>, V>::value, "A type " │ │ │ │ │ + 353 "rebound to its own scalar type must be the same type " │ │ │ │ │ + 354 "as the original type"); │ │ │ │ │ + 355 static_assert(std::is_same, Mask >::value, "A type " │ │ │ │ │ + 356 "rebound to bool must be the mask type for that type"); │ │ │ │ │ + 357 │ │ │ │ │ + 358 constexpr bool hasBool = Impl::TypeInList::value; │ │ │ │ │ + 359 warnMissingMaskRebind(Std::bool_constant{}); │ │ │ │ │ + 360 } │ │ │ │ │ + 361 │ │ │ │ │ + 363 // │ │ │ │ │ + 364 // Fundamental checks │ │ │ │ │ + 365 // │ │ │ │ │ + 366 │ │ │ │ │ + 367 template │ │ │ │ │ + 368 void checkLanes() │ │ │ │ │ + 369 { │ │ │ │ │ + 370 // check lanes │ │ │ │ │ + 371 static_assert(std::is_same())>::value, │ │ │ │ │ + 372 "return type of lanes() should be std::size_t"); │ │ │ │ │ + 373 static_assert(std::is_same::value, │ │ │ │ │ + 374 "return type of lanes(V{}) should be std::size_t"); │ │ │ │ │ + 375 │ │ │ │ │ + 376 // the result of lanes() must be constexpr │ │ │ │ │ + 377 [[maybe_unused]] constexpr auto size = lanes(); │ │ │ │ │ + 378 // but the result of lanes(vec) does not need to be constexpr │ │ │ │ │ + 379 DUNE_SIMD_CHECK(lanes() == lanes(V{})); │ │ │ │ │ + 380 } │ │ │ │ │ + 381 │ │ │ │ │ + 382 template │ │ │ │ │ + 383 void checkDefaultConstruct() │ │ │ │ │ + 384 { │ │ │ │ │ + 385 { [[maybe_unused]] V vec; } │ │ │ │ │ + 386 { [[maybe_unused]] V vec{}; } │ │ │ │ │ + 387 { [[maybe_unused]] V vec = {}; } │ │ │ │ │ + 388 } │ │ │ │ │ + 389 │ │ │ │ │ + 390 template │ │ │ │ │ + 391 void checkLane() │ │ │ │ │ + 392 { │ │ │ │ │ + 393 // Avoid using broadcast() for initialization to avoid test │ │ │ │ │ + 394 // interdependencies. │ │ │ │ │ + 395 V vec(Scalar(0)); │ │ │ │ │ + 396 // check lane() on mutable lvalues │ │ │ │ │ + 397 for(std::size_t l = 0; l < lanes(vec); ++l) │ │ │ │ │ + 398 lane(l, vec) = l + 1; │ │ │ │ │ + 399 for(std::size_t l = 0; l < lanes(vec); ++l) │ │ │ │ │ + 400 DUNE_SIMD_CHECK(lane(l, vec) == Scalar(l + 1)); │ │ │ │ │ + 401 using MLRes = decltype(lane(0, vec)); │ │ │ │ │ + 402 static_assert(std::is_same&>::value || │ │ │ │ │ + 403 std::is_same >::value, │ │ │ │ │ + 404 "Result of lane() on a mutable lvalue vector must " │ │ │ │ │ + 405 "either be a mutable reference to a scalar of that " │ │ │ │ │ + 406 "vector or a proxy object (which itself may not be a " │ │ │ │ │ + 407 "reference nor const)."); │ │ │ │ │ + 408 │ │ │ │ │ + 409 // check lane() on const lvalues │ │ │ │ │ + 410 const V &vec2 = vec; │ │ │ │ │ + 411 for(std::size_t l = 0; l < lanes(vec); ++l) │ │ │ │ │ + 412 DUNE_SIMD_CHECK(lane(l, vec2) == Scalar(l + 1)); │ │ │ │ │ + 413 using CLRes = decltype(lane(0, vec2)); │ │ │ │ │ + 414 static_assert(std::is_same&>::value || │ │ │ │ │ + 415 std::is_same >::value, │ │ │ │ │ + 416 "Result of lane() on a const lvalue vector must " │ │ │ │ │ + 417 "either be a const lvalue reference to a scalar of that " │ │ │ │ │ + 418 "vector or a proxy object (which itself may not be a " │ │ │ │ │ + 419 "reference nor const)."); │ │ │ │ │ + 420 static_assert(!std::is_assignable >::value, │ │ │ │ │ + 421 "Result of lane() on a const lvalue vector must not be " │ │ │ │ │ + 422 "assignable from a scalar."); │ │ │ │ │ + 423 │ │ │ │ │ + 424 // check lane() on rvalues │ │ │ │ │ + 425 for(std::size_t l = 0; l < lanes(vec); ++l) │ │ │ │ │ + 426 DUNE_SIMD_CHECK(lane(l, prvalue(vec)) == Scalar(l + 1)); │ │ │ │ │ + 427 using RRes = decltype(lane(0, prvalue(vec))); │ │ │ │ │ + 428 // TODO: do we really want to allow Scalar&& here? If we allow it, │ │ │ │ │ + 429 // then `auto &&res = lane(0, vec*vec);` creates a dangling reference, │ │ │ │ │ + 430 // and the scalar (and even the vector types) are small enough to be │ │ │ │ │ + 431 // passed in registers anyway. On the other hand, the only comparable │ │ │ │ │ + 432 // accessor function in the standard library that I can think of is │ │ │ │ │ + 433 // std::get(), and that does return an rvalue reference in this │ │ │ │ │ + 434 // situation. However, that cannot assume anything about the size of │ │ │ │ │ + 435 // the returned types. │ │ │ │ │ + 436 static_assert(std::is_same >::value || │ │ │ │ │ + 437 std::is_same&&>::value, │ │ │ │ │ + 438 "Result of lane() on a rvalue vector V must be " │ │ │ │ │ + 439 "Scalar or Scalar&&."); │ │ │ │ │ + 440 // Can't assert non-assignable, fails for any typical class, │ │ │ │ │ + 441 // e.g. std::complex<>. Would need to return const Scalar or const │ │ │ │ │ + 442 // Scalar&&, which would inhibit moving from the return value. │ │ │ │ │ + 443 // static_assert(!std::is_assignable >::value, │ │ │ │ │ + 444 // "Result of lane() on a rvalue vector must not be " │ │ │ │ │ + 445 // "assignable from a scalar."); │ │ │ │ │ + 446 } │ │ │ │ │ + 447 │ │ │ │ │ + 448 // check non-default constructors │ │ │ │ │ + 449 template │ │ │ │ │ + 450 void checkCopyMoveConstruct() │ │ │ │ │ + 451 { │ │ │ │ │ + 452 // elided copy/move constructors │ │ │ │ │ + 453 { V vec (make123()); DUNE_SIMD_CHECK(is123(vec)); } │ │ │ │ │ + 454 { V vec = make123() ; DUNE_SIMD_CHECK(is123(vec)); } │ │ │ │ │ + 455 { V vec {make123()}; DUNE_SIMD_CHECK(is123(vec)); } │ │ │ │ │ + 456 { V vec = {make123()}; DUNE_SIMD_CHECK(is123(vec)); } │ │ │ │ │ + 457 │ │ │ │ │ + 458 // copy constructors │ │ │ │ │ + 459 { V ref(make123()); V vec (ref); │ │ │ │ │ + 460 DUNE_SIMD_CHECK(is123(vec)); DUNE_SIMD_CHECK(is123(ref)); } │ │ │ │ │ + 461 { V ref(make123()); V vec = ref ; │ │ │ │ │ + 462 DUNE_SIMD_CHECK(is123(vec)); DUNE_SIMD_CHECK(is123(ref)); } │ │ │ │ │ + 463 { V ref(make123()); V vec {ref}; │ │ │ │ │ + 464 DUNE_SIMD_CHECK(is123(vec)); DUNE_SIMD_CHECK(is123(ref)); } │ │ │ │ │ + 465 { V ref(make123()); V vec = {ref}; │ │ │ │ │ + 466 DUNE_SIMD_CHECK(is123(vec)); DUNE_SIMD_CHECK(is123(ref)); } │ │ │ │ │ + 467 { const V ref(make123()); V vec (ref); │ │ │ │ │ + 468 DUNE_SIMD_CHECK(is123(vec)); } │ │ │ │ │ + 469 { const V ref(make123()); V vec = ref ; │ │ │ │ │ + 470 DUNE_SIMD_CHECK(is123(vec)); } │ │ │ │ │ + 471 { const V ref(make123()); V vec {ref}; │ │ │ │ │ + 472 DUNE_SIMD_CHECK(is123(vec)); } │ │ │ │ │ + 473 { const V ref(make123()); V vec = {ref}; │ │ │ │ │ + 474 DUNE_SIMD_CHECK(is123(vec)); } │ │ │ │ │ + 475 │ │ │ │ │ + 476 // move constructors │ │ │ │ │ + 477 { V ref(make123()); V vec (std::move(ref)); │ │ │ │ │ + 478 DUNE_SIMD_CHECK(is123(vec)); } │ │ │ │ │ + 479 { V ref(make123()); V vec = std::move(ref) ; │ │ │ │ │ + 480 DUNE_SIMD_CHECK(is123(vec)); } │ │ │ │ │ + 481 { V ref(make123()); V vec {std::move(ref)}; │ │ │ │ │ + 482 DUNE_SIMD_CHECK(is123(vec)); } │ │ │ │ │ + 483 { V ref(make123()); V vec = {std::move(ref)}; │ │ │ │ │ + 484 DUNE_SIMD_CHECK(is123(vec)); } │ │ │ │ │ + 485 } │ │ │ │ │ + 486 │ │ │ │ │ + 487 template │ │ │ │ │ + 488 void checkBroadcastVectorConstruct() │ │ │ │ │ + 489 { │ │ │ │ │ + 490 // broadcast copy constructors │ │ │ │ │ + 491 { Scalar ref = 42; V vec (ref); │ │ │ │ │ + 492 DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar(42)); } │ │ │ │ │ + 493 { Scalar ref = 42; V vec = ref ; │ │ │ │ │ + 494 DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar(42)); } │ │ │ │ │ + 495 // { Scalar ref = 42; V vec {ref}; │ │ │ │ │ + 496 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar(42)); } │ │ │ │ │ + 497 // { Scalar ref = 42; V vec = {ref}; │ │ │ │ │ + 498 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar(42)); } │ │ │ │ │ + 499 { const Scalar ref = 42; V vec (ref); │ │ │ │ │ + 500 DUNE_SIMD_CHECK(is42(vec)); } │ │ │ │ │ + 501 { const Scalar ref = 42; V vec = ref ; │ │ │ │ │ + 502 DUNE_SIMD_CHECK(is42(vec)); } │ │ │ │ │ + 503 // { const Scalar ref = 42; V vec {ref}; │ │ │ │ │ + 504 // DUNE_SIMD_CHECK(is42(vec)); } │ │ │ │ │ + 505 // { const Scalar ref = 42; V vec = {ref}; │ │ │ │ │ + 506 // DUNE_SIMD_CHECK(is42(vec)); } │ │ │ │ │ + 507 │ │ │ │ │ + 508 // broadcast move constructors │ │ │ │ │ + 509 { Scalar ref = 42; V vec (std::move(ref)); │ │ │ │ │ + 510 DUNE_SIMD_CHECK(is42(vec)); } │ │ │ │ │ + 511 { Scalar ref = 42; V vec = std::move(ref) ; │ │ │ │ │ + 512 DUNE_SIMD_CHECK(is42(vec)); } │ │ │ │ │ + 513 // { Scalar ref = 42; V vec {std::move(ref)}; │ │ │ │ │ + 514 // DUNE_SIMD_CHECK(is42(vec)); } │ │ │ │ │ + 515 // { Scalar ref = 42; V vec = {std::move(ref)}; │ │ │ │ │ + 516 // DUNE_SIMD_CHECK(is42(vec)); } │ │ │ │ │ + 517 } │ │ │ │ │ + 518 │ │ │ │ │ + 519 template │ │ │ │ │ + 520 void checkBroadcastMaskConstruct() │ │ │ │ │ + 521 { │ │ │ │ │ + 522 // broadcast copy constructors │ │ │ │ │ + 523 { Scalar ref = 42; V vec (ref); │ │ │ │ │ + 524 DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar(42)); } │ │ │ │ │ + 525 // { Scalar ref = 42; V vec = ref ; │ │ │ │ │ + 526 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar(42)); } │ │ │ │ │ + 527 { Scalar ref = 42; V vec {ref}; │ │ │ │ │ + 528 DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar(42)); } │ │ │ │ │ + 529 // { Scalar ref = 42; V vec = {ref}; │ │ │ │ │ + 530 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar(42)); } │ │ │ │ │ + 531 { const Scalar ref = 42; V vec (ref); │ │ │ │ │ + 532 DUNE_SIMD_CHECK(is42(vec)); } │ │ │ │ │ + 533 // { const Scalar ref = 42; V vec = ref ; │ │ │ │ │ + 534 // DUNE_SIMD_CHECK(is42(vec)); } │ │ │ │ │ + 535 { const Scalar ref = 42; V vec {ref}; │ │ │ │ │ + 536 DUNE_SIMD_CHECK(is42(vec)); } │ │ │ │ │ + 537 // { const Scalar ref = 42; V vec = {ref}; │ │ │ │ │ + 538 // DUNE_SIMD_CHECK(is42(vec)); } │ │ │ │ │ + 539 │ │ │ │ │ + 540 // broadcast move constructors │ │ │ │ │ + 541 { Scalar ref = 42; V vec (std::move(ref)); │ │ │ │ │ + 542 DUNE_SIMD_CHECK(is42(vec)); } │ │ │ │ │ + 543 // { Scalar ref = 42; V vec = std::move(ref) ; │ │ │ │ │ + 544 // DUNE_SIMD_CHECK(is42(vec)); } │ │ │ │ │ + 545 { Scalar ref = 42; V vec {std::move(ref)}; │ │ │ │ │ + 546 DUNE_SIMD_CHECK(is42(vec)); } │ │ │ │ │ + 547 // { Scalar ref = 42; V vec = {std::move(ref)}; │ │ │ │ │ + 548 // DUNE_SIMD_CHECK(is42(vec)); } │ │ │ │ │ + 549 } │ │ │ │ │ + 550 │ │ │ │ │ + 551 // check the implCast function │ │ │ │ │ + 552 template │ │ │ │ │ + 553 void checkImplCast() │ │ │ │ │ + 554 { │ │ │ │ │ + 555 { // lvalue arg │ │ │ │ │ + 556 FromV fromVec = make123(); │ │ │ │ │ + 557 auto toVec = implCast(fromVec); │ │ │ │ │ + 558 static_assert(std::is_same::value, │ │ │ │ │ + 559 "Unexpected result type for implCast(FromV&)"); │ │ │ │ │ + 560 DUNE_SIMD_CHECK(is123(fromVec)); │ │ │ │ │ + 561 DUNE_SIMD_CHECK(is123(toVec)); │ │ │ │ │ + 562 } │ │ │ │ │ + 563 │ │ │ │ │ + 564 { // const lvalue arg │ │ │ │ │ + 565 const FromV fromVec = make123(); │ │ │ │ │ + 566 auto toVec = implCast(fromVec); │ │ │ │ │ + 567 static_assert(std::is_same::value, │ │ │ │ │ + 568 "Unexpected result type for implCast(const " │ │ │ │ │ + 569 "FromV&)"); │ │ │ │ │ + 570 DUNE_SIMD_CHECK(is123(toVec)); │ │ │ │ │ + 571 } │ │ │ │ │ + 572 │ │ │ │ │ + 573 { // rvalue arg │ │ │ │ │ + 574 auto toVec = implCast(make123()); │ │ │ │ │ + 575 static_assert(std::is_same::value, │ │ │ │ │ + 576 "Unexpected result type for implCast(FromV&&)"); │ │ │ │ │ + 577 DUNE_SIMD_CHECK(is123(toVec)); │ │ │ │ │ + 578 } │ │ │ │ │ + 579 } │ │ │ │ │ + 580 │ │ │ │ │ + 581 // check the implCast function │ │ │ │ │ + 582 template │ │ │ │ │ + 583 void checkImplCast() │ │ │ │ │ + 584 { │ │ │ │ │ + 585 // check against LoopSIMD │ │ │ │ │ + 586 using LoopV = Dune::LoopSIMD, lanes()>; │ │ │ │ │ + 587 │ │ │ │ │ + 588 checkImplCast(); │ │ │ │ │ + 589 checkImplCast(); │ │ │ │ │ + 590 checkImplCast(); │ │ │ │ │ + 591 } │ │ │ │ │ + 592 │ │ │ │ │ + 593 // check the broadcast function │ │ │ │ │ + 594 template │ │ │ │ │ + 595 void checkBroadcast() │ │ │ │ │ + 596 { │ │ │ │ │ + 597 // broadcast function │ │ │ │ │ + 598 { // lvalue arg │ │ │ │ │ + 599 Scalar ref = 42; │ │ │ │ │ + 600 auto vec = broadcast(ref); │ │ │ │ │ + 601 static_assert(std::is_same::value, │ │ │ │ │ + 602 "Unexpected result type for broadcast()"); │ │ │ │ │ + 603 DUNE_SIMD_CHECK(is42(vec)); │ │ │ │ │ + 604 DUNE_SIMD_CHECK(ref == Scalar(42)); │ │ │ │ │ + 605 } │ │ │ │ │ + 606 │ │ │ │ │ + 607 { // const lvalue arg │ │ │ │ │ + 608 const Scalar ref = 42; │ │ │ │ │ + 609 auto vec = broadcast(ref); │ │ │ │ │ + 610 static_assert(std::is_same::value, │ │ │ │ │ + 611 "Unexpected result type for broadcast()"); │ │ │ │ │ + 612 DUNE_SIMD_CHECK(is42(vec)); │ │ │ │ │ + 613 } │ │ │ │ │ + 614 │ │ │ │ │ + 615 { // rvalue arg │ │ │ │ │ + 616 auto vec = broadcast(Scalar(42)); │ │ │ │ │ + 617 static_assert(std::is_same::value, │ │ │ │ │ + 618 "Unexpected result type for broadcast()"); │ │ │ │ │ + 619 DUNE_SIMD_CHECK(is42(vec)); │ │ │ │ │ + 620 } │ │ │ │ │ + 621 │ │ │ │ │ + 622 { // int arg │ │ │ │ │ + 623 auto vec = broadcast(42); │ │ │ │ │ + 624 static_assert(std::is_same::value, │ │ │ │ │ + 625 "Unexpected result type for broadcast()"); │ │ │ │ │ + 626 DUNE_SIMD_CHECK(is42(vec)); │ │ │ │ │ + 627 } │ │ │ │ │ + 628 │ │ │ │ │ + 629 { // double arg │ │ │ │ │ + 630 auto vec = broadcast(42.0); │ │ │ │ │ + 631 static_assert(std::is_same::value, │ │ │ │ │ + 632 "Unexpected result type for broadcast()"); │ │ │ │ │ + 633 DUNE_SIMD_CHECK(is42(vec)); │ │ │ │ │ + 634 } │ │ │ │ │ + 635 } │ │ │ │ │ + 636 │ │ │ │ │ + 637 template │ │ │ │ │ + 638 void checkBracedAssign() │ │ │ │ │ + 639 { │ │ │ │ │ + 640 // copy assignment │ │ │ │ │ + 641 { V ref = make123(); V vec; vec = {ref}; │ │ │ │ │ + 642 DUNE_SIMD_CHECK(is123(vec)); DUNE_SIMD_CHECK(is123(ref)); } │ │ │ │ │ + 643 { const V ref = make123(); V vec; vec = {ref}; │ │ │ │ │ + 644 DUNE_SIMD_CHECK(is123(vec)); DUNE_SIMD_CHECK(is123(ref)); } │ │ │ │ │ + 645 │ │ │ │ │ + 646 // move assignment │ │ │ │ │ + 647 { V vec; vec = {make123()}; DUNE_SIMD_CHECK(is123(vec)); } │ │ │ │ │ + 648 } │ │ │ │ │ + 649 │ │ │ │ │ + 650 template │ │ │ │ │ + 651 void checkBracedBroadcastAssign() │ │ │ │ │ + 652 { │ │ │ │ │ + 653 // nothing works here │ │ │ │ │ + 654 // // broadcast copy assignment │ │ │ │ │ + 655 // { Scalar ref = 42; V vec; vec = {ref}; │ │ │ │ │ + 656 // DUNE_SIMD_CHECK(is42(vec)); DUNE_SIMD_CHECK(ref == Scalar(42)); } │ │ │ │ │ + 657 // { const Scalar ref = 42; V vec; vec = {ref}; │ │ │ │ │ + 658 // DUNE_SIMD_CHECK(is42(vec)); } │ │ │ │ │ + 659 │ │ │ │ │ + 660 // // broadcast move assignment │ │ │ │ │ + 661 // { Scalar ref = 42; V vec; vec = {std::move(ref)}; │ │ │ │ │ + 662 // DUNE_SIMD_CHECK(is42(vec)); } │ │ │ │ │ + 663 } │ │ │ │ │ + 664 │ │ │ │ │ + 666 // │ │ │ │ │ + 667 // checks for unary operators │ │ │ │ │ + 668 // │ │ │ │ │ + 669 │ │ │ │ │ +670#define DUNE_SIMD_POSTFIX_OP(NAME, SYMBOL) \ │ │ │ │ │ + 671 struct OpPostfix##NAME \ │ │ │ │ │ + 672 { \ │ │ │ │ │ + 673 template \ │ │ │ │ │ + 674 auto operator()(V&& v) const \ │ │ │ │ │ + 675 -> decltype(std::forward(v) SYMBOL) \ │ │ │ │ │ + 676 { \ │ │ │ │ │ + 677 return std::forward(v) SYMBOL; \ │ │ │ │ │ + 678 } \ │ │ │ │ │ + 679 } │ │ │ │ │ + 680 │ │ │ │ │ +681#define DUNE_SIMD_PREFIX_OP(NAME, SYMBOL) \ │ │ │ │ │ + 682 struct OpPrefix##NAME \ │ │ │ │ │ + 683 { \ │ │ │ │ │ + 684 template \ │ │ │ │ │ + 685 auto operator()(V&& v) const \ │ │ │ │ │ + 686 -> decltype(SYMBOL std::forward(v)) \ │ │ │ │ │ + 687 { \ │ │ │ │ │ + 688 return SYMBOL std::forward(v); \ │ │ │ │ │ + 689 } \ │ │ │ │ │ + 690 } │ │ │ │ │ + 691 │ │ │ │ │ + 692 DUNE_SIMD_POSTFIX_OP(Decrement, -- ); │ │ │ │ │ + 693 DUNE_SIMD_POSTFIX_OP(Increment, ++ ); │ │ │ │ │ + 694 │ │ │ │ │ + 695 DUNE_SIMD_PREFIX_OP (Decrement, -- ); │ │ │ │ │ + 696 DUNE_SIMD_PREFIX_OP (Increment, ++ ); │ │ │ │ │ + 697 │ │ │ │ │ + 698 DUNE_SIMD_PREFIX_OP (Plus, + ); │ │ │ │ │ + 699 DUNE_SIMD_PREFIX_OP (Minus, - ); │ │ │ │ │ + 700 DUNE_SIMD_PREFIX_OP (LogicNot, ! ); │ │ │ │ │ + 701 // Do not warn about ~ being applied to bool. (1) Yes, doing that is │ │ │ │ │ + 702 // weird, but we do want to test the weird stuff too. (2) It avoids │ │ │ │ │ + 703 // running into on │ │ │ │ │ + 704 // g++-7.0 through 7.2. Also, ignore -Wpragmas to not warn about an │ │ │ │ │ + 705 // unknown -Wbool-operation on compilers that do not know that option. │ │ │ │ │ + 706#pragma GCC diagnostic push │ │ │ │ │ + 707#pragma GCC diagnostic ignored "-Wpragmas" │ │ │ │ │ + 708#pragma GCC diagnostic ignored "-Wunknown-warning-option" // clang 6.0.1 │ │ │ │ │ + 709#pragma GCC diagnostic ignored "-Wbool-operation" │ │ │ │ │ + 710 DUNE_SIMD_PREFIX_OP (BitNot, ~ ); │ │ │ │ │ + 711#pragma GCC diagnostic pop │ │ │ │ │ + 712 │ │ │ │ │ + 713#undef DUNE_SIMD_POSTFIX_OP │ │ │ │ │ + 714#undef DUNE_SIMD_PREFIX_OP │ │ │ │ │ + 715 │ │ │ │ │ + 716 template │ │ │ │ │ + 717 std::enable_if_t< │ │ │ │ │ + 718 IsCallable())))>::value> │ │ │ │ │ + 719 checkUnaryOpV(Op op) │ │ │ │ │ + 720 { │ │ │ │ │ + 721#define DUNE_SIMD_OPNAME (className()) │ │ │ │ │ + 722 // arguments │ │ │ │ │ + 723 auto val = leftVector>(); │ │ │ │ │ + 724 │ │ │ │ │ + 725 // copy the arguments in case V is a references │ │ │ │ │ + 726 auto arg = val; │ │ │ │ │ + 727 auto &&result = op(static_cast(arg)); │ │ │ │ │ + 728 using T = Scalar >; │ │ │ │ │ + 729 for(std::size_t l = 0; l < lanes(val); ++l) │ │ │ │ │ + 730 { │ │ │ │ │ + 731 // `op` might promote the argument. This is a problem if the │ │ │ │ │ + 732 // argument of the operation on the right of the `==` is │ │ │ │ │ + 733 // e.g. `(unsigned short)1` and the operation is e.g. unary `-`. │ │ │ │ │ + 734 // Then the argument is promoted to `int` before applying the │ │ │ │ │ + 735 // negation, and the result is `(int)-1`. However, the left side of │ │ │ │ │ + 736 // the `==` is still `(unsigned short)-1`, which typically is the │ │ │ │ │ + 737 // same as `(unsigned short)65535`. The `==` promotes the left side │ │ │ │ │ + 738 // before comparing, so that becomes `(int)65535`. It will then │ │ │ │ │ + 739 // compare `(int)65535` and `(int)-1` and rightly declare them to be │ │ │ │ │ + 740 // not equal. │ │ │ │ │ + 741 │ │ │ │ │ + 742 // To work around this, we explicitly convert the right side of the │ │ │ │ │ + 743 // `==` to the scalar type before comparing. │ │ │ │ │ + 744 DUNE_SIMD_CHECK_OP │ │ │ │ │ + 745 (lane(l, result) │ │ │ │ │ + 746 == static_cast(op(lane(l, static_cast(val))))); │ │ │ │ │ + 747 } │ │ │ │ │ + 748 // op might modify val, verify that any such modification also happens │ │ │ │ │ + 749 // in the vector case │ │ │ │ │ + 750 for(std::size_t l = 0; l < lanes >(); ++l) │ │ │ │ │ + 751 DUNE_SIMD_CHECK_OP(lane(l, val) == lane(l, arg)); │ │ │ │ │ + 752#undef DUNE_SIMD_OPNAME │ │ │ │ │ + 753 } │ │ │ │ │ + 754 │ │ │ │ │ + 755 template │ │ │ │ │ + 756 std::enable_if_t< │ │ │ │ │ + 757 not IsCallable())))>::value> │ │ │ │ │ + 758 checkUnaryOpV(Op op) │ │ │ │ │ + 759 { │ │ │ │ │ + 760 // log_ << "No " << className())))>() │ │ │ │ │ + 761 // << std::endl │ │ │ │ │ + 762 // << " ==> Not checking " << className() << std::endl; │ │ │ │ │ + 763 } │ │ │ │ │ + 764 │ │ │ │ │ + 765 template │ │ │ │ │ + 766 void checkUnaryOpsV(Op op) │ │ │ │ │ + 767 { │ │ │ │ │ + 768 checkUnaryOpV(op); │ │ │ │ │ + 769 checkUnaryOpV(op); │ │ │ │ │ + 770 checkUnaryOpV(op); │ │ │ │ │ + 771 } │ │ │ │ │ + 772 │ │ │ │ │ + 774 // │ │ │ │ │ + 775 // checks for binary operators │ │ │ │ │ + 776 // │ │ │ │ │ + 777 │ │ │ │ │ + 778 // The operators contain an `operator()`, which will be invoked for both │ │ │ │ │ + 779 // scalar and vector arguments. The function `scalar()` is used the │ │ │ │ │ + 780 // test whether the scalar types support the operation (via │ │ │ │ │ + 781 // `ScalarResult`). The difference is that `scalar()` should only ever │ │ │ │ │ + 782 // receive `const`-ref-qualified version of `Scalar`, while the │ │ │ │ │ + 783 // `operator()` may also be called with proxies representing scalars. │ │ │ │ │ +784#define DUNE_SIMD_INFIX_OP(NAME, SYMBOL) \ │ │ │ │ │ + 785 struct OpInfix##NAME \ │ │ │ │ │ + 786 { \ │ │ │ │ │ + 787 template \ │ │ │ │ │ + 788 decltype(auto) operator()(V1&& v1, V2&& v2) const \ │ │ │ │ │ + 789 { \ │ │ │ │ │ + 790 return std::forward(v1) SYMBOL std::forward(v2); \ │ │ │ │ │ + 791 } \ │ │ │ │ │ + 792 template \ │ │ │ │ │ + 793 auto scalar(S1&& s1, S2&& s2) const \ │ │ │ │ │ + 794 -> decltype(std::forward(s1) SYMBOL std::forward(s2)); \ │ │ │ │ │ + 795 } │ │ │ │ │ + 796 │ │ │ │ │ + 797 // for assign ops, accept only non-const lvalue arguments for scalars. │ │ │ │ │ + 798 // This is needed for class scalars (e.g. std::complex) because │ │ │ │ │ + 799 // non-const class rvalues are actually usually assignable. Though that │ │ │ │ │ + 800 // assignment happens to a temporary, and thus is lost. Except that the │ │ │ │ │ + 801 // tests would bind the result of the assignment to a reference. And │ │ │ │ │ + 802 // because that result is returned from a function by reference, even │ │ │ │ │ + 803 // though it is a temporary passed as an argument to that function, │ │ │ │ │ + 804 // accessing the result later is undefined behaviour. │ │ │ │ │ +805#define DUNE_SIMD_ASSIGN_OP(NAME, SYMBOL) \ │ │ │ │ │ + 806 struct OpInfix##NAME \ │ │ │ │ │ + 807 { \ │ │ │ │ │ + 808 template \ │ │ │ │ │ + 809 decltype(auto) operator()(V1&& v1, V2&& v2) const \ │ │ │ │ │ + 810 { \ │ │ │ │ │ + 811 return std::forward(v1) SYMBOL std::forward(v2); \ │ │ │ │ │ + 812 } \ │ │ │ │ │ + 813 template \ │ │ │ │ │ + 814 auto scalar(S1& s1, S2&& s2) const \ │ │ │ │ │ + 815 -> decltype(s1 SYMBOL std::forward(s2)); \ │ │ │ │ │ + 816 } │ │ │ │ │ + 817 │ │ │ │ │ +818#define DUNE_SIMD_REPL_OP(NAME, REPLFN, SYMBOL) \ │ │ │ │ │ + 819 struct OpInfix##NAME \ │ │ │ │ │ + 820 { \ │ │ │ │ │ + 821 template \ │ │ │ │ │ + 822 decltype(auto) operator()(V1&& v1, V2&& v2) const \ │ │ │ │ │ + 823 { \ │ │ │ │ │ + 824 return Simd::REPLFN(std::forward(v1), std::forward(v2)); \ │ │ │ │ │ + 825 } \ │ │ │ │ │ + 826 template \ │ │ │ │ │ + 827 auto scalar(S1&& s1, S2&& s2) const \ │ │ │ │ │ + 828 -> decltype(std::forward(s1) SYMBOL std::forward(s2)); \ │ │ │ │ │ + 829 } │ │ │ │ │ + 830 │ │ │ │ │ + 831 DUNE_SIMD_INFIX_OP(Mul, * ); │ │ │ │ │ + 832 DUNE_SIMD_INFIX_OP(Div, / ); │ │ │ │ │ + 833 DUNE_SIMD_INFIX_OP(Remainder, % ); │ │ │ │ │ + 834 │ │ │ │ │ + 835 DUNE_SIMD_INFIX_OP(Plus, + ); │ │ │ │ │ + 836 DUNE_SIMD_INFIX_OP(Minus, - ); │ │ │ │ │ + 837 │ │ │ │ │ + 838 DUNE_SIMD_INFIX_OP(LeftShift, << ); │ │ │ │ │ + 839 DUNE_SIMD_INFIX_OP(RightShift, >> ); │ │ │ │ │ + 840 │ │ │ │ │ + 841 DUNE_SIMD_INFIX_OP(Less, < ); │ │ │ │ │ + 842 DUNE_SIMD_INFIX_OP(Greater, > ); │ │ │ │ │ + 843 DUNE_SIMD_INFIX_OP(LessEqual, <= ); │ │ │ │ │ + 844 DUNE_SIMD_INFIX_OP(GreaterEqual, >= ); │ │ │ │ │ + 845 │ │ │ │ │ + 846 DUNE_SIMD_INFIX_OP(Equal, == ); │ │ │ │ │ + 847 DUNE_SIMD_INFIX_OP(NotEqual, != ); │ │ │ │ │ + 848 │ │ │ │ │ + 849 DUNE_SIMD_INFIX_OP(BitAnd, & ); │ │ │ │ │ + 850 DUNE_SIMD_INFIX_OP(BitXor, ^ ); │ │ │ │ │ + 851 DUNE_SIMD_INFIX_OP(BitOr, | ); │ │ │ │ │ + 852 │ │ │ │ │ + 853 // Those are not supported in any meaningful way by vectorclass │ │ │ │ │ + 854 // We need to test replacement functions maskAnd() and maskOr() instead. │ │ │ │ │ + 855 DUNE_SIMD_REPL_OP(LogicAnd, maskAnd, && ); │ │ │ │ │ + 856 DUNE_SIMD_REPL_OP(LogicOr, maskOr, || ); │ │ │ │ │ + 857 │ │ │ │ │ + 858 DUNE_SIMD_ASSIGN_OP(Assign, = ); │ │ │ │ │ + 859 DUNE_SIMD_ASSIGN_OP(AssignMul, *= ); │ │ │ │ │ + 860 DUNE_SIMD_ASSIGN_OP(AssignDiv, /= ); │ │ │ │ │ + 861 DUNE_SIMD_ASSIGN_OP(AssignRemainder, %= ); │ │ │ │ │ + 862 DUNE_SIMD_ASSIGN_OP(AssignPlus, += ); │ │ │ │ │ + 863 DUNE_SIMD_ASSIGN_OP(AssignMinus, -= ); │ │ │ │ │ + 864 DUNE_SIMD_ASSIGN_OP(AssignLeftShift, <<=); │ │ │ │ │ + 865 DUNE_SIMD_ASSIGN_OP(AssignRightShift, >>=); │ │ │ │ │ + 866 DUNE_SIMD_ASSIGN_OP(AssignAnd, &= ); │ │ │ │ │ + 867 DUNE_SIMD_ASSIGN_OP(AssignXor, ^= ); │ │ │ │ │ + 868 DUNE_SIMD_ASSIGN_OP(AssignOr, |= ); │ │ │ │ │ + 869 │ │ │ │ │ + 870#undef DUNE_SIMD_INFIX_OP │ │ │ │ │ + 871#undef DUNE_SIMD_REPL_OP │ │ │ │ │ + 872#undef DUNE_SIMD_ASSIGN_OP │ │ │ │ │ + 873 │ │ │ │ │ + 874 // just used as a tag │ │ │ │ │ + 875 struct OpInfixComma {}; │ │ │ │ │ + 876 │ │ │ │ │ + 877 template │ │ │ │ │ + 878 void checkCommaOp(const std::decay_t &val1, │ │ │ │ │ + 879 const std::decay_t &val2) │ │ │ │ │ + 880 { │ │ │ │ │ + 881#define DUNE_SIMD_OPNAME (className()) │ │ │ │ │ + 882 static_assert(std::is_same(), │ │ │ │ │ + 883 std::declval())), T2>::value, │ │ │ │ │ + 884 "Type and value category of the comma operator must " │ │ │ │ │ + 885 "match that of the second operand"); │ │ │ │ │ + 886 │ │ │ │ │ + 887 // copy the arguments in case T1 or T2 are references │ │ │ │ │ + 888 auto arg1 = val1; │ │ │ │ │ + 889 auto arg2 = val2; │ │ │ │ │ + 890 // Do not warn that the left side of the comma operator is unused. │ │ │ │ │ + 891 // Seems to work for g++-4.9 and clang++-3.8. Appears to be harmless │ │ │ │ │ + 892 // for icpc (14 and 17), and icpc does not seem to issue a warning │ │ │ │ │ + 893 // anyway. │ │ │ │ │ + 894#pragma GCC diagnostic push │ │ │ │ │ + 895#pragma GCC diagnostic ignored "-Wunused-value" │ │ │ │ │ + 896 auto &&result = (static_cast(arg1), │ │ │ │ │ + 897 static_cast(arg2)); │ │ │ │ │ + 898#pragma GCC diagnostic pop │ │ │ │ │ + 899 if(std::is_reference::value) │ │ │ │ │ + 900 { │ │ │ │ │ + 901 // comma should return the same object as the second argument for │ │ │ │ │ + 902 // lvalues and xvalues │ │ │ │ │ + 903 DUNE_SIMD_CHECK_OP(&result == &arg2); │ │ │ │ │ + 904 // it should not modify any arguments │ │ │ │ │ + 905 DUNE_SIMD_CHECK_OP(allTrue(val1 == arg1)); │ │ │ │ │ + 906 DUNE_SIMD_CHECK_OP(allTrue(val2 == arg2)); │ │ │ │ │ + 907 } │ │ │ │ │ + 908 else │ │ │ │ │ + 909 { │ │ │ │ │ + 910 // comma should return the same value as the second argument for │ │ │ │ │ + 911 // prvalues │ │ │ │ │ + 912 DUNE_SIMD_CHECK_OP(allTrue(result == arg2)); │ │ │ │ │ + 913 // it should not modify any arguments │ │ │ │ │ + 914 DUNE_SIMD_CHECK_OP(allTrue(val1 == arg1)); │ │ │ │ │ + 915 // second argument is a prvalue, any modifications happen to a │ │ │ │ │ + 916 // temporary and we can't detect them │ │ │ │ │ + 917 } │ │ │ │ │ + 918#undef DUNE_SIMD_OPNAME │ │ │ │ │ + 919 } │ │ │ │ │ + 920 │ │ │ │ │ + 922 // │ │ │ │ │ + 923 // checks for vector-vector binary operations │ │ │ │ │ + 924 // │ │ │ │ │ + 925 │ │ │ │ │ + 926 // We check the following candidate operation │ │ │ │ │ + 927 // │ │ │ │ │ + 928 // vopres = vop1 @ vop2 │ │ │ │ │ + 929 // │ │ │ │ │ + 930 // against the reference operation │ │ │ │ │ + 931 // │ │ │ │ │ + 932 // arefres[l] = aref1[l] @ aref2[l] foreach l │ │ │ │ │ + 933 // │ │ │ │ │ + 934 // v... variables are simd-vectors and a... variables are arrays. The │ │ │ │ │ + 935 // operation may modify the operands, but if is does the modification │ │ │ │ │ + 936 // needs to happen in both the candidate and the reference. │ │ │ │ │ + 937 // │ │ │ │ │ + 938 // We do the following checks: │ │ │ │ │ + 939 // 1. lanes(vopres) == lanes(vop1) │ │ │ │ │ + 940 // 2. lane(l, vopres) == arefres[l] foreach l │ │ │ │ │ + 941 // 3. lane(l, vop1) == aref1[l] foreach l │ │ │ │ │ + 942 // 4. lane(l, vop2) == aref2[l] foreach l │ │ │ │ │ + 943 template │ │ │ │ │ + 944 std::enable_if_t > │ │ │ │ │ + 945 checkBinaryOpVV(MetaType, MetaType, Op op) │ │ │ │ │ + 946 { │ │ │ │ │ + 947#define DUNE_SIMD_OPNAME (className()) │ │ │ │ │ + 948 static_assert(std::is_same, std::decay_t >::value, │ │ │ │ │ + 949 "Internal testsystem error: called with two types that " │ │ │ │ │ + 950 "don't decay to the same thing"); │ │ │ │ │ + 951 │ │ │ │ │ + 952 // reference arguments │ │ │ │ │ + 953 auto vref1 = leftVector>(); │ │ │ │ │ + 954 auto vref2 = rightVector>(); │ │ │ │ │ + 955 │ │ │ │ │ + 956 // candidate arguments │ │ │ │ │ + 957 auto vop1 = vref1; │ │ │ │ │ + 958 auto vop2 = vref2; │ │ │ │ │ + 959 │ │ │ │ │ + 960 // candidate operation │ │ │ │ │ + 961 auto &&vopres = op(static_cast(vop1), static_cast(vop2)); │ │ │ │ │ + 962 using VR = decltype(vopres); │ │ │ │ │ + 963 │ │ │ │ │ + 964 // check 1. lanes(vopres) == lanes(vop1) │ │ │ │ │ + 965 static_assert(lanes >() == lanes >(), │ │ │ │ │ + 966 "The result must have the same number of lanes as the " │ │ │ │ │ + 967 "operands."); │ │ │ │ │ + 968 │ │ │ │ │ + 969 // do the reference operation, and simultaneously │ │ │ │ │ + 970 // check 2. lane(l, vopres) == arefres[l] foreach l │ │ │ │ │ + 971 using T = Scalar >; │ │ │ │ │ + 972 for(auto l : range(lanes(vopres))) │ │ │ │ │ + 973 { │ │ │ │ │ + 974 // see the lengthy comment in `checkUnaryOpV()` as to why the │ │ │ │ │ + 975 // `static_cast` around the `op()` is necessary │ │ │ │ │ + 976 DUNE_SIMD_CHECK_OP │ │ │ │ │ + 977 (lane(l, vopres) │ │ │ │ │ + 978 == static_cast(op(lane(l, static_cast(vref1)), │ │ │ │ │ + 979 lane(l, static_cast(vref2))))); │ │ │ │ │ + 980 } │ │ │ │ │ + 981 │ │ │ │ │ + 982 // check 3. lane(l, vop1) == aref1[l] foreach l │ │ │ │ │ + 983 for(auto l : range(lanes(vop1))) │ │ │ │ │ + 984 DUNE_SIMD_CHECK_OP(lane(l, vop1) == lane(l, vref1)); │ │ │ │ │ + 985 │ │ │ │ │ + 986 // check 4. lane(l, vop2) == aref2[l] foreach l │ │ │ │ │ + 987 for(auto l : range(lanes(vop2))) │ │ │ │ │ + 988 DUNE_SIMD_CHECK_OP(lane(l, vop2) == lane(l, vref2)); │ │ │ │ │ + 989 │ │ │ │ │ + 990#undef DUNE_SIMD_OPNAME │ │ │ │ │ + 991 } │ │ │ │ │ + 992 │ │ │ │ │ + 993 template │ │ │ │ │ + 994 std::enable_if_t > │ │ │ │ │ + 995 checkBinaryOpVV(MetaType, MetaType, Op op) │ │ │ │ │ + 996 { │ │ │ │ │ + 997 // log_ << "No " << className())), │ │ │ │ │ + 998 // decltype(lane(0, std::declval())))>() │ │ │ │ │ + 999 // << std::endl │ │ │ │ │ + 1000 // << " ==> Not checking " << className() << std::endl; │ │ │ │ │ + 1001 } │ │ │ │ │ + 1002 │ │ │ │ │ + 1003 template │ │ │ │ │ + 1004 void checkBinaryOpVV(MetaType, MetaType, OpInfixComma) │ │ │ │ │ + 1005 { │ │ │ │ │ + 1006 static_assert(std::is_same, std::decay_t >::value, │ │ │ │ │ + 1007 "Internal testsystem error: called with two types that " │ │ │ │ │ + 1008 "don't decay to the same thing"); │ │ │ │ │ + 1009 │ │ │ │ │ + 1010 checkCommaOp(leftVector>(), │ │ │ │ │ + 1011 rightVector>()); │ │ │ │ │ + 1012 } │ │ │ │ │ + 1013 │ │ │ │ │ + 1015 // │ │ │ │ │ + 1016 // checks for vector-scalar binary operations │ │ │ │ │ + 1017 // │ │ │ │ │ + 1018 │ │ │ │ │ + 1019 // We check the following candidate operation │ │ │ │ │ + 1020 // │ │ │ │ │ + 1021 // vopres = vop1 @ sop2 │ │ │ │ │ + 1022 // │ │ │ │ │ + 1023 // against the reference operation │ │ │ │ │ + 1024 // │ │ │ │ │ + 1025 // arefres[l] = aref1[l] @ sref2 foreach l │ │ │ │ │ + 1026 // │ │ │ │ │ + 1027 // v... variables are simd-vectors, a... variables are arrays, and │ │ │ │ │ + 1028 // s... variables are scalars. The operation may modify the left │ │ │ │ │ + 1029 // operand, but if is does the modifications needs to happen in both the │ │ │ │ │ + 1030 // candidate and the reference. │ │ │ │ │ + 1031 // │ │ │ │ │ + 1032 // We do the following checks: │ │ │ │ │ + 1033 // 1. lanes(vopres) == lanes(vop1) │ │ │ │ │ + 1034 // 2. lane(l, vopres) == arefres[l] foreach l │ │ │ │ │ + 1035 // 3. lane(l, vop1) == aref1[l] foreach l │ │ │ │ │ + 1036 // 4. sop2 is never modified │ │ │ │ │ + 1037 // 5. sref2 is never modified │ │ │ │ │ + 1038 // │ │ │ │ │ + 1039 // In fact, if the property "sref2 is never modified" is violated that │ │ │ │ │ + 1040 // means the operation is unsuitable for an automatic broadcast of the │ │ │ │ │ + 1041 // second operand and should not be checked. There are no operations in │ │ │ │ │ + 1042 // the standard where the second operand is modified like this, but │ │ │ │ │ + 1043 // there are operations where the first operand is modified -- and this │ │ │ │ │ + 1044 // check is used for those ops as well by exchanging the first and second │ │ │ │ │ + 1045 // argument below. │ │ │ │ │ + 1046 │ │ │ │ │ + 1047 template │ │ │ │ │ + 1048 std::enable_if_t > │ │ │ │ │ + 1049 checkBinaryOpVS(MetaType, MetaType, Op op) │ │ │ │ │ + 1050 { │ │ │ │ │ + 1051#define DUNE_SIMD_OPNAME (className()) │ │ │ │ │ + 1052 static_assert(std::is_same >, │ │ │ │ │ + 1053 std::decay_t >::value, │ │ │ │ │ + 1054 "Internal testsystem error: called with a scalar that " │ │ │ │ │ + 1055 "does not match the vector type."); │ │ │ │ │ + 1056 │ │ │ │ │ + 1057 // initial values │ │ │ │ │ + 1058 auto sinit2 = rightScalar>(); │ │ │ │ │ + 1059 │ │ │ │ │ + 1060 // reference arguments │ │ │ │ │ + 1061 auto vref1 = leftVector>(); │ │ │ │ │ + 1062 auto sref2 = sinit2; │ │ │ │ │ + 1063 │ │ │ │ │ + 1064 // candidate arguments │ │ │ │ │ + 1065 auto vop1 = vref1; │ │ │ │ │ + 1066 auto sop2 = sref2; │ │ │ │ │ + 1067 │ │ │ │ │ + 1068 // candidate operation │ │ │ │ │ + 1069 auto &&vopres = op(static_cast(vop1), static_cast(sop2)); │ │ │ │ │ + 1070 using VR = decltype(vopres); │ │ │ │ │ + 1071 │ │ │ │ │ + 1072 // check 1. lanes(vopres) == lanes(vop1) │ │ │ │ │ + 1073 static_assert(lanes >() == lanes >(), │ │ │ │ │ + 1074 "The result must have the same number of lanes as the " │ │ │ │ │ + 1075 "operands."); │ │ │ │ │ + 1076 │ │ │ │ │ + 1077 // check 4. sop2 is never modified │ │ │ │ │ + 1078 DUNE_SIMD_CHECK_OP(sop2 == sinit2); │ │ │ │ │ + 1079 │ │ │ │ │ + 1080 // do the reference operation, and simultaneously check 2. and 5. │ │ │ │ │ + 1081 using T = Scalar >; │ │ │ │ │ + 1082 for(auto l : range(lanes(vopres))) │ │ │ │ │ + 1083 { │ │ │ │ │ + 1084 // check 2. lane(l, vopres) == arefres[l] foreach l │ │ │ │ │ + 1085 // see the lengthy comment in `checkUnaryOpV()` as to why the │ │ │ │ │ + 1086 // `static_cast` around the `op()` is necessary │ │ │ │ │ + 1087 DUNE_SIMD_CHECK_OP │ │ │ │ │ + 1088 (lane(l, vopres) │ │ │ │ │ + 1089 == static_cast(op(lane(l, static_cast(vref1)), │ │ │ │ │ + 1090 static_cast(sref2) ))); │ │ │ │ │ + 1091 // check 5. sref2 is never modified │ │ │ │ │ + 1092 DUNE_SIMD_CHECK_OP(sref2 == sinit2); │ │ │ │ │ + 1093 } │ │ │ │ │ + 1094 │ │ │ │ │ + 1095 // check 3. lane(l, vop1) == aref1[l] foreach l │ │ │ │ │ + 1096 for(auto l : range(lanes(vop1))) │ │ │ │ │ + 1097 DUNE_SIMD_CHECK_OP(lane(l, vop1) == lane(l, vref1)); │ │ │ │ │ + 1098 │ │ │ │ │ + 1099#undef DUNE_SIMD_OPNAME │ │ │ │ │ + 1100 } │ │ │ │ │ + 1101 │ │ │ │ │ + 1102 template │ │ │ │ │ + 1103 std::enable_if_t > │ │ │ │ │ + 1104 checkBinaryOpVS(MetaType, MetaType, Op op) │ │ │ │ │ + 1105 { │ │ │ │ │ + 1106 // log_ << "No " │ │ │ │ │ + 1107 // << className())), T2)>() │ │ │ │ │ + 1108 // << std::endl │ │ │ │ │ + 1109 // << " ==> Not checking " << className() << std::endl; │ │ │ │ │ + 1110 } │ │ │ │ │ + 1111 │ │ │ │ │ + 1112 template │ │ │ │ │ + 1113 void checkBinaryOpVS(MetaType, MetaType, OpInfixComma) │ │ │ │ │ + 1114 { │ │ │ │ │ + 1115 static_assert(std::is_same >, │ │ │ │ │ + 1116 std::decay_t >::value, │ │ │ │ │ + 1117 "Internal testsystem error: called with a scalar that " │ │ │ │ │ + 1118 "does not match the vector type."); │ │ │ │ │ + 1119 │ │ │ │ │ + 1120 checkCommaOp(leftVector>(), │ │ │ │ │ + 1121 rightScalar>()); │ │ │ │ │ + 1122 } │ │ │ │ │ + 1123 │ │ │ │ │ + 1125 // │ │ │ │ │ + 1126 // cross-check scalar-vector binary operations against vector-vector │ │ │ │ │ + 1127 // │ │ │ │ │ + 1128 │ │ │ │ │ + 1129 // We check the following candidate operation │ │ │ │ │ + 1130 // │ │ │ │ │ + 1131 // vopres = vop1 @ vop2, where vop2 = broadcast(sref2) │ │ │ │ │ + 1132 // │ │ │ │ │ + 1133 // against the reference operation │ │ │ │ │ + 1134 // │ │ │ │ │ + 1135 // vrefres = vref1 @ sref2 │ │ │ │ │ + 1136 // │ │ │ │ │ + 1137 // v... variables are simd-vectors, a... variables are arrays, and │ │ │ │ │ + 1138 // s... variables are scalars. │ │ │ │ │ + 1139 // │ │ │ │ │ + 1140 // We could check the following properties │ │ │ │ │ + 1141 // 1. lanes(vopres) == lanes(vop1) │ │ │ │ │ + 1142 // 2. lane(l, vopres) == lane(l, vrefres) foreach l │ │ │ │ │ + 1143 // 3. lane(l, vop1) == lane(l, vref1) foreach l │ │ │ │ │ + 1144 // but these are given by checking the operation against the scalar │ │ │ │ │ + 1145 // operation in the vector@vector and vector@scalar cases above. │ │ │ │ │ + 1146 // │ │ │ │ │ + 1147 // The only thing left to check is: │ │ │ │ │ + 1148 // 4. lane(l, vop2) foreach l is never modified │ │ │ │ │ + 1149 │ │ │ │ │ + 1150 template │ │ │ │ │ + 1151 std::enable_if_t > │ │ │ │ │ + 1152 checkBinaryOpVVAgainstVS(MetaType, MetaType, Op op) │ │ │ │ │ + 1153 { │ │ │ │ │ + 1154#define DUNE_SIMD_OPNAME (className()) │ │ │ │ │ + 1155 static_assert(std::is_same >, │ │ │ │ │ + 1156 std::decay_t >::value, │ │ │ │ │ + 1157 "Internal testsystem error: called with a scalar that " │ │ │ │ │ + 1158 "does not match the vector type."); │ │ │ │ │ + 1159 │ │ │ │ │ + 1160 // initial values │ │ │ │ │ + 1161 auto sinit2 = rightScalar>(); │ │ │ │ │ + 1162 │ │ │ │ │ + 1163 // reference arguments │ │ │ │ │ + 1164 auto vop1 = leftVector>(); │ │ │ │ │ + 1165 using V2 = CopyRefQual; │ │ │ │ │ + 1166 std::decay_t vop2(sinit2); │ │ │ │ │ + 1167 │ │ │ │ │ + 1168 // candidate operation │ │ │ │ │ + 1169 op(static_cast(vop1), static_cast(vop2)); │ │ │ │ │ + 1170 │ │ │ │ │ + 1171 // 4. lane(l, vop2) foreach l is never modified │ │ │ │ │ + 1172 for(auto l : range(lanes(vop2))) │ │ │ │ │ + 1173 DUNE_SIMD_CHECK_OP(lane(l, vop2) == sinit2); │ │ │ │ │ + 1174 │ │ │ │ │ + 1175#undef DUNE_SIMD_OPNAME │ │ │ │ │ + 1176 } │ │ │ │ │ + 1177 │ │ │ │ │ + 1178 template │ │ │ │ │ + 1179 std::enable_if_t > │ │ │ │ │ + 1180 checkBinaryOpVVAgainstVS(MetaType, MetaType, Op op) │ │ │ │ │ + 1181 { │ │ │ │ │ + 1182 // log_ << "No " │ │ │ │ │ + 1183 // << className())), T2)>() │ │ │ │ │ + 1184 // << std::endl │ │ │ │ │ + 1185 // << " ==> Not checking " << className() << std::endl; │ │ │ │ │ + 1186 } │ │ │ │ │ + 1187 │ │ │ │ │ + 1188 template │ │ │ │ │ + 1189 void checkBinaryOpVVAgainstVS(MetaType, MetaType, OpInfixComma) │ │ │ │ │ + 1190 { } │ │ │ │ │ + 1191 │ │ │ │ │ + 1193 // │ │ │ │ │ + 1194 // checks for vector-proxy binary operations │ │ │ │ │ + 1195 // │ │ │ │ │ + 1196 │ │ │ │ │ + 1197 // We check the following candidate operation │ │ │ │ │ + 1198 // │ │ │ │ │ + 1199 // vopres = vop1 @ pop2 │ │ │ │ │ + 1200 // │ │ │ │ │ + 1201 // against the reference operation │ │ │ │ │ + 1202 // │ │ │ │ │ + 1203 // arefres[l] = aref1[l] @ sref2 foreach l │ │ │ │ │ + 1204 // │ │ │ │ │ + 1205 // v... variables are simd-vectors, a... variables are arrays, │ │ │ │ │ + 1206 // p... variables are proxies of simd-vector entries and s... variables │ │ │ │ │ + 1207 // are scalars. The operation may modify the left operand, but if is │ │ │ │ │ + 1208 // does the modifications needs to happen in both the candidate and the │ │ │ │ │ + 1209 // reference. │ │ │ │ │ + 1210 // │ │ │ │ │ + 1211 // We do the following checks: │ │ │ │ │ + 1212 // 1. lanes(vopres) == lanes(vop1) │ │ │ │ │ + 1213 // 2. lane(l, vopres) == arefres[l] foreach l │ │ │ │ │ + 1214 // 3. lane(l, vop1) == aref1[l] foreach l │ │ │ │ │ + 1215 // 4. pop2 is never modified │ │ │ │ │ + 1216 // 5. sref2 is never modified │ │ │ │ │ + 1217 // │ │ │ │ │ + 1218 // In fact, if the property "sref2 is never modified" is violated that │ │ │ │ │ + 1219 // means the operation is unsuitable for an automatic broadcast of the │ │ │ │ │ + 1220 // second operand and should not be checked. There are no operations in │ │ │ │ │ + 1221 // the standard where the second operand is modified like this, but │ │ │ │ │ + 1222 // there are operations where the first operand is modified -- and this │ │ │ │ │ + 1223 // check is used for those ops as well by exchanging the first and second │ │ │ │ │ + 1224 // argument below. │ │ │ │ │ + 1225 │ │ │ │ │ + 1226 template │ │ │ │ │ + 1227 std::enable_if_t > │ │ │ │ │ + 1228 checkBinaryOpVP(MetaType, MetaType, Op op) │ │ │ │ │ + 1229 { │ │ │ │ │ + 1230 using P2 = decltype(lane(0, std::declval())); │ │ │ │ │ + 1231 using T2 = CopyRefQual, V2>; │ │ │ │ │ + 1232#define DUNE_SIMD_OPNAME (className()) │ │ │ │ │ + 1233 static_assert(std::is_same, Scalar >::value, │ │ │ │ │ + 1234 "Internal testsystem error: called with two vector " │ │ │ │ │ + 1235 "types whose scalar types don't match."); │ │ │ │ │ + 1236 │ │ │ │ │ + 1237 // initial values │ │ │ │ │ + 1238 auto sinit2 = rightScalar>(); │ │ │ │ │ + 1239 │ │ │ │ │ + 1240 // reference arguments │ │ │ │ │ + 1241 auto vref1 = leftVector>(); │ │ │ │ │ + 1242 auto sref2 = sinit2; │ │ │ │ │ + 1243 │ │ │ │ │ + 1244 // candidate arguments │ │ │ │ │ + 1245 auto vop1 = vref1; │ │ │ │ │ + 1246 auto vop2 = std::decay_t(Scalar(0)); │ │ │ │ │ + 1247 lane(0, vop2) = sref2; // pop2 is just a name for `lane(0, vop2)` │ │ │ │ │ + 1248 │ │ │ │ │ + 1249 // candidate operation │ │ │ │ │ + 1250 auto &&vopres = │ │ │ │ │ + 1251 op(static_cast(vop1), lane(0, static_cast(vop2))); │ │ │ │ │ + 1252 using VR = decltype(vopres); │ │ │ │ │ + 1253 │ │ │ │ │ + 1254 // check 1. lanes(vopres) == lanes(vop1) │ │ │ │ │ + 1255 static_assert(lanes >() == lanes >(), │ │ │ │ │ + 1256 "The result must have the same number of lanes as the " │ │ │ │ │ + 1257 "operands."); │ │ │ │ │ + 1258 │ │ │ │ │ + 1259 // check 4. pop2 is never modified │ │ │ │ │ + 1260 DUNE_SIMD_CHECK_OP(lane(0, vop2) == sinit2); │ │ │ │ │ + 1261 │ │ │ │ │ + 1262 // do the reference operation, and simultaneously check 2. and 5. │ │ │ │ │ + 1263 using T = Scalar; │ │ │ │ │ + 1264 for(auto l : range(lanes(vopres))) │ │ │ │ │ + 1265 { │ │ │ │ │ + 1266 // check 2. lane(l, vopres) == arefres[l] foreach l │ │ │ │ │ + 1267 // see the lengthy comment in `checkUnaryOpV()` as to why the │ │ │ │ │ + 1268 // `static_cast` around the `op()` is necessary │ │ │ │ │ + 1269 DUNE_SIMD_CHECK_OP │ │ │ │ │ + 1270 (lane(l, vopres) │ │ │ │ │ + 1271 == static_cast(op(lane(l, static_cast(vref1)), │ │ │ │ │ + 1272 static_cast(sref2) ))); │ │ │ │ │ + 1273 // check 5. sref2 is never modified │ │ │ │ │ + 1274 DUNE_SIMD_CHECK_OP(sref2 == sinit2); │ │ │ │ │ + 1275 } │ │ │ │ │ + 1276 │ │ │ │ │ + 1277 // check 3. lane(l, vop1) == aref1[l] foreach l │ │ │ │ │ + 1278 for(auto l : range(lanes(vop1))) │ │ │ │ │ + 1279 DUNE_SIMD_CHECK_OP(lane(l, vop1) == lane(l, vref1)); │ │ │ │ │ + 1280 │ │ │ │ │ + 1281#undef DUNE_SIMD_OPNAME │ │ │ │ │ + 1282 } │ │ │ │ │ + 1283 │ │ │ │ │ + 1284 template │ │ │ │ │ + 1285 std::enable_if_t > │ │ │ │ │ + 1286 checkBinaryOpVP(MetaType, MetaType, Op op) │ │ │ │ │ + 1287 { │ │ │ │ │ + 1288 // log_ << "No " │ │ │ │ │ + 1289 // << className())), T2)>() │ │ │ │ │ + 1290 // << std::endl │ │ │ │ │ + 1291 // << " ==> Not checking " << className() << std::endl; │ │ │ │ │ + 1292 } │ │ │ │ │ + 1293 │ │ │ │ │ + 1294 template │ │ │ │ │ + 1295 void checkBinaryOpVP(MetaType, MetaType, OpInfixComma) │ │ │ │ │ + 1296 { │ │ │ │ │ + 1297 // Don't really know how to check comma operator for proxies │ │ │ │ │ + 1298 } │ │ │ │ │ + 1299 │ │ │ │ │ + 1301 // │ │ │ │ │ + 1302 // checks for (scalar/proxy)-vector binary operations │ │ │ │ │ + 1303 // │ │ │ │ │ + 1304 │ │ │ │ │ + 1305 template │ │ │ │ │ + 1306 struct OpInfixSwappedArgs │ │ │ │ │ + 1307 { │ │ │ │ │ + 1308 Op orig; │ │ │ │ │ + 1309 │ │ │ │ │ + 1310 template │ │ │ │ │ + 1311 decltype(auto) operator()(V1&& v1, V2&& v2) const │ │ │ │ │ + 1312 { │ │ │ │ │ + 1313 return orig(std::forward(v2), std::forward(v1)); │ │ │ │ │ + 1314 } │ │ │ │ │ + 1315 template │ │ │ │ │ + 1316 auto scalar(S1&& s1, S2&& s2) const │ │ │ │ │ + 1317 -> decltype(orig.scalar(std::forward(s2), std::forward(s1))); │ │ │ │ │ + 1318 }; │ │ │ │ │ + 1319 │ │ │ │ │ + 1320 template │ │ │ │ │ + 1321 void checkBinaryOpSV(MetaType t1, MetaType v2, Op op) │ │ │ │ │ + 1322 { │ │ │ │ │ + 1323 checkBinaryOpVS(v2, t1, OpInfixSwappedArgs{op}); │ │ │ │ │ + 1324 } │ │ │ │ │ + 1325 │ │ │ │ │ + 1326 template │ │ │ │ │ + 1327 void checkBinaryOpSV(MetaType, MetaType, OpInfixComma) │ │ │ │ │ + 1328 { │ │ │ │ │ + 1329 static_assert(std::is_same, │ │ │ │ │ + 1330 Scalar > >::value, │ │ │ │ │ + 1331 "Internal testsystem error: called with a scalar that " │ │ │ │ │ + 1332 "does not match the vector type."); │ │ │ │ │ + 1333 │ │ │ │ │ + 1334 checkCommaOp(leftScalar>(), │ │ │ │ │ + 1335 rightVector>()); │ │ │ │ │ + 1336 } │ │ │ │ │ + 1337 │ │ │ │ │ + 1338 template │ │ │ │ │ + 1339 void checkBinaryOpPV(MetaType v1, MetaType v2, Op op) │ │ │ │ │ + 1340 { │ │ │ │ │ + 1341 checkBinaryOpVP(v2, v1, OpInfixSwappedArgs{op}); │ │ │ │ │ + 1342 } │ │ │ │ │ + 1343 │ │ │ │ │ + 1344 template │ │ │ │ │ + 1345 void checkBinaryOpPV(MetaType, MetaType, OpInfixComma) │ │ │ │ │ + 1346 { │ │ │ │ │ + 1347 // Don't really know how to check comma operator for proxies │ │ │ │ │ + 1348 } │ │ │ │ │ + 1349 │ │ │ │ │ + 1351 // │ │ │ │ │ + 1352 // cross-check scalar-vector binary operations against vector-vector │ │ │ │ │ + 1353 // │ │ │ │ │ + 1354 │ │ │ │ │ + 1355 // We check the following candidate operation │ │ │ │ │ + 1356 // │ │ │ │ │ + 1357 // vopres = vop1 @ vop2, where vop2 = broadcast(sref2) │ │ │ │ │ + 1358 // │ │ │ │ │ + 1359 // against the reference operation │ │ │ │ │ + 1360 // │ │ │ │ │ + 1361 // vrefres = vref1 @ sref2 │ │ │ │ │ + 1362 // │ │ │ │ │ + 1363 // v... variables are simd-vectors, a... variables are arrays, and │ │ │ │ │ + 1364 // s... variables are scalars. │ │ │ │ │ + 1365 // │ │ │ │ │ + 1366 // We could check the following properties │ │ │ │ │ + 1367 // 1. lanes(vopres) == lanes(vop1) │ │ │ │ │ + 1368 // 2. lane(l, vopres) == lane(l, vrefres) foreach l │ │ │ │ │ + 1369 // 3. lane(l, vop1) == lane(l, vref1) foreach l │ │ │ │ │ + 1370 // but these are given by checking the operation against the scalar │ │ │ │ │ + 1371 // operation in the vector@vector and vector@scalar cases above. │ │ │ │ │ + 1372 // │ │ │ │ │ + 1373 // The only thing left to check is: │ │ │ │ │ + 1374 // 4. lane(l, vop2) foreach l is never modified │ │ │ │ │ + 1375 │ │ │ │ │ + 1376 template │ │ │ │ │ + 1377 void checkBinaryOpVVAgainstSV(MetaType t1, MetaType v2, Op op) │ │ │ │ │ + 1378 { │ │ │ │ │ + 1379 checkBinaryOpVVAgainstVS(v2, t1, OpInfixSwappedArgs{op}); │ │ │ │ │ + 1380 } │ │ │ │ │ + 1381 │ │ │ │ │ + 1382 template │ │ │ │ │ + 1383 void checkBinaryOpVVAgainstSV(MetaType, MetaType, OpInfixComma) │ │ │ │ │ + 1384 { } │ │ │ │ │ + 1385 │ │ │ │ │ + 1387 // │ │ │ │ │ + 1388 // Invoke the checks for all combinations │ │ │ │ │ + 1389 // │ │ │ │ │ + 1390 │ │ │ │ │ + 1391 template │ │ │ │ │ + 1392 void checkBinaryRefQual(Checker checker) │ │ │ │ │ + 1393 { │ │ │ │ │ + 1394 if constexpr (condition) { │ │ │ │ │ + 1395 Hybrid::forEach(TypeList{}, [=] (auto t1) { │ │ │ │ │ + 1396 Hybrid::forEach(TypeList{}, [=] (auto t2) { │ │ │ │ │ + 1397 checker(t1, t2); │ │ │ │ │ + 1398 }); │ │ │ │ │ + 1399 }); │ │ │ │ │ + 1400 } │ │ │ │ │ + 1401 } │ │ │ │ │ + 1402 │ │ │ │ │ + 1403 template │ │ │ │ │ + 1404 void checkBinaryOps(Checker checker) │ │ │ │ │ + 1405 { │ │ │ │ │ + 1406 using Std::bool_constant; │ │ │ │ │ + 1407 │ │ │ │ │ + 1408 constexpr bool isMask = std::is_same, bool>::value; │ │ │ │ │ + 1409 │ │ │ │ │ + 1410 constexpr bool do_ = false; │ │ │ │ │ + 1411 constexpr bool do_SV = true; │ │ │ │ │ + 1412 constexpr bool do_VV = true; │ │ │ │ │ + 1413 constexpr bool do_VS = true; │ │ │ │ │ + 1414 │ │ │ │ │ + 1415#define DUNE_SIMD_DO(M1, M2, M3, V1, V2, V3, NAME) \ │ │ │ │ │ + 1416 checker(bool_constant{}, \ │ │ │ │ │ + 1417 bool_constant{}, \ │ │ │ │ │ + 1418 bool_constant{}, \ │ │ │ │ │ + 1419 Op##NAME{}) │ │ │ │ │ + 1420 │ │ │ │ │ + 1421 // (Mask , Vector , Name ); │ │ │ │ │ + 1422 │ │ │ │ │ + 1423 DUNE_SIMD_DO( , , , SV, VV, VS, InfixMul ); │ │ │ │ │ + 1424 DUNE_SIMD_DO( , , , SV, VV, VS, InfixDiv ); │ │ │ │ │ + 1425 DUNE_SIMD_DO( , , , SV, VV, VS, InfixRemainder ); │ │ │ │ │ + 1426 │ │ │ │ │ + 1427 DUNE_SIMD_DO( , , , SV, VV, VS, InfixPlus ); │ │ │ │ │ + 1428 DUNE_SIMD_DO( , , , SV, VV, VS, InfixMinus ); │ │ │ │ │ + 1429 │ │ │ │ │ + 1430 DUNE_SIMD_DO( , , , , VV, VS, InfixLeftShift ); │ │ │ │ │ + 1431 DUNE_SIMD_DO( , , , , VV, VS, InfixRightShift ); │ │ │ │ │ + 1432 │ │ │ │ │ + 1433 DUNE_SIMD_DO( , , , SV, VV, VS, InfixLess ); │ │ │ │ │ + 1434 DUNE_SIMD_DO( , , , SV, VV, VS, InfixGreater ); │ │ │ │ │ + 1435 DUNE_SIMD_DO( , , , SV, VV, VS, InfixLessEqual ); │ │ │ │ │ + 1436 DUNE_SIMD_DO( , , , SV, VV, VS, InfixGreaterEqual ); │ │ │ │ │ + 1437 │ │ │ │ │ + 1438 DUNE_SIMD_DO( , , , SV, VV, VS, InfixEqual ); │ │ │ │ │ + 1439 DUNE_SIMD_DO( , , , SV, VV, VS, InfixNotEqual ); │ │ │ │ │ + 1440 │ │ │ │ │ + 1441 DUNE_SIMD_DO( , VV, , SV, VV, VS, InfixBitAnd ); │ │ │ │ │ + 1442 DUNE_SIMD_DO( , VV, , SV, VV, VS, InfixBitXor ); │ │ │ │ │ + 1443 DUNE_SIMD_DO( , VV, , SV, VV, VS, InfixBitOr ); │ │ │ │ │ + 1444 │ │ │ │ │ + 1445 DUNE_SIMD_DO(SV, VV, VS, SV, VV, VS, InfixLogicAnd ); │ │ │ │ │ + 1446 DUNE_SIMD_DO(SV, VV, VS, SV, VV, VS, InfixLogicOr ); │ │ │ │ │ + 1447 │ │ │ │ │ + 1448 DUNE_SIMD_DO( , VV, , , VV, VS, InfixAssign ); │ │ │ │ │ + 1449 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignMul ); │ │ │ │ │ + 1450 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignDiv ); │ │ │ │ │ + 1451 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignRemainder ); │ │ │ │ │ + 1452 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignPlus ); │ │ │ │ │ + 1453 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignMinus ); │ │ │ │ │ + 1454 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignLeftShift ); │ │ │ │ │ + 1455 DUNE_SIMD_DO( , , , , VV, VS, InfixAssignRightShift); │ │ │ │ │ + 1456 DUNE_SIMD_DO( , VV, , , VV, VS, InfixAssignAnd ); │ │ │ │ │ + 1457 DUNE_SIMD_DO( , VV, , , VV, VS, InfixAssignXor ); │ │ │ │ │ + 1458 DUNE_SIMD_DO( , VV, , , VV, VS, InfixAssignOr ); │ │ │ │ │ + 1459 │ │ │ │ │ + 1460 DUNE_SIMD_DO(SV, VV, VS, SV, , VS, InfixComma ); │ │ │ │ │ + 1461 │ │ │ │ │ + 1462#undef DUNE_SIMD_DO │ │ │ │ │ + 1463 } │ │ │ │ │ + 1464 │ │ │ │ │ + 1466 // │ │ │ │ │ + 1467 // SIMD interface functions │ │ │ │ │ + 1468 // │ │ │ │ │ + 1469 │ │ │ │ │ + 1470 template │ │ │ │ │ + 1471 void checkAutoCopy() │ │ │ │ │ + 1472 { │ │ │ │ │ + 1473 using RValueResult = decltype(autoCopy(lane(0, std::declval()))); │ │ │ │ │ + 1474 static_assert(std::is_same >::value, │ │ │ │ │ + 1475 "Result of autoCopy() must always be Scalar"); │ │ │ │ │ + 1476 │ │ │ │ │ + 1477 using MutableLValueResult = │ │ │ │ │ + 1478 decltype(autoCopy(lane(0, std::declval()))); │ │ │ │ │ + 1479 static_assert(std::is_same >::value, │ │ │ │ │ + 1480 "Result of autoCopy() must always be Scalar"); │ │ │ │ │ + 1481 │ │ │ │ │ + 1482 using ConstLValueResult = │ │ │ │ │ + 1483 decltype(autoCopy(lane(0, std::declval()))); │ │ │ │ │ + 1484 static_assert(std::is_same >::value, │ │ │ │ │ + 1485 "Result of autoCopy() must always be Scalar"); │ │ │ │ │ + 1486 │ │ │ │ │ + 1487 V vec = make123(); │ │ │ │ │ + 1488 for(std::size_t l = 0; l < lanes(vec); ++l) │ │ │ │ │ + 1489 DUNE_SIMD_CHECK(autoCopy(lane(l, vec)) == Scalar(l+1)); │ │ │ │ │ + 1490 } │ │ │ │ │ + 1491 │ │ │ │ │ + 1492 // may only be called for mask types │ │ │ │ │ + 1493 template │ │ │ │ │ + 1494 void checkBoolReductions() │ │ │ │ │ + 1495 { │ │ │ │ │ + 1496 M trueVec(true); │ │ │ │ │ + 1497 │ │ │ │ │ + 1498 // mutable lvalue │ │ │ │ │ + 1499 DUNE_SIMD_CHECK(allTrue (static_cast(trueVec)) == true); │ │ │ │ │ + 1500 DUNE_SIMD_CHECK(anyTrue (static_cast(trueVec)) == true); │ │ │ │ │ + 1501 DUNE_SIMD_CHECK(allFalse(static_cast(trueVec)) == false); │ │ │ │ │ + 1502 DUNE_SIMD_CHECK(anyFalse(static_cast(trueVec)) == false); │ │ │ │ │ + 1503 │ │ │ │ │ + 1504 // const lvalue │ │ │ │ │ + 1505 DUNE_SIMD_CHECK(allTrue (static_cast(trueVec)) == true); │ │ │ │ │ + 1506 DUNE_SIMD_CHECK(anyTrue (static_cast(trueVec)) == true); │ │ │ │ │ + 1507 DUNE_SIMD_CHECK(allFalse(static_cast(trueVec)) == false); │ │ │ │ │ + 1508 DUNE_SIMD_CHECK(anyFalse(static_cast(trueVec)) == false); │ │ │ │ │ + 1509 │ │ │ │ │ + 1510 // rvalue │ │ │ │ │ + 1511 DUNE_SIMD_CHECK(allTrue (M(true)) == true); │ │ │ │ │ + 1512 DUNE_SIMD_CHECK(anyTrue (M(true)) == true); │ │ │ │ │ + 1513 DUNE_SIMD_CHECK(allFalse(M(true)) == false); │ │ │ │ │ + 1514 DUNE_SIMD_CHECK(anyFalse(M(true)) == false); │ │ │ │ │ + 1515 │ │ │ │ │ + 1516 M falseVec(false); │ │ │ │ │ + 1517 │ │ │ │ │ + 1518 // mutable lvalue │ │ │ │ │ + 1519 DUNE_SIMD_CHECK(allTrue (static_cast(falseVec)) == false); │ │ │ │ │ + 1520 DUNE_SIMD_CHECK(anyTrue (static_cast(falseVec)) == false); │ │ │ │ │ + 1521 DUNE_SIMD_CHECK(allFalse(static_cast(falseVec)) == true); │ │ │ │ │ + 1522 DUNE_SIMD_CHECK(anyFalse(static_cast(falseVec)) == true); │ │ │ │ │ + 1523 │ │ │ │ │ + 1524 // const lvalue │ │ │ │ │ + 1525 DUNE_SIMD_CHECK(allTrue (static_cast(falseVec)) == false); │ │ │ │ │ + 1526 DUNE_SIMD_CHECK(anyTrue (static_cast(falseVec)) == false); │ │ │ │ │ + 1527 DUNE_SIMD_CHECK(allFalse(static_cast(falseVec)) == true); │ │ │ │ │ + 1528 DUNE_SIMD_CHECK(anyFalse(static_cast(falseVec)) == true); │ │ │ │ │ + 1529 │ │ │ │ │ + 1530 // rvalue │ │ │ │ │ + 1531 DUNE_SIMD_CHECK(allTrue (M(false)) == false); │ │ │ │ │ + 1532 DUNE_SIMD_CHECK(anyTrue (M(false)) == false); │ │ │ │ │ + 1533 DUNE_SIMD_CHECK(allFalse(M(false)) == true); │ │ │ │ │ + 1534 DUNE_SIMD_CHECK(anyFalse(M(false)) == true); │ │ │ │ │ + 1535 │ │ │ │ │ + 1536 auto mixedVec = broadcast(0); │ │ │ │ │ + 1537 for(std::size_t l = 0; l < lanes(mixedVec); ++l) │ │ │ │ │ + 1538 lane(l, mixedVec) = (l % 2); │ │ │ │ │ + 1539 │ │ │ │ │ + 1540 // mutable lvalue │ │ │ │ │ + 1541 DUNE_SIMD_CHECK │ │ │ │ │ + 1542 (allTrue (static_cast(mixedVec)) == false); │ │ │ │ │ + 1543 DUNE_SIMD_CHECK │ │ │ │ │ + 1544 (anyTrue (static_cast(mixedVec)) == (lanes() > 1)); │ │ │ │ │ + 1545 DUNE_SIMD_CHECK │ │ │ │ │ + 1546 (allFalse(static_cast(mixedVec)) == (lanes() == 1)); │ │ │ │ │ + 1547 DUNE_SIMD_CHECK │ │ │ │ │ + 1548 (anyFalse(static_cast(mixedVec)) == true); │ │ │ │ │ + 1549 │ │ │ │ │ + 1550 // const lvalue │ │ │ │ │ + 1551 DUNE_SIMD_CHECK │ │ │ │ │ + 1552 (allTrue (static_cast(mixedVec)) == false); │ │ │ │ │ + 1553 DUNE_SIMD_CHECK │ │ │ │ │ + 1554 (anyTrue (static_cast(mixedVec)) == (lanes() > 1)); │ │ │ │ │ + 1555 DUNE_SIMD_CHECK │ │ │ │ │ + 1556 (allFalse(static_cast(mixedVec)) == (lanes() == 1)); │ │ │ │ │ + 1557 DUNE_SIMD_CHECK │ │ │ │ │ + 1558 (anyFalse(static_cast(mixedVec)) == true); │ │ │ │ │ + 1559 │ │ │ │ │ + 1560 // rvalue │ │ │ │ │ + 1561 DUNE_SIMD_CHECK(allTrue (M(mixedVec)) == false); │ │ │ │ │ + 1562 DUNE_SIMD_CHECK(anyTrue (M(mixedVec)) == (lanes() > 1)); │ │ │ │ │ + 1563 DUNE_SIMD_CHECK(allFalse(M(mixedVec)) == (lanes() == 1)); │ │ │ │ │ + 1564 DUNE_SIMD_CHECK(anyFalse(M(mixedVec)) == true); │ │ │ │ │ + 1565 } │ │ │ │ │ + 1566 │ │ │ │ │ + 1567 template │ │ │ │ │ + 1568 void checkCond() │ │ │ │ │ + 1569 { │ │ │ │ │ + 1570 using M = Mask; │ │ │ │ │ + 1571 │ │ │ │ │ + 1572 static_assert │ │ │ │ │ + 1573 (std::is_same(), std::declval(), │ │ │ │ │ + 1574 std::declval())), V>::value, │ │ │ │ │ + 1575 "The result of cond(M, V, V) should have exactly the type V"); │ │ │ │ │ + 1576 │ │ │ │ │ + 1577 static_assert │ │ │ │ │ + 1578 (std::is_same(), │ │ │ │ │ + 1579 std::declval(), │ │ │ │ │ + 1580 std::declval())), V>::value, │ │ │ │ │ + 1581 "The result of cond(const M&, const V&, const V&) should have " │ │ │ │ │ + 1582 "exactly the type V"); │ │ │ │ │ + 1583 │ │ │ │ │ + 1584 static_assert │ │ │ │ │ + 1585 (std::is_same(), std::declval(), │ │ │ │ │ + 1586 std::declval())), V>::value, │ │ │ │ │ + 1587 "The result of cond(M&, V&, V&) should have exactly the type V"); │ │ │ │ │ + 1588 │ │ │ │ │ + 1589 V vec1 = leftVector(); │ │ │ │ │ + 1590 V vec2 = rightVector(); │ │ │ │ │ + 1591 │ │ │ │ │ + 1592 DUNE_SIMD_CHECK(allTrue(cond(M(true), vec1, vec2) == vec1)); │ │ │ │ │ + 1593 DUNE_SIMD_CHECK(allTrue(cond(M(false), vec1, vec2) == vec2)); │ │ │ │ │ + 1594 │ │ │ │ │ + 1595 auto mixedResult = broadcast(0); │ │ │ │ │ + 1596 auto mixedMask = broadcast(false); │ │ │ │ │ + 1597 for(std::size_t l = 0; l < lanes(mixedMask); ++l) │ │ │ │ │ + 1598 { │ │ │ │ │ + 1599 lane(l, mixedMask ) = (l % 2); │ │ │ │ │ + 1600 lane(l, mixedResult) = lane(l, (l % 2) ? vec1 : vec2); │ │ │ │ │ + 1601 } │ │ │ │ │ + 1602 │ │ │ │ │ + 1603 DUNE_SIMD_CHECK(allTrue(cond(mixedMask, vec1, vec2) == mixedResult)); │ │ │ │ │ + 1604 } │ │ │ │ │ + 1605 │ │ │ │ │ + 1606 template │ │ │ │ │ + 1607 void checkBoolCond() │ │ │ │ │ + 1608 { │ │ │ │ │ + 1609 static_assert │ │ │ │ │ + 1610 (std::is_same(), std::declval(), │ │ │ │ │ + 1611 std::declval())), V>::value, │ │ │ │ │ + 1612 "The result of cond(bool, V, V) should have exactly the type V"); │ │ │ │ │ + 1613 │ │ │ │ │ + 1614 static_assert │ │ │ │ │ + 1615 (std::is_same(), │ │ │ │ │ + 1616 std::declval(), │ │ │ │ │ + 1617 std::declval())), V>::value, │ │ │ │ │ + 1618 "The result of cond(const bool&, const V&, const V&) should have " │ │ │ │ │ + 1619 "exactly the type V"); │ │ │ │ │ + 1620 │ │ │ │ │ + 1621 static_assert │ │ │ │ │ + 1622 (std::is_same(), │ │ │ │ │ + 1623 std::declval(), │ │ │ │ │ + 1624 std::declval())), V>::value, │ │ │ │ │ + 1625 "The result of cond(bool&, V&, V&) should have exactly the type V"); │ │ │ │ │ + 1626 │ │ │ │ │ + 1627 V vec1 = leftVector(); │ │ │ │ │ + 1628 V vec2 = rightVector(); │ │ │ │ │ + 1629 │ │ │ │ │ + 1630 DUNE_SIMD_CHECK(allTrue(cond(true, vec1, vec2) == vec1)); │ │ │ │ │ + 1631 DUNE_SIMD_CHECK(allTrue(cond(false, vec1, vec2) == vec2)); │ │ │ │ │ + 1632 } │ │ │ │ │ + 1633 │ │ │ │ │ + 1634 template │ │ │ │ │ + 1635 std::enable_if_t >::value> │ │ │ │ │ + 1636 checkHorizontalMinMax() {} │ │ │ │ │ + 1637 │ │ │ │ │ + 1638 template │ │ │ │ │ + 1639 std::enable_if_t >::value> │ │ │ │ │ + 1640 checkHorizontalMinMax() │ │ │ │ │ + 1641 { │ │ │ │ │ + 1642 static_assert │ │ │ │ │ + 1643 (std::is_same())), Scalar >::value, │ │ │ │ │ + 1644 "The result of max(V) should be exactly Scalar"); │ │ │ │ │ + 1645 │ │ │ │ │ + 1646 static_assert │ │ │ │ │ + 1647 (std::is_same())), Scalar >::value, │ │ │ │ │ + 1648 "The result of min(V) should be exactly Scalar"); │ │ │ │ │ + 1649 │ │ │ │ │ + 1650 static_assert │ │ │ │ │ + 1651 (std::is_same())), Scalar >::value, │ │ │ │ │ + 1652 "The result of max(V) should be exactly Scalar"); │ │ │ │ │ + 1653 │ │ │ │ │ + 1654 static_assert │ │ │ │ │ + 1655 (std::is_same())), Scalar >::value, │ │ │ │ │ + 1656 "The result of min(V) should be exactly Scalar"); │ │ │ │ │ + 1657 │ │ │ │ │ + 1658 const V vec1 = leftVector(); │ │ │ │ │ + 1659 │ │ │ │ │ + 1660 DUNE_SIMD_CHECK(max(vec1) == Scalar(lanes(vec1))); │ │ │ │ │ + 1661 DUNE_SIMD_CHECK(min(vec1) == Scalar(1)); │ │ │ │ │ + 1662 } │ │ │ │ │ + 1663 │ │ │ │ │ + 1664 template │ │ │ │ │ + 1665 std::enable_if_t >::value> │ │ │ │ │ + 1666 checkBinaryMinMax() {} │ │ │ │ │ + 1667 │ │ │ │ │ + 1668 template │ │ │ │ │ + 1669 std::enable_if_t >::value> │ │ │ │ │ + 1670 checkBinaryMinMax() │ │ │ │ │ + 1671 { │ │ │ │ │ + 1672 using std::max; │ │ │ │ │ + 1673 using std::min; │ │ │ │ │ + 1674 │ │ │ │ │ + 1675 static_assert │ │ │ │ │ + 1676 (std::is_same(), │ │ │ │ │ + 1677 std::declval())), V>::value, │ │ │ │ │ + 1678 "The result of Simd::max(V, V) should be exactly V"); │ │ │ │ │ + 1679 static_assert │ │ │ │ │ + 1680 (std::is_same(), │ │ │ │ │ + 1681 std::declval())), V>::value, │ │ │ │ │ + 1682 "The result of Simd::min(V, V) should be exactly V"); │ │ │ │ │ + 1683 │ │ │ │ │ + 1684 static_assert │ │ │ │ │ + 1685 (std::is_same(), │ │ │ │ │ + 1686 std::declval())), V>::value, │ │ │ │ │ + 1687 "The result of Simd::max(V&, V&) should be exactly V"); │ │ │ │ │ + 1688 static_assert │ │ │ │ │ + 1689 (std::is_same(), │ │ │ │ │ + 1690 std::declval())), V>::value, │ │ │ │ │ + 1691 "The result of Simd::min(V&, V&) should be exactly V"); │ │ │ │ │ + 1692 │ │ │ │ │ + 1693 const V arg1 = leftVector(); │ │ │ │ │ + 1694 const V arg2 = rightVector(); │ │ │ │ │ + 1695 │ │ │ │ │ + 1696 V maxExp(Scalar(0)), minExp(Scalar(0)); │ │ │ │ │ + 1697 for(auto l : range(lanes())) │ │ │ │ │ + 1698 { │ │ │ │ │ + 1699 lane(l, maxExp) = max(lane(l, arg1), lane(l, arg2)); │ │ │ │ │ + 1700 lane(l, minExp) = min(lane(l, arg1), lane(l, arg2)); │ │ │ │ │ + 1701 } │ │ │ │ │ + 1702 │ │ │ │ │ + 1703 DUNE_SIMD_CHECK(allTrue(maxExp == Simd::max(arg1, arg2))); │ │ │ │ │ + 1704 DUNE_SIMD_CHECK(allTrue(minExp == Simd::min(arg1, arg2))); │ │ │ │ │ + 1705 } │ │ │ │ │ + 1706 │ │ │ │ │ + 1707 template │ │ │ │ │ + 1708 void checkIO() │ │ │ │ │ + 1709 { │ │ │ │ │ + 1710 const V vec1 = leftVector(); │ │ │ │ │ + 1711 │ │ │ │ │ + 1712 std::string reference; │ │ │ │ │ + 1713 { │ │ │ │ │ + 1714 const char *sep = ""; │ │ │ │ │ + 1715 for(auto l : range(lanes(vec1))) │ │ │ │ │ + 1716 { │ │ │ │ │ + 1717 std::ostringstream stream; │ │ │ │ │ + 1718 stream << lane(l, vec1); │ │ │ │ │ + 1719 │ │ │ │ │ + 1720 reference += sep; │ │ │ │ │ + 1721 reference += stream.str(); │ │ │ │ │ + 1722 sep = ", "; │ │ │ │ │ + 1723 } │ │ │ │ │ + 1724 } │ │ │ │ │ + 1725 │ │ │ │ │ + 1726 { │ │ │ │ │ + 1727 std::ostringstream stream; │ │ │ │ │ + 1728 stream << io(vec1); │ │ │ │ │ + 1729 if(lanes(vec1) == 1) │ │ │ │ │ + 1730 DUNE_SIMD_CHECK(stream.str() == reference); │ │ │ │ │ + 1731 else │ │ │ │ │ + 1732 DUNE_SIMD_CHECK(stream.str() == "<" + reference + ">"); │ │ │ │ │ + 1733 } │ │ │ │ │ + 1734 │ │ │ │ │ + 1735 { │ │ │ │ │ + 1736 std::ostringstream stream; │ │ │ │ │ + 1737 stream << vio(vec1); │ │ │ │ │ + 1738 DUNE_SIMD_CHECK(stream.str() == "<" + reference + ">"); │ │ │ │ │ + 1739 } │ │ │ │ │ + 1740 } │ │ │ │ │ + 1741 │ │ │ │ │ + 1742#undef DUNE_SIMD_CHECK │ │ │ │ │ + 1743 │ │ │ │ │ + 1744 public: │ │ │ │ │ + 1807 template void checkType(); │ │ │ │ │ + 1808 template void checkNonOps(); │ │ │ │ │ + 1809 template void checkUnaryOps(); │ │ │ │ │ + 1810 template void checkBinaryOps(); │ │ │ │ │ + 1811 template void checkBinaryOpsVectorVector(); │ │ │ │ │ + 1812 template void checkBinaryOpsScalarVector(); │ │ │ │ │ + 1813 template void checkBinaryOpsVectorScalar(); │ │ │ │ │ + 1814 template void checkBinaryOpsProxyVector(); │ │ │ │ │ + 1815 template void checkBinaryOpsVectorProxy(); │ │ │ │ │ + 1819 │ │ │ │ │ + 1836 template class RebindPrune = IsLoop, │ │ │ │ │ + 1838 template class RebindAccept = Dune::AlwaysTrue> │ │ │ │ │ +1839 void check() { │ │ │ │ │ + 1840 // check whether the test for this type already started │ │ │ │ │ + 1841 if(seen_.emplace(typeid (V)).second == false) │ │ │ │ │ + 1842 { │ │ │ │ │ + 1843 // type already seen, nothing to do │ │ │ │ │ + 1844 return; │ │ │ │ │ + 1845 } │ │ │ │ │ + 1846 │ │ │ │ │ + 1847 // do these first so everything that appears after "Checking SIMD type │ │ │ │ │ + 1848 // ..." really pertains to that type │ │ │ │ │ + 1849 auto recurse = [this](auto w) { │ │ │ │ │ + 1850 using W = typename decltype(w)::type; │ │ │ │ │ + 1851 this->template check(); │ │ │ │ │ + 1852 }; │ │ │ │ │ + 1853 checkRebindOf(recurse); │ │ │ │ │ + 1854 │ │ │ │ │ + 1855 checkType(); │ │ │ │ │ + 1856 } │ │ │ │ │ + 1857 │ │ │ │ │ +1859 bool good() const │ │ │ │ │ + 1860 { │ │ │ │ │ + 1861 return good_; │ │ │ │ │ + 1862 } │ │ │ │ │ + 1863 │ │ │ │ │ + 1864 }; // class UnitTest │ │ │ │ │ + 1865 │ │ │ │ │ +1866 template void UnitTest::checkType() │ │ │ │ │ + 1867 { │ │ │ │ │ + 1868 static_assert(std::is_same >::value, "Simd types " │ │ │ │ │ + 1869 "must not be references, and must not include " │ │ │ │ │ + 1870 "cv-qualifiers"); │ │ │ │ │ + 1871 │ │ │ │ │ + 1872 log_ << "Checking SIMD type " << className() << std::endl; │ │ │ │ │ + 1873 │ │ │ │ │ + 1874 checkNonOps(); │ │ │ │ │ + 1875 checkUnaryOps(); │ │ │ │ │ + 1876 checkBinaryOps(); │ │ │ │ │ + 1877 } │ │ │ │ │ +1878 template void UnitTest::checkNonOps() │ │ │ │ │ + 1879 { │ │ │ │ │ + 1880 constexpr auto isMask = typename std::is_same, bool>::type{}; │ │ │ │ │ + 1881 │ │ │ │ │ + 1882 checkLanes(); │ │ │ │ │ + 1883 checkScalar(); │ │ │ │ │ + 1884 │ │ │ │ │ + 1885 checkDefaultConstruct(); │ │ │ │ │ + 1886 checkLane(); │ │ │ │ │ + 1887 checkCopyMoveConstruct(); │ │ │ │ │ + 1888 checkImplCast(); │ │ │ │ │ + 1889 checkBroadcast(); │ │ │ │ │ + 1890 if constexpr (isMask) │ │ │ │ │ + 1891 this->template checkBroadcastMaskConstruct(); │ │ │ │ │ + 1892 else │ │ │ │ │ + 1893 this->template checkBroadcastVectorConstruct(); │ │ │ │ │ + 1894 checkBracedAssign(); │ │ │ │ │ + 1895 checkBracedBroadcastAssign(); │ │ │ │ │ + 1896 │ │ │ │ │ + 1897 checkAutoCopy(); │ │ │ │ │ + 1898 checkCond(); │ │ │ │ │ + 1899 checkBoolCond(); │ │ │ │ │ + 1900 │ │ │ │ │ + 1901 if constexpr (isMask) │ │ │ │ │ + 1902 this->template checkBoolReductions(); │ │ │ │ │ + 1903 // checkBoolReductions() is not applicable for non-masks │ │ │ │ │ + 1904 │ │ │ │ │ + 1905 checkHorizontalMinMax(); │ │ │ │ │ + 1906 checkBinaryMinMax(); │ │ │ │ │ + 1907 checkIO(); │ │ │ │ │ + 1908 } │ │ │ │ │ +1909 template void UnitTest::checkUnaryOps() │ │ │ │ │ + 1910 { │ │ │ │ │ + 1911 if constexpr (std::is_same_v, bool>) { │ │ │ │ │ + 1912 // check mask │ │ │ │ │ + 1913 auto check = [this](auto op) { │ │ │ │ │ + 1914 this->template checkUnaryOpsV(op); │ │ │ │ │ + 1915 }; │ │ │ │ │ + 1916 │ │ │ │ │ + 1917 // postfix │ │ │ │ │ + 1918 // check(OpPostfixDecrement{}); │ │ │ │ │ + 1919 // clang deprecation warning if bool++ is tested │ │ │ │ │ + 1920 // check(OpPostfixIncrement{}); │ │ │ │ │ + 1921 │ │ │ │ │ + 1922 // prefix │ │ │ │ │ + 1923 // check(OpPrefixDecrement{}); │ │ │ │ │ + 1924 // clang deprecation warning if ++bool is tested │ │ │ │ │ + 1925 // check(OpPrefixIncrement{}); │ │ │ │ │ + 1926 │ │ │ │ │ + 1927 // check(OpPrefixPlus{}); │ │ │ │ │ + 1928 // check(OpPrefixMinus{}); │ │ │ │ │ + 1929 check(OpPrefixLogicNot{}); │ │ │ │ │ + 1930 // check(OpPrefixBitNot{}); │ │ │ │ │ + 1931 } │ │ │ │ │ + 1932 else { │ │ │ │ │ + 1933 // check vector │ │ │ │ │ + 1934 auto check = [this](auto op) { │ │ │ │ │ + 1935 this->template checkUnaryOpsV(op); │ │ │ │ │ + 1936 }; │ │ │ │ │ + 1937 │ │ │ │ │ + 1938 // postfix │ │ │ │ │ + 1939 // check(OpPostfixDecrement{}); │ │ │ │ │ + 1940 // check(OpPostfixIncrement{}); │ │ │ │ │ + 1941 │ │ │ │ │ + 1942 // prefix │ │ │ │ │ + 1943 // check(OpPrefixDecrement{}); │ │ │ │ │ + 1944 // check(OpPrefixIncrement{}); │ │ │ │ │ + 1945 │ │ │ │ │ + 1946 // check(OpPrefixPlus{}); │ │ │ │ │ + 1947 check(OpPrefixMinus{}); │ │ │ │ │ + 1948 check(OpPrefixLogicNot{}); │ │ │ │ │ + 1949 check(OpPrefixBitNot{}); │ │ │ │ │ + 1950 } │ │ │ │ │ + 1951 } │ │ │ │ │ +1952 template void UnitTest::checkBinaryOps() │ │ │ │ │ + 1953 { │ │ │ │ │ + 1954 checkBinaryOpsVectorVector(); │ │ │ │ │ + 1955 checkBinaryOpsScalarVector(); │ │ │ │ │ + 1956 checkBinaryOpsVectorScalar(); │ │ │ │ │ + 1957 checkBinaryOpsProxyVector(); │ │ │ │ │ + 1958 checkBinaryOpsVectorProxy(); │ │ │ │ │ + 1959 } │ │ │ │ │ +1960 template void UnitTest::checkBinaryOpsVectorVector() │ │ │ │ │ + 1961 { │ │ │ │ │ + 1962 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) { │ │ │ │ │ + 1963 auto check = [this,op](auto t1, auto t2) { │ │ │ │ │ + 1964 this->checkBinaryOpVV(t1, t2, op); │ │ │ │ │ + 1965 }; │ │ │ │ │ + 1966 this->checkBinaryRefQual(check); │ │ │ │ │ + 1967 }; │ │ │ │ │ + 1968 checkBinaryOps(checker); │ │ │ │ │ + 1969 } │ │ │ │ │ +1970 template void UnitTest::checkBinaryOpsScalarVector() │ │ │ │ │ + 1971 { │ │ │ │ │ + 1972 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) { │ │ │ │ │ + 1973 auto check = [this,op](auto t1, auto t2) { │ │ │ │ │ + 1974 this->checkBinaryOpSV(t1, t2, op); │ │ │ │ │ + 1975 }; │ │ │ │ │ + 1976 this->checkBinaryRefQual, V, doSV>(check); │ │ │ │ │ + 1977 │ │ │ │ │ + 1978 auto crossCheck = [this,op](auto t1, auto t2) { │ │ │ │ │ + 1979 this->checkBinaryOpVVAgainstSV(t1, t2, op); │ │ │ │ │ + 1980 }; │ │ │ │ │ + 1981 this->checkBinaryRefQual, V, doSV && doVV>(crossCheck); │ │ │ │ │ + 1982 }; │ │ │ │ │ + 1983 checkBinaryOps(checker); │ │ │ │ │ + 1984 } │ │ │ │ │ +1985 template void UnitTest::checkBinaryOpsVectorScalar() │ │ │ │ │ + 1986 { │ │ │ │ │ + 1987 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) { │ │ │ │ │ + 1988 auto check = [this,op](auto t1, auto t2) { │ │ │ │ │ + 1989 this->checkBinaryOpVS(t1, t2, op); │ │ │ │ │ + 1990 }; │ │ │ │ │ + 1991 this->checkBinaryRefQual, doVS>(check); │ │ │ │ │ + 1992 │ │ │ │ │ + 1993 auto crossCheck = [this,op](auto t1, auto t2) { │ │ │ │ │ + 1994 this->checkBinaryOpVVAgainstVS(t1, t2, op); │ │ │ │ │ + 1995 }; │ │ │ │ │ + 1996 this->checkBinaryRefQual, doVV && doVS>(crossCheck); │ │ │ │ │ + 1997 }; │ │ │ │ │ + 1998 checkBinaryOps(checker); │ │ │ │ │ + 1999 } │ │ │ │ │ +2000 template void UnitTest::checkBinaryOpsProxyVector() │ │ │ │ │ + 2001 { │ │ │ │ │ + 2002 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) { │ │ │ │ │ + 2003 auto check = [this,op](auto t1, auto t2) { │ │ │ │ │ + 2004 this->checkBinaryOpPV(t1, t2, op); │ │ │ │ │ + 2005 }; │ │ │ │ │ + 2006 this->checkBinaryRefQual(check); │ │ │ │ │ + 2007 }; │ │ │ │ │ + 2008 checkBinaryOps(checker); │ │ │ │ │ + 2009 } │ │ │ │ │ +2010 template void UnitTest::checkBinaryOpsVectorProxy() │ │ │ │ │ + 2011 { │ │ │ │ │ + 2012 auto checker = [this](auto doSV, auto doVV, auto doVS, auto op) { │ │ │ │ │ + 2013 auto check = [this,op](auto t1, auto t2) { │ │ │ │ │ + 2014 this->checkBinaryOpVP(t1, t2, op); │ │ │ │ │ + 2015 }; │ │ │ │ │ + 2016 this->checkBinaryRefQual(check); │ │ │ │ │ + 2017 }; │ │ │ │ │ + 2018 checkBinaryOps(checker); │ │ │ │ │ + 2019 } │ │ │ │ │ + 2020 │ │ │ │ │ + 2021 } // namespace Simd │ │ │ │ │ + 2022} // namespace Dune │ │ │ │ │ + 2023 │ │ │ │ │ + 2024#endif // DUNE_COMMON_SIMD_TEST_HH │ │ │ │ │ +classname.hh │ │ │ │ │ +A free function to provide the demangled class name of a given object or type │ │ │ │ │ +as a string. │ │ │ │ │ +typelist.hh │ │ │ │ │ +loop.hh │ │ │ │ │ +io.hh │ │ │ │ │ +IO interface of the SIMD abstraction. │ │ │ │ │ +DUNE_SIMD_CHECK_OP │ │ │ │ │ +#define DUNE_SIMD_CHECK_OP(expr) │ │ │ │ │ +Definition: test.hh:191 │ │ │ │ │ +DUNE_SIMD_CHECK │ │ │ │ │ +#define DUNE_SIMD_CHECK(expr) │ │ │ │ │ +Definition: test.hh:186 │ │ │ │ │ +DUNE_SIMD_DO │ │ │ │ │ +#define DUNE_SIMD_DO(M1, M2, M3, V1, V2, V3, NAME) │ │ │ │ │ +typetraits.hh │ │ │ │ │ +Traits for type conversions and type information. │ │ │ │ │ +type_traits.hh │ │ │ │ │ +rangeutilities.hh │ │ │ │ │ +Utilities for reduction like operations on ranges. │ │ │ │ │ +hybridutilities.hh │ │ │ │ │ +Dune::range │ │ │ │ │ +static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from │ │ │ │ │ +>, std::integral_constant< T, to >) noexcept │ │ │ │ │ +Definition: rangeutilities.hh:300 │ │ │ │ │ +Dune::TypeList │ │ │ │ │ +std::tuple< MetaType< T >... > TypeList │ │ │ │ │ +A simple type list. │ │ │ │ │ +Definition: typelist.hh:87 │ │ │ │ │ +Dune::Hybrid::forEach │ │ │ │ │ +constexpr void forEach(Range &&range, F &&f) │ │ │ │ │ +Range based for loop. │ │ │ │ │ +Definition: hybridutilities.hh:268 │ │ │ │ │ +Dune::autoCopy │ │ │ │ │ +constexpr AutonomousValue< T > autoCopy(T &&v) │ │ │ │ │ +Autonomous copy of an expression's value for use in auto type deduction. │ │ │ │ │ +Definition: typetraits.hh:642 │ │ │ │ │ +Dune::void_t │ │ │ │ │ +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 │ │ │ │ │ +Dune::Simd::anyTrue │ │ │ │ │ +bool anyTrue(const Mask &mask) │ │ │ │ │ +Whether any entry is true │ │ │ │ │ +Definition: simd/interface.hh:429 │ │ │ │ │ +Dune::Simd::maskOr │ │ │ │ │ +auto maskOr(const V1 &v1, const V2 &v2) │ │ │ │ │ +Logic or of masks. │ │ │ │ │ +Definition: simd/interface.hh:499 │ │ │ │ │ +Dune::Simd::cond │ │ │ │ │ +V cond(M &&mask, const V &ifTrue, const V &ifFalse) │ │ │ │ │ +Like the ?: operator. │ │ │ │ │ +Definition: simd/interface.hh:386 │ │ │ │ │ +Dune::Simd::io │ │ │ │ │ +auto io(const V &v) │ │ │ │ │ +construct a stream inserter │ │ │ │ │ +Definition: io.hh:106 │ │ │ │ │ +Dune::Simd::allTrue │ │ │ │ │ +bool allTrue(const Mask &mask) │ │ │ │ │ +Whether all entries are true │ │ │ │ │ +Definition: simd/interface.hh:439 │ │ │ │ │ +Dune::Simd::vio │ │ │ │ │ +auto vio(const V &v) │ │ │ │ │ +construct a stream inserter │ │ │ │ │ +Definition: io.hh:90 │ │ │ │ │ +Dune::Simd::max │ │ │ │ │ +auto max(const V &v1, const V &v2) │ │ │ │ │ +The binary maximum value over two simd objects. │ │ │ │ │ +Definition: simd/interface.hh:409 │ │ │ │ │ +Dune::Simd::anyFalse │ │ │ │ │ +bool anyFalse(const Mask &mask) │ │ │ │ │ +Whether any entry is false │ │ │ │ │ +Definition: simd/interface.hh:449 │ │ │ │ │ +Dune::Simd::lanes │ │ │ │ │ +constexpr std::size_t lanes() │ │ │ │ │ +Number of lanes in a SIMD type. │ │ │ │ │ +Definition: simd/interface.hh:305 │ │ │ │ │ +Dune::Simd::lane │ │ │ │ │ +decltype(auto) lane(std::size_t l, V &&v) │ │ │ │ │ +Extract an element of a SIMD type. │ │ │ │ │ +Definition: simd/interface.hh:324 │ │ │ │ │ +Dune::Simd::allFalse │ │ │ │ │ +bool allFalse(const Mask &mask) │ │ │ │ │ +Whether all entries are false │ │ │ │ │ +Definition: simd/interface.hh:459 │ │ │ │ │ +Dune::Simd::maskAnd │ │ │ │ │ +auto maskAnd(const V1 &v1, const V2 &v2) │ │ │ │ │ +Logic and of masks. │ │ │ │ │ +Definition: simd/interface.hh:509 │ │ │ │ │ +Dune::Simd::Scalar │ │ │ │ │ +typename Overloads::ScalarType< std::decay_t< V > >::type Scalar │ │ │ │ │ +Element type of some SIMD type. │ │ │ │ │ +Definition: simd/interface.hh:235 │ │ │ │ │ +Dune::Simd::min │ │ │ │ │ +auto min(const V &v1, const V &v2) │ │ │ │ │ +The binary minimum value over two simd objects. │ │ │ │ │ +Definition: simd/interface.hh:419 │ │ │ │ │ +std │ │ │ │ │ +STL namespace. │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::PromotionTraits │ │ │ │ │ -Compute type of the result of an arithmetic operation involving two different │ │ │ │ │ -number types. │ │ │ │ │ -Definition: promotiontraits.hh:27 │ │ │ │ │ -Dune::PromotionTraits::PromotedType │ │ │ │ │ -decltype(std::declval< T1 >()+std::declval< T2 >()) PromotedType │ │ │ │ │ -Definition: promotiontraits.hh:28 │ │ │ │ │ -Dune::PromotionTraits<_T1,_T1_>::PromotedType │ │ │ │ │ -T1 PromotedType │ │ │ │ │ -Definition: promotiontraits.hh:35 │ │ │ │ │ +Dune::AlignedNumberImpl::min │ │ │ │ │ +auto min(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > │ │ │ │ │ +&b) │ │ │ │ │ +Definition: debugalign.hh:447 │ │ │ │ │ +Dune::AlignedNumberImpl::max │ │ │ │ │ +auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > │ │ │ │ │ +&b) │ │ │ │ │ +Definition: debugalign.hh:425 │ │ │ │ │ +Dune::Simd::RebindList │ │ │ │ │ +typename Impl::RemoveEnd< EndMark, TypeList< Types... > >::type RebindList │ │ │ │ │ +A list of types with the final element removed. │ │ │ │ │ +Definition: test.hh:158 │ │ │ │ │ +Dune::Simd::IsLoop │ │ │ │ │ +typename Impl::IsLoop< T >::type IsLoop │ │ │ │ │ +check whether a type is an instance of LoopSIMD │ │ │ │ │ +Definition: test.hh:162 │ │ │ │ │ +Dune::LoopSIMD │ │ │ │ │ +Definition: loop.hh:64 │ │ │ │ │ +Dune::Simd::EndMark │ │ │ │ │ +final element marker for RebindList │ │ │ │ │ +Definition: test.hh:145 │ │ │ │ │ +Dune::Simd::UnitTest │ │ │ │ │ +Definition: test.hh:164 │ │ │ │ │ +Dune::Simd::UnitTest::checkUnaryOps │ │ │ │ │ +void checkUnaryOps() │ │ │ │ │ +Definition: test.hh:1909 │ │ │ │ │ +Dune::Simd::UnitTest::checkBinaryOps │ │ │ │ │ +void checkBinaryOps() │ │ │ │ │ +Definition: test.hh:1952 │ │ │ │ │ +Dune::Simd::UnitTest::checkBinaryOpsScalarVector │ │ │ │ │ +void checkBinaryOpsScalarVector() │ │ │ │ │ +Definition: test.hh:1970 │ │ │ │ │ +Dune::Simd::UnitTest::checkType │ │ │ │ │ +void checkType() │ │ │ │ │ +Definition: test.hh:1866 │ │ │ │ │ +Dune::Simd::UnitTest::check │ │ │ │ │ +void check() │ │ │ │ │ +run unit tests for simd vector type V │ │ │ │ │ +Definition: test.hh:1839 │ │ │ │ │ +Dune::Simd::UnitTest::checkBinaryOpsVectorScalar │ │ │ │ │ +void checkBinaryOpsVectorScalar() │ │ │ │ │ +Definition: test.hh:1985 │ │ │ │ │ +Dune::Simd::UnitTest::good │ │ │ │ │ +bool good() const │ │ │ │ │ +whether all tests succeeded │ │ │ │ │ +Definition: test.hh:1859 │ │ │ │ │ +Dune::Simd::UnitTest::checkBinaryOpsVectorVector │ │ │ │ │ +void checkBinaryOpsVectorVector() │ │ │ │ │ +Definition: test.hh:1960 │ │ │ │ │ +Dune::Simd::UnitTest::checkNonOps │ │ │ │ │ +void checkNonOps() │ │ │ │ │ +Definition: test.hh:1878 │ │ │ │ │ +Dune::Simd::UnitTest::checkBinaryOpsVectorProxy │ │ │ │ │ +void checkBinaryOpsVectorProxy() │ │ │ │ │ +Definition: test.hh:2010 │ │ │ │ │ +Dune::Simd::UnitTest::checkBinaryOpsProxyVector │ │ │ │ │ +void checkBinaryOpsProxyVector() │ │ │ │ │ +Definition: test.hh:2000 │ │ │ │ │ +Dune::AlwaysTrue │ │ │ │ │ +template which always yields a true value │ │ │ │ │ +Definition: typetraits.hh:134 │ │ │ │ │ +simd.hh │ │ │ │ │ +Include file for users of the SIMD abstraction layer. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00080.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: transpose.hh File Reference │ │ │ │ +dune-common: exceptions.cc File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,54 +63,25 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
transpose.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
exceptions.cc File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <cstddef>
│ │ │ │ -#include <functional>
│ │ │ │ -#include <dune/common/std/type_traits.hh>
│ │ │ │ -#include <dune/common/fmatrix.hh>
│ │ │ │ -#include <dune/common/promotiontraits.hh>
│ │ │ │ -#include <dune/common/referencehelper.hh>
│ │ │ │ -#include <dune/common/dynmatrix.hh>
│ │ │ │ -#include <dune/common/matrixconcepts.hh>
│ │ │ │ -
│ │ │ │ -

Go to the source code of this file.

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

│ │ │ │ Namespaces

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

│ │ │ │ -Functions

template<class Matrix , std::enable_if_t< Impl::HasMemberFunctionTransposed< Matrix >::value, int > = 0>
auto Dune::transpose (const Matrix &matrix)
 Return the transposed of the given matrix. More...
 
template<class Matrix , std::enable_if_t< not Impl::HasMemberFunctionTransposed< std::decay_t< Matrix > >::value, int > = 0>
auto Dune::transpose (Matrix &&matrix)
 Create a wrapper modelling the transposed matrix. More...
 
template<class Matrix >
auto Dune::transpose (const std::reference_wrapper< Matrix > &matrix)
 Create a wrapper modelling the transposed matrix. More...
 
template<class Matrix >
auto Dune::transposedView (const Matrix &matrix)
 Create a view modelling the transposed matrix. More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,44 +4,17 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Namespaces | Functions │ │ │ │ │ -transpose.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -Go_to_the_source_code_of_this_file. │ │ │ │ │ +Namespaces │ │ │ │ │ +exceptions.cc File Reference │ │ │ │ │ +#include │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ - Functions │ │ │ │ │ -template::value, int > = 0> │ │ │ │ │ -auto Dune::transpose (const Matrix &matrix) │ │ │ │ │ -  Return the transposed of the given matrix. More... │ │ │ │ │ -  │ │ │ │ │ -template >::value, int > = 0> │ │ │ │ │ -auto Dune::transpose (Matrix &&matrix) │ │ │ │ │ -  Create a wrapper modelling the transposed matrix. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto Dune::transpose (const std::reference_wrapper< Matrix > &matrix) │ │ │ │ │ -  Create a wrapper modelling the transposed matrix. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -auto Dune::transposedView (const Matrix &matrix) │ │ │ │ │ -  Create a view modelling the transposed matrix. More... │ │ │ │ │ -  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00083.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: hash.hh File Reference │ │ │ │ +dune-common: typetraits.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,178 +65,134 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Macros | │ │ │ │ +Typedefs | │ │ │ │ Functions
│ │ │ │ -
hash.hh File Reference
│ │ │ │ +
typetraits.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

Support for calculating hash values of objects. │ │ │ │ +

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

│ │ │ │ -
#include <functional>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ +
#include <complex>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <vector>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::hash< T >
 Functor for hashing objects of type T. More...
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::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...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ -Macros

#define DUNE_DEFINE_HASH(template_args, type)
 Defines the required struct specialization to make type hashable via Dune::hash. More...
 
#define DUNE_HASH_TEMPLATE_ARGS(...)
 Wrapper macro for the template arguments in DUNE_DEFINE_HASH. More...
 
#define DUNE_HASH_TYPE(...)
 Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH. More...
 

│ │ │ │ +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. More...
 
template<class Type >
using Dune::field_t = typename FieldTraits< Type >::field_type
 Convenient access to FieldTraits<Type>::field_type. More...
 
template<class Type >
using Dune::real_t = typename FieldTraits< Type >::real_type
 Convenient access to FieldTraits<Type>::real_type. More...
 
template<class T >
using Dune::AutonomousValue = typename AutonomousValueType< T >::type
 Type free of internal references that T can be converted to. More...
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<typename T >
void Dune::hash_combine (std::size_t &seed, const T &arg)
 Calculates the hash value of arg and combines it in-place with seed. More...
 
template<typename It >
std::size_t Dune::hash_range (It first, It last)
 Hashes all elements in the range [first,last) and returns the combined hash. More...
 
template<typename It >
void Dune::hash_range (std::size_t &seed, It first, It last)
 Hashes all elements in the range [first,last) and combines the hashes in-place with seed. More...
 
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. More...
 
template<class T >
constexpr AutonomousValue< T > Dune::autoCopy (T &&v)
 Autonomous copy of an expression's value for use in auto type deduction. More...
 
│ │ │ │

Detailed Description

│ │ │ │ -

Support for calculating hash values of objects.

│ │ │ │ -

This file provides the functor Dune::hash to calculate hash values and some infrastructure to simplify extending Dune::hash for user-defined types, independent of the actual underlying implementation.

│ │ │ │ -

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ DUNE_DEFINE_HASH

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
#define DUNE_DEFINE_HASH( template_args,
 type 
)
│ │ │ │ -
│ │ │ │ - │ │ │ │ -

Defines the required struct specialization to make type hashable via Dune::hash.

│ │ │ │ -

In order to calculate the hash, operator() of the generated specialization will return the result of an unqualified call to the global function hash_value(const type&). As the call is not qualified, the function will be found using argument-dependent lookup, allowing implementors to conveniently place it inside the class body.

│ │ │ │ -

Consider the following type:

│ │ │ │ -
namespace ns {
│ │ │ │ -
template<typename A, int i>
│ │ │ │ -
class Foo
│ │ │ │ -
{
│ │ │ │ -
...
│ │ │ │ -
};
│ │ │ │ -
}
│ │ │ │ -

In order to add support for Dune::hash, you need to extend the definition like this:

│ │ │ │ -
namespace ns {
│ │ │ │ -
template<typename A, int i>
│ │ │ │ -
class Foo
│ │ │ │ -
{
│ │ │ │ -
...
│ │ │ │ -
// The keyword "friend" turns this into a global function that is a friend of Foo.
│ │ │ │ -
inline friend std::size_t hash_value(const Foo& arg)
│ │ │ │ -
{
│ │ │ │ -
return ...;
│ │ │ │ -
}
│ │ │ │ -
};
│ │ │ │ -
}
│ │ │ │ -
│ │ │ │ -
// Define hash struct specialization
│ │ │ │ - │ │ │ │ -
#define DUNE_DEFINE_HASH(template_args, type)
Defines the required struct specialization to make type hashable via Dune::hash.
Definition: hash.hh:100
│ │ │ │ -
#define DUNE_HASH_TYPE(...)
Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH.
Definition: hash.hh:117
│ │ │ │ -
#define DUNE_HASH_TEMPLATE_ARGS(...)
Wrapper macro for the template arguments in DUNE_DEFINE_HASH.
Definition: hash.hh:109
│ │ │ │ -
Warning
As the specialization has to be placed in the original namespace of the hash struct (e.g. std), this macro must be called from the global namespace!
│ │ │ │ -
Parameters
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
template_argsThe template arguments required by the hash struct specialization, wrapped in a call to DUNE_HASH_TEMPLATE_ARGS. If this is a complete specialization, call DUNE_HASH_TEMPLATE_ARGS without arguments.
typeThe exact type of the specialization, wrapped in a call to DUNE_HASH_TYPE.
│ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ -

◆ DUNE_HASH_TEMPLATE_ARGS

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
#define DUNE_HASH_TEMPLATE_ARGS( ...)
│ │ │ │ -
│ │ │ │ - │ │ │ │ -

Wrapper macro for the template arguments in DUNE_DEFINE_HASH.

│ │ │ │ -

This macro should always be used as a wrapper for the template arguments when calling DUNE_DEFINE_HASH. It works around some preprocessor limitations when the template arguments contain commas or the list is completely empty.

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

◆ DUNE_HASH_TYPE

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
#define DUNE_HASH_TYPE( ...)
│ │ │ │ -
│ │ │ │ - │ │ │ │ -

Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH.

│ │ │ │ -

This macro should always be used as a wrapper for the type of the specialization when calling DUNE_DEFINE_HASH. It works around some preprocessor limitations when the type contains commas.

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

Traits for type conversions and type information.

│ │ │ │ +
Author
Markus Blatt, Christian Engwer
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,131 +4,123 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Classes | Namespaces | Macros | Functions │ │ │ │ │ -hash.hh File Reference │ │ │ │ │ -Support for calculating hash values of objects. More... │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Typedefs | Functions │ │ │ │ │ +typetraits.hh File Reference │ │ │ │ │ +Traits for type conversions and type information. More... │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -struct  Dune::hash<_T_> │ │ │ │ │ -  Functor for hashing objects of type T. More... │ │ │ │ │ +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 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 More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::AutonomousValueType<_volatile_const_T_> │ │ │ │ │ +  Specialization to remove both const and volatile qualifiers. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ - Macros │ │ │ │ │ -#define DUNE_DEFINE_HASH(template_args, type) │ │ │ │ │ -  Defines the required struct specialization to make type hashable via │ │ │ │ │ - Dune::hash. More... │ │ │ │ │ -  │ │ │ │ │ -#define DUNE_HASH_TEMPLATE_ARGS(...) │ │ │ │ │ -  Wrapper macro for the template arguments in DUNE_DEFINE_HASH. More... │ │ │ │ │ -  │ │ │ │ │ -#define DUNE_HASH_TYPE(...) │ │ │ │ │ -  Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH. More... │ │ │ │ │ + Typedefs │ │ │ │ │ +template │ │ │ │ │ +using Dune::void_t = typename Impl::voider< Types... >::type │ │ │ │ │ +  Is void for all valid input types. The workhorse for C++11 SFINAE- │ │ │ │ │ + techniques. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +using Dune::field_t = typename FieldTraits< Type >::field_type │ │ │ │ │ +  Convenient access to FieldTraits::field_type. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +using Dune::real_t = typename FieldTraits< Type >::real_type │ │ │ │ │ +  Convenient access to FieldTraits::real_type. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +using Dune::AutonomousValue = typename AutonomousValueType< T >::type │ │ │ │ │ +  Type free of internal references that T can be converted to. More... │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ - void Dune::hash_combine (std::size_t &seed, const T &arg) │ │ │ │ │ -  Calculates the hash value of arg and combines it in-place with │ │ │ │ │ - seed. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -std::size_t Dune::hash_range (It first, It last) │ │ │ │ │ -  Hashes all elements in the range [first,last) and returns the │ │ │ │ │ - combined hash. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void Dune::hash_range (std::size_t &seed, It first, It last) │ │ │ │ │ -  Hashes all elements in the range [first,last) and combines the │ │ │ │ │ - hashes in-place with seed. More... │ │ │ │ │ +template │ │ │ │ │ + constexpr auto Dune::integerSequenceEntry (std:: │ │ │ │ │ + integer_sequence< T, t... >, std:: │ │ │ │ │ + integral_constant< std::size_t, index > i) │ │ │ │ │ +  Get entry of std::integer_sequence. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +constexpr AutonomousValue< T > Dune::autoCopy (T &&v) │ │ │ │ │ +  Autonomous copy of an expression's value for │ │ │ │ │ + use in auto type deduction. More... │ │ │ │ │   │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -Support for calculating hash values of objects. │ │ │ │ │ -This file provides the functor Dune::hash to calculate hash values and some │ │ │ │ │ -infrastructure to simplify extending Dune::hash for user-defined types, │ │ │ │ │ -independent of the actual underlying implementation. │ │ │ │ │ -***** Macro Definition Documentation ***** │ │ │ │ │ -***** ◆ DUNE_DEFINE_HASH ***** │ │ │ │ │ -#define DUNE_DEFINE_HASH (  template_args, │ │ │ │ │ -  type  │ │ │ │ │ - ) │ │ │ │ │ -Defines the required struct specialization to make type hashable via Dune:: │ │ │ │ │ -hash. │ │ │ │ │ -In order to calculate the hash, operator() of the generated specialization will │ │ │ │ │ -return the result of an unqualified call to the global function hash_value │ │ │ │ │ -(const type&). As the call is not qualified, the function will be found using │ │ │ │ │ -argument-dependent lookup, allowing implementors to conveniently place it │ │ │ │ │ -inside the class body. │ │ │ │ │ -Consider the following type: │ │ │ │ │ -namespace ns { │ │ │ │ │ -template │ │ │ │ │ -class Foo │ │ │ │ │ -{ │ │ │ │ │ -... │ │ │ │ │ -}; │ │ │ │ │ -} │ │ │ │ │ -In order to add support for Dune::hash, you need to extend the definition like │ │ │ │ │ -this: │ │ │ │ │ -namespace ns { │ │ │ │ │ -template │ │ │ │ │ -class Foo │ │ │ │ │ -{ │ │ │ │ │ -... │ │ │ │ │ -// The keyword "friend" turns this into a global function that is a friend of │ │ │ │ │ -Foo. │ │ │ │ │ -inline friend std::size_t hash_value(const Foo& arg) │ │ │ │ │ -{ │ │ │ │ │ -return ...; │ │ │ │ │ -} │ │ │ │ │ -}; │ │ │ │ │ -} │ │ │ │ │ -// Define hash struct specialization │ │ │ │ │ -DUNE_DEFINE_HASH(DUNE_HASH_TEMPLATE_ARGS(typename A, int i),DUNE_HASH_TYPE │ │ │ │ │ -(Foo)) │ │ │ │ │ -DUNE_DEFINE_HASH │ │ │ │ │ -#define DUNE_DEFINE_HASH(template_args, type) │ │ │ │ │ -Defines the required struct specialization to make type hashable via Dune:: │ │ │ │ │ -hash. │ │ │ │ │ -Definition: hash.hh:100 │ │ │ │ │ -DUNE_HASH_TYPE │ │ │ │ │ -#define DUNE_HASH_TYPE(...) │ │ │ │ │ -Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH. │ │ │ │ │ -Definition: hash.hh:117 │ │ │ │ │ -DUNE_HASH_TEMPLATE_ARGS │ │ │ │ │ -#define DUNE_HASH_TEMPLATE_ARGS(...) │ │ │ │ │ -Wrapper macro for the template arguments in DUNE_DEFINE_HASH. │ │ │ │ │ -Definition: hash.hh:109 │ │ │ │ │ - Warning │ │ │ │ │ - As the specialization has to be placed in the original namespace of the │ │ │ │ │ - hash struct (e.g. std), this macro must be called from the global │ │ │ │ │ - namespace! │ │ │ │ │ - Parameters │ │ │ │ │ - The template arguments required by the hash struct │ │ │ │ │ - specialization, wrapped in a call to │ │ │ │ │ - template_args DUNE_HASH_TEMPLATE_ARGS. If this is a complete │ │ │ │ │ - specialization, call DUNE_HASH_TEMPLATE_ARGS without │ │ │ │ │ - arguments. │ │ │ │ │ - type The exact type of the specialization, wrapped in a call to │ │ │ │ │ - DUNE_HASH_TYPE. │ │ │ │ │ -***** ◆ DUNE_HASH_TEMPLATE_ARGS ***** │ │ │ │ │ -#define DUNE_HASH_TEMPLATE_ARGS (  ... ) │ │ │ │ │ -Wrapper macro for the template arguments in DUNE_DEFINE_HASH. │ │ │ │ │ -This macro should always be used as a wrapper for the template arguments when │ │ │ │ │ -calling DUNE_DEFINE_HASH. It works around some preprocessor limitations when │ │ │ │ │ -the template arguments contain commas or the list is completely empty. │ │ │ │ │ -***** ◆ DUNE_HASH_TYPE ***** │ │ │ │ │ -#define DUNE_HASH_TYPE (  ... ) │ │ │ │ │ -Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH. │ │ │ │ │ -This macro should always be used as a wrapper for the type of the │ │ │ │ │ -specialization when calling DUNE_DEFINE_HASH. It works around some preprocessor │ │ │ │ │ -limitations when the type contains commas. │ │ │ │ │ +Traits for type conversions and type information. │ │ │ │ │ + Author │ │ │ │ │ + Markus Blatt, Christian Engwer │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00083_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: hash.hh Source File │ │ │ │ +dune-common: typetraits.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,279 +62,383 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
hash.hh
│ │ │ │ +
typetraits.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 (C) 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_HASH_HH
│ │ │ │ -
6#define DUNE_COMMON_HASH_HH
│ │ │ │ +
5#ifndef DUNE_TYPETRAITS_HH
│ │ │ │ +
6#define DUNE_TYPETRAITS_HH
│ │ │ │
7
│ │ │ │ -
8#include <functional>
│ │ │ │ -
9
│ │ │ │ - │ │ │ │ -
11
│ │ │ │ -
24// ********************************************************************************
│ │ │ │ -
25// Doxygen documentation
│ │ │ │ -
26// ********************************************************************************
│ │ │ │ -
27
│ │ │ │ -
28#ifdef DOXYGEN
│ │ │ │ +
8#include <complex>
│ │ │ │ +
9#include <type_traits>
│ │ │ │ +
10#include <utility>
│ │ │ │ +
11#include <vector>
│ │ │ │ +
12
│ │ │ │ +
13namespace Dune
│ │ │ │ +
14{
│ │ │ │ +
15
│ │ │ │ +
16 namespace Impl
│ │ │ │ +
17 {
│ │ │ │ +
19
│ │ │ │ +
23 template <class...>
│ │ │ │ +
24 struct voider
│ │ │ │ +
25 {
│ │ │ │ +
26 using type = void;
│ │ │ │ +
27 };
│ │ │ │ +
28 }
│ │ │ │
29
│ │ │ │ -
30namespace Dune {
│ │ │ │
31
│ │ │ │ -
33
│ │ │ │ -
38 template<typename T>
│ │ │ │ -
39 struct hash
│ │ │ │ -
40 {
│ │ │ │ +
39 template <class... Types>
│ │ │ │ +
40 using void_t = typename Impl::voider<Types...>::type;
│ │ │ │
41
│ │ │ │ -
43 std::size_t operator()(const T& t) const
│ │ │ │ -
44 {
│ │ │ │ -
45 return hash(t);
│ │ │ │ -
46 }
│ │ │ │ -
47
│ │ │ │ -
48 };
│ │ │ │ -
49
│ │ │ │ -
50}
│ │ │ │ -
51
│ │ │ │ -
53
│ │ │ │ -
100#define DUNE_DEFINE_HASH(template_args,type)
│ │ │ │ -
101
│ │ │ │ -
102
│ │ │ │ -
104
│ │ │ │ -
109#define DUNE_HASH_TEMPLATE_ARGS(...)
│ │ │ │ -
110
│ │ │ │ -
112
│ │ │ │ -
117#define DUNE_HASH_TYPE(...)
│ │ │ │ -
118
│ │ │ │ -
119#else // DOXYGEN - hide all the ugly implementation
│ │ │ │ -
120
│ │ │ │ -
121
│ │ │ │ -
122
│ │ │ │ -
123// ********************************************************************************
│ │ │ │ -
124// C++11 support
│ │ │ │ -
125// ********************************************************************************
│ │ │ │ -
126
│ │ │ │ -
127// import std::hash into Dune namespace
│ │ │ │ -
128namespace Dune {
│ │ │ │ -
129
│ │ │ │ -
130 using std::hash;
│ │ │ │ -
131
│ │ │ │ -
132}
│ │ │ │ -
133
│ │ │ │ -
134// Macro for defining a std::hash specialization for type.
│ │ │ │ -
135// This should not be called directly. Call DUNE_DEFINE_HASH
│ │ │ │ -
136// instead.
│ │ │ │ -
137#define DUNE_DEFINE_STD_HASH(template_args,type) \
│ │ │ │ -
138 namespace std { \
│ │ │ │ -
139 \
│ │ │ │ -
140 template<template_args> \
│ │ │ │ -
141 struct hash<type> \
│ │ │ │ -
142 { \
│ │ │ │ -
143 \
│ │ │ │ -
144 typedef type argument_type; \
│ │ │ │ -
145 typedef std::size_t result_type; \
│ │ │ │ -
146 \
│ │ │ │ -
147 std::size_t operator()(const type& arg) const \
│ │ │ │ -
148 { \
│ │ │ │ -
149 return hash_value(arg); \
│ │ │ │ -
150 } \
│ │ │ │ -
151 }; \
│ │ │ │ -
152 \
│ │ │ │ -
153 template<template_args> \
│ │ │ │ -
154 struct hash<const type> \
│ │ │ │ -
155 { \
│ │ │ │ -
156 \
│ │ │ │ -
157 typedef type argument_type; \
│ │ │ │ -
158 typedef std::size_t result_type; \
│ │ │ │ -
159 \
│ │ │ │ -
160 std::size_t operator()(const type& arg) const \
│ │ │ │ -
161 { \
│ │ │ │ -
162 return hash_value(arg); \
│ │ │ │ -
163 } \
│ │ │ │ -
164 }; \
│ │ │ │ -
165 \
│ │ │ │ -
166 } \
│ │ │ │ -
167
│ │ │ │ -
168// Wrapper macro for template arguments.
│ │ │ │ -
169// This is required because the template arguments can contain commas,
│ │ │ │ -
170// which will create a macro argument list of unknown length. That in itself
│ │ │ │ -
171// would not be a problem, but DUNE_DEFINE_HASH has to be called with two argument
│ │ │ │ -
172// lists of unknown length. So this macro wraps its arguments with parentheses,
│ │ │ │ -
173// turning it into a single argument. The result is used as the parameter list of
│ │ │ │ -
174// an expansion macro in the calls to the implementation-specific macros
│ │ │ │ -
175// for C++11 and TR1. Noto that technically, this trick is only legal for C++11,
│ │ │ │ -
176// but pretty much every compiler supports variadic macros in C++03 mode, as they
│ │ │ │ -
177// are part of C99.
│ │ │ │ -
178#define DUNE_HASH_TEMPLATE_ARGS(...) (__VA_ARGS__)
│ │ │ │ -
179
│ │ │ │ -
180// Wrapper macro for type to be hashed.
│ │ │ │ -
181// See above for rationale.
│ │ │ │ -
182#define DUNE_HASH_TYPE(...) (__VA_ARGS__)
│ │ │ │ -
183
│ │ │ │ -
184// Expansion macro for the parenthesized argument lists created by
│ │ │ │ -
185// DUNE_HASH_TEMPLATE_ARGS and DUNE_HASH_TYPE.
│ │ │ │ -
186#define DUNE_HASH_EXPAND_VA_ARGS(...) __VA_ARGS__
│ │ │ │ -
187
│ │ │ │ -
188// Define specializations for all discovered hash implementations.
│ │ │ │ -
189#define DUNE_DEFINE_HASH(template_args,type) \
│ │ │ │ -
190 DUNE_DEFINE_STD_HASH(DUNE_HASH_EXPAND_VA_ARGS template_args, DUNE_HASH_EXPAND_VA_ARGS type) \
│ │ │ │ -
191
│ │ │ │ -
192
│ │ │ │ -
193#endif // DOXYGEN
│ │ │ │ -
194
│ │ │ │ -
195
│ │ │ │ +
55 struct Empty {};
│ │ │ │ +
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 };
│ │ │ │ +
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// ********************************************************************************
│ │ │ │ -
198// Some utility functions for combining hashes of member variables.
│ │ │ │ -
199// ********************************************************************************
│ │ │ │ -
200
│ │ │ │ -
201namespace Dune {
│ │ │ │ -
202
│ │ │ │ -
203 // The following functions are an implementation of the proposed hash extensions for
│ │ │ │ -
204 // the C++ standard by Peter Dimov
│ │ │ │ -
205 // (cf. http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf, issue 6.18).
│ │ │ │ -
206 // They are also contained in the boost::functional::hash library by Daniel James, but
│ │ │ │ -
207 // that implementation uses boost::hash internally, while we want to use Dune::hash. They
│ │ │ │ -
208 // are also considered for inclusion in TR2 (then based on std::hash, of course).
│ │ │ │ -
209
│ │ │ │ -
210#ifndef DOXYGEN
│ │ │ │ -
211
│ │ │ │ -
212 // helper struct for providing different hash combining algorithms dependent on
│ │ │ │ -
213 // the size of size_t.
│ │ │ │ -
214 // hash_combiner has to be specialized for the size (in bytes) of std::size_t.
│ │ │ │ -
215 // Specialized versions should provide a method
│ │ │ │ -
216 //
│ │ │ │ -
217 // template <typename typeof_size_t, typename T>
│ │ │ │ -
218 // void operator()(typeof_size_t& seed, const T& arg) const;
│ │ │ │ -
219 //
│ │ │ │ -
220 // that will be called by the interface function hash_combine() described further below.
│ │ │ │ -
221 // The redundant template parameter typeof_size_t is needed to avoid warnings for the
│ │ │ │ -
222 // unused 64-bit specialization on 32-bit systems.
│ │ │ │ -
223 //
│ │ │ │ -
224 // There is no default implementation!
│ │ │ │ -
225 template<int sizeof_size_t>
│ │ │ │ -
226 struct hash_combiner;
│ │ │ │ +
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
│ │ │ │ +
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
│ │ │ │ +
225
│ │ │ │ +
226 namespace Impl {
│ │ │ │
227
│ │ │ │ -
228
│ │ │ │ -
229 // hash combining for 64-bit platforms.
│ │ │ │ -
230 template<>
│ │ │ │ -
231 struct hash_combiner<8>
│ │ │ │ -
232 {
│ │ │ │ -
233
│ │ │ │ -
234 template<typename typeof_size_t, typename T>
│ │ │ │ -
235 void operator()(typeof_size_t& seed, const T& arg) const
│ │ │ │ -
236 {
│ │ │ │ -
237 static_assert(sizeof(typeof_size_t)==8, "hash_combiner::operator() instantiated with nonmatching type and size");
│ │ │ │ -
238
│ │ │ │ -
239 // The following algorithm for combining two 64-bit hash values is inspired by a similar
│ │ │ │ -
240 // function in CityHash (http://cityhash.googlecode.com/svn-history/r2/trunk/src/city.h),
│ │ │ │ -
241 // which is in turn based on ideas from the MurmurHash library. The basic idea is easy to
│ │ │ │ -
242 // grasp, though: New information is XORed into the existing hash multiple times at different
│ │ │ │ -
243 // places (using shift operations), and the resulting pattern is spread over the complete
│ │ │ │ -
244 // range of available bits via multiplication with a "magic" constant. The constants used
│ │ │ │ -
245 // below (47 and 0x9ddfea08eb382d69ULL) are taken from the CityHash implementation.
│ │ │ │ -
246 //
│ │ │ │ -
247 // We opted not to use the mixing algorithm proposed in the C++ working group defect list at
│ │ │ │ -
248 // http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf, p. 57f. because it
│ │ │ │ -
249 // has very bad hash distribution properties if you apply it to lists of very small numbers,
│ │ │ │ -
250 // an application that is frequent in PDELab's ordering framework.
│ │ │ │ +
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
│ │ │ │ +
241
│ │ │ │ +
243
│ │ │ │ +
247 template<typename T, typename I = std::size_t>
│ │ │ │ + │ │ │ │ +
249 : public Impl::IsIndexable<T,I>
│ │ │ │ +
250 {};
│ │ │ │
251
│ │ │ │ -
252 Dune::hash<T> hasher;
│ │ │ │ -
253 const typeof_size_t kMul = 0x9ddfea08eb382d69ULL;
│ │ │ │ -
254 typeof_size_t h = hasher(arg);
│ │ │ │ -
255 typeof_size_t a = (seed ^ h) * kMul;
│ │ │ │ -
256 a ^= (a >> 47);
│ │ │ │ -
257 typeof_size_t b = (h ^ a) * kMul;
│ │ │ │ -
258 b ^= (b >> 47);
│ │ │ │ -
259 b *= kMul;
│ │ │ │ -
260 seed = b;
│ │ │ │ -
261 }
│ │ │ │ -
262
│ │ │ │ -
263 };
│ │ │ │ -
264
│ │ │ │ +
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
│ │ │ │ -
266 // hash combining for 32-bit platforms.
│ │ │ │ -
267 template<>
│ │ │ │ -
268 struct hash_combiner<4>
│ │ │ │ -
269 {
│ │ │ │ -
270
│ │ │ │ -
271 template<typename typeof_size_t, typename T>
│ │ │ │ -
272 void operator()(typeof_size_t& seed, const T& arg) const
│ │ │ │ -
273 {
│ │ │ │ -
274 static_assert(sizeof(typeof_size_t)==4, "hash_combiner::operator() instantiated with nonmatching type and size");
│ │ │ │ -
275
│ │ │ │ -
276 // The default algorithm above requires a 64-bit std::size_t. The following algorithm is a
│ │ │ │ -
277 // 32-bit compatible fallback, again inspired by CityHash and MurmurHash
│ │ │ │ -
278 // (http://cityhash.googlecode.com/svn-history/r2/trunk/src/city.cc).
│ │ │ │ -
279 // It uses 32-bit constants and relies on rotation instead of multiplication to spread the
│ │ │ │ -
280 // mixed bits as that is apparently more efficient on IA-32. The constants used below are again
│ │ │ │ -
281 // taken from CityHash, in particular from the file referenced above.
│ │ │ │ -
282
│ │ │ │ -
283 Dune::hash<T> hasher;
│ │ │ │ -
284 const typeof_size_t c1 = 0xcc9e2d51;
│ │ │ │ -
285 const typeof_size_t c2 = 0x1b873593;
│ │ │ │ -
286 const typeof_size_t c3 = 0xe6546b64;
│ │ │ │ -
287 typeof_size_t h = hasher(arg);
│ │ │ │ -
288 typeof_size_t a = seed * c1;
│ │ │ │ -
289 a = (a >> 17) | (a << (32 - 17));
│ │ │ │ -
290 a *= c2;
│ │ │ │ -
291 h ^= a;
│ │ │ │ -
292 h = (h >> 19) | (h << (32 - 19));
│ │ │ │ -
293 seed = h * 5 + c3;
│ │ │ │ -
294 }
│ │ │ │ -
295
│ │ │ │ -
296 };
│ │ │ │ -
297
│ │ │ │ -
298#endif // DOXYGEN
│ │ │ │ -
299
│ │ │ │ -
301
│ │ │ │ -
306 template<typename T>
│ │ │ │ -
307 inline void hash_combine(std::size_t& seed, const T& arg)
│ │ │ │ -
308 {
│ │ │ │ -
309 hash_combiner<sizeof(std::size_t)>()(seed,arg);
│ │ │ │ -
310 }
│ │ │ │ -
311
│ │ │ │ -
313
│ │ │ │ -
321 template<typename It>
│ │ │ │ -
322 inline std::size_t hash_range(It first, It last)
│ │ │ │ -
323 {
│ │ │ │ -
324 std::size_t seed = 0;
│ │ │ │ -
325 for (; first != last; ++first)
│ │ │ │ -
326 {
│ │ │ │ -
327 hash_combine(seed,*first);
│ │ │ │ -
328 }
│ │ │ │ -
329 return seed;
│ │ │ │ -
330 }
│ │ │ │ +
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
│ │ │ │ -
340 template<typename It>
│ │ │ │ -
341 inline void hash_range(std::size_t& seed, It first, It last)
│ │ │ │ -
342 {
│ │ │ │ -
343 for (; first != last; ++first)
│ │ │ │ -
344 {
│ │ │ │ -
345 hash_combine(seed,*first);
│ │ │ │ -
346 }
│ │ │ │ -
347 }
│ │ │ │ +
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
│ │ │ │ -
349} // end namespace Dune
│ │ │ │ -
350
│ │ │ │ -
351#endif // DUNE_COMMON_HASH_HH
│ │ │ │ -
Traits for type conversions and type information.
│ │ │ │ +
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
│ │ │ │ +
401 template<typename... T>
│ │ │ │ +
402 struct SizeOf
│ │ │ │ +
403 : public std::integral_constant<std::size_t,sizeof...(T)>
│ │ │ │ +
404 {};
│ │ │ │ +
405
│ │ │ │ +
406
│ │ │ │ +
407#ifndef DOXYGEN
│ │ │ │ +
408
│ │ │ │ +
409 namespace Impl {
│ │ │ │ +
410
│ │ │ │ +
411 template<class T, T...>
│ │ │ │ +
412 struct IntegerSequenceHelper;
│ │ │ │ +
413
│ │ │ │ +
414 // Helper struct to compute the i-th entry of a std::integer_sequence
│ │ │ │ +
415 //
│ │ │ │ +
416 // This could also be implemented using std::get<index>(std::make_tuple(t...)).
│ │ │ │ +
417 // However, the gcc-6 implementation of std::make_tuple increases the instantiation
│ │ │ │ +
418 // depth by 15 levels for each argument, such that the maximal instantiation depth
│ │ │ │ +
419 // is easily hit, especially with clang where it is set to 256.
│ │ │ │ +
420 template<class T, T head, T... tail>
│ │ │ │ +
421 struct IntegerSequenceHelper<T, head, tail...>
│ │ │ │ +
422 {
│ │ │ │ +
423
│ │ │ │ +
424 // get first entry
│ │ │ │ +
425 static constexpr auto get(std::integral_constant<std::size_t, 0>)
│ │ │ │ +
426 {
│ │ │ │ +
427 return std::integral_constant<T, head>();
│ │ │ │ +
428 }
│ │ │ │ +
429
│ │ │ │ +
430 // call get with first entry cut off and decremented index
│ │ │ │ +
431 template<std::size_t index,
│ │ │ │ +
432 std::enable_if_t<(index > 0) and (index < sizeof...(tail)+1), int> = 0>
│ │ │ │ +
433 static constexpr auto get(std::integral_constant<std::size_t, index>)
│ │ │ │ +
434 {
│ │ │ │ +
435 return IntegerSequenceHelper<T, tail...>::get(std::integral_constant<std::size_t, index-1>());
│ │ │ │ +
436 }
│ │ │ │ +
437
│ │ │ │ +
438 // use static assertion if index exceeds size
│ │ │ │ +
439 template<std::size_t index,
│ │ │ │ +
440 std::enable_if_t<(index >= sizeof...(tail)+1), int> = 0>
│ │ │ │ +
441 static constexpr auto get(std::integral_constant<std::size_t, index>)
│ │ │ │ +
442 {
│ │ │ │ +
443 static_assert(index < sizeof...(tail)+1, "index used in IntegerSequenceEntry exceed size");
│ │ │ │ +
444 }
│ │ │ │ +
445 };
│ │ │ │ +
446
│ │ │ │ +
447 } // end namespace Impl
│ │ │ │ +
448
│ │ │ │ +
449#endif // DOXYGEN
│ │ │ │ +
450
│ │ │ │ +
451
│ │ │ │ +
461 template<class T, T... t, std::size_t index>
│ │ │ │ +
462 constexpr auto integerSequenceEntry(std::integer_sequence<T, t...> /*seq*/, std::integral_constant<std::size_t, index> i)
│ │ │ │ +
463 {
│ │ │ │ +
464 static_assert(index < sizeof...(t), "index used in IntegerSequenceEntry exceed size");
│ │ │ │ + │ │ │ │ +
466 }
│ │ │ │ +
467
│ │ │ │ +
468
│ │ │ │ +
475 template<class IntegerSequence, std::size_t index>
│ │ │ │ + │ │ │ │ +
477
│ │ │ │ +
478#ifndef DOXYGEN
│ │ │ │ +
479
│ │ │ │ +
480 template<class T, T... t, std::size_t i>
│ │ │ │ +
481 struct IntegerSequenceEntry<std::integer_sequence<T, t...>, i>
│ │ │ │ +
482 : public decltype(Impl::IntegerSequenceHelper<T, t...>::get(std::integral_constant<std::size_t, i>()))
│ │ │ │ +
483 {};
│ │ │ │ +
484
│ │ │ │ +
485#endif // DOXYGEN
│ │ │ │ +
486
│ │ │ │ +
500 template<class T>
│ │ │ │ +
501 struct AutonomousValueType { using type = T; };
│ │ │ │ +
502
│ │ │ │ +
504 template<class T>
│ │ │ │ + │ │ │ │ +
506
│ │ │ │ +
508 template<class T>
│ │ │ │ + │ │ │ │ +
510
│ │ │ │ +
512 template<class T>
│ │ │ │ + │ │ │ │ +
514
│ │ │ │ +
516 template<class T>
│ │ │ │ +
517 struct AutonomousValueType<volatile T> : AutonomousValueType<T> {};
│ │ │ │ +
518
│ │ │ │ +
520 template<>
│ │ │ │ +
521 struct AutonomousValueType<std::vector<bool>::reference>
│ │ │ │ +
522 {
│ │ │ │ +
523 using type = bool;
│ │ │ │ +
524 };
│ │ │ │ +
525
│ │ │ │ +
527 template<class T>
│ │ │ │ +
528 struct AutonomousValueType<volatile const T> : AutonomousValueType<T> {};
│ │ │ │ +
529
│ │ │ │ +
557 template<class T>
│ │ │ │ + │ │ │ │ +
559
│ │ │ │ +
641 template<class T>
│ │ │ │ + │ │ │ │ +
643 {
│ │ │ │ +
644 return v;
│ │ │ │ +
645 }
│ │ │ │ +
646
│ │ │ │ +
648}
│ │ │ │ +
649#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:462
│ │ │ │ +
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:642
│ │ │ │ +
typename AutonomousValueType< T >::type AutonomousValue
Type free of internal references that T can be converted to.
Definition: typetraits.hh:558
│ │ │ │ +
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
│ │ │ │ +
STL namespace.
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
std::size_t hash_range(It first, It last)
Hashes all elements in the range [first,last) and returns the combined hash.
Definition: hash.hh:322
│ │ │ │ -
void hash_combine(std::size_t &seed, const T &arg)
Calculates the hash value of arg and combines it in-place with seed.
Definition: hash.hh:307
│ │ │ │ -
Functor for hashing objects of type T.
Definition: hash.hh:40
│ │ │ │ -
std::size_t operator()(const T &t) const
Calculates the hash of t.
Definition: hash.hh:43
│ │ │ │ +
Reference get(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const Key &key)
Definition: propertymap.hh:84
│ │ │ │ +
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
│ │ │ │ +
Compute size of variadic type list.
Definition: typetraits.hh:404
│ │ │ │ +
Get entry of std::integer_sequence.
Definition: typetraits.hh:476
│ │ │ │ +
Type free of internal references that T can be converted to.
Definition: typetraits.hh:501
│ │ │ │ +
T type
Definition: typetraits.hh:501
│ │ │ │ + │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,332 +4,464 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -hash.hh │ │ │ │ │ +typetraits.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 (C) 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_HASH_HH │ │ │ │ │ - 6#define DUNE_COMMON_HASH_HH │ │ │ │ │ + 5#ifndef DUNE_TYPETRAITS_HH │ │ │ │ │ + 6#define DUNE_TYPETRAITS_HH │ │ │ │ │ 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9 │ │ │ │ │ - 10#include │ │ │ │ │ - 11 │ │ │ │ │ - 24/ │ │ │ │ │ -/ │ │ │ │ │ -******************************************************************************** │ │ │ │ │ - 25// Doxygen documentation │ │ │ │ │ - 26/ │ │ │ │ │ -/ │ │ │ │ │ -******************************************************************************** │ │ │ │ │ - 27 │ │ │ │ │ - 28#ifdef DOXYGEN │ │ │ │ │ + 8#include │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12 │ │ │ │ │ + 13namespace Dune │ │ │ │ │ + 14{ │ │ │ │ │ + 15 │ │ │ │ │ + 16 namespace Impl │ │ │ │ │ + 17 { │ │ │ │ │ + 19 │ │ │ │ │ + 23 template │ │ │ │ │ + 24 struct voider │ │ │ │ │ + 25 { │ │ │ │ │ + 26 using type = void; │ │ │ │ │ + 27 }; │ │ │ │ │ + 28 } │ │ │ │ │ 29 │ │ │ │ │ - 30namespace Dune { │ │ │ │ │ 31 │ │ │ │ │ - 33 │ │ │ │ │ - 38 template │ │ │ │ │ -39 struct hash │ │ │ │ │ - 40 { │ │ │ │ │ + 39 template │ │ │ │ │ +40 using void_t = typename Impl::voider::type; │ │ │ │ │ 41 │ │ │ │ │ -43 std::size_t operator()(const T& t) const │ │ │ │ │ - 44 { │ │ │ │ │ - 45 return hash(t); │ │ │ │ │ - 46 } │ │ │ │ │ - 47 │ │ │ │ │ - 48 }; │ │ │ │ │ - 49 │ │ │ │ │ - 50} │ │ │ │ │ - 51 │ │ │ │ │ - 53 │ │ │ │ │ -100#define DUNE_DEFINE_HASH(template_args,type) │ │ │ │ │ - 101 │ │ │ │ │ - 102 │ │ │ │ │ - 104 │ │ │ │ │ -109#define DUNE_HASH_TEMPLATE_ARGS(...) │ │ │ │ │ - 110 │ │ │ │ │ - 112 │ │ │ │ │ -117#define DUNE_HASH_TYPE(...) │ │ │ │ │ - 118 │ │ │ │ │ - 119#else // DOXYGEN - hide all the ugly implementation │ │ │ │ │ - 120 │ │ │ │ │ - 121 │ │ │ │ │ - 122 │ │ │ │ │ - 123/ │ │ │ │ │ -/ │ │ │ │ │ -******************************************************************************** │ │ │ │ │ - 124// C++11 support │ │ │ │ │ - 125/ │ │ │ │ │ -/ │ │ │ │ │ -******************************************************************************** │ │ │ │ │ - 126 │ │ │ │ │ - 127// import std::hash into Dune namespace │ │ │ │ │ - 128namespace Dune { │ │ │ │ │ - 129 │ │ │ │ │ - 130 using std::hash; │ │ │ │ │ - 131 │ │ │ │ │ - 132} │ │ │ │ │ - 133 │ │ │ │ │ - 134// Macro for defining a std::hash specialization for type. │ │ │ │ │ - 135// This should not be called directly. Call DUNE_DEFINE_HASH │ │ │ │ │ - 136// instead. │ │ │ │ │ - 137#define DUNE_DEFINE_STD_HASH(template_args,type) \ │ │ │ │ │ - 138 namespace std { \ │ │ │ │ │ - 139 \ │ │ │ │ │ - 140 template \ │ │ │ │ │ - 141 struct hash \ │ │ │ │ │ - 142 { \ │ │ │ │ │ - 143 \ │ │ │ │ │ - 144 typedef type argument_type; \ │ │ │ │ │ - 145 typedef std::size_t result_type; \ │ │ │ │ │ - 146 \ │ │ │ │ │ - 147 std::size_t operator()(const type& arg) const \ │ │ │ │ │ - 148 { \ │ │ │ │ │ - 149 return hash_value(arg); \ │ │ │ │ │ - 150 } \ │ │ │ │ │ - 151 }; \ │ │ │ │ │ - 152 \ │ │ │ │ │ - 153 template \ │ │ │ │ │ - 154 struct hash \ │ │ │ │ │ - 155 { \ │ │ │ │ │ - 156 \ │ │ │ │ │ - 157 typedef type argument_type; \ │ │ │ │ │ - 158 typedef std::size_t result_type; \ │ │ │ │ │ - 159 \ │ │ │ │ │ - 160 std::size_t operator()(const type& arg) const \ │ │ │ │ │ - 161 { \ │ │ │ │ │ - 162 return hash_value(arg); \ │ │ │ │ │ - 163 } \ │ │ │ │ │ - 164 }; \ │ │ │ │ │ - 165 \ │ │ │ │ │ - 166 } \ │ │ │ │ │ - 167 │ │ │ │ │ - 168// Wrapper macro for template arguments. │ │ │ │ │ - 169// This is required because the template arguments can contain commas, │ │ │ │ │ - 170// which will create a macro argument list of unknown length. That in │ │ │ │ │ -itself │ │ │ │ │ - 171// would not be a problem, but DUNE_DEFINE_HASH has to be called with two │ │ │ │ │ -argument │ │ │ │ │ - 172// lists of unknown length. So this macro wraps its arguments with │ │ │ │ │ -parentheses, │ │ │ │ │ - 173// turning it into a single argument. The result is used as the parameter │ │ │ │ │ -list of │ │ │ │ │ - 174// an expansion macro in the calls to the implementation-specific macros │ │ │ │ │ - 175// for C++11 and TR1. Noto that technically, this trick is only legal for │ │ │ │ │ -C++11, │ │ │ │ │ - 176// but pretty much every compiler supports variadic macros in C++03 mode, │ │ │ │ │ -as they │ │ │ │ │ - 177// are part of C99. │ │ │ │ │ - 178#define DUNE_HASH_TEMPLATE_ARGS(...) (__VA_ARGS__) │ │ │ │ │ - 179 │ │ │ │ │ - 180// Wrapper macro for type to be hashed. │ │ │ │ │ - 181// See above for rationale. │ │ │ │ │ - 182#define DUNE_HASH_TYPE(...) (__VA_ARGS__) │ │ │ │ │ - 183 │ │ │ │ │ - 184// Expansion macro for the parenthesized argument lists created by │ │ │ │ │ - 185// DUNE_HASH_TEMPLATE_ARGS and DUNE_HASH_TYPE. │ │ │ │ │ - 186#define DUNE_HASH_EXPAND_VA_ARGS(...) __VA_ARGS__ │ │ │ │ │ - 187 │ │ │ │ │ - 188// Define specializations for all discovered hash implementations. │ │ │ │ │ - 189#define DUNE_DEFINE_HASH(template_args,type) \ │ │ │ │ │ - 190 DUNE_DEFINE_STD_HASH(DUNE_HASH_EXPAND_VA_ARGS template_args, │ │ │ │ │ -DUNE_HASH_EXPAND_VA_ARGS type) \ │ │ │ │ │ - 191 │ │ │ │ │ - 192 │ │ │ │ │ - 193#endif // DOXYGEN │ │ │ │ │ - 194 │ │ │ │ │ - 195 │ │ │ │ │ +55 struct Empty {}; │ │ │ │ │ + 56 │ │ │ │ │ + 63 template │ │ │ │ │ +64 struct IsInteroperable │ │ │ │ │ + 65 { │ │ │ │ │ +70 constexpr static bool value = std::is_convertible::value || std:: │ │ │ │ │ +is_convertible::value; │ │ │ │ │ + 71 }; │ │ │ │ │ + 72 │ │ │ │ │ + 78 template │ │ │ │ │ +79 struct EnableIfInterOperable │ │ │ │ │ + 80 : public std::enable_if::value, Type> │ │ │ │ │ + 81 {}; │ │ │ │ │ + 82 │ │ │ │ │ + 100 │ │ │ │ │ + 116 │ │ │ │ │ + 123 template │ │ │ │ │ +124 struct AlwaysFalse : public std::false_type {}; │ │ │ │ │ + 125 │ │ │ │ │ + 133 template │ │ │ │ │ +134 struct AlwaysTrue : public std::true_type {}; │ │ │ │ │ + 135 │ │ │ │ │ + 161 template │ │ │ │ │ +162 struct IsCallable; │ │ │ │ │ + 163 │ │ │ │ │ + 168 template │ │ │ │ │ +169 struct IsCallable │ │ │ │ │ + 170 : public std::bool_constant< │ │ │ │ │ + 171 std::is_invocable_r_v │ │ │ │ │ + 172 && !std::is_member_pointer_v> │ │ │ │ │ + 173 > {}; │ │ │ │ │ + 174 │ │ │ │ │ + 177 │ │ │ │ │ + 192 template │ │ │ │ │ +193 struct IsNumber │ │ │ │ │ + 194 : public std::integral_constant::value> { │ │ │ │ │ + 195 }; │ │ │ │ │ 196 │ │ │ │ │ - 197/ │ │ │ │ │ -/ │ │ │ │ │ -******************************************************************************** │ │ │ │ │ - 198// Some utility functions for combining hashes of member variables. │ │ │ │ │ - 199/ │ │ │ │ │ -/ │ │ │ │ │ -******************************************************************************** │ │ │ │ │ - 200 │ │ │ │ │ - 201namespace Dune { │ │ │ │ │ - 202 │ │ │ │ │ - 203 // The following functions are an implementation of the proposed hash │ │ │ │ │ -extensions for │ │ │ │ │ - 204 // the C++ standard by Peter Dimov │ │ │ │ │ - 205 // (cf. http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf, │ │ │ │ │ -issue 6.18). │ │ │ │ │ - 206 // They are also contained in the boost::functional::hash library by │ │ │ │ │ -Daniel James, but │ │ │ │ │ - 207 // that implementation uses boost::hash internally, while we want to use │ │ │ │ │ -Dune::hash. They │ │ │ │ │ - 208 // are also considered for inclusion in TR2 (then based on std::hash, of │ │ │ │ │ -course). │ │ │ │ │ - 209 │ │ │ │ │ - 210#ifndef DOXYGEN │ │ │ │ │ - 211 │ │ │ │ │ - 212 // helper struct for providing different hash combining algorithms │ │ │ │ │ -dependent on │ │ │ │ │ - 213 // the size of size_t. │ │ │ │ │ - 214 // hash_combiner has to be specialized for the size (in bytes) of std:: │ │ │ │ │ -size_t. │ │ │ │ │ - 215 // Specialized versions should provide a method │ │ │ │ │ - 216 // │ │ │ │ │ - 217 // template │ │ │ │ │ - 218 // void operator()(typeof_size_t& seed, const T& arg) const; │ │ │ │ │ - 219 // │ │ │ │ │ - 220 // that will be called by the interface function hash_combine() described │ │ │ │ │ -further below. │ │ │ │ │ - 221 // The redundant template parameter typeof_size_t is needed to avoid │ │ │ │ │ -warnings for the │ │ │ │ │ - 222 // unused 64-bit specialization on 32-bit systems. │ │ │ │ │ - 223 // │ │ │ │ │ - 224 // There is no default implementation! │ │ │ │ │ - 225 template │ │ │ │ │ - 226 struct hash_combiner; │ │ │ │ │ + 197#ifndef DOXYGEN │ │ │ │ │ + 198 │ │ │ │ │ + 199 template │ │ │ │ │ + 200 struct IsNumber> │ │ │ │ │ + 201 : public std::integral_constant::value> { │ │ │ │ │ + 202 }; │ │ │ │ │ + 203 │ │ │ │ │ + 204#endif // DOXYGEN │ │ │ │ │ + 205 │ │ │ │ │ + 207 │ │ │ │ │ + 210 template │ │ │ │ │ +211 struct HasNaN │ │ │ │ │ + 212 : public std::integral_constant::value> { │ │ │ │ │ + 213 }; │ │ │ │ │ + 214 │ │ │ │ │ + 215#ifndef DOXYGEN │ │ │ │ │ + 216 │ │ │ │ │ + 217 template │ │ │ │ │ + 218 struct HasNaN> │ │ │ │ │ + 219 : public std::integral_constant::value> { │ │ │ │ │ + 220 }; │ │ │ │ │ + 221 │ │ │ │ │ + 222#endif // DOXYGEN │ │ │ │ │ + 223 │ │ │ │ │ + 224#ifndef DOXYGEN │ │ │ │ │ + 225 │ │ │ │ │ + 226 namespace Impl { │ │ │ │ │ 227 │ │ │ │ │ - 228 │ │ │ │ │ - 229 // hash combining for 64-bit platforms. │ │ │ │ │ - 230 template<> │ │ │ │ │ - 231 struct hash_combiner<8> │ │ │ │ │ - 232 { │ │ │ │ │ - 233 │ │ │ │ │ - 234 template │ │ │ │ │ - 235 void operator()(typeof_size_t& seed, const T& arg) const │ │ │ │ │ - 236 { │ │ │ │ │ - 237 static_assert(sizeof(typeof_size_t)==8, "hash_combiner::operator() │ │ │ │ │ -instantiated with nonmatching type and size"); │ │ │ │ │ - 238 │ │ │ │ │ - 239 // The following algorithm for combining two 64-bit hash values is │ │ │ │ │ -inspired by a similar │ │ │ │ │ - 240 // function in CityHash (http://cityhash.googlecode.com/svn-history/r2/ │ │ │ │ │ -trunk/src/city.h), │ │ │ │ │ - 241 // which is in turn based on ideas from the MurmurHash library. The basic │ │ │ │ │ -idea is easy to │ │ │ │ │ - 242 // grasp, though: New information is XORed into the existing hash multiple │ │ │ │ │ -times at different │ │ │ │ │ - 243 // places (using shift operations), and the resulting pattern is spread │ │ │ │ │ -over the complete │ │ │ │ │ - 244 // range of available bits via multiplication with a "magic" constant. The │ │ │ │ │ -constants used │ │ │ │ │ - 245 // below (47 and 0x9ddfea08eb382d69ULL) are taken from the CityHash │ │ │ │ │ -implementation. │ │ │ │ │ - 246 // │ │ │ │ │ - 247 // We opted not to use the mixing algorithm proposed in the C++ working │ │ │ │ │ -group defect list at │ │ │ │ │ - 248 // http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf, p. │ │ │ │ │ -57f. because it │ │ │ │ │ - 249 // has very bad hash distribution properties if you apply it to lists of │ │ │ │ │ -very small numbers, │ │ │ │ │ - 250 // an application that is frequent in PDELab's ordering framework. │ │ │ │ │ + 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 │ │ │ │ │ + 241 │ │ │ │ │ + 243 │ │ │ │ │ + 247 template │ │ │ │ │ +248 struct IsIndexable │ │ │ │ │ + 249 : public Impl::IsIndexable │ │ │ │ │ + 250 {}; │ │ │ │ │ 251 │ │ │ │ │ - 252 Dune::hash hasher; │ │ │ │ │ - 253 const typeof_size_t kMul = 0x9ddfea08eb382d69ULL; │ │ │ │ │ - 254 typeof_size_t h = hasher(arg); │ │ │ │ │ - 255 typeof_size_t a = (seed ^ h) * kMul; │ │ │ │ │ - 256 a ^= (a >> 47); │ │ │ │ │ - 257 typeof_size_t b = (h ^ a) * kMul; │ │ │ │ │ - 258 b ^= (b >> 47); │ │ │ │ │ - 259 b *= kMul; │ │ │ │ │ - 260 seed = b; │ │ │ │ │ - 261 } │ │ │ │ │ - 262 │ │ │ │ │ - 263 }; │ │ │ │ │ - 264 │ │ │ │ │ + 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 │ │ │ │ │ - 266 // hash combining for 32-bit platforms. │ │ │ │ │ - 267 template<> │ │ │ │ │ - 268 struct hash_combiner<4> │ │ │ │ │ - 269 { │ │ │ │ │ - 270 │ │ │ │ │ - 271 template │ │ │ │ │ - 272 void operator()(typeof_size_t& seed, const T& arg) const │ │ │ │ │ - 273 { │ │ │ │ │ - 274 static_assert(sizeof(typeof_size_t)==4, "hash_combiner::operator() │ │ │ │ │ -instantiated with nonmatching type and size"); │ │ │ │ │ - 275 │ │ │ │ │ - 276 // The default algorithm above requires a 64-bit std::size_t. The │ │ │ │ │ -following algorithm is a │ │ │ │ │ - 277 // 32-bit compatible fallback, again inspired by CityHash and MurmurHash │ │ │ │ │ - 278 // (http://cityhash.googlecode.com/svn-history/r2/trunk/src/city.cc). │ │ │ │ │ - 279 // It uses 32-bit constants and relies on rotation instead of │ │ │ │ │ -multiplication to spread the │ │ │ │ │ - 280 // mixed bits as that is apparently more efficient on IA-32. The constants │ │ │ │ │ -used below are again │ │ │ │ │ - 281 // taken from CityHash, in particular from the file referenced above. │ │ │ │ │ - 282 │ │ │ │ │ - 283 Dune::hash hasher; │ │ │ │ │ - 284 const typeof_size_t c1 = 0xcc9e2d51; │ │ │ │ │ - 285 const typeof_size_t c2 = 0x1b873593; │ │ │ │ │ - 286 const typeof_size_t c3 = 0xe6546b64; │ │ │ │ │ - 287 typeof_size_t h = hasher(arg); │ │ │ │ │ - 288 typeof_size_t a = seed * c1; │ │ │ │ │ - 289 a = (a >> 17) | (a << (32 - 17)); │ │ │ │ │ - 290 a *= c2; │ │ │ │ │ - 291 h ^= a; │ │ │ │ │ - 292 h = (h >> 19) | (h << (32 - 19)); │ │ │ │ │ - 293 seed = h * 5 + c3; │ │ │ │ │ - 294 } │ │ │ │ │ - 295 │ │ │ │ │ - 296 }; │ │ │ │ │ - 297 │ │ │ │ │ - 298#endif // DOXYGEN │ │ │ │ │ - 299 │ │ │ │ │ - 301 │ │ │ │ │ - 306 template │ │ │ │ │ -307 inline void hash_combine(std::size_t& seed, const T& arg) │ │ │ │ │ - 308 { │ │ │ │ │ - 309 hash_combiner()(seed,arg); │ │ │ │ │ - 310 } │ │ │ │ │ - 311 │ │ │ │ │ - 313 │ │ │ │ │ - 321 template │ │ │ │ │ -322 inline std::size_t hash_range(It first, It last) │ │ │ │ │ - 323 { │ │ │ │ │ - 324 std::size_t seed = 0; │ │ │ │ │ - 325 for (; first != last; ++first) │ │ │ │ │ - 326 { │ │ │ │ │ - 327 hash_combine(seed,*first); │ │ │ │ │ - 328 } │ │ │ │ │ - 329 return seed; │ │ │ │ │ - 330 } │ │ │ │ │ + 269 // default version, gets picked if SFINAE fails │ │ │ │ │ + 270 template │ │ │ │ │ +271 struct IsIterable │ │ │ │ │ + 272 : public std::false_type │ │ │ │ │ + 273 {}; │ │ │ │ │ + 274 │ │ │ │ │ + 275#ifndef DOXYGEN │ │ │ │ │ + 276 // version for types with begin() and end() │ │ │ │ │ + 277 template │ │ │ │ │ + 278 struct IsIterable().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 │ │ │ │ │ +297 using field_t = typename FieldTraits::field_type; │ │ │ │ │ + 298 │ │ │ │ │ + 300 template │ │ │ │ │ +301 using real_t = typename FieldTraits::real_type; │ │ │ │ │ + 302 │ │ │ │ │ + 303 │ │ │ │ │ + 304#ifndef DOXYGEN │ │ │ │ │ + 305 │ │ │ │ │ + 306 // Implementation of IsTuple │ │ │ │ │ + 307 namespace Impl { │ │ │ │ │ + 308 │ │ │ │ │ + 309 template │ │ │ │ │ + 310 struct IsTuple : public std::false_type │ │ │ │ │ + 311 {}; │ │ │ │ │ + 312 │ │ │ │ │ + 313 template │ │ │ │ │ + 314 struct IsTuple> : public std::true_type │ │ │ │ │ + 315 {}; │ │ │ │ │ + 316 │ │ │ │ │ + 317 } // namespace Impl │ │ │ │ │ + 318 │ │ │ │ │ + 319#endif // DOXYGEN │ │ │ │ │ + 320 │ │ │ │ │ + 326 template │ │ │ │ │ +327 struct IsTuple : │ │ │ │ │ + 328 public Impl::IsTuple │ │ │ │ │ + 329 {}; │ │ │ │ │ + 330 │ │ │ │ │ 331 │ │ │ │ │ + 332#ifndef DOXYGEN │ │ │ │ │ 333 │ │ │ │ │ - 340 template │ │ │ │ │ -341 inline void hash_range(std::size_t& seed, It first, It last) │ │ │ │ │ - 342 { │ │ │ │ │ - 343 for (; first != last; ++first) │ │ │ │ │ - 344 { │ │ │ │ │ - 345 hash_combine(seed,*first); │ │ │ │ │ - 346 } │ │ │ │ │ - 347 } │ │ │ │ │ + 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 │ │ │ │ │ - 349} // end namespace Dune │ │ │ │ │ - 350 │ │ │ │ │ - 351#endif // DUNE_COMMON_HASH_HH │ │ │ │ │ -typetraits.hh │ │ │ │ │ -Traits for type conversions and type information. │ │ │ │ │ + 354 template │ │ │ │ │ +355 struct IsTupleOrDerived : │ │ │ │ │ + 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 IsIntegralConstant : public std::false_type │ │ │ │ │ + 367 {}; │ │ │ │ │ + 368 │ │ │ │ │ + 369 template │ │ │ │ │ + 370 struct IsIntegralConstant> : public std:: │ │ │ │ │ +true_type │ │ │ │ │ + 371 {}; │ │ │ │ │ + 372 │ │ │ │ │ + 373 } // namespace Impl │ │ │ │ │ + 374 │ │ │ │ │ + 375#endif // DOXYGEN │ │ │ │ │ + 376 │ │ │ │ │ + 382 template │ │ │ │ │ +383 struct IsIntegralConstant : public Impl::IsIntegralConstant> │ │ │ │ │ + 384 {}; │ │ │ │ │ + 385 │ │ │ │ │ + 386 │ │ │ │ │ + 387 │ │ │ │ │ + 401 template │ │ │ │ │ +402 struct SizeOf │ │ │ │ │ + 403 : public std::integral_constant │ │ │ │ │ + 404 {}; │ │ │ │ │ + 405 │ │ │ │ │ + 406 │ │ │ │ │ + 407#ifndef DOXYGEN │ │ │ │ │ + 408 │ │ │ │ │ + 409 namespace Impl { │ │ │ │ │ + 410 │ │ │ │ │ + 411 template │ │ │ │ │ + 412 struct IntegerSequenceHelper; │ │ │ │ │ + 413 │ │ │ │ │ + 414 // Helper struct to compute the i-th entry of a std::integer_sequence │ │ │ │ │ + 415 // │ │ │ │ │ + 416 // This could also be implemented using std::get(std::make_tuple │ │ │ │ │ +(t...)). │ │ │ │ │ + 417 // However, the gcc-6 implementation of std::make_tuple increases the │ │ │ │ │ +instantiation │ │ │ │ │ + 418 // depth by 15 levels for each argument, such that the maximal │ │ │ │ │ +instantiation depth │ │ │ │ │ + 419 // is easily hit, especially with clang where it is set to 256. │ │ │ │ │ + 420 template │ │ │ │ │ + 421 struct IntegerSequenceHelper │ │ │ │ │ + 422 { │ │ │ │ │ + 423 │ │ │ │ │ + 424 // get first entry │ │ │ │ │ + 425 static constexpr auto get(std::integral_constant) │ │ │ │ │ + 426 { │ │ │ │ │ + 427 return std::integral_constant(); │ │ │ │ │ + 428 } │ │ │ │ │ + 429 │ │ │ │ │ + 430 // call get with first entry cut off and decremented index │ │ │ │ │ + 431 template 0) and (index < sizeof...(tail)+1), int> = 0> │ │ │ │ │ + 433 static constexpr auto get(std::integral_constant) │ │ │ │ │ + 434 { │ │ │ │ │ + 435 return IntegerSequenceHelper::get(std::integral_constant()); │ │ │ │ │ + 436 } │ │ │ │ │ + 437 │ │ │ │ │ + 438 // use static assertion if index exceeds size │ │ │ │ │ + 439 template= sizeof...(tail)+1), int> = 0> │ │ │ │ │ + 441 static constexpr auto get(std::integral_constant) │ │ │ │ │ + 442 { │ │ │ │ │ + 443 static_assert(index < sizeof...(tail)+1, "index used in │ │ │ │ │ +IntegerSequenceEntry exceed size"); │ │ │ │ │ + 444 } │ │ │ │ │ + 445 }; │ │ │ │ │ + 446 │ │ │ │ │ + 447 } // end namespace Impl │ │ │ │ │ + 448 │ │ │ │ │ + 449#endif // DOXYGEN │ │ │ │ │ + 450 │ │ │ │ │ + 451 │ │ │ │ │ + 461 template │ │ │ │ │ +462 constexpr auto integerSequenceEntry(std::integer_sequence /*seq*/, │ │ │ │ │ +std::integral_constant i) │ │ │ │ │ + 463 { │ │ │ │ │ + 464 static_assert(index < sizeof...(t), "index used in IntegerSequenceEntry │ │ │ │ │ +exceed size"); │ │ │ │ │ + 465 return Impl::IntegerSequenceHelper::get(i); │ │ │ │ │ + 466 } │ │ │ │ │ + 467 │ │ │ │ │ + 468 │ │ │ │ │ + 475 template │ │ │ │ │ +476 struct IntegerSequenceEntry; │ │ │ │ │ + 477 │ │ │ │ │ + 478#ifndef DOXYGEN │ │ │ │ │ + 479 │ │ │ │ │ + 480 template │ │ │ │ │ + 481 struct IntegerSequenceEntry, i> │ │ │ │ │ + 482 : public decltype(Impl::IntegerSequenceHelper::get(std:: │ │ │ │ │ +integral_constant())) │ │ │ │ │ + 483 {}; │ │ │ │ │ + 484 │ │ │ │ │ + 485#endif // DOXYGEN │ │ │ │ │ + 486 │ │ │ │ │ + 500 template │ │ │ │ │ +501 struct AutonomousValueType { using type = T; }; │ │ │ │ │ + 502 │ │ │ │ │ + 504 template │ │ │ │ │ +505 struct AutonomousValueType : AutonomousValueType {}; │ │ │ │ │ + 506 │ │ │ │ │ + 508 template │ │ │ │ │ +509 struct AutonomousValueType : AutonomousValueType {}; │ │ │ │ │ + 510 │ │ │ │ │ + 512 template │ │ │ │ │ +513 struct AutonomousValueType : AutonomousValueType {}; │ │ │ │ │ + 514 │ │ │ │ │ + 516 template │ │ │ │ │ +517 struct AutonomousValueType : AutonomousValueType {}; │ │ │ │ │ + 518 │ │ │ │ │ + 520 template<> │ │ │ │ │ +521 struct AutonomousValueType::reference> │ │ │ │ │ + 522 { │ │ │ │ │ +523 using type = bool; │ │ │ │ │ + 524 }; │ │ │ │ │ + 525 │ │ │ │ │ + 527 template │ │ │ │ │ +528 struct AutonomousValueType : AutonomousValueType {}; │ │ │ │ │ + 529 │ │ │ │ │ + 557 template │ │ │ │ │ +558 using AutonomousValue = typename AutonomousValueType::type; │ │ │ │ │ + 559 │ │ │ │ │ + 641 template │ │ │ │ │ +642 constexpr AutonomousValue autoCopy(T &&v) │ │ │ │ │ + 643 { │ │ │ │ │ + 644 return v; │ │ │ │ │ + 645 } │ │ │ │ │ + 646 │ │ │ │ │ + 648} │ │ │ │ │ + 649#endif │ │ │ │ │ +Dune::integerSequenceEntry │ │ │ │ │ +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:462 │ │ │ │ │ +Dune::real_t │ │ │ │ │ +typename FieldTraits< Type >::real_type real_t │ │ │ │ │ +Convenient access to FieldTraits::real_type. │ │ │ │ │ +Definition: typetraits.hh:301 │ │ │ │ │ +Dune::autoCopy │ │ │ │ │ +constexpr AutonomousValue< T > autoCopy(T &&v) │ │ │ │ │ +Autonomous copy of an expression's value for use in auto type deduction. │ │ │ │ │ +Definition: typetraits.hh:642 │ │ │ │ │ +Dune::AutonomousValue │ │ │ │ │ +typename AutonomousValueType< T >::type AutonomousValue │ │ │ │ │ +Type free of internal references that T can be converted to. │ │ │ │ │ +Definition: typetraits.hh:558 │ │ │ │ │ +Dune::void_t │ │ │ │ │ +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 │ │ │ │ │ +Dune::field_t │ │ │ │ │ +typename FieldTraits< Type >::field_type field_t │ │ │ │ │ +Convenient access to FieldTraits::field_type. │ │ │ │ │ +Definition: typetraits.hh:297 │ │ │ │ │ +std │ │ │ │ │ +STL namespace. │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::hash_range │ │ │ │ │ -std::size_t hash_range(It first, It last) │ │ │ │ │ -Hashes all elements in the range [first,last) and returns the combined hash. │ │ │ │ │ -Definition: hash.hh:322 │ │ │ │ │ -Dune::hash_combine │ │ │ │ │ -void hash_combine(std::size_t &seed, const T &arg) │ │ │ │ │ -Calculates the hash value of arg and combines it in-place with seed. │ │ │ │ │ -Definition: hash.hh:307 │ │ │ │ │ -Dune::hash │ │ │ │ │ -Functor for hashing objects of type T. │ │ │ │ │ -Definition: hash.hh:40 │ │ │ │ │ -Dune::hash::operator() │ │ │ │ │ -std::size_t operator()(const T &t) const │ │ │ │ │ -Calculates the hash of t. │ │ │ │ │ -Definition: hash.hh:43 │ │ │ │ │ +Dune::get │ │ │ │ │ +Reference get(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const │ │ │ │ │ +Key &key) │ │ │ │ │ +Definition: propertymap.hh:84 │ │ │ │ │ +Dune::IsNumber │ │ │ │ │ +Whether this type acts as a scalar in the context of (hierarchically blocked) │ │ │ │ │ +containers. │ │ │ │ │ +Definition: typetraits.hh:194 │ │ │ │ │ +Dune::FieldTraits::field_type │ │ │ │ │ +T field_type │ │ │ │ │ +export the type representing the field │ │ │ │ │ +Definition: ftraits.hh:28 │ │ │ │ │ +Dune::FieldTraits::real_type │ │ │ │ │ +T real_type │ │ │ │ │ +export the type representing the real type of the field │ │ │ │ │ +Definition: ftraits.hh:30 │ │ │ │ │ +Dune::Empty │ │ │ │ │ +Just an empty class. │ │ │ │ │ +Definition: typetraits.hh:55 │ │ │ │ │ +Dune::IsInteroperable │ │ │ │ │ +Checks whether two types are interoperable. │ │ │ │ │ +Definition: typetraits.hh:65 │ │ │ │ │ +Dune::IsInteroperable::value │ │ │ │ │ +static constexpr bool value │ │ │ │ │ +True if either a conversion from T1 to T2 or vice versa exists. │ │ │ │ │ +Definition: typetraits.hh:70 │ │ │ │ │ +Dune::EnableIfInterOperable │ │ │ │ │ +Enable typedef if two types are interoperable. │ │ │ │ │ +Definition: typetraits.hh:81 │ │ │ │ │ +Dune::AlwaysFalse │ │ │ │ │ +template which always yields a false value │ │ │ │ │ +Definition: typetraits.hh:124 │ │ │ │ │ +Dune::AlwaysTrue │ │ │ │ │ +template which always yields a true value │ │ │ │ │ +Definition: typetraits.hh:134 │ │ │ │ │ +Dune::IsCallable │ │ │ │ │ +Check if a type is callable with ()-operator and given arguments. │ │ │ │ │ +Definition: typetraits.hh:162 │ │ │ │ │ +Dune::HasNaN │ │ │ │ │ +Whether this type has a value of NaN. │ │ │ │ │ +Definition: typetraits.hh:212 │ │ │ │ │ +Dune::IsIndexable │ │ │ │ │ +Type trait to determine whether an instance of T has an operator[](I), i.e. │ │ │ │ │ +whether it can be indexed... │ │ │ │ │ +Definition: typetraits.hh:250 │ │ │ │ │ +Dune::IsIterable │ │ │ │ │ +typetrait to check that a class has begin() and end() members │ │ │ │ │ +Definition: typetraits.hh:273 │ │ │ │ │ +Dune::IsTuple │ │ │ │ │ +Check if T is a std::tuple<...> │ │ │ │ │ +Definition: typetraits.hh:329 │ │ │ │ │ +Dune::IsTupleOrDerived │ │ │ │ │ +Check if T derived from a std::tuple<...> │ │ │ │ │ +Definition: typetraits.hh:357 │ │ │ │ │ +Dune::IsIntegralConstant │ │ │ │ │ +Check if T is an std::integral_constant │ │ │ │ │ +Definition: typetraits.hh:384 │ │ │ │ │ +Dune::SizeOf │ │ │ │ │ +Compute size of variadic type list. │ │ │ │ │ +Definition: typetraits.hh:404 │ │ │ │ │ +Dune::IntegerSequenceEntry │ │ │ │ │ +Get entry of std::integer_sequence. │ │ │ │ │ +Definition: typetraits.hh:476 │ │ │ │ │ +Dune::AutonomousValueType │ │ │ │ │ +Type free of internal references that T can be converted to. │ │ │ │ │ +Definition: typetraits.hh:501 │ │ │ │ │ +Dune::AutonomousValueType::type │ │ │ │ │ +T type │ │ │ │ │ +Definition: typetraits.hh:501 │ │ │ │ │ +Dune::AutonomousValueType<_std::vector<_bool_>::reference_>::type │ │ │ │ │ +bool type │ │ │ │ │ +Definition: typetraits.hh:523 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00086.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: ftraits.hh File Reference │ │ │ │ +dune-common: bitsetvector.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,46 +65,58 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
ftraits.hh File Reference
│ │ │ │ +
bitsetvector.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

Type traits to determine the type of reals (when working with complex numbers) │ │ │ │ +

Efficient implementation of a dynamic array of static arrays of booleans. │ │ │ │ More...

│ │ │ │ -
#include <complex>
│ │ │ │ -#include <vector>
│ │ │ │ +
#include <vector>
│ │ │ │ +#include <bitset>
│ │ │ │ +#include <iostream>
│ │ │ │ +#include <algorithm>
│ │ │ │ +#include <dune/common/boundschecking.hh>
│ │ │ │ +#include <dune/common/genericiterator.hh>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::FieldTraits< T >
class  Dune::BitSetVectorConstReference< block_size, Alloc >
 A proxy class that acts as a const reference to a single bitset in a BitSetVector. More...
 
struct  Dune::FieldTraits< const T >
class  Dune::BitSetVectorReference< block_size, Alloc >
 A proxy class that acts as a mutable reference to a single bitset in a BitSetVector. More...
 
struct  Dune::FieldTraits< std::complex< T > >
struct  Dune::const_reference< BitSetVectorReference< block_size, Alloc > >
 
struct  Dune::FieldTraits< T[N] >
struct  Dune::const_reference< BitSetVectorConstReference< block_size, Alloc > >
 
struct  Dune::FieldTraits< std::vector< T > >
struct  Dune::mutable_reference< BitSetVectorReference< block_size, Alloc > >
 
struct  Dune::mutable_reference< BitSetVectorConstReference< block_size, Alloc > >
 
class  Dune::BitSetVector< block_size, Allocator >
 A dynamic array of blocks of booleans. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 Dune namespace.
 
│ │ │ │

Detailed Description

│ │ │ │ -

Type traits to determine the type of reals (when working with complex numbers)

│ │ │ │ +

Efficient implementation of a dynamic array of static arrays of booleans.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,33 +5,49 @@ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ Classes | Namespaces │ │ │ │ │ -ftraits.hh File Reference │ │ │ │ │ -Type traits to determine the type of reals (when working with complex numbers) │ │ │ │ │ +bitsetvector.hh File Reference │ │ │ │ │ +Efficient implementation of a dynamic array of static arrays of booleans. │ │ │ │ │ More... │ │ │ │ │ -#include │ │ │ │ │ #include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -struct  Dune::FieldTraits<_T_> │ │ │ │ │ + class  Dune::BitSetVectorConstReference<_block_size,_Alloc_> │ │ │ │ │ +  A proxy class that acts as a const reference to a single bitset in a │ │ │ │ │ + BitSetVector. More... │ │ │ │ │   │ │ │ │ │ -struct  Dune::FieldTraits<_const_T_> │ │ │ │ │ + class  Dune::BitSetVectorReference<_block_size,_Alloc_> │ │ │ │ │ +  A proxy class that acts as a mutable reference to a single bitset in a │ │ │ │ │ + BitSetVector. More... │ │ │ │ │   │ │ │ │ │ -struct  Dune::FieldTraits<_std::complex<_T_>_> │ │ │ │ │ +struct  Dune::const_reference<_BitSetVectorReference<_block_size,_Alloc_>_> │ │ │ │ │   │ │ │ │ │ -struct  Dune::FieldTraits<_T[N]_> │ │ │ │ │ +struct  Dune::const_reference<_BitSetVectorConstReference<_block_size,_Alloc_> │ │ │ │ │ + > │ │ │ │ │   │ │ │ │ │ -struct  Dune::FieldTraits<_std::vector<_T_>_> │ │ │ │ │ +struct  Dune::mutable_reference<_BitSetVectorReference<_block_size,_Alloc_>_> │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::mutable_reference<_BitSetVectorConstReference<_block_size,_Alloc │ │ │ │ │ + >_> │ │ │ │ │ +  │ │ │ │ │ + class  Dune::BitSetVector<_block_size,_Allocator_> │ │ │ │ │ +  A dynamic array of blocks of booleans. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -Type traits to determine the type of reals (when working with complex numbers) │ │ │ │ │ +Efficient implementation of a dynamic array of static arrays of booleans. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00086_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: ftraits.hh Source File │ │ │ │ +dune-common: bitsetvector.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,80 +62,653 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
ftraits.hh
│ │ │ │ +
bitsetvector.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 (C) 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_FTRAITS_HH
│ │ │ │ -
6#define DUNE_FTRAITS_HH
│ │ │ │ +
5#ifndef DUNE_BLOCK_BITFIELD_HH
│ │ │ │ +
6#define DUNE_BLOCK_BITFIELD_HH
│ │ │ │
7
│ │ │ │ -
12#include <complex>
│ │ │ │ -
13#include <vector>
│ │ │ │ -
14
│ │ │ │ -
15namespace Dune {
│ │ │ │ +
12#include <vector>
│ │ │ │ +
13#include <bitset>
│ │ │ │ +
14#include <iostream>
│ │ │ │ +
15#include <algorithm>
│ │ │ │
16
│ │ │ │ -
24 template<class T>
│ │ │ │ - │ │ │ │ -
26 {
│ │ │ │ -
28 typedef T field_type;
│ │ │ │ -
30 typedef T real_type;
│ │ │ │ -
31 };
│ │ │ │ -
32
│ │ │ │ -
33 template<class T>
│ │ │ │ -
34 struct FieldTraits<const T>
│ │ │ │ -
35 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
38 };
│ │ │ │ -
39
│ │ │ │ -
40 template<class T>
│ │ │ │ -
41 struct FieldTraits< std::complex<T> >
│ │ │ │ -
42 {
│ │ │ │ -
43 typedef std::complex<T> field_type;
│ │ │ │ -
44 typedef T real_type;
│ │ │ │ -
45 };
│ │ │ │ -
46
│ │ │ │ -
47 template<class T, unsigned int N>
│ │ │ │ -
48 struct FieldTraits< T[N] >
│ │ │ │ -
49 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
52 };
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
20
│ │ │ │ +
21namespace Dune {
│ │ │ │ +
22
│ │ │ │ +
23 template <int block_size, class Alloc> class BitSetVector;
│ │ │ │ +
24 template <int block_size, class Alloc> class BitSetVectorReference;
│ │ │ │ +
25
│ │ │ │ +
36 template <int block_size, class Alloc>
│ │ │ │ + │ │ │ │ +
38 {
│ │ │ │ +
39 protected:
│ │ │ │ +
40
│ │ │ │ + │ │ │ │ +
42 friend class Dune::BitSetVector<block_size, Alloc>;
│ │ │ │ +
43
│ │ │ │ +
44 BitSetVectorConstReference(const BitSetVector& blockBitField_, int block_number_) :
│ │ │ │ +
45 blockBitField(blockBitField_),
│ │ │ │ +
46 block_number(block_number_)
│ │ │ │ +
47 {
│ │ │ │ +
48 DUNE_ASSERT_BOUNDS(blockBitField_.size() > static_cast<size_t>(block_number_));
│ │ │ │ +
49 }
│ │ │ │ +
50
│ │ │ │ + │ │ │ │
53
│ │ │ │ -
54 template<class T>
│ │ │ │ -
55 struct FieldTraits< std::vector<T> >
│ │ │ │ -
56 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
59 };
│ │ │ │ -
60
│ │ │ │ -
61} // end namespace Dune
│ │ │ │ +
54 public:
│ │ │ │ +
55
│ │ │ │ +
56 typedef std::bitset<block_size> bitset;
│ │ │ │ +
57
│ │ │ │ +
58 // bitset interface typedefs
│ │ │ │ +
59 typedef typename std::vector<bool, Alloc>::const_reference reference;
│ │ │ │ +
60 typedef typename std::vector<bool, Alloc>::const_reference const_reference;
│ │ │ │ +
61 typedef size_t size_type;
│ │ │ │
62
│ │ │ │ -
63#endif // DUNE_FTRAITS_HH
│ │ │ │ -
STL namespace.
│ │ │ │ + │ │ │ │ +
65 {
│ │ │ │ +
66 bitset b = *this;
│ │ │ │ +
67 b <<= n;
│ │ │ │ +
68 return b;
│ │ │ │ +
69 }
│ │ │ │ +
70
│ │ │ │ + │ │ │ │ +
73 {
│ │ │ │ +
74 bitset b = *this;
│ │ │ │ +
75 b >>= n;
│ │ │ │ +
76 return b;
│ │ │ │ +
77 }
│ │ │ │ +
78
│ │ │ │ + │ │ │ │ +
81 {
│ │ │ │ +
82 bitset b = *this;
│ │ │ │ +
83 b.flip();
│ │ │ │ +
84 return b;
│ │ │ │ +
85 }
│ │ │ │ +
86
│ │ │ │ + │ │ │ │ +
89 {
│ │ │ │ +
90 return block_size;
│ │ │ │ +
91 }
│ │ │ │ +
92
│ │ │ │ + │ │ │ │ +
95 {
│ │ │ │ +
96 size_type n = 0;
│ │ │ │ +
97 for(size_type i=0; i<block_size; ++i)
│ │ │ │ +
98 n += getBit(i);
│ │ │ │ +
99 return n;
│ │ │ │ +
100 }
│ │ │ │ +
101
│ │ │ │ +
103 bool any() const
│ │ │ │ +
104 {
│ │ │ │ +
105 return count();
│ │ │ │ +
106 }
│ │ │ │ +
107
│ │ │ │ +
109 bool none() const
│ │ │ │ +
110 {
│ │ │ │ +
111 return ! any();
│ │ │ │ +
112 }
│ │ │ │ +
113
│ │ │ │ +
115 bool all() const
│ │ │ │ +
116 {
│ │ │ │ +
117 for(size_type i=0; i<block_size; ++i)
│ │ │ │ +
118 if(not test(i))
│ │ │ │ +
119 return false;
│ │ │ │ +
120 return true;
│ │ │ │ +
121 }
│ │ │ │ +
122
│ │ │ │ +
124 bool test(size_type n) const
│ │ │ │ +
125 {
│ │ │ │ +
126 return getBit(n);
│ │ │ │ +
127 }
│ │ │ │ +
128
│ │ │ │ + │ │ │ │ +
131 {
│ │ │ │ +
132 return getBit(i);
│ │ │ │ +
133 }
│ │ │ │ +
134
│ │ │ │ +
136 operator bitset() const
│ │ │ │ +
137 {
│ │ │ │ +
138 return blockBitField.getRepr(block_number);
│ │ │ │ +
139 }
│ │ │ │ +
140
│ │ │ │ +
142 bool operator== (const bitset& bs) const
│ │ │ │ +
143 {
│ │ │ │ +
144 return equals(bs);
│ │ │ │ +
145 }
│ │ │ │ +
146
│ │ │ │ + │ │ │ │ +
149 {
│ │ │ │ +
150 return equals(bs);
│ │ │ │ +
151 }
│ │ │ │ +
152
│ │ │ │ +
154 bool operator!= (const bitset& bs) const
│ │ │ │ +
155 {
│ │ │ │ +
156 return ! equals(bs);
│ │ │ │ +
157 }
│ │ │ │ +
158
│ │ │ │ + │ │ │ │ +
161 {
│ │ │ │ +
162 return ! equals(bs);
│ │ │ │ +
163 }
│ │ │ │ +
164
│ │ │ │ +
171 friend std::ostream& operator<< (std::ostream& s, const BitSetVectorConstReference& v)
│ │ │ │ +
172 {
│ │ │ │ +
173 s << "(";
│ │ │ │ +
174 for(int i=0; i<block_size; ++i)
│ │ │ │ +
175 s << v[i];
│ │ │ │ +
176 s << ")";
│ │ │ │ +
177 return s;
│ │ │ │ +
178 }
│ │ │ │ +
179
│ │ │ │ +
180 protected:
│ │ │ │ + │ │ │ │ + │ │ │ │ +
183
│ │ │ │ + │ │ │ │ +
185 {
│ │ │ │ +
186 return blockBitField.getBit(block_number,i);
│ │ │ │ +
187 }
│ │ │ │ +
188
│ │ │ │ +
189 template<class BS>
│ │ │ │ +
190 bool equals(const BS & bs) const
│ │ │ │ +
191 {
│ │ │ │ +
192 bool eq = true;
│ │ │ │ +
193 for(int i=0; i<block_size; ++i)
│ │ │ │ +
194 eq &= (getBit(i) == bs[i]);
│ │ │ │ +
195 return eq;
│ │ │ │ +
196 }
│ │ │ │ +
197
│ │ │ │ +
198 private:
│ │ │ │ +
203 void operator & () = delete;
│ │ │ │ +
204
│ │ │ │ +
205 friend class BitSetVectorReference<block_size, Alloc>;
│ │ │ │ +
206 };
│ │ │ │ +
207
│ │ │ │ +
220 template <int block_size, class Alloc>
│ │ │ │ +
221 class BitSetVectorReference : public BitSetVectorConstReference<block_size,Alloc>
│ │ │ │ +
222 {
│ │ │ │ +
223 protected:
│ │ │ │ +
224
│ │ │ │ + │ │ │ │ +
226 friend class Dune::BitSetVector<block_size, Alloc>;
│ │ │ │ +
227
│ │ │ │ + │ │ │ │ +
229
│ │ │ │ +
230 BitSetVectorReference(BitSetVector& blockBitField_, int block_number_) :
│ │ │ │ +
231 BitSetVectorConstReference(blockBitField_, block_number_),
│ │ │ │ +
232 blockBitField(blockBitField_)
│ │ │ │ +
233 {}
│ │ │ │ +
234
│ │ │ │ +
235 public:
│ │ │ │ +
236 typedef std::bitset<block_size> bitset;
│ │ │ │ +
237
│ │ │ │ +
241 typedef typename std::vector<bool, Alloc>::reference reference;
│ │ │ │ +
243 typedef typename std::vector<bool, Alloc>::const_reference const_reference;
│ │ │ │ +
245
│ │ │ │ +
247 typedef size_t size_type;
│ │ │ │ +
248
│ │ │ │ + │ │ │ │ +
251 {
│ │ │ │ +
252 for(int i=0; i<block_size; ++i)
│ │ │ │ +
253 getBit(i) = b;
│ │ │ │ +
254 return (*this);
│ │ │ │ +
255 }
│ │ │ │ +
256
│ │ │ │ + │ │ │ │ +
259 {
│ │ │ │ +
260 for(int i=0; i<block_size; ++i)
│ │ │ │ +
261 getBit(i) = b.test(i);
│ │ │ │ +
262 return (*this);
│ │ │ │ +
263 }
│ │ │ │ +
264
│ │ │ │ + │ │ │ │ +
267 {
│ │ │ │ +
268 for(int i=0; i<block_size; ++i)
│ │ │ │ +
269 getBit(i) = b.test(i);
│ │ │ │ +
270 return (*this);
│ │ │ │ +
271 }
│ │ │ │ +
272
│ │ │ │ + │ │ │ │ +
275 {
│ │ │ │ +
276 for(int i=0; i<block_size; ++i)
│ │ │ │ +
277 getBit(i) = b.test(i);
│ │ │ │ +
278 return (*this);
│ │ │ │ +
279 }
│ │ │ │ +
280
│ │ │ │ + │ │ │ │ +
283 {
│ │ │ │ +
284 for (size_type i=0; i<block_size; i++)
│ │ │ │ +
285 getBit(i) = (test(i) & x.test(i));
│ │ │ │ +
286 return *this;
│ │ │ │ +
287 }
│ │ │ │ +
288
│ │ │ │ + │ │ │ │ +
291 {
│ │ │ │ +
292 for (size_type i=0; i<block_size; i++)
│ │ │ │ +
293 getBit(i) = (test(i) & x.test(i));
│ │ │ │ +
294 return *this;
│ │ │ │ +
295 }
│ │ │ │ +
296
│ │ │ │ + │ │ │ │ +
299 {
│ │ │ │ +
300 for (size_type i=0; i<block_size; i++)
│ │ │ │ +
301 getBit(i) = (test(i) | x.test(i));
│ │ │ │ +
302 return *this;
│ │ │ │ +
303 }
│ │ │ │ +
304
│ │ │ │ + │ │ │ │ +
307 {
│ │ │ │ +
308 for (size_type i=0; i<block_size; i++)
│ │ │ │ +
309 getBit(i) = (test(i) | x.test(i));
│ │ │ │ +
310 return *this;
│ │ │ │ +
311 }
│ │ │ │ +
312
│ │ │ │ + │ │ │ │ +
315 {
│ │ │ │ +
316 for (size_type i=0; i<block_size; i++)
│ │ │ │ +
317 getBit(i) = (test(i) ^ x.test(i));
│ │ │ │ +
318 return *this;
│ │ │ │ +
319 }
│ │ │ │ +
320
│ │ │ │ +
321 private:
│ │ │ │ +
322
│ │ │ │ +
323 // For some reason, the following variant of operator^= triggers an ICE or a hanging
│ │ │ │ +
324 // compiler on Debian 9 with GCC 6.3 and full optimizations enabled (-O3).
│ │ │ │ +
325 // The only way to reliably avoid the issue is by making sure that the compiler does not
│ │ │ │ +
326 // see the XOR in the context of the function, so here is a little helper that will normally
│ │ │ │ +
327 // be inlined, but not on the broken compiler. This incurs a substantial overhead (a function
│ │ │ │ +
328 // call), but until someone else has a better idea, it's the only way to make it work reliably.
│ │ │ │ +
329
│ │ │ │ +
330 static bool xor_helper(bool a, bool b)
│ │ │ │ +
331#if defined(__GNUC__) && ! defined(__clang__) && __GNUC__ == 6 && __GNUC_MINOR__ == 3 && __cplusplus \
│ │ │ │ +
332 == 201402L
│ │ │ │ +
333 __attribute__((noinline))
│ │ │ │ +
334#endif
│ │ │ │ +
335 ;
│ │ │ │ +
336
│ │ │ │ +
337 public:
│ │ │ │ +
338
│ │ │ │ + │ │ │ │ +
341 {
│ │ │ │ +
342 // This uses the helper from above to hoist the actual XOR computation out of the function for
│ │ │ │ +
343 // the buggy version of GCC.
│ │ │ │ +
344 for (size_type i=0; i<block_size; i++)
│ │ │ │ +
345 getBit(i) = xor_helper(test(i),x.test(i));
│ │ │ │ +
346 return *this;
│ │ │ │ +
347 }
│ │ │ │ +
348
│ │ │ │ + │ │ │ │ +
351 {
│ │ │ │ +
352 for (size_type i=0; i<block_size-n; i++)
│ │ │ │ +
353 getBit(i) = test(i+n);
│ │ │ │ +
354 return *this;
│ │ │ │ +
355 }
│ │ │ │ +
356
│ │ │ │ + │ │ │ │ +
359 {
│ │ │ │ +
360 for (size_type i=0; i<block_size-n; i++)
│ │ │ │ +
361 getBit(i+n) = test(i);
│ │ │ │ +
362 return *this;
│ │ │ │ +
363 }
│ │ │ │ +
364
│ │ │ │ + │ │ │ │ +
367 {
│ │ │ │ +
368 for (size_type i=0; i<block_size; i++)
│ │ │ │ +
369 set(i);
│ │ │ │ +
370 return *this;
│ │ │ │ +
371 }
│ │ │ │ +
372
│ │ │ │ + │ │ │ │ +
375 {
│ │ │ │ +
376 for (size_type i=0; i<block_size; i++)
│ │ │ │ +
377 flip(i);
│ │ │ │ +
378 return *this;
│ │ │ │ +
379 }
│ │ │ │ +
380
│ │ │ │ + │ │ │ │ +
383 {
│ │ │ │ +
384 *this = false;
│ │ │ │ +
385 return *this;
│ │ │ │ +
386 }
│ │ │ │ +
387
│ │ │ │ + │ │ │ │ +
390 {
│ │ │ │ +
391 getBit(n) = val;
│ │ │ │ +
392 return *this;
│ │ │ │ +
393 }
│ │ │ │ +
394
│ │ │ │ + │ │ │ │ +
397 {
│ │ │ │ +
398 set(n, false);
│ │ │ │ +
399 return *this;
│ │ │ │ +
400 }
│ │ │ │ +
401
│ │ │ │ + │ │ │ │ +
404 {
│ │ │ │ +
405 getBit(n).flip();
│ │ │ │ +
406 return *this;
│ │ │ │ +
407 }
│ │ │ │ +
408
│ │ │ │ + │ │ │ │ +
410 using BitSetVectorConstReference::operator[];
│ │ │ │ +
411
│ │ │ │ + │ │ │ │ +
414 {
│ │ │ │ +
415 return getBit(i);
│ │ │ │ +
416 }
│ │ │ │ +
417
│ │ │ │ +
418 protected:
│ │ │ │ + │ │ │ │ +
420
│ │ │ │ + │ │ │ │ +
422
│ │ │ │ + │ │ │ │ +
424 {
│ │ │ │ +
425 return blockBitField.getBit(this->block_number,i);
│ │ │ │ +
426 }
│ │ │ │ +
427 };
│ │ │ │ +
428
│ │ │ │ +
429 // implementation of helper - I put it into the template to avoid having
│ │ │ │ +
430 // to compile it in a dedicated compilation unit
│ │ │ │ +
431 template<int block_size, class Alloc>
│ │ │ │ +
432 bool BitSetVectorReference<block_size,Alloc>::xor_helper(bool a, bool b)
│ │ │ │ +
433 {
│ │ │ │ +
434 return a ^ b;
│ │ │ │ +
435 }
│ │ │ │ +
436
│ │ │ │ +
440 template<int block_size, class Alloc>
│ │ │ │ +
441 struct const_reference< BitSetVectorReference<block_size,Alloc> >
│ │ │ │ +
442 {
│ │ │ │ + │ │ │ │ +
444 };
│ │ │ │ +
445
│ │ │ │ +
446 template<int block_size, class Alloc>
│ │ │ │ +
447 struct const_reference< BitSetVectorConstReference<block_size,Alloc> >
│ │ │ │ +
448 {
│ │ │ │ + │ │ │ │ +
450 };
│ │ │ │ +
451
│ │ │ │ +
452 template<int block_size, class Alloc>
│ │ │ │ +
453 struct mutable_reference< BitSetVectorReference<block_size,Alloc> >
│ │ │ │ +
454 {
│ │ │ │ + │ │ │ │ +
456 };
│ │ │ │ +
457
│ │ │ │ +
458 template<int block_size, class Alloc>
│ │ │ │ + │ │ │ │ +
460 {
│ │ │ │ + │ │ │ │ +
462 };
│ │ │ │ +
463
│ │ │ │ +
467 template <int block_size, class Allocator=std::allocator<bool> >
│ │ │ │ +
468 class BitSetVector : private std::vector<bool, Allocator>
│ │ │ │ +
469 {
│ │ │ │ +
471 typedef std::vector<bool, Allocator> BlocklessBaseClass;
│ │ │ │ +
472
│ │ │ │ +
473 public:
│ │ │ │ +
476
│ │ │ │ +
478 typedef std::bitset<block_size> value_type;
│ │ │ │ +
479
│ │ │ │ + │ │ │ │ +
482
│ │ │ │ + │ │ │ │ +
485
│ │ │ │ + │ │ │ │ +
488
│ │ │ │ + │ │ │ │ +
491
│ │ │ │ +
493 typedef typename std::vector<bool, Allocator>::size_type size_type;
│ │ │ │ +
494
│ │ │ │ +
496 typedef Allocator allocator_type;
│ │ │ │ +
498
│ │ │ │ + │ │ │ │ + │ │ │ │ +
504
│ │ │ │ + │ │ │ │ +
507 return iterator(*this, 0);
│ │ │ │ +
508 }
│ │ │ │ +
509
│ │ │ │ + │ │ │ │ +
512 return const_iterator(*this, 0);
│ │ │ │ +
513 }
│ │ │ │ +
514
│ │ │ │ + │ │ │ │ +
517 return iterator(*this, size());
│ │ │ │ +
518 }
│ │ │ │ +
519
│ │ │ │ + │ │ │ │ +
522 return const_iterator(*this, size());
│ │ │ │ +
523 }
│ │ │ │ +
524
│ │ │ │ + │ │ │ │ +
527 BlocklessBaseClass()
│ │ │ │ +
528 {}
│ │ │ │ +
529
│ │ │ │ +
531 BitSetVector(const BlocklessBaseClass& blocklessBitField) :
│ │ │ │ +
532 BlocklessBaseClass(blocklessBitField)
│ │ │ │ +
533 {
│ │ │ │ +
534 if (blocklessBitField.size()%block_size != 0)
│ │ │ │ +
535 DUNE_THROW(RangeError, "Vector size is not a multiple of the block size!");
│ │ │ │ +
536 }
│ │ │ │ +
537
│ │ │ │ +
541 explicit BitSetVector(int n) :
│ │ │ │ +
542 BlocklessBaseClass(n*block_size)
│ │ │ │ +
543 {}
│ │ │ │ +
544
│ │ │ │ +
546 BitSetVector(int n, bool v) :
│ │ │ │ +
547 BlocklessBaseClass(n*block_size,v)
│ │ │ │ +
548 {}
│ │ │ │ +
549
│ │ │ │ +
551 void clear()
│ │ │ │ +
552 {
│ │ │ │ +
553 BlocklessBaseClass::clear();
│ │ │ │ +
554 }
│ │ │ │ +
555
│ │ │ │ +
557 void resize(int n, bool v = bool())
│ │ │ │ +
558 {
│ │ │ │ +
559 BlocklessBaseClass::resize(n*block_size, v);
│ │ │ │ +
560 }
│ │ │ │ +
561
│ │ │ │ + │ │ │ │ +
564 {
│ │ │ │ +
565 return BlocklessBaseClass::size()/block_size;
│ │ │ │ +
566 }
│ │ │ │ +
567
│ │ │ │ +
569 void setAll() {
│ │ │ │ +
570 this->assign(BlocklessBaseClass::size(), true);
│ │ │ │ +
571 }
│ │ │ │ +
572
│ │ │ │ +
574 void unsetAll() {
│ │ │ │ +
575 this->assign(BlocklessBaseClass::size(), false);
│ │ │ │ +
576 }
│ │ │ │ +
577
│ │ │ │ + │ │ │ │ +
580 {
│ │ │ │ +
581 return reference(*this, i);
│ │ │ │ +
582 }
│ │ │ │ +
583
│ │ │ │ + │ │ │ │ +
586 {
│ │ │ │ +
587 return const_reference(*this, i);
│ │ │ │ +
588 }
│ │ │ │ +
589
│ │ │ │ + │ │ │ │ +
592 {
│ │ │ │ +
593 return reference(*this, size()-1);
│ │ │ │ +
594 }
│ │ │ │ +
595
│ │ │ │ + │ │ │ │ +
598 {
│ │ │ │ +
599 return const_reference(*this, size()-1);
│ │ │ │ +
600 }
│ │ │ │ +
601
│ │ │ │ + │ │ │ │ +
604 {
│ │ │ │ +
605 return std::count(BlocklessBaseClass::begin(), BlocklessBaseClass::end(), true);
│ │ │ │ +
606 }
│ │ │ │ +
607
│ │ │ │ + │ │ │ │ +
610 {
│ │ │ │ +
611 size_type n = 0;
│ │ │ │ +
612 size_type blocks = size();
│ │ │ │ +
613 for(size_type i=0; i<blocks; ++i)
│ │ │ │ +
614 n += getBit(i,j);
│ │ │ │ +
615 return n;
│ │ │ │ +
616 }
│ │ │ │ +
617
│ │ │ │ +
619 friend std::ostream& operator<< (std::ostream& s, const BitSetVector& v)
│ │ │ │ +
620 {
│ │ │ │ +
621 for (size_t i=0; i<v.size(); i++)
│ │ │ │ +
622 s << v[i] << " ";
│ │ │ │ +
623 return s;
│ │ │ │ +
624 }
│ │ │ │ +
625
│ │ │ │ +
626 private:
│ │ │ │ +
627
│ │ │ │ +
629 value_type getRepr(int i) const
│ │ │ │ +
630 {
│ │ │ │ +
631 value_type bits;
│ │ │ │ +
632 for(int j=0; j<block_size; ++j)
│ │ │ │ +
633 bits.set(j, getBit(i,j));
│ │ │ │ +
634 return bits;
│ │ │ │ +
635 }
│ │ │ │ +
636
│ │ │ │ +
637 typename std::vector<bool>::reference getBit(size_type i, size_type j) {
│ │ │ │ +
638 DUNE_ASSERT_BOUNDS(j < block_size);
│ │ │ │ + │ │ │ │ +
640 return BlocklessBaseClass::operator[](i*block_size+j);
│ │ │ │ +
641 }
│ │ │ │ +
642
│ │ │ │ +
643 typename std::vector<bool>::const_reference getBit(size_type i, size_type j) const {
│ │ │ │ +
644 DUNE_ASSERT_BOUNDS(j < block_size);
│ │ │ │ + │ │ │ │ +
646 return BlocklessBaseClass::operator[](i*block_size+j);
│ │ │ │ +
647 }
│ │ │ │ +
648
│ │ │ │ +
649 friend class BitSetVectorReference<block_size,Allocator>;
│ │ │ │ +
650 friend class BitSetVectorConstReference<block_size,Allocator>;
│ │ │ │ +
651 };
│ │ │ │ +
652
│ │ │ │ +
653} // namespace Dune
│ │ │ │ +
654
│ │ │ │ +
655#endif
│ │ │ │ +
Macro for wrapping boundary checks.
│ │ │ │ +
A few common exception classes.
│ │ │ │ +
Implements a generic iterator class for writing stl conformant iterators.
│ │ │ │ +
#define DUNE_ASSERT_BOUNDS(cond)
If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do nothing.
Definition: boundschecking.hh:30
│ │ │ │ +
bool eq(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
test for equality using epsilon
Definition: float_cmp.cc:144
│ │ │ │ +
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
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
│ │ │ │ -
FieldTraits< T >::field_type field_type
Definition: ftraits.hh:36
│ │ │ │ -
FieldTraits< T >::real_type real_type
Definition: ftraits.hh:37
│ │ │ │ -
T real_type
Definition: ftraits.hh:44
│ │ │ │ -
std::complex< T > field_type
Definition: ftraits.hh:43
│ │ │ │ -
FieldTraits< T >::field_type field_type
Definition: ftraits.hh:50
│ │ │ │ -
FieldTraits< T >::real_type real_type
Definition: ftraits.hh:51
│ │ │ │ -
FieldTraits< T >::real_type real_type
Definition: ftraits.hh:58
│ │ │ │ -
FieldTraits< T >::field_type field_type
Definition: ftraits.hh:57
│ │ │ │ +
void assign(T &dst, const T &src, bool mask)
masked Simd assignment (scalar version)
Definition: simd.hh:447
│ │ │ │ +
A dynamic array of blocks of booleans.
Definition: bitsetvector.hh:469
│ │ │ │ +
const_reference operator[](int i) const
Return const reference to i-th block.
Definition: bitsetvector.hh:585
│ │ │ │ +
iterator begin()
Returns a iterator pointing to the beginning of the vector.
Definition: bitsetvector.hh:506
│ │ │ │ +
BitSetVectorConstReference< block_size, Allocator > * const_pointer
Const pointer to a small block of bits.
Definition: bitsetvector.hh:490
│ │ │ │ +
const_iterator end() const
Returns a const_iterator pointing to the end of the vector.
Definition: bitsetvector.hh:521
│ │ │ │ +
BitSetVectorReference< block_size, Allocator > reference
Reference to a small block of bits.
Definition: bitsetvector.hh:481
│ │ │ │ +
size_type countmasked(int j) const
Returns the number of set bits, while each block is masked with 1<<i.
Definition: bitsetvector.hh:609
│ │ │ │ +
BitSetVectorConstReference< block_size, Allocator > const_reference
Const reference to a small block of bits.
Definition: bitsetvector.hh:484
│ │ │ │ +
iterator end()
Returns an iterator pointing to the end of the vector.
Definition: bitsetvector.hh:516
│ │ │ │ +
size_type count() const
Returns the number of bits that are set.
Definition: bitsetvector.hh:603
│ │ │ │ +
BitSetVector()
Default constructor.
Definition: bitsetvector.hh:526
│ │ │ │ +
void setAll()
Sets all entries to true
Definition: bitsetvector.hh:569
│ │ │ │ +
Dune::GenericIterator< const BitSetVector< block_size, Allocator >, const value_type, const_reference, std::ptrdiff_t, ForwardIteratorFacade > const_iterator
Definition: bitsetvector.hh:502
│ │ │ │ +
std::bitset< block_size > value_type
Type of the values stored by the container.
Definition: bitsetvector.hh:478
│ │ │ │ +
reference back()
Return reference to last block.
Definition: bitsetvector.hh:591
│ │ │ │ +
BitSetVector(const BlocklessBaseClass &blocklessBitField)
Construction from an unblocked bitfield.
Definition: bitsetvector.hh:531
│ │ │ │ +
friend std::ostream & operator<<(std::ostream &s, const BitSetVector &v)
Send bitfield to an output stream.
Definition: bitsetvector.hh:619
│ │ │ │ +
const_reference back() const
Return const reference to last block.
Definition: bitsetvector.hh:597
│ │ │ │ +
void clear()
Erases all of the elements.
Definition: bitsetvector.hh:551
│ │ │ │ +
BitSetVectorReference< block_size, Allocator > * pointer
Pointer to a small block of bits.
Definition: bitsetvector.hh:487
│ │ │ │ +
reference operator[](int i)
Return reference to i-th block.
Definition: bitsetvector.hh:579
│ │ │ │ +
size_type size() const
Return the number of blocks.
Definition: bitsetvector.hh:563
│ │ │ │ +
std::vector< bool, Allocator >::size_type size_type
size type
Definition: bitsetvector.hh:493
│ │ │ │ +
BitSetVector(int n, bool v)
Constructor which initializes the field with true or false.
Definition: bitsetvector.hh:546
│ │ │ │ +
const_iterator begin() const
Returns a const_iterator pointing to the beginning of the vector.
Definition: bitsetvector.hh:511
│ │ │ │ +
Dune::GenericIterator< BitSetVector< block_size, Allocator >, value_type, reference, std::ptrdiff_t, ForwardIteratorFacade > iterator
Definition: bitsetvector.hh:501
│ │ │ │ +
void resize(int n, bool v=bool())
Resize field.
Definition: bitsetvector.hh:557
│ │ │ │ +
Allocator allocator_type
The type of the allocator.
Definition: bitsetvector.hh:496
│ │ │ │ +
BitSetVector(int n)
Definition: bitsetvector.hh:541
│ │ │ │ +
void unsetAll()
Sets all entries to false
Definition: bitsetvector.hh:574
│ │ │ │ +
A proxy class that acts as a mutable reference to a single bitset in a BitSetVector.
Definition: bitsetvector.hh:222
│ │ │ │ +
bool test(size_type n) const
Returns true if bit n is set.
Definition: bitsetvector.hh:124
│ │ │ │ +
BitSetVectorReference & operator=(const BitSetVectorConstReference &b)
Assignment from BitSetVectorConstReference.
Definition: bitsetvector.hh:266
│ │ │ │ +
reference operator[](size_type i)
Return reference to the i-th bit.
Definition: bitsetvector.hh:413
│ │ │ │ +
BitSetVectorReference & reset(size_type n)
Clears bit n.
Definition: bitsetvector.hh:396
│ │ │ │ +
BitSetVectorReference & operator<<=(size_type n)
Left shift.
Definition: bitsetvector.hh:350
│ │ │ │ +
Dune::BitSetVector< block_size, Alloc > BitSetVector
Definition: bitsetvector.hh:225
│ │ │ │ +
std::vector< bool, Alloc >::const_reference const_reference
A proxy class that acts as a const reference to a single bit.
Definition: bitsetvector.hh:243
│ │ │ │ +
BitSetVectorReference & operator=(const BitSetVectorReference &b)
Assignment from BitSetVectorReference.
Definition: bitsetvector.hh:274
│ │ │ │ +
reference getBit(size_type i)
Definition: bitsetvector.hh:423
│ │ │ │ +
BitSetVectorReference & operator&=(const BitSetVectorConstReference &x)
Bitwise and (for BitSetVectorConstReference and BitSetVectorReference)
Definition: bitsetvector.hh:290
│ │ │ │ +
BitSetVectorReference(BitSetVector &blockBitField_, int block_number_)
Definition: bitsetvector.hh:230
│ │ │ │ +
size_t size_type
size_type typedef (an unsigned integral type)
Definition: bitsetvector.hh:247
│ │ │ │ +
BitSetVectorReference & operator=(const bitset &b)
Assignment from bitset.
Definition: bitsetvector.hh:258
│ │ │ │ +
Dune::BitSetVectorConstReference< block_size, Alloc > BitSetVectorConstReference
Definition: bitsetvector.hh:228
│ │ │ │ +
BitSetVectorReference & reset()
Clears every bit.
Definition: bitsetvector.hh:382
│ │ │ │ +
BitSetVector & blockBitField
Definition: bitsetvector.hh:419
│ │ │ │ +
BitSetVectorReference & operator|=(const BitSetVectorConstReference &x)
Bitwise inclusive or (for BitSetVectorConstReference and BitSetVectorReference)
Definition: bitsetvector.hh:306
│ │ │ │ +
BitSetVectorReference & set(size_type n, int val=1)
Sets bit n if val is nonzero, and clears bit n if val is zero.
Definition: bitsetvector.hh:389
│ │ │ │ +
std::bitset< block_size > bitset
Definition: bitsetvector.hh:236
│ │ │ │ +
BitSetVectorReference & operator^=(const bitset &x)
Bitwise exclusive or (for bitset).
Definition: bitsetvector.hh:314
│ │ │ │ +
std::vector< bool, Alloc >::reference reference
Definition: bitsetvector.hh:241
│ │ │ │ +
BitSetVectorReference & operator|=(const bitset &x)
Bitwise inclusive or (for bitset)
Definition: bitsetvector.hh:298
│ │ │ │ +
BitSetVectorReference & operator>>=(size_type n)
Right shift.
Definition: bitsetvector.hh:358
│ │ │ │ +
BitSetVectorReference & operator^=(const BitSetVectorConstReference &x)
Bitwise exclusive or (for BitSetVectorConstReference and BitSetVectorReference)
Definition: bitsetvector.hh:340
│ │ │ │ +
BitSetVectorReference & flip(size_type n)
Flips bit n.
Definition: bitsetvector.hh:403
│ │ │ │ +
BitSetVectorReference & flip()
Flips the value of every bit.
Definition: bitsetvector.hh:374
│ │ │ │ +
BitSetVectorReference & set()
Sets every bit.
Definition: bitsetvector.hh:366
│ │ │ │ +
BitSetVectorReference & operator&=(const bitset &x)
Bitwise and (for bitset).
Definition: bitsetvector.hh:282
│ │ │ │ +
BitSetVectorReference & operator=(bool b)
Assignment from bool, sets each bit in the bitset to b.
Definition: bitsetvector.hh:250
│ │ │ │ +
A proxy class that acts as a const reference to a single bitset in a BitSetVector.
Definition: bitsetvector.hh:38
│ │ │ │ +
bool operator==(const bitset &bs) const
Equality of reference and std::bitset.
Definition: bitsetvector.hh:142
│ │ │ │ +
bool test(size_type n) const
Returns true if bit n is set.
Definition: bitsetvector.hh:124
│ │ │ │ +
const_reference operator[](size_type i) const
Return reference to the i-th bit.
Definition: bitsetvector.hh:130
│ │ │ │ +
bitset operator<<(size_type n) const
Returns a copy of *this shifted left by n bits.
Definition: bitsetvector.hh:64
│ │ │ │ +
BitSetVectorConstReference & operator=(const BitSetVectorConstReference &b)
hide assignment operator
│ │ │ │ +
BitSetVectorConstReference(const BitSetVector &blockBitField_, int block_number_)
Definition: bitsetvector.hh:44
│ │ │ │ +
const BitSetVector & blockBitField
Definition: bitsetvector.hh:181
│ │ │ │ +
bitset operator>>(size_type n) const
Returns a copy of *this shifted right by n bits.
Definition: bitsetvector.hh:72
│ │ │ │ +
const_reference getBit(size_type i) const
Definition: bitsetvector.hh:184
│ │ │ │ +
bool operator!=(const bitset &bs) const
Inequality of reference and std::bitset.
Definition: bitsetvector.hh:154
│ │ │ │ +
bool equals(const BS &bs) const
Definition: bitsetvector.hh:190
│ │ │ │ +
Dune::BitSetVector< block_size, Alloc > BitSetVector
Definition: bitsetvector.hh:41
│ │ │ │ +
std::bitset< block_size > bitset
Definition: bitsetvector.hh:56
│ │ │ │ +
bool all() const
Returns true if all bits are set.
Definition: bitsetvector.hh:115
│ │ │ │ +
size_t size_type
Definition: bitsetvector.hh:61
│ │ │ │ +
bitset operator~() const
Returns a copy of *this with all of its bits flipped.
Definition: bitsetvector.hh:80
│ │ │ │ +
std::vector< bool, Alloc >::const_reference reference
Definition: bitsetvector.hh:59
│ │ │ │ +
size_type size() const
Returns block_size.
Definition: bitsetvector.hh:88
│ │ │ │ +
size_type count() const
Returns the number of bits that are set.
Definition: bitsetvector.hh:94
│ │ │ │ +
bool none() const
Returns true if no bits are set.
Definition: bitsetvector.hh:109
│ │ │ │ +
bool any() const
Returns true if any bits are set.
Definition: bitsetvector.hh:103
│ │ │ │ +
int block_number
Definition: bitsetvector.hh:182
│ │ │ │ +
std::vector< bool, Alloc >::const_reference const_reference
Definition: bitsetvector.hh:60
│ │ │ │ +
BitSetVectorConstReference< block_size, Alloc > type
Definition: bitsetvector.hh:443
│ │ │ │ +
BitSetVectorConstReference< block_size, Alloc > type
Definition: bitsetvector.hh:449
│ │ │ │ +
BitSetVectorReference< block_size, Alloc > type
Definition: bitsetvector.hh:455
│ │ │ │ +
BitSetVectorReference< block_size, Alloc > type
Definition: bitsetvector.hh:461
│ │ │ │ +
Default exception class for range errors.
Definition: exceptions.hh:254
│ │ │ │ +
Get the 'const' version of a reference to a mutable object.
Definition: genericiterator.hh:87
│ │ │ │ +
get the 'mutable' version of a reference to a const object
Definition: genericiterator.hh:116
│ │ │ │ +
Generic class for stl-conforming iterators for container classes with operator[].
Definition: genericiterator.hh:153
│ │ │ │ +
Base class for stl conformant forward iterators.
Definition: iteratorfacades.hh:141
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,102 +4,940 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -ftraits.hh │ │ │ │ │ +bitsetvector.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 (C) 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_FTRAITS_HH │ │ │ │ │ - 6#define DUNE_FTRAITS_HH │ │ │ │ │ + 5#ifndef DUNE_BLOCK_BITFIELD_HH │ │ │ │ │ + 6#define DUNE_BLOCK_BITFIELD_HH │ │ │ │ │ 7 │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14 │ │ │ │ │ - 15namespace Dune { │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14#include │ │ │ │ │ + 15#include │ │ │ │ │ 16 │ │ │ │ │ - 24 template │ │ │ │ │ -25 struct FieldTraits │ │ │ │ │ - 26 { │ │ │ │ │ -28 typedef T field_type; │ │ │ │ │ -30 typedef T real_type; │ │ │ │ │ - 31 }; │ │ │ │ │ - 32 │ │ │ │ │ - 33 template │ │ │ │ │ -34 struct FieldTraits │ │ │ │ │ - 35 { │ │ │ │ │ -36 typedef typename FieldTraits::field_type field_type; │ │ │ │ │ -37 typedef typename FieldTraits::real_type real_type; │ │ │ │ │ - 38 }; │ │ │ │ │ - 39 │ │ │ │ │ - 40 template │ │ │ │ │ -41 struct FieldTraits< std::complex > │ │ │ │ │ - 42 { │ │ │ │ │ -43 typedef std::complex field_type; │ │ │ │ │ -44 typedef T real_type; │ │ │ │ │ - 45 }; │ │ │ │ │ - 46 │ │ │ │ │ - 47 template │ │ │ │ │ -48 struct FieldTraits< T[N] > │ │ │ │ │ - 49 { │ │ │ │ │ -50 typedef typename FieldTraits::field_type field_type; │ │ │ │ │ -51 typedef typename FieldTraits::real_type real_type; │ │ │ │ │ - 52 }; │ │ │ │ │ + 17#include │ │ │ │ │ + 18#include │ │ │ │ │ + 19#include │ │ │ │ │ + 20 │ │ │ │ │ + 21namespace Dune { │ │ │ │ │ + 22 │ │ │ │ │ + 23 template class BitSetVector; │ │ │ │ │ + 24 template class BitSetVectorReference; │ │ │ │ │ + 25 │ │ │ │ │ + 36 template │ │ │ │ │ +37 class BitSetVectorConstReference │ │ │ │ │ + 38 { │ │ │ │ │ + 39 protected: │ │ │ │ │ + 40 │ │ │ │ │ +41 typedef Dune::BitSetVector BitSetVector; │ │ │ │ │ + 42 friend class Dune::BitSetVector; │ │ │ │ │ + 43 │ │ │ │ │ +44 BitSetVectorConstReference(const BitSetVector& blockBitField_, int │ │ │ │ │ +block_number_) : │ │ │ │ │ + 45 blockBitField(blockBitField_), │ │ │ │ │ + 46 block_number(block_number_) │ │ │ │ │ + 47 { │ │ │ │ │ + 48 DUNE_ASSERT_BOUNDS(blockBitField_.size() > static_cast │ │ │ │ │ +(block_number_)); │ │ │ │ │ + 49 } │ │ │ │ │ + 50 │ │ │ │ │ +52 BitSetVectorConstReference& operator=(const BitSetVectorConstReference & b); │ │ │ │ │ 53 │ │ │ │ │ - 54 template │ │ │ │ │ -55 struct FieldTraits< std::vector > │ │ │ │ │ - 56 { │ │ │ │ │ -57 typedef typename FieldTraits::field_type field_type; │ │ │ │ │ -58 typedef typename FieldTraits::real_type real_type; │ │ │ │ │ - 59 }; │ │ │ │ │ - 60 │ │ │ │ │ - 61} // end namespace Dune │ │ │ │ │ + 54 public: │ │ │ │ │ + 55 │ │ │ │ │ +56 typedef std::bitset bitset; │ │ │ │ │ + 57 │ │ │ │ │ + 58 // bitset interface typedefs │ │ │ │ │ +59 typedef typename std::vector::const_reference reference; │ │ │ │ │ +60 typedef typename std::vector::const_reference const_reference; │ │ │ │ │ +61 typedef size_t size_type; │ │ │ │ │ 62 │ │ │ │ │ - 63#endif // DUNE_FTRAITS_HH │ │ │ │ │ -std │ │ │ │ │ -STL namespace. │ │ │ │ │ +64 bitset operator<<(size_type n) const │ │ │ │ │ + 65 { │ │ │ │ │ + 66 bitset b = *this; │ │ │ │ │ + 67 b <<= n; │ │ │ │ │ + 68 return b; │ │ │ │ │ + 69 } │ │ │ │ │ + 70 │ │ │ │ │ +72 bitset operator>>(size_type n) const │ │ │ │ │ + 73 { │ │ │ │ │ + 74 bitset b = *this; │ │ │ │ │ + 75 b >>= n; │ │ │ │ │ + 76 return b; │ │ │ │ │ + 77 } │ │ │ │ │ + 78 │ │ │ │ │ +80 bitset operator~() const │ │ │ │ │ + 81 { │ │ │ │ │ + 82 bitset b = *this; │ │ │ │ │ + 83 b.flip(); │ │ │ │ │ + 84 return b; │ │ │ │ │ + 85 } │ │ │ │ │ + 86 │ │ │ │ │ +88 size_type size() const │ │ │ │ │ + 89 { │ │ │ │ │ + 90 return block_size; │ │ │ │ │ + 91 } │ │ │ │ │ + 92 │ │ │ │ │ +94 size_type count() const │ │ │ │ │ + 95 { │ │ │ │ │ + 96 size_type n = 0; │ │ │ │ │ + 97 for(size_type i=0; i │ │ │ │ │ +190 bool equals(const BS & bs) const │ │ │ │ │ + 191 { │ │ │ │ │ + 192 bool eq = true; │ │ │ │ │ + 193 for(int i=0; i; │ │ │ │ │ + 206 }; │ │ │ │ │ + 207 │ │ │ │ │ + 220 template │ │ │ │ │ +221 class BitSetVectorReference : public │ │ │ │ │ +BitSetVectorConstReference │ │ │ │ │ + 222 { │ │ │ │ │ + 223 protected: │ │ │ │ │ + 224 │ │ │ │ │ +225 typedef Dune::BitSetVector BitSetVector; │ │ │ │ │ + 226 friend class Dune::BitSetVector; │ │ │ │ │ + 227 │ │ │ │ │ +228 typedef Dune::BitSetVectorConstReference │ │ │ │ │ +BitSetVectorConstReference; │ │ │ │ │ + 229 │ │ │ │ │ +230 BitSetVectorReference(BitSetVector& blockBitField_, int block_number_) : │ │ │ │ │ + 231 BitSetVectorConstReference(blockBitField_, block_number_), │ │ │ │ │ + 232 blockBitField(blockBitField_) │ │ │ │ │ + 233 {} │ │ │ │ │ + 234 │ │ │ │ │ + 235 public: │ │ │ │ │ +236 typedef std::bitset bitset; │ │ │ │ │ + 237 │ │ │ │ │ +241 typedef typename std::vector::reference reference; │ │ │ │ │ +243 typedef typename std::vector::const_reference const_reference; │ │ │ │ │ + 245 │ │ │ │ │ +247 typedef size_t size_type; │ │ │ │ │ + 248 │ │ │ │ │ +250 BitSetVectorReference& operator=(bool b) │ │ │ │ │ + 251 { │ │ │ │ │ + 252 for(int i=0; i>=(size_type n) │ │ │ │ │ + 359 { │ │ │ │ │ + 360 for (size_type i=0; iblock_number,i); │ │ │ │ │ + 426 } │ │ │ │ │ + 427 }; │ │ │ │ │ + 428 │ │ │ │ │ + 429 // implementation of helper - I put it into the template to avoid having │ │ │ │ │ + 430 // to compile it in a dedicated compilation unit │ │ │ │ │ + 431 template │ │ │ │ │ + 432 bool BitSetVectorReference::xor_helper(bool a, bool b) │ │ │ │ │ + 433 { │ │ │ │ │ + 434 return a ^ b; │ │ │ │ │ + 435 } │ │ │ │ │ + 436 │ │ │ │ │ + 440 template │ │ │ │ │ +441 struct const_reference< BitSetVectorReference > │ │ │ │ │ + 442 { │ │ │ │ │ +443 typedef BitSetVectorConstReference type; │ │ │ │ │ + 444 }; │ │ │ │ │ + 445 │ │ │ │ │ + 446 template │ │ │ │ │ +447 struct const_reference< BitSetVectorConstReference > │ │ │ │ │ + 448 { │ │ │ │ │ +449 typedef BitSetVectorConstReference type; │ │ │ │ │ + 450 }; │ │ │ │ │ + 451 │ │ │ │ │ + 452 template │ │ │ │ │ +453 struct mutable_reference< BitSetVectorReference > │ │ │ │ │ + 454 { │ │ │ │ │ +455 typedef BitSetVectorReference type; │ │ │ │ │ + 456 }; │ │ │ │ │ + 457 │ │ │ │ │ + 458 template │ │ │ │ │ +459 struct mutable_reference< BitSetVectorConstReference > │ │ │ │ │ + 460 { │ │ │ │ │ +461 typedef BitSetVectorReference type; │ │ │ │ │ + 462 }; │ │ │ │ │ + 463 │ │ │ │ │ + 467 template > │ │ │ │ │ +468 class BitSetVector : private std::vector │ │ │ │ │ + 469 { │ │ │ │ │ + 471 typedef std::vector BlocklessBaseClass; │ │ │ │ │ + 472 │ │ │ │ │ + 473 public: │ │ │ │ │ + 476 │ │ │ │ │ +478 typedef std::bitset value_type; │ │ │ │ │ + 479 │ │ │ │ │ +481 typedef BitSetVectorReference reference; │ │ │ │ │ + 482 │ │ │ │ │ +484 typedef BitSetVectorConstReference const_reference; │ │ │ │ │ + 485 │ │ │ │ │ +487 typedef BitSetVectorReference* pointer; │ │ │ │ │ + 488 │ │ │ │ │ +490 typedef BitSetVectorConstReference* const_pointer; │ │ │ │ │ + 491 │ │ │ │ │ +493 typedef typename std::vector::size_type size_type; │ │ │ │ │ + 494 │ │ │ │ │ +496 typedef Allocator allocator_type; │ │ │ │ │ + 498 │ │ │ │ │ +501 typedef Dune::GenericIterator, │ │ │ │ │ +value_type, reference, std::ptrdiff_t, ForwardIteratorFacade> iterator; │ │ │ │ │ +502 typedef Dune::GenericIterator, │ │ │ │ │ +const value_type, const_reference, std::ptrdiff_t, ForwardIteratorFacade> │ │ │ │ │ +const_iterator; │ │ │ │ │ + 504 │ │ │ │ │ +506 iterator begin(){ │ │ │ │ │ + 507 return iterator(*this, 0); │ │ │ │ │ + 508 } │ │ │ │ │ + 509 │ │ │ │ │ +511 const_iterator begin() const { │ │ │ │ │ + 512 return const_iterator(*this, 0); │ │ │ │ │ + 513 } │ │ │ │ │ + 514 │ │ │ │ │ +516 iterator end(){ │ │ │ │ │ + 517 return iterator(*this, size()); │ │ │ │ │ + 518 } │ │ │ │ │ + 519 │ │ │ │ │ +521 const_iterator end() const { │ │ │ │ │ + 522 return const_iterator(*this, size()); │ │ │ │ │ + 523 } │ │ │ │ │ + 524 │ │ │ │ │ +526 BitSetVector() : │ │ │ │ │ + 527 BlocklessBaseClass() │ │ │ │ │ + 528 {} │ │ │ │ │ + 529 │ │ │ │ │ +531 BitSetVector(const BlocklessBaseClass& blocklessBitField) : │ │ │ │ │ + 532 BlocklessBaseClass(blocklessBitField) │ │ │ │ │ + 533 { │ │ │ │ │ + 534 if (blocklessBitField.size()%block_size != 0) │ │ │ │ │ + 535 DUNE_THROW(RangeError, "Vector size is not a multiple of the block │ │ │ │ │ +size!"); │ │ │ │ │ + 536 } │ │ │ │ │ + 537 │ │ │ │ │ +541 explicit BitSetVector(int n) : │ │ │ │ │ + 542 BlocklessBaseClass(n*block_size) │ │ │ │ │ + 543 {} │ │ │ │ │ + 544 │ │ │ │ │ +546 BitSetVector(int n, bool v) : │ │ │ │ │ + 547 BlocklessBaseClass(n*block_size,v) │ │ │ │ │ + 548 {} │ │ │ │ │ + 549 │ │ │ │ │ +551 void clear() │ │ │ │ │ + 552 { │ │ │ │ │ + 553 BlocklessBaseClass::clear(); │ │ │ │ │ + 554 } │ │ │ │ │ + 555 │ │ │ │ │ +557 void resize(int n, bool v = bool()) │ │ │ │ │ + 558 { │ │ │ │ │ + 559 BlocklessBaseClass::resize(n*block_size, v); │ │ │ │ │ + 560 } │ │ │ │ │ + 561 │ │ │ │ │ +563 size_type size() const │ │ │ │ │ + 564 { │ │ │ │ │ + 565 return BlocklessBaseClass::size()/block_size; │ │ │ │ │ + 566 } │ │ │ │ │ + 567 │ │ │ │ │ +569 void setAll() { │ │ │ │ │ + 570 this->assign(BlocklessBaseClass::size(), true); │ │ │ │ │ + 571 } │ │ │ │ │ + 572 │ │ │ │ │ +574 void unsetAll() { │ │ │ │ │ + 575 this->assign(BlocklessBaseClass::size(), false); │ │ │ │ │ + 576 } │ │ │ │ │ + 577 │ │ │ │ │ +579 reference operator[](int i) │ │ │ │ │ + 580 { │ │ │ │ │ + 581 return reference(*this, i); │ │ │ │ │ + 582 } │ │ │ │ │ + 583 │ │ │ │ │ +585 const_reference operator[](int i) const │ │ │ │ │ + 586 { │ │ │ │ │ + 587 return const_reference(*this, i); │ │ │ │ │ + 588 } │ │ │ │ │ + 589 │ │ │ │ │ +591 reference back() │ │ │ │ │ + 592 { │ │ │ │ │ + 593 return reference(*this, size()-1); │ │ │ │ │ + 594 } │ │ │ │ │ + 595 │ │ │ │ │ +597 const_reference back() const │ │ │ │ │ + 598 { │ │ │ │ │ + 599 return const_reference(*this, size()-1); │ │ │ │ │ + 600 } │ │ │ │ │ + 601 │ │ │ │ │ +603 size_type count() const │ │ │ │ │ + 604 { │ │ │ │ │ + 605 return std::count(BlocklessBaseClass::begin(), BlocklessBaseClass::end(), │ │ │ │ │ +true); │ │ │ │ │ + 606 } │ │ │ │ │ + 607 │ │ │ │ │ +609 size_type countmasked(int j) const │ │ │ │ │ + 610 { │ │ │ │ │ + 611 size_type n = 0; │ │ │ │ │ + 612 size_type blocks = size(); │ │ │ │ │ + 613 for(size_type i=0; i::reference getBit(size_type i, size_type j) { │ │ │ │ │ + 638 DUNE_ASSERT_BOUNDS(j < block_size); │ │ │ │ │ + 639 DUNE_ASSERT_BOUNDS(i < size()); │ │ │ │ │ + 640 return BlocklessBaseClass::operator[](i*block_size+j); │ │ │ │ │ + 641 } │ │ │ │ │ + 642 │ │ │ │ │ +643 typename std::vector::const_reference getBit(size_type i, size_type │ │ │ │ │ +j) const { │ │ │ │ │ + 644 DUNE_ASSERT_BOUNDS(j < block_size); │ │ │ │ │ + 645 DUNE_ASSERT_BOUNDS(i < size()); │ │ │ │ │ + 646 return BlocklessBaseClass::operator[](i*block_size+j); │ │ │ │ │ + 647 } │ │ │ │ │ + 648 │ │ │ │ │ + 649 friend class BitSetVectorReference; │ │ │ │ │ + 650 friend class BitSetVectorConstReference; │ │ │ │ │ + 651 }; │ │ │ │ │ + 652 │ │ │ │ │ + 653} // namespace Dune │ │ │ │ │ + 654 │ │ │ │ │ + 655#endif │ │ │ │ │ +boundschecking.hh │ │ │ │ │ +Macro for wrapping boundary checks. │ │ │ │ │ +exceptions.hh │ │ │ │ │ +A few common exception classes. │ │ │ │ │ +genericiterator.hh │ │ │ │ │ +Implements a generic iterator class for writing stl conformant iterators. │ │ │ │ │ +DUNE_ASSERT_BOUNDS │ │ │ │ │ +#define DUNE_ASSERT_BOUNDS(cond) │ │ │ │ │ +If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do │ │ │ │ │ +nothing. │ │ │ │ │ +Definition: boundschecking.hh:30 │ │ │ │ │ +Dune::FloatCmp::eq │ │ │ │ │ +bool eq(const T &first, const T &second, typename EpsilonType< T >::Type │ │ │ │ │ +epsilon) │ │ │ │ │ +test for equality using epsilon │ │ │ │ │ +Definition: float_cmp.cc:144 │ │ │ │ │ +DUNE_THROW │ │ │ │ │ +#define DUNE_THROW(E, m) │ │ │ │ │ +Definition: exceptions.hh:218 │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::FieldTraits │ │ │ │ │ -Definition: ftraits.hh:26 │ │ │ │ │ -Dune::FieldTraits::field_type │ │ │ │ │ -T field_type │ │ │ │ │ -export the type representing the field │ │ │ │ │ -Definition: ftraits.hh:28 │ │ │ │ │ -Dune::FieldTraits::real_type │ │ │ │ │ -T real_type │ │ │ │ │ -export the type representing the real type of the field │ │ │ │ │ -Definition: ftraits.hh:30 │ │ │ │ │ -Dune::FieldTraits<_const_T_>::field_type │ │ │ │ │ -FieldTraits< T >::field_type field_type │ │ │ │ │ -Definition: ftraits.hh:36 │ │ │ │ │ -Dune::FieldTraits<_const_T_>::real_type │ │ │ │ │ -FieldTraits< T >::real_type real_type │ │ │ │ │ -Definition: ftraits.hh:37 │ │ │ │ │ -Dune::FieldTraits<_std::complex<_T_>_>::real_type │ │ │ │ │ -T real_type │ │ │ │ │ -Definition: ftraits.hh:44 │ │ │ │ │ -Dune::FieldTraits<_std::complex<_T_>_>::field_type │ │ │ │ │ -std::complex< T > field_type │ │ │ │ │ -Definition: ftraits.hh:43 │ │ │ │ │ -Dune::FieldTraits<_T[N]_>::field_type │ │ │ │ │ -FieldTraits< T >::field_type field_type │ │ │ │ │ -Definition: ftraits.hh:50 │ │ │ │ │ -Dune::FieldTraits<_T[N]_>::real_type │ │ │ │ │ -FieldTraits< T >::real_type real_type │ │ │ │ │ -Definition: ftraits.hh:51 │ │ │ │ │ -Dune::FieldTraits<_std::vector<_T_>_>::real_type │ │ │ │ │ -FieldTraits< T >::real_type real_type │ │ │ │ │ -Definition: ftraits.hh:58 │ │ │ │ │ -Dune::FieldTraits<_std::vector<_T_>_>::field_type │ │ │ │ │ -FieldTraits< T >::field_type field_type │ │ │ │ │ -Definition: ftraits.hh:57 │ │ │ │ │ +Dune::assign │ │ │ │ │ +void assign(T &dst, const T &src, bool mask) │ │ │ │ │ +masked Simd assignment (scalar version) │ │ │ │ │ +Definition: simd.hh:447 │ │ │ │ │ +Dune::BitSetVector │ │ │ │ │ +A dynamic array of blocks of booleans. │ │ │ │ │ +Definition: bitsetvector.hh:469 │ │ │ │ │ +Dune::BitSetVector::operator[] │ │ │ │ │ +const_reference operator[](int i) const │ │ │ │ │ +Return const reference to i-th block. │ │ │ │ │ +Definition: bitsetvector.hh:585 │ │ │ │ │ +Dune::BitSetVector::begin │ │ │ │ │ +iterator begin() │ │ │ │ │ +Returns a iterator pointing to the beginning of the vector. │ │ │ │ │ +Definition: bitsetvector.hh:506 │ │ │ │ │ +Dune::BitSetVector::const_pointer │ │ │ │ │ +BitSetVectorConstReference< block_size, Allocator > * const_pointer │ │ │ │ │ +Const pointer to a small block of bits. │ │ │ │ │ +Definition: bitsetvector.hh:490 │ │ │ │ │ +Dune::BitSetVector::end │ │ │ │ │ +const_iterator end() const │ │ │ │ │ +Returns a const_iterator pointing to the end of the vector. │ │ │ │ │ +Definition: bitsetvector.hh:521 │ │ │ │ │ +Dune::BitSetVector::reference │ │ │ │ │ +BitSetVectorReference< block_size, Allocator > reference │ │ │ │ │ +Reference to a small block of bits. │ │ │ │ │ +Definition: bitsetvector.hh:481 │ │ │ │ │ +Dune::BitSetVector::countmasked │ │ │ │ │ +size_type countmasked(int j) const │ │ │ │ │ +Returns the number of set bits, while each block is masked with 1< const_reference │ │ │ │ │ +Const reference to a small block of bits. │ │ │ │ │ +Definition: bitsetvector.hh:484 │ │ │ │ │ +Dune::BitSetVector::end │ │ │ │ │ +iterator end() │ │ │ │ │ +Returns an iterator pointing to the end of the vector. │ │ │ │ │ +Definition: bitsetvector.hh:516 │ │ │ │ │ +Dune::BitSetVector::count │ │ │ │ │ +size_type count() const │ │ │ │ │ +Returns the number of bits that are set. │ │ │ │ │ +Definition: bitsetvector.hh:603 │ │ │ │ │ +Dune::BitSetVector::BitSetVector │ │ │ │ │ +BitSetVector() │ │ │ │ │ +Default constructor. │ │ │ │ │ +Definition: bitsetvector.hh:526 │ │ │ │ │ +Dune::BitSetVector::setAll │ │ │ │ │ +void setAll() │ │ │ │ │ +Sets all entries to true │ │ │ │ │ +Definition: bitsetvector.hh:569 │ │ │ │ │ +Dune::BitSetVector::const_iterator │ │ │ │ │ +Dune::GenericIterator< const BitSetVector< block_size, Allocator >, const │ │ │ │ │ +value_type, const_reference, std::ptrdiff_t, ForwardIteratorFacade > │ │ │ │ │ +const_iterator │ │ │ │ │ +Definition: bitsetvector.hh:502 │ │ │ │ │ +Dune::BitSetVector::value_type │ │ │ │ │ +std::bitset< block_size > value_type │ │ │ │ │ +Type of the values stored by the container. │ │ │ │ │ +Definition: bitsetvector.hh:478 │ │ │ │ │ +Dune::BitSetVector::back │ │ │ │ │ +reference back() │ │ │ │ │ +Return reference to last block. │ │ │ │ │ +Definition: bitsetvector.hh:591 │ │ │ │ │ +Dune::BitSetVector::BitSetVector │ │ │ │ │ +BitSetVector(const BlocklessBaseClass &blocklessBitField) │ │ │ │ │ +Construction from an unblocked bitfield. │ │ │ │ │ +Definition: bitsetvector.hh:531 │ │ │ │ │ +Dune::BitSetVector::operator<< │ │ │ │ │ +friend std::ostream & operator<<(std::ostream &s, const BitSetVector &v) │ │ │ │ │ +Send bitfield to an output stream. │ │ │ │ │ +Definition: bitsetvector.hh:619 │ │ │ │ │ +Dune::BitSetVector::back │ │ │ │ │ +const_reference back() const │ │ │ │ │ +Return const reference to last block. │ │ │ │ │ +Definition: bitsetvector.hh:597 │ │ │ │ │ +Dune::BitSetVector::clear │ │ │ │ │ +void clear() │ │ │ │ │ +Erases all of the elements. │ │ │ │ │ +Definition: bitsetvector.hh:551 │ │ │ │ │ +Dune::BitSetVector::pointer │ │ │ │ │ +BitSetVectorReference< block_size, Allocator > * pointer │ │ │ │ │ +Pointer to a small block of bits. │ │ │ │ │ +Definition: bitsetvector.hh:487 │ │ │ │ │ +Dune::BitSetVector::operator[] │ │ │ │ │ +reference operator[](int i) │ │ │ │ │ +Return reference to i-th block. │ │ │ │ │ +Definition: bitsetvector.hh:579 │ │ │ │ │ +Dune::BitSetVector::size │ │ │ │ │ +size_type size() const │ │ │ │ │ +Return the number of blocks. │ │ │ │ │ +Definition: bitsetvector.hh:563 │ │ │ │ │ +Dune::BitSetVector::size_type │ │ │ │ │ +std::vector< bool, Allocator >::size_type size_type │ │ │ │ │ +size type │ │ │ │ │ +Definition: bitsetvector.hh:493 │ │ │ │ │ +Dune::BitSetVector::BitSetVector │ │ │ │ │ +BitSetVector(int n, bool v) │ │ │ │ │ +Constructor which initializes the field with true or false. │ │ │ │ │ +Definition: bitsetvector.hh:546 │ │ │ │ │ +Dune::BitSetVector::begin │ │ │ │ │ +const_iterator begin() const │ │ │ │ │ +Returns a const_iterator pointing to the beginning of the vector. │ │ │ │ │ +Definition: bitsetvector.hh:511 │ │ │ │ │ +Dune::BitSetVector::iterator │ │ │ │ │ +Dune::GenericIterator< BitSetVector< block_size, Allocator >, value_type, │ │ │ │ │ +reference, std::ptrdiff_t, ForwardIteratorFacade > iterator │ │ │ │ │ +Definition: bitsetvector.hh:501 │ │ │ │ │ +Dune::BitSetVector::resize │ │ │ │ │ +void resize(int n, bool v=bool()) │ │ │ │ │ +Resize field. │ │ │ │ │ +Definition: bitsetvector.hh:557 │ │ │ │ │ +Dune::BitSetVector::allocator_type │ │ │ │ │ +Allocator allocator_type │ │ │ │ │ +The type of the allocator. │ │ │ │ │ +Definition: bitsetvector.hh:496 │ │ │ │ │ +Dune::BitSetVector::BitSetVector │ │ │ │ │ +BitSetVector(int n) │ │ │ │ │ +Definition: bitsetvector.hh:541 │ │ │ │ │ +Dune::BitSetVector::unsetAll │ │ │ │ │ +void unsetAll() │ │ │ │ │ +Sets all entries to false │ │ │ │ │ +Definition: bitsetvector.hh:574 │ │ │ │ │ +Dune::BitSetVectorReference │ │ │ │ │ +A proxy class that acts as a mutable reference to a single bitset in a │ │ │ │ │ +BitSetVector. │ │ │ │ │ +Definition: bitsetvector.hh:222 │ │ │ │ │ +Dune::BitSetVectorReference::test │ │ │ │ │ +bool test(size_type n) const │ │ │ │ │ +Returns true if bit n is set. │ │ │ │ │ +Definition: bitsetvector.hh:124 │ │ │ │ │ +Dune::BitSetVectorReference::operator= │ │ │ │ │ +BitSetVectorReference & operator=(const BitSetVectorConstReference &b) │ │ │ │ │ +Assignment from BitSetVectorConstReference. │ │ │ │ │ +Definition: bitsetvector.hh:266 │ │ │ │ │ +Dune::BitSetVectorReference::operator[] │ │ │ │ │ +reference operator[](size_type i) │ │ │ │ │ +Return reference to the i-th bit. │ │ │ │ │ +Definition: bitsetvector.hh:413 │ │ │ │ │ +Dune::BitSetVectorReference::reset │ │ │ │ │ +BitSetVectorReference & reset(size_type n) │ │ │ │ │ +Clears bit n. │ │ │ │ │ +Definition: bitsetvector.hh:396 │ │ │ │ │ +Dune::BitSetVectorReference::operator<<= │ │ │ │ │ +BitSetVectorReference & operator<<=(size_type n) │ │ │ │ │ +Left shift. │ │ │ │ │ +Definition: bitsetvector.hh:350 │ │ │ │ │ +Dune::BitSetVectorReference::BitSetVector │ │ │ │ │ +Dune::BitSetVector< block_size, Alloc > BitSetVector │ │ │ │ │ +Definition: bitsetvector.hh:225 │ │ │ │ │ +Dune::BitSetVectorReference::const_reference │ │ │ │ │ +std::vector< bool, Alloc >::const_reference const_reference │ │ │ │ │ +A proxy class that acts as a const reference to a single bit. │ │ │ │ │ +Definition: bitsetvector.hh:243 │ │ │ │ │ +Dune::BitSetVectorReference::operator= │ │ │ │ │ +BitSetVectorReference & operator=(const BitSetVectorReference &b) │ │ │ │ │ +Assignment from BitSetVectorReference. │ │ │ │ │ +Definition: bitsetvector.hh:274 │ │ │ │ │ +Dune::BitSetVectorReference::getBit │ │ │ │ │ +reference getBit(size_type i) │ │ │ │ │ +Definition: bitsetvector.hh:423 │ │ │ │ │ +Dune::BitSetVectorReference::operator&= │ │ │ │ │ +BitSetVectorReference & operator&=(const BitSetVectorConstReference &x) │ │ │ │ │ +Bitwise and (for BitSetVectorConstReference and BitSetVectorReference) │ │ │ │ │ +Definition: bitsetvector.hh:290 │ │ │ │ │ +Dune::BitSetVectorReference::BitSetVectorReference │ │ │ │ │ +BitSetVectorReference(BitSetVector &blockBitField_, int block_number_) │ │ │ │ │ +Definition: bitsetvector.hh:230 │ │ │ │ │ +Dune::BitSetVectorReference::size_type │ │ │ │ │ +size_t size_type │ │ │ │ │ +size_type typedef (an unsigned integral type) │ │ │ │ │ +Definition: bitsetvector.hh:247 │ │ │ │ │ +Dune::BitSetVectorReference::operator= │ │ │ │ │ +BitSetVectorReference & operator=(const bitset &b) │ │ │ │ │ +Assignment from bitset. │ │ │ │ │ +Definition: bitsetvector.hh:258 │ │ │ │ │ +Dune::BitSetVectorReference::BitSetVectorConstReference │ │ │ │ │ +Dune::BitSetVectorConstReference< block_size, Alloc > │ │ │ │ │ +BitSetVectorConstReference │ │ │ │ │ +Definition: bitsetvector.hh:228 │ │ │ │ │ +Dune::BitSetVectorReference::reset │ │ │ │ │ +BitSetVectorReference & reset() │ │ │ │ │ +Clears every bit. │ │ │ │ │ +Definition: bitsetvector.hh:382 │ │ │ │ │ +Dune::BitSetVectorReference::blockBitField │ │ │ │ │ +BitSetVector & blockBitField │ │ │ │ │ +Definition: bitsetvector.hh:419 │ │ │ │ │ +Dune::BitSetVectorReference::operator|= │ │ │ │ │ +BitSetVectorReference & operator|=(const BitSetVectorConstReference &x) │ │ │ │ │ +Bitwise inclusive or (for BitSetVectorConstReference and BitSetVectorReference) │ │ │ │ │ +Definition: bitsetvector.hh:306 │ │ │ │ │ +Dune::BitSetVectorReference::set │ │ │ │ │ +BitSetVectorReference & set(size_type n, int val=1) │ │ │ │ │ +Sets bit n if val is nonzero, and clears bit n if val is zero. │ │ │ │ │ +Definition: bitsetvector.hh:389 │ │ │ │ │ +Dune::BitSetVectorReference::bitset │ │ │ │ │ +std::bitset< block_size > bitset │ │ │ │ │ +Definition: bitsetvector.hh:236 │ │ │ │ │ +Dune::BitSetVectorReference::operator^= │ │ │ │ │ +BitSetVectorReference & operator^=(const bitset &x) │ │ │ │ │ +Bitwise exclusive or (for bitset). │ │ │ │ │ +Definition: bitsetvector.hh:314 │ │ │ │ │ +Dune::BitSetVectorReference::reference │ │ │ │ │ +std::vector< bool, Alloc >::reference reference │ │ │ │ │ +Definition: bitsetvector.hh:241 │ │ │ │ │ +Dune::BitSetVectorReference::operator|= │ │ │ │ │ +BitSetVectorReference & operator|=(const bitset &x) │ │ │ │ │ +Bitwise inclusive or (for bitset) │ │ │ │ │ +Definition: bitsetvector.hh:298 │ │ │ │ │ +Dune::BitSetVectorReference::operator>>= │ │ │ │ │ +BitSetVectorReference & operator>>=(size_type n) │ │ │ │ │ +Right shift. │ │ │ │ │ +Definition: bitsetvector.hh:358 │ │ │ │ │ +Dune::BitSetVectorReference::operator^= │ │ │ │ │ +BitSetVectorReference & operator^=(const BitSetVectorConstReference &x) │ │ │ │ │ +Bitwise exclusive or (for BitSetVectorConstReference and BitSetVectorReference) │ │ │ │ │ +Definition: bitsetvector.hh:340 │ │ │ │ │ +Dune::BitSetVectorReference::flip │ │ │ │ │ +BitSetVectorReference & flip(size_type n) │ │ │ │ │ +Flips bit n. │ │ │ │ │ +Definition: bitsetvector.hh:403 │ │ │ │ │ +Dune::BitSetVectorReference::flip │ │ │ │ │ +BitSetVectorReference & flip() │ │ │ │ │ +Flips the value of every bit. │ │ │ │ │ +Definition: bitsetvector.hh:374 │ │ │ │ │ +Dune::BitSetVectorReference::set │ │ │ │ │ +BitSetVectorReference & set() │ │ │ │ │ +Sets every bit. │ │ │ │ │ +Definition: bitsetvector.hh:366 │ │ │ │ │ +Dune::BitSetVectorReference::operator&= │ │ │ │ │ +BitSetVectorReference & operator&=(const bitset &x) │ │ │ │ │ +Bitwise and (for bitset). │ │ │ │ │ +Definition: bitsetvector.hh:282 │ │ │ │ │ +Dune::BitSetVectorReference::operator= │ │ │ │ │ +BitSetVectorReference & operator=(bool b) │ │ │ │ │ +Assignment from bool, sets each bit in the bitset to b. │ │ │ │ │ +Definition: bitsetvector.hh:250 │ │ │ │ │ +Dune::BitSetVectorConstReference │ │ │ │ │ +A proxy class that acts as a const reference to a single bitset in a │ │ │ │ │ +BitSetVector. │ │ │ │ │ +Definition: bitsetvector.hh:38 │ │ │ │ │ +Dune::BitSetVectorConstReference::operator== │ │ │ │ │ +bool operator==(const bitset &bs) const │ │ │ │ │ +Equality of reference and std::bitset. │ │ │ │ │ +Definition: bitsetvector.hh:142 │ │ │ │ │ +Dune::BitSetVectorConstReference::test │ │ │ │ │ +bool test(size_type n) const │ │ │ │ │ +Returns true if bit n is set. │ │ │ │ │ +Definition: bitsetvector.hh:124 │ │ │ │ │ +Dune::BitSetVectorConstReference::operator[] │ │ │ │ │ +const_reference operator[](size_type i) const │ │ │ │ │ +Return reference to the i-th bit. │ │ │ │ │ +Definition: bitsetvector.hh:130 │ │ │ │ │ +Dune::BitSetVectorConstReference::operator<< │ │ │ │ │ +bitset operator<<(size_type n) const │ │ │ │ │ +Returns a copy of *this shifted left by n bits. │ │ │ │ │ +Definition: bitsetvector.hh:64 │ │ │ │ │ +Dune::BitSetVectorConstReference::operator= │ │ │ │ │ +BitSetVectorConstReference & operator=(const BitSetVectorConstReference &b) │ │ │ │ │ +hide assignment operator │ │ │ │ │ +Dune::BitSetVectorConstReference::BitSetVectorConstReference │ │ │ │ │ +BitSetVectorConstReference(const BitSetVector &blockBitField_, int │ │ │ │ │ +block_number_) │ │ │ │ │ +Definition: bitsetvector.hh:44 │ │ │ │ │ +Dune::BitSetVectorConstReference::blockBitField │ │ │ │ │ +const BitSetVector & blockBitField │ │ │ │ │ +Definition: bitsetvector.hh:181 │ │ │ │ │ +Dune::BitSetVectorConstReference::operator>> │ │ │ │ │ +bitset operator>>(size_type n) const │ │ │ │ │ +Returns a copy of *this shifted right by n bits. │ │ │ │ │ +Definition: bitsetvector.hh:72 │ │ │ │ │ +Dune::BitSetVectorConstReference::getBit │ │ │ │ │ +const_reference getBit(size_type i) const │ │ │ │ │ +Definition: bitsetvector.hh:184 │ │ │ │ │ +Dune::BitSetVectorConstReference::operator!= │ │ │ │ │ +bool operator!=(const bitset &bs) const │ │ │ │ │ +Inequality of reference and std::bitset. │ │ │ │ │ +Definition: bitsetvector.hh:154 │ │ │ │ │ +Dune::BitSetVectorConstReference::equals │ │ │ │ │ +bool equals(const BS &bs) const │ │ │ │ │ +Definition: bitsetvector.hh:190 │ │ │ │ │ +Dune::BitSetVectorConstReference::BitSetVector │ │ │ │ │ +Dune::BitSetVector< block_size, Alloc > BitSetVector │ │ │ │ │ +Definition: bitsetvector.hh:41 │ │ │ │ │ +Dune::BitSetVectorConstReference::bitset │ │ │ │ │ +std::bitset< block_size > bitset │ │ │ │ │ +Definition: bitsetvector.hh:56 │ │ │ │ │ +Dune::BitSetVectorConstReference::all │ │ │ │ │ +bool all() const │ │ │ │ │ +Returns true if all bits are set. │ │ │ │ │ +Definition: bitsetvector.hh:115 │ │ │ │ │ +Dune::BitSetVectorConstReference::size_type │ │ │ │ │ +size_t size_type │ │ │ │ │ +Definition: bitsetvector.hh:61 │ │ │ │ │ +Dune::BitSetVectorConstReference::operator~ │ │ │ │ │ +bitset operator~() const │ │ │ │ │ +Returns a copy of *this with all of its bits flipped. │ │ │ │ │ +Definition: bitsetvector.hh:80 │ │ │ │ │ +Dune::BitSetVectorConstReference::reference │ │ │ │ │ +std::vector< bool, Alloc >::const_reference reference │ │ │ │ │ +Definition: bitsetvector.hh:59 │ │ │ │ │ +Dune::BitSetVectorConstReference::size │ │ │ │ │ +size_type size() const │ │ │ │ │ +Returns block_size. │ │ │ │ │ +Definition: bitsetvector.hh:88 │ │ │ │ │ +Dune::BitSetVectorConstReference::count │ │ │ │ │ +size_type count() const │ │ │ │ │ +Returns the number of bits that are set. │ │ │ │ │ +Definition: bitsetvector.hh:94 │ │ │ │ │ +Dune::BitSetVectorConstReference::none │ │ │ │ │ +bool none() const │ │ │ │ │ +Returns true if no bits are set. │ │ │ │ │ +Definition: bitsetvector.hh:109 │ │ │ │ │ +Dune::BitSetVectorConstReference::any │ │ │ │ │ +bool any() const │ │ │ │ │ +Returns true if any bits are set. │ │ │ │ │ +Definition: bitsetvector.hh:103 │ │ │ │ │ +Dune::BitSetVectorConstReference::block_number │ │ │ │ │ +int block_number │ │ │ │ │ +Definition: bitsetvector.hh:182 │ │ │ │ │ +Dune::BitSetVectorConstReference::const_reference │ │ │ │ │ +std::vector< bool, Alloc >::const_reference const_reference │ │ │ │ │ +Definition: bitsetvector.hh:60 │ │ │ │ │ +Dune::const_reference<_BitSetVectorReference<_block_size,_Alloc_>_>::type │ │ │ │ │ +BitSetVectorConstReference< block_size, Alloc > type │ │ │ │ │ +Definition: bitsetvector.hh:443 │ │ │ │ │ +Dune::const_reference<_BitSetVectorConstReference<_block_size,_Alloc_>_>::type │ │ │ │ │ +BitSetVectorConstReference< block_size, Alloc > type │ │ │ │ │ +Definition: bitsetvector.hh:449 │ │ │ │ │ +Dune::mutable_reference<_BitSetVectorReference<_block_size,_Alloc_>_>::type │ │ │ │ │ +BitSetVectorReference< block_size, Alloc > type │ │ │ │ │ +Definition: bitsetvector.hh:455 │ │ │ │ │ +Dune::mutable_reference<_BitSetVectorConstReference<_block_size,_Alloc_>_>:: │ │ │ │ │ +type │ │ │ │ │ +BitSetVectorReference< block_size, Alloc > type │ │ │ │ │ +Definition: bitsetvector.hh:461 │ │ │ │ │ +Dune::RangeError │ │ │ │ │ +Default exception class for range errors. │ │ │ │ │ +Definition: exceptions.hh:254 │ │ │ │ │ +Dune::const_reference │ │ │ │ │ +Get the 'const' version of a reference to a mutable object. │ │ │ │ │ +Definition: genericiterator.hh:87 │ │ │ │ │ +Dune::mutable_reference │ │ │ │ │ +get the 'mutable' version of a reference to a const object │ │ │ │ │ +Definition: genericiterator.hh:116 │ │ │ │ │ +Dune::GenericIterator │ │ │ │ │ +Generic class for stl-conforming iterators for container classes with operator │ │ │ │ │ +[]. │ │ │ │ │ +Definition: genericiterator.hh:153 │ │ │ │ │ +Dune::ForwardIteratorFacade │ │ │ │ │ +Base class for stl conformant forward iterators. │ │ │ │ │ +Definition: iteratorfacades.hh:141 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00089.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: fmatrixev.cc File Reference │ │ │ │ +dune-common: documentation.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,43 +63,46 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ -Macros
│ │ │ │ -
fmatrixev.cc File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces | │ │ │ │ +Enumerations
│ │ │ │ +
documentation.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <iostream>
│ │ │ │ -#include <cmath>
│ │ │ │ -#include <cassert>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Macros

#define DUNE_FMATRIXEIGENVALUES_CC
 
│ │ │ │ -

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ DUNE_FMATRIXEIGENVALUES_CC

│ │ │ │ │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
#define DUNE_FMATRIXEIGENVALUES_CC
│ │ │ │ -
│ │ │ │ +

Documentation related stuff. │ │ │ │ +More...

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

Go to the source code of this file.

│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Classes

struct  Dune::ImplementationDefined
 Dummy struct used for documentation purposes. More...
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Namespaces

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

│ │ │ │ +Enumerations

enum  { Dune::implementationDefined │ │ │ │ + }
 
│ │ │ │ +

Detailed Description

│ │ │ │ +

Documentation related stuff.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,22 +4,27 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Macros │ │ │ │ │ -fmatrixev.cc File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ - Macros │ │ │ │ │ -#define DUNE_FMATRIXEIGENVALUES_CC │ │ │ │ │ +Classes | Namespaces | Enumerations │ │ │ │ │ +documentation.hh File Reference │ │ │ │ │ +Documentation related stuff. More... │ │ │ │ │ +Go_to_the_source_code_of_this_file. │ │ │ │ │ + Classes │ │ │ │ │ +struct  Dune::ImplementationDefined │ │ │ │ │ +  Dummy struct used for documentation purposes. More... │ │ │ │ │   │ │ │ │ │ -***** Macro Definition Documentation ***** │ │ │ │ │ -***** ◆ DUNE_FMATRIXEIGENVALUES_CC ***** │ │ │ │ │ -#define DUNE_FMATRIXEIGENVALUES_CC │ │ │ │ │ + Namespaces │ │ │ │ │ +namespace  Dune │ │ │ │ │ +  Dune namespace. │ │ │ │ │ +  │ │ │ │ │ + Enumerations │ │ │ │ │ +enum  { Dune::implementationDefined } │ │ │ │ │ +  │ │ │ │ │ +***** Detailed Description ***** │ │ │ │ │ +Documentation related stuff. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00092.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: debugalign.cc File Reference │ │ │ │ +dune-common: typeutilities.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,46 +63,54 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces | │ │ │ │ -Functions
│ │ │ │ -
debugalign.cc File Reference
│ │ │ │ +Typedefs
│ │ │ │ +
typeutilities.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <config.h>
│ │ │ │ -#include <cstddef>
│ │ │ │ -#include <cstdlib>
│ │ │ │ -#include <functional>
│ │ │ │ -#include <ios>
│ │ │ │ -#include <iostream>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <dune/common/debugalign.hh>
│ │ │ │ -
│ │ │ │ + │ │ │ │ +

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

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

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...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ -Functions

static void Dune::defaultViolatedAlignment (const char *className, std::size_t expectedAlignment, const void *address)
 default alignment violation handler More...
 
ViolatedAlignmentHandler & Dune::violatedAlignmentHandler ()
 access the handler called by violatedAlignment() More...
 
void Dune::violatedAlignment (const char *className, std::size_t expectedAlignment, const void *address)
 called when an alignment violation is detected More...
 

│ │ │ │ +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. More...
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

Utilities for type computations, constraining overloads, ...

│ │ │ │ +
Author
Carsten Gräser
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -us-ascii │ │ │ │ │ +utf-8 │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,39 +4,38 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Namespaces | Functions │ │ │ │ │ -debugalign.cc File Reference │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Typedefs │ │ │ │ │ +typeutilities.hh File Reference │ │ │ │ │ +Utilities for type computations, constraining overloads, ... More... │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +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... │ │ │ │ │ +  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ - Functions │ │ │ │ │ - static void Dune::defaultViolatedAlignment (const char │ │ │ │ │ - *className, std::size_t expectedAlignment, const │ │ │ │ │ - void *address) │ │ │ │ │ -  default alignment violation handler More... │ │ │ │ │ -  │ │ │ │ │ -ViolatedAlignmentHandler & Dune::violatedAlignmentHandler () │ │ │ │ │ -  access the handler called by violatedAlignment() │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ - void Dune::violatedAlignment (const char *className, │ │ │ │ │ - std::size_t expectedAlignment, const void *address) │ │ │ │ │ -  called when an alignment violation is detected │ │ │ │ │ - More... │ │ │ │ │ + Typedefs │ │ │ │ │ +template │ │ │ │ │ +using Dune::disableCopyMove = std::enable_if_t< not Impl:: │ │ │ │ │ + disableCopyMoveHelper< This, T... >::value, int > │ │ │ │ │ +  Helper to disable constructor as copy and move constructor. More... │ │ │ │ │   │ │ │ │ │ +***** Detailed Description ***** │ │ │ │ │ +Utilities for type computations, constraining overloads, ... │ │ │ │ │ + Author │ │ │ │ │ + Carsten Gräser │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00095.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: fmatrixev.hh File Reference │ │ │ │ +dune-common: parametertreeparser.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,66 +63,50 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
fmatrixev.hh File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces
│ │ │ │ +
parametertreeparser.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

Eigenvalue computations for the FieldMatrix class. │ │ │ │ +

Various parser methods to get data into a ParameterTree object. │ │ │ │ More...

│ │ │ │ -
#include <algorithm>
│ │ │ │ -#include <iostream>
│ │ │ │ -#include <cmath>
│ │ │ │ -#include <cassert>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/common/fvector.hh>
│ │ │ │ -#include <dune/common/fmatrix.hh>
│ │ │ │ -#include <dune/common/math.hh>
│ │ │ │ +
#include <istream>
│ │ │ │ +#include <string>
│ │ │ │ +#include <vector>
│ │ │ │ +#include <dune/common/parametertree.hh>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Classes

class  Dune::ParameterTreeParserError
 report parser error while reading ParameterTree More...
 
class  Dune::HelpRequest
 exception thrown if the user wants to see help string More...
 
class  Dune::ParameterTreeParser
 Parsers to set up a ParameterTree from various input sources. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::FMatrixHelp
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ -Functions

template<int dim, typename K >
static void Dune::FMatrixHelp::eigenValues (const FieldMatrix< K, dim, dim > &matrix, FieldVector< K, dim > &eigenValues)
 calculates the eigenvalues of a symmetric field matrix More...
 
template<int dim, typename K >
static void Dune::FMatrixHelp::eigenValuesVectors (const FieldMatrix< K, dim, dim > &matrix, FieldVector< K, dim > &eigenValues, FieldMatrix< K, dim, dim > &eigenVectors)
 calculates the eigenvalues and eigenvectors of a symmetric field matrix More...
 
template<int dim, typename K >
static void Dune::FMatrixHelp::eigenValuesLapack (const FieldMatrix< K, dim, dim > &matrix, FieldVector< K, dim > &eigenValues)
 calculates the eigenvalues of a symmetric field matrix More...
 
template<int dim, typename K >
static void Dune::FMatrixHelp::eigenValuesVectorsLapack (const FieldMatrix< K, dim, dim > &matrix, FieldVector< K, dim > &eigenValues, FieldMatrix< K, dim, dim > &eigenVectors)
 calculates the eigenvalues and -vectors of a symmetric field matrix More...
 
template<int dim, typename K , class C >
static void Dune::FMatrixHelp::eigenValuesNonSym (const FieldMatrix< K, dim, dim > &matrix, FieldVector< C, dim > &eigenValues)
 calculates the eigenvalues of a non-symmetric field matrix More...
 
│ │ │ │

Detailed Description

│ │ │ │ -

Eigenvalue computations for the FieldMatrix class.

│ │ │ │ +

Various parser methods to get data into a ParameterTree object.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,60 +4,35 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Namespaces | Functions │ │ │ │ │ -fmatrixev.hh File Reference │ │ │ │ │ -Eigenvalue computations for the FieldMatrix class. More... │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces │ │ │ │ │ +parametertreeparser.hh File Reference │ │ │ │ │ +Various parser methods to get data into a ParameterTree object. More... │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ - Namespaces │ │ │ │ │ -namespace  Dune │ │ │ │ │ -  Dune namespace. │ │ │ │ │ -  │ │ │ │ │ -namespace  Dune::FMatrixHelp │ │ │ │ │ -  │ │ │ │ │ - Functions │ │ │ │ │ -template │ │ │ │ │ -static void Dune::FMatrixHelp::eigenValues (const FieldMatrix< K, dim, dim > │ │ │ │ │ - &matrix, FieldVector< K, dim > &eigenValues) │ │ │ │ │ -  calculates the eigenvalues of a symmetric field matrix More... │ │ │ │ │ + Classes │ │ │ │ │ +class  Dune::ParameterTreeParserError │ │ │ │ │ +  report parser error while reading ParameterTree More... │ │ │ │ │   │ │ │ │ │ -template │ │ │ │ │ -static void Dune::FMatrixHelp::eigenValuesVectors (const FieldMatrix< K, dim, │ │ │ │ │ - dim > &matrix, FieldVector< K, dim > &eigenValues, FieldMatrix< K, │ │ │ │ │ - dim, dim > &eigenVectors) │ │ │ │ │ -  calculates the eigenvalues and eigenvectors of a symmetric field │ │ │ │ │ - matrix More... │ │ │ │ │ +class  Dune::HelpRequest │ │ │ │ │ +  exception thrown if the user wants to see help string More... │ │ │ │ │   │ │ │ │ │ -template │ │ │ │ │ -static void Dune::FMatrixHelp::eigenValuesLapack (const FieldMatrix< K, dim, │ │ │ │ │ - dim > &matrix, FieldVector< K, dim > &eigenValues) │ │ │ │ │ -  calculates the eigenvalues of a symmetric field matrix More... │ │ │ │ │ +class  Dune::ParameterTreeParser │ │ │ │ │ +  Parsers to set up a ParameterTree from various input sources. More... │ │ │ │ │   │ │ │ │ │ -template │ │ │ │ │ -static void Dune::FMatrixHelp::eigenValuesVectorsLapack (const FieldMatrix< K, │ │ │ │ │ - dim, dim > &matrix, FieldVector< K, dim > &eigenValues, │ │ │ │ │ - FieldMatrix< K, dim, dim > &eigenVectors) │ │ │ │ │ -  calculates the eigenvalues and -vectors of a symmetric field │ │ │ │ │ - matrix More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -static void Dune::FMatrixHelp::eigenValuesNonSym (const FieldMatrix< K, dim, │ │ │ │ │ - dim > &matrix, FieldVector< C, dim > &eigenValues) │ │ │ │ │ -  calculates the eigenvalues of a non-symmetric field matrix More... │ │ │ │ │ + Namespaces │ │ │ │ │ +namespace  Dune │ │ │ │ │ +  Dune namespace. │ │ │ │ │   │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -Eigenvalue computations for the FieldMatrix class. │ │ │ │ │ +Various parser methods to get data into a ParameterTree object. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00095_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: fmatrixev.hh Source File │ │ │ │ +dune-common: parametertreeparser.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,631 +62,91 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
fmatrixev.hh
│ │ │ │ +
parametertreeparser.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 (C) 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_FMATRIXEIGENVALUES_HH
│ │ │ │ -
6#define DUNE_FMATRIXEIGENVALUES_HH
│ │ │ │ +
5#ifndef DUNE_PARAMETER_PARSER_HH
│ │ │ │ +
6#define DUNE_PARAMETER_PARSER_HH
│ │ │ │
7
│ │ │ │ -
12#include <algorithm>
│ │ │ │ -
13#include <iostream>
│ │ │ │ -
14#include <cmath>
│ │ │ │ -
15#include <cassert>
│ │ │ │ -
16
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
20#include <dune/common/math.hh>
│ │ │ │ -
21
│ │ │ │ -
22namespace Dune {
│ │ │ │ -
23
│ │ │ │ -
29 namespace FMatrixHelp {
│ │ │ │ -
30
│ │ │ │ -
31#if HAVE_LAPACK
│ │ │ │ -
32 // defined in fmatrixev.cc
│ │ │ │ -
33 extern void eigenValuesLapackCall(
│ │ │ │ -
34 const char* jobz, const char* uplo, const long
│ │ │ │ -
35 int* n, double* a, const long int* lda, double* w,
│ │ │ │ -
36 double* work, const long int* lwork, long int* info);
│ │ │ │ -
37
│ │ │ │ -
38 extern void eigenValuesNonsymLapackCall(
│ │ │ │ -
39 const char* jobvl, const char* jobvr, const long
│ │ │ │ -
40 int* n, double* a, const long int* lda, double* wr, double* wi, double* vl,
│ │ │ │ -
41 const long int* ldvl, double* vr, const long int* ldvr, double* work,
│ │ │ │ -
42 const long int* lwork, long int* info);
│ │ │ │ -
43
│ │ │ │ -
44 extern void eigenValuesLapackCall(
│ │ │ │ -
45 const char* jobz, const char* uplo, const long
│ │ │ │ -
46 int* n, float* a, const long int* lda, float* w,
│ │ │ │ -
47 float* work, const long int* lwork, long int* info);
│ │ │ │ -
48
│ │ │ │ -
49 extern void eigenValuesNonsymLapackCall(
│ │ │ │ -
50 const char* jobvl, const char* jobvr, const long
│ │ │ │ -
51 int* n, float* a, const long int* lda, float* wr, float* wi, float* vl,
│ │ │ │ -
52 const long int* ldvl, float* vr, const long int* ldvr, float* work,
│ │ │ │ -
53 const long int* lwork, long int* info);
│ │ │ │ -
54
│ │ │ │ -
55#endif
│ │ │ │ -
56
│ │ │ │ -
57 namespace Impl {
│ │ │ │ -
58 //internal tag to activate/disable code for eigenvector calculation at compile time
│ │ │ │ -
59 enum Jobs { OnlyEigenvalues=0, EigenvaluesEigenvectors=1 };
│ │ │ │ -
60
│ │ │ │ -
61 //internal dummy used if only eigenvalues are to be calculated
│ │ │ │ -
62 template<typename K, int dim>
│ │ │ │ -
63 using EVDummy = FieldMatrix<K, dim, dim>;
│ │ │ │ -
64
│ │ │ │ -
65 //compute the cross-product of two vectors
│ │ │ │ -
66 template<typename K>
│ │ │ │ -
67 inline FieldVector<K,3> crossProduct(const FieldVector<K,3>& vec0, const FieldVector<K,3>& vec1) {
│ │ │ │ -
68 return {vec0[1]*vec1[2] - vec0[2]*vec1[1], vec0[2]*vec1[0] - vec0[0]*vec1[2], vec0[0]*vec1[1] - vec0[1]*vec1[0]};
│ │ │ │ -
69 }
│ │ │ │ -
70
│ │ │ │ -
71 template <typename K>
│ │ │ │ -
72 static void eigenValues2dImpl(const FieldMatrix<K, 2, 2>& matrix,
│ │ │ │ -
73 FieldVector<K, 2>& eigenvalues)
│ │ │ │ -
74 {
│ │ │ │ -
75 using std::sqrt;
│ │ │ │ -
76 const K p = 0.5 * (matrix[0][0] + matrix [1][1]);
│ │ │ │ -
77 const K p2 = p - matrix[1][1];
│ │ │ │ -
78 K q = p2 * p2 + matrix[1][0] * matrix[0][1];
│ │ │ │ -
79 if( q < 0 && q > -1e-14 ) q = 0;
│ │ │ │ -
80 if (q < 0)
│ │ │ │ -
81 {
│ │ │ │ -
82 std::cout << matrix << std::endl;
│ │ │ │ -
83 // Complex eigenvalues are either caused by non-symmetric matrices or by round-off errors
│ │ │ │ -
84 DUNE_THROW(MathError, "Complex eigenvalue detected (which this implementation cannot handle).");
│ │ │ │ -
85 }
│ │ │ │ -
86
│ │ │ │ -
87 // get square root
│ │ │ │ -
88 q = sqrt(q);
│ │ │ │ -
89
│ │ │ │ -
90 // store eigenvalues in ascending order
│ │ │ │ -
91 eigenvalues[0] = p - q;
│ │ │ │ -
92 eigenvalues[1] = p + q;
│ │ │ │ -
93 }
│ │ │ │ -
94
│ │ │ │ -
95 /*
│ │ │ │ -
96 This implementation was adapted from the pseudo-code (Python?) implementation found on
│ │ │ │ -
97 http://en.wikipedia.org/wiki/Eigenvalue_algorithm (retrieved late August 2014).
│ │ │ │ -
98 Wikipedia claims to have taken it from
│ │ │ │ -
99 Smith, Oliver K. (April 1961), Eigenvalues of a symmetric 3 × 3 matrix.,
│ │ │ │ -
100 Communications of the ACM 4 (4): 168, doi:10.1145/355578.366316
│ │ │ │ -
101 */
│ │ │ │ -
102 template <typename K>
│ │ │ │ -
103 static K eigenValues3dImpl(const FieldMatrix<K, 3, 3>& matrix,
│ │ │ │ -
104 FieldVector<K, 3>& eigenvalues)
│ │ │ │ -
105 {
│ │ │ │ -
106 using std::sqrt;
│ │ │ │ -
107 using std::acos;
│ │ │ │ -
108 using real_type = typename FieldTraits<K>::real_type;
│ │ │ │ -
109 const K pi = MathematicalConstants<K>::pi();
│ │ │ │ -
110 K p1 = matrix[0][1]*matrix[0][1] + matrix[0][2]*matrix[0][2] + matrix[1][2]*matrix[1][2];
│ │ │ │ -
111
│ │ │ │ -
112 if (p1 <= std::numeric_limits<K>::epsilon()) {
│ │ │ │ -
113 // A is diagonal.
│ │ │ │ -
114 eigenvalues[0] = matrix[0][0];
│ │ │ │ -
115 eigenvalues[1] = matrix[1][1];
│ │ │ │ -
116 eigenvalues[2] = matrix[2][2];
│ │ │ │ -
117 std::sort(eigenvalues.begin(), eigenvalues.end());
│ │ │ │ -
118
│ │ │ │ -
119 return 0.0;
│ │ │ │ -
120 }
│ │ │ │ -
121 else
│ │ │ │ -
122 {
│ │ │ │ -
123 // q = trace(A)/3
│ │ │ │ -
124 K q = 0;
│ │ │ │ -
125 for (int i=0; i<3; i++)
│ │ │ │ -
126 q += matrix[i][i] / 3.0;
│ │ │ │ -
127
│ │ │ │ -
128 K p2 = (matrix[0][0] - q)*(matrix[0][0] - q) + (matrix[1][1] - q)*(matrix[1][1] - q) + (matrix[2][2] - q)*(matrix[2][2] - q) + 2.0 * p1;
│ │ │ │ -
129 K p = sqrt(p2 / 6);
│ │ │ │ -
130 // B = (1 / p) * (A - q * I); // I is the identity matrix
│ │ │ │ -
131 FieldMatrix<K,3,3> B;
│ │ │ │ -
132 for (int i=0; i<3; i++)
│ │ │ │ -
133 for (int j=0; j<3; j++)
│ │ │ │ -
134 B[i][j] = (real_type(1.0)/p) * (matrix[i][j] - q*(i==j));
│ │ │ │ -
135
│ │ │ │ -
136 K r = B.determinant() / 2.0;
│ │ │ │ -
137
│ │ │ │ -
138 /*In exact arithmetic for a symmetric matrix -1 <= r <= 1
│ │ │ │ -
139 but computation error can leave it slightly outside this range.
│ │ │ │ -
140 acos(z) function requires |z| <= 1, but will fail silently
│ │ │ │ -
141 and return NaN if the input is larger than 1 in magnitude.
│ │ │ │ -
142 Thus r is clamped to [-1,1].*/
│ │ │ │ -
143 using std::clamp;
│ │ │ │ -
144 r = clamp<K>(r, -1.0, 1.0);
│ │ │ │ -
145 K phi = acos(r) / 3.0;
│ │ │ │ +
12#include <istream>
│ │ │ │ +
13#include <string>
│ │ │ │ +
14#include <vector>
│ │ │ │ +
15
│ │ │ │ + │ │ │ │ + │ │ │ │ +
18
│ │ │ │ +
19namespace Dune {
│ │ │ │ +
20
│ │ │ │ + │ │ │ │ +
28 class HelpRequest : public Exception {};
│ │ │ │ +
29
│ │ │ │ + │ │ │ │ +
35 {
│ │ │ │ +
36
│ │ │ │ +
37 static std::string ltrim(const std::string& s);
│ │ │ │ +
38 static std::string rtrim(const std::string& s);
│ │ │ │ +
39
│ │ │ │ +
40 public:
│ │ │ │ +
41
│ │ │ │ +
85
│ │ │ │ +
96 static void readINITree(std::istream& in, ParameterTree& pt,
│ │ │ │ +
97 bool overwrite);
│ │ │ │ +
98
│ │ │ │ +
105 static Dune::ParameterTree readINITree(std::istream& in);
│ │ │ │ +
106
│ │ │ │ +
107
│ │ │ │ +
120 static void readINITree(std::istream& in, ParameterTree& pt,
│ │ │ │ +
121 const std::string srcname = "stream",
│ │ │ │ +
122 bool overwrite = true);
│ │ │ │ +
123
│ │ │ │ +
124
│ │ │ │ +
135 static void readINITree(std::string file, ParameterTree& pt, bool overwrite = true);
│ │ │ │ +
136
│ │ │ │ +
143 static Dune::ParameterTree readINITree(const std::string& file);
│ │ │ │ +
144
│ │ │ │
146
│ │ │ │ -
147 // the eigenvalues satisfy eig[2] <= eig[1] <= eig[0]
│ │ │ │ -
148 eigenvalues[2] = q + 2 * p * cos(phi);
│ │ │ │ -
149 eigenvalues[0] = q + 2 * p * cos(phi + (2*pi/3));
│ │ │ │ -
150 eigenvalues[1] = 3 * q - eigenvalues[0] - eigenvalues[2]; // since trace(matrix) = eig1 + eig2 + eig3
│ │ │ │ -
151
│ │ │ │ -
152 return r;
│ │ │ │ -
153 }
│ │ │ │ -
154 }
│ │ │ │ -
155
│ │ │ │ -
156 //see https://www.geometrictools.com/Documentation/RobustEigenSymmetric3x3.pdf
│ │ │ │ -
157 //Robustly compute a right-handed orthonormal set {u, v, evec0}.
│ │ │ │ -
158 template<typename K>
│ │ │ │ -
159 void orthoComp(const FieldVector<K,3>& evec0, FieldVector<K,3>& u, FieldVector<K,3>& v) {
│ │ │ │ -
160 using std::abs;
│ │ │ │ -
161 if(abs(evec0[0]) > abs(evec0[1])) {
│ │ │ │ -
162 //The component of maximum absolute value is either evec0[0] or evec0[2].
│ │ │ │ -
163 FieldVector<K,2> temp = {evec0[0], evec0[2]};
│ │ │ │ -
164 auto L = 1.0 / temp.two_norm();
│ │ │ │ -
165 u = L * FieldVector<K,3>({-evec0[2], 0.0, evec0[0]});
│ │ │ │ -
166 }
│ │ │ │ -
167 else {
│ │ │ │ -
168 //The component of maximum absolute value is either evec0[1] or evec0[2].
│ │ │ │ -
169 FieldVector<K,2> temp = {evec0[1], evec0[2]};
│ │ │ │ -
170 auto L = 1.0 / temp.two_norm();
│ │ │ │ -
171 u = L * FieldVector<K,3>({0.0, evec0[2], -evec0[1]});
│ │ │ │ -
172 }
│ │ │ │ -
173 v = crossProduct(evec0, u);
│ │ │ │ -
174 }
│ │ │ │ -
175
│ │ │ │ -
176 //see https://www.geometrictools.com/Documentation/RobustEigenSymmetric3x3.pdf
│ │ │ │ -
177 template<typename K>
│ │ │ │ -
178 void eig0(const FieldMatrix<K,3,3>& matrix, K eval0, FieldVector<K,3>& evec0) {
│ │ │ │ -
179 /* Compute a unit-length eigenvector for eigenvalue[i0]. The
│ │ │ │ -
180 matrix is rank 2, so two of the rows are linearly independent.
│ │ │ │ -
181 For a robust computation of the eigenvector, select the two
│ │ │ │ -
182 rows whose cross product has largest length of all pairs of
│ │ │ │ -
183 rows. */
│ │ │ │ -
184 using Vector = FieldVector<K,3>;
│ │ │ │ -
185 Vector row0 = {matrix[0][0]-eval0, matrix[0][1], matrix[0][2]};
│ │ │ │ -
186 Vector row1 = {matrix[1][0], matrix[1][1]-eval0, matrix[1][2]};
│ │ │ │ -
187 Vector row2 = {matrix[2][0], matrix[2][1], matrix[2][2]-eval0};
│ │ │ │ +
158 static void readOptions(int argc, char* argv [], ParameterTree& pt);
│ │ │ │ +
159
│ │ │ │ +
177 static void readNamedOptions(int argc, char* argv[],
│ │ │ │ +
178 ParameterTree& pt,
│ │ │ │ +
179 std::vector<std::string> keywords,
│ │ │ │ +
180 unsigned int required = std::numeric_limits<unsigned int>::max(),
│ │ │ │ +
181 bool allow_more = true,
│ │ │ │ +
182 bool overwrite = true,
│ │ │ │ +
183 std::vector<std::string> help = std::vector<std::string>());
│ │ │ │ +
184
│ │ │ │ +
185 private:
│ │ │ │ +
186 static std::string generateHelpString(std::string progname, std::vector<std::string> keywords, unsigned int required, std::vector<std::string> help);
│ │ │ │ +
187 };
│ │ │ │
188
│ │ │ │ -
189 Vector r0xr1 = crossProduct(row0, row1);
│ │ │ │ -
190 Vector r0xr2 = crossProduct(row0, row2);
│ │ │ │ -
191 Vector r1xr2 = crossProduct(row1, row2);
│ │ │ │ -
192 auto d0 = r0xr1.two_norm();
│ │ │ │ -
193 auto d1 = r0xr2.two_norm();
│ │ │ │ -
194 auto d2 = r1xr2.two_norm();
│ │ │ │ -
195
│ │ │ │ -
196 auto dmax = d0 ;
│ │ │ │ -
197 int imax = 0;
│ │ │ │ -
198 if(d1>dmax) {
│ │ │ │ -
199 dmax = d1;
│ │ │ │ -
200 imax = 1;
│ │ │ │ -
201 }
│ │ │ │ -
202 if(d2>dmax)
│ │ │ │ -
203 imax = 2;
│ │ │ │ -
204
│ │ │ │ -
205 if(imax == 0)
│ │ │ │ -
206 evec0 = r0xr1 / d0;
│ │ │ │ -
207 else if(imax == 1)
│ │ │ │ -
208 evec0 = r0xr2 / d1;
│ │ │ │ -
209 else
│ │ │ │ -
210 evec0 = r1xr2 / d2;
│ │ │ │ -
211 }
│ │ │ │ -
212
│ │ │ │ -
213 //see https://www.geometrictools.com/Documentation/RobustEigenSymmetric3x3.pdf
│ │ │ │ -
214 template<typename K>
│ │ │ │ -
215 void eig1(const FieldMatrix<K,3,3>& matrix, const FieldVector<K,3>& evec0, FieldVector<K,3>& evec1, K eval1) {
│ │ │ │ -
216 using Vector = FieldVector<K,3>;
│ │ │ │ -
217
│ │ │ │ -
218 //Robustly compute a right-handed orthonormal set {u, v, evec0}.
│ │ │ │ -
219 Vector u,v;
│ │ │ │ -
220 orthoComp(evec0, u, v);
│ │ │ │ -
221
│ │ │ │ -
222 /* Let e be eval1 and let E be a corresponding eigenvector which
│ │ │ │ -
223 is a solution to the linear system (A - e*I)*E = 0. The matrix
│ │ │ │ -
224 (A - e*I) is 3x3, not invertible (so infinitely many
│ │ │ │ -
225 solutions), and has rank 2 when eval1 and eval are different.
│ │ │ │ -
226 It has rank 1 when eval1 and eval2 are equal. Numerically, it
│ │ │ │ -
227 is difficult to compute robustly the rank of a matrix. Instead,
│ │ │ │ -
228 the 3x3 linear system is reduced to a 2x2 system as follows.
│ │ │ │ -
229 Define the 3x2 matrix J = [u,v] whose columns are the u and v
│ │ │ │ -
230 computed previously. Define the 2x1 vector X = J*E. The 2x2
│ │ │ │ -
231 system is 0 = M * X = (J^T * (A - e*I) * J) * X where J^T is
│ │ │ │ -
232 the transpose of J and M = J^T * (A - e*I) * J is a 2x2 matrix.
│ │ │ │ -
233 The system may be written as
│ │ │ │ -
234 +- -++- -+ +- -+
│ │ │ │ -
235 | U^T*A*U - e U^T*A*V || x0 | = e * | x0 |
│ │ │ │ -
236 | V^T*A*U V^T*A*V - e || x1 | | x1 |
│ │ │ │ -
237 +- -++ -+ +- -+
│ │ │ │ -
238 where X has row entries x0 and x1. */
│ │ │ │ -
239
│ │ │ │ -
240 Vector Au, Av;
│ │ │ │ -
241 matrix.mv(u, Au);
│ │ │ │ -
242 matrix.mv(v, Av);
│ │ │ │ -
243
│ │ │ │ -
244 auto m00 = u.dot(Au) - eval1;
│ │ │ │ -
245 auto m01 = u.dot(Av);
│ │ │ │ -
246 auto m11 = v.dot(Av) - eval1;
│ │ │ │ -
247
│ │ │ │ -
248 /* For robustness, choose the largest-length row of M to compute
│ │ │ │ -
249 the eigenvector. The 2-tuple of coefficients of U and V in the
│ │ │ │ -
250 assignments to eigenvector[1] lies on a circle, and U and V are
│ │ │ │ -
251 unit length and perpendicular, so eigenvector[1] is unit length
│ │ │ │ -
252 (within numerical tolerance). */
│ │ │ │ -
253 using std::abs, std::sqrt, std::max;
│ │ │ │ -
254 auto absM00 = abs(m00);
│ │ │ │ -
255 auto absM01 = abs(m01);
│ │ │ │ -
256 auto absM11 = abs(m11);
│ │ │ │ -
257 if(absM00 >= absM11) {
│ │ │ │ -
258 auto maxAbsComp = max(absM00, absM01);
│ │ │ │ -
259 if(maxAbsComp > 0.0) {
│ │ │ │ -
260 if(absM00 >= absM01) {
│ │ │ │ -
261 m01 /= m00;
│ │ │ │ -
262 m00 = 1.0 / sqrt(1.0 + m01*m01);
│ │ │ │ -
263 m01 *= m00;
│ │ │ │ -
264 }
│ │ │ │ -
265 else {
│ │ │ │ -
266 m00 /= m01;
│ │ │ │ -
267 m01 = 1.0 / sqrt(1.0 + m00*m00);
│ │ │ │ -
268 m00 *= m01;
│ │ │ │ -
269 }
│ │ │ │ -
270 evec1 = m01*u - m00*v;
│ │ │ │ -
271 }
│ │ │ │ -
272 else
│ │ │ │ -
273 evec1 = u;
│ │ │ │ -
274 }
│ │ │ │ -
275 else {
│ │ │ │ -
276 auto maxAbsComp = max(absM11, absM01);
│ │ │ │ -
277 if(maxAbsComp > 0.0) {
│ │ │ │ -
278 if(absM11 >= absM01) {
│ │ │ │ -
279 m01 /= m11;
│ │ │ │ -
280 m11 = 1.0 / sqrt(1.0 + m01*m01);
│ │ │ │ -
281 m01 *= m11;
│ │ │ │ -
282 }
│ │ │ │ -
283 else {
│ │ │ │ -
284 m11 /= m01;
│ │ │ │ -
285 m01 = 1.0 / sqrt(1.0 + m11*m11);
│ │ │ │ -
286 m11 *= m01;
│ │ │ │ -
287 }
│ │ │ │ -
288 evec1 = m11*u - m01*v;
│ │ │ │ -
289 }
│ │ │ │ -
290 else
│ │ │ │ -
291 evec1 = u;
│ │ │ │ -
292 }
│ │ │ │ -
293 }
│ │ │ │ -
294
│ │ │ │ -
295 // 1d specialization
│ │ │ │ -
296 template<Jobs Tag, typename K>
│ │ │ │ -
297 static void eigenValuesVectorsImpl(const FieldMatrix<K, 1, 1>& matrix,
│ │ │ │ -
298 FieldVector<K, 1>& eigenValues,
│ │ │ │ -
299 FieldMatrix<K, 1, 1>& eigenVectors)
│ │ │ │ -
300 {
│ │ │ │ -
301 eigenValues[0] = matrix[0][0];
│ │ │ │ -
302 if constexpr(Tag==EigenvaluesEigenvectors)
│ │ │ │ -
303 eigenVectors[0] = {1.0};
│ │ │ │ -
304 }
│ │ │ │ -
305
│ │ │ │ -
306
│ │ │ │ -
307 // 2d specialization
│ │ │ │ -
308 template <Jobs Tag, typename K>
│ │ │ │ -
309 static void eigenValuesVectorsImpl(const FieldMatrix<K, 2, 2>& matrix,
│ │ │ │ -
310 FieldVector<K, 2>& eigenValues,
│ │ │ │ -
311 FieldMatrix<K, 2, 2>& eigenVectors)
│ │ │ │ -
312 {
│ │ │ │ -
313 // Compute eigen values
│ │ │ │ -
314 Impl::eigenValues2dImpl(matrix, eigenValues);
│ │ │ │ -
315
│ │ │ │ -
316 // Compute eigenvectors by exploiting the Cayley–Hamilton theorem.
│ │ │ │ -
317 // If λ_1, λ_2 are the eigenvalues, then (A - λ_1I )(A - λ_2I ) = (A - λ_2I )(A - λ_1I ) = 0,
│ │ │ │ -
318 // so the columns of (A - λ_2I ) are annihilated by (A - λ_1I ) and vice versa.
│ │ │ │ -
319 // Assuming neither matrix is zero, the columns of each must include eigenvectors
│ │ │ │ -
320 // for the other eigenvalue. (If either matrix is zero, then A is a multiple of the
│ │ │ │ -
321 // identity and any non-zero vector is an eigenvector.)
│ │ │ │ -
322 // From: https://en.wikipedia.org/wiki/Eigenvalue_algorithm#2x2_matrices
│ │ │ │ -
323 if constexpr(Tag==EigenvaluesEigenvectors) {
│ │ │ │ -
324
│ │ │ │ -
325 // Special casing for multiples of the identity
│ │ │ │ -
326 FieldMatrix<K,2,2> temp = matrix;
│ │ │ │ -
327 temp[0][0] -= eigenValues[0];
│ │ │ │ -
328 temp[1][1] -= eigenValues[0];
│ │ │ │ -
329 if(temp.infinity_norm() <= 1e-14) {
│ │ │ │ -
330 eigenVectors[0] = {1.0, 0.0};
│ │ │ │ -
331 eigenVectors[1] = {0.0, 1.0};
│ │ │ │ -
332 }
│ │ │ │ -
333 else {
│ │ │ │ -
334 // The columns of A - λ_2I are eigenvectors for λ_1, or zero.
│ │ │ │ -
335 // Take the column with the larger norm to avoid zero columns.
│ │ │ │ -
336 FieldVector<K,2> ev0 = {matrix[0][0]-eigenValues[1], matrix[1][0]};
│ │ │ │ -
337 FieldVector<K,2> ev1 = {matrix[0][1], matrix[1][1]-eigenValues[1]};
│ │ │ │ -
338 eigenVectors[0] = (ev0.two_norm2() >= ev1.two_norm2()) ? ev0/ev0.two_norm() : ev1/ev1.two_norm();
│ │ │ │ -
339
│ │ │ │ -
340 // The columns of A - λ_1I are eigenvectors for λ_2, or zero.
│ │ │ │ -
341 // Take the column with the larger norm to avoid zero columns.
│ │ │ │ -
342 ev0 = {matrix[0][0]-eigenValues[0], matrix[1][0]};
│ │ │ │ -
343 ev1 = {matrix[0][1], matrix[1][1]-eigenValues[0]};
│ │ │ │ -
344 eigenVectors[1] = (ev0.two_norm2() >= ev1.two_norm2()) ? ev0/ev0.two_norm() : ev1/ev1.two_norm();
│ │ │ │ -
345 }
│ │ │ │ -
346 }
│ │ │ │ -
347 }
│ │ │ │ -
348
│ │ │ │ -
349 // 3d specialization
│ │ │ │ -
350 template <Jobs Tag, typename K>
│ │ │ │ -
351 static void eigenValuesVectorsImpl(const FieldMatrix<K, 3, 3>& matrix,
│ │ │ │ -
352 FieldVector<K, 3>& eigenValues,
│ │ │ │ -
353 FieldMatrix<K, 3, 3>& eigenVectors)
│ │ │ │ -
354 {
│ │ │ │ -
355 using Vector = FieldVector<K,3>;
│ │ │ │ -
356 using Matrix = FieldMatrix<K,3,3>;
│ │ │ │ -
357
│ │ │ │ -
358 //compute eigenvalues
│ │ │ │ -
359 /* Precondition the matrix by factoring out the maximum absolute
│ │ │ │ -
360 value of the components. This guards against floating-point
│ │ │ │ -
361 overflow when computing the eigenvalues.*/
│ │ │ │ -
362 using std::isnormal;
│ │ │ │ -
363 K maxAbsElement = (isnormal(matrix.infinity_norm())) ? matrix.infinity_norm() : K(1.0);
│ │ │ │ -
364 Matrix scaledMatrix = matrix / maxAbsElement;
│ │ │ │ -
365 K r = Impl::eigenValues3dImpl(scaledMatrix, eigenValues);
│ │ │ │ -
366
│ │ │ │ -
367 if constexpr(Tag==EigenvaluesEigenvectors) {
│ │ │ │ -
368 K offDiagNorm = Vector{scaledMatrix[0][1],scaledMatrix[0][2],scaledMatrix[1][2]}.two_norm2();
│ │ │ │ -
369 if (offDiagNorm <= std::numeric_limits<K>::epsilon())
│ │ │ │ -
370 {
│ │ │ │ -
371 eigenValues = {scaledMatrix[0][0], scaledMatrix[1][1], scaledMatrix[2][2]};
│ │ │ │ -
372 eigenVectors = {{1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0}};
│ │ │ │ -
373
│ │ │ │ -
374 // Use bubble sort to jointly sort eigenvalues and eigenvectors
│ │ │ │ -
375 // such that eigenvalues are ascending
│ │ │ │ -
376 if (eigenValues[0] > eigenValues[1])
│ │ │ │ -
377 {
│ │ │ │ - │ │ │ │ -
379 std::swap(eigenVectors[0], eigenVectors[1]);
│ │ │ │ -
380 }
│ │ │ │ -
381 if (eigenValues[1] > eigenValues[2])
│ │ │ │ -
382 {
│ │ │ │ - │ │ │ │ -
384 std::swap(eigenVectors[1], eigenVectors[2]);
│ │ │ │ -
385 }
│ │ │ │ -
386 if (eigenValues[0] > eigenValues[1])
│ │ │ │ -
387 {
│ │ │ │ - │ │ │ │ -
389 std::swap(eigenVectors[0], eigenVectors[1]);
│ │ │ │ -
390 }
│ │ │ │ -
391 }
│ │ │ │ -
392 else {
│ │ │ │ -
393 /*Compute the eigenvectors so that the set
│ │ │ │ -
394 [evec[0], evec[1], evec[2]] is right handed and
│ │ │ │ -
395 orthonormal. */
│ │ │ │ -
396
│ │ │ │ -
397 Matrix evec(0.0);
│ │ │ │ -
398 Vector eval(eigenValues);
│ │ │ │ -
399 if(r >= 0) {
│ │ │ │ -
400 Impl::eig0(scaledMatrix, eval[2], evec[2]);
│ │ │ │ -
401 Impl::eig1(scaledMatrix, evec[2], evec[1], eval[1]);
│ │ │ │ -
402 evec[0] = Impl::crossProduct(evec[1], evec[2]);
│ │ │ │ -
403 }
│ │ │ │ -
404 else {
│ │ │ │ -
405 Impl::eig0(scaledMatrix, eval[0], evec[0]);
│ │ │ │ -
406 Impl::eig1(scaledMatrix, evec[0], evec[1], eval[1]);
│ │ │ │ -
407 evec[2] = Impl::crossProduct(evec[0], evec[1]);
│ │ │ │ -
408 }
│ │ │ │ -
409 //sort eval/evec-pairs in ascending order
│ │ │ │ -
410 using EVPair = std::pair<K, Vector>;
│ │ │ │ -
411 std::vector<EVPair> pairs;
│ │ │ │ -
412 for(std::size_t i=0; i<=2; ++i)
│ │ │ │ -
413 pairs.push_back(EVPair(eval[i], evec[i]));
│ │ │ │ -
414 auto comp = [](EVPair x, EVPair y){ return x.first < y.first; };
│ │ │ │ -
415 std::sort(pairs.begin(), pairs.end(), comp);
│ │ │ │ -
416 for(std::size_t i=0; i<=2; ++i){
│ │ │ │ -
417 eigenValues[i] = pairs[i].first;
│ │ │ │ -
418 eigenVectors[i] = pairs[i].second;
│ │ │ │ -
419 }
│ │ │ │ -
420 }
│ │ │ │ -
421 }
│ │ │ │ -
422 //The preconditioning scaled the matrix, which scales the eigenvalues. Revert the scaling.
│ │ │ │ -
423 eigenValues *= maxAbsElement;
│ │ │ │ -
424 }
│ │ │ │ -
425
│ │ │ │ -
426 // forwarding to LAPACK with corresponding tag
│ │ │ │ -
427 template <Jobs Tag, int dim, typename K>
│ │ │ │ -
428 static void eigenValuesVectorsLapackImpl(const FieldMatrix<K, dim, dim>& matrix,
│ │ │ │ -
429 FieldVector<K, dim>& eigenValues,
│ │ │ │ -
430 FieldMatrix<K, dim, dim>& eigenVectors)
│ │ │ │ -
431 {
│ │ │ │ -
432 {
│ │ │ │ -
433#if HAVE_LAPACK
│ │ │ │ -
434 /*Lapack uses a proprietary tag to determine whether both eigenvalues and
│ │ │ │ -
435 -vectors ('v') or only eigenvalues ('n') should be calculated */
│ │ │ │ -
436 const char jobz = "nv"[Tag];
│ │ │ │ -
437
│ │ │ │ -
438 const long int N = dim ;
│ │ │ │ -
439 const char uplo = 'u'; // use upper triangular matrix
│ │ │ │ -
440
│ │ │ │ -
441 // length of matrix vector, LWORK >= max(1,3*N-1)
│ │ │ │ -
442 const long int lwork = 3*N -1 ;
│ │ │ │ -
443
│ │ │ │ -
444 constexpr bool isKLapackType = std::is_same_v<K,double> || std::is_same_v<K,float>;
│ │ │ │ -
445 using LapackNumType = std::conditional_t<isKLapackType, K, double>;
│ │ │ │ -
446
│ │ │ │ -
447 // matrix to put into dsyev
│ │ │ │ -
448 LapackNumType matrixVector[dim * dim];
│ │ │ │ -
449
│ │ │ │ -
450 // copy matrix
│ │ │ │ -
451 int row = 0;
│ │ │ │ -
452 for(int i=0; i<dim; ++i)
│ │ │ │ -
453 {
│ │ │ │ -
454 for(int j=0; j<dim; ++j, ++row)
│ │ │ │ -
455 {
│ │ │ │ -
456 matrixVector[ row ] = matrix[ i ][ j ];
│ │ │ │ -
457 }
│ │ │ │ -
458 }
│ │ │ │ -
459
│ │ │ │ -
460 // working memory
│ │ │ │ -
461 LapackNumType workSpace[lwork];
│ │ │ │ -
462
│ │ │ │ -
463 // return value information
│ │ │ │ -
464 long int info = 0;
│ │ │ │ -
465 LapackNumType* ev;
│ │ │ │ -
466 if constexpr (isKLapackType){
│ │ │ │ -
467 ev = &eigenValues[0];
│ │ │ │ -
468 }else{
│ │ │ │ -
469 ev = new LapackNumType[dim];
│ │ │ │ -
470 }
│ │ │ │ -
471
│ │ │ │ -
472 // call LAPACK routine (see fmatrixev.cc)
│ │ │ │ -
473 eigenValuesLapackCall(&jobz, &uplo, &N, &matrixVector[0], &N,
│ │ │ │ -
474 ev, &workSpace[0], &lwork, &info);
│ │ │ │ -
475
│ │ │ │ -
476 if constexpr (!isKLapackType){
│ │ │ │ -
477 for(size_t i=0;i<dim;++i)
│ │ │ │ -
478 eigenValues[i] = ev[i];
│ │ │ │ -
479 delete[] ev;
│ │ │ │ -
480 }
│ │ │ │ -
481
│ │ │ │ -
482 // restore eigenvectors matrix
│ │ │ │ -
483 if (Tag==Jobs::EigenvaluesEigenvectors){
│ │ │ │ -
484 row = 0;
│ │ │ │ -
485 for(int i=0; i<dim; ++i)
│ │ │ │ -
486 {
│ │ │ │ -
487 for(int j=0; j<dim; ++j, ++row)
│ │ │ │ -
488 {
│ │ │ │ -
489 eigenVectors[ i ][ j ] = matrixVector[ row ];
│ │ │ │ -
490 }
│ │ │ │ -
491 }
│ │ │ │ -
492 }
│ │ │ │ -
493
│ │ │ │ -
494 if( info != 0 )
│ │ │ │ -
495 {
│ │ │ │ -
496 std::cerr << "For matrix " << matrix << " eigenvalue calculation failed! " << std::endl;
│ │ │ │ -
497 DUNE_THROW(InvalidStateException,"eigenValues: Eigenvalue calculation failed!");
│ │ │ │ -
498 }
│ │ │ │ -
499#else
│ │ │ │ -
500 DUNE_THROW(NotImplemented,"LAPACK not found!");
│ │ │ │ -
501#endif
│ │ │ │ -
502 }
│ │ │ │ -
503 }
│ │ │ │ -
504
│ │ │ │ -
505 // generic specialization
│ │ │ │ -
506 template <Jobs Tag, int dim, typename K>
│ │ │ │ -
507 static void eigenValuesVectorsImpl(const FieldMatrix<K, dim, dim>& matrix,
│ │ │ │ -
508 FieldVector<K, dim>& eigenValues,
│ │ │ │ -
509 FieldMatrix<K, dim, dim>& eigenVectors)
│ │ │ │ -
510 {
│ │ │ │ -
511 eigenValuesVectorsLapackImpl<Tag>(matrix,eigenValues,eigenVectors);
│ │ │ │ -
512 }
│ │ │ │ -
513 } //namespace Impl
│ │ │ │ -
514
│ │ │ │ -
522 template <int dim, typename K>
│ │ │ │ -
523 static void eigenValues(const FieldMatrix<K, dim, dim>& matrix,
│ │ │ │ - │ │ │ │ -
525 {
│ │ │ │ - │ │ │ │ -
527 Impl::eigenValuesVectorsImpl<Impl::Jobs::OnlyEigenvalues>(matrix, eigenValues, dummy);
│ │ │ │ -
528 }
│ │ │ │ -
529
│ │ │ │ -
538 template <int dim, typename K>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
541 FieldMatrix<K, dim, dim>& eigenVectors)
│ │ │ │ -
542 {
│ │ │ │ -
543 Impl::eigenValuesVectorsImpl<Impl::Jobs::EigenvaluesEigenvectors>(matrix, eigenValues, eigenVectors);
│ │ │ │ -
544 }
│ │ │ │ -
545
│ │ │ │ -
553 template <int dim, typename K>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
556 {
│ │ │ │ - │ │ │ │ -
558 Impl::eigenValuesVectorsLapackImpl<Impl::Jobs::EigenvaluesEigenvectors>(matrix, eigenValues, dummy);
│ │ │ │ -
559 }
│ │ │ │ -
560
│ │ │ │ -
569 template <int dim, typename K>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
572 FieldMatrix<K, dim, dim>& eigenVectors)
│ │ │ │ -
573 {
│ │ │ │ -
574 Impl::eigenValuesVectorsLapackImpl<Impl::Jobs::EigenvaluesEigenvectors>(matrix, eigenValues, eigenVectors);
│ │ │ │ -
575 }
│ │ │ │ -
576
│ │ │ │ -
584 template <int dim, typename K, class C>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
587 {
│ │ │ │ -
588#if HAVE_LAPACK
│ │ │ │ -
589 {
│ │ │ │ -
590 const long int N = dim ;
│ │ │ │ -
591 const char jobvl = 'n';
│ │ │ │ -
592 const char jobvr = 'n';
│ │ │ │ -
593
│ │ │ │ -
594 constexpr bool isKLapackType = std::is_same_v<K,double> || std::is_same_v<K,float>;
│ │ │ │ -
595 using LapackNumType = std::conditional_t<isKLapackType, K, double>;
│ │ │ │ -
596
│ │ │ │ -
597 // matrix to put into dgeev
│ │ │ │ -
598 LapackNumType matrixVector[dim * dim];
│ │ │ │ -
599
│ │ │ │ -
600 // copy matrix
│ │ │ │ -
601 int row = 0;
│ │ │ │ -
602 for(int i=0; i<dim; ++i)
│ │ │ │ -
603 {
│ │ │ │ -
604 for(int j=0; j<dim; ++j, ++row)
│ │ │ │ -
605 {
│ │ │ │ -
606 matrixVector[ row ] = matrix[ i ][ j ];
│ │ │ │ -
607 }
│ │ │ │ -
608 }
│ │ │ │ -
609
│ │ │ │ -
610 // working memory
│ │ │ │ -
611 LapackNumType eigenR[dim];
│ │ │ │ -
612 LapackNumType eigenI[dim];
│ │ │ │ -
613 LapackNumType work[3*dim];
│ │ │ │ -
614
│ │ │ │ -
615 // return value information
│ │ │ │ -
616 long int info = 0;
│ │ │ │ -
617 const long int lwork = 3*dim;
│ │ │ │ -
618
│ │ │ │ -
619 // call LAPACK routine (see fmatrixev_ext.cc)
│ │ │ │ -
620 eigenValuesNonsymLapackCall(&jobvl, &jobvr, &N, &matrixVector[0], &N,
│ │ │ │ -
621 &eigenR[0], &eigenI[0], nullptr, &N, nullptr, &N, &work[0],
│ │ │ │ -
622 &lwork, &info);
│ │ │ │ -
623
│ │ │ │ -
624 if( info != 0 )
│ │ │ │ -
625 {
│ │ │ │ -
626 std::cerr << "For matrix " << matrix << " eigenvalue calculation failed! " << std::endl;
│ │ │ │ -
627 DUNE_THROW(InvalidStateException,"eigenValues: Eigenvalue calculation failed!");
│ │ │ │ -
628 }
│ │ │ │ -
629 for (int i=0; i<N; ++i) {
│ │ │ │ -
630 eigenValues[i].real = eigenR[i];
│ │ │ │ -
631 eigenValues[i].imag = eigenI[i];
│ │ │ │ -
632 }
│ │ │ │ -
633 }
│ │ │ │ -
634#else
│ │ │ │ -
635 DUNE_THROW(NotImplemented,"LAPACK not found!");
│ │ │ │ -
636#endif
│ │ │ │ -
637 }
│ │ │ │ -
638 } // end namespace FMatrixHelp
│ │ │ │ -
639
│ │ │ │ -
642} // end namespace Dune
│ │ │ │ -
643#endif
│ │ │ │ -
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.
│ │ │ │ -
Implements a matrix constructed from a given type representing a field and compile-time given number ...
│ │ │ │ -
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
│ │ │ │ +
189} // end namespace Dune
│ │ │ │ +
190
│ │ │ │ +
191#endif // DUNE_PARAMETER_PARSER_HH
│ │ │ │ +
A few common exception classes.
│ │ │ │ +
A hierarchical structure of string parameters.
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
void swap(T &v1, T &v2, bool mask)
Definition: simd.hh:472
│ │ │ │
auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
Definition: debugalign.hh:425
│ │ │ │ -
static void eigenValuesNonSym(const FieldMatrix< K, dim, dim > &matrix, FieldVector< C, dim > &eigenValues)
calculates the eigenvalues of a non-symmetric field matrix
Definition: fmatrixev.hh:585
│ │ │ │ -
static void eigenValues(const FieldMatrix< K, dim, dim > &matrix, FieldVector< K, dim > &eigenValues)
calculates the eigenvalues of a symmetric field matrix
Definition: fmatrixev.hh:523
│ │ │ │ -
static void eigenValuesLapack(const FieldMatrix< K, dim, dim > &matrix, FieldVector< K, dim > &eigenValues)
calculates the eigenvalues of a symmetric field matrix
Definition: fmatrixev.hh:554
│ │ │ │ -
static void eigenValuesVectors(const FieldMatrix< K, dim, dim > &matrix, FieldVector< K, dim > &eigenValues, FieldMatrix< K, dim, dim > &eigenVectors)
calculates the eigenvalues and eigenvectors of a symmetric field matrix
Definition: fmatrixev.hh:539
│ │ │ │ -
static void eigenValuesVectorsLapack(const FieldMatrix< K, dim, dim > &matrix, FieldVector< K, dim > &eigenValues, FieldMatrix< K, dim, dim > &eigenVectors)
calculates the eigenvalues and -vectors of a symmetric field matrix
Definition: fmatrixev.hh:570
│ │ │ │ -
A dense n x m matrix.
Definition: fmatrix.hh:117
│ │ │ │ -
vector space out of a tensor product of fields.
Definition: fvector.hh:95
│ │ │ │ -
Default exception for dummy implementations.
Definition: exceptions.hh:263
│ │ │ │ -
Default exception if a function was called while the object is not in a valid state for that function...
Definition: exceptions.hh:281
│ │ │ │ -
T real_type
export the type representing the real type of the field
Definition: ftraits.hh:30
│ │ │ │ -
static const Field pi()
Archimedes' constant.
Definition: math.hh:48
│ │ │ │ +
Base class for Dune-Exceptions.
Definition: exceptions.hh:96
│ │ │ │ +
Default exception class for range errors.
Definition: exceptions.hh:254
│ │ │ │ +
Hierarchical structure of string parameters.
Definition: parametertree.hh:37
│ │ │ │ +
report parser error while reading ParameterTree
Definition: parametertreeparser.hh:22
│ │ │ │ +
exception thrown if the user wants to see help string
Definition: parametertreeparser.hh:28
│ │ │ │ +
Parsers to set up a ParameterTree from various input sources.
Definition: parametertreeparser.hh:35
│ │ │ │ +
static void readOptions(int argc, char *argv[], ParameterTree &pt)
parse command line options and build hierarchical ParameterTree structure
Definition: parametertreeparser.cc:159
│ │ │ │ +
static void readINITree(std::istream &in, ParameterTree &pt, bool overwrite)
parse C++ stream
Definition: parametertreeparser.cc:74
│ │ │ │ +
static void readNamedOptions(int argc, char *argv[], ParameterTree &pt, std::vector< std::string > keywords, unsigned int required=std::numeric_limits< unsigned int >::max(), bool allow_more=true, bool overwrite=true, std::vector< std::string > help=std::vector< std::string >())
read [named] command line options and build hierarchical ParameterTree structure
Definition: parametertreeparser.cc:175
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -utf-8 │ │ │ │ │ +us-ascii │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,715 +4,122 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -fmatrixev.hh │ │ │ │ │ +parametertreeparser.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 (C) 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_FMATRIXEIGENVALUES_HH │ │ │ │ │ - 6#define DUNE_FMATRIXEIGENVALUES_HH │ │ │ │ │ + 5#ifndef DUNE_PARAMETER_PARSER_HH │ │ │ │ │ + 6#define DUNE_PARAMETER_PARSER_HH │ │ │ │ │ 7 │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ - 16 │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14#include │ │ │ │ │ + 15 │ │ │ │ │ + 16#include │ │ │ │ │ 17#include │ │ │ │ │ - 18#include │ │ │ │ │ - 19#include │ │ │ │ │ - 20#include │ │ │ │ │ - 21 │ │ │ │ │ - 22namespace Dune { │ │ │ │ │ - 23 │ │ │ │ │ - 29 namespace FMatrixHelp { │ │ │ │ │ - 30 │ │ │ │ │ - 31#if HAVE_LAPACK │ │ │ │ │ - 32 // defined in fmatrixev.cc │ │ │ │ │ - 33 extern void eigenValuesLapackCall( │ │ │ │ │ - 34 const char* jobz, const char* uplo, const long │ │ │ │ │ - 35 int* n, double* a, const long int* lda, double* w, │ │ │ │ │ - 36 double* work, const long int* lwork, long int* info); │ │ │ │ │ - 37 │ │ │ │ │ - 38 extern void eigenValuesNonsymLapackCall( │ │ │ │ │ - 39 const char* jobvl, const char* jobvr, const long │ │ │ │ │ - 40 int* n, double* a, const long int* lda, double* wr, double* wi, double* vl, │ │ │ │ │ - 41 const long int* ldvl, double* vr, const long int* ldvr, double* work, │ │ │ │ │ - 42 const long int* lwork, long int* info); │ │ │ │ │ - 43 │ │ │ │ │ - 44 extern void eigenValuesLapackCall( │ │ │ │ │ - 45 const char* jobz, const char* uplo, const long │ │ │ │ │ - 46 int* n, float* a, const long int* lda, float* w, │ │ │ │ │ - 47 float* work, const long int* lwork, long int* info); │ │ │ │ │ - 48 │ │ │ │ │ - 49 extern void eigenValuesNonsymLapackCall( │ │ │ │ │ - 50 const char* jobvl, const char* jobvr, const long │ │ │ │ │ - 51 int* n, float* a, const long int* lda, float* wr, float* wi, float* vl, │ │ │ │ │ - 52 const long int* ldvl, float* vr, const long int* ldvr, float* work, │ │ │ │ │ - 53 const long int* lwork, long int* info); │ │ │ │ │ - 54 │ │ │ │ │ - 55#endif │ │ │ │ │ - 56 │ │ │ │ │ - 57 namespace Impl { │ │ │ │ │ - 58 //internal tag to activate/disable code for eigenvector calculation at │ │ │ │ │ -compile time │ │ │ │ │ - 59 enum Jobs { OnlyEigenvalues=0, EigenvaluesEigenvectors=1 }; │ │ │ │ │ - 60 │ │ │ │ │ - 61 //internal dummy used if only eigenvalues are to be calculated │ │ │ │ │ - 62 template │ │ │ │ │ - 63 using EVDummy = FieldMatrix; │ │ │ │ │ - 64 │ │ │ │ │ - 65 //compute the cross-product of two vectors │ │ │ │ │ - 66 template │ │ │ │ │ - 67 inline FieldVector crossProduct(const FieldVector& vec0, const │ │ │ │ │ -FieldVector& vec1) { │ │ │ │ │ - 68 return {vec0[1]*vec1[2] - vec0[2]*vec1[1], vec0[2]*vec1[0] - vec0[0]*vec1 │ │ │ │ │ -[2], vec0[0]*vec1[1] - vec0[1]*vec1[0]}; │ │ │ │ │ - 69 } │ │ │ │ │ - 70 │ │ │ │ │ - 71 template │ │ │ │ │ - 72 static void eigenValues2dImpl(const FieldMatrix& matrix, │ │ │ │ │ - 73 FieldVector& eigenvalues) │ │ │ │ │ - 74 { │ │ │ │ │ - 75 using std::sqrt; │ │ │ │ │ - 76 const K p = 0.5 * (matrix[0][0] + matrix [1][1]); │ │ │ │ │ - 77 const K p2 = p - matrix[1][1]; │ │ │ │ │ - 78 K q = p2 * p2 + matrix[1][0] * matrix[0][1]; │ │ │ │ │ - 79 if( q < 0 && q > -1e-14 ) q = 0; │ │ │ │ │ - 80 if (q < 0) │ │ │ │ │ - 81 { │ │ │ │ │ - 82 std::cout << matrix << std::endl; │ │ │ │ │ - 83 // Complex eigenvalues are either caused by non-symmetric matrices or by │ │ │ │ │ -round-off errors │ │ │ │ │ - 84 DUNE_THROW(MathError, "Complex eigenvalue detected (which this │ │ │ │ │ -implementation cannot handle)."); │ │ │ │ │ - 85 } │ │ │ │ │ - 86 │ │ │ │ │ - 87 // get square root │ │ │ │ │ - 88 q = sqrt(q); │ │ │ │ │ - 89 │ │ │ │ │ - 90 // store eigenvalues in ascending order │ │ │ │ │ - 91 eigenvalues[0] = p - q; │ │ │ │ │ - 92 eigenvalues[1] = p + q; │ │ │ │ │ - 93 } │ │ │ │ │ - 94 │ │ │ │ │ - 95 /* │ │ │ │ │ - 96 This implementation was adapted from the pseudo-code (Python?) │ │ │ │ │ -implementation found on │ │ │ │ │ - 97 http://en.wikipedia.org/wiki/Eigenvalue_algorithm (retrieved late August │ │ │ │ │ -2014). │ │ │ │ │ - 98 Wikipedia claims to have taken it from │ │ │ │ │ - 99 Smith, Oliver K. (April 1961), Eigenvalues of a symmetric 3 × 3 matrix., │ │ │ │ │ - 100 Communications of the ACM 4 (4): 168, doi:10.1145/355578.366316 │ │ │ │ │ - 101 */ │ │ │ │ │ - 102 template │ │ │ │ │ - 103 static K eigenValues3dImpl(const FieldMatrix& matrix, │ │ │ │ │ - 104 FieldVector& eigenvalues) │ │ │ │ │ - 105 { │ │ │ │ │ - 106 using std::sqrt; │ │ │ │ │ - 107 using std::acos; │ │ │ │ │ - 108 using real_type = typename FieldTraits::real_type; │ │ │ │ │ - 109 const K pi = MathematicalConstants::pi(); │ │ │ │ │ - 110 K p1 = matrix[0][1]*matrix[0][1] + matrix[0][2]*matrix[0][2] + matrix[1] │ │ │ │ │ -[2]*matrix[1][2]; │ │ │ │ │ - 111 │ │ │ │ │ - 112 if (p1 <= std::numeric_limits::epsilon()) { │ │ │ │ │ - 113 // A is diagonal. │ │ │ │ │ - 114 eigenvalues[0] = matrix[0][0]; │ │ │ │ │ - 115 eigenvalues[1] = matrix[1][1]; │ │ │ │ │ - 116 eigenvalues[2] = matrix[2][2]; │ │ │ │ │ - 117 std::sort(eigenvalues.begin(), eigenvalues.end()); │ │ │ │ │ - 118 │ │ │ │ │ - 119 return 0.0; │ │ │ │ │ - 120 } │ │ │ │ │ - 121 else │ │ │ │ │ - 122 { │ │ │ │ │ - 123 // q = trace(A)/3 │ │ │ │ │ - 124 K q = 0; │ │ │ │ │ - 125 for (int i=0; i<3; i++) │ │ │ │ │ - 126 q += matrix[i][i] / 3.0; │ │ │ │ │ - 127 │ │ │ │ │ - 128 K p2 = (matrix[0][0] - q)*(matrix[0][0] - q) + (matrix[1][1] - q)*(matrix │ │ │ │ │ -[1][1] - q) + (matrix[2][2] - q)*(matrix[2][2] - q) + 2.0 * p1; │ │ │ │ │ - 129 K p = sqrt(p2 / 6); │ │ │ │ │ - 130 // B = (1 / p) * (A - q * I); // I is the identity matrix │ │ │ │ │ - 131 FieldMatrix B; │ │ │ │ │ - 132 for (int i=0; i<3; i++) │ │ │ │ │ - 133 for (int j=0; j<3; j++) │ │ │ │ │ - 134 B[i][j] = (real_type(1.0)/p) * (matrix[i][j] - q*(i==j)); │ │ │ │ │ - 135 │ │ │ │ │ - 136 K r = B.determinant() / 2.0; │ │ │ │ │ - 137 │ │ │ │ │ - 138 /*In exact arithmetic for a symmetric matrix -1 <= r <= 1 │ │ │ │ │ - 139 but computation error can leave it slightly outside this range. │ │ │ │ │ - 140 acos(z) function requires |z| <= 1, but will fail silently │ │ │ │ │ - 141 and return NaN if the input is larger than 1 in magnitude. │ │ │ │ │ - 142 Thus r is clamped to [-1,1].*/ │ │ │ │ │ - 143 using std::clamp; │ │ │ │ │ - 144 r = clamp(r, -1.0, 1.0); │ │ │ │ │ - 145 K phi = acos(r) / 3.0; │ │ │ │ │ + 18 │ │ │ │ │ + 19namespace Dune { │ │ │ │ │ + 20 │ │ │ │ │ +22 class ParameterTreeParserError : public RangeError {}; │ │ │ │ │ +28 class HelpRequest : public Exception {}; │ │ │ │ │ + 29 │ │ │ │ │ +34 class ParameterTreeParser │ │ │ │ │ + 35 { │ │ │ │ │ + 36 │ │ │ │ │ + 37 static std::string ltrim(const std::string& s); │ │ │ │ │ + 38 static std::string rtrim(const std::string& s); │ │ │ │ │ + 39 │ │ │ │ │ + 40 public: │ │ │ │ │ + 41 │ │ │ │ │ + 85 │ │ │ │ │ + 96 static void readINITree(std::istream& in, ParameterTree& pt, │ │ │ │ │ + 97 bool overwrite); │ │ │ │ │ + 98 │ │ │ │ │ + 105 static Dune::ParameterTree readINITree(std::istream& in); │ │ │ │ │ + 106 │ │ │ │ │ + 107 │ │ │ │ │ + 120 static void readINITree(std::istream& in, ParameterTree& pt, │ │ │ │ │ + 121 const std::string srcname = "stream", │ │ │ │ │ + 122 bool overwrite = true); │ │ │ │ │ + 123 │ │ │ │ │ + 124 │ │ │ │ │ + 135 static void readINITree(std::string file, ParameterTree& pt, bool │ │ │ │ │ +overwrite = true); │ │ │ │ │ + 136 │ │ │ │ │ + 143 static Dune::ParameterTree readINITree(const std::string& file); │ │ │ │ │ + 144 │ │ │ │ │ 146 │ │ │ │ │ - 147 // the eigenvalues satisfy eig[2] <= eig[1] <= eig[0] │ │ │ │ │ - 148 eigenvalues[2] = q + 2 * p * cos(phi); │ │ │ │ │ - 149 eigenvalues[0] = q + 2 * p * cos(phi + (2*pi/3)); │ │ │ │ │ - 150 eigenvalues[1] = 3 * q - eigenvalues[0] - eigenvalues[2]; // since trace │ │ │ │ │ -(matrix) = eig1 + eig2 + eig3 │ │ │ │ │ - 151 │ │ │ │ │ - 152 return r; │ │ │ │ │ - 153 } │ │ │ │ │ - 154 } │ │ │ │ │ - 155 │ │ │ │ │ - 156 //see https://www.geometrictools.com/Documentation/ │ │ │ │ │ -RobustEigenSymmetric3x3.pdf │ │ │ │ │ - 157 //Robustly compute a right-handed orthonormal set {u, v, evec0}. │ │ │ │ │ - 158 template │ │ │ │ │ - 159 void orthoComp(const FieldVector& evec0, FieldVector& u, │ │ │ │ │ -FieldVector& v) { │ │ │ │ │ - 160 using std::abs; │ │ │ │ │ - 161 if(abs(evec0[0]) > abs(evec0[1])) { │ │ │ │ │ - 162 //The component of maximum absolute value is either evec0[0] or evec0[2]. │ │ │ │ │ - 163 FieldVector temp = {evec0[0], evec0[2]}; │ │ │ │ │ - 164 auto L = 1.0 / temp.two_norm(); │ │ │ │ │ - 165 u = L * FieldVector({-evec0[2], 0.0, evec0[0]}); │ │ │ │ │ - 166 } │ │ │ │ │ - 167 else { │ │ │ │ │ - 168 //The component of maximum absolute value is either evec0[1] or evec0[2]. │ │ │ │ │ - 169 FieldVector temp = {evec0[1], evec0[2]}; │ │ │ │ │ - 170 auto L = 1.0 / temp.two_norm(); │ │ │ │ │ - 171 u = L * FieldVector({0.0, evec0[2], -evec0[1]}); │ │ │ │ │ - 172 } │ │ │ │ │ - 173 v = crossProduct(evec0, u); │ │ │ │ │ - 174 } │ │ │ │ │ - 175 │ │ │ │ │ - 176 //see https://www.geometrictools.com/Documentation/ │ │ │ │ │ -RobustEigenSymmetric3x3.pdf │ │ │ │ │ - 177 template │ │ │ │ │ - 178 void eig0(const FieldMatrix& matrix, K eval0, FieldVector& │ │ │ │ │ -evec0) { │ │ │ │ │ - 179 /* Compute a unit-length eigenvector for eigenvalue[i0]. The │ │ │ │ │ - 180 matrix is rank 2, so two of the rows are linearly independent. │ │ │ │ │ - 181 For a robust computation of the eigenvector, select the two │ │ │ │ │ - 182 rows whose cross product has largest length of all pairs of │ │ │ │ │ - 183 rows. */ │ │ │ │ │ - 184 using Vector = FieldVector; │ │ │ │ │ - 185 Vector row0 = {matrix[0][0]-eval0, matrix[0][1], matrix[0][2]}; │ │ │ │ │ - 186 Vector row1 = {matrix[1][0], matrix[1][1]-eval0, matrix[1][2]}; │ │ │ │ │ - 187 Vector row2 = {matrix[2][0], matrix[2][1], matrix[2][2]-eval0}; │ │ │ │ │ + 158 static void readOptions(int argc, char* argv [], ParameterTree& pt); │ │ │ │ │ + 159 │ │ │ │ │ + 177 static void readNamedOptions(int argc, char* argv[], │ │ │ │ │ + 178 ParameterTree& pt, │ │ │ │ │ + 179 std::vector keywords, │ │ │ │ │ + 180 unsigned int required = std::numeric_limits::max(), │ │ │ │ │ + 181 bool allow_more = true, │ │ │ │ │ + 182 bool overwrite = true, │ │ │ │ │ + 183 std::vector help = std::vector()); │ │ │ │ │ + 184 │ │ │ │ │ + 185 private: │ │ │ │ │ + 186 static std::string generateHelpString(std::string progname, std:: │ │ │ │ │ +vector keywords, unsigned int required, std::vector │ │ │ │ │ +help); │ │ │ │ │ + 187 }; │ │ │ │ │ 188 │ │ │ │ │ - 189 Vector r0xr1 = crossProduct(row0, row1); │ │ │ │ │ - 190 Vector r0xr2 = crossProduct(row0, row2); │ │ │ │ │ - 191 Vector r1xr2 = crossProduct(row1, row2); │ │ │ │ │ - 192 auto d0 = r0xr1.two_norm(); │ │ │ │ │ - 193 auto d1 = r0xr2.two_norm(); │ │ │ │ │ - 194 auto d2 = r1xr2.two_norm(); │ │ │ │ │ - 195 │ │ │ │ │ - 196 auto dmax = d0 ; │ │ │ │ │ - 197 int imax = 0; │ │ │ │ │ - 198 if(d1>dmax) { │ │ │ │ │ - 199 dmax = d1; │ │ │ │ │ - 200 imax = 1; │ │ │ │ │ - 201 } │ │ │ │ │ - 202 if(d2>dmax) │ │ │ │ │ - 203 imax = 2; │ │ │ │ │ - 204 │ │ │ │ │ - 205 if(imax == 0) │ │ │ │ │ - 206 evec0 = r0xr1 / d0; │ │ │ │ │ - 207 else if(imax == 1) │ │ │ │ │ - 208 evec0 = r0xr2 / d1; │ │ │ │ │ - 209 else │ │ │ │ │ - 210 evec0 = r1xr2 / d2; │ │ │ │ │ - 211 } │ │ │ │ │ - 212 │ │ │ │ │ - 213 //see https://www.geometrictools.com/Documentation/ │ │ │ │ │ -RobustEigenSymmetric3x3.pdf │ │ │ │ │ - 214 template │ │ │ │ │ - 215 void eig1(const FieldMatrix& matrix, const FieldVector& evec0, │ │ │ │ │ -FieldVector& evec1, K eval1) { │ │ │ │ │ - 216 using Vector = FieldVector; │ │ │ │ │ - 217 │ │ │ │ │ - 218 //Robustly compute a right-handed orthonormal set {u, v, evec0}. │ │ │ │ │ - 219 Vector u,v; │ │ │ │ │ - 220 orthoComp(evec0, u, v); │ │ │ │ │ - 221 │ │ │ │ │ - 222 /* Let e be eval1 and let E be a corresponding eigenvector which │ │ │ │ │ - 223 is a solution to the linear system (A - e*I)*E = 0. The matrix │ │ │ │ │ - 224 (A - e*I) is 3x3, not invertible (so infinitely many │ │ │ │ │ - 225 solutions), and has rank 2 when eval1 and eval are different. │ │ │ │ │ - 226 It has rank 1 when eval1 and eval2 are equal. Numerically, it │ │ │ │ │ - 227 is difficult to compute robustly the rank of a matrix. Instead, │ │ │ │ │ - 228 the 3x3 linear system is reduced to a 2x2 system as follows. │ │ │ │ │ - 229 Define the 3x2 matrix J = [u,v] whose columns are the u and v │ │ │ │ │ - 230 computed previously. Define the 2x1 vector X = J*E. The 2x2 │ │ │ │ │ - 231 system is 0 = M * X = (J^T * (A - e*I) * J) * X where J^T is │ │ │ │ │ - 232 the transpose of J and M = J^T * (A - e*I) * J is a 2x2 matrix. │ │ │ │ │ - 233 The system may be written as │ │ │ │ │ - 234 +- -++- -+ +- -+ │ │ │ │ │ - 235 | U^T*A*U - e U^T*A*V || x0 | = e * | x0 | │ │ │ │ │ - 236 | V^T*A*U V^T*A*V - e || x1 | | x1 | │ │ │ │ │ - 237 +- -++ -+ +- -+ │ │ │ │ │ - 238 where X has row entries x0 and x1. */ │ │ │ │ │ - 239 │ │ │ │ │ - 240 Vector Au, Av; │ │ │ │ │ - 241 matrix.mv(u, Au); │ │ │ │ │ - 242 matrix.mv(v, Av); │ │ │ │ │ - 243 │ │ │ │ │ - 244 auto m00 = u.dot(Au) - eval1; │ │ │ │ │ - 245 auto m01 = u.dot(Av); │ │ │ │ │ - 246 auto m11 = v.dot(Av) - eval1; │ │ │ │ │ - 247 │ │ │ │ │ - 248 /* For robustness, choose the largest-length row of M to compute │ │ │ │ │ - 249 the eigenvector. The 2-tuple of coefficients of U and V in the │ │ │ │ │ - 250 assignments to eigenvector[1] lies on a circle, and U and V are │ │ │ │ │ - 251 unit length and perpendicular, so eigenvector[1] is unit length │ │ │ │ │ - 252 (within numerical tolerance). */ │ │ │ │ │ - 253 using std::abs, std::sqrt, std::max; │ │ │ │ │ - 254 auto absM00 = abs(m00); │ │ │ │ │ - 255 auto absM01 = abs(m01); │ │ │ │ │ - 256 auto absM11 = abs(m11); │ │ │ │ │ - 257 if(absM00 >= absM11) { │ │ │ │ │ - 258 auto maxAbsComp = max(absM00, absM01); │ │ │ │ │ - 259 if(maxAbsComp > 0.0) { │ │ │ │ │ - 260 if(absM00 >= absM01) { │ │ │ │ │ - 261 m01 /= m00; │ │ │ │ │ - 262 m00 = 1.0 / sqrt(1.0 + m01*m01); │ │ │ │ │ - 263 m01 *= m00; │ │ │ │ │ - 264 } │ │ │ │ │ - 265 else { │ │ │ │ │ - 266 m00 /= m01; │ │ │ │ │ - 267 m01 = 1.0 / sqrt(1.0 + m00*m00); │ │ │ │ │ - 268 m00 *= m01; │ │ │ │ │ - 269 } │ │ │ │ │ - 270 evec1 = m01*u - m00*v; │ │ │ │ │ - 271 } │ │ │ │ │ - 272 else │ │ │ │ │ - 273 evec1 = u; │ │ │ │ │ - 274 } │ │ │ │ │ - 275 else { │ │ │ │ │ - 276 auto maxAbsComp = max(absM11, absM01); │ │ │ │ │ - 277 if(maxAbsComp > 0.0) { │ │ │ │ │ - 278 if(absM11 >= absM01) { │ │ │ │ │ - 279 m01 /= m11; │ │ │ │ │ - 280 m11 = 1.0 / sqrt(1.0 + m01*m01); │ │ │ │ │ - 281 m01 *= m11; │ │ │ │ │ - 282 } │ │ │ │ │ - 283 else { │ │ │ │ │ - 284 m11 /= m01; │ │ │ │ │ - 285 m01 = 1.0 / sqrt(1.0 + m11*m11); │ │ │ │ │ - 286 m11 *= m01; │ │ │ │ │ - 287 } │ │ │ │ │ - 288 evec1 = m11*u - m01*v; │ │ │ │ │ - 289 } │ │ │ │ │ - 290 else │ │ │ │ │ - 291 evec1 = u; │ │ │ │ │ - 292 } │ │ │ │ │ - 293 } │ │ │ │ │ - 294 │ │ │ │ │ - 295 // 1d specialization │ │ │ │ │ - 296 template │ │ │ │ │ - 297 static void eigenValuesVectorsImpl(const FieldMatrix& matrix, │ │ │ │ │ - 298 FieldVector& eigenValues, │ │ │ │ │ - 299 FieldMatrix& eigenVectors) │ │ │ │ │ - 300 { │ │ │ │ │ - 301 eigenValues[0] = matrix[0][0]; │ │ │ │ │ - 302 if constexpr(Tag==EigenvaluesEigenvectors) │ │ │ │ │ - 303 eigenVectors[0] = {1.0}; │ │ │ │ │ - 304 } │ │ │ │ │ - 305 │ │ │ │ │ - 306 │ │ │ │ │ - 307 // 2d specialization │ │ │ │ │ - 308 template │ │ │ │ │ - 309 static void eigenValuesVectorsImpl(const FieldMatrix& matrix, │ │ │ │ │ - 310 FieldVector& eigenValues, │ │ │ │ │ - 311 FieldMatrix& eigenVectors) │ │ │ │ │ - 312 { │ │ │ │ │ - 313 // Compute eigen values │ │ │ │ │ - 314 Impl::eigenValues2dImpl(matrix, eigenValues); │ │ │ │ │ - 315 │ │ │ │ │ - 316 // Compute eigenvectors by exploiting the Cayley–Hamilton theorem. │ │ │ │ │ - 317 // If λ_1, λ_2 are the eigenvalues, then (A - λ_1I )(A - λ_2I ) = (A - │ │ │ │ │ -λ_2I )(A - λ_1I ) = 0, │ │ │ │ │ - 318 // so the columns of (A - λ_2I ) are annihilated by (A - λ_1I ) and vice │ │ │ │ │ -versa. │ │ │ │ │ - 319 // Assuming neither matrix is zero, the columns of each must include │ │ │ │ │ -eigenvectors │ │ │ │ │ - 320 // for the other eigenvalue. (If either matrix is zero, then A is a │ │ │ │ │ -multiple of the │ │ │ │ │ - 321 // identity and any non-zero vector is an eigenvector.) │ │ │ │ │ - 322 // From: https://en.wikipedia.org/wiki/Eigenvalue_algorithm#2x2_matrices │ │ │ │ │ - 323 if constexpr(Tag==EigenvaluesEigenvectors) { │ │ │ │ │ - 324 │ │ │ │ │ - 325 // Special casing for multiples of the identity │ │ │ │ │ - 326 FieldMatrix temp = matrix; │ │ │ │ │ - 327 temp[0][0] -= eigenValues[0]; │ │ │ │ │ - 328 temp[1][1] -= eigenValues[0]; │ │ │ │ │ - 329 if(temp.infinity_norm() <= 1e-14) { │ │ │ │ │ - 330 eigenVectors[0] = {1.0, 0.0}; │ │ │ │ │ - 331 eigenVectors[1] = {0.0, 1.0}; │ │ │ │ │ - 332 } │ │ │ │ │ - 333 else { │ │ │ │ │ - 334 // The columns of A - λ_2I are eigenvectors for λ_1, or zero. │ │ │ │ │ - 335 // Take the column with the larger norm to avoid zero columns. │ │ │ │ │ - 336 FieldVector ev0 = {matrix[0][0]-eigenValues[1], matrix[1][0]}; │ │ │ │ │ - 337 FieldVector ev1 = {matrix[0][1], matrix[1][1]-eigenValues[1]}; │ │ │ │ │ - 338 eigenVectors[0] = (ev0.two_norm2() >= ev1.two_norm2()) ? ev0/ev0.two_norm │ │ │ │ │ -() : ev1/ev1.two_norm(); │ │ │ │ │ - 339 │ │ │ │ │ - 340 // The columns of A - λ_1I are eigenvectors for λ_2, or zero. │ │ │ │ │ - 341 // Take the column with the larger norm to avoid zero columns. │ │ │ │ │ - 342 ev0 = {matrix[0][0]-eigenValues[0], matrix[1][0]}; │ │ │ │ │ - 343 ev1 = {matrix[0][1], matrix[1][1]-eigenValues[0]}; │ │ │ │ │ - 344 eigenVectors[1] = (ev0.two_norm2() >= ev1.two_norm2()) ? ev0/ev0.two_norm │ │ │ │ │ -() : ev1/ev1.two_norm(); │ │ │ │ │ - 345 } │ │ │ │ │ - 346 } │ │ │ │ │ - 347 } │ │ │ │ │ - 348 │ │ │ │ │ - 349 // 3d specialization │ │ │ │ │ - 350 template │ │ │ │ │ - 351 static void eigenValuesVectorsImpl(const FieldMatrix& matrix, │ │ │ │ │ - 352 FieldVector& eigenValues, │ │ │ │ │ - 353 FieldMatrix& eigenVectors) │ │ │ │ │ - 354 { │ │ │ │ │ - 355 using Vector = FieldVector; │ │ │ │ │ - 356 using Matrix = FieldMatrix; │ │ │ │ │ - 357 │ │ │ │ │ - 358 //compute eigenvalues │ │ │ │ │ - 359 /* Precondition the matrix by factoring out the maximum absolute │ │ │ │ │ - 360 value of the components. This guards against floating-point │ │ │ │ │ - 361 overflow when computing the eigenvalues.*/ │ │ │ │ │ - 362 using std::isnormal; │ │ │ │ │ - 363 K maxAbsElement = (isnormal(matrix.infinity_norm())) ? │ │ │ │ │ -matrix.infinity_norm() : K(1.0); │ │ │ │ │ - 364 Matrix scaledMatrix = matrix / maxAbsElement; │ │ │ │ │ - 365 K r = Impl::eigenValues3dImpl(scaledMatrix, eigenValues); │ │ │ │ │ - 366 │ │ │ │ │ - 367 if constexpr(Tag==EigenvaluesEigenvectors) { │ │ │ │ │ - 368 K offDiagNorm = Vector{scaledMatrix[0][1],scaledMatrix[0][2],scaledMatrix │ │ │ │ │ -[1][2]}.two_norm2(); │ │ │ │ │ - 369 if (offDiagNorm <= std::numeric_limits::epsilon()) │ │ │ │ │ - 370 { │ │ │ │ │ - 371 eigenValues = {scaledMatrix[0][0], scaledMatrix[1][1], scaledMatrix[2] │ │ │ │ │ -[2]}; │ │ │ │ │ - 372 eigenVectors = {{1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0}}; │ │ │ │ │ - 373 │ │ │ │ │ - 374 // Use bubble sort to jointly sort eigenvalues and eigenvectors │ │ │ │ │ - 375 // such that eigenvalues are ascending │ │ │ │ │ - 376 if (eigenValues[0] > eigenValues[1]) │ │ │ │ │ - 377 { │ │ │ │ │ - 378 std::swap(eigenValues[0], eigenValues[1]); │ │ │ │ │ - 379 std::swap(eigenVectors[0], eigenVectors[1]); │ │ │ │ │ - 380 } │ │ │ │ │ - 381 if (eigenValues[1] > eigenValues[2]) │ │ │ │ │ - 382 { │ │ │ │ │ - 383 std::swap(eigenValues[1], eigenValues[2]); │ │ │ │ │ - 384 std::swap(eigenVectors[1], eigenVectors[2]); │ │ │ │ │ - 385 } │ │ │ │ │ - 386 if (eigenValues[0] > eigenValues[1]) │ │ │ │ │ - 387 { │ │ │ │ │ - 388 std::swap(eigenValues[0], eigenValues[1]); │ │ │ │ │ - 389 std::swap(eigenVectors[0], eigenVectors[1]); │ │ │ │ │ - 390 } │ │ │ │ │ - 391 } │ │ │ │ │ - 392 else { │ │ │ │ │ - 393 /*Compute the eigenvectors so that the set │ │ │ │ │ - 394 [evec[0], evec[1], evec[2]] is right handed and │ │ │ │ │ - 395 orthonormal. */ │ │ │ │ │ - 396 │ │ │ │ │ - 397 Matrix evec(0.0); │ │ │ │ │ - 398 Vector eval(eigenValues); │ │ │ │ │ - 399 if(r >= 0) { │ │ │ │ │ - 400 Impl::eig0(scaledMatrix, eval[2], evec[2]); │ │ │ │ │ - 401 Impl::eig1(scaledMatrix, evec[2], evec[1], eval[1]); │ │ │ │ │ - 402 evec[0] = Impl::crossProduct(evec[1], evec[2]); │ │ │ │ │ - 403 } │ │ │ │ │ - 404 else { │ │ │ │ │ - 405 Impl::eig0(scaledMatrix, eval[0], evec[0]); │ │ │ │ │ - 406 Impl::eig1(scaledMatrix, evec[0], evec[1], eval[1]); │ │ │ │ │ - 407 evec[2] = Impl::crossProduct(evec[0], evec[1]); │ │ │ │ │ - 408 } │ │ │ │ │ - 409 //sort eval/evec-pairs in ascending order │ │ │ │ │ - 410 using EVPair = std::pair; │ │ │ │ │ - 411 std::vector pairs; │ │ │ │ │ - 412 for(std::size_t i=0; i<=2; ++i) │ │ │ │ │ - 413 pairs.push_back(EVPair(eval[i], evec[i])); │ │ │ │ │ - 414 auto comp = [](EVPair x, EVPair y){ return x.first < y.first; }; │ │ │ │ │ - 415 std::sort(pairs.begin(), pairs.end(), comp); │ │ │ │ │ - 416 for(std::size_t i=0; i<=2; ++i){ │ │ │ │ │ - 417 eigenValues[i] = pairs[i].first; │ │ │ │ │ - 418 eigenVectors[i] = pairs[i].second; │ │ │ │ │ - 419 } │ │ │ │ │ - 420 } │ │ │ │ │ - 421 } │ │ │ │ │ - 422 //The preconditioning scaled the matrix, which scales the eigenvalues. │ │ │ │ │ -Revert the scaling. │ │ │ │ │ - 423 eigenValues *= maxAbsElement; │ │ │ │ │ - 424 } │ │ │ │ │ - 425 │ │ │ │ │ - 426 // forwarding to LAPACK with corresponding tag │ │ │ │ │ - 427 template │ │ │ │ │ - 428 static void eigenValuesVectorsLapackImpl(const FieldMatrix& │ │ │ │ │ -matrix, │ │ │ │ │ - 429 FieldVector& eigenValues, │ │ │ │ │ - 430 FieldMatrix& eigenVectors) │ │ │ │ │ - 431 { │ │ │ │ │ - 432 { │ │ │ │ │ - 433#if HAVE_LAPACK │ │ │ │ │ - 434 /*Lapack uses a proprietary tag to determine whether both eigenvalues and │ │ │ │ │ - 435 -vectors ('v') or only eigenvalues ('n') should be calculated */ │ │ │ │ │ - 436 const char jobz = "nv"[Tag]; │ │ │ │ │ - 437 │ │ │ │ │ - 438 const long int N = dim ; │ │ │ │ │ - 439 const char uplo = 'u'; // use upper triangular matrix │ │ │ │ │ - 440 │ │ │ │ │ - 441 // length of matrix vector, LWORK >= max(1,3*N-1) │ │ │ │ │ - 442 const long int lwork = 3*N -1 ; │ │ │ │ │ - 443 │ │ │ │ │ - 444 constexpr bool isKLapackType = std::is_same_v || std:: │ │ │ │ │ -is_same_v; │ │ │ │ │ - 445 using LapackNumType = std::conditional_t; │ │ │ │ │ - 446 │ │ │ │ │ - 447 // matrix to put into dsyev │ │ │ │ │ - 448 LapackNumType matrixVector[dim * dim]; │ │ │ │ │ - 449 │ │ │ │ │ - 450 // copy matrix │ │ │ │ │ - 451 int row = 0; │ │ │ │ │ - 452 for(int i=0; i │ │ │ │ │ - 507 static void eigenValuesVectorsImpl(const FieldMatrix& matrix, │ │ │ │ │ - 508 FieldVector& eigenValues, │ │ │ │ │ - 509 FieldMatrix& eigenVectors) │ │ │ │ │ - 510 { │ │ │ │ │ - 511 eigenValuesVectorsLapackImpl(matrix,eigenValues,eigenVectors); │ │ │ │ │ - 512 } │ │ │ │ │ - 513 } //namespace Impl │ │ │ │ │ - 514 │ │ │ │ │ - 522 template │ │ │ │ │ -523 static void eigenValues(const FieldMatrix& matrix, │ │ │ │ │ - 524 FieldVector& eigenValues) │ │ │ │ │ - 525 { │ │ │ │ │ - 526 Impl::EVDummy dummy; │ │ │ │ │ - 527 Impl::eigenValuesVectorsImpl(matrix, │ │ │ │ │ -eigenValues, dummy); │ │ │ │ │ - 528 } │ │ │ │ │ - 529 │ │ │ │ │ - 538 template │ │ │ │ │ -539 static void eigenValuesVectors(const FieldMatrix& matrix, │ │ │ │ │ - 540 FieldVector& eigenValues, │ │ │ │ │ - 541 FieldMatrix& eigenVectors) │ │ │ │ │ - 542 { │ │ │ │ │ - 543 Impl::eigenValuesVectorsImpl(matrix, │ │ │ │ │ -eigenValues, eigenVectors); │ │ │ │ │ - 544 } │ │ │ │ │ - 545 │ │ │ │ │ - 553 template │ │ │ │ │ -554 static void eigenValuesLapack(const FieldMatrix& matrix, │ │ │ │ │ - 555 FieldVector& eigenValues) │ │ │ │ │ - 556 { │ │ │ │ │ - 557 Impl::EVDummy dummy; │ │ │ │ │ - 558 Impl::eigenValuesVectorsLapackImpl │ │ │ │ │ -(matrix, eigenValues, dummy); │ │ │ │ │ - 559 } │ │ │ │ │ - 560 │ │ │ │ │ - 569 template │ │ │ │ │ -570 static void eigenValuesVectorsLapack(const FieldMatrix& │ │ │ │ │ -matrix, │ │ │ │ │ - 571 FieldVector& eigenValues, │ │ │ │ │ - 572 FieldMatrix& eigenVectors) │ │ │ │ │ - 573 { │ │ │ │ │ - 574 Impl::eigenValuesVectorsLapackImpl │ │ │ │ │ -(matrix, eigenValues, eigenVectors); │ │ │ │ │ - 575 } │ │ │ │ │ - 576 │ │ │ │ │ - 584 template │ │ │ │ │ -585 static void eigenValuesNonSym(const FieldMatrix& matrix, │ │ │ │ │ - 586 FieldVector& eigenValues) │ │ │ │ │ - 587 { │ │ │ │ │ - 588#if HAVE_LAPACK │ │ │ │ │ - 589 { │ │ │ │ │ - 590 const long int N = dim ; │ │ │ │ │ - 591 const char jobvl = 'n'; │ │ │ │ │ - 592 const char jobvr = 'n'; │ │ │ │ │ - 593 │ │ │ │ │ - 594 constexpr bool isKLapackType = std::is_same_v || std:: │ │ │ │ │ -is_same_v; │ │ │ │ │ - 595 using LapackNumType = std::conditional_t; │ │ │ │ │ - 596 │ │ │ │ │ - 597 // matrix to put into dgeev │ │ │ │ │ - 598 LapackNumType matrixVector[dim * dim]; │ │ │ │ │ - 599 │ │ │ │ │ - 600 // copy matrix │ │ │ │ │ - 601 int row = 0; │ │ │ │ │ - 602 for(int i=0; i &a, const AlignedNumber< T, align > │ │ │ │ │ &b) │ │ │ │ │ Definition: debugalign.hh:425 │ │ │ │ │ -Dune::FMatrixHelp::eigenValuesNonSym │ │ │ │ │ -static void eigenValuesNonSym(const FieldMatrix< K, dim, dim > &matrix, │ │ │ │ │ -FieldVector< C, dim > &eigenValues) │ │ │ │ │ -calculates the eigenvalues of a non-symmetric field matrix │ │ │ │ │ -Definition: fmatrixev.hh:585 │ │ │ │ │ -Dune::FMatrixHelp::eigenValues │ │ │ │ │ -static void eigenValues(const FieldMatrix< K, dim, dim > &matrix, FieldVector< │ │ │ │ │ -K, dim > &eigenValues) │ │ │ │ │ -calculates the eigenvalues of a symmetric field matrix │ │ │ │ │ -Definition: fmatrixev.hh:523 │ │ │ │ │ -Dune::FMatrixHelp::eigenValuesLapack │ │ │ │ │ -static void eigenValuesLapack(const FieldMatrix< K, dim, dim > &matrix, │ │ │ │ │ -FieldVector< K, dim > &eigenValues) │ │ │ │ │ -calculates the eigenvalues of a symmetric field matrix │ │ │ │ │ -Definition: fmatrixev.hh:554 │ │ │ │ │ -Dune::FMatrixHelp::eigenValuesVectors │ │ │ │ │ -static void eigenValuesVectors(const FieldMatrix< K, dim, dim > &matrix, │ │ │ │ │ -FieldVector< K, dim > &eigenValues, FieldMatrix< K, dim, dim > &eigenVectors) │ │ │ │ │ -calculates the eigenvalues and eigenvectors of a symmetric field matrix │ │ │ │ │ -Definition: fmatrixev.hh:539 │ │ │ │ │ -Dune::FMatrixHelp::eigenValuesVectorsLapack │ │ │ │ │ -static void eigenValuesVectorsLapack(const FieldMatrix< K, dim, dim > &matrix, │ │ │ │ │ -FieldVector< K, dim > &eigenValues, FieldMatrix< K, dim, dim > &eigenVectors) │ │ │ │ │ -calculates the eigenvalues and -vectors of a symmetric field matrix │ │ │ │ │ -Definition: fmatrixev.hh:570 │ │ │ │ │ -Dune::FieldMatrix │ │ │ │ │ -A dense n x m matrix. │ │ │ │ │ -Definition: fmatrix.hh:117 │ │ │ │ │ -Dune::FieldVector │ │ │ │ │ -vector space out of a tensor product of fields. │ │ │ │ │ -Definition: fvector.hh:95 │ │ │ │ │ -Dune::NotImplemented │ │ │ │ │ -Default exception for dummy implementations. │ │ │ │ │ -Definition: exceptions.hh:263 │ │ │ │ │ -Dune::InvalidStateException │ │ │ │ │ -Default exception if a function was called while the object is not in a valid │ │ │ │ │ -state for that function... │ │ │ │ │ -Definition: exceptions.hh:281 │ │ │ │ │ -Dune::FieldTraits::real_type │ │ │ │ │ -T real_type │ │ │ │ │ -export the type representing the real type of the field │ │ │ │ │ -Definition: ftraits.hh:30 │ │ │ │ │ -Dune::StandardMathematicalConstants<_Field_>::pi │ │ │ │ │ -static const Field pi() │ │ │ │ │ -Archimedes' constant. │ │ │ │ │ -Definition: math.hh:48 │ │ │ │ │ +Dune::Exception │ │ │ │ │ +Base class for Dune-Exceptions. │ │ │ │ │ +Definition: exceptions.hh:96 │ │ │ │ │ +Dune::RangeError │ │ │ │ │ +Default exception class for range errors. │ │ │ │ │ +Definition: exceptions.hh:254 │ │ │ │ │ +Dune::ParameterTree │ │ │ │ │ +Hierarchical structure of string parameters. │ │ │ │ │ +Definition: parametertree.hh:37 │ │ │ │ │ +Dune::ParameterTreeParserError │ │ │ │ │ +report parser error while reading ParameterTree │ │ │ │ │ +Definition: parametertreeparser.hh:22 │ │ │ │ │ +Dune::HelpRequest │ │ │ │ │ +exception thrown if the user wants to see help string │ │ │ │ │ +Definition: parametertreeparser.hh:28 │ │ │ │ │ +Dune::ParameterTreeParser │ │ │ │ │ +Parsers to set up a ParameterTree from various input sources. │ │ │ │ │ +Definition: parametertreeparser.hh:35 │ │ │ │ │ +Dune::ParameterTreeParser::readOptions │ │ │ │ │ +static void readOptions(int argc, char *argv[], ParameterTree &pt) │ │ │ │ │ +parse command line options and build hierarchical ParameterTree structure │ │ │ │ │ +Definition: parametertreeparser.cc:159 │ │ │ │ │ +Dune::ParameterTreeParser::readINITree │ │ │ │ │ +static void readINITree(std::istream &in, ParameterTree &pt, bool overwrite) │ │ │ │ │ +parse C++ stream │ │ │ │ │ +Definition: parametertreeparser.cc:74 │ │ │ │ │ +Dune::ParameterTreeParser::readNamedOptions │ │ │ │ │ +static void readNamedOptions(int argc, char *argv[], ParameterTree &pt, std:: │ │ │ │ │ +vector< std::string > keywords, unsigned int required=std::numeric_limits< │ │ │ │ │ +unsigned int >::max(), bool allow_more=true, bool overwrite=true, std::vector< │ │ │ │ │ +std::string > help=std::vector< std::string >()) │ │ │ │ │ +read [named] command line options and build hierarchical ParameterTree │ │ │ │ │ +structure │ │ │ │ │ +Definition: parametertreeparser.cc:175 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00098.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: to_unique_ptr.hh File Reference │ │ │ │ +dune-common: fvector.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,44 +63,85 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces | │ │ │ │ -Typedefs | │ │ │ │ Functions
│ │ │ │ -
to_unique_ptr.hh File Reference
│ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ -
#include <memory>
│ │ │ │ + │ │ │ │ +

Implements a vector constructed from a given type representing a field and a compile-time given size. │ │ │ │ +More...

│ │ │ │ +
#include <array>
│ │ │ │ +#include <cmath>
│ │ │ │ +#include <cstddef>
│ │ │ │ +#include <cstdlib>
│ │ │ │ +#include <complex>
│ │ │ │ +#include <cstring>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <initializer_list>
│ │ │ │ +#include <algorithm>
│ │ │ │ +#include "typetraits.hh"
│ │ │ │ +#include "exceptions.hh"
│ │ │ │ +#include "ftraits.hh"
│ │ │ │ +#include "densevector.hh"
│ │ │ │ +#include "boundschecking.hh"
│ │ │ │ +#include <dune/common/math.hh>
│ │ │ │ +#include <dune/common/promotiontraits.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Classes

struct  Dune::DenseMatVecTraits< FieldVector< K, SIZE > >
 
struct  Dune::FieldTraits< FieldVector< K, SIZE > >
 
struct  Dune::IsFieldVectorSizeCorrect< C, SIZE >
 TMP to check the size of a DenseVectors statically, if possible. More...
 
struct  Dune::IsFieldVectorSizeCorrect< FieldVector< T, SIZE >, SIZE >
 
struct  Dune::IsFieldVectorSizeCorrect< FieldVector< T, SIZE1 >, SIZE >
 
class  Dune::FieldVector< K, SIZE >
 vector space out of a tensor product of fields. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

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

│ │ │ │ -Typedefs

template<class T >
using Dune::ToUniquePtr = std::unique_ptr< T >
 Alias for std::unique_ptr introduced as transition wrapper. More...
 
namespace  Dune::MathOverloads
 namespace for customization of math functions with Dune-Semantics
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<class T , class... Args>
std::unique_ptr< T > Dune::makeToUnique (Args &&... args)
 Alias for std::make_unique introduced as transition wrapper. More...
 
template<class K , int SIZE>
auto Dune::MathOverloads::isFinite (const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
 
template<class K , int SIZE>
bool Dune::MathOverloads::isInf (const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
 
template<class K , int SIZE, typename = std::enable_if_t<HasNaN<K>::value>>
bool Dune::MathOverloads::isNaN (const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
 
template<class K , typename = std::enable_if_t<HasNaN<K>::value>>
bool Dune::MathOverloads::isUnordered (const FieldVector< K, 1 > &b, const FieldVector< K, 1 > &c, PriorityTag< 2 >, ADLTag)
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

Implements a vector constructed from a given type representing a field and a compile-time given size.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,29 +4,75 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Namespaces | Typedefs | Functions │ │ │ │ │ -to_unique_ptr.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Functions │ │ │ │ │ +fvector.hh File Reference │ │ │ │ │ +Common » Dense_Matrix_and_Vector_Template_Library │ │ │ │ │ +Implements a vector constructed from a given type representing a field and a │ │ │ │ │ +compile-time given size. More... │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "typetraits.hh" │ │ │ │ │ +#include "exceptions.hh" │ │ │ │ │ +#include "ftraits.hh" │ │ │ │ │ +#include "densevector.hh" │ │ │ │ │ +#include "boundschecking.hh" │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ + Classes │ │ │ │ │ +struct  Dune::DenseMatVecTraits<_FieldVector<_K,_SIZE_>_> │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::FieldTraits<_FieldVector<_K,_SIZE_>_> │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::IsFieldVectorSizeCorrect<_C,_SIZE_> │ │ │ │ │ +  TMP to check the size of a DenseVectors statically, if possible. │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::IsFieldVectorSizeCorrect<_FieldVector<_T,_SIZE_>,_SIZE_> │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::IsFieldVectorSizeCorrect<_FieldVector<_T,_SIZE1_>,_SIZE_> │ │ │ │ │ +  │ │ │ │ │ + class  Dune::FieldVector<_K,_SIZE_> │ │ │ │ │ +  vector space out of a tensor product of fields. More... │ │ │ │ │ +  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ - Typedefs │ │ │ │ │ -template │ │ │ │ │ -using Dune::ToUniquePtr = std::unique_ptr< T > │ │ │ │ │ -  Alias for std::unique_ptr introduced as transition wrapper. More... │ │ │ │ │ +namespace  Dune::MathOverloads │ │ │ │ │ +  namespace for customization of math functions with Dune-Semantics │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ -std::unique_ptr< T > Dune::makeToUnique (Args &&... args) │ │ │ │ │ -  Alias for std::make_unique introduced as transition │ │ │ │ │ - wrapper. More... │ │ │ │ │ +template │ │ │ │ │ +auto Dune::MathOverloads::isFinite (const FieldVector< K, SIZE > &b, │ │ │ │ │ + PriorityTag< 2 >, ADLTag) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +bool Dune::MathOverloads::isInf (const FieldVector< K, SIZE > &b, PriorityTag< │ │ │ │ │ + 2 >, ADLTag) │ │ │ │ │ +  │ │ │ │ │ +template::value>> │ │ │ │ │ +bool Dune::MathOverloads::isNaN (const FieldVector< K, SIZE > &b, PriorityTag< │ │ │ │ │ + 2 >, ADLTag) │ │ │ │ │ +  │ │ │ │ │ +template::value>> │ │ │ │ │ +bool Dune::MathOverloads::isUnordered (const FieldVector< K, 1 > &b, const │ │ │ │ │ + FieldVector< K, 1 > &c, PriorityTag< 2 >, ADLTag) │ │ │ │ │   │ │ │ │ │ +***** Detailed Description ***** │ │ │ │ │ +Implements a vector constructed from a given type representing a field and a │ │ │ │ │ +compile-time given size. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00098_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: to_unique_ptr.hh Source File │ │ │ │ +dune-common: fvector.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,46 +62,600 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
to_unique_ptr.hh
│ │ │ │ +
fvector.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 (C) 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_TO_UNIQUE_PTR_HH
│ │ │ │ -
7#define DUNE_TO_UNIQUE_PTR_HH
│ │ │ │ -
8
│ │ │ │ -
9#warning to_unique_ptr.hh and ToUniquePtr are deprecated. Use std::unique_ptr or std::shared_ptr instead.
│ │ │ │ -
10
│ │ │ │ -
11#include <memory>
│ │ │ │ -
12
│ │ │ │ -
13namespace Dune
│ │ │ │ -
14{
│ │ │ │ -
17 template <class T>
│ │ │ │ -
18 using ToUniquePtr [[deprecated]] = std::unique_ptr<T>;
│ │ │ │ -
19
│ │ │ │ -
22 template <class T, class... Args>
│ │ │ │ -
23 [[deprecated]] std::unique_ptr<T> makeToUnique (Args&&... args)
│ │ │ │ -
24 {
│ │ │ │ -
25 return std::make_unique(std::forward<Args>(args)...);
│ │ │ │ -
26 }
│ │ │ │ +
5#ifndef DUNE_FVECTOR_HH
│ │ │ │ +
6#define DUNE_FVECTOR_HH
│ │ │ │ +
7
│ │ │ │ +
8#include <array>
│ │ │ │ +
9#include <cmath>
│ │ │ │ +
10#include <cstddef>
│ │ │ │ +
11#include <cstdlib>
│ │ │ │ +
12#include <complex>
│ │ │ │ +
13#include <cstring>
│ │ │ │ +
14#include <utility>
│ │ │ │ +
15#include <initializer_list>
│ │ │ │ +
16#include <algorithm>
│ │ │ │ +
17
│ │ │ │ +
18#include "typetraits.hh"
│ │ │ │ +
19#include "exceptions.hh"
│ │ │ │ +
20
│ │ │ │ +
21#include "ftraits.hh"
│ │ │ │ +
22#include "densevector.hh"
│ │ │ │ +
23#include "boundschecking.hh"
│ │ │ │ +
24
│ │ │ │ +
25#include <dune/common/math.hh>
│ │ │ │ + │ │ │ │
27
│ │ │ │ -
28} // end namespace Dune
│ │ │ │ +
28namespace Dune {
│ │ │ │
29
│ │ │ │ -
30#endif // DUNE_TO_UNIQUE_PTR_HH
│ │ │ │ +
39 template< class K, int SIZE > class FieldVector;
│ │ │ │ +
40 template< class K, int SIZE >
│ │ │ │ + │ │ │ │ +
42 {
│ │ │ │ + │ │ │ │ +
44 typedef std::array<K,SIZE> container_type;
│ │ │ │ +
45 typedef K value_type;
│ │ │ │ +
46 typedef typename container_type::size_type size_type;
│ │ │ │ +
47 };
│ │ │ │ +
48
│ │ │ │ +
49 template< class K, int SIZE >
│ │ │ │ +
50 struct FieldTraits< FieldVector<K,SIZE> >
│ │ │ │ +
51 {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
54 };
│ │ │ │ +
55
│ │ │ │ +
64 template<typename C, int SIZE>
│ │ │ │ + │ │ │ │ +
66 {
│ │ │ │ +
71 constexpr static bool value = true;
│ │ │ │ +
72 };
│ │ │ │ +
73
│ │ │ │ +
74 template<typename T, int SIZE>
│ │ │ │ + │ │ │ │ +
76 {
│ │ │ │ +
77 constexpr static bool value = true;
│ │ │ │ +
78 };
│ │ │ │ +
79
│ │ │ │ +
80 template<typename T, int SIZE, int SIZE1>
│ │ │ │ + │ │ │ │ +
82 {
│ │ │ │ +
83 constexpr static bool value = false;
│ │ │ │ +
84 };
│ │ │ │ +
85
│ │ │ │ +
86
│ │ │ │ +
92 template< class K, int SIZE >
│ │ │ │ + │ │ │ │ +
94 public DenseVector< FieldVector<K,SIZE> >
│ │ │ │ +
95 {
│ │ │ │ +
96 std::array<K,SIZE> _data;
│ │ │ │ + │ │ │ │ +
98 public:
│ │ │ │ +
100 constexpr static int dimension = SIZE;
│ │ │ │ +
101
│ │ │ │ +
102 typedef typename Base::size_type size_type;
│ │ │ │ +
103 typedef typename Base::value_type value_type;
│ │ │ │ +
104
│ │ │ │ + │ │ │ │ +
107
│ │ │ │ + │ │ │ │ +
110
│ │ │ │ +
112 constexpr FieldVector()
│ │ │ │ +
113 : _data{{}}
│ │ │ │ +
114 {}
│ │ │ │ +
115
│ │ │ │ +
117 explicit FieldVector (const K& t)
│ │ │ │ +
118 {
│ │ │ │ +
119 std::fill(_data.begin(),_data.end(),t);
│ │ │ │ +
120 }
│ │ │ │ +
121
│ │ │ │ +
122#if __GNUC__ == 5 && !defined(__clang__)
│ │ │ │ +
123 // `... = default;` causes an internal compiler error on GCC 5.4 (Ubuntu 16.04)
│ │ │ │ +
125 FieldVector(const FieldVector& x) : _data(x._data) {}
│ │ │ │ +
126#else
│ │ │ │ +
128 FieldVector (const FieldVector&) = default;
│ │ │ │ +
129#endif
│ │ │ │ +
130
│ │ │ │ +
132 FieldVector (std::initializer_list<K> const &l)
│ │ │ │ +
133 {
│ │ │ │ +
134 assert(l.size() == dimension);// Actually, this is not needed any more!
│ │ │ │ +
135 std::copy_n(l.begin(), std::min(static_cast<std::size_t>(dimension),
│ │ │ │ +
136 l.size()),
│ │ │ │ +
137 _data.begin());
│ │ │ │ +
138 }
│ │ │ │ +
139
│ │ │ │ +
141 FieldVector& operator= (const FieldVector&) = default;
│ │ │ │ +
142
│ │ │ │ +
143 template <typename T>
│ │ │ │ +
144 FieldVector& operator= (const FieldVector<T, SIZE>& x)
│ │ │ │ +
145 {
│ │ │ │ +
146 std::copy_n(x.begin(), SIZE, _data.begin());
│ │ │ │ +
147 return *this;
│ │ │ │ +
148 }
│ │ │ │ +
149
│ │ │ │ +
150 template<typename T, int N>
│ │ │ │ + │ │ │ │ +
152
│ │ │ │ +
164 template<class C>
│ │ │ │ + │ │ │ │ +
166 [[maybe_unused]] typename std::enable_if<IsFieldVectorSizeCorrect<C,SIZE>::value>::type* dummy=0)
│ │ │ │ +
167 {
│ │ │ │ +
168 // do a run-time size check, for the case that x is not a FieldVector
│ │ │ │ +
169 assert(x.size() == SIZE); // Actually this is not needed any more!
│ │ │ │ +
170 std::copy_n(x.begin(), std::min(static_cast<std::size_t>(SIZE),x.size()), _data.begin());
│ │ │ │ +
171 }
│ │ │ │ +
172
│ │ │ │ +
174 template<class K1>
│ │ │ │ + │ │ │ │ +
176 {
│ │ │ │ +
177 std::copy_n(x.begin(), SIZE, _data.begin());
│ │ │ │ +
178 }
│ │ │ │ +
179
│ │ │ │ +
180 template<typename T, int N>
│ │ │ │ +
181 explicit FieldVector(const FieldVector<T, N>&) = delete;
│ │ │ │ +
182
│ │ │ │ +
183 using Base::operator=;
│ │ │ │ +
184
│ │ │ │ +
185 // make this thing a vector
│ │ │ │ +
186 static constexpr size_type size () { return SIZE; }
│ │ │ │ +
187
│ │ │ │ + │ │ │ │ +
189 DUNE_ASSERT_BOUNDS(i < SIZE);
│ │ │ │ +
190 return _data[i];
│ │ │ │ +
191 }
│ │ │ │ +
192 const K & operator[](size_type i) const {
│ │ │ │ +
193 DUNE_ASSERT_BOUNDS(i < SIZE);
│ │ │ │ +
194 return _data[i];
│ │ │ │ +
195 }
│ │ │ │ +
196
│ │ │ │ +
198 K* data() noexcept
│ │ │ │ +
199 {
│ │ │ │ +
200 return _data.data();
│ │ │ │ +
201 }
│ │ │ │ +
202
│ │ │ │ +
204 const K* data() const noexcept
│ │ │ │ +
205 {
│ │ │ │ +
206 return _data.data();
│ │ │ │ +
207 }
│ │ │ │ +
208
│ │ │ │ +
210 template <class Scalar,
│ │ │ │ +
211 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
│ │ │ │ +
212 friend auto operator* ( const FieldVector& vector, Scalar scalar)
│ │ │ │ +
213 {
│ │ │ │ + │ │ │ │ +
215
│ │ │ │ +
216 for (size_type i = 0; i < vector.size(); ++i)
│ │ │ │ +
217 result[i] = vector[i] * scalar;
│ │ │ │ +
218
│ │ │ │ +
219 return result;
│ │ │ │ +
220 }
│ │ │ │ +
221
│ │ │ │ +
223 template <class Scalar,
│ │ │ │ +
224 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
│ │ │ │ +
225 friend auto operator* ( Scalar scalar, const FieldVector& vector)
│ │ │ │ +
226 {
│ │ │ │ + │ │ │ │ +
228
│ │ │ │ +
229 for (size_type i = 0; i < vector.size(); ++i)
│ │ │ │ +
230 result[i] = scalar * vector[i];
│ │ │ │ +
231
│ │ │ │ +
232 return result;
│ │ │ │ +
233 }
│ │ │ │ +
234
│ │ │ │ +
236 template <class Scalar,
│ │ │ │ +
237 std::enable_if_t<IsNumber<Scalar>::value, int> = 0>
│ │ │ │ +
238 friend auto operator/ ( const FieldVector& vector, Scalar scalar)
│ │ │ │ +
239 {
│ │ │ │ + │ │ │ │ +
241
│ │ │ │ +
242 for (size_type i = 0; i < vector.size(); ++i)
│ │ │ │ +
243 result[i] = vector[i] / scalar;
│ │ │ │ +
244
│ │ │ │ +
245 return result;
│ │ │ │ +
246 }
│ │ │ │ +
247
│ │ │ │ +
248 };
│ │ │ │ +
249
│ │ │ │ +
261 template<class K, int SIZE>
│ │ │ │ +
262 inline std::istream &operator>> ( std::istream &in,
│ │ │ │ + │ │ │ │ +
264 {
│ │ │ │ + │ │ │ │ +
266 for( typename FieldVector<K, SIZE>::size_type i = 0; i < SIZE; ++i )
│ │ │ │ +
267 in >> w[ i ];
│ │ │ │ +
268 if(in)
│ │ │ │ +
269 v = w;
│ │ │ │ +
270 return in;
│ │ │ │ +
271 }
│ │ │ │ +
272
│ │ │ │ +
273#ifndef DOXYGEN
│ │ │ │ +
274 template< class K >
│ │ │ │ +
275 struct DenseMatVecTraits< FieldVector<K,1> >
│ │ │ │ +
276 {
│ │ │ │ +
277 typedef FieldVector<K,1> derived_type;
│ │ │ │ +
278 typedef K container_type;
│ │ │ │ +
279 typedef K value_type;
│ │ │ │ +
280 typedef size_t size_type;
│ │ │ │ +
281 };
│ │ │ │ +
282
│ │ │ │ +
285 template<class K>
│ │ │ │ +
286 class FieldVector<K, 1> :
│ │ │ │ +
287 public DenseVector< FieldVector<K,1> >
│ │ │ │ +
288 {
│ │ │ │ +
289 K _data;
│ │ │ │ +
290 typedef DenseVector< FieldVector<K,1> > Base;
│ │ │ │ +
291 public:
│ │ │ │ +
293 constexpr static int dimension = 1;
│ │ │ │ +
294
│ │ │ │ +
295 typedef typename Base::size_type size_type;
│ │ │ │ +
296
│ │ │ │ +
298 typedef K& reference;
│ │ │ │ +
299
│ │ │ │ +
301 typedef const K& const_reference;
│ │ │ │ +
302
│ │ │ │ +
303 //===== construction
│ │ │ │ +
304
│ │ │ │ +
306 constexpr FieldVector ()
│ │ │ │ +
307 : _data()
│ │ │ │ +
308 {}
│ │ │ │ +
309
│ │ │ │ +
311 template<typename T,
│ │ │ │ +
312 typename EnableIf = typename std::enable_if<
│ │ │ │ +
313 std::is_convertible<T, K>::value &&
│ │ │ │ +
314 ! std::is_base_of<DenseVector<typename FieldTraits<T>::field_type>, K
│ │ │ │ +
315 >::value
│ │ │ │ +
316 >::type
│ │ │ │ +
317 >
│ │ │ │ +
318 FieldVector (const T& k) : _data(k) {}
│ │ │ │ +
319
│ │ │ │ +
321 template<class C,
│ │ │ │ +
322 std::enable_if_t<
│ │ │ │ +
323 std::is_assignable<K&, typename DenseVector<C>::value_type>::value, int> = 0>
│ │ │ │ +
324 FieldVector (const DenseVector<C> & x)
│ │ │ │ +
325 {
│ │ │ │ +
326 static_assert(((bool)IsFieldVectorSizeCorrect<C,1>::value), "FieldVectors do not match in dimension!");
│ │ │ │ +
327 assert(x.size() == 1);
│ │ │ │ +
328 _data = x[0];
│ │ │ │ +
329 }
│ │ │ │ +
330
│ │ │ │ +
332 FieldVector(const FieldVector&) = default;
│ │ │ │ +
333
│ │ │ │ +
335 FieldVector& operator=(const FieldVector&) = default;
│ │ │ │ +
336
│ │ │ │ +
337 template <typename T>
│ │ │ │ +
338 FieldVector& operator= (const FieldVector<T, 1>& other)
│ │ │ │ +
339 {
│ │ │ │ +
340 _data = other[0];
│ │ │ │ +
341 return *this;
│ │ │ │ +
342 }
│ │ │ │ +
343
│ │ │ │ +
344 template<typename T, int N>
│ │ │ │ +
345 FieldVector& operator=(const FieldVector<T, N>&) = delete;
│ │ │ │ +
346
│ │ │ │ +
348 FieldVector (std::initializer_list<K> const &l)
│ │ │ │ +
349 {
│ │ │ │ +
350 assert(l.size() == 1);
│ │ │ │ +
351 _data = *l.begin();
│ │ │ │ +
352 }
│ │ │ │ +
353
│ │ │ │ +
355 template<typename T,
│ │ │ │ +
356 typename EnableIf = typename std::enable_if<
│ │ │ │ +
357 std::is_assignable<K&, T>::value &&
│ │ │ │ +
358 ! std::is_base_of<DenseVector<typename FieldTraits<T>::field_type>, K
│ │ │ │ +
359 >::value
│ │ │ │ +
360 >::type
│ │ │ │ +
361 >
│ │ │ │ +
362 inline FieldVector& operator= (const T& k)
│ │ │ │ +
363 {
│ │ │ │ +
364 _data = k;
│ │ │ │ +
365 return *this;
│ │ │ │ +
366 }
│ │ │ │ +
367
│ │ │ │ +
368 //===== forward methods to container
│ │ │ │ +
369 static constexpr size_type size () { return 1; }
│ │ │ │ +
370
│ │ │ │ +
371 K & operator[]([[maybe_unused]] size_type i)
│ │ │ │ +
372 {
│ │ │ │ +
373 DUNE_ASSERT_BOUNDS(i == 0);
│ │ │ │ +
374 return _data;
│ │ │ │ +
375 }
│ │ │ │ +
376 const K & operator[]([[maybe_unused]] size_type i) const
│ │ │ │ +
377 {
│ │ │ │ +
378 DUNE_ASSERT_BOUNDS(i == 0);
│ │ │ │ +
379 return _data;
│ │ │ │ +
380 }
│ │ │ │ +
381
│ │ │ │ +
383 K* data() noexcept
│ │ │ │ +
384 {
│ │ │ │ +
385 return &_data;
│ │ │ │ +
386 }
│ │ │ │ +
387
│ │ │ │ +
389 const K* data() const noexcept
│ │ │ │ +
390 {
│ │ │ │ +
391 return &_data;
│ │ │ │ +
392 }
│ │ │ │ +
393
│ │ │ │ +
394 //===== conversion operator
│ │ │ │ +
395
│ │ │ │ +
397 operator K& () { return _data; }
│ │ │ │ +
398
│ │ │ │ +
400 operator const K& () const { return _data; }
│ │ │ │ +
401 };
│ │ │ │ +
402
│ │ │ │ +
403 /* ----- FV / FV ----- */
│ │ │ │ +
404 /* mostly not necessary as these operations are already covered via the cast operator */
│ │ │ │ +
405
│ │ │ │ +
407 template<class K>
│ │ │ │ +
408 inline bool operator> (const FieldVector<K,1>& a, const FieldVector<K,1>& b)
│ │ │ │ +
409 {
│ │ │ │ +
410 return a[0]>b[0];
│ │ │ │ +
411 }
│ │ │ │ +
412
│ │ │ │ +
414 template<class K>
│ │ │ │ +
415 inline bool operator>= (const FieldVector<K,1>& a, const FieldVector<K,1>& b)
│ │ │ │ +
416 {
│ │ │ │ +
417 return a[0]>=b[0];
│ │ │ │ +
418 }
│ │ │ │ +
419
│ │ │ │ +
421 template<class K>
│ │ │ │ +
422 inline bool operator< (const FieldVector<K,1>& a, const FieldVector<K,1>& b)
│ │ │ │ +
423 {
│ │ │ │ +
424 return a[0]<b[0];
│ │ │ │ +
425 }
│ │ │ │ +
426
│ │ │ │ +
428 template<class K>
│ │ │ │ +
429 inline bool operator<= (const FieldVector<K,1>& a, const FieldVector<K,1>& b)
│ │ │ │ +
430 {
│ │ │ │ +
431 return a[0]<=b[0];
│ │ │ │ +
432 }
│ │ │ │ +
433
│ │ │ │ +
434 /* ----- FV / scalar ----- */
│ │ │ │ +
435
│ │ │ │ +
437 template<class K>
│ │ │ │ +
438 inline FieldVector<K,1> operator+ (const FieldVector<K,1>& a, const K b)
│ │ │ │ +
439 {
│ │ │ │ +
440 return a[0]+b;
│ │ │ │ +
441 }
│ │ │ │ +
442
│ │ │ │ +
444 template<class K>
│ │ │ │ +
445 inline FieldVector<K,1> operator- (const FieldVector<K,1>& a, const K b)
│ │ │ │ +
446 {
│ │ │ │ +
447 return a[0]-b;
│ │ │ │ +
448 }
│ │ │ │ +
449
│ │ │ │ +
451 template<class K>
│ │ │ │ +
452 inline FieldVector<K,1> operator* (const FieldVector<K,1>& a, const K b)
│ │ │ │ +
453 {
│ │ │ │ +
454 return a[0]*b;
│ │ │ │ +
455 }
│ │ │ │ +
456
│ │ │ │ +
458 template<class K>
│ │ │ │ +
459 inline FieldVector<K,1> operator/ (const FieldVector<K,1>& a, const K b)
│ │ │ │ +
460 {
│ │ │ │ +
461 return a[0]/b;
│ │ │ │ +
462 }
│ │ │ │ +
463
│ │ │ │ +
465 template<class K>
│ │ │ │ +
466 inline bool operator> (const FieldVector<K,1>& a, const K b)
│ │ │ │ +
467 {
│ │ │ │ +
468 return a[0]>b;
│ │ │ │ +
469 }
│ │ │ │ +
470
│ │ │ │ +
472 template<class K>
│ │ │ │ +
473 inline bool operator>= (const FieldVector<K,1>& a, const K b)
│ │ │ │ +
474 {
│ │ │ │ +
475 return a[0]>=b;
│ │ │ │ +
476 }
│ │ │ │ +
477
│ │ │ │ +
479 template<class K>
│ │ │ │ +
480 inline bool operator< (const FieldVector<K,1>& a, const K b)
│ │ │ │ +
481 {
│ │ │ │ +
482 return a[0]<b;
│ │ │ │ +
483 }
│ │ │ │ +
484
│ │ │ │ +
486 template<class K>
│ │ │ │ +
487 inline bool operator<= (const FieldVector<K,1>& a, const K b)
│ │ │ │ +
488 {
│ │ │ │ +
489 return a[0]<=b;
│ │ │ │ +
490 }
│ │ │ │ +
491
│ │ │ │ +
493 template<class K>
│ │ │ │ +
494 inline bool operator== (const FieldVector<K,1>& a, const K b)
│ │ │ │ +
495 {
│ │ │ │ +
496 return a[0]==b;
│ │ │ │ +
497 }
│ │ │ │ +
498
│ │ │ │ +
500 template<class K>
│ │ │ │ +
501 inline bool operator!= (const FieldVector<K,1>& a, const K b)
│ │ │ │ +
502 {
│ │ │ │ +
503 return a[0]!=b;
│ │ │ │ +
504 }
│ │ │ │ +
505
│ │ │ │ +
506 /* ----- scalar / FV ------ */
│ │ │ │ +
507
│ │ │ │ +
509 template<class K>
│ │ │ │ +
510 inline FieldVector<K,1> operator+ (const K a, const FieldVector<K,1>& b)
│ │ │ │ +
511 {
│ │ │ │ +
512 return a+b[0];
│ │ │ │ +
513 }
│ │ │ │ +
514
│ │ │ │ +
516 template<class K>
│ │ │ │ +
517 inline FieldVector<K,1> operator- (const K a, const FieldVector<K,1>& b)
│ │ │ │ +
518 {
│ │ │ │ +
519 return a-b[0];
│ │ │ │ +
520 }
│ │ │ │ +
521
│ │ │ │ +
523 template<class K>
│ │ │ │ +
524 inline FieldVector<K,1> operator* (const K a, const FieldVector<K,1>& b)
│ │ │ │ +
525 {
│ │ │ │ +
526 return a*b[0];
│ │ │ │ +
527 }
│ │ │ │ +
528
│ │ │ │ +
530 template<class K>
│ │ │ │ +
531 inline FieldVector<K,1> operator/ (const K a, const FieldVector<K,1>& b)
│ │ │ │ +
532 {
│ │ │ │ +
533 return a/b[0];
│ │ │ │ +
534 }
│ │ │ │ +
535
│ │ │ │ +
537 template<class K>
│ │ │ │ +
538 inline bool operator> (const K a, const FieldVector<K,1>& b)
│ │ │ │ +
539 {
│ │ │ │ +
540 return a>b[0];
│ │ │ │ +
541 }
│ │ │ │ +
542
│ │ │ │ +
544 template<class K>
│ │ │ │ +
545 inline bool operator>= (const K a, const FieldVector<K,1>& b)
│ │ │ │ +
546 {
│ │ │ │ +
547 return a>=b[0];
│ │ │ │ +
548 }
│ │ │ │ +
549
│ │ │ │ +
551 template<class K>
│ │ │ │ +
552 inline bool operator< (const K a, const FieldVector<K,1>& b)
│ │ │ │ +
553 {
│ │ │ │ +
554 return a<b[0];
│ │ │ │ +
555 }
│ │ │ │ +
556
│ │ │ │ +
558 template<class K>
│ │ │ │ +
559 inline bool operator<= (const K a, const FieldVector<K,1>& b)
│ │ │ │ +
560 {
│ │ │ │ +
561 return a<=b[0];
│ │ │ │ +
562 }
│ │ │ │ +
563
│ │ │ │ +
565 template<class K>
│ │ │ │ +
566 inline bool operator== (const K a, const FieldVector<K,1>& b)
│ │ │ │ +
567 {
│ │ │ │ +
568 return a==b[0];
│ │ │ │ +
569 }
│ │ │ │ +
570
│ │ │ │ +
572 template<class K>
│ │ │ │ +
573 inline bool operator!= (const K a, const FieldVector<K,1>& b)
│ │ │ │ +
574 {
│ │ │ │ +
575 return a!=b[0];
│ │ │ │ +
576 }
│ │ │ │ +
577#endif
│ │ │ │ +
578
│ │ │ │ +
579 /* Overloads for common classification functions */
│ │ │ │ +
580 namespace MathOverloads {
│ │ │ │ +
581
│ │ │ │ +
582 // ! Returns whether all entries are finite
│ │ │ │ +
583 template<class K, int SIZE>
│ │ │ │ + │ │ │ │ +
585 bool out = true;
│ │ │ │ +
586 for(int i=0; i<SIZE; i++) {
│ │ │ │ +
587 out &= Dune::isFinite(b[i]);
│ │ │ │ +
588 }
│ │ │ │ +
589 return out;
│ │ │ │ +
590 }
│ │ │ │ +
591
│ │ │ │ +
592 // ! Returns whether any entry is infinite
│ │ │ │ +
593 template<class K, int SIZE>
│ │ │ │ + │ │ │ │ +
595 bool out = false;
│ │ │ │ +
596 for(int i=0; i<SIZE; i++) {
│ │ │ │ +
597 out |= Dune::isInf(b[i]);
│ │ │ │ +
598 }
│ │ │ │ +
599 return out;
│ │ │ │ +
600 }
│ │ │ │ +
601
│ │ │ │ +
602 // ! Returns whether any entry is NaN
│ │ │ │ +
603 template<class K, int SIZE, typename = std::enable_if_t<HasNaN<K>::value>>
│ │ │ │ + │ │ │ │ +
605 bool out = false;
│ │ │ │ +
606 for(int i=0; i<SIZE; i++) {
│ │ │ │ +
607 out |= Dune::isNaN(b[i]);
│ │ │ │ +
608 }
│ │ │ │ +
609 return out;
│ │ │ │ +
610 }
│ │ │ │ +
611
│ │ │ │ +
612 // ! Returns true if either b or c is NaN
│ │ │ │ +
613 template<class K, typename = std::enable_if_t<HasNaN<K>::value>>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
616 return Dune::isUnordered(b[0],c[0]);
│ │ │ │ +
617 }
│ │ │ │ +
618 } //MathOverloads
│ │ │ │ +
619
│ │ │ │ +
622} // end namespace
│ │ │ │ +
623
│ │ │ │ +
624#endif
│ │ │ │ +
Compute type of the result of an arithmetic operation involving two different number types.
│ │ │ │ +
Traits for type conversions and type information.
│ │ │ │ +
Type traits to determine the type of reals (when working with complex numbers)
│ │ │ │ +
Implements the dense vector interface, with an exchangeable storage class.
│ │ │ │ +
Macro for wrapping boundary checks.
│ │ │ │ +
A few common exception classes.
│ │ │ │ +
Some useful basic math stuff.
│ │ │ │ +
#define DUNE_ASSERT_BOUNDS(cond)
If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do nothing.
Definition: boundschecking.hh:30
│ │ │ │ +
bigunsignedint< k > operator*(const bigunsignedint< k > &x, std::uintmax_t y)
Definition: bigunsignedint.hh:549
│ │ │ │ +
bigunsignedint< k > operator/(const bigunsignedint< k > &x, std::uintmax_t y)
Definition: bigunsignedint.hh:556
│ │ │ │ +
bigunsignedint< k > operator-(const bigunsignedint< k > &x, std::uintmax_t y)
Definition: bigunsignedint.hh:542
│ │ │ │ +
bigunsignedint< k > operator+(const bigunsignedint< k > &x, std::uintmax_t y)
Definition: bigunsignedint.hh:535
│ │ │ │ +
std::istream & operator>>(std::istream &in, DynamicVector< K, Allocator > &v)
Read a DynamicVector from an input stream.
Definition: dynvector.hh:189
│ │ │ │ +
EnableIfInterOperable< T1, T2, bool >::type operator<(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition: iteratorfacades.hh:637
│ │ │ │ +
EnableIfInterOperable< T1, T2, bool >::type operator>(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition: iteratorfacades.hh:683
│ │ │ │ +
EnableIfInterOperable< T1, T2, bool >::type operator<=(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition: iteratorfacades.hh:660
│ │ │ │ +
EnableIfInterOperable< T1, T2, bool >::type operator==(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for equality.
Definition: iteratorfacades.hh:237
│ │ │ │ +
EnableIfInterOperable< T1, T2, bool >::type operator>=(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition: iteratorfacades.hh:705
│ │ │ │ +
EnableIfInterOperable< T1, T2, bool >::type operator!=(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for inequality.
Definition: iteratorfacades.hh:259
│ │ │ │ +
typename Overloads::ScalarType< std::decay_t< V > >::type Scalar
Element type of some SIMD type.
Definition: simd/interface.hh:235
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
std::unique_ptr< T > makeToUnique(Args &&... args)
Alias for std::make_unique introduced as transition wrapper.
Definition: to_unique_ptr.hh:23
│ │ │ │ -
std::unique_ptr< T > ToUniquePtr
Alias for std::unique_ptr introduced as transition wrapper.
Definition: to_unique_ptr.hh:18
│ │ │ │ +
auto min(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
Definition: debugalign.hh:447
│ │ │ │ +
bool isNaN(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
Definition: fvector.hh:604
│ │ │ │ +
bool isInf(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
Definition: fvector.hh:594
│ │ │ │ +
auto isFinite(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
Definition: fvector.hh:584
│ │ │ │ +
bool isUnordered(const FieldVector< K, 1 > &b, const FieldVector< K, 1 > &c, PriorityTag< 2 >, ADLTag)
Definition: fvector.hh:614
│ │ │ │ +
vector space out of a tensor product of fields.
Definition: fvector.hh:95
│ │ │ │ +
K * data() noexcept
return pointer to underlying array
Definition: fvector.hh:198
│ │ │ │ +
constexpr FieldVector()
Constructor making default-initialized vector.
Definition: fvector.hh:112
│ │ │ │ +
const value_type & const_reference
The type used for const references to the vector entry.
Definition: fvector.hh:109
│ │ │ │ +
Base::size_type size_type
Definition: fvector.hh:102
│ │ │ │ +
FieldVector(const DenseVector< C > &x, typename std::enable_if< IsFieldVectorSizeCorrect< C, SIZE >::value >::type *dummy=0)
Copy constructor from a second vector of possibly different type.
Definition: fvector.hh:165
│ │ │ │ +
FieldVector(const FieldVector< T, N > &)=delete
│ │ │ │ +
FieldVector(const K &t)
Constructor making vector with identical coordinates.
Definition: fvector.hh:117
│ │ │ │ +
FieldVector(std::initializer_list< K > const &l)
Construct from a std::initializer_list.
Definition: fvector.hh:132
│ │ │ │ +
const K * data() const noexcept
return pointer to underlying array
Definition: fvector.hh:204
│ │ │ │ +
static constexpr int dimension
The size of this vector.
Definition: fvector.hh:100
│ │ │ │ +
FieldVector(const FieldVector< K1, SIZE > &x)
Constructor making vector with identical coordinates.
Definition: fvector.hh:175
│ │ │ │ +
static constexpr size_type size()
Definition: fvector.hh:186
│ │ │ │ +
K & operator[](size_type i)
Definition: fvector.hh:188
│ │ │ │ +
value_type & reference
The type used for references to the vector entry.
Definition: fvector.hh:106
│ │ │ │ +
Base::value_type value_type
Definition: fvector.hh:103
│ │ │ │ +
const K & operator[](size_type i) const
Definition: fvector.hh:192
│ │ │ │ +
FieldVector & operator=(const FieldVector< T, N > &)=delete
│ │ │ │ +
FieldVector(const FieldVector &)=default
Copy constructor.
│ │ │ │ +
Interface for a class of dense vectors over a given field.
Definition: densevector.hh:229
│ │ │ │ +
Traits::value_type value_type
export the type representing the field
Definition: densevector.hh:250
│ │ │ │ +
Iterator begin()
begin iterator
Definition: densevector.hh:347
│ │ │ │ +
size_type size() const
size method
Definition: densevector.hh:336
│ │ │ │ +
Traits::size_type size_type
The type used for the index access and size operation.
Definition: densevector.hh:259
│ │ │ │ +
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
│ │ │ │ + │ │ │ │ +
std::array< K, SIZE > container_type
Definition: fvector.hh:44
│ │ │ │ +
container_type::size_type size_type
Definition: fvector.hh:46
│ │ │ │ +
FieldVector< K, SIZE > derived_type
Definition: fvector.hh:43
│ │ │ │ +
FieldTraits< K >::real_type real_type
Definition: fvector.hh:53
│ │ │ │ +
FieldTraits< K >::field_type field_type
Definition: fvector.hh:52
│ │ │ │ +
TMP to check the size of a DenseVectors statically, if possible.
Definition: fvector.hh:66
│ │ │ │ +
static constexpr bool value
True if C is not of type FieldVector or its dimension is not equal SIZE.
Definition: fvector.hh:71
│ │ │ │ +
Tag to make sure the functions in this namespace can be found by ADL.
Definition: math.hh:230
│ │ │ │ +
Definition: matvectraits.hh:31
│ │ │ │ +
Helper class for tagging priorities.
Definition: typeutilities.hh:73
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,51 +4,769 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -to_unique_ptr.hh │ │ │ │ │ +fvector.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 (C) 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_TO_UNIQUE_PTR_HH │ │ │ │ │ - 7#define DUNE_TO_UNIQUE_PTR_HH │ │ │ │ │ - 8 │ │ │ │ │ - 9#warning to_unique_ptr.hh and ToUniquePtr are deprecated. Use std::unique_ptr │ │ │ │ │ -or std::shared_ptr instead. │ │ │ │ │ - 10 │ │ │ │ │ - 11#include │ │ │ │ │ - 12 │ │ │ │ │ - 13namespace Dune │ │ │ │ │ - 14{ │ │ │ │ │ - 17 template │ │ │ │ │ -18 using ToUniquePtr [[deprecated]] = std::unique_ptr; │ │ │ │ │ - 19 │ │ │ │ │ - 22 template │ │ │ │ │ -23 [[deprecated]] std::unique_ptr makeToUnique (Args&&... args) │ │ │ │ │ - 24 { │ │ │ │ │ - 25 return std::make_unique(std::forward(args)...); │ │ │ │ │ - 26 } │ │ │ │ │ + 5#ifndef DUNE_FVECTOR_HH │ │ │ │ │ + 6#define DUNE_FVECTOR_HH │ │ │ │ │ + 7 │ │ │ │ │ + 8#include │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14#include │ │ │ │ │ + 15#include │ │ │ │ │ + 16#include │ │ │ │ │ + 17 │ │ │ │ │ + 18#include "typetraits.hh" │ │ │ │ │ + 19#include "exceptions.hh" │ │ │ │ │ + 20 │ │ │ │ │ + 21#include "ftraits.hh" │ │ │ │ │ + 22#include "densevector.hh" │ │ │ │ │ + 23#include "boundschecking.hh" │ │ │ │ │ + 24 │ │ │ │ │ + 25#include │ │ │ │ │ + 26#include │ │ │ │ │ 27 │ │ │ │ │ - 28} // end namespace Dune │ │ │ │ │ + 28namespace Dune { │ │ │ │ │ 29 │ │ │ │ │ - 30#endif // DUNE_TO_UNIQUE_PTR_HH │ │ │ │ │ + 39 template< class K, int SIZE > class FieldVector; │ │ │ │ │ + 40 template< class K, int SIZE > │ │ │ │ │ +41 struct DenseMatVecTraits< FieldVector > │ │ │ │ │ + 42 { │ │ │ │ │ +43 typedef FieldVector derived_type; │ │ │ │ │ +44 typedef std::array container_type; │ │ │ │ │ +45 typedef K value_type; │ │ │ │ │ +46 typedef typename container_type::size_type size_type; │ │ │ │ │ + 47 }; │ │ │ │ │ + 48 │ │ │ │ │ + 49 template< class K, int SIZE > │ │ │ │ │ +50 struct FieldTraits< FieldVector > │ │ │ │ │ + 51 { │ │ │ │ │ +52 typedef typename FieldTraits::field_type field_type; │ │ │ │ │ +53 typedef typename FieldTraits::real_type real_type; │ │ │ │ │ + 54 }; │ │ │ │ │ + 55 │ │ │ │ │ + 64 template │ │ │ │ │ +65 struct IsFieldVectorSizeCorrect │ │ │ │ │ + 66 { │ │ │ │ │ +71 constexpr static bool value = true; │ │ │ │ │ + 72 }; │ │ │ │ │ + 73 │ │ │ │ │ + 74 template │ │ │ │ │ +75 struct IsFieldVectorSizeCorrect,SIZE> │ │ │ │ │ + 76 { │ │ │ │ │ +77 constexpr static bool value = true; │ │ │ │ │ + 78 }; │ │ │ │ │ + 79 │ │ │ │ │ + 80 template │ │ │ │ │ +81 struct IsFieldVectorSizeCorrect,SIZE> │ │ │ │ │ + 82 { │ │ │ │ │ +83 constexpr static bool value = false; │ │ │ │ │ + 84 }; │ │ │ │ │ + 85 │ │ │ │ │ + 86 │ │ │ │ │ + 92 template< class K, int SIZE > │ │ │ │ │ +93 class FieldVector : │ │ │ │ │ + 94 public DenseVector< FieldVector > │ │ │ │ │ + 95 { │ │ │ │ │ + 96 std::array _data; │ │ │ │ │ + 97 typedef DenseVector<_FieldVector > Base; │ │ │ │ │ + 98 public: │ │ │ │ │ +100 constexpr static int dimension = SIZE; │ │ │ │ │ + 101 │ │ │ │ │ +102 typedef typename Base::size_type size_type; │ │ │ │ │ +103 typedef typename Base::value_type value_type; │ │ │ │ │ + 104 │ │ │ │ │ +106 typedef value_type& reference; │ │ │ │ │ + 107 │ │ │ │ │ +109 typedef const value_type& const_reference; │ │ │ │ │ + 110 │ │ │ │ │ +112 constexpr FieldVector() │ │ │ │ │ + 113 : _data{{}} │ │ │ │ │ + 114 {} │ │ │ │ │ + 115 │ │ │ │ │ +117 explicit FieldVector (const K& t) │ │ │ │ │ + 118 { │ │ │ │ │ + 119 std::fill(_data.begin(),_data.end(),t); │ │ │ │ │ + 120 } │ │ │ │ │ + 121 │ │ │ │ │ + 122#if __GNUC__ == 5 && !defined(__clang__) │ │ │ │ │ + 123 // `... = default;` causes an internal compiler error on GCC 5.4 (Ubuntu │ │ │ │ │ +16.04) │ │ │ │ │ + 125 FieldVector(const FieldVector& x) : _data(x._data) {} │ │ │ │ │ + 126#else │ │ │ │ │ +128 FieldVector (const FieldVector&) = default; │ │ │ │ │ + 129#endif │ │ │ │ │ + 130 │ │ │ │ │ +132 FieldVector (std::initializer_list const &l) │ │ │ │ │ + 133 { │ │ │ │ │ + 134 assert(l.size() == dimension);// Actually, this is not needed any more! │ │ │ │ │ + 135 std::copy_n(l.begin(), std::min(static_cast(dimension), │ │ │ │ │ + 136 l.size()), │ │ │ │ │ + 137 _data.begin()); │ │ │ │ │ + 138 } │ │ │ │ │ + 139 │ │ │ │ │ +141 FieldVector& operator= (const FieldVector&) = default; │ │ │ │ │ + 142 │ │ │ │ │ + 143 template │ │ │ │ │ +144 FieldVector& operator= (const FieldVector& x) │ │ │ │ │ + 145 { │ │ │ │ │ + 146 std::copy_n(x.begin(), SIZE, _data.begin()); │ │ │ │ │ + 147 return *this; │ │ │ │ │ + 148 } │ │ │ │ │ + 149 │ │ │ │ │ + 150 template │ │ │ │ │ +151 FieldVector& operator=(const FieldVector&) = delete; │ │ │ │ │ + 152 │ │ │ │ │ + 164 template │ │ │ │ │ +165 FieldVector (const DenseVector & x, │ │ │ │ │ + 166 [[maybe_unused]] typename std:: │ │ │ │ │ +enable_if::value>::type* dummy=0) │ │ │ │ │ + 167 { │ │ │ │ │ + 168 // do a run-time size check, for the case that x is not a FieldVector │ │ │ │ │ + 169 assert(x.size() == SIZE); // Actually this is not needed any more! │ │ │ │ │ + 170 std::copy_n(x.begin(), std::min(static_cast(SIZE),x.size()), │ │ │ │ │ +_data.begin()); │ │ │ │ │ + 171 } │ │ │ │ │ + 172 │ │ │ │ │ + 174 template │ │ │ │ │ +175 explicit FieldVector (const FieldVector & x) │ │ │ │ │ + 176 { │ │ │ │ │ + 177 std::copy_n(x.begin(), SIZE, _data.begin()); │ │ │ │ │ + 178 } │ │ │ │ │ + 179 │ │ │ │ │ + 180 template │ │ │ │ │ +181 explicit FieldVector(const FieldVector&) = delete; │ │ │ │ │ + 182 │ │ │ │ │ + 183 using Base::operator=; │ │ │ │ │ + 184 │ │ │ │ │ + 185 // make this thing a vector │ │ │ │ │ +186 static constexpr size_type size () { return SIZE; } │ │ │ │ │ + 187 │ │ │ │ │ +188 K & operator[](size_type i) { │ │ │ │ │ + 189 DUNE_ASSERT_BOUNDS(i < SIZE); │ │ │ │ │ + 190 return _data[i]; │ │ │ │ │ + 191 } │ │ │ │ │ +192 const K & operator[](size_type i) const { │ │ │ │ │ + 193 DUNE_ASSERT_BOUNDS(i < SIZE); │ │ │ │ │ + 194 return _data[i]; │ │ │ │ │ + 195 } │ │ │ │ │ + 196 │ │ │ │ │ +198 K* data() noexcept │ │ │ │ │ + 199 { │ │ │ │ │ + 200 return _data.data(); │ │ │ │ │ + 201 } │ │ │ │ │ + 202 │ │ │ │ │ +204 const K* data() const noexcept │ │ │ │ │ + 205 { │ │ │ │ │ + 206 return _data.data(); │ │ │ │ │ + 207 } │ │ │ │ │ + 208 │ │ │ │ │ + 210 template ::value, int> = 0> │ │ │ │ │ +212 friend auto operator*( const FieldVector& vector, Scalar scalar) │ │ │ │ │ + 213 { │ │ │ │ │ + 214 FieldVector:: │ │ │ │ │ +PromotedType,SIZE> result; │ │ │ │ │ + 215 │ │ │ │ │ + 216 for (size_type i = 0; i < vector.size(); ++i) │ │ │ │ │ + 217 result[i] = vector[i] * scalar; │ │ │ │ │ + 218 │ │ │ │ │ + 219 return result; │ │ │ │ │ + 220 } │ │ │ │ │ + 221 │ │ │ │ │ + 223 template ::value, int> = 0> │ │ │ │ │ +225 friend auto operator*( Scalar scalar, const FieldVector& vector) │ │ │ │ │ + 226 { │ │ │ │ │ + 227 FieldVector:: │ │ │ │ │ +PromotedType,SIZE> result; │ │ │ │ │ + 228 │ │ │ │ │ + 229 for (size_type i = 0; i < vector.size(); ++i) │ │ │ │ │ + 230 result[i] = scalar * vector[i]; │ │ │ │ │ + 231 │ │ │ │ │ + 232 return result; │ │ │ │ │ + 233 } │ │ │ │ │ + 234 │ │ │ │ │ + 236 template ::value, int> = 0> │ │ │ │ │ +238 friend auto operator/( const FieldVector& vector, Scalar scalar) │ │ │ │ │ + 239 { │ │ │ │ │ + 240 FieldVector:: │ │ │ │ │ +PromotedType,SIZE> result; │ │ │ │ │ + 241 │ │ │ │ │ + 242 for (size_type i = 0; i < vector.size(); ++i) │ │ │ │ │ + 243 result[i] = vector[i] / scalar; │ │ │ │ │ + 244 │ │ │ │ │ + 245 return result; │ │ │ │ │ + 246 } │ │ │ │ │ + 247 │ │ │ │ │ + 248 }; │ │ │ │ │ + 249 │ │ │ │ │ + 261 template │ │ │ │ │ +262 inline std::istream &operator>>( std::istream &in, │ │ │ │ │ + 263 FieldVector &v ) │ │ │ │ │ + 264 { │ │ │ │ │ + 265 FieldVector w; │ │ │ │ │ + 266 for( typename FieldVector::size_type i = 0; i < SIZE; ++i ) │ │ │ │ │ + 267 in >> w[ i ]; │ │ │ │ │ + 268 if(in) │ │ │ │ │ + 269 v = w; │ │ │ │ │ + 270 return in; │ │ │ │ │ + 271 } │ │ │ │ │ + 272 │ │ │ │ │ + 273#ifndef DOXYGEN │ │ │ │ │ + 274 template< class K > │ │ │ │ │ + 275 struct DenseMatVecTraits< FieldVector > │ │ │ │ │ + 276 { │ │ │ │ │ + 277 typedef FieldVector derived_type; │ │ │ │ │ + 278 typedef K container_type; │ │ │ │ │ + 279 typedef K value_type; │ │ │ │ │ + 280 typedef size_t size_type; │ │ │ │ │ + 281 }; │ │ │ │ │ + 282 │ │ │ │ │ + 285 template │ │ │ │ │ + 286 class FieldVector : │ │ │ │ │ + 287 public DenseVector< FieldVector > │ │ │ │ │ + 288 { │ │ │ │ │ + 289 K _data; │ │ │ │ │ + 290 typedef DenseVector< FieldVector > Base; │ │ │ │ │ + 291 public: │ │ │ │ │ + 293 constexpr static int dimension = 1; │ │ │ │ │ + 294 │ │ │ │ │ + 295 typedef typename Base::size_type size_type; │ │ │ │ │ + 296 │ │ │ │ │ + 298 typedef K& reference; │ │ │ │ │ + 299 │ │ │ │ │ + 301 typedef const K& const_reference; │ │ │ │ │ + 302 │ │ │ │ │ + 303 //===== construction │ │ │ │ │ + 304 │ │ │ │ │ + 306 constexpr FieldVector () │ │ │ │ │ + 307 : _data() │ │ │ │ │ + 308 {} │ │ │ │ │ + 309 │ │ │ │ │ + 311 template::value && │ │ │ │ │ + 314 ! std::is_base_of::field_type>, K │ │ │ │ │ + 315 >::value │ │ │ │ │ + 316 >::type │ │ │ │ │ + 317 > │ │ │ │ │ + 318 FieldVector (const T& k) : _data(k) {} │ │ │ │ │ + 319 │ │ │ │ │ + 321 template::value_type>::value, int> = │ │ │ │ │ +0> │ │ │ │ │ + 324 FieldVector (const DenseVector & x) │ │ │ │ │ + 325 { │ │ │ │ │ + 326 static_assert(((bool)IsFieldVectorSizeCorrect::value), "FieldVectors │ │ │ │ │ +do not match in dimension!"); │ │ │ │ │ + 327 assert(x.size() == 1); │ │ │ │ │ + 328 _data = x[0]; │ │ │ │ │ + 329 } │ │ │ │ │ + 330 │ │ │ │ │ + 332 FieldVector(const FieldVector&) = default; │ │ │ │ │ + 333 │ │ │ │ │ + 335 FieldVector& operator=(const FieldVector&) = default; │ │ │ │ │ + 336 │ │ │ │ │ + 337 template │ │ │ │ │ + 338 FieldVector& operator= (const FieldVector& other) │ │ │ │ │ + 339 { │ │ │ │ │ + 340 _data = other[0]; │ │ │ │ │ + 341 return *this; │ │ │ │ │ + 342 } │ │ │ │ │ + 343 │ │ │ │ │ + 344 template │ │ │ │ │ + 345 FieldVector& operator=(const FieldVector&) = delete; │ │ │ │ │ + 346 │ │ │ │ │ + 348 FieldVector (std::initializer_list const &l) │ │ │ │ │ + 349 { │ │ │ │ │ + 350 assert(l.size() == 1); │ │ │ │ │ + 351 _data = *l.begin(); │ │ │ │ │ + 352 } │ │ │ │ │ + 353 │ │ │ │ │ + 355 template::value && │ │ │ │ │ + 358 ! std::is_base_of::field_type>, K │ │ │ │ │ + 359 >::value │ │ │ │ │ + 360 >::type │ │ │ │ │ + 361 > │ │ │ │ │ + 362 inline FieldVector& operator= (const T& k) │ │ │ │ │ + 363 { │ │ │ │ │ + 364 _data = k; │ │ │ │ │ + 365 return *this; │ │ │ │ │ + 366 } │ │ │ │ │ + 367 │ │ │ │ │ + 368 //===== forward methods to container │ │ │ │ │ + 369 static constexpr size_type size () { return 1; } │ │ │ │ │ + 370 │ │ │ │ │ + 371 K & operator[]([[maybe_unused]] size_type i) │ │ │ │ │ + 372 { │ │ │ │ │ + 373 DUNE_ASSERT_BOUNDS(i == 0); │ │ │ │ │ + 374 return _data; │ │ │ │ │ + 375 } │ │ │ │ │ + 376 const K & operator[]([[maybe_unused]] size_type i) const │ │ │ │ │ + 377 { │ │ │ │ │ + 378 DUNE_ASSERT_BOUNDS(i == 0); │ │ │ │ │ + 379 return _data; │ │ │ │ │ + 380 } │ │ │ │ │ + 381 │ │ │ │ │ + 383 K* data() noexcept │ │ │ │ │ + 384 { │ │ │ │ │ + 385 return &_data; │ │ │ │ │ + 386 } │ │ │ │ │ + 387 │ │ │ │ │ + 389 const K* data() const noexcept │ │ │ │ │ + 390 { │ │ │ │ │ + 391 return &_data; │ │ │ │ │ + 392 } │ │ │ │ │ + 393 │ │ │ │ │ + 394 //===== conversion operator │ │ │ │ │ + 395 │ │ │ │ │ + 397 operator K& () { return _data; } │ │ │ │ │ + 398 │ │ │ │ │ + 400 operator const K& () const { return _data; } │ │ │ │ │ + 401 }; │ │ │ │ │ + 402 │ │ │ │ │ + 403 /* ----- FV / FV ----- */ │ │ │ │ │ + 404 /* mostly not necessary as these operations are already covered via the │ │ │ │ │ +cast operator */ │ │ │ │ │ + 405 │ │ │ │ │ + 407 template │ │ │ │ │ + 408 inline bool operator>(const FieldVector& a, const FieldVector& │ │ │ │ │ +b) │ │ │ │ │ + 409 { │ │ │ │ │ + 410 return a[0]>b[0]; │ │ │ │ │ + 411 } │ │ │ │ │ + 412 │ │ │ │ │ + 414 template │ │ │ │ │ + 415 inline bool operator>=(const FieldVector& a, const FieldVector& │ │ │ │ │ +b) │ │ │ │ │ + 416 { │ │ │ │ │ + 417 return a[0]>=b[0]; │ │ │ │ │ + 418 } │ │ │ │ │ + 419 │ │ │ │ │ + 421 template │ │ │ │ │ + 422 inline bool operator<(const FieldVector& a, const FieldVector& │ │ │ │ │ +b) │ │ │ │ │ + 423 { │ │ │ │ │ + 424 return a[0] │ │ │ │ │ + 429 inline bool operator<=(const FieldVector& a, const FieldVector& │ │ │ │ │ +b) │ │ │ │ │ + 430 { │ │ │ │ │ + 431 return a[0]<=b[0]; │ │ │ │ │ + 432 } │ │ │ │ │ + 433 │ │ │ │ │ + 434 /* ----- FV / scalar ----- */ │ │ │ │ │ + 435 │ │ │ │ │ + 437 template │ │ │ │ │ + 438 inline FieldVector operator+(const FieldVector& a, const K b) │ │ │ │ │ + 439 { │ │ │ │ │ + 440 return a[0]+b; │ │ │ │ │ + 441 } │ │ │ │ │ + 442 │ │ │ │ │ + 444 template │ │ │ │ │ + 445 inline FieldVector operator-(const FieldVector& a, const K b) │ │ │ │ │ + 446 { │ │ │ │ │ + 447 return a[0]-b; │ │ │ │ │ + 448 } │ │ │ │ │ + 449 │ │ │ │ │ + 451 template │ │ │ │ │ + 452 inline FieldVector operator*(const FieldVector& a, const K b) │ │ │ │ │ + 453 { │ │ │ │ │ + 454 return a[0]*b; │ │ │ │ │ + 455 } │ │ │ │ │ + 456 │ │ │ │ │ + 458 template │ │ │ │ │ + 459 inline FieldVector operator/(const FieldVector& a, const K b) │ │ │ │ │ + 460 { │ │ │ │ │ + 461 return a[0]/b; │ │ │ │ │ + 462 } │ │ │ │ │ + 463 │ │ │ │ │ + 465 template │ │ │ │ │ + 466 inline bool operator>(const FieldVector& a, const K b) │ │ │ │ │ + 467 { │ │ │ │ │ + 468 return a[0]>b; │ │ │ │ │ + 469 } │ │ │ │ │ + 470 │ │ │ │ │ + 472 template │ │ │ │ │ + 473 inline bool operator>=(const FieldVector& a, const K b) │ │ │ │ │ + 474 { │ │ │ │ │ + 475 return a[0]>=b; │ │ │ │ │ + 476 } │ │ │ │ │ + 477 │ │ │ │ │ + 479 template │ │ │ │ │ + 480 inline bool operator<(const FieldVector& a, const K b) │ │ │ │ │ + 481 { │ │ │ │ │ + 482 return a[0] │ │ │ │ │ + 487 inline bool operator<=(const FieldVector& a, const K b) │ │ │ │ │ + 488 { │ │ │ │ │ + 489 return a[0]<=b; │ │ │ │ │ + 490 } │ │ │ │ │ + 491 │ │ │ │ │ + 493 template │ │ │ │ │ + 494 inline bool operator==(const FieldVector& a, const K b) │ │ │ │ │ + 495 { │ │ │ │ │ + 496 return a[0]==b; │ │ │ │ │ + 497 } │ │ │ │ │ + 498 │ │ │ │ │ + 500 template │ │ │ │ │ + 501 inline bool operator!=(const FieldVector& a, const K b) │ │ │ │ │ + 502 { │ │ │ │ │ + 503 return a[0]!=b; │ │ │ │ │ + 504 } │ │ │ │ │ + 505 │ │ │ │ │ + 506 /* ----- scalar / FV ------ */ │ │ │ │ │ + 507 │ │ │ │ │ + 509 template │ │ │ │ │ + 510 inline FieldVector operator+(const K a, const FieldVector& b) │ │ │ │ │ + 511 { │ │ │ │ │ + 512 return a+b[0]; │ │ │ │ │ + 513 } │ │ │ │ │ + 514 │ │ │ │ │ + 516 template │ │ │ │ │ + 517 inline FieldVector operator-(const K a, const FieldVector& b) │ │ │ │ │ + 518 { │ │ │ │ │ + 519 return a-b[0]; │ │ │ │ │ + 520 } │ │ │ │ │ + 521 │ │ │ │ │ + 523 template │ │ │ │ │ + 524 inline FieldVector operator*(const K a, const FieldVector& b) │ │ │ │ │ + 525 { │ │ │ │ │ + 526 return a*b[0]; │ │ │ │ │ + 527 } │ │ │ │ │ + 528 │ │ │ │ │ + 530 template │ │ │ │ │ + 531 inline FieldVector operator/(const K a, const FieldVector& b) │ │ │ │ │ + 532 { │ │ │ │ │ + 533 return a/b[0]; │ │ │ │ │ + 534 } │ │ │ │ │ + 535 │ │ │ │ │ + 537 template │ │ │ │ │ + 538 inline bool operator>(const K a, const FieldVector& b) │ │ │ │ │ + 539 { │ │ │ │ │ + 540 return a>b[0]; │ │ │ │ │ + 541 } │ │ │ │ │ + 542 │ │ │ │ │ + 544 template │ │ │ │ │ + 545 inline bool operator>=(const K a, const FieldVector& b) │ │ │ │ │ + 546 { │ │ │ │ │ + 547 return a>=b[0]; │ │ │ │ │ + 548 } │ │ │ │ │ + 549 │ │ │ │ │ + 551 template │ │ │ │ │ + 552 inline bool operator<(const K a, const FieldVector& b) │ │ │ │ │ + 553 { │ │ │ │ │ + 554 return a │ │ │ │ │ + 559 inline bool operator<=(const K a, const FieldVector& b) │ │ │ │ │ + 560 { │ │ │ │ │ + 561 return a<=b[0]; │ │ │ │ │ + 562 } │ │ │ │ │ + 563 │ │ │ │ │ + 565 template │ │ │ │ │ + 566 inline bool operator==(const K a, const FieldVector& b) │ │ │ │ │ + 567 { │ │ │ │ │ + 568 return a==b[0]; │ │ │ │ │ + 569 } │ │ │ │ │ + 570 │ │ │ │ │ + 572 template │ │ │ │ │ + 573 inline bool operator!=(const K a, const FieldVector& b) │ │ │ │ │ + 574 { │ │ │ │ │ + 575 return a!=b[0]; │ │ │ │ │ + 576 } │ │ │ │ │ + 577#endif │ │ │ │ │ + 578 │ │ │ │ │ + 579 /* Overloads for common classification functions */ │ │ │ │ │ +580 namespace MathOverloads { │ │ │ │ │ + 581 │ │ │ │ │ + 582 // ! Returns whether all entries are finite │ │ │ │ │ + 583 template │ │ │ │ │ +584 auto isFinite(const FieldVector &b, PriorityTag<2>, ADLTag) { │ │ │ │ │ + 585 bool out = true; │ │ │ │ │ + 586 for(int i=0; i │ │ │ │ │ +594 bool isInf(const FieldVector &b, PriorityTag<2>, ADLTag) { │ │ │ │ │ + 595 bool out = false; │ │ │ │ │ + 596 for(int i=0; i::value>> │ │ │ │ │ +604 bool isNaN(const FieldVector &b, PriorityTag<2>, ADLTag) { │ │ │ │ │ + 605 bool out = false; │ │ │ │ │ + 606 for(int i=0; i::value>> │ │ │ │ │ +614 bool isUnordered(const FieldVector &b, const FieldVector &c, │ │ │ │ │ + 615 PriorityTag<2>, ADLTag) { │ │ │ │ │ + 616 return Dune::isUnordered(b[0],c[0]); │ │ │ │ │ + 617 } │ │ │ │ │ + 618 } //MathOverloads │ │ │ │ │ + 619 │ │ │ │ │ + 622} // end namespace │ │ │ │ │ + 623 │ │ │ │ │ + 624#endif │ │ │ │ │ +promotiontraits.hh │ │ │ │ │ +Compute type of the result of an arithmetic operation involving two different │ │ │ │ │ +number types. │ │ │ │ │ +typetraits.hh │ │ │ │ │ +Traits for type conversions and type information. │ │ │ │ │ +ftraits.hh │ │ │ │ │ +Type traits to determine the type of reals (when working with complex numbers) │ │ │ │ │ +densevector.hh │ │ │ │ │ +Implements the dense vector interface, with an exchangeable storage class. │ │ │ │ │ +boundschecking.hh │ │ │ │ │ +Macro for wrapping boundary checks. │ │ │ │ │ +exceptions.hh │ │ │ │ │ +A few common exception classes. │ │ │ │ │ +math.hh │ │ │ │ │ +Some useful basic math stuff. │ │ │ │ │ +DUNE_ASSERT_BOUNDS │ │ │ │ │ +#define DUNE_ASSERT_BOUNDS(cond) │ │ │ │ │ +If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do │ │ │ │ │ +nothing. │ │ │ │ │ +Definition: boundschecking.hh:30 │ │ │ │ │ +Dune::operator* │ │ │ │ │ +bigunsignedint< k > operator*(const bigunsignedint< k > &x, std::uintmax_t y) │ │ │ │ │ +Definition: bigunsignedint.hh:549 │ │ │ │ │ +Dune::operator/ │ │ │ │ │ +bigunsignedint< k > operator/(const bigunsignedint< k > &x, std::uintmax_t y) │ │ │ │ │ +Definition: bigunsignedint.hh:556 │ │ │ │ │ +Dune::operator- │ │ │ │ │ +bigunsignedint< k > operator-(const bigunsignedint< k > &x, std::uintmax_t y) │ │ │ │ │ +Definition: bigunsignedint.hh:542 │ │ │ │ │ +Dune::operator+ │ │ │ │ │ +bigunsignedint< k > operator+(const bigunsignedint< k > &x, std::uintmax_t y) │ │ │ │ │ +Definition: bigunsignedint.hh:535 │ │ │ │ │ +Dune::DynamicVector::operator>> │ │ │ │ │ +std::istream & operator>>(std::istream &in, DynamicVector< K, Allocator > &v) │ │ │ │ │ +Read a DynamicVector from an input stream. │ │ │ │ │ +Definition: dynvector.hh:189 │ │ │ │ │ +Dune::operator< │ │ │ │ │ +EnableIfInterOperable< T1, T2, bool >::type operator<(const │ │ │ │ │ +RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const │ │ │ │ │ +RandomAccessIteratorFacade< T2, V2, R2, D > &rhs) │ │ │ │ │ +Comparison operator. │ │ │ │ │ +Definition: iteratorfacades.hh:637 │ │ │ │ │ +Dune::operator> │ │ │ │ │ +EnableIfInterOperable< T1, T2, bool >::type operator>(const │ │ │ │ │ +RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const │ │ │ │ │ +RandomAccessIteratorFacade< T2, V2, R2, D > &rhs) │ │ │ │ │ +Comparison operator. │ │ │ │ │ +Definition: iteratorfacades.hh:683 │ │ │ │ │ +Dune::operator<= │ │ │ │ │ +EnableIfInterOperable< T1, T2, bool >::type operator<=(const │ │ │ │ │ +RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const │ │ │ │ │ +RandomAccessIteratorFacade< T2, V2, R2, D > &rhs) │ │ │ │ │ +Comparison operator. │ │ │ │ │ +Definition: iteratorfacades.hh:660 │ │ │ │ │ +Dune::operator== │ │ │ │ │ +EnableIfInterOperable< T1, T2, bool >::type operator==(const │ │ │ │ │ +ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, │ │ │ │ │ +V2, R2, D > &rhs) │ │ │ │ │ +Checks for equality. │ │ │ │ │ +Definition: iteratorfacades.hh:237 │ │ │ │ │ +Dune::operator>= │ │ │ │ │ +EnableIfInterOperable< T1, T2, bool >::type operator>=(const │ │ │ │ │ +RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const │ │ │ │ │ +RandomAccessIteratorFacade< T2, V2, R2, D > &rhs) │ │ │ │ │ +Comparison operator. │ │ │ │ │ +Definition: iteratorfacades.hh:705 │ │ │ │ │ +Dune::operator!= │ │ │ │ │ +EnableIfInterOperable< T1, T2, bool >::type operator!=(const │ │ │ │ │ +ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, │ │ │ │ │ +V2, R2, D > &rhs) │ │ │ │ │ +Checks for inequality. │ │ │ │ │ +Definition: iteratorfacades.hh:259 │ │ │ │ │ +Dune::Simd::Scalar │ │ │ │ │ +typename Overloads::ScalarType< std::decay_t< V > >::type Scalar │ │ │ │ │ +Element type of some SIMD type. │ │ │ │ │ +Definition: simd/interface.hh:235 │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::makeToUnique │ │ │ │ │ -std::unique_ptr< T > makeToUnique(Args &&... args) │ │ │ │ │ -Alias for std::make_unique introduced as transition wrapper. │ │ │ │ │ -Definition: to_unique_ptr.hh:23 │ │ │ │ │ -Dune::ToUniquePtr │ │ │ │ │ -std::unique_ptr< T > ToUniquePtr │ │ │ │ │ -Alias for std::unique_ptr introduced as transition wrapper. │ │ │ │ │ -Definition: to_unique_ptr.hh:18 │ │ │ │ │ +Dune::AlignedNumberImpl::min │ │ │ │ │ +auto min(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > │ │ │ │ │ +&b) │ │ │ │ │ +Definition: debugalign.hh:447 │ │ │ │ │ +Dune::MathOverloads::isNaN │ │ │ │ │ +bool isNaN(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag) │ │ │ │ │ +Definition: fvector.hh:604 │ │ │ │ │ +Dune::MathOverloads::isInf │ │ │ │ │ +bool isInf(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag) │ │ │ │ │ +Definition: fvector.hh:594 │ │ │ │ │ +Dune::MathOverloads::isFinite │ │ │ │ │ +auto isFinite(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag) │ │ │ │ │ +Definition: fvector.hh:584 │ │ │ │ │ +Dune::MathOverloads::isUnordered │ │ │ │ │ +bool isUnordered(const FieldVector< K, 1 > &b, const FieldVector< K, 1 > &c, │ │ │ │ │ +PriorityTag< 2 >, ADLTag) │ │ │ │ │ +Definition: fvector.hh:614 │ │ │ │ │ +Dune::FieldVector │ │ │ │ │ +vector space out of a tensor product of fields. │ │ │ │ │ +Definition: fvector.hh:95 │ │ │ │ │ +Dune::FieldVector::data │ │ │ │ │ +K * data() noexcept │ │ │ │ │ +return pointer to underlying array │ │ │ │ │ +Definition: fvector.hh:198 │ │ │ │ │ +Dune::FieldVector::FieldVector │ │ │ │ │ +constexpr FieldVector() │ │ │ │ │ +Constructor making default-initialized vector. │ │ │ │ │ +Definition: fvector.hh:112 │ │ │ │ │ +Dune::FieldVector::const_reference │ │ │ │ │ +const value_type & const_reference │ │ │ │ │ +The type used for const references to the vector entry. │ │ │ │ │ +Definition: fvector.hh:109 │ │ │ │ │ +Dune::FieldVector::size_type │ │ │ │ │ +Base::size_type size_type │ │ │ │ │ +Definition: fvector.hh:102 │ │ │ │ │ +Dune::FieldVector::FieldVector │ │ │ │ │ +FieldVector(const DenseVector< C > &x, typename std::enable_if< │ │ │ │ │ +IsFieldVectorSizeCorrect< C, SIZE >::value >::type *dummy=0) │ │ │ │ │ +Copy constructor from a second vector of possibly different type. │ │ │ │ │ +Definition: fvector.hh:165 │ │ │ │ │ +Dune::FieldVector::FieldVector │ │ │ │ │ +FieldVector(const FieldVector< T, N > &)=delete │ │ │ │ │ +Dune::FieldVector::FieldVector │ │ │ │ │ +FieldVector(const K &t) │ │ │ │ │ +Constructor making vector with identical coordinates. │ │ │ │ │ +Definition: fvector.hh:117 │ │ │ │ │ +Dune::FieldVector::FieldVector │ │ │ │ │ +FieldVector(std::initializer_list< K > const &l) │ │ │ │ │ +Construct from a std::initializer_list. │ │ │ │ │ +Definition: fvector.hh:132 │ │ │ │ │ +Dune::FieldVector::data │ │ │ │ │ +const K * data() const noexcept │ │ │ │ │ +return pointer to underlying array │ │ │ │ │ +Definition: fvector.hh:204 │ │ │ │ │ +Dune::FieldVector::dimension │ │ │ │ │ +static constexpr int dimension │ │ │ │ │ +The size of this vector. │ │ │ │ │ +Definition: fvector.hh:100 │ │ │ │ │ +Dune::FieldVector::FieldVector │ │ │ │ │ +FieldVector(const FieldVector< K1, SIZE > &x) │ │ │ │ │ +Constructor making vector with identical coordinates. │ │ │ │ │ +Definition: fvector.hh:175 │ │ │ │ │ +Dune::FieldVector::size │ │ │ │ │ +static constexpr size_type size() │ │ │ │ │ +Definition: fvector.hh:186 │ │ │ │ │ +Dune::FieldVector::operator[] │ │ │ │ │ +K & operator[](size_type i) │ │ │ │ │ +Definition: fvector.hh:188 │ │ │ │ │ +Dune::FieldVector::reference │ │ │ │ │ +value_type & reference │ │ │ │ │ +The type used for references to the vector entry. │ │ │ │ │ +Definition: fvector.hh:106 │ │ │ │ │ +Dune::FieldVector::value_type │ │ │ │ │ +Base::value_type value_type │ │ │ │ │ +Definition: fvector.hh:103 │ │ │ │ │ +Dune::FieldVector::operator[] │ │ │ │ │ +const K & operator[](size_type i) const │ │ │ │ │ +Definition: fvector.hh:192 │ │ │ │ │ +Dune::FieldVector::operator= │ │ │ │ │ +FieldVector & operator=(const FieldVector< T, N > &)=delete │ │ │ │ │ +Dune::FieldVector::FieldVector │ │ │ │ │ +FieldVector(const FieldVector &)=default │ │ │ │ │ +Copy constructor. │ │ │ │ │ +Dune::DenseVector │ │ │ │ │ +Interface for a class of dense vectors over a given field. │ │ │ │ │ +Definition: densevector.hh:229 │ │ │ │ │ +Dune::DenseVector<_FieldVector<_K,_SIZE_>_>::value_type │ │ │ │ │ +Traits::value_type value_type │ │ │ │ │ +export the type representing the field │ │ │ │ │ +Definition: densevector.hh:250 │ │ │ │ │ +Dune::DenseVector::begin │ │ │ │ │ +Iterator begin() │ │ │ │ │ +begin iterator │ │ │ │ │ +Definition: densevector.hh:347 │ │ │ │ │ +Dune::DenseVector::size │ │ │ │ │ +size_type size() const │ │ │ │ │ +size method │ │ │ │ │ +Definition: densevector.hh:336 │ │ │ │ │ +Dune::DenseVector<_FieldVector<_K,_SIZE_>_>::size_type │ │ │ │ │ +Traits::size_type size_type │ │ │ │ │ +The type used for the index access and size operation. │ │ │ │ │ +Definition: densevector.hh:259 │ │ │ │ │ +Dune::FieldTraits │ │ │ │ │ +Definition: ftraits.hh:26 │ │ │ │ │ +Dune::FieldTraits::field_type │ │ │ │ │ +T field_type │ │ │ │ │ +export the type representing the field │ │ │ │ │ +Definition: ftraits.hh:28 │ │ │ │ │ +Dune::FieldTraits::real_type │ │ │ │ │ +T real_type │ │ │ │ │ +export the type representing the real type of the field │ │ │ │ │ +Definition: ftraits.hh:30 │ │ │ │ │ +Dune::DenseMatVecTraits<_FieldVector<_K,_SIZE_>_>::value_type │ │ │ │ │ +K value_type │ │ │ │ │ +Definition: fvector.hh:45 │ │ │ │ │ +Dune::DenseMatVecTraits<_FieldVector<_K,_SIZE_>_>::container_type │ │ │ │ │ +std::array< K, SIZE > container_type │ │ │ │ │ +Definition: fvector.hh:44 │ │ │ │ │ +Dune::DenseMatVecTraits<_FieldVector<_K,_SIZE_>_>::size_type │ │ │ │ │ +container_type::size_type size_type │ │ │ │ │ +Definition: fvector.hh:46 │ │ │ │ │ +Dune::DenseMatVecTraits<_FieldVector<_K,_SIZE_>_>::derived_type │ │ │ │ │ +FieldVector< K, SIZE > derived_type │ │ │ │ │ +Definition: fvector.hh:43 │ │ │ │ │ +Dune::FieldTraits<_FieldVector<_K,_SIZE_>_>::real_type │ │ │ │ │ +FieldTraits< K >::real_type real_type │ │ │ │ │ +Definition: fvector.hh:53 │ │ │ │ │ +Dune::FieldTraits<_FieldVector<_K,_SIZE_>_>::field_type │ │ │ │ │ +FieldTraits< K >::field_type field_type │ │ │ │ │ +Definition: fvector.hh:52 │ │ │ │ │ +Dune::IsFieldVectorSizeCorrect │ │ │ │ │ +TMP to check the size of a DenseVectors statically, if possible. │ │ │ │ │ +Definition: fvector.hh:66 │ │ │ │ │ +Dune::IsFieldVectorSizeCorrect::value │ │ │ │ │ +static constexpr bool value │ │ │ │ │ +True if C is not of type FieldVector or its dimension is not equal SIZE. │ │ │ │ │ +Definition: fvector.hh:71 │ │ │ │ │ +Dune::MathOverloads::ADLTag │ │ │ │ │ +Tag to make sure the functions in this namespace can be found by ADL. │ │ │ │ │ +Definition: math.hh:230 │ │ │ │ │ +Dune::DenseMatVecTraits │ │ │ │ │ +Definition: matvectraits.hh:31 │ │ │ │ │ +Dune::PriorityTag │ │ │ │ │ +Helper class for tagging priorities. │ │ │ │ │ +Definition: typeutilities.hh:73 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00101.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: debugstream.hh File Reference │ │ │ │ +dune-common: ftraits.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -64,63 +64,47 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Typedefs
│ │ │ │ -
debugstream.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
ftraits.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

Defines several output streams for messages of different importance. │ │ │ │ +

Type traits to determine the type of reals (when working with complex numbers) │ │ │ │ More...

│ │ │ │ -
#include <iostream>
│ │ │ │ -#include <stack>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ +
#include <complex>
│ │ │ │ +#include <vector>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::greater_or_equal< current, threshold >
 Greater or equal template test. More...
struct  Dune::FieldTraits< T >
 
struct  Dune::common_bits< current, mask >
 activate if current and mask have common bits switched on. More...
struct  Dune::FieldTraits< const T >
 
class  Dune::DebugStreamError
 standard exception for the debugstream More...
struct  Dune::FieldTraits< std::complex< T > >
 
class  Dune::StreamWrap
struct  Dune::FieldTraits< T[N] >
 
class  Dune::DebugStreamState
 Intermediate class to implement tie-operation of DebugStream. More...
 
class  Dune::DebugStream< thislevel, dlevel, alevel, activator >
 Generic class to implement debug output streams. More...
struct  Dune::FieldTraits< std::vector< T > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

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

│ │ │ │ -Typedefs

typedef unsigned int Dune::DebugLevel
 Type for debug levels. More...
 
│ │ │ │

Detailed Description

│ │ │ │ -

Defines several output streams for messages of different importance.

│ │ │ │ -

This file implements the class DebugStream to support output in a variety of debug levels. Additionally, template parameters control if the output operation is really performed so that unused debug levels can be deactivated

│ │ │ │ +

Type traits to determine the type of reals (when working with complex numbers)

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,49 +4,34 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Classes | Namespaces | Typedefs │ │ │ │ │ -debugstream.hh File Reference │ │ │ │ │ -Common » Debug_output │ │ │ │ │ -Defines several output streams for messages of different importance. More... │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces │ │ │ │ │ +ftraits.hh File Reference │ │ │ │ │ +Type traits to determine the type of reals (when working with complex numbers) │ │ │ │ │ +More... │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -struct  Dune::greater_or_equal<_current,_threshold_> │ │ │ │ │ -  Greater or equal template test. More... │ │ │ │ │ +struct  Dune::FieldTraits<_T_> │ │ │ │ │   │ │ │ │ │ -struct  Dune::common_bits<_current,_mask_> │ │ │ │ │ -  activate if current and mask have common bits switched on. More... │ │ │ │ │ +struct  Dune::FieldTraits<_const_T_> │ │ │ │ │   │ │ │ │ │ - class  Dune::DebugStreamError │ │ │ │ │ -  standard exception for the debugstream More... │ │ │ │ │ +struct  Dune::FieldTraits<_std::complex<_T_>_> │ │ │ │ │   │ │ │ │ │ - class  Dune::StreamWrap │ │ │ │ │ +struct  Dune::FieldTraits<_T[N]_> │ │ │ │ │   │ │ │ │ │ - class  Dune::DebugStreamState │ │ │ │ │ -  Intermediate class to implement tie-operation of DebugStream. More... │ │ │ │ │ -  │ │ │ │ │ - class  Dune::DebugStream<_thislevel,_dlevel,_alevel,_activator_> │ │ │ │ │ -  Generic class to implement debug output streams. More... │ │ │ │ │ +struct  Dune::FieldTraits<_std::vector<_T_>_> │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ - Typedefs │ │ │ │ │ -typedef unsigned int Dune::DebugLevel │ │ │ │ │ -  Type for debug levels. More... │ │ │ │ │ -  │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -Defines several output streams for messages of different importance. │ │ │ │ │ -This file implements the class DebugStream to support output in a variety of │ │ │ │ │ -debug levels. Additionally, template parameters control if the output operation │ │ │ │ │ -is really performed so that unused debug levels can be deactivated │ │ │ │ │ +Type traits to determine the type of reals (when working with complex numbers) │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00101_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: debugstream.hh Source File │ │ │ │ +dune-common: ftraits.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,296 +62,80 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
debugstream.hh
│ │ │ │ +
ftraits.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 (C) 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_DEBUGSTREAM_HH
│ │ │ │ -
7#define DUNE_DEBUGSTREAM_HH
│ │ │ │ -
8
│ │ │ │ -
13#include <iostream>
│ │ │ │ -
14#include <stack>
│ │ │ │ -
15
│ │ │ │ - │ │ │ │ -
17
│ │ │ │ -
18namespace Dune {
│ │ │ │ -
19
│ │ │ │ -
118 typedef unsigned int DebugLevel;
│ │ │ │ -
119
│ │ │ │ -
129 template <DebugLevel current, DebugLevel threshold>
│ │ │ │ - │ │ │ │ -
131 constexpr static bool value = (current >= threshold);
│ │ │ │ -
132 };
│ │ │ │ -
133
│ │ │ │ -
134
│ │ │ │ -
141 template <DebugLevel current, DebugLevel mask>
│ │ │ │ -
142 struct common_bits {
│ │ │ │ -
143 constexpr static bool value = ((current & mask) != 0);
│ │ │ │ -
144 };
│ │ │ │ -
145
│ │ │ │ -
146
│ │ │ │ -
148 class DebugStreamError : public IOError {};
│ │ │ │ -
149
│ │ │ │ - │ │ │ │ -
151 public:
│ │ │ │ -
152 StreamWrap(std::ostream& _out) : out(_out) { }
│ │ │ │ -
153 std::ostream& out;
│ │ │ │ - │ │ │ │ -
155 };
│ │ │ │ -
156
│ │ │ │ - │ │ │ │ -
159 // !!! should be protected somehow but that won't be easy
│ │ │ │ -
160 public:
│ │ │ │ - │ │ │ │ -
163
│ │ │ │ - │ │ │ │ -
166
│ │ │ │ -
168 bool _tied;
│ │ │ │ -
169
│ │ │ │ -
171 unsigned int _tied_streams;
│ │ │ │ -
172 };
│ │ │ │ -
173
│ │ │ │ -
188 template <DebugLevel thislevel = 1,
│ │ │ │ -
189 DebugLevel dlevel = 1,
│ │ │ │ -
190 DebugLevel alevel = 1,
│ │ │ │ -
191 template<DebugLevel, DebugLevel> class activator = greater_or_equal>
│ │ │ │ - │ │ │ │ -
193 public:
│ │ │ │ -
199 DebugStream(std::ostream& out = std::cerr) {
│ │ │ │ -
200 // start a new list of streams
│ │ │ │ -
201 current = new StreamWrap(out);
│ │ │ │ -
202 current->next = 0;
│ │ │ │ -
203
│ │ │ │ -
204 // check if we are above the default activation level
│ │ │ │ -
205 _active = activator<thislevel,alevel>::value;
│ │ │ │ -
206
│ │ │ │ -
207 // we're not tied to another DebugStream
│ │ │ │ -
208 _tied = false;
│ │ │ │ -
209
│ │ │ │ -
210 // no child streams yet
│ │ │ │ -
211 _tied_streams = 0;
│ │ │ │ -
212 }
│ │ │ │ -
213
│ │ │ │ - │ │ │ │ -
220 std::ostream& fallback = std::cerr)
│ │ │ │ -
221 {
│ │ │ │ -
222 // start a new list of streams
│ │ │ │ -
223 current = new StreamWrap(fallback);
│ │ │ │ -
224 current->next = 0;
│ │ │ │ -
225
│ │ │ │ -
226 // check if we are above the default activation level
│ │ │ │ -
227 _active = activator<thislevel,alevel>::value;
│ │ │ │ -
228 _tied_streams = 0;
│ │ │ │ -
229
│ │ │ │ -
230 // tie to the provided stream
│ │ │ │ -
231 _tied = true;
│ │ │ │ -
232 tiedstate = &master;
│ │ │ │ -
233 tiedstate->_tied_streams++;
│ │ │ │ -
234 }
│ │ │ │ -
235
│ │ │ │ - │ │ │ │ -
244 {
│ │ │ │ -
245 // untie
│ │ │ │ -
246 if (_tied)
│ │ │ │ -
247 tiedstate->_tied_streams--;
│ │ │ │ -
248 else {
│ │ │ │ -
249 // check if somebody still ties to us...
│ │ │ │ -
250 if (_tied_streams != 0)
│ │ │ │ -
251 {
│ │ │ │ -
252 std::cerr << "DebugStream destructor is called while other streams are still tied to it. Terminating!" << std::endl;
│ │ │ │ -
253 std::terminate();
│ │ │ │ -
254 }
│ │ │ │ -
255 }
│ │ │ │ -
256
│ │ │ │ -
257 // remove ostream-stack
│ │ │ │ -
258 while (current != 0) {
│ │ │ │ -
259 StreamWrap *s = current;
│ │ │ │ - │ │ │ │ -
261 delete s;
│ │ │ │ -
262 }
│ │ │ │ -
263 }
│ │ │ │ -
264
│ │ │ │ -
266 template <class T>
│ │ │ │ -
267 DebugStream& operator<<(const T data) {
│ │ │ │ -
268 // remove the following code if stream wasn't compiled active
│ │ │ │ -
269 if (activator<thislevel, dlevel>::value) {
│ │ │ │ -
270 if (! _tied) {
│ │ │ │ -
271 if (_active)
│ │ │ │ -
272 current->out << data;
│ │ │ │ -
273 } else {
│ │ │ │ -
274 if (_active && tiedstate->_active)
│ │ │ │ -
275 tiedstate->current->out << data;
│ │ │ │ -
276 }
│ │ │ │ -
277 }
│ │ │ │ -
278
│ │ │ │ -
279 return *this;
│ │ │ │ -
280 }
│ │ │ │ -
281
│ │ │ │ -
289 DebugStream& operator<<(const int data) {
│ │ │ │ -
290 // remove the following code if stream wasn't compiled active
│ │ │ │ -
291 if (activator<thislevel, dlevel>::value) {
│ │ │ │ -
292 if (! _tied) {
│ │ │ │ -
293 if (_active)
│ │ │ │ -
294 current->out << data;
│ │ │ │ -
295 } else {
│ │ │ │ -
296 if (_active && tiedstate->_active)
│ │ │ │ -
297 tiedstate->current->out << data;
│ │ │ │ -
298 }
│ │ │ │ -
299 }
│ │ │ │ -
300
│ │ │ │ -
301 return *this;
│ │ │ │ -
302 }
│ │ │ │ -
303
│ │ │ │ -
305 DebugStream& operator<<(std::ostream& (*f)(std::ostream&)) {
│ │ │ │ -
306 if (activator<thislevel, dlevel>::value) {
│ │ │ │ -
307 if (! _tied) {
│ │ │ │ -
308 if (_active)
│ │ │ │ -
309 f(current->out);
│ │ │ │ -
310 } else {
│ │ │ │ -
311 if (_active && tiedstate->_active)
│ │ │ │ -
312 f(tiedstate->current->out);
│ │ │ │ -
313 }
│ │ │ │ -
314 }
│ │ │ │ -
315
│ │ │ │ -
316 return *this;
│ │ │ │ -
317 }
│ │ │ │ -
318
│ │ │ │ - │ │ │ │ -
321 if (activator<thislevel, dlevel>::value) {
│ │ │ │ -
322 if (! _tied) {
│ │ │ │ -
323 if (_active)
│ │ │ │ -
324 current->out.flush();
│ │ │ │ -
325 } else {
│ │ │ │ -
326 if (_active && tiedstate->_active)
│ │ │ │ -
327 tiedstate->current->out.flush();
│ │ │ │ -
328 }
│ │ │ │ -
329 }
│ │ │ │ -
330
│ │ │ │ -
331 return *this;
│ │ │ │ -
332 }
│ │ │ │ -
333
│ │ │ │ -
335 void push(bool b) {
│ │ │ │ -
336 // are we at all active?
│ │ │ │ -
337 if (activator<thislevel,alevel>::value) {
│ │ │ │ -
338 _actstack.push(_active);
│ │ │ │ -
339 _active = b;
│ │ │ │ -
340 } else {
│ │ │ │ -
341 // stay off
│ │ │ │ -
342 _actstack.push(false);
│ │ │ │ -
343 }
│ │ │ │ -
344 }
│ │ │ │ -
345
│ │ │ │ -
349 void pop() {
│ │ │ │ -
350 if (_actstack.empty())
│ │ │ │ -
351 DUNE_THROW(DebugStreamError, "No previous activation setting!");
│ │ │ │ -
352
│ │ │ │ -
353 _active = _actstack.top();
│ │ │ │ -
354 _actstack.pop();
│ │ │ │ -
355 }
│ │ │ │ -
356
│ │ │ │ -
363 bool active() const {
│ │ │ │ -
364 return activator<thislevel, dlevel>::value && _active;
│ │ │ │ -
365 }
│ │ │ │ -
366
│ │ │ │ -
371 void attach(std::ostream& stream) {
│ │ │ │ -
372 if (_tied)
│ │ │ │ -
373 DUNE_THROW(DebugStreamError, "Cannot attach to a tied stream!");
│ │ │ │ -
374
│ │ │ │ -
375 StreamWrap* newcurr = new StreamWrap(stream);
│ │ │ │ -
376 newcurr->next = current;
│ │ │ │ -
377 current = newcurr;
│ │ │ │ -
378 }
│ │ │ │ -
379
│ │ │ │ -
383 void detach() {
│ │ │ │ -
384 if (current->next == 0)
│ │ │ │ -
385 DUNE_THROW(DebugStreamError, "Cannot detach initial stream!");
│ │ │ │ -
386 if (_tied)
│ │ │ │ -
387 DUNE_THROW(DebugStreamError, "Cannot detach a tied stream!");
│ │ │ │ -
388
│ │ │ │ -
389 StreamWrap* old = current;
│ │ │ │ - │ │ │ │ -
391 delete old;
│ │ │ │ -
392 }
│ │ │ │ -
393
│ │ │ │ - │ │ │ │ -
398 if (to._tied)
│ │ │ │ -
399 DUNE_THROW(DebugStreamError, "Cannot tie to an already tied stream!");
│ │ │ │ -
400 if (_tied)
│ │ │ │ -
401 DUNE_THROW(DebugStreamError, "Stream already tied: untie first!");
│ │ │ │ -
402
│ │ │ │ -
403 _tied = true;
│ │ │ │ -
404 tiedstate = &to;
│ │ │ │ -
405
│ │ │ │ -
406 // tell master class
│ │ │ │ -
407 tiedstate->_tied_streams++;
│ │ │ │ -
408 }
│ │ │ │ -
409
│ │ │ │ -
413 void untie() {
│ │ │ │ -
414 if(! _tied)
│ │ │ │ -
415 DUNE_THROW(DebugStreamError, "Cannot untie, stream is not tied!");
│ │ │ │ -
416
│ │ │ │ -
417 tiedstate->_tied_streams--;
│ │ │ │ -
418 _tied = false;
│ │ │ │ -
419 tiedstate = 0;
│ │ │ │ -
420 }
│ │ │ │ -
421
│ │ │ │ -
422 private:
│ │ │ │ -
424 DebugStreamState* tiedstate;
│ │ │ │ -
425
│ │ │ │ -
430 std::stack<bool> _actstack;
│ │ │ │ -
431 };
│ │ │ │ -
432
│ │ │ │ -
434}
│ │ │ │ -
435
│ │ │ │ -
436
│ │ │ │ -
437#endif
│ │ │ │ -
A few common exception classes.
│ │ │ │ -
StreamWrap(std::ostream &_out)
Definition: debugstream.hh:152
│ │ │ │ -
DebugStream(std::ostream &out=std::cerr)
Create a DebugStream and set initial output stream.
Definition: debugstream.hh:199
│ │ │ │ -
void untie()
Untie stream.
Definition: debugstream.hh:413
│ │ │ │ -
DebugStream & flush()
pass on flush to underlying output stream
Definition: debugstream.hh:320
│ │ │ │ -
void attach(std::ostream &stream)
set output to a different stream.
Definition: debugstream.hh:371
│ │ │ │ -
void detach()
detach current output stream and restore to previous stream
Definition: debugstream.hh:383
│ │ │ │ -
static constexpr bool value
Definition: debugstream.hh:143
│ │ │ │ -
std::ostream & out
Definition: debugstream.hh:153
│ │ │ │ -
void pop()
restore previously set activation flag
Definition: debugstream.hh:349
│ │ │ │ -
bool active() const
reports if this stream will produce output
Definition: debugstream.hh:363
│ │ │ │ -
bool _active
flag to switch output during runtime
Definition: debugstream.hh:165
│ │ │ │ -
unsigned int _tied_streams
how many streams are tied to this state
Definition: debugstream.hh:171
│ │ │ │ -
void tie(DebugStreamState &to)
Tie a stream to this one.
Definition: debugstream.hh:397
│ │ │ │ -
void push(bool b)
set activation flag and store old value
Definition: debugstream.hh:335
│ │ │ │ -
unsigned int DebugLevel
Type for debug levels.
Definition: debugstream.hh:118
│ │ │ │ -
bool _tied
are we tied to another DebugStream?
Definition: debugstream.hh:168
│ │ │ │ -
StreamWrap * current
current output stream and link to possibly pushed old output streams
Definition: debugstream.hh:162
│ │ │ │ -
DebugStream & operator<<(const T data)
Generic types are passed on to current output stream.
Definition: debugstream.hh:267
│ │ │ │ -
static constexpr bool value
Definition: debugstream.hh:131
│ │ │ │ -
~DebugStream()
Destroy stream.
Definition: debugstream.hh:243
│ │ │ │ -
DebugStream(DebugStreamState &master, std::ostream &fallback=std::cerr)
Create a DebugStream and directly tie to another DebugStream.
Definition: debugstream.hh:219
│ │ │ │ -
DebugStream & operator<<(const int data)
explicit specialization so that enums can be printed
Definition: debugstream.hh:289
│ │ │ │ -
DebugStream & operator<<(std::ostream &(*f)(std::ostream &))
pass on manipulators to underlying output stream
Definition: debugstream.hh:305
│ │ │ │ -
StreamWrap * next
Definition: debugstream.hh:154
│ │ │ │ -
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
│ │ │ │ -
Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v)
implements Simd::mask()
Definition: defaults.hh:153
│ │ │ │ +
5#ifndef DUNE_FTRAITS_HH
│ │ │ │ +
6#define DUNE_FTRAITS_HH
│ │ │ │ +
7
│ │ │ │ +
12#include <complex>
│ │ │ │ +
13#include <vector>
│ │ │ │ +
14
│ │ │ │ +
15namespace Dune {
│ │ │ │ +
16
│ │ │ │ +
24 template<class T>
│ │ │ │ + │ │ │ │ +
26 {
│ │ │ │ +
28 typedef T field_type;
│ │ │ │ +
30 typedef T real_type;
│ │ │ │ +
31 };
│ │ │ │ +
32
│ │ │ │ +
33 template<class T>
│ │ │ │ +
34 struct FieldTraits<const T>
│ │ │ │ +
35 {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
38 };
│ │ │ │ +
39
│ │ │ │ +
40 template<class T>
│ │ │ │ +
41 struct FieldTraits< std::complex<T> >
│ │ │ │ +
42 {
│ │ │ │ +
43 typedef std::complex<T> field_type;
│ │ │ │ +
44 typedef T real_type;
│ │ │ │ +
45 };
│ │ │ │ +
46
│ │ │ │ +
47 template<class T, unsigned int N>
│ │ │ │ +
48 struct FieldTraits< T[N] >
│ │ │ │ +
49 {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
52 };
│ │ │ │ +
53
│ │ │ │ +
54 template<class T>
│ │ │ │ +
55 struct FieldTraits< std::vector<T> >
│ │ │ │ +
56 {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
59 };
│ │ │ │ +
60
│ │ │ │ +
61} // end namespace Dune
│ │ │ │ +
62
│ │ │ │ +
63#endif // DUNE_FTRAITS_HH
│ │ │ │ +
STL namespace.
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
Greater or equal template test.
Definition: debugstream.hh:130
│ │ │ │ -
activate if current and mask have common bits switched on.
Definition: debugstream.hh:142
│ │ │ │ -
standard exception for the debugstream
Definition: debugstream.hh:148
│ │ │ │ -
Definition: debugstream.hh:150
│ │ │ │ -
Intermediate class to implement tie-operation of DebugStream.
Definition: debugstream.hh:158
│ │ │ │ -
Generic class to implement debug output streams.
Definition: debugstream.hh:192
│ │ │ │ -
Default exception class for I/O errors.
Definition: exceptions.hh:231
│ │ │ │ +
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
│ │ │ │ +
FieldTraits< T >::field_type field_type
Definition: ftraits.hh:36
│ │ │ │ +
FieldTraits< T >::real_type real_type
Definition: ftraits.hh:37
│ │ │ │ +
T real_type
Definition: ftraits.hh:44
│ │ │ │ +
std::complex< T > field_type
Definition: ftraits.hh:43
│ │ │ │ +
FieldTraits< T >::field_type field_type
Definition: ftraits.hh:50
│ │ │ │ +
FieldTraits< T >::real_type real_type
Definition: ftraits.hh:51
│ │ │ │ +
FieldTraits< T >::real_type real_type
Definition: ftraits.hh:58
│ │ │ │ +
FieldTraits< T >::field_type field_type
Definition: ftraits.hh:57
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,381 +4,102 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -debugstream.hh │ │ │ │ │ +ftraits.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 (C) 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_DEBUGSTREAM_HH │ │ │ │ │ - 7#define DUNE_DEBUGSTREAM_HH │ │ │ │ │ - 8 │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include │ │ │ │ │ - 15 │ │ │ │ │ - 16#include │ │ │ │ │ - 17 │ │ │ │ │ - 18namespace Dune { │ │ │ │ │ - 19 │ │ │ │ │ -118 typedef unsigned int DebugLevel; │ │ │ │ │ - 119 │ │ │ │ │ - 129 template │ │ │ │ │ -130 struct greater_or_equal { │ │ │ │ │ -131 constexpr static bool value = (current >= threshold); │ │ │ │ │ - 132 }; │ │ │ │ │ - 133 │ │ │ │ │ - 134 │ │ │ │ │ - 141 template │ │ │ │ │ -142 struct common_bits { │ │ │ │ │ -143 constexpr static bool value = ((current & mask) != 0); │ │ │ │ │ - 144 }; │ │ │ │ │ - 145 │ │ │ │ │ - 146 │ │ │ │ │ -148 class DebugStreamError : public IOError {}; │ │ │ │ │ - 149 │ │ │ │ │ -150 class StreamWrap { │ │ │ │ │ - 151 public: │ │ │ │ │ -152 StreamWrap(std::ostream& _out) : out(_out) { } │ │ │ │ │ -153 std::ostream& out; │ │ │ │ │ -154 StreamWrap *next; │ │ │ │ │ - 155 }; │ │ │ │ │ - 156 │ │ │ │ │ -158 class DebugStreamState { │ │ │ │ │ - 159 // !!! should be protected somehow but that won't be easy │ │ │ │ │ - 160 public: │ │ │ │ │ -162 StreamWrap* current; │ │ │ │ │ - 163 │ │ │ │ │ -165 bool _active; │ │ │ │ │ - 166 │ │ │ │ │ -168 bool _tied; │ │ │ │ │ - 169 │ │ │ │ │ -171 unsigned int _tied_streams; │ │ │ │ │ - 172 }; │ │ │ │ │ - 173 │ │ │ │ │ - 188 template class activator = greater_or_equal> │ │ │ │ │ -192 class DebugStream : public DebugStreamState { │ │ │ │ │ - 193 public: │ │ │ │ │ -199 DebugStream(std::ostream& out = std::cerr) { │ │ │ │ │ - 200 // start a new list of streams │ │ │ │ │ - 201 current = new StreamWrap(out); │ │ │ │ │ - 202 current->next = 0; │ │ │ │ │ - 203 │ │ │ │ │ - 204 // check if we are above the default activation level │ │ │ │ │ - 205 _active = activator::value; │ │ │ │ │ - 206 │ │ │ │ │ - 207 // we're not tied to another DebugStream │ │ │ │ │ - 208 _tied = false; │ │ │ │ │ - 209 │ │ │ │ │ - 210 // no child streams yet │ │ │ │ │ - 211 _tied_streams = 0; │ │ │ │ │ - 212 } │ │ │ │ │ - 213 │ │ │ │ │ -219 DebugStream (DebugStreamState& master, │ │ │ │ │ - 220 std::ostream& fallback = std::cerr) │ │ │ │ │ - 221 { │ │ │ │ │ - 222 // start a new list of streams │ │ │ │ │ - 223 current = new StreamWrap(fallback); │ │ │ │ │ - 224 current->next = 0; │ │ │ │ │ - 225 │ │ │ │ │ - 226 // check if we are above the default activation level │ │ │ │ │ - 227 _active = activator::value; │ │ │ │ │ - 228 _tied_streams = 0; │ │ │ │ │ - 229 │ │ │ │ │ - 230 // tie to the provided stream │ │ │ │ │ - 231 _tied = true; │ │ │ │ │ - 232 tiedstate = &master; │ │ │ │ │ - 233 tiedstate->_tied_streams++; │ │ │ │ │ - 234 } │ │ │ │ │ - 235 │ │ │ │ │ -243 ~DebugStream() │ │ │ │ │ - 244 { │ │ │ │ │ - 245 // untie │ │ │ │ │ - 246 if (_tied) │ │ │ │ │ - 247 tiedstate->_tied_streams--; │ │ │ │ │ - 248 else { │ │ │ │ │ - 249 // check if somebody still ties to us... │ │ │ │ │ - 250 if (_tied_streams != 0) │ │ │ │ │ - 251 { │ │ │ │ │ - 252 std::cerr << "DebugStream destructor is called while other streams are │ │ │ │ │ -still tied to it. Terminating!" << std::endl; │ │ │ │ │ - 253 std::terminate(); │ │ │ │ │ - 254 } │ │ │ │ │ - 255 } │ │ │ │ │ - 256 │ │ │ │ │ - 257 // remove ostream-stack │ │ │ │ │ - 258 while (current != 0) { │ │ │ │ │ - 259 StreamWrap *s = current; │ │ │ │ │ - 260 current = current->next; │ │ │ │ │ - 261 delete s; │ │ │ │ │ - 262 } │ │ │ │ │ - 263 } │ │ │ │ │ - 264 │ │ │ │ │ - 266 template │ │ │ │ │ -267 DebugStream& operator<<(const T data) { │ │ │ │ │ - 268 // remove the following code if stream wasn't compiled active │ │ │ │ │ - 269 if (activator::value) { │ │ │ │ │ - 270 if (! _tied) { │ │ │ │ │ - 271 if (_active) │ │ │ │ │ - 272 current->out << data; │ │ │ │ │ - 273 } else { │ │ │ │ │ - 274 if (_active && tiedstate->_active) │ │ │ │ │ - 275 tiedstate->current->out << data; │ │ │ │ │ - 276 } │ │ │ │ │ - 277 } │ │ │ │ │ - 278 │ │ │ │ │ - 279 return *this; │ │ │ │ │ - 280 } │ │ │ │ │ - 281 │ │ │ │ │ -289 DebugStream& operator<<(const int data) { │ │ │ │ │ - 290 // remove the following code if stream wasn't compiled active │ │ │ │ │ - 291 if (activator::value) { │ │ │ │ │ - 292 if (! _tied) { │ │ │ │ │ - 293 if (_active) │ │ │ │ │ - 294 current->out << data; │ │ │ │ │ - 295 } else { │ │ │ │ │ - 296 if (_active && tiedstate->_active) │ │ │ │ │ - 297 tiedstate->current->out << data; │ │ │ │ │ - 298 } │ │ │ │ │ - 299 } │ │ │ │ │ - 300 │ │ │ │ │ - 301 return *this; │ │ │ │ │ - 302 } │ │ │ │ │ - 303 │ │ │ │ │ -305 DebugStream& operator<<(std::ostream& (*f)(std::ostream&)) { │ │ │ │ │ - 306 if (activator::value) { │ │ │ │ │ - 307 if (! _tied) { │ │ │ │ │ - 308 if (_active) │ │ │ │ │ - 309 f(current->out); │ │ │ │ │ - 310 } else { │ │ │ │ │ - 311 if (_active && tiedstate->_active) │ │ │ │ │ - 312 f(tiedstate->current->out); │ │ │ │ │ - 313 } │ │ │ │ │ - 314 } │ │ │ │ │ - 315 │ │ │ │ │ - 316 return *this; │ │ │ │ │ - 317 } │ │ │ │ │ - 318 │ │ │ │ │ -320 DebugStream& flush() { │ │ │ │ │ - 321 if (activator::value) { │ │ │ │ │ - 322 if (! _tied) { │ │ │ │ │ - 323 if (_active) │ │ │ │ │ - 324 current->out.flush(); │ │ │ │ │ - 325 } else { │ │ │ │ │ - 326 if (_active && tiedstate->_active) │ │ │ │ │ - 327 tiedstate->current->out.flush(); │ │ │ │ │ - 328 } │ │ │ │ │ - 329 } │ │ │ │ │ - 330 │ │ │ │ │ - 331 return *this; │ │ │ │ │ - 332 } │ │ │ │ │ - 333 │ │ │ │ │ -335 void push(bool b) { │ │ │ │ │ - 336 // are we at all active? │ │ │ │ │ - 337 if (activator::value) { │ │ │ │ │ - 338 _actstack.push(_active); │ │ │ │ │ - 339 _active = b; │ │ │ │ │ - 340 } else { │ │ │ │ │ - 341 // stay off │ │ │ │ │ - 342 _actstack.push(false); │ │ │ │ │ - 343 } │ │ │ │ │ - 344 } │ │ │ │ │ - 345 │ │ │ │ │ -349 void pop() { │ │ │ │ │ - 350 if (_actstack.empty()) │ │ │ │ │ - 351 DUNE_THROW(DebugStreamError, "No previous activation setting!"); │ │ │ │ │ - 352 │ │ │ │ │ - 353 _active = _actstack.top(); │ │ │ │ │ - 354 _actstack.pop(); │ │ │ │ │ - 355 } │ │ │ │ │ - 356 │ │ │ │ │ -363 bool active() const { │ │ │ │ │ - 364 return activator::value && _active; │ │ │ │ │ - 365 } │ │ │ │ │ - 366 │ │ │ │ │ -371 void attach(std::ostream& stream) { │ │ │ │ │ - 372 if (_tied) │ │ │ │ │ - 373 DUNE_THROW(DebugStreamError, "Cannot attach to a tied stream!"); │ │ │ │ │ - 374 │ │ │ │ │ - 375 StreamWrap* newcurr = new StreamWrap(stream); │ │ │ │ │ - 376 newcurr->next = current; │ │ │ │ │ - 377 current = newcurr; │ │ │ │ │ - 378 } │ │ │ │ │ - 379 │ │ │ │ │ -383 void detach() { │ │ │ │ │ - 384 if (current->next == 0) │ │ │ │ │ - 385 DUNE_THROW(DebugStreamError, "Cannot detach initial stream!"); │ │ │ │ │ - 386 if (_tied) │ │ │ │ │ - 387 DUNE_THROW(DebugStreamError, "Cannot detach a tied stream!"); │ │ │ │ │ - 388 │ │ │ │ │ - 389 StreamWrap* old = current; │ │ │ │ │ - 390 current = current->next; │ │ │ │ │ - 391 delete old; │ │ │ │ │ - 392 } │ │ │ │ │ - 393 │ │ │ │ │ -397 void tie(DebugStreamState& to) { │ │ │ │ │ - 398 if (to._tied) │ │ │ │ │ - 399 DUNE_THROW(DebugStreamError, "Cannot tie to an already tied stream!"); │ │ │ │ │ - 400 if (_tied) │ │ │ │ │ - 401 DUNE_THROW(DebugStreamError, "Stream already tied: untie first!"); │ │ │ │ │ - 402 │ │ │ │ │ - 403 _tied = true; │ │ │ │ │ - 404 tiedstate = &to; │ │ │ │ │ - 405 │ │ │ │ │ - 406 // tell master class │ │ │ │ │ - 407 tiedstate->_tied_streams++; │ │ │ │ │ - 408 } │ │ │ │ │ - 409 │ │ │ │ │ -413 void untie() { │ │ │ │ │ - 414 if(! _tied) │ │ │ │ │ - 415 DUNE_THROW(DebugStreamError, "Cannot untie, stream is not tied!"); │ │ │ │ │ - 416 │ │ │ │ │ - 417 tiedstate->_tied_streams--; │ │ │ │ │ - 418 _tied = false; │ │ │ │ │ - 419 tiedstate = 0; │ │ │ │ │ - 420 } │ │ │ │ │ - 421 │ │ │ │ │ - 422 private: │ │ │ │ │ - 424 DebugStreamState* tiedstate; │ │ │ │ │ - 425 │ │ │ │ │ - 430 std::stack _actstack; │ │ │ │ │ - 431 }; │ │ │ │ │ - 432 │ │ │ │ │ - 434} │ │ │ │ │ - 435 │ │ │ │ │ - 436 │ │ │ │ │ - 437#endif │ │ │ │ │ -exceptions.hh │ │ │ │ │ -A few common exception classes. │ │ │ │ │ -Dune::StreamWrap::StreamWrap │ │ │ │ │ -StreamWrap(std::ostream &_out) │ │ │ │ │ -Definition: debugstream.hh:152 │ │ │ │ │ -Dune::DebugStream::DebugStream │ │ │ │ │ -DebugStream(std::ostream &out=std::cerr) │ │ │ │ │ -Create a DebugStream and set initial output stream. │ │ │ │ │ -Definition: debugstream.hh:199 │ │ │ │ │ -Dune::DebugStream::untie │ │ │ │ │ -void untie() │ │ │ │ │ -Untie stream. │ │ │ │ │ -Definition: debugstream.hh:413 │ │ │ │ │ -Dune::DebugStream::flush │ │ │ │ │ -DebugStream & flush() │ │ │ │ │ -pass on flush to underlying output stream │ │ │ │ │ -Definition: debugstream.hh:320 │ │ │ │ │ -Dune::DebugStream::attach │ │ │ │ │ -void attach(std::ostream &stream) │ │ │ │ │ -set output to a different stream. │ │ │ │ │ -Definition: debugstream.hh:371 │ │ │ │ │ -Dune::DebugStream::detach │ │ │ │ │ -void detach() │ │ │ │ │ -detach current output stream and restore to previous stream │ │ │ │ │ -Definition: debugstream.hh:383 │ │ │ │ │ -Dune::common_bits::value │ │ │ │ │ -static constexpr bool value │ │ │ │ │ -Definition: debugstream.hh:143 │ │ │ │ │ -Dune::StreamWrap::out │ │ │ │ │ -std::ostream & out │ │ │ │ │ -Definition: debugstream.hh:153 │ │ │ │ │ -Dune::DebugStream::pop │ │ │ │ │ -void pop() │ │ │ │ │ -restore previously set activation flag │ │ │ │ │ -Definition: debugstream.hh:349 │ │ │ │ │ -Dune::DebugStream::active │ │ │ │ │ -bool active() const │ │ │ │ │ -reports if this stream will produce output │ │ │ │ │ -Definition: debugstream.hh:363 │ │ │ │ │ -Dune::DebugStreamState::_active │ │ │ │ │ -bool _active │ │ │ │ │ -flag to switch output during runtime │ │ │ │ │ -Definition: debugstream.hh:165 │ │ │ │ │ -Dune::DebugStreamState::_tied_streams │ │ │ │ │ -unsigned int _tied_streams │ │ │ │ │ -how many streams are tied to this state │ │ │ │ │ -Definition: debugstream.hh:171 │ │ │ │ │ -Dune::DebugStream::tie │ │ │ │ │ -void tie(DebugStreamState &to) │ │ │ │ │ -Tie a stream to this one. │ │ │ │ │ -Definition: debugstream.hh:397 │ │ │ │ │ -Dune::DebugStream::push │ │ │ │ │ -void push(bool b) │ │ │ │ │ -set activation flag and store old value │ │ │ │ │ -Definition: debugstream.hh:335 │ │ │ │ │ -Dune::DebugLevel │ │ │ │ │ -unsigned int DebugLevel │ │ │ │ │ -Type for debug levels. │ │ │ │ │ -Definition: debugstream.hh:118 │ │ │ │ │ -Dune::DebugStreamState::_tied │ │ │ │ │ -bool _tied │ │ │ │ │ -are we tied to another DebugStream? │ │ │ │ │ -Definition: debugstream.hh:168 │ │ │ │ │ -Dune::DebugStreamState::current │ │ │ │ │ -StreamWrap * current │ │ │ │ │ -current output stream and link to possibly pushed old output streams │ │ │ │ │ -Definition: debugstream.hh:162 │ │ │ │ │ -Dune::DebugStream::operator<< │ │ │ │ │ -DebugStream & operator<<(const T data) │ │ │ │ │ -Generic types are passed on to current output stream. │ │ │ │ │ -Definition: debugstream.hh:267 │ │ │ │ │ -Dune::greater_or_equal::value │ │ │ │ │ -static constexpr bool value │ │ │ │ │ -Definition: debugstream.hh:131 │ │ │ │ │ -Dune::DebugStream::~DebugStream │ │ │ │ │ -~DebugStream() │ │ │ │ │ -Destroy stream. │ │ │ │ │ -Definition: debugstream.hh:243 │ │ │ │ │ -Dune::DebugStream::DebugStream │ │ │ │ │ -DebugStream(DebugStreamState &master, std::ostream &fallback=std::cerr) │ │ │ │ │ -Create a DebugStream and directly tie to another DebugStream. │ │ │ │ │ -Definition: debugstream.hh:219 │ │ │ │ │ -Dune::DebugStream::operator<< │ │ │ │ │ -DebugStream & operator<<(const int data) │ │ │ │ │ -explicit specialization so that enums can be printed │ │ │ │ │ -Definition: debugstream.hh:289 │ │ │ │ │ -Dune::DebugStream::operator<< │ │ │ │ │ -DebugStream & operator<<(std::ostream &(*f)(std::ostream &)) │ │ │ │ │ -pass on manipulators to underlying output stream │ │ │ │ │ -Definition: debugstream.hh:305 │ │ │ │ │ -Dune::StreamWrap::next │ │ │ │ │ -StreamWrap * next │ │ │ │ │ -Definition: debugstream.hh:154 │ │ │ │ │ -DUNE_THROW │ │ │ │ │ -#define DUNE_THROW(E, m) │ │ │ │ │ -Definition: exceptions.hh:218 │ │ │ │ │ -Dune::Simd::Overloads::mask │ │ │ │ │ -Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v) │ │ │ │ │ -implements Simd::mask() │ │ │ │ │ -Definition: defaults.hh:153 │ │ │ │ │ + 5#ifndef DUNE_FTRAITS_HH │ │ │ │ │ + 6#define DUNE_FTRAITS_HH │ │ │ │ │ + 7 │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14 │ │ │ │ │ + 15namespace Dune { │ │ │ │ │ + 16 │ │ │ │ │ + 24 template │ │ │ │ │ +25 struct FieldTraits │ │ │ │ │ + 26 { │ │ │ │ │ +28 typedef T field_type; │ │ │ │ │ +30 typedef T real_type; │ │ │ │ │ + 31 }; │ │ │ │ │ + 32 │ │ │ │ │ + 33 template │ │ │ │ │ +34 struct FieldTraits │ │ │ │ │ + 35 { │ │ │ │ │ +36 typedef typename FieldTraits::field_type field_type; │ │ │ │ │ +37 typedef typename FieldTraits::real_type real_type; │ │ │ │ │ + 38 }; │ │ │ │ │ + 39 │ │ │ │ │ + 40 template │ │ │ │ │ +41 struct FieldTraits< std::complex > │ │ │ │ │ + 42 { │ │ │ │ │ +43 typedef std::complex field_type; │ │ │ │ │ +44 typedef T real_type; │ │ │ │ │ + 45 }; │ │ │ │ │ + 46 │ │ │ │ │ + 47 template │ │ │ │ │ +48 struct FieldTraits< T[N] > │ │ │ │ │ + 49 { │ │ │ │ │ +50 typedef typename FieldTraits::field_type field_type; │ │ │ │ │ +51 typedef typename FieldTraits::real_type real_type; │ │ │ │ │ + 52 }; │ │ │ │ │ + 53 │ │ │ │ │ + 54 template │ │ │ │ │ +55 struct FieldTraits< std::vector > │ │ │ │ │ + 56 { │ │ │ │ │ +57 typedef typename FieldTraits::field_type field_type; │ │ │ │ │ +58 typedef typename FieldTraits::real_type real_type; │ │ │ │ │ + 59 }; │ │ │ │ │ + 60 │ │ │ │ │ + 61} // end namespace Dune │ │ │ │ │ + 62 │ │ │ │ │ + 63#endif // DUNE_FTRAITS_HH │ │ │ │ │ +std │ │ │ │ │ +STL namespace. │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::greater_or_equal │ │ │ │ │ -Greater or equal template test. │ │ │ │ │ -Definition: debugstream.hh:130 │ │ │ │ │ -Dune::common_bits │ │ │ │ │ -activate if current and mask have common bits switched on. │ │ │ │ │ -Definition: debugstream.hh:142 │ │ │ │ │ -Dune::DebugStreamError │ │ │ │ │ -standard exception for the debugstream │ │ │ │ │ -Definition: debugstream.hh:148 │ │ │ │ │ -Dune::StreamWrap │ │ │ │ │ -Definition: debugstream.hh:150 │ │ │ │ │ -Dune::DebugStreamState │ │ │ │ │ -Intermediate class to implement tie-operation of DebugStream. │ │ │ │ │ -Definition: debugstream.hh:158 │ │ │ │ │ -Dune::DebugStream │ │ │ │ │ -Generic class to implement debug output streams. │ │ │ │ │ -Definition: debugstream.hh:192 │ │ │ │ │ -Dune::IOError │ │ │ │ │ -Default exception class for I/O errors. │ │ │ │ │ -Definition: exceptions.hh:231 │ │ │ │ │ +Dune::FieldTraits │ │ │ │ │ +Definition: ftraits.hh:26 │ │ │ │ │ +Dune::FieldTraits::field_type │ │ │ │ │ +T field_type │ │ │ │ │ +export the type representing the field │ │ │ │ │ +Definition: ftraits.hh:28 │ │ │ │ │ +Dune::FieldTraits::real_type │ │ │ │ │ +T real_type │ │ │ │ │ +export the type representing the real type of the field │ │ │ │ │ +Definition: ftraits.hh:30 │ │ │ │ │ +Dune::FieldTraits<_const_T_>::field_type │ │ │ │ │ +FieldTraits< T >::field_type field_type │ │ │ │ │ +Definition: ftraits.hh:36 │ │ │ │ │ +Dune::FieldTraits<_const_T_>::real_type │ │ │ │ │ +FieldTraits< T >::real_type real_type │ │ │ │ │ +Definition: ftraits.hh:37 │ │ │ │ │ +Dune::FieldTraits<_std::complex<_T_>_>::real_type │ │ │ │ │ +T real_type │ │ │ │ │ +Definition: ftraits.hh:44 │ │ │ │ │ +Dune::FieldTraits<_std::complex<_T_>_>::field_type │ │ │ │ │ +std::complex< T > field_type │ │ │ │ │ +Definition: ftraits.hh:43 │ │ │ │ │ +Dune::FieldTraits<_T[N]_>::field_type │ │ │ │ │ +FieldTraits< T >::field_type field_type │ │ │ │ │ +Definition: ftraits.hh:50 │ │ │ │ │ +Dune::FieldTraits<_T[N]_>::real_type │ │ │ │ │ +FieldTraits< T >::real_type real_type │ │ │ │ │ +Definition: ftraits.hh:51 │ │ │ │ │ +Dune::FieldTraits<_std::vector<_T_>_>::real_type │ │ │ │ │ +FieldTraits< T >::real_type real_type │ │ │ │ │ +Definition: ftraits.hh:58 │ │ │ │ │ +Dune::FieldTraits<_std::vector<_T_>_>::field_type │ │ │ │ │ +FieldTraits< T >::field_type field_type │ │ │ │ │ +Definition: ftraits.hh:57 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00104.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: boundschecking.hh File Reference │ │ │ │ +dune-common: densevector.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,33 +63,55 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ -Macros
│ │ │ │ -
boundschecking.hh File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces
│ │ │ │ +
densevector.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

Macro for wrapping boundary checks. │ │ │ │ +

Implements the dense vector interface, with an exchangeable storage class. │ │ │ │ More...

│ │ │ │ -
#include <dune/common/exceptions.hh>
│ │ │ │ +
#include <algorithm>
│ │ │ │ +#include <limits>
│ │ │ │ +#include <type_traits>
│ │ │ │ +#include "genericiterator.hh"
│ │ │ │ +#include "ftraits.hh"
│ │ │ │ +#include "matvectraits.hh"
│ │ │ │ +#include "promotiontraits.hh"
│ │ │ │ +#include "dotproduct.hh"
│ │ │ │ +#include "boundschecking.hh"
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Macros

#define DUNE_ASSERT_BOUNDS(cond)
 If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do nothing. More...
 

│ │ │ │ +Classes

struct  Dune::FieldTraits< DenseVector< V > >
 
class  Dune::DenseIterator< C, T, R >
 Generic iterator class for dense vector and matrix implementations. More...
 
class  Dune::DenseVector< V >
 Interface for a class of dense vectors over a given field. More...
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::fvmeta
 
│ │ │ │

Detailed Description

│ │ │ │ -

Macro for wrapping boundary checks.

│ │ │ │ +

Implements the dense vector interface, with an exchangeable storage class.

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,22 +4,43 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Macros │ │ │ │ │ -boundschecking.hh File Reference │ │ │ │ │ -Macro for wrapping boundary checks. More... │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces │ │ │ │ │ +densevector.hh File Reference │ │ │ │ │ +Common » Dense_Matrix_and_Vector_Template_Library │ │ │ │ │ +Implements the dense vector interface, with an exchangeable storage class. │ │ │ │ │ +More... │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "genericiterator.hh" │ │ │ │ │ +#include "ftraits.hh" │ │ │ │ │ +#include "matvectraits.hh" │ │ │ │ │ +#include "promotiontraits.hh" │ │ │ │ │ +#include "dotproduct.hh" │ │ │ │ │ +#include "boundschecking.hh" │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ - Macros │ │ │ │ │ -#define DUNE_ASSERT_BOUNDS(cond) │ │ │ │ │ -  If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; │ │ │ │ │ - otherwise, do nothing. More... │ │ │ │ │ + Classes │ │ │ │ │ +struct  Dune::FieldTraits<_DenseVector<_V_>_> │ │ │ │ │ +  │ │ │ │ │ + class  Dune::DenseIterator<_C,_T,_R_> │ │ │ │ │ +  Generic iterator class for dense vector and matrix implementations. │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ + class  Dune::DenseVector<_V_> │ │ │ │ │ +  Interface for a class of dense vectors over a given field. More... │ │ │ │ │ +  │ │ │ │ │ + Namespaces │ │ │ │ │ +namespace  Dune │ │ │ │ │ +  Dune namespace. │ │ │ │ │ +  │ │ │ │ │ +namespace  Dune::fvmeta │ │ │ │ │   │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -Macro for wrapping boundary checks. │ │ │ │ │ +Implements the dense vector interface, with an exchangeable storage class. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00104_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: boundschecking.hh Source File │ │ │ │ +dune-common: densevector.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,42 +62,707 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
boundschecking.hh
│ │ │ │ +
densevector.hh
│ │ │ │
│ │ │ │
│ │ │ │ -Go to the documentation of this file.
1// SPDX-FileCopyrightInfo: Copyright (C) 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_BOUNDSCHECKING_HH
│ │ │ │ -
4#define DUNE_BOUNDSCHECKING_HH
│ │ │ │ -
5
│ │ │ │ - │ │ │ │ +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 (C) 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_DENSEVECTOR_HH
│ │ │ │ +
6#define DUNE_DENSEVECTOR_HH
│ │ │ │
7
│ │ │ │ -
19#ifndef DUNE_ASSERT_BOUNDS
│ │ │ │ -
20#if defined(DUNE_CHECK_BOUNDS) || defined(DOXYGEN)
│ │ │ │ -
21
│ │ │ │ -
30#define DUNE_ASSERT_BOUNDS(cond) \
│ │ │ │ -
31 do { \
│ │ │ │ -
32 if (!(cond)) \
│ │ │ │ -
33 DUNE_THROW(Dune::RangeError, "Index out of bounds."); \
│ │ │ │ -
34 } while (false)
│ │ │ │ -
35
│ │ │ │ -
36#else
│ │ │ │ -
37#define DUNE_ASSERT_BOUNDS(cond)
│ │ │ │ -
38#endif
│ │ │ │ -
39#endif
│ │ │ │ -
40
│ │ │ │ -
41/* @} */
│ │ │ │ -
42
│ │ │ │ -
43#endif // DUNE_BOUNDSCHECKING_HH
│ │ │ │ -
A few common exception classes.
│ │ │ │ +
8#include <algorithm>
│ │ │ │ +
9#include <limits>
│ │ │ │ +
10#include <type_traits>
│ │ │ │ +
11
│ │ │ │ +
12#include "genericiterator.hh"
│ │ │ │ +
13#include "ftraits.hh"
│ │ │ │ +
14#include "matvectraits.hh"
│ │ │ │ +
15#include "promotiontraits.hh"
│ │ │ │ +
16#include "dotproduct.hh"
│ │ │ │ +
17#include "boundschecking.hh"
│ │ │ │ +
18
│ │ │ │ +
19namespace Dune {
│ │ │ │ +
20
│ │ │ │ +
21 // forward declaration of template
│ │ │ │ +
22 template<typename V> class DenseVector;
│ │ │ │ +
23
│ │ │ │ +
24 template<typename V>
│ │ │ │ + │ │ │ │ +
26 {
│ │ │ │ + │ │ │ │ + │ │ │ │ +
29 };
│ │ │ │ +
30
│ │ │ │ +
40 namespace fvmeta
│ │ │ │ +
41 {
│ │ │ │ +
46 template<class K>
│ │ │ │ +
47 inline typename FieldTraits<K>::real_type absreal (const K& k)
│ │ │ │ +
48 {
│ │ │ │ +
49 using std::abs;
│ │ │ │ +
50 return abs(k);
│ │ │ │ +
51 }
│ │ │ │ +
52
│ │ │ │ +
57 template<class K>
│ │ │ │ +
58 inline typename FieldTraits<K>::real_type absreal (const std::complex<K>& c)
│ │ │ │ +
59 {
│ │ │ │ +
60 using std::abs;
│ │ │ │ +
61 return abs(c.real()) + abs(c.imag());
│ │ │ │ +
62 }
│ │ │ │ +
63
│ │ │ │ +
68 template<class K>
│ │ │ │ +
69 inline typename FieldTraits<K>::real_type abs2 (const K& k)
│ │ │ │ +
70 {
│ │ │ │ +
71 return k*k;
│ │ │ │ +
72 }
│ │ │ │ +
73
│ │ │ │ +
78 template<class K>
│ │ │ │ +
79 inline typename FieldTraits<K>::real_type abs2 (const std::complex<K>& c)
│ │ │ │ +
80 {
│ │ │ │ +
81 return c.real()*c.real() + c.imag()*c.imag();
│ │ │ │ +
82 }
│ │ │ │ +
83
│ │ │ │ +
88 template<class K, bool isInteger = std::numeric_limits<K>::is_integer>
│ │ │ │ +
89 struct Sqrt
│ │ │ │ +
90 {
│ │ │ │ +
91 static inline typename FieldTraits<K>::real_type sqrt (const K& k)
│ │ │ │ +
92 {
│ │ │ │ +
93 using std::sqrt;
│ │ │ │ +
94 return sqrt(k);
│ │ │ │ +
95 }
│ │ │ │ +
96 };
│ │ │ │ +
97
│ │ │ │ +
102 template<class K>
│ │ │ │ +
103 struct Sqrt<K, true>
│ │ │ │ +
104 {
│ │ │ │ +
105 static inline typename FieldTraits<K>::real_type sqrt (const K& k)
│ │ │ │ +
106 {
│ │ │ │ +
107 using std::sqrt;
│ │ │ │ +
108 return typename FieldTraits<K>::real_type(sqrt(double(k)));
│ │ │ │ +
109 }
│ │ │ │ +
110 };
│ │ │ │ +
111
│ │ │ │ +
116 template<class K>
│ │ │ │ +
117 inline typename FieldTraits<K>::real_type sqrt (const K& k)
│ │ │ │ +
118 {
│ │ │ │ +
119 return Sqrt<K>::sqrt(k);
│ │ │ │ +
120 }
│ │ │ │ +
121
│ │ │ │ +
122 }
│ │ │ │ +
123
│ │ │ │ +
128 template<class C, class T, class R =T&>
│ │ │ │ + │ │ │ │ +
130 public Dune::RandomAccessIteratorFacade<DenseIterator<C,T,R>,T, R, std::ptrdiff_t>
│ │ │ │ +
131 {
│ │ │ │ +
132 friend class DenseIterator<typename std::remove_const<C>::type, typename std::remove_const<T>::type, typename mutable_reference<R>::type >;
│ │ │ │ +
133 friend class DenseIterator<const typename std::remove_const<C>::type, const typename std::remove_const<T>::type, typename const_reference<R>::type >;
│ │ │ │ +
134
│ │ │ │ +
135 typedef DenseIterator<typename std::remove_const<C>::type, typename std::remove_const<T>::type, typename mutable_reference<R>::type > MutableIterator;
│ │ │ │ +
136 typedef DenseIterator<const typename std::remove_const<C>::type, const typename std::remove_const<T>::type, typename const_reference<R>::type > ConstIterator;
│ │ │ │ +
137 public:
│ │ │ │ +
138
│ │ │ │ +
142 typedef std::ptrdiff_t DifferenceType;
│ │ │ │ +
143
│ │ │ │ +
147 typedef typename C::size_type SizeType;
│ │ │ │ +
148
│ │ │ │ +
149 // Constructors needed by the base iterators.
│ │ │ │ + │ │ │ │ +
151 : container_(0), position_()
│ │ │ │ +
152 {}
│ │ │ │ +
153
│ │ │ │ + │ │ │ │ +
155 : container_(&cont), position_(pos)
│ │ │ │ +
156 {}
│ │ │ │ +
157
│ │ │ │ + │ │ │ │ +
159 : container_(other.container_), position_(other.position_)
│ │ │ │ +
160 {}
│ │ │ │ +
161
│ │ │ │ + │ │ │ │ +
163 : container_(other.container_), position_(other.position_)
│ │ │ │ +
164 {}
│ │ │ │ +
165
│ │ │ │ +
166 // Methods needed by the forward iterator
│ │ │ │ +
167 bool equals(const MutableIterator &other) const
│ │ │ │ +
168 {
│ │ │ │ +
169 return position_ == other.position_ && container_ == other.container_;
│ │ │ │ +
170 }
│ │ │ │ +
171
│ │ │ │ +
172
│ │ │ │ +
173 bool equals(const ConstIterator & other) const
│ │ │ │ +
174 {
│ │ │ │ +
175 return position_ == other.position_ && container_ == other.container_;
│ │ │ │ +
176 }
│ │ │ │ +
177
│ │ │ │ +
178 R dereference() const {
│ │ │ │ +
179 return container_->operator[](position_);
│ │ │ │ +
180 }
│ │ │ │ +
181
│ │ │ │ +
182 void increment(){
│ │ │ │ +
183 ++position_;
│ │ │ │ +
184 }
│ │ │ │ +
185
│ │ │ │ +
186 // Additional function needed by BidirectionalIterator
│ │ │ │ +
187 void decrement(){
│ │ │ │ +
188 --position_;
│ │ │ │ +
189 }
│ │ │ │ +
190
│ │ │ │ +
191 // Additional function needed by RandomAccessIterator
│ │ │ │ + │ │ │ │ +
193 return container_->operator[](position_+i);
│ │ │ │ +
194 }
│ │ │ │ +
195
│ │ │ │ + │ │ │ │ +
197 position_=position_+n;
│ │ │ │ +
198 }
│ │ │ │ +
199
│ │ │ │ +
200 DifferenceType distanceTo(DenseIterator<const typename std::remove_const<C>::type,const typename std::remove_const<T>::type> other) const
│ │ │ │ +
201 {
│ │ │ │ +
202 assert(other.container_==container_);
│ │ │ │ +
203 return static_cast< DifferenceType >( other.position_ ) - static_cast< DifferenceType >( position_ );
│ │ │ │ +
204 }
│ │ │ │ +
205
│ │ │ │ +
206 DifferenceType distanceTo(DenseIterator<typename std::remove_const<C>::type, typename std::remove_const<T>::type> other) const
│ │ │ │ +
207 {
│ │ │ │ +
208 assert(other.container_==container_);
│ │ │ │ +
209 return static_cast< DifferenceType >( other.position_ ) - static_cast< DifferenceType >( position_ );
│ │ │ │ +
210 }
│ │ │ │ +
211
│ │ │ │ + │ │ │ │ +
214 {
│ │ │ │ +
215 return this->position_;
│ │ │ │ +
216 }
│ │ │ │ +
217
│ │ │ │ +
218 private:
│ │ │ │ +
219 C *container_;
│ │ │ │ +
220 SizeType position_;
│ │ │ │ +
221 };
│ │ │ │ +
222
│ │ │ │ +
227 template<typename V>
│ │ │ │ + │ │ │ │ +
229 {
│ │ │ │ + │ │ │ │ +
231 // typedef typename Traits::value_type K;
│ │ │ │ +
232
│ │ │ │ +
233 // Curiously recurring template pattern
│ │ │ │ +
234 V & asImp() { return static_cast<V&>(*this); }
│ │ │ │ +
235 const V & asImp() const { return static_cast<const V&>(*this); }
│ │ │ │ +
236
│ │ │ │ +
237 protected:
│ │ │ │ +
238 // construction allowed to derived classes only
│ │ │ │ +
239 constexpr DenseVector() = default;
│ │ │ │ +
240 // copying only allowed by derived classes
│ │ │ │ +
241 DenseVector(const DenseVector&) = default;
│ │ │ │ +
242
│ │ │ │ +
243 public:
│ │ │ │ +
244 //===== type definitions and constants
│ │ │ │ +
245
│ │ │ │ +
247 typedef typename Traits::derived_type derived_type;
│ │ │ │ +
248
│ │ │ │ +
250 typedef typename Traits::value_type value_type;
│ │ │ │ +
251
│ │ │ │ + │ │ │ │ +
254
│ │ │ │ +
256 typedef typename Traits::value_type block_type;
│ │ │ │ +
257
│ │ │ │ +
259 typedef typename Traits::size_type size_type;
│ │ │ │ +
260
│ │ │ │ +
262 constexpr static int blocklevel = 1;
│ │ │ │ +
263
│ │ │ │ +
264 //===== assignment from scalar
│ │ │ │ + │ │ │ │ +
267 {
│ │ │ │ +
268 for (size_type i=0; i<size(); i++)
│ │ │ │ +
269 asImp()[i] = k;
│ │ │ │ +
270 return asImp();
│ │ │ │ +
271 }
│ │ │ │ +
272
│ │ │ │ +
273 //===== assignment from other DenseVectors
│ │ │ │ +
274 protected:
│ │ │ │ + │ │ │ │ +
277
│ │ │ │ +
278 public:
│ │ │ │ +
279
│ │ │ │ +
281 template <typename W,
│ │ │ │ +
282 std::enable_if_t<
│ │ │ │ +
283 std::is_assignable<value_type&, typename DenseVector<W>::value_type>::value, int> = 0>
│ │ │ │ + │ │ │ │ +
285 {
│ │ │ │ +
286 assert(other.size() == size());
│ │ │ │ +
287 for (size_type i=0; i<size(); i++)
│ │ │ │ +
288 asImp()[i] = other[i];
│ │ │ │ +
289 return asImp();
│ │ │ │ +
290 }
│ │ │ │ +
291
│ │ │ │ +
292 //===== access to components
│ │ │ │ +
293
│ │ │ │ + │ │ │ │ +
296 {
│ │ │ │ +
297 return asImp()[i];
│ │ │ │ +
298 }
│ │ │ │ +
299
│ │ │ │ + │ │ │ │ +
301 {
│ │ │ │ +
302 return asImp()[i];
│ │ │ │ +
303 }
│ │ │ │ +
304
│ │ │ │ + │ │ │ │ +
307 {
│ │ │ │ +
308 return asImp()[0];
│ │ │ │ +
309 }
│ │ │ │ +
310
│ │ │ │ +
312 const value_type& front() const
│ │ │ │ +
313 {
│ │ │ │ +
314 return asImp()[0];
│ │ │ │ +
315 }
│ │ │ │ +
316
│ │ │ │ + │ │ │ │ +
319 {
│ │ │ │ +
320 return asImp()[size()-1];
│ │ │ │ +
321 }
│ │ │ │ +
322
│ │ │ │ +
324 const value_type& back() const
│ │ │ │ +
325 {
│ │ │ │ +
326 return asImp()[size()-1];
│ │ │ │ +
327 }
│ │ │ │ +
328
│ │ │ │ +
330 bool empty() const
│ │ │ │ +
331 {
│ │ │ │ +
332 return size() == 0;
│ │ │ │ +
333 }
│ │ │ │ +
334
│ │ │ │ + │ │ │ │ +
337 {
│ │ │ │ +
338 return asImp().size();
│ │ │ │ +
339 }
│ │ │ │ +
340
│ │ │ │ + │ │ │ │ + │ │ │ │ +
345
│ │ │ │ + │ │ │ │ +
348 {
│ │ │ │ +
349 return Iterator(*this,0);
│ │ │ │ +
350 }
│ │ │ │ +
351
│ │ │ │ + │ │ │ │ +
354 {
│ │ │ │ +
355 return Iterator(*this,size());
│ │ │ │ +
356 }
│ │ │ │ +
357
│ │ │ │ + │ │ │ │ +
361 {
│ │ │ │ +
362 return Iterator(*this,size()-1);
│ │ │ │ +
363 }
│ │ │ │ +
364
│ │ │ │ + │ │ │ │ +
368 {
│ │ │ │ +
369 return Iterator(*this,-1);
│ │ │ │ +
370 }
│ │ │ │ +
371
│ │ │ │ + │ │ │ │ +
374 {
│ │ │ │ +
375 return Iterator(*this,std::min(i,size()));
│ │ │ │ +
376 }
│ │ │ │ +
377
│ │ │ │ + │ │ │ │ + │ │ │ │ +
382
│ │ │ │ + │ │ │ │ +
385 {
│ │ │ │ +
386 return ConstIterator(*this,0);
│ │ │ │ +
387 }
│ │ │ │ +
388
│ │ │ │ + │ │ │ │ +
391 {
│ │ │ │ +
392 return ConstIterator(*this,size());
│ │ │ │ +
393 }
│ │ │ │ +
394
│ │ │ │ + │ │ │ │ +
398 {
│ │ │ │ +
399 return ConstIterator(*this,size()-1);
│ │ │ │ +
400 }
│ │ │ │ +
401
│ │ │ │ + │ │ │ │ +
405 {
│ │ │ │ +
406 return ConstIterator(*this,-1);
│ │ │ │ +
407 }
│ │ │ │ +
408
│ │ │ │ + │ │ │ │ +
411 {
│ │ │ │ +
412 return ConstIterator(*this,std::min(i,size()));
│ │ │ │ +
413 }
│ │ │ │ +
414
│ │ │ │ +
415 //===== vector space arithmetic
│ │ │ │ +
416
│ │ │ │ +
418 template <class Other>
│ │ │ │ + │ │ │ │ +
420 {
│ │ │ │ +
421 DUNE_ASSERT_BOUNDS(x.size() == size());
│ │ │ │ +
422 for (size_type i=0; i<size(); i++)
│ │ │ │ +
423 (*this)[i] += x[i];
│ │ │ │ +
424 return asImp();
│ │ │ │ +
425 }
│ │ │ │ +
426
│ │ │ │ +
428 template <class Other>
│ │ │ │ + │ │ │ │ +
430 {
│ │ │ │ +
431 DUNE_ASSERT_BOUNDS(x.size() == size());
│ │ │ │ +
432 for (size_type i=0; i<size(); i++)
│ │ │ │ +
433 (*this)[i] -= x[i];
│ │ │ │ +
434 return asImp();
│ │ │ │ +
435 }
│ │ │ │ +
436
│ │ │ │ +
438 template <class Other>
│ │ │ │ + │ │ │ │ +
440 {
│ │ │ │ +
441 derived_type z = asImp();
│ │ │ │ +
442 return (z+=b);
│ │ │ │ +
443 }
│ │ │ │ +
444
│ │ │ │ +
446 template <class Other>
│ │ │ │ + │ │ │ │ +
448 {
│ │ │ │ +
449 derived_type z = asImp();
│ │ │ │ +
450 return (z-=b);
│ │ │ │ +
451 }
│ │ │ │ +
452
│ │ │ │ + │ │ │ │ +
455 {
│ │ │ │ +
456 V result;
│ │ │ │ +
457 using idx_type = typename decltype(result)::size_type;
│ │ │ │ +
458
│ │ │ │ +
459 for (idx_type i = 0; i < size(); ++i)
│ │ │ │ +
460 result[i] = -asImp()[i];
│ │ │ │ +
461
│ │ │ │ +
462 return result;
│ │ │ │ +
463 }
│ │ │ │ +
464
│ │ │ │ +
466
│ │ │ │ +
474 template <typename ValueType>
│ │ │ │ +
475 typename std::enable_if<
│ │ │ │ +
476 std::is_convertible<ValueType, value_type>::value,
│ │ │ │ + │ │ │ │ +
478 >::type&
│ │ │ │ +
479 operator+= (const ValueType& kk)
│ │ │ │ +
480 {
│ │ │ │ +
481 const value_type& k = kk;
│ │ │ │ +
482 for (size_type i=0; i<size(); i++)
│ │ │ │ +
483 (*this)[i] += k;
│ │ │ │ +
484 return asImp();
│ │ │ │ +
485 }
│ │ │ │ +
486
│ │ │ │ +
488
│ │ │ │ +
496 template <typename ValueType>
│ │ │ │ +
497 typename std::enable_if<
│ │ │ │ +
498 std::is_convertible<ValueType, value_type>::value,
│ │ │ │ + │ │ │ │ +
500 >::type&
│ │ │ │ +
501 operator-= (const ValueType& kk)
│ │ │ │ +
502 {
│ │ │ │ +
503 const value_type& k = kk;
│ │ │ │ +
504 for (size_type i=0; i<size(); i++)
│ │ │ │ +
505 (*this)[i] -= k;
│ │ │ │ +
506 return asImp();
│ │ │ │ +
507 }
│ │ │ │ +
508
│ │ │ │ +
510
│ │ │ │ +
518 template <typename FieldType>
│ │ │ │ +
519 typename std::enable_if<
│ │ │ │ +
520 std::is_convertible<FieldType, field_type>::value,
│ │ │ │ + │ │ │ │ +
522 >::type&
│ │ │ │ +
523 operator*= (const FieldType& kk)
│ │ │ │ +
524 {
│ │ │ │ +
525 const field_type& k = kk;
│ │ │ │ +
526 for (size_type i=0; i<size(); i++)
│ │ │ │ +
527 (*this)[i] *= k;
│ │ │ │ +
528 return asImp();
│ │ │ │ +
529 }
│ │ │ │ +
530
│ │ │ │ +
532
│ │ │ │ +
540 template <typename FieldType>
│ │ │ │ +
541 typename std::enable_if<
│ │ │ │ +
542 std::is_convertible<FieldType, field_type>::value,
│ │ │ │ + │ │ │ │ +
544 >::type&
│ │ │ │ +
545 operator/= (const FieldType& kk)
│ │ │ │ +
546 {
│ │ │ │ +
547 const field_type& k = kk;
│ │ │ │ +
548 for (size_type i=0; i<size(); i++)
│ │ │ │ +
549 (*this)[i] /= k;
│ │ │ │ +
550 return asImp();
│ │ │ │ +
551 }
│ │ │ │ +
552
│ │ │ │ +
554 template <class Other>
│ │ │ │ +
555 bool operator== (const DenseVector<Other>& x) const
│ │ │ │ +
556 {
│ │ │ │ +
557 DUNE_ASSERT_BOUNDS(x.size() == size());
│ │ │ │ +
558 for (size_type i=0; i<size(); i++)
│ │ │ │ +
559 if ((*this)[i]!=x[i])
│ │ │ │ +
560 return false;
│ │ │ │ +
561
│ │ │ │ +
562 return true;
│ │ │ │ +
563 }
│ │ │ │ +
564
│ │ │ │ +
566 template <class Other>
│ │ │ │ +
567 bool operator!= (const DenseVector<Other>& x) const
│ │ │ │ +
568 {
│ │ │ │ +
569 return !operator==(x);
│ │ │ │ +
570 }
│ │ │ │ +
571
│ │ │ │ +
572
│ │ │ │ +
574 template <class Other>
│ │ │ │ + │ │ │ │ +
576 {
│ │ │ │ +
577 DUNE_ASSERT_BOUNDS(x.size() == size());
│ │ │ │ +
578 for (size_type i=0; i<size(); i++)
│ │ │ │ +
579 (*this)[i] += a*x[i];
│ │ │ │ +
580 return asImp();
│ │ │ │ +
581 }
│ │ │ │ +
582
│ │ │ │ +
590 template<class Other>
│ │ │ │ + │ │ │ │ +
592 typedef typename PromotionTraits<field_type, typename DenseVector<Other>::field_type>::PromotedType PromotedType;
│ │ │ │ +
593 PromotedType result(0);
│ │ │ │ +
594 assert(x.size() == size());
│ │ │ │ +
595 for (size_type i=0; i<size(); i++) {
│ │ │ │ +
596 result += PromotedType((*this)[i]*x[i]);
│ │ │ │ +
597 }
│ │ │ │ +
598 return result;
│ │ │ │ +
599 }
│ │ │ │ +
600
│ │ │ │ +
608 template<class Other>
│ │ │ │ + │ │ │ │ +
610 typedef typename PromotionTraits<field_type, typename DenseVector<Other>::field_type>::PromotedType PromotedType;
│ │ │ │ +
611 PromotedType result(0);
│ │ │ │ +
612 assert(x.size() == size());
│ │ │ │ +
613 for (size_type i=0; i<size(); i++) {
│ │ │ │ +
614 result += Dune::dot((*this)[i],x[i]);
│ │ │ │ +
615 }
│ │ │ │ +
616 return result;
│ │ │ │ +
617 }
│ │ │ │ +
618
│ │ │ │ +
619 //===== norms
│ │ │ │ +
620
│ │ │ │ + │ │ │ │ +
623 using std::abs;
│ │ │ │ +
624 typename FieldTraits<value_type>::real_type result( 0 );
│ │ │ │ +
625 for (size_type i=0; i<size(); i++)
│ │ │ │ +
626 result += abs((*this)[i]);
│ │ │ │ +
627 return result;
│ │ │ │ +
628 }
│ │ │ │ +
629
│ │ │ │ +
630
│ │ │ │ + │ │ │ │ +
633 {
│ │ │ │ +
634 typename FieldTraits<value_type>::real_type result( 0 );
│ │ │ │ +
635 for (size_type i=0; i<size(); i++)
│ │ │ │ +
636 result += fvmeta::absreal((*this)[i]);
│ │ │ │ +
637 return result;
│ │ │ │ +
638 }
│ │ │ │ +
639
│ │ │ │ + │ │ │ │ +
642 {
│ │ │ │ +
643 typename FieldTraits<value_type>::real_type result( 0 );
│ │ │ │ +
644 for (size_type i=0; i<size(); i++)
│ │ │ │ +
645 result += fvmeta::abs2((*this)[i]);
│ │ │ │ +
646 return fvmeta::sqrt(result);
│ │ │ │ +
647 }
│ │ │ │ +
648
│ │ │ │ + │ │ │ │ +
651 {
│ │ │ │ +
652 typename FieldTraits<value_type>::real_type result( 0 );
│ │ │ │ +
653 for (size_type i=0; i<size(); i++)
│ │ │ │ +
654 result += fvmeta::abs2((*this)[i]);
│ │ │ │ +
655 return result;
│ │ │ │ +
656 }
│ │ │ │ +
657
│ │ │ │ +
659 template <typename vt = value_type,
│ │ │ │ +
660 typename std::enable_if<!HasNaN<vt>::value, int>::type = 0>
│ │ │ │ + │ │ │ │ +
662 using real_type = typename FieldTraits<vt>::real_type;
│ │ │ │ +
663 using std::abs;
│ │ │ │ +
664 using std::max;
│ │ │ │ +
665
│ │ │ │ +
666 real_type norm = 0;
│ │ │ │ +
667 for (auto const &x : *this) {
│ │ │ │ +
668 real_type const a = abs(x);
│ │ │ │ +
669 norm = max(a, norm);
│ │ │ │ +
670 }
│ │ │ │ +
671 return norm;
│ │ │ │ +
672 }
│ │ │ │ +
673
│ │ │ │ +
675 template <typename vt = value_type,
│ │ │ │ +
676 typename std::enable_if<!HasNaN<vt>::value, int>::type = 0>
│ │ │ │ + │ │ │ │ +
678 using real_type = typename FieldTraits<vt>::real_type;
│ │ │ │ +
679 using std::max;
│ │ │ │ +
680
│ │ │ │ +
681 real_type norm = 0;
│ │ │ │ +
682 for (auto const &x : *this) {
│ │ │ │ +
683 real_type const a = fvmeta::absreal(x);
│ │ │ │ +
684 norm = max(a, norm);
│ │ │ │ +
685 }
│ │ │ │ +
686 return norm;
│ │ │ │ +
687 }
│ │ │ │ +
688
│ │ │ │ +
690 template <typename vt = value_type,
│ │ │ │ +
691 typename std::enable_if<HasNaN<vt>::value, int>::type = 0>
│ │ │ │ + │ │ │ │ +
693 using real_type = typename FieldTraits<vt>::real_type;
│ │ │ │ +
694 using std::abs;
│ │ │ │ +
695 using std::max;
│ │ │ │ +
696
│ │ │ │ +
697 real_type norm = 0;
│ │ │ │ +
698 real_type isNaN = 1;
│ │ │ │ +
699 for (auto const &x : *this) {
│ │ │ │ +
700 real_type const a = abs(x);
│ │ │ │ +
701 norm = max(a, norm);
│ │ │ │ +
702 isNaN += a;
│ │ │ │ +
703 }
│ │ │ │ +
704 return norm * (isNaN / isNaN);
│ │ │ │ +
705 }
│ │ │ │ +
706
│ │ │ │ +
708 template <typename vt = value_type,
│ │ │ │ +
709 typename std::enable_if<HasNaN<vt>::value, int>::type = 0>
│ │ │ │ + │ │ │ │ +
711 using real_type = typename FieldTraits<vt>::real_type;
│ │ │ │ +
712 using std::max;
│ │ │ │ +
713
│ │ │ │ +
714 real_type norm = 0;
│ │ │ │ +
715 real_type isNaN = 1;
│ │ │ │ +
716 for (auto const &x : *this) {
│ │ │ │ +
717 real_type const a = fvmeta::absreal(x);
│ │ │ │ +
718 norm = max(a, norm);
│ │ │ │ +
719 isNaN += a;
│ │ │ │ +
720 }
│ │ │ │ +
721 return norm * (isNaN / isNaN);
│ │ │ │ +
722 }
│ │ │ │ +
723
│ │ │ │ +
724 //===== sizes
│ │ │ │ +
725
│ │ │ │ +
727 size_type N () const
│ │ │ │ +
728 {
│ │ │ │ +
729 return size();
│ │ │ │ +
730 }
│ │ │ │ +
731
│ │ │ │ +
733 size_type dim () const
│ │ │ │ +
734 {
│ │ │ │ +
735 return size();
│ │ │ │ +
736 }
│ │ │ │ +
737
│ │ │ │ +
738 };
│ │ │ │ +
739
│ │ │ │ +
748 template<typename V>
│ │ │ │ +
749 std::ostream& operator<< (std::ostream& s, const DenseVector<V>& v)
│ │ │ │ +
750 {
│ │ │ │ +
751 for (typename DenseVector<V>::size_type i=0; i<v.size(); i++)
│ │ │ │ +
752 s << ((i>0) ? " " : "") << v[i];
│ │ │ │ +
753 return s;
│ │ │ │ +
754 }
│ │ │ │ +
755
│ │ │ │ +
758} // end namespace
│ │ │ │ +
759
│ │ │ │ +
760#endif // DUNE_DENSEVECTOR_HH
│ │ │ │ +
Compute type of the result of an arithmetic operation involving two different number types.
│ │ │ │ +
Type traits to determine the type of reals (when working with complex numbers)
│ │ │ │ +
Macro for wrapping boundary checks.
│ │ │ │ +
Implements a generic iterator class for writing stl conformant iterators.
│ │ │ │ +
Provides the functions dot(a,b) := and dotT(a,b) := .
│ │ │ │ +
Documentation of the traits classes you need to write for each implementation of DenseVector or Dense...
│ │ │ │ +
#define DUNE_ASSERT_BOUNDS(cond)
If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do nothing.
Definition: boundschecking.hh:30
│ │ │ │ +
auto dot(const A &a, const B &b) -> typename std::enable_if< IsNumber< A >::value &&!IsVector< A >::value &&!std::is_same< typename FieldTraits< A >::field_type, typename FieldTraits< A >::real_type > ::value, decltype(conj(a) *b)>::type
computes the dot product for fundamental data types according to Petsc's VectDot function: dot(a,...
Definition: dotproduct.hh:42
│ │ │ │ +
std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
Definition: bigunsignedint.hh:278
│ │ │ │ +
STL namespace.
│ │ │ │ +
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ +
auto min(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
Definition: debugalign.hh:447
│ │ │ │ +
auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
Definition: debugalign.hh:425
│ │ │ │ +
bool isNaN(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag)
Definition: fvector.hh:604
│ │ │ │ +
Interface for a class of dense vectors over a given field.
Definition: densevector.hh:229
│ │ │ │ +
Traits::value_type value_type
export the type representing the field
Definition: densevector.hh:250
│ │ │ │ +
FieldTraits< value_type >::real_type two_norm2() const
square of two norm (sum over squared values of entries), need for block recursion
Definition: densevector.hh:650
│ │ │ │ +
ConstIterator const_iterator
typedef for stl compliant access
Definition: densevector.hh:381
│ │ │ │ +
Iterator iterator
typedef for stl compliant access
Definition: densevector.hh:344
│ │ │ │ +
ConstIterator find(size_type i) const
return iterator to given element or end()
Definition: densevector.hh:410
│ │ │ │ +
ConstIterator end() const
end ConstIterator
Definition: densevector.hh:390
│ │ │ │ +
value_type & front()
return reference to first element
Definition: densevector.hh:306
│ │ │ │ +
FieldTraits< value_type >::real_type two_norm() const
two norm sqrt(sum over squared values of entries)
Definition: densevector.hh:641
│ │ │ │ +
ConstIterator beforeBegin() const
Definition: densevector.hh:404
│ │ │ │ +
bool operator==(const DenseVector< Other > &x) const
Binary vector comparison.
Definition: densevector.hh:555
│ │ │ │ +
Iterator begin()
begin iterator
Definition: densevector.hh:347
│ │ │ │ +
Iterator beforeBegin()
Definition: densevector.hh:367
│ │ │ │ +
DenseIterator< const DenseVector, const value_type > ConstIterator
ConstIterator class for sequential access.
Definition: densevector.hh:379
│ │ │ │ +
Traits::derived_type derived_type
type of derived vector class
Definition: densevector.hh:247
│ │ │ │ +
const value_type & front() const
return reference to first element
Definition: densevector.hh:312
│ │ │ │ +
derived_type operator+(const DenseVector< Other > &b) const
Binary vector addition.
Definition: densevector.hh:439
│ │ │ │ +
size_type size() const
size method
Definition: densevector.hh:336
│ │ │ │ +
size_type dim() const
dimension of the vector space
Definition: densevector.hh:733
│ │ │ │ +
FieldTraits< vt >::real_type infinity_norm() const
infinity norm (maximum of absolute values of entries)
Definition: densevector.hh:661
│ │ │ │ +
ConstIterator beforeEnd() const
Definition: densevector.hh:397
│ │ │ │ +
derived_type & axpy(const field_type &a, const DenseVector< Other > &x)
vector space axpy operation ( *this += a x )
Definition: densevector.hh:575
│ │ │ │ +
derived_type & operator=(const value_type &k)
Assignment operator for scalar.
Definition: densevector.hh:266
│ │ │ │ +
static constexpr int blocklevel
The number of block levels we contain. This is the leaf, that is, 1.
Definition: densevector.hh:262
│ │ │ │ +
Iterator end()
end iterator
Definition: densevector.hh:353
│ │ │ │ +
Traits::size_type size_type
The type used for the index access and size operation.
Definition: densevector.hh:259
│ │ │ │ +
DenseIterator< DenseVector, value_type > Iterator
Iterator class for sequential access.
Definition: densevector.hh:342
│ │ │ │ +
derived_type & operator-=(const DenseVector< Other > &x)
vector space subtraction
Definition: densevector.hh:429
│ │ │ │ +
DenseVector(const DenseVector &)=default
│ │ │ │ +
Iterator beforeEnd()
Definition: densevector.hh:360
│ │ │ │ +
derived_type & operator+=(const DenseVector< Other > &x)
vector space addition
Definition: densevector.hh:419
│ │ │ │ +
std::enable_if< std::is_convertible< FieldType, field_type >::value, derived_type >::type & operator*=(const FieldType &kk)
vector space multiplication with scalar
Definition: densevector.hh:523
│ │ │ │ +
bool operator!=(const DenseVector< Other > &x) const
Binary vector incomparison.
Definition: densevector.hh:567
│ │ │ │ +
const value_type & back() const
return reference to last element
Definition: densevector.hh:324
│ │ │ │ +
ConstIterator begin() const
begin ConstIterator
Definition: densevector.hh:384
│ │ │ │ +
PromotionTraits< field_type, typenameDenseVector< Other >::field_type >::PromotedType operator*(const DenseVector< Other > &x) const
indefinite vector dot product which corresponds to Petsc's VecTDot
Definition: densevector.hh:591
│ │ │ │ +
constexpr DenseVector()=default
│ │ │ │ +
FieldTraits< vt >::real_type infinity_norm_real() const
simplified infinity norm (uses Manhattan norm for complex values)
Definition: densevector.hh:677
│ │ │ │ +
DenseVector & operator=(const DenseVector &)=default
Assignment operator for other DenseVector of same type.
│ │ │ │ +
Traits::value_type block_type
export the type representing the components
Definition: densevector.hh:256
│ │ │ │ +
value_type & operator[](size_type i)
random access
Definition: densevector.hh:295
│ │ │ │ +
FieldTraits< value_type >::field_type field_type
export the type representing the field
Definition: densevector.hh:253
│ │ │ │ +
value_type & back()
return reference to last element
Definition: densevector.hh:318
│ │ │ │ +
derived_type operator-() const
Vector negation.
Definition: densevector.hh:454
│ │ │ │ +
std::enable_if< std::is_convertible< FieldType, field_type >::value, derived_type >::type & operator/=(const FieldType &kk)
vector space division by scalar
Definition: densevector.hh:545
│ │ │ │ +
FieldTraits< value_type >::real_type one_norm_real() const
simplified one norm (uses Manhattan norm for complex values)
Definition: densevector.hh:632
│ │ │ │ +
PromotionTraits< field_type, typenameDenseVector< Other >::field_type >::PromotedType dot(const DenseVector< Other > &x) const
vector dot product which corresponds to Petsc's VecDot
Definition: densevector.hh:609
│ │ │ │ +
Iterator find(size_type i)
return iterator to given element or end()
Definition: densevector.hh:373
│ │ │ │ +
FieldTraits< value_type >::real_type one_norm() const
one norm (sum over absolute values of entries)
Definition: densevector.hh:622
│ │ │ │ +
size_type N() const
number of blocks in the vector (are of size 1 here)
Definition: densevector.hh:727
│ │ │ │ +
bool empty() const
checks whether the container is empty
Definition: densevector.hh:330
│ │ │ │ +
FieldTraits< typenameDenseMatVecTraits< V >::value_type >::real_type real_type
Definition: densevector.hh:28
│ │ │ │ +
FieldTraits< typenameDenseMatVecTraits< V >::value_type >::field_type field_type
Definition: densevector.hh:27
│ │ │ │ +
Generic iterator class for dense vector and matrix implementations.
Definition: densevector.hh:131
│ │ │ │ +
void increment()
Definition: densevector.hh:182
│ │ │ │ +
SizeType index() const
return index
Definition: densevector.hh:213
│ │ │ │ +
bool equals(const MutableIterator &other) const
Definition: densevector.hh:167
│ │ │ │ +
DenseIterator(const MutableIterator &other)
Definition: densevector.hh:158
│ │ │ │ +
bool equals(const ConstIterator &other) const
Definition: densevector.hh:173
│ │ │ │ +
R elementAt(DifferenceType i) const
Definition: densevector.hh:192
│ │ │ │ +
DifferenceType distanceTo(DenseIterator< const typename std::remove_const< C >::type, const typename std::remove_const< T >::type > other) const
Definition: densevector.hh:200
│ │ │ │ +
void decrement()
Definition: densevector.hh:187
│ │ │ │ +
DenseIterator(const ConstIterator &other)
Definition: densevector.hh:162
│ │ │ │ +
DifferenceType distanceTo(DenseIterator< typename std::remove_const< C >::type, typename std::remove_const< T >::type > other) const
Definition: densevector.hh:206
│ │ │ │ +
DenseIterator(C &cont, SizeType pos)
Definition: densevector.hh:154
│ │ │ │ +
std::ptrdiff_t DifferenceType
The type of the difference between two positions.
Definition: densevector.hh:142
│ │ │ │ +
R dereference() const
Definition: densevector.hh:178
│ │ │ │ +
void advance(DifferenceType n)
Definition: densevector.hh:196
│ │ │ │ +
C::size_type SizeType
The type to index the underlying container.
Definition: densevector.hh:147
│ │ │ │ +
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
│ │ │ │ +
get the 'mutable' version of a reference to a const object
Definition: genericiterator.hh:116
│ │ │ │ +
Base class for stl conformant forward iterators.
Definition: iteratorfacades.hh:434
│ │ │ │ +
Definition: matvectraits.hh:31
│ │ │ │ +
Compute type of the result of an arithmetic operation involving two different number types.
Definition: promotiontraits.hh:27
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,39 +4,958 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -boundschecking.hh │ │ │ │ │ +densevector.hh │ │ │ │ │ Go_to_the_documentation_of_this_file. │ │ │ │ │ - 1// SPDX-FileCopyrightInfo: Copyright (C) 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 (C) 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_BOUNDSCHECKING_HH │ │ │ │ │ - 4#define DUNE_BOUNDSCHECKING_HH │ │ │ │ │ - 5 │ │ │ │ │ - 6#include │ │ │ │ │ + 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ + 5#ifndef DUNE_DENSEVECTOR_HH │ │ │ │ │ + 6#define DUNE_DENSEVECTOR_HH │ │ │ │ │ 7 │ │ │ │ │ - 19#ifndef DUNE_ASSERT_BOUNDS │ │ │ │ │ - 20#if defined(DUNE_CHECK_BOUNDS) || defined(DOXYGEN) │ │ │ │ │ - 21 │ │ │ │ │ -30#define DUNE_ASSERT_BOUNDS(cond) \ │ │ │ │ │ - 31 do { \ │ │ │ │ │ - 32 if (!(cond)) \ │ │ │ │ │ - 33 DUNE_THROW(Dune::RangeError, "Index out of bounds."); \ │ │ │ │ │ - 34 } while (false) │ │ │ │ │ - 35 │ │ │ │ │ - 36#else │ │ │ │ │ - 37#define DUNE_ASSERT_BOUNDS(cond) │ │ │ │ │ - 38#endif │ │ │ │ │ - 39#endif │ │ │ │ │ - 40 │ │ │ │ │ - 41/* @} */ │ │ │ │ │ - 42 │ │ │ │ │ - 43#endif // DUNE_BOUNDSCHECKING_HH │ │ │ │ │ -exceptions.hh │ │ │ │ │ -A few common exception classes. │ │ │ │ │ + 8#include │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11 │ │ │ │ │ + 12#include "genericiterator.hh" │ │ │ │ │ + 13#include "ftraits.hh" │ │ │ │ │ + 14#include "matvectraits.hh" │ │ │ │ │ + 15#include "promotiontraits.hh" │ │ │ │ │ + 16#include "dotproduct.hh" │ │ │ │ │ + 17#include "boundschecking.hh" │ │ │ │ │ + 18 │ │ │ │ │ + 19namespace Dune { │ │ │ │ │ + 20 │ │ │ │ │ + 21 // forward declaration of template │ │ │ │ │ + 22 template class DenseVector; │ │ │ │ │ + 23 │ │ │ │ │ + 24 template │ │ │ │ │ +25 struct FieldTraits< DenseVector > │ │ │ │ │ + 26 { │ │ │ │ │ +27 typedef typename FieldTraits<_typename_DenseMatVecTraits::value_type >:: │ │ │ │ │ +field_type field_type; │ │ │ │ │ +28 typedef typename FieldTraits<_typename_DenseMatVecTraits::value_type >:: │ │ │ │ │ +real_type real_type; │ │ │ │ │ + 29 }; │ │ │ │ │ + 30 │ │ │ │ │ +40 namespace fvmeta │ │ │ │ │ + 41 { │ │ │ │ │ + 46 template │ │ │ │ │ + 47 inline typename FieldTraits::real_type absreal (const K& k) │ │ │ │ │ + 48 { │ │ │ │ │ + 49 using std::abs; │ │ │ │ │ + 50 return abs(k); │ │ │ │ │ + 51 } │ │ │ │ │ + 52 │ │ │ │ │ + 57 template │ │ │ │ │ + 58 inline typename FieldTraits::real_type absreal (const std::complex& │ │ │ │ │ +c) │ │ │ │ │ + 59 { │ │ │ │ │ + 60 using std::abs; │ │ │ │ │ + 61 return abs(c.real()) + abs(c.imag()); │ │ │ │ │ + 62 } │ │ │ │ │ + 63 │ │ │ │ │ + 68 template │ │ │ │ │ + 69 inline typename FieldTraits::real_type abs2 (const K& k) │ │ │ │ │ + 70 { │ │ │ │ │ + 71 return k*k; │ │ │ │ │ + 72 } │ │ │ │ │ + 73 │ │ │ │ │ + 78 template │ │ │ │ │ + 79 inline typename FieldTraits::real_type abs2 (const std::complex& c) │ │ │ │ │ + 80 { │ │ │ │ │ + 81 return c.real()*c.real() + c.imag()*c.imag(); │ │ │ │ │ + 82 } │ │ │ │ │ + 83 │ │ │ │ │ + 88 template::is_integer> │ │ │ │ │ + 89 struct Sqrt │ │ │ │ │ + 90 { │ │ │ │ │ + 91 static inline typename FieldTraits::real_type sqrt (const K& k) │ │ │ │ │ + 92 { │ │ │ │ │ + 93 using std::sqrt; │ │ │ │ │ + 94 return sqrt(k); │ │ │ │ │ + 95 } │ │ │ │ │ + 96 }; │ │ │ │ │ + 97 │ │ │ │ │ + 102 template │ │ │ │ │ + 103 struct Sqrt │ │ │ │ │ + 104 { │ │ │ │ │ +105 static inline typename FieldTraits::real_type sqrt (const K& k) │ │ │ │ │ + 106 { │ │ │ │ │ + 107 using std::sqrt; │ │ │ │ │ + 108 return typename FieldTraits::real_type(sqrt(double(k))); │ │ │ │ │ + 109 } │ │ │ │ │ + 110 }; │ │ │ │ │ + 111 │ │ │ │ │ + 116 template │ │ │ │ │ + 117 inline typename FieldTraits::real_type sqrt (const K& k) │ │ │ │ │ + 118 { │ │ │ │ │ + 119 return Sqrt::sqrt(k); │ │ │ │ │ + 120 } │ │ │ │ │ + 121 │ │ │ │ │ + 122 } │ │ │ │ │ + 123 │ │ │ │ │ + 128 template │ │ │ │ │ +129 class DenseIterator : │ │ │ │ │ + 130 public Dune::RandomAccessIteratorFacade,T, R, std:: │ │ │ │ │ +ptrdiff_t> │ │ │ │ │ + 131 { │ │ │ │ │ + 132 friend class DenseIterator::type, typename │ │ │ │ │ +std::remove_const::type, typename mutable_reference::type >; │ │ │ │ │ + 133 friend class DenseIterator::type, │ │ │ │ │ +const typename std::remove_const::type, typename const_reference::type >; │ │ │ │ │ + 134 │ │ │ │ │ + 135 typedef DenseIterator::type, typename std:: │ │ │ │ │ +remove_const::type, typename mutable_reference::type > MutableIterator; │ │ │ │ │ + 136 typedef DenseIterator::type, const │ │ │ │ │ +typename std::remove_const::type, typename const_reference::type > │ │ │ │ │ +ConstIterator; │ │ │ │ │ + 137 public: │ │ │ │ │ + 138 │ │ │ │ │ +142 typedef std::ptrdiff_t DifferenceType; │ │ │ │ │ + 143 │ │ │ │ │ +147 typedef typename C::size_type SizeType; │ │ │ │ │ + 148 │ │ │ │ │ + 149 // Constructors needed by the base iterators. │ │ │ │ │ +150 DenseIterator() │ │ │ │ │ + 151 : container_(0), position_() │ │ │ │ │ + 152 {} │ │ │ │ │ + 153 │ │ │ │ │ +154 DenseIterator(C& cont, SizeType pos) │ │ │ │ │ + 155 : container_(&cont), position_(pos) │ │ │ │ │ + 156 {} │ │ │ │ │ + 157 │ │ │ │ │ +158 DenseIterator(const MutableIterator & other) │ │ │ │ │ + 159 : container_(other.container_), position_(other.position_) │ │ │ │ │ + 160 {} │ │ │ │ │ + 161 │ │ │ │ │ +162 DenseIterator(const ConstIterator & other) │ │ │ │ │ + 163 : container_(other.container_), position_(other.position_) │ │ │ │ │ + 164 {} │ │ │ │ │ + 165 │ │ │ │ │ + 166 // Methods needed by the forward iterator │ │ │ │ │ +167 bool equals(const MutableIterator &other) const │ │ │ │ │ + 168 { │ │ │ │ │ + 169 return position_ == other.position_ && container_ == other.container_; │ │ │ │ │ + 170 } │ │ │ │ │ + 171 │ │ │ │ │ + 172 │ │ │ │ │ +173 bool equals(const ConstIterator & other) const │ │ │ │ │ + 174 { │ │ │ │ │ + 175 return position_ == other.position_ && container_ == other.container_; │ │ │ │ │ + 176 } │ │ │ │ │ + 177 │ │ │ │ │ +178 R dereference() const { │ │ │ │ │ + 179 return container_->operator[](position_); │ │ │ │ │ + 180 } │ │ │ │ │ + 181 │ │ │ │ │ +182 void increment(){ │ │ │ │ │ + 183 ++position_; │ │ │ │ │ + 184 } │ │ │ │ │ + 185 │ │ │ │ │ + 186 // Additional function needed by BidirectionalIterator │ │ │ │ │ +187 void decrement(){ │ │ │ │ │ + 188 --position_; │ │ │ │ │ + 189 } │ │ │ │ │ + 190 │ │ │ │ │ + 191 // Additional function needed by RandomAccessIterator │ │ │ │ │ +192 R elementAt(DifferenceType i) const { │ │ │ │ │ + 193 return container_->operator[](position_+i); │ │ │ │ │ + 194 } │ │ │ │ │ + 195 │ │ │ │ │ +196 void advance(DifferenceType n){ │ │ │ │ │ + 197 position_=position_+n; │ │ │ │ │ + 198 } │ │ │ │ │ + 199 │ │ │ │ │ +200 DifferenceType distanceTo(DenseIterator::type,const typename std::remove_const::type> other) const │ │ │ │ │ + 201 { │ │ │ │ │ + 202 assert(other.container_==container_); │ │ │ │ │ + 203 return static_cast< DifferenceType >( other.position_ ) - static_cast< │ │ │ │ │ +DifferenceType >( position_ ); │ │ │ │ │ + 204 } │ │ │ │ │ + 205 │ │ │ │ │ +206 DifferenceType distanceTo(DenseIterator:: │ │ │ │ │ +type, typename std::remove_const::type> other) const │ │ │ │ │ + 207 { │ │ │ │ │ + 208 assert(other.container_==container_); │ │ │ │ │ + 209 return static_cast< DifferenceType >( other.position_ ) - static_cast< │ │ │ │ │ +DifferenceType >( position_ ); │ │ │ │ │ + 210 } │ │ │ │ │ + 211 │ │ │ │ │ +213 SizeType index () const │ │ │ │ │ + 214 { │ │ │ │ │ + 215 return this->position_; │ │ │ │ │ + 216 } │ │ │ │ │ + 217 │ │ │ │ │ + 218 private: │ │ │ │ │ + 219 C *container_; │ │ │ │ │ + 220 SizeType position_; │ │ │ │ │ + 221 }; │ │ │ │ │ + 222 │ │ │ │ │ + 227 template │ │ │ │ │ +228 class DenseVector │ │ │ │ │ + 229 { │ │ │ │ │ + 230 typedef DenseMatVecTraits Traits; │ │ │ │ │ + 231 // typedef typename Traits::value_type K; │ │ │ │ │ + 232 │ │ │ │ │ + 233 // Curiously recurring template pattern │ │ │ │ │ + 234 V & asImp() { return static_cast(*this); } │ │ │ │ │ + 235 const V & asImp() const { return static_cast(*this); } │ │ │ │ │ + 236 │ │ │ │ │ + 237 protected: │ │ │ │ │ + 238 // construction allowed to derived classes only │ │ │ │ │ +239 constexpr DenseVector() = default; │ │ │ │ │ + 240 // copying only allowed by derived classes │ │ │ │ │ +241 DenseVector(const DenseVector&) = default; │ │ │ │ │ + 242 │ │ │ │ │ + 243 public: │ │ │ │ │ + 244 //===== type definitions and constants │ │ │ │ │ + 245 │ │ │ │ │ +247 typedef typename Traits::derived_type derived_type; │ │ │ │ │ + 248 │ │ │ │ │ +250 typedef typename Traits::value_type value_type; │ │ │ │ │ + 251 │ │ │ │ │ +253 typedef typename FieldTraits<_value_type_>::field_type field_type; │ │ │ │ │ + 254 │ │ │ │ │ +256 typedef typename Traits::value_type block_type; │ │ │ │ │ + 257 │ │ │ │ │ +259 typedef typename Traits::size_type size_type; │ │ │ │ │ + 260 │ │ │ │ │ +262 constexpr static int blocklevel = 1; │ │ │ │ │ + 263 │ │ │ │ │ + 264 //===== assignment from scalar │ │ │ │ │ +266 inline derived_type& operator=(const value_type& k) │ │ │ │ │ + 267 { │ │ │ │ │ + 268 for (size_type i=0; i::value_type>:: │ │ │ │ │ +value, int> = 0> │ │ │ │ │ +284 derived_type& operator=(const DenseVector& other) │ │ │ │ │ + 285 { │ │ │ │ │ + 286 assert(other.size() == size()); │ │ │ │ │ + 287 for (size_type i=0; i Iterator; │ │ │ │ │ +344 typedef Iterator iterator; │ │ │ │ │ + 345 │ │ │ │ │ +347 Iterator begin () │ │ │ │ │ + 348 { │ │ │ │ │ + 349 return Iterator(*this,0); │ │ │ │ │ + 350 } │ │ │ │ │ + 351 │ │ │ │ │ +353 Iterator end () │ │ │ │ │ + 354 { │ │ │ │ │ + 355 return Iterator(*this,size()); │ │ │ │ │ + 356 } │ │ │ │ │ + 357 │ │ │ │ │ +360 Iterator beforeEnd () │ │ │ │ │ + 361 { │ │ │ │ │ + 362 return Iterator(*this,size()-1); │ │ │ │ │ + 363 } │ │ │ │ │ + 364 │ │ │ │ │ +367 Iterator beforeBegin () │ │ │ │ │ + 368 { │ │ │ │ │ + 369 return Iterator(*this,-1); │ │ │ │ │ + 370 } │ │ │ │ │ + 371 │ │ │ │ │ +373 Iterator find (size_type i) │ │ │ │ │ + 374 { │ │ │ │ │ + 375 return Iterator(*this,std::min(i,size())); │ │ │ │ │ + 376 } │ │ │ │ │ + 377 │ │ │ │ │ +379 typedef DenseIterator ConstIterator; │ │ │ │ │ +381 typedef ConstIterator const_iterator; │ │ │ │ │ + 382 │ │ │ │ │ +384 ConstIterator begin () const │ │ │ │ │ + 385 { │ │ │ │ │ + 386 return ConstIterator(*this,0); │ │ │ │ │ + 387 } │ │ │ │ │ + 388 │ │ │ │ │ +390 ConstIterator end () const │ │ │ │ │ + 391 { │ │ │ │ │ + 392 return ConstIterator(*this,size()); │ │ │ │ │ + 393 } │ │ │ │ │ + 394 │ │ │ │ │ +397 ConstIterator beforeEnd () const │ │ │ │ │ + 398 { │ │ │ │ │ + 399 return ConstIterator(*this,size()-1); │ │ │ │ │ + 400 } │ │ │ │ │ + 401 │ │ │ │ │ +404 ConstIterator beforeBegin () const │ │ │ │ │ + 405 { │ │ │ │ │ + 406 return ConstIterator(*this,-1); │ │ │ │ │ + 407 } │ │ │ │ │ + 408 │ │ │ │ │ +410 ConstIterator find (size_type i) const │ │ │ │ │ + 411 { │ │ │ │ │ + 412 return ConstIterator(*this,std::min(i,size())); │ │ │ │ │ + 413 } │ │ │ │ │ + 414 │ │ │ │ │ + 415 //===== vector space arithmetic │ │ │ │ │ + 416 │ │ │ │ │ + 418 template │ │ │ │ │ +419 derived_type& operator+=(const DenseVector& x) │ │ │ │ │ + 420 { │ │ │ │ │ + 421 DUNE_ASSERT_BOUNDS(x.size() == size()); │ │ │ │ │ + 422 for (size_type i=0; i │ │ │ │ │ +429 derived_type& operator-=(const DenseVector& x) │ │ │ │ │ + 430 { │ │ │ │ │ + 431 DUNE_ASSERT_BOUNDS(x.size() == size()); │ │ │ │ │ + 432 for (size_type i=0; i │ │ │ │ │ +439 derived_type operator+(const DenseVector& b) const │ │ │ │ │ + 440 { │ │ │ │ │ + 441 derived_type z = asImp(); │ │ │ │ │ + 442 return (z+=b); │ │ │ │ │ + 443 } │ │ │ │ │ + 444 │ │ │ │ │ + 446 template │ │ │ │ │ +447 derived_type operator-(const DenseVector& b) const │ │ │ │ │ + 448 { │ │ │ │ │ + 449 derived_type z = asImp(); │ │ │ │ │ + 450 return (z-=b); │ │ │ │ │ + 451 } │ │ │ │ │ + 452 │ │ │ │ │ +454 derived_type operator-() const │ │ │ │ │ + 455 { │ │ │ │ │ + 456 V result; │ │ │ │ │ + 457 using idx_type = typename decltype(result)::size_type; │ │ │ │ │ + 458 │ │ │ │ │ + 459 for (idx_type i = 0; i < size(); ++i) │ │ │ │ │ + 460 result[i] = -asImp()[i]; │ │ │ │ │ + 461 │ │ │ │ │ + 462 return result; │ │ │ │ │ + 463 } │ │ │ │ │ + 464 │ │ │ │ │ + 466 │ │ │ │ │ + 474 template │ │ │ │ │ + 475 typename std::enable_if< │ │ │ │ │ + 476 std::is_convertible::value, │ │ │ │ │ + 477 derived_type │ │ │ │ │ + 478 >::type& │ │ │ │ │ +479 operator+=(const ValueType& kk) │ │ │ │ │ + 480 { │ │ │ │ │ + 481 const value_type& k = kk; │ │ │ │ │ + 482 for (size_type i=0; i │ │ │ │ │ + 497 typename std::enable_if< │ │ │ │ │ + 498 std::is_convertible::value, │ │ │ │ │ + 499 derived_type │ │ │ │ │ + 500 >::type& │ │ │ │ │ +501 operator-=(const ValueType& kk) │ │ │ │ │ + 502 { │ │ │ │ │ + 503 const value_type& k = kk; │ │ │ │ │ + 504 for (size_type i=0; i │ │ │ │ │ + 519 typename std::enable_if< │ │ │ │ │ + 520 std::is_convertible::value, │ │ │ │ │ + 521 derived_type │ │ │ │ │ + 522 >::type& │ │ │ │ │ +523 operator*=(const FieldType& kk) │ │ │ │ │ + 524 { │ │ │ │ │ + 525 const field_type& k = kk; │ │ │ │ │ + 526 for (size_type i=0; i │ │ │ │ │ + 541 typename std::enable_if< │ │ │ │ │ + 542 std::is_convertible::value, │ │ │ │ │ + 543 derived_type │ │ │ │ │ + 544 >::type& │ │ │ │ │ +545 operator/=(const FieldType& kk) │ │ │ │ │ + 546 { │ │ │ │ │ + 547 const field_type& k = kk; │ │ │ │ │ + 548 for (size_type i=0; i │ │ │ │ │ +555 bool operator==(const DenseVector& x) const │ │ │ │ │ + 556 { │ │ │ │ │ + 557 DUNE_ASSERT_BOUNDS(x.size() == size()); │ │ │ │ │ + 558 for (size_type i=0; i │ │ │ │ │ +567 bool operator!=(const DenseVector& x) const │ │ │ │ │ + 568 { │ │ │ │ │ + 569 return !operator==(x); │ │ │ │ │ + 570 } │ │ │ │ │ + 571 │ │ │ │ │ + 572 │ │ │ │ │ + 574 template │ │ │ │ │ +575 derived_type& axpy (const field_type& a, const DenseVector& x) │ │ │ │ │ + 576 { │ │ │ │ │ + 577 DUNE_ASSERT_BOUNDS(x.size() == size()); │ │ │ │ │ + 578 for (size_type i=0; i │ │ │ │ │ +591 typename PromotionTraits:: │ │ │ │ │ +field_type>::PromotedType operator*(const DenseVector& x) const { │ │ │ │ │ + 592 typedef typename PromotionTraits:: │ │ │ │ │ +field_type>::PromotedType PromotedType; │ │ │ │ │ + 593 PromotedType result(0); │ │ │ │ │ + 594 assert(x.size() == size()); │ │ │ │ │ + 595 for (size_type i=0; i │ │ │ │ │ +609 typename PromotionTraits:: │ │ │ │ │ +field_type>::PromotedType dot(const DenseVector& x) const { │ │ │ │ │ + 610 typedef typename PromotionTraits:: │ │ │ │ │ +field_type>::PromotedType PromotedType; │ │ │ │ │ + 611 PromotedType result(0); │ │ │ │ │ + 612 assert(x.size() == size()); │ │ │ │ │ + 613 for (size_type i=0; i::real_type one_norm() const { │ │ │ │ │ + 623 using std::abs; │ │ │ │ │ + 624 typename FieldTraits::real_type result( 0 ); │ │ │ │ │ + 625 for (size_type i=0; i::real_type one_norm_real () const │ │ │ │ │ + 633 { │ │ │ │ │ + 634 typename FieldTraits::real_type result( 0 ); │ │ │ │ │ + 635 for (size_type i=0; i::real_type two_norm () const │ │ │ │ │ + 642 { │ │ │ │ │ + 643 typename FieldTraits::real_type result( 0 ); │ │ │ │ │ + 644 for (size_type i=0; i::real_type two_norm2 () const │ │ │ │ │ + 651 { │ │ │ │ │ + 652 typename FieldTraits::real_type result( 0 ); │ │ │ │ │ + 653 for (size_type i=0; i::value, int>::type = 0> │ │ │ │ │ +661 typename FieldTraits::real_type infinity_norm() const { │ │ │ │ │ + 662 using real_type = typename FieldTraits::real_type; │ │ │ │ │ + 663 using std::abs; │ │ │ │ │ + 664 using std::max; │ │ │ │ │ + 665 │ │ │ │ │ + 666 real_type norm = 0; │ │ │ │ │ + 667 for (auto const &x : *this) { │ │ │ │ │ + 668 real_type const a = abs(x); │ │ │ │ │ + 669 norm = max(a, norm); │ │ │ │ │ + 670 } │ │ │ │ │ + 671 return norm; │ │ │ │ │ + 672 } │ │ │ │ │ + 673 │ │ │ │ │ + 675 template ::value, int>::type = 0> │ │ │ │ │ +677 typename FieldTraits::real_type infinity_norm_real() const { │ │ │ │ │ + 678 using real_type = typename FieldTraits::real_type; │ │ │ │ │ + 679 using std::max; │ │ │ │ │ + 680 │ │ │ │ │ + 681 real_type norm = 0; │ │ │ │ │ + 682 for (auto const &x : *this) { │ │ │ │ │ + 683 real_type const a = fvmeta::absreal(x); │ │ │ │ │ + 684 norm = max(a, norm); │ │ │ │ │ + 685 } │ │ │ │ │ + 686 return norm; │ │ │ │ │ + 687 } │ │ │ │ │ + 688 │ │ │ │ │ + 690 template ::value, int>::type = 0> │ │ │ │ │ +692 typename FieldTraits::real_type infinity_norm() const { │ │ │ │ │ + 693 using real_type = typename FieldTraits::real_type; │ │ │ │ │ + 694 using std::abs; │ │ │ │ │ + 695 using std::max; │ │ │ │ │ + 696 │ │ │ │ │ + 697 real_type norm = 0; │ │ │ │ │ + 698 real_type isNaN = 1; │ │ │ │ │ + 699 for (auto const &x : *this) { │ │ │ │ │ + 700 real_type const a = abs(x); │ │ │ │ │ + 701 norm = max(a, norm); │ │ │ │ │ + 702 isNaN += a; │ │ │ │ │ + 703 } │ │ │ │ │ + 704 return norm * (isNaN / isNaN); │ │ │ │ │ + 705 } │ │ │ │ │ + 706 │ │ │ │ │ + 708 template ::value, int>::type = 0> │ │ │ │ │ +710 typename FieldTraits::real_type infinity_norm_real() const { │ │ │ │ │ + 711 using real_type = typename FieldTraits::real_type; │ │ │ │ │ + 712 using std::max; │ │ │ │ │ + 713 │ │ │ │ │ + 714 real_type norm = 0; │ │ │ │ │ + 715 real_type isNaN = 1; │ │ │ │ │ + 716 for (auto const &x : *this) { │ │ │ │ │ + 717 real_type const a = fvmeta::absreal(x); │ │ │ │ │ + 718 norm = max(a, norm); │ │ │ │ │ + 719 isNaN += a; │ │ │ │ │ + 720 } │ │ │ │ │ + 721 return norm * (isNaN / isNaN); │ │ │ │ │ + 722 } │ │ │ │ │ + 723 │ │ │ │ │ + 724 //===== sizes │ │ │ │ │ + 725 │ │ │ │ │ +727 size_type N () const │ │ │ │ │ + 728 { │ │ │ │ │ + 729 return size(); │ │ │ │ │ + 730 } │ │ │ │ │ + 731 │ │ │ │ │ +733 size_type dim () const │ │ │ │ │ + 734 { │ │ │ │ │ + 735 return size(); │ │ │ │ │ + 736 } │ │ │ │ │ + 737 │ │ │ │ │ + 738 }; │ │ │ │ │ + 739 │ │ │ │ │ + 748 template │ │ │ │ │ +749 std::ostream& operator<<(std::ostream& s, const DenseVector& v) │ │ │ │ │ + 750 { │ │ │ │ │ + 751 for (typename DenseVector::size_type i=0; i0) ? " " : "") << v[i]; │ │ │ │ │ + 753 return s; │ │ │ │ │ + 754 } │ │ │ │ │ + 755 │ │ │ │ │ + 758} // end namespace │ │ │ │ │ + 759 │ │ │ │ │ + 760#endif // DUNE_DENSEVECTOR_HH │ │ │ │ │ +promotiontraits.hh │ │ │ │ │ +Compute type of the result of an arithmetic operation involving two different │ │ │ │ │ +number types. │ │ │ │ │ +ftraits.hh │ │ │ │ │ +Type traits to determine the type of reals (when working with complex numbers) │ │ │ │ │ +boundschecking.hh │ │ │ │ │ +Macro for wrapping boundary checks. │ │ │ │ │ +genericiterator.hh │ │ │ │ │ +Implements a generic iterator class for writing stl conformant iterators. │ │ │ │ │ +dotproduct.hh │ │ │ │ │ +Provides the functions dot(a,b) := and dotT(a,b) := . │ │ │ │ │ +matvectraits.hh │ │ │ │ │ +Documentation of the traits classes you need to write for each implementation │ │ │ │ │ +of DenseVector or Dense... │ │ │ │ │ +DUNE_ASSERT_BOUNDS │ │ │ │ │ +#define DUNE_ASSERT_BOUNDS(cond) │ │ │ │ │ +If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do │ │ │ │ │ +nothing. │ │ │ │ │ +Definition: boundschecking.hh:30 │ │ │ │ │ +Dune::dot │ │ │ │ │ +auto dot(const A &a, const B &b) -> typename std::enable_if< IsNumber< A >:: │ │ │ │ │ +value &&!IsVector< A >::value &&!std::is_same< typename FieldTraits< A >:: │ │ │ │ │ +field_type, typename FieldTraits< A >::real_type > ::value, decltype(conj(a) │ │ │ │ │ +*b)>::type │ │ │ │ │ +computes the dot product for fundamental data types according to Petsc's │ │ │ │ │ +VectDot function: dot(a,... │ │ │ │ │ +Definition: dotproduct.hh:42 │ │ │ │ │ +Dune::operator<< │ │ │ │ │ +std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x) │ │ │ │ │ +Definition: bigunsignedint.hh:278 │ │ │ │ │ +std │ │ │ │ │ +STL namespace. │ │ │ │ │ +Dune │ │ │ │ │ +Dune namespace. │ │ │ │ │ +Definition: alignedallocator.hh:13 │ │ │ │ │ +Dune::AlignedNumberImpl::min │ │ │ │ │ +auto min(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > │ │ │ │ │ +&b) │ │ │ │ │ +Definition: debugalign.hh:447 │ │ │ │ │ +Dune::AlignedNumberImpl::max │ │ │ │ │ +auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > │ │ │ │ │ +&b) │ │ │ │ │ +Definition: debugalign.hh:425 │ │ │ │ │ +Dune::MathOverloads::isNaN │ │ │ │ │ +bool isNaN(const FieldVector< K, SIZE > &b, PriorityTag< 2 >, ADLTag) │ │ │ │ │ +Definition: fvector.hh:604 │ │ │ │ │ +Dune::DenseVector │ │ │ │ │ +Interface for a class of dense vectors over a given field. │ │ │ │ │ +Definition: densevector.hh:229 │ │ │ │ │ +Dune::DenseVector::value_type │ │ │ │ │ +Traits::value_type value_type │ │ │ │ │ +export the type representing the field │ │ │ │ │ +Definition: densevector.hh:250 │ │ │ │ │ +Dune::DenseVector::two_norm2 │ │ │ │ │ +FieldTraits< value_type >::real_type two_norm2() const │ │ │ │ │ +square of two norm (sum over squared values of entries), need for block │ │ │ │ │ +recursion │ │ │ │ │ +Definition: densevector.hh:650 │ │ │ │ │ +Dune::DenseVector::const_iterator │ │ │ │ │ +ConstIterator const_iterator │ │ │ │ │ +typedef for stl compliant access │ │ │ │ │ +Definition: densevector.hh:381 │ │ │ │ │ +Dune::DenseVector::iterator │ │ │ │ │ +Iterator iterator │ │ │ │ │ +typedef for stl compliant access │ │ │ │ │ +Definition: densevector.hh:344 │ │ │ │ │ +Dune::DenseVector::find │ │ │ │ │ +ConstIterator find(size_type i) const │ │ │ │ │ +return iterator to given element or end() │ │ │ │ │ +Definition: densevector.hh:410 │ │ │ │ │ +Dune::DenseVector::end │ │ │ │ │ +ConstIterator end() const │ │ │ │ │ +end ConstIterator │ │ │ │ │ +Definition: densevector.hh:390 │ │ │ │ │ +Dune::DenseVector::front │ │ │ │ │ +value_type & front() │ │ │ │ │ +return reference to first element │ │ │ │ │ +Definition: densevector.hh:306 │ │ │ │ │ +Dune::DenseVector::two_norm │ │ │ │ │ +FieldTraits< value_type >::real_type two_norm() const │ │ │ │ │ +two norm sqrt(sum over squared values of entries) │ │ │ │ │ +Definition: densevector.hh:641 │ │ │ │ │ +Dune::DenseVector::beforeBegin │ │ │ │ │ +ConstIterator beforeBegin() const │ │ │ │ │ +Definition: densevector.hh:404 │ │ │ │ │ +Dune::DenseVector::operator== │ │ │ │ │ +bool operator==(const DenseVector< Other > &x) const │ │ │ │ │ +Binary vector comparison. │ │ │ │ │ +Definition: densevector.hh:555 │ │ │ │ │ +Dune::DenseVector::begin │ │ │ │ │ +Iterator begin() │ │ │ │ │ +begin iterator │ │ │ │ │ +Definition: densevector.hh:347 │ │ │ │ │ +Dune::DenseVector::beforeBegin │ │ │ │ │ +Iterator beforeBegin() │ │ │ │ │ +Definition: densevector.hh:367 │ │ │ │ │ +Dune::DenseVector::ConstIterator │ │ │ │ │ +DenseIterator< const DenseVector, const value_type > ConstIterator │ │ │ │ │ +ConstIterator class for sequential access. │ │ │ │ │ +Definition: densevector.hh:379 │ │ │ │ │ +Dune::DenseVector::derived_type │ │ │ │ │ +Traits::derived_type derived_type │ │ │ │ │ +type of derived vector class │ │ │ │ │ +Definition: densevector.hh:247 │ │ │ │ │ +Dune::DenseVector::front │ │ │ │ │ +const value_type & front() const │ │ │ │ │ +return reference to first element │ │ │ │ │ +Definition: densevector.hh:312 │ │ │ │ │ +Dune::DenseVector::operator+ │ │ │ │ │ +derived_type operator+(const DenseVector< Other > &b) const │ │ │ │ │ +Binary vector addition. │ │ │ │ │ +Definition: densevector.hh:439 │ │ │ │ │ +Dune::DenseVector::size │ │ │ │ │ +size_type size() const │ │ │ │ │ +size method │ │ │ │ │ +Definition: densevector.hh:336 │ │ │ │ │ +Dune::DenseVector::dim │ │ │ │ │ +size_type dim() const │ │ │ │ │ +dimension of the vector space │ │ │ │ │ +Definition: densevector.hh:733 │ │ │ │ │ +Dune::DenseVector::infinity_norm │ │ │ │ │ +FieldTraits< vt >::real_type infinity_norm() const │ │ │ │ │ +infinity norm (maximum of absolute values of entries) │ │ │ │ │ +Definition: densevector.hh:661 │ │ │ │ │ +Dune::DenseVector::beforeEnd │ │ │ │ │ +ConstIterator beforeEnd() const │ │ │ │ │ +Definition: densevector.hh:397 │ │ │ │ │ +Dune::DenseVector::axpy │ │ │ │ │ +derived_type & axpy(const field_type &a, const DenseVector< Other > &x) │ │ │ │ │ +vector space axpy operation ( *this += a x ) │ │ │ │ │ +Definition: densevector.hh:575 │ │ │ │ │ +Dune::DenseVector::operator= │ │ │ │ │ +derived_type & operator=(const value_type &k) │ │ │ │ │ +Assignment operator for scalar. │ │ │ │ │ +Definition: densevector.hh:266 │ │ │ │ │ +Dune::DenseVector::blocklevel │ │ │ │ │ +static constexpr int blocklevel │ │ │ │ │ +The number of block levels we contain. This is the leaf, that is, 1. │ │ │ │ │ +Definition: densevector.hh:262 │ │ │ │ │ +Dune::DenseVector::end │ │ │ │ │ +Iterator end() │ │ │ │ │ +end iterator │ │ │ │ │ +Definition: densevector.hh:353 │ │ │ │ │ +Dune::DenseVector::size_type │ │ │ │ │ +Traits::size_type size_type │ │ │ │ │ +The type used for the index access and size operation. │ │ │ │ │ +Definition: densevector.hh:259 │ │ │ │ │ +Dune::DenseVector::Iterator │ │ │ │ │ +DenseIterator< DenseVector, value_type > Iterator │ │ │ │ │ +Iterator class for sequential access. │ │ │ │ │ +Definition: densevector.hh:342 │ │ │ │ │ +Dune::DenseVector::operator-= │ │ │ │ │ +derived_type & operator-=(const DenseVector< Other > &x) │ │ │ │ │ +vector space subtraction │ │ │ │ │ +Definition: densevector.hh:429 │ │ │ │ │ +Dune::DenseVector::DenseVector │ │ │ │ │ +DenseVector(const DenseVector &)=default │ │ │ │ │ +Dune::DenseVector::beforeEnd │ │ │ │ │ +Iterator beforeEnd() │ │ │ │ │ +Definition: densevector.hh:360 │ │ │ │ │ +Dune::DenseVector::operator+= │ │ │ │ │ +derived_type & operator+=(const DenseVector< Other > &x) │ │ │ │ │ +vector space addition │ │ │ │ │ +Definition: densevector.hh:419 │ │ │ │ │ +Dune::DenseVector::operator*= │ │ │ │ │ +std::enable_if< std::is_convertible< FieldType, field_type >::value, │ │ │ │ │ +derived_type >::type & operator*=(const FieldType &kk) │ │ │ │ │ +vector space multiplication with scalar │ │ │ │ │ +Definition: densevector.hh:523 │ │ │ │ │ +Dune::DenseVector::operator!= │ │ │ │ │ +bool operator!=(const DenseVector< Other > &x) const │ │ │ │ │ +Binary vector incomparison. │ │ │ │ │ +Definition: densevector.hh:567 │ │ │ │ │ +Dune::DenseVector::back │ │ │ │ │ +const value_type & back() const │ │ │ │ │ +return reference to last element │ │ │ │ │ +Definition: densevector.hh:324 │ │ │ │ │ +Dune::DenseVector::begin │ │ │ │ │ +ConstIterator begin() const │ │ │ │ │ +begin ConstIterator │ │ │ │ │ +Definition: densevector.hh:384 │ │ │ │ │ +Dune::DenseVector::operator* │ │ │ │ │ +PromotionTraits< field_type, typenameDenseVector< Other >::field_type >:: │ │ │ │ │ +PromotedType operator*(const DenseVector< Other > &x) const │ │ │ │ │ +indefinite vector dot product which corresponds to Petsc's VecTDot │ │ │ │ │ +Definition: densevector.hh:591 │ │ │ │ │ +Dune::DenseVector::DenseVector │ │ │ │ │ +constexpr DenseVector()=default │ │ │ │ │ +Dune::DenseVector::infinity_norm_real │ │ │ │ │ +FieldTraits< vt >::real_type infinity_norm_real() const │ │ │ │ │ +simplified infinity norm (uses Manhattan norm for complex values) │ │ │ │ │ +Definition: densevector.hh:677 │ │ │ │ │ +Dune::DenseVector::operator= │ │ │ │ │ +DenseVector & operator=(const DenseVector &)=default │ │ │ │ │ +Assignment operator for other DenseVector of same type. │ │ │ │ │ +Dune::DenseVector::block_type │ │ │ │ │ +Traits::value_type block_type │ │ │ │ │ +export the type representing the components │ │ │ │ │ +Definition: densevector.hh:256 │ │ │ │ │ +Dune::DenseVector::operator[] │ │ │ │ │ +value_type & operator[](size_type i) │ │ │ │ │ +random access │ │ │ │ │ +Definition: densevector.hh:295 │ │ │ │ │ +Dune::DenseVector::field_type │ │ │ │ │ +FieldTraits< value_type >::field_type field_type │ │ │ │ │ +export the type representing the field │ │ │ │ │ +Definition: densevector.hh:253 │ │ │ │ │ +Dune::DenseVector::back │ │ │ │ │ +value_type & back() │ │ │ │ │ +return reference to last element │ │ │ │ │ +Definition: densevector.hh:318 │ │ │ │ │ +Dune::DenseVector::operator- │ │ │ │ │ +derived_type operator-() const │ │ │ │ │ +Vector negation. │ │ │ │ │ +Definition: densevector.hh:454 │ │ │ │ │ +Dune::DenseVector::operator/= │ │ │ │ │ +std::enable_if< std::is_convertible< FieldType, field_type >::value, │ │ │ │ │ +derived_type >::type & operator/=(const FieldType &kk) │ │ │ │ │ +vector space division by scalar │ │ │ │ │ +Definition: densevector.hh:545 │ │ │ │ │ +Dune::DenseVector::one_norm_real │ │ │ │ │ +FieldTraits< value_type >::real_type one_norm_real() const │ │ │ │ │ +simplified one norm (uses Manhattan norm for complex values) │ │ │ │ │ +Definition: densevector.hh:632 │ │ │ │ │ +Dune::DenseVector::dot │ │ │ │ │ +PromotionTraits< field_type, typenameDenseVector< Other >::field_type >:: │ │ │ │ │ +PromotedType dot(const DenseVector< Other > &x) const │ │ │ │ │ +vector dot product which corresponds to Petsc's VecDot │ │ │ │ │ +Definition: densevector.hh:609 │ │ │ │ │ +Dune::DenseVector::find │ │ │ │ │ +Iterator find(size_type i) │ │ │ │ │ +return iterator to given element or end() │ │ │ │ │ +Definition: densevector.hh:373 │ │ │ │ │ +Dune::DenseVector::one_norm │ │ │ │ │ +FieldTraits< value_type >::real_type one_norm() const │ │ │ │ │ +one norm (sum over absolute values of entries) │ │ │ │ │ +Definition: densevector.hh:622 │ │ │ │ │ +Dune::DenseVector::N │ │ │ │ │ +size_type N() const │ │ │ │ │ +number of blocks in the vector (are of size 1 here) │ │ │ │ │ +Definition: densevector.hh:727 │ │ │ │ │ +Dune::DenseVector::empty │ │ │ │ │ +bool empty() const │ │ │ │ │ +checks whether the container is empty │ │ │ │ │ +Definition: densevector.hh:330 │ │ │ │ │ +Dune::FieldTraits<_DenseVector<_V_>_>::real_type │ │ │ │ │ +FieldTraits< typenameDenseMatVecTraits< V >::value_type >::real_type real_type │ │ │ │ │ +Definition: densevector.hh:28 │ │ │ │ │ +Dune::FieldTraits<_DenseVector<_V_>_>::field_type │ │ │ │ │ +FieldTraits< typenameDenseMatVecTraits< V >::value_type >::field_type │ │ │ │ │ +field_type │ │ │ │ │ +Definition: densevector.hh:27 │ │ │ │ │ +Dune::DenseIterator │ │ │ │ │ +Generic iterator class for dense vector and matrix implementations. │ │ │ │ │ +Definition: densevector.hh:131 │ │ │ │ │ +Dune::DenseIterator::increment │ │ │ │ │ +void increment() │ │ │ │ │ +Definition: densevector.hh:182 │ │ │ │ │ +Dune::DenseIterator::index │ │ │ │ │ +SizeType index() const │ │ │ │ │ +return index │ │ │ │ │ +Definition: densevector.hh:213 │ │ │ │ │ +Dune::DenseIterator::equals │ │ │ │ │ +bool equals(const MutableIterator &other) const │ │ │ │ │ +Definition: densevector.hh:167 │ │ │ │ │ +Dune::DenseIterator::DenseIterator │ │ │ │ │ +DenseIterator(const MutableIterator &other) │ │ │ │ │ +Definition: densevector.hh:158 │ │ │ │ │ +Dune::DenseIterator::equals │ │ │ │ │ +bool equals(const ConstIterator &other) const │ │ │ │ │ +Definition: densevector.hh:173 │ │ │ │ │ +Dune::DenseIterator::elementAt │ │ │ │ │ +R elementAt(DifferenceType i) const │ │ │ │ │ +Definition: densevector.hh:192 │ │ │ │ │ +Dune::DenseIterator::distanceTo │ │ │ │ │ +DifferenceType distanceTo(DenseIterator< const typename std::remove_const< C │ │ │ │ │ +>::type, const typename std::remove_const< T >::type > other) const │ │ │ │ │ +Definition: densevector.hh:200 │ │ │ │ │ +Dune::DenseIterator::decrement │ │ │ │ │ +void decrement() │ │ │ │ │ +Definition: densevector.hh:187 │ │ │ │ │ +Dune::DenseIterator::DenseIterator │ │ │ │ │ +DenseIterator(const ConstIterator &other) │ │ │ │ │ +Definition: densevector.hh:162 │ │ │ │ │ +Dune::DenseIterator::distanceTo │ │ │ │ │ +DifferenceType distanceTo(DenseIterator< typename std::remove_const< C >::type, │ │ │ │ │ +typename std::remove_const< T >::type > other) const │ │ │ │ │ +Definition: densevector.hh:206 │ │ │ │ │ +Dune::DenseIterator::DenseIterator │ │ │ │ │ +DenseIterator(C &cont, SizeType pos) │ │ │ │ │ +Definition: densevector.hh:154 │ │ │ │ │ +Dune::DenseIterator::DifferenceType │ │ │ │ │ +std::ptrdiff_t DifferenceType │ │ │ │ │ +The type of the difference between two positions. │ │ │ │ │ +Definition: densevector.hh:142 │ │ │ │ │ +Dune::DenseIterator::dereference │ │ │ │ │ +R dereference() const │ │ │ │ │ +Definition: densevector.hh:178 │ │ │ │ │ +Dune::DenseIterator::advance │ │ │ │ │ +void advance(DifferenceType n) │ │ │ │ │ +Definition: densevector.hh:196 │ │ │ │ │ +Dune::DenseIterator::SizeType │ │ │ │ │ +C::size_type SizeType │ │ │ │ │ +The type to index the underlying container. │ │ │ │ │ +Definition: densevector.hh:147 │ │ │ │ │ +Dune::FieldTraits │ │ │ │ │ +Definition: ftraits.hh:26 │ │ │ │ │ +Dune::FieldTraits::field_type │ │ │ │ │ +T field_type │ │ │ │ │ +export the type representing the field │ │ │ │ │ +Definition: ftraits.hh:28 │ │ │ │ │ +Dune::FieldTraits::real_type │ │ │ │ │ +T real_type │ │ │ │ │ +export the type representing the real type of the field │ │ │ │ │ +Definition: ftraits.hh:30 │ │ │ │ │ +Dune::mutable_reference │ │ │ │ │ +get the 'mutable' version of a reference to a const object │ │ │ │ │ +Definition: genericiterator.hh:116 │ │ │ │ │ +Dune::RandomAccessIteratorFacade │ │ │ │ │ +Base class for stl conformant forward iterators. │ │ │ │ │ +Definition: iteratorfacades.hh:434 │ │ │ │ │ +Dune::DenseMatVecTraits │ │ │ │ │ +Definition: matvectraits.hh:31 │ │ │ │ │ +Dune::PromotionTraits │ │ │ │ │ +Compute type of the result of an arithmetic operation involving two different │ │ │ │ │ +number types. │ │ │ │ │ +Definition: promotiontraits.hh:27 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00107.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: stringutility.hh File Reference │ │ │ │ +dune-common: fmatrix.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,57 +63,106 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
stringutility.hh File Reference
│ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

Miscellaneous helper stuff. │ │ │ │ +

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

│ │ │ │ -
#include <cstddef>
│ │ │ │ -#include <cstring>
│ │ │ │ +
#include <cmath>
│ │ │ │ +#include <cstddef>
│ │ │ │ +#include <iostream>
│ │ │ │ #include <algorithm>
│ │ │ │ -#include <cassert>
│ │ │ │ -#include <cstdio>
│ │ │ │ -#include <memory>
│ │ │ │ -#include <string>
│ │ │ │ -#include <new>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ +#include <initializer_list>
│ │ │ │ +#include <dune/common/boundschecking.hh>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/common/fvector.hh>
│ │ │ │ +#include <dune/common/densematrix.hh>
│ │ │ │ +#include <dune/common/precision.hh>
│ │ │ │ +#include <dune/common/promotiontraits.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/common/matrixconcepts.hh>
│ │ │ │ +#include "fmatrixev.hh"
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Classes

struct  Dune::DenseMatVecTraits< FieldMatrix< K, ROWS, COLS > >
 
struct  Dune::FieldTraits< FieldMatrix< K, ROWS, COLS > >
 
class  Dune::FieldMatrix< K, ROWS, COLS >
 A dense n x m matrix. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::FMatrixHelp
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<typename C >
bool Dune::hasPrefix (const C &c, const char *prefix)
 Check whether a character container has a given prefix. More...
 
template<typename C >
bool Dune::hasSuffix (const C &c, const char *suffix)
 Check whether a character container has a given suffix. More...
 
template<class... T>
static std::string Dune::formatString (const std::string &s, const T &... args)
 Format values according to printf format string. More...
 
template<typename K >
static K Dune::FMatrixHelp::invertMatrix (const FieldMatrix< K, 1, 1 > &matrix, FieldMatrix< K, 1, 1 > &inverse)
 invert scalar without changing the original matrix More...
 
template<typename K >
static K Dune::FMatrixHelp::invertMatrix_retTransposed (const FieldMatrix< K, 1, 1 > &matrix, FieldMatrix< K, 1, 1 > &inverse)
 invert scalar without changing the original matrix More...
 
template<typename K >
static K Dune::FMatrixHelp::invertMatrix (const FieldMatrix< K, 2, 2 > &matrix, FieldMatrix< K, 2, 2 > &inverse)
 invert 2x2 Matrix without changing the original matrix More...
 
template<typename K >
static K Dune::FMatrixHelp::invertMatrix_retTransposed (const FieldMatrix< K, 2, 2 > &matrix, FieldMatrix< K, 2, 2 > &inverse)
 
template<typename K >
static K Dune::FMatrixHelp::invertMatrix (const FieldMatrix< K, 3, 3 > &matrix, FieldMatrix< K, 3, 3 > &inverse)
 invert 3x3 Matrix without changing the original matrix More...
 
template<typename K >
static K Dune::FMatrixHelp::invertMatrix_retTransposed (const FieldMatrix< K, 3, 3 > &matrix, FieldMatrix< K, 3, 3 > &inverse)
 invert 3x3 Matrix without changing the original matrix More...
 
template<class K , int m, int n, int p>
static void Dune::FMatrixHelp::multMatrix (const FieldMatrix< K, m, n > &A, const FieldMatrix< K, n, p > &B, FieldMatrix< K, m, p > &ret)
 calculates ret = A * B More...
 
template<typename K , int rows, int cols>
static void Dune::FMatrixHelp::multTransposedMatrix (const FieldMatrix< K, rows, cols > &matrix, FieldMatrix< K, cols, cols > &ret)
 calculates ret= A_t*A More...
 
template<typename K , int rows, int cols>
static void Dune::FMatrixHelp::multAssignTransposed (const FieldMatrix< K, rows, cols > &matrix, const FieldVector< K, rows > &x, FieldVector< K, cols > &ret)
 calculates ret = matrix^T * x More...
 
template<typename K , int rows, int cols>
static FieldVector< K, rows > Dune::FMatrixHelp::mult (const FieldMatrix< K, rows, cols > &matrix, const FieldVector< K, cols > &x)
 calculates ret = matrix * x More...
 
template<typename K , int rows, int cols>
static FieldVector< K, cols > Dune::FMatrixHelp::multTransposed (const FieldMatrix< K, rows, cols > &matrix, const FieldVector< K, rows > &x)
 calculates ret = matrix^T * x More...
 
│ │ │ │

Detailed Description

│ │ │ │ -

Miscellaneous helper stuff.

│ │ │ │ +

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

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,45 +4,119 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Namespaces | Functions │ │ │ │ │ -stringutility.hh File Reference │ │ │ │ │ -Miscellaneous helper stuff. More... │ │ │ │ │ +Classes | Namespaces | Functions │ │ │ │ │ +fmatrix.hh File Reference │ │ │ │ │ +Common » Dense_Matrix_and_Vector_Template_Library │ │ │ │ │ +Implements a matrix constructed from a given type representing a field and │ │ │ │ │ +compile-time given number of rows and columns. More... │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "fmatrixev.hh" │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ + Classes │ │ │ │ │ +struct  Dune::DenseMatVecTraits<_FieldMatrix<_K,_ROWS,_COLS_>_> │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::FieldTraits<_FieldMatrix<_K,_ROWS,_COLS_>_> │ │ │ │ │ +  │ │ │ │ │ + class  Dune::FieldMatrix<_K,_ROWS,_COLS_> │ │ │ │ │ +  A dense n x m matrix. More... │ │ │ │ │ +  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ +namespace  Dune::FMatrixHelp │ │ │ │ │ +  │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ - bool Dune::hasPrefix (const C &c, const char *prefix) │ │ │ │ │ -  Check whether a character container has a given prefix. │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - bool Dune::hasSuffix (const C &c, const char *suffix) │ │ │ │ │ -  Check whether a character container has a given suffix. │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -static std::string Dune::formatString (const std::string &s, const T &... │ │ │ │ │ - args) │ │ │ │ │ -  Format values according to printf format string. More... │ │ │ │ │ +template │ │ │ │ │ + static K Dune::FMatrixHelp::invertMatrix (const │ │ │ │ │ + FieldMatrix< K, 1, 1 > &matrix, FieldMatrix< K, │ │ │ │ │ + 1, 1 > &inverse) │ │ │ │ │ +  invert scalar without changing the original │ │ │ │ │ + matrix More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + static K Dune::FMatrixHelp::invertMatrix_retTransposed │ │ │ │ │ + (const FieldMatrix< K, 1, 1 > &matrix, │ │ │ │ │ + FieldMatrix< K, 1, 1 > &inverse) │ │ │ │ │ +  invert scalar without changing the original │ │ │ │ │ + matrix More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + static K Dune::FMatrixHelp::invertMatrix (const │ │ │ │ │ + FieldMatrix< K, 2, 2 > &matrix, FieldMatrix< K, │ │ │ │ │ + 2, 2 > &inverse) │ │ │ │ │ +  invert 2x2 Matrix without changing the original │ │ │ │ │ + matrix More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + static K Dune::FMatrixHelp::invertMatrix_retTransposed │ │ │ │ │ + (const FieldMatrix< K, 2, 2 > &matrix, │ │ │ │ │ + FieldMatrix< K, 2, 2 > &inverse) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + static K Dune::FMatrixHelp::invertMatrix (const │ │ │ │ │ + FieldMatrix< K, 3, 3 > &matrix, FieldMatrix< K, │ │ │ │ │ + 3, 3 > &inverse) │ │ │ │ │ +  invert 3x3 Matrix without changing the original │ │ │ │ │ + matrix More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + static K Dune::FMatrixHelp::invertMatrix_retTransposed │ │ │ │ │ + (const FieldMatrix< K, 3, 3 > &matrix, │ │ │ │ │ + FieldMatrix< K, 3, 3 > &inverse) │ │ │ │ │ +  invert 3x3 Matrix without changing the original │ │ │ │ │ + matrix More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + static void Dune::FMatrixHelp::multMatrix (const │ │ │ │ │ + FieldMatrix< K, m, n > &A, const FieldMatrix< K, │ │ │ │ │ + n, p > &B, FieldMatrix< K, m, p > &ret) │ │ │ │ │ +  calculates ret = A * B More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + static void Dune::FMatrixHelp::multTransposedMatrix (const │ │ │ │ │ + FieldMatrix< K, rows, cols > &matrix, │ │ │ │ │ + FieldMatrix< K, cols, cols > &ret) │ │ │ │ │ +  calculates ret= A_t*A More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + static void Dune::FMatrixHelp::multAssignTransposed (const │ │ │ │ │ + FieldMatrix< K, rows, cols > &matrix, const │ │ │ │ │ + FieldVector< K, rows > &x, FieldVector< K, cols │ │ │ │ │ + > &ret) │ │ │ │ │ +  calculates ret = matrix^T * x More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +static FieldVector< K, rows > Dune::FMatrixHelp::mult (const FieldMatrix< K, │ │ │ │ │ + rows, cols > &matrix, const FieldVector< K, cols │ │ │ │ │ + > &x) │ │ │ │ │ +  calculates ret = matrix * x More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +static FieldVector< K, cols > Dune::FMatrixHelp::multTransposed (const │ │ │ │ │ + FieldMatrix< K, rows, cols > &matrix, const │ │ │ │ │ + FieldVector< K, rows > &x) │ │ │ │ │ +  calculates ret = matrix^T * x More... │ │ │ │ │   │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -Miscellaneous helper stuff. │ │ │ │ │ +Implements a matrix constructed from a given type representing a field and │ │ │ │ │ +compile-time given number of rows and columns. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00107_source.html │ │ │ │ @@ -21,1108 +21,10366 @@ │ │ │ │ 00000140: 6f6e 7465 6e74 3d22 446f 7879 6765 6e20 ontent="Doxygen │ │ │ │ 00000150: 312e 392e 3422 2f3e 0a3c 6d65 7461 206e 1.9.4"/>..< │ │ │ │ 000001a0: 7469 746c 653e 6475 6e65 2d63 6f6d 6d6f title>dune-commo │ │ │ │ -000001b0: 6e3a 2073 7472 696e 6775 7469 6c69 7479 n: stringutility │ │ │ │ -000001c0: 2e68 6820 536f 7572 6365 2046 696c 653c .hh Source File< │ │ │ │ -000001d0: 2f74 6974 6c65 3e0a 3c6c 696e 6b20 6872 /title>. │ │ │ │ -00000210: 0a3c 7363 7269 7074 2074 7970 653d 2274 .........
...../* │ │ │ │ -00000690: 2040 6c69 6365 6e73 6520 6d61 676e 6574 @license magnet │ │ │ │ -000006a0: 3a3f 7874 3d75 726e 3a62 7469 683a 6433 :?xt=urn:btih:d3 │ │ │ │ -000006b0: 6439 6139 6136 3539 3535 3231 6639 3636 d9a9a6595521f966 │ │ │ │ -000006c0: 3661 3565 3934 6363 3833 3064 6162 3833 6a5e94cc830dab83 │ │ │ │ -000006d0: 6236 3536 3939 2661 6d70 3b64 6e3d 6578 b65699&dn=ex │ │ │ │ -000006e0: 7061 742e 7478 7420 4d49 5420 2a2f 0a24 pat.txt MIT */.$ │ │ │ │ -000006f0: 2866 756e 6374 696f 6e28 2920 7b0a 2020 (function() {. │ │ │ │ -00000700: 696e 6974 4d65 6e75 2827 272c 7472 7565 initMenu('',true │ │ │ │ -00000710: 2c66 616c 7365 2c27 7365 6172 6368 2e70 ,false,'search.p │ │ │ │ -00000720: 6870 272c 2753 6561 7263 6827 293b 0a20 hp','Search');. │ │ │ │ -00000730: 2024 2864 6f63 756d 656e 7429 2e72 6561 $(document).rea │ │ │ │ -00000740: 6479 2866 756e 6374 696f 6e28 2920 7b20 dy(function() { │ │ │ │ -00000750: 696e 6974 5f73 6561 7263 6828 293b 207d init_search(); } │ │ │ │ -00000760: 293b 0a7d 293b 0a2f 2a20 406c 6963 656e );.});./* @licen │ │ │ │ -00000770: 7365 2d65 6e64 202a 2f0a 3c2f 7363 7269 se-end */..
..
.
...
.. │ │ │ │ -00000960: 3c2f 6966 7261 6d65 3e0a 3c2f 6469 763e .
│ │ │ │ -00000970: 0a0a 3c64 6976 2069 643d 226e 6176 2d70 ... │ │ │ │ -00000a80: 0a3c 6469 7620 636c 6173 733d 2268 6561 .
.
stringutilit │ │ │ │ -00000ad0: 792e 6868 3c2f 6469 763e 3c2f 6469 763e y.hh
│ │ │ │ -00000ae0: 0a3c 2f64 6976 3e3c 212d 2d68 6561 6465 .
.
.Go to the docu │ │ │ │ -00000b30: 6d65 6e74 6174 696f 6e20 6f66 2074 6869 mentation of thi │ │ │ │ -00000b40: 7320 6669 6c65 2e3c 2f61 3e3c 6469 7620 s file.
│ │ │ │ -00000b90: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 1// -* │ │ │ │ -00000bd0: 2d20 7461 622d 7769 6474 683a 2034 3b20 - tab-width: 4; │ │ │ │ -00000be0: 696e 6465 6e74 2d74 6162 732d 6d6f 6465 indent-tabs-mode │ │ │ │ -00000bf0: 3a20 6e69 6c3b 2063 2d62 6173 6963 2d6f : nil; c-basic-o │ │ │ │ -00000c00: 6666 7365 743a 2032 202d 2a2d 3c2f 7370 ffset: 2 -*-
.
2// vi: set e │ │ │ │ -00000c90: 7420 7473 3d34 2073 773d 3220 7374 733d t ts=4 sw=2 sts= │ │ │ │ -00000ca0: 323a 3c2f 7370 616e 3e3c 2f64 6976 3e0a 2:
. │ │ │ │ -00000cb0: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65 . │ │ │ │ -00000da0: 3c61 2069 643d 226c 3030 3030 3422 206e 4// SPDX- │ │ │ │ -00000e00: 4c69 6365 6e73 652d 4964 656e 7469 6669 License-Identifi │ │ │ │ -00000e10: 6572 3a20 4c69 6365 6e73 6552 6566 2d47 er: LicenseRef-G │ │ │ │ -00000e20: 504c 2d32 2e30 2d6f 6e6c 792d 7769 7468 PL-2.0-only-with │ │ │ │ -00000e30: 2d44 554e 452d 6578 6365 7074 696f 6e3c -DUNE-exception< │ │ │ │ -00000e40: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ -00000e60: 6120 6964 3d22 6c30 3030 3035 2220 6e61 a id="l00005" na │ │ │ │ -00000e70: 6d65 3d22 6c30 3030 3035 223e 3c2f 613e me="l00005"> │ │ │ │ -00000e80: 3c73 7061 6e20 636c 6173 733d 226c 696e 5#ifn │ │ │ │ -00000ec0: 6465 6620 4455 4e45 5f43 4f4d 4d4f 4e5f def DUNE_COMMON_ │ │ │ │ -00000ed0: 5354 5249 4e47 5554 494c 4954 595f 4848 STRINGUTILITY_HH │ │ │ │ -00000ee0: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ -00000f00: 3c61 2069 643d 226c 3030 3030 3622 206e 6#de │ │ │ │ -00000f60: 6669 6e65 2044 554e 455f 434f 4d4d 4f4e fine DUNE_COMMON │ │ │ │ -00000f70: 5f53 5452 494e 4755 5449 4c49 5459 5f48 _STRINGUTILITY_H │ │ │ │ -00000f80: 483c 2f73 7061 6e3e 3c2f 6469 763e 0a3c H
.< │ │ │ │ -00000f90: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00000fa0: 3e3c 6120 6964 3d22 6c30 3030 3037 2220 > 7
.
12< │ │ │ │ -00001040: 7370 616e 2063 6c61 7373 3d22 7072 6570 span class="prep │ │ │ │ -00001050: 726f 6365 7373 6f72 223e 2369 6e63 6c75 rocessor">#inclu │ │ │ │ -00001060: 6465 2026 6c74 3b63 7374 6464 6566 2667 de <cstddef&g │ │ │ │ -00001070: 743b 3c2f 7370 616e 3e3c 2f64 6976 3e0a t;
. │ │ │ │ -00001080: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
< │ │ │ │ -000010b0: 2f61 3e3c 7370 616e 2063 6c61 7373 3d22 /a> 13# │ │ │ │ -000010f0: 696e 636c 7564 6520 266c 743b 6373 7472 include <cstr │ │ │ │ -00001100: 696e 6726 6774 3b3c 2f73 7061 6e3e 3c2f ing>.
│ │ │ │ -00001160: 3134 3c2f 7370 616e 3e3c 7370 616e 2063 14#include < │ │ │ │ -00001190: 3b61 6c67 6f72 6974 686d 2667 743b 3c2f ;algorithm>
.
< │ │ │ │ -000011e0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -000011f0: 6e6f 223e 2020 2031 353c 2f73 7061 6e3e no"> 15 │ │ │ │ -00001200: 3c73 7061 6e20 636c 6173 733d 2270 7265 #incl │ │ │ │ -00001220: 7564 6520 266c 743b 6361 7373 6572 7426 ude <cassert& │ │ │ │ -00001230: 6774 3b3c 2f73 7061 6e3e 3c2f 6469 763e gt;
│ │ │ │ -00001240: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -00001270: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 16 │ │ │ │ -000012b0: 2369 6e63 6c75 6465 2026 6c74 3b63 7374 #include <cst │ │ │ │ -000012c0: 6469 6f26 6774 3b3c 2f73 7061 6e3e 3c2f dio>.
│ │ │ │ -00001320: 3137 3c2f 7370 616e 3e3c 7370 616e 2063 17#include < │ │ │ │ -00001350: 3b6d 656d 6f72 7926 6774 3b3c 2f73 7061 ;memory>
.
18#include │ │ │ │ -000013e0: 2026 6c74 3b73 7472 696e 6726 6774 3b3c <string>< │ │ │ │ -000013f0: 2f73 7061 6e3e 3c2f 6469 763e 0a3c 6469 /span>
.< │ │ │ │ -00001410: 6120 6964 3d22 6c30 3030 3139 2220 6e61 a id="l00019" na │ │ │ │ -00001420: 6d65 3d22 6c30 3030 3139 223e 3c2f 613e me="l00019"> │ │ │ │ -00001430: 3c73 7061 6e20 636c 6173 733d 226c 696e 19#inc │ │ │ │ -00001470: 6c75 6465 2026 6c74 3b6e 6577 2667 743b lude <new> │ │ │ │ -00001480: 3c2f 7370 616e 3e3c 2f64 6976 3e0a 3c64
. │ │ │ │ -000014a0: 3c61 2069 643d 226c 3030 3032 3022 206e 20
..
│ │ │ │ -00001600: 2020 2032 323c 2f73 7061 6e3e 203c 2f64 22 .
2 │ │ │ │ -00001660: 333c 2f73 7061 6e3e 203c 2f64 6976 3e0a 3
. │ │ │ │ -00001670: 3c64 6976 2063 6c61 7373 3d22 6c69 6e65
.
< │ │ │ │ -00001760: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00001770: 6e6f 223e 2020 2032 353c 2f73 7061 6e3e no"> 25 │ │ │ │ -00001780: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ │ -000017d0: 2020 2033 363c 2f73 7061 6e3e 2020 3c73 36 template<typ │ │ │ │ -00001820: 656e 616d 653c 2f73 7061 6e3e 2043 2667 ename C&g │ │ │ │ -00001830: 743b 3c2f 6469 763e 0a3c 6469 7620 636c t;
.
37 │ │ │ │ -000018d0: 3c2f 7370 616e 3e20 203c 7370 616e 2063 bool < │ │ │ │ -00001900: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ -00001910: 5f66 756e 6374 696f 6e22 2068 7265 663d _function" href= │ │ │ │ -00001920: 2261 3030 3430 322e 6874 6d6c 2367 6166 "a00402.html#gaf │ │ │ │ -00001930: 3331 3032 3865 6461 6233 3937 6365 3031 31028edab397ce01 │ │ │ │ -00001940: 6530 3139 3261 3238 3233 3438 3866 3722 e0192a2823488f7" │ │ │ │ -00001950: 3e68 6173 5072 6566 6978 3c2f 613e 283c >hasPrefix(< │ │ │ │ -00001960: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -00001970: 6f72 6422 3e63 6f6e 7374 3c2f 7370 616e ord">const C& c, const < │ │ │ │ -000019b0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -000019c0: 6f72 6474 7970 6522 3e63 6861 723c 2f73 ordtype">char* prefix) {< │ │ │ │ -000019e0: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -00001a30: 2033 383c 2f73 7061 6e3e 2020 2020 7374 38 st │ │ │ │ -00001a40: 643a 3a73 697a 655f 7420 6c65 6e20 3d20 d::size_t len = │ │ │ │ -00001a50: 7374 643a 3a73 7472 6c65 6e28 7072 6566 std::strlen(pref │ │ │ │ -00001a60: 6978 293b 3c2f 6469 763e 0a3c 6469 7620 ix);
.
39 │ │ │ │ -00001ac0: 2020 203c 7370 616e 2063 6c61 7373 3d22 ret │ │ │ │ -00001ae0: 7572 6e3c 2f73 7061 6e3e 2063 2e73 697a urn c.siz │ │ │ │ -00001af0: 6528 2920 2667 743b 3d20 6c65 6e20 2661 e() >= len &a │ │ │ │ -00001b00: 6d70 3b26 616d 703b 3c2f 6469 763e 0a3c mp;&
.< │ │ │ │ -00001b10: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00001b20: 3e3c 6120 6964 3d22 6c30 3030 3430 2220 > 40 st │ │ │ │ -00001b70: 643a 3a65 7175 616c 2870 7265 6669 782c d::equal(prefix, │ │ │ │ -00001b80: 2070 7265 6669 782b 6c65 6e2c 2063 2e62 prefix+len, c.b │ │ │ │ -00001b90: 6567 696e 2829 293b 3c2f 6469 763e 0a3c egin());
.< │ │ │ │ -00001ba0: 6469 7620 636c 6173 733d 226c 696e 6522 div class="line" │ │ │ │ -00001bb0: 3e3c 6120 6964 3d22 6c30 3030 3431 2220 > 41 }
.< │ │ │ │ -00001c10: 6120 6964 3d22 6c30 3030 3432 2220 6e61 a id="l00042" na │ │ │ │ -00001c20: 6d65 3d22 6c30 3030 3432 223e 3c2f 613e me="l00042"> │ │ │ │ -00001c30: 3c73 7061 6e20 636c 6173 733d 226c 696e 42
.
52 < │ │ │ │ -00001cb0: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -00001cc0: 6f72 6422 3e74 656d 706c 6174 653c 2f73 ord">template<ty │ │ │ │ -00001cf0: 7065 6e61 6d65 3c2f 7370 616e 3e20 4326 pename C& │ │ │ │ -00001d00: 6774 3b3c 2f64 6976 3e0a 3c64 6976 2063 gt;
.
53 bool │ │ │ │ -00001dd0: 3c61 2063 6c61 7373 3d22 636f 6465 2068 hasSuffix( │ │ │ │ -00001e30: 3c73 7061 6e20 636c 6173 733d 226b 6579 const C& c, const │ │ │ │ -00001e80: 3c73 7061 6e20 636c 6173 733d 226b 6579 char* suffix) { │ │ │ │ -00001eb0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -00001f00: 2020 3534 3c2f 7370 616e 3e20 2020 2073 54 s │ │ │ │ -00001f10: 7464 3a3a 7369 7a65 5f74 206c 656e 203d td::size_t len = │ │ │ │ -00001f20: 2073 7464 3a3a 7374 726c 656e 2873 7566 std::strlen(suf │ │ │ │ -00001f30: 6669 7829 3b3c 2f64 6976 3e0a 3c64 6976 fix);
.
< │ │ │ │ -00001f70: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00001f80: 6e6f 223e 2020 2035 353c 2f73 7061 6e3e no"> 55 │ │ │ │ -00001f90: 2020 2020 3c73 7061 6e20 636c 6173 733d if │ │ │ │ -00001fb0: 3c2f 7370 616e 3e28 632e 7369 7a65 2829 (c.size() │ │ │ │ -00001fc0: 2026 6c74 3b20 6c65 6e29 203c 7370 616e < len) return false;
.< │ │ │ │ -00002030: 6120 6964 3d22 6c30 3030 3536 2220 6e61 a id="l00056" na │ │ │ │ -00002040: 6d65 3d22 6c30 3030 3536 223e 3c2f 613e me="l00056"> │ │ │ │ -00002050: 3c73 7061 6e20 636c 6173 733d 226c 696e 56 typen │ │ │ │ -00002090: 616d 653c 2f73 7061 6e3e 2043 3a3a 636f ame C::co │ │ │ │ -000020a0: 6e73 745f 6974 6572 6174 6f72 2069 7420 nst_iterator it │ │ │ │ -000020b0: 3d20 632e 6265 6769 6e28 293b 3c2f 6469 = c.begin();.
57 │ │ │ │ -00002110: 3c2f 7370 616e 3e20 2020 2073 7464 3a3a std:: │ │ │ │ -00002120: 6164 7661 6e63 6528 6974 2c20 632e 7369 advance(it, c.si │ │ │ │ -00002130: 7a65 2829 202d 206c 656e 293b 3c2f 6469 ze() - len);.
58 │ │ │ │ -00002190: 3c2f 7370 616e 3e20 2020 203c 7370 616e return std::equal(su │ │ │ │ -000021d0: 6666 6978 2c20 7375 6666 6978 2b6c 656e ffix, suffix+len │ │ │ │ -000021e0: 2c20 6974 293b 3c2f 6469 763e 0a3c 6469 , it);
.< │ │ │ │ -00002200: 6120 6964 3d22 6c30 3030 3539 2220 6e61 a id="l00059" na │ │ │ │ -00002210: 6d65 3d22 6c30 3030 3539 223e 3c2f 613e me="l00059"> │ │ │ │ -00002220: 3c73 7061 6e20 636c 6173 733d 226c 696e 59 }
.
60 │ │ │ │ -000022a0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -000022f0: 2020 3732 3c2f 7370 616e 3e20 203c 7370 72 template<clas │ │ │ │ -00002340: 733c 2f73 7061 6e3e 2e2e 2e20 5426 6774 s... T> │ │ │ │ -00002350: 3b3c 2f64 6976 3e0a 3c64 6976 2063 6c61 ;
.
│ │ │ │ -000023a0: 3c61 2063 6c61 7373 3d22 6c69 6e65 2220 73< │ │ │ │ -000023f0: 2f73 7061 6e3e 2020 3c73 7061 6e20 636c /span> st │ │ │ │ -00002410: 6174 6963 3c2f 7370 616e 3e20 7374 643a atic std: │ │ │ │ -00002420: 3a73 7472 696e 6720 3c61 2063 6c61 7373 :string format │ │ │ │ -00002480: 5374 7269 6e67 3c2f 613e 283c 7370 616e String(const st │ │ │ │ -000024b0: 643a 3a73 7472 696e 6726 616d 703b 2073 d::string& s │ │ │ │ -000024c0: 2c20 3c73 7061 6e20 636c 6173 733d 226b , const T&... a │ │ │ │ -000024f0: 7267 7329 3c2f 6469 763e 0a3c 6469 7620 rgs)
.
74 │ │ │ │ -00002550: 207b 3c2f 6469 763e 0a3c 6469 7620 636c {
.
75 │ │ │ │ -000025b0: 203c 7370 616e 2063 6c61 7373 3d22 6b65 static const │ │ │ │ -000025f0: 3c2f 7370 616e 3e20 3c73 7061 6e20 636c int buf │ │ │ │ -00002620: 6665 7253 697a 653d 3130 3030 3b3c 2f64 ferSize=1000;.
7 │ │ │ │ -00002680: 363c 2f73 7061 6e3e 2020 2020 3c73 7061 6 char buffer[bufferS │ │ │ │ -000026c0: 697a 655d 3b3c 2f64 6976 3e0a 3c64 6976 ize];
.
< │ │ │ │ -00002700: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00002710: 6e6f 223e 2020 2037 373c 2f73 7061 6e3e no"> 77 │ │ │ │ -00002720: 203c 2f64 6976 3e0a 3c64 6976 2063 6c61
.
│ │ │ │ -00002770: 2020 2037 383c 2f73 7061 6e3e 2020 2020 78 │ │ │ │ -00002780: 3c73 7061 6e20 636c 6173 733d 2263 6f6d // try to │ │ │ │ -000027a0: 666f 726d 6174 2077 6974 6820 7374 6174 format with stat │ │ │ │ -000027b0: 6963 2062 7566 6665 723c 2f73 7061 6e3e ic buffer │ │ │ │ -000027c0: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -00002810: 2020 3739 3c2f 7370 616e 3e20 2020 203c 79 < │ │ │ │ -00002820: 7370 616e 2063 6c61 7373 3d22 6b65 7977 span class="keyw │ │ │ │ -00002830: 6f72 6474 7970 6522 3e69 6e74 3c2f 7370 ordtype">int r = std::snp │ │ │ │ -00002850: 7269 6e74 6628 6275 6666 6572 2c20 6275 rintf(buffer, bu │ │ │ │ -00002860: 6666 6572 5369 7a65 2c20 732e 635f 7374 fferSize, s.c_st │ │ │ │ -00002870: 7228 292c 2061 7267 732e 2e2e 293b 3c2f r(), args...);.
│ │ │ │ -000028d0: 3830 3c2f 7370 616e 3e20 3c2f 6469 763e 80
│ │ │ │ -000028e0: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -00002910: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 81 / │ │ │ │ -00002950: 2f20 6e65 6761 7469 7665 2072 6574 7572 / negative retur │ │ │ │ -00002960: 6e20 7661 6c75 6573 2063 6f72 7265 7370 n values corresp │ │ │ │ -00002970: 6f6e 6420 746f 2065 7272 6f72 733c 2f73 ond to errors
.
82 │ │ │ │ -000029e0: 2020 203c 7370 616e 2063 6c61 7373 3d22 if< │ │ │ │ -00002a00: 2f73 7061 6e3e 2028 7226 6c74 3b30 293c /span> (r<0)< │ │ │ │ -00002a10: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -00002a60: 2038 333c 2f73 7061 6e3e 2020 2020 2020 83 │ │ │ │ -00002a70: 3c61 2063 6c61 7373 3d22 636f 6465 2068 │ │ │ │ -00002ac0: 4455 4e45 5f54 4852 4f57 3c2f 613e 283c DUNE_THROW(< │ │ │ │ -00002ad0: 6120 636c 6173 733d 2263 6f64 6520 686c a class="code hl │ │ │ │ -00002ae0: 5f63 6c61 7373 2220 6872 6566 3d22 6130 _class" href="a0 │ │ │ │ -00002af0: 3135 3438 2e68 746d 6c22 3e44 756e 653a 1548.html">Dune: │ │ │ │ -00002b00: 3a45 7863 6570 7469 6f6e 3c2f 613e 2c3c :Exception,< │ │ │ │ -00002b10: 7370 616e 2063 6c61 7373 3d22 7374 7269 span class="stri │ │ │ │ -00002b20: 6e67 6c69 7465 7261 6c22 3e26 7175 6f74 ngliteral">" │ │ │ │ -00002b30: 3b43 6f75 6c64 206e 6f74 2063 6f6e 7665 ;Could not conve │ │ │ │ -00002b40: 7274 2066 6f72 6d61 7420 7374 7269 6e67 rt format string │ │ │ │ -00002b50: 2075 7369 6e67 2067 6976 656e 2061 7267 using given arg │ │ │ │ -00002b60: 756d 656e 7473 2e26 7175 6f74 3b3c 2f73 uments.");
.< │ │ │ │ -00002b90: 6120 6964 3d22 6c30 3030 3834 2220 6e61 a id="l00084" na │ │ │ │ -00002ba0: 6d65 3d22 6c30 3030 3834 223e 3c2f 613e me="l00084"> │ │ │ │ -00002bb0: 3c73 7061 6e20 636c 6173 733d 226c 696e 84
.
85 │ │ │ │ -00002c30: 203c 7370 616e 2063 6c61 7373 3d22 636f // if buf │ │ │ │ -00002c50: 6665 7220 7761 7320 6c61 7267 6520 656e fer was large en │ │ │ │ -00002c60: 6f75 6768 2072 6574 7572 6e20 7265 7375 ough return resu │ │ │ │ -00002c70: 6c74 2061 7320 7374 7269 6e67 3c2f 7370 lt as string
.
86 │ │ │ │ -00002ce0: 2020 3c73 7061 6e20 636c 6173 733d 226b if (r<buff │ │ │ │ -00002d10: 6572 5369 7a65 293c 2f64 6976 3e0a 3c64 erSize)
. │ │ │ │ -00002d30: 3c61 2069 643d 226c 3030 3038 3722 206e 87 return │ │ │ │ -00002da0: 7374 643a 3a73 7472 696e 6728 6275 6666 std::string(buff │ │ │ │ -00002db0: 6572 293b 3c2f 6469 763e 0a3c 6469 7620 er);
.
88 │ │ │ │ -00002e10: 3c2f 6469 763e 0a3c 6469 7620 636c 6173
.
│ │ │ │ -00002e60: 2020 3839 3c2f 7370 616e 3e20 2020 203c 89 < │ │ │ │ -00002e70: 7370 616e 2063 6c61 7373 3d22 636f 6d6d span class="comm │ │ │ │ -00002e80: 656e 7422 3e2f 2f20 6966 2062 7566 6665 ent">// if buffe │ │ │ │ -00002e90: 7220 7761 7320 746f 2073 6d61 6c6c 2061 r was to small a │ │ │ │ -00002ea0: 6c6c 6f63 6174 6520 6120 6c61 7267 6572 llocate a larger │ │ │ │ -00002eb0: 2062 7566 6665 7220 7573 696e 673c 2f73 buffer using
.
90 │ │ │ │ -00002f20: 2020 203c 7370 616e 2063 6c61 7373 3d22 // the │ │ │ │ -00002f40: 7072 6564 6963 7465 6420 7369 7a65 2068 predicted size h │ │ │ │ -00002f50: 696e 7420 282b 3120 666f 7220 7468 6520 int (+1 for the │ │ │ │ -00002f60: 7465 726d 696e 6174 696e 6720 302d 6279 terminating 0-by │ │ │ │ -00002f70: 7465 292e 3c2f 7370 616e 3e3c 2f64 6976 te).
.
91< │ │ │ │ -00002fd0: 2f73 7061 6e3e 2020 2020 3c73 7061 6e20 /span> int d │ │ │ │ -00003000: 796e 616d 6963 4275 6666 6572 5369 7a65 ynamicBufferSize │ │ │ │ -00003010: 203d 2072 2b31 3b3c 2f64 6976 3e0a 3c64 = r+1;
. │ │ │ │ -00003030: 3c61 2069 643d 226c 3030 3039 3222 206e 92
.
93 │ │ │ │ -000030d0: 2020 7374 643a 3a75 6e69 7175 655f 7074 std::unique_pt │ │ │ │ -000030e0: 7226 6c74 3b63 6861 725b 5d26 6774 3b20 r<char[]> │ │ │ │ -000030f0: 6479 6e61 6d69 6342 7566 6665 723b 3c2f dynamicBuffer;.
│ │ │ │ -00003150: 3934 3c2f 7370 616e 3e20 2020 203c 7370 94 try {
.
95 │ │ │ │ -000031e0: 2020 2020 6479 6e61 6d69 6342 7566 6665 dynamicBuffe │ │ │ │ -000031f0: 7220 3d20 7374 643a 3a6d 616b 655f 756e r = std::make_un │ │ │ │ -00003200: 6971 7565 266c 743b 6368 6172 5b5d 2667 ique<char[]&g │ │ │ │ -00003210: 743b 2864 796e 616d 6963 4275 6666 6572 t;(dynamicBuffer │ │ │ │ -00003220: 5369 7a65 293b 3c2f 6469 763e 0a3c 6469 Size);
.< │ │ │ │ -00003240: 6120 6964 3d22 6c30 3030 3936 2220 6e61 a id="l00096" na │ │ │ │ -00003250: 6d65 3d22 6c30 3030 3936 223e 3c2f 613e me="l00096"> │ │ │ │ -00003260: 3c73 7061 6e20 636c 6173 733d 226c 696e 96 }
.< │ │ │ │ -000032a0: 6120 6964 3d22 6c30 3030 3937 2220 6e61 a id="l00097" na │ │ │ │ -000032b0: 6d65 3d22 6c30 3030 3937 223e 3c2f 613e me="l00097"> │ │ │ │ -000032c0: 3c73 7061 6e20 636c 6173 733d 226c 696e 97 c │ │ │ │ -00003300: 6174 6368 3c2f 7370 616e 3e20 283c 7370 atch (const │ │ │ │ -00003330: 7374 643a 3a62 6164 5f61 6c6c 6f63 2661 std::bad_alloc&a │ │ │ │ -00003340: 6d70 3b29 207b 3c2f 6469 763e 0a3c 6469 mp;) {
.< │ │ │ │ -00003360: 6120 6964 3d22 6c30 3030 3938 2220 6e61 a id="l00098" na │ │ │ │ -00003370: 6d65 3d22 6c30 3030 3938 223e 3c2f 613e me="l00098"> │ │ │ │ -00003380: 3c73 7061 6e20 636c 6173 733d 226c 696e 98 DUNE_THRO │ │ │ │ -00003400: 573c 2f61 3e28 3c61 2063 6c61 7373 3d22 W(Dune::Exceptio │ │ │ │ -00003440: 6e3c 2f61 3e2c 3c73 7061 6e20 636c 6173 n,"Could al │ │ │ │ -00003470: 6c6f 6361 7465 206c 6172 6765 2065 6e6f locate large eno │ │ │ │ -00003480: 7567 6820 6479 6e61 6d69 6320 6275 6666 ugh dynamic buff │ │ │ │ -00003490: 6572 2069 6e20 666f 726d 6174 5374 7269 er in formatStri │ │ │ │ -000034a0: 6e67 2e26 7175 6f74 3b3c 2f73 7061 6e3e ng." │ │ │ │ -000034b0: 293b 3c2f 6469 763e 0a3c 6469 7620 636c );.
99 │ │ │ │ -00003510: 207d 3c2f 6469 763e 0a3c 6469 7620 636c }
.
100 .
1 │ │ │ │ -000035c0: 3031 3c2f 7370 616e 3e20 2020 203c 7370 01 // convert an │ │ │ │ -000035f0: 6420 6368 6563 6b20 666f 7220 6572 726f d check for erro │ │ │ │ -00003600: 7273 2061 6761 696e 3c2f 7370 616e 3e3c rs again< │ │ │ │ -00003610: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -00003660: 3130 323c 2f73 7061 6e3e 2020 2020 7220 102 r │ │ │ │ -00003670: 3d20 7374 643a 3a73 6e70 7269 6e74 6628 = std::snprintf( │ │ │ │ -00003680: 6479 6e61 6d69 6342 7566 6665 722e 6765 dynamicBuffer.ge │ │ │ │ -00003690: 7428 292c 2064 796e 616d 6963 4275 6666 t(), dynamicBuff │ │ │ │ -000036a0: 6572 5369 7a65 2c20 732e 635f 7374 7228 erSize, s.c_str( │ │ │ │ -000036b0: 292c 2061 7267 732e 2e2e 293b 3c2f 6469 ), args...);.
103 │ │ │ │ -00003710: 3c2f 7370 616e 3e20 2020 203c 7370 616e if ( │ │ │ │ -00003740: 7226 6c74 3b30 293c 2f64 6976 3e0a 3c64 r<0)
. │ │ │ │ -00003760: 3c61 2069 643d 226c 3030 3130 3422 206e 104 DUNE_THR │ │ │ │ -00003800: 4f57 3c2f 613e 283c 6120 636c 6173 733d OW(Dune::Excepti │ │ │ │ -00003840: 6f6e 3c2f 613e 2c3c 7370 616e 2063 6c61 on,"Could n │ │ │ │ -00003870: 6f74 2063 6f6e 7665 7274 2066 6f72 6d61 ot convert forma │ │ │ │ -00003880: 7420 7374 7269 6e67 2075 7369 6e67 2067 t string using g │ │ │ │ -00003890: 6976 656e 2061 7267 756d 656e 7473 2e26 iven arguments.& │ │ │ │ -000038a0: 7175 6f74 3b3c 2f73 7061 6e3e 293b 3c2f quot;);.
1 │ │ │ │ -00003900: 3035 3c2f 7370 616e 3e20 3c2f 6469 763e 05
│ │ │ │ -00003910: 0a3c 6469 7620 636c 6173 733d 226c 696e .
│ │ │ │ -00003940: 3c2f 613e 3c73 7061 6e20 636c 6173 733d 106 / │ │ │ │ -00003980: 2f20 7468 6520 6e65 7720 6275 6666 6572 / the new buffer │ │ │ │ -00003990: 2073 686f 756c 6420 616c 7761 7973 2062 should always b │ │ │ │ -000039a0: 6520 6c61 7267 6520 656e 6f75 6768 3c2f e large enough
.
< │ │ │ │ -000039f0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00003a00: 6e6f 223e 2020 3130 373c 2f73 7061 6e3e no"> 107 │ │ │ │ -00003a10: 2020 2020 6173 7365 7274 2872 266c 743b assert(r< │ │ │ │ -00003a20: 6479 6e61 6d69 6342 7566 6665 7253 697a dynamicBufferSiz │ │ │ │ -00003a30: 6529 3b3c 2f64 6976 3e0a 3c64 6976 2063 e);
.
108 < │ │ │ │ -00003a90: 2f64 6976 3e0a 3c64 6976 2063 6c61 7373 /div>.
│ │ │ │ -00003ae0: 3130 393c 2f73 7061 6e3e 2020 2020 3c73 109 return std::strin │ │ │ │ -00003b20: 6728 6479 6e61 6d69 6342 7566 6665 722e g(dynamicBuffer. │ │ │ │ -00003b30: 6765 7428 2929 3b3c 2f64 6976 3e0a 3c64 get());
. │ │ │ │ -00003b50: 3c61 2069 643d 226c 3030 3131 3022 206e 110 }
.
< │ │ │ │ -00003bd0: 7370 616e 2063 6c61 7373 3d22 6c69 6e65 span class="line │ │ │ │ -00003be0: 6e6f 223e 2020 3131 333c 2f73 7061 6e3e no"> 113 │ │ │ │ -00003bf0: 7d3c 2f64 6976 3e0a 3c64 6976 2063 6c61 }
.
│ │ │ │ -00003c40: 2020 3131 343c 2f73 7061 6e3e 203c 2f64 114 .
11 │ │ │ │ -00003ca0: 353c 2f73 7061 6e3e 3c73 7061 6e20 636c 5#endif // DUNE_C │ │ │ │ -00003cf0: 4f4d 4d4f 4e5f 5354 5249 4e47 5554 494c OMMON_STRINGUTIL │ │ │ │ -00003d00: 4954 595f 4848 3c2f 7370 616e 3e3c 2f64 ITY_HH..
Dune:: │ │ │ │ -00003e50: 6861 7353 7566 6669 783c 2f61 3e3c 2f64 hasSuffix
bool hasS │ │ │ │ -00003e80: 7566 6669 7828 636f 6e73 7420 4320 2661 uffix(const C &a │ │ │ │ -00003e90: 6d70 3b63 2c20 636f 6e73 7420 6368 6172 mp;c, const char │ │ │ │ -00003ea0: 202a 7375 6666 6978 293c 2f64 6976 3e3c *suffix)
< │ │ │ │ -00003eb0: 6469 7620 636c 6173 733d 2274 7464 6f63 div class="ttdoc │ │ │ │ -00003ec0: 223e 4368 6563 6b20 7768 6574 6865 7220 ">Check whether │ │ │ │ -00003ed0: 6120 6368 6172 6163 7465 7220 636f 6e74 a character cont │ │ │ │ -00003ee0: 6169 6e65 7220 6861 7320 6120 6769 7665 ainer has a give │ │ │ │ -00003ef0: 6e20 7375 6666 6978 2e3c 2f64 6976 3e3c n suffix.
< │ │ │ │ -00003f00: 6469 7620 636c 6173 733d 2274 7464 6566 div class="ttdef │ │ │ │ -00003f10: 223e 3c62 3e44 6566 696e 6974 696f 6e3a ">Definition: │ │ │ │ -00003f20: 3c2f 623e 2073 7472 696e 6775 7469 6c69 stringutili │ │ │ │ -00003f30: 7479 2e68 683a 3533 3c2f 6469 763e 3c2f ty.hh:53
.
< │ │ │ │ -00003fa0: 6120 6872 6566 3d22 6130 3034 3032 2e68 a href="a00402.h │ │ │ │ -00003fb0: 746d 6c23 6761 6238 3235 3637 3263 6530 tml#gab825672ce0 │ │ │ │ -00003fc0: 3237 3334 3632 6362 3039 3262 6261 3730 273462cb092bba70 │ │ │ │ -00003fd0: 6633 3964 3062 223e 4475 6e65 3a3a 666f f39d0b">Dune::fo │ │ │ │ -00003fe0: 726d 6174 5374 7269 6e67 3c2f 613e 3c2f rmatString
static s │ │ │ │ -00004010: 7464 3a3a 7374 7269 6e67 2066 6f72 6d61 td::string forma │ │ │ │ -00004020: 7453 7472 696e 6728 636f 6e73 7420 7374 tString(const st │ │ │ │ -00004030: 643a 3a73 7472 696e 6720 2661 6d70 3b73 d::string &s │ │ │ │ -00004040: 2c20 636f 6e73 7420 5420 2661 6d70 3b2e , const T &. │ │ │ │ -00004050: 2e2e 2061 7267 7329 3c2f 6469 763e 3c64 .. args)
Format values a │ │ │ │ -00004080: 6363 6f72 6469 6e67 2074 6f20 7072 696e ccording to prin │ │ │ │ -00004090: 7466 2066 6f72 6d61 7420 7374 7269 6e67 tf format string │ │ │ │ -000040a0: 2e3c 2f64 6976 3e3c 6469 7620 636c 6173 .
Def │ │ │ │ -000040c0: 696e 6974 696f 6e3a 3c2f 623e 2073 7472 inition: str │ │ │ │ -000040d0: 696e 6775 7469 6c69 7479 2e68 683a 3733 ingutility.hh:73 │ │ │ │ -000040e0: 3c2f 6469 763e 3c2f 6469 763e 0a3c 6469
.
boo │ │ │ │ -000041b0: 6c20 6861 7350 7265 6669 7828 636f 6e73 l hasPrefix(cons │ │ │ │ -000041c0: 7420 4320 2661 6d70 3b63 2c20 636f 6e73 t C &c, cons │ │ │ │ -000041d0: 7420 6368 6172 202a 7072 6566 6978 293c t char *prefix)< │ │ │ │ -000041e0: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
Check wh │ │ │ │ -00004200: 6574 6865 7220 6120 6368 6172 6163 7465 ether a characte │ │ │ │ -00004210: 7220 636f 6e74 6169 6e65 7220 6861 7320 r container has │ │ │ │ -00004220: 6120 6769 7665 6e20 7072 6566 6978 2e3c a given prefix.< │ │ │ │ -00004230: 2f64 6976 3e3c 6469 7620 636c 6173 733d /div>
Defin │ │ │ │ -00004250: 6974 696f 6e3a 3c2f 623e 2073 7472 696e ition: strin │ │ │ │ -00004260: 6775 7469 6c69 7479 2e68 683a 3337 3c2f gutility.hh:37
.
DU │ │ │ │ -00004310: 4e45 5f54 4852 4f57 3c2f 613e 3c2f 6469 NE_THROW
#define DU │ │ │ │ -00004340: 4e45 5f54 4852 4f57 2845 2c20 6d29 3c2f NE_THROW(E, m)
Defini │ │ │ │ -00004370: 7469 6f6e 3a3c 2f62 3e20 6578 6365 7074 tion: except │ │ │ │ -00004380: 696f 6e73 2e68 683a 3231 383c 2f64 6976 ions.hh:218
.
< │ │ │ │ -000043d0: 6120 6872 6566 3d22 6130 3034 3235 2e68 a href="a00425.h │ │ │ │ -000043e0: 746d 6c22 3e44 756e 653c 2f61 3e3c 2f64 tml">Dune
Dune names │ │ │ │ -00004410: 7061 6365 2e3c 2f64 6976 3e3c 6469 7620 pace.
Definition: │ │ │ │ -00004440: 2061 6c69 676e 6564 616c 6c6f 6361 746f alignedallocato │ │ │ │ -00004450: 722e 6868 3a31 333c 2f64 6976 3e3c 2f64 r.hh:13
.
Bas │ │ │ │ -000044e0: 6520 636c 6173 7320 666f 7220 4475 6e65 e class for Dune │ │ │ │ -000044f0: 2d45 7863 6570 7469 6f6e 732e 3c2f 6469 -Exceptions.
Definiti │ │ │ │ -00004520: 6f6e 3a3c 2f62 3e20 6578 6365 7074 696f on: exceptio │ │ │ │ -00004530: 6e73 2e68 683a 3936 3c2f 6469 763e 3c2f ns.hh:96
.
..< │ │ │ │ -00004590: 6872 2063 6c61 7373 3d22 666f 6f74 6572 hr class="footer │ │ │ │ -000045a0: 222f 3e3c 6164 6472 6573 7320 636c 6173 "/>
.Generated by& │ │ │ │ -000045d0: 2331 3630 3b3c 6120 6872 6566 3d22 6874 #160;doxygen< │ │ │ │ -00004650: 2f61 3e20 312e 392e 340a 3c2f 736d 616c /a> 1.9.4.
... │ │ │ │ +000001b0: 6e3a 2066 6d61 7472 6978 2e68 6820 536f n: fmatrix.hh So │ │ │ │ +000001c0: 7572 6365 2046 696c 653c 2f74 6974 6c65 urce File..... │ │ │ │ +00000630: 0a3c 7363 7269 7074 2074 7970 653d 2274 ..
..
. │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
filledarray.hh File Reference
│ │ │ │ +
make_array.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

Utility to generate an array with a certain value. │ │ │ │ -More...

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

Go to the source code of this file.

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ Functions

template<std::size_t n, class T >
constexpr std::array< T, n > Dune::filledArray (const T &t)
 Return an array filled with the provided value. More...
 
template<typename... Args>
std::array< typename std::common_type< Args... >::type, sizeof...(Args)> Dune::Std::make_array (const Args &... args)
 Create and initialize an array. More...
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Utility to generate an array with a certain value.

│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,28 +4,29 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ + * std │ │ │ │ │ Namespaces | Functions │ │ │ │ │ -filledarray.hh File Reference │ │ │ │ │ -Utility to generate an array with a certain value. More... │ │ │ │ │ +make_array.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ +namespace  Dune::Std │ │ │ │ │ +  Namespace for features backported from new C++ standards. │ │ │ │ │ +  │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ -constexpr std::array< T, n > Dune::filledArray (const T &t) │ │ │ │ │ -  Return an array filled with the provided value. │ │ │ │ │ - More... │ │ │ │ │ +template │ │ │ │ │ +std::array< typename std::common_type< Dune::Std::make_array (const Args &... │ │ │ │ │ + Args... >::type, sizeof...(Args)> args) │ │ │ │ │ +  Create and initialize an array. More... │ │ │ │ │   │ │ │ │ │ -***** Detailed Description ***** │ │ │ │ │ -Utility to generate an array with a certain value. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00149_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: filledarray.hh Source File │ │ │ │ +dune-common: make_array.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,49 +58,61 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
filledarray.hh
│ │ │ │ +
make_array.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 (C) DUNE Project contributors, see file LICENSE.md in module root
│ │ │ │ -
4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception
│ │ │ │ +Go to the documentation of this file.
1// SPDX-FileCopyrightInfo: Copyright (C) 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_STD_MAKE_ARRAY_HH
│ │ │ │ +
4#define DUNE_COMMON_STD_MAKE_ARRAY_HH
│ │ │ │
5
│ │ │ │ -
6#ifndef DUNE_COMMON_FILLED_ARRAY_HH
│ │ │ │ -
7#define DUNE_COMMON_FILLED_ARRAY_HH
│ │ │ │ +
6#include <array>
│ │ │ │ +
7#include <type_traits>
│ │ │ │
8
│ │ │ │ -
13#include <array>
│ │ │ │ -
14#include <cstddef>
│ │ │ │ +
9#if DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY
│ │ │ │ +
10#include <experimental/array>
│ │ │ │ +
11#endif
│ │ │ │ +
12
│ │ │ │ +
13#warning make_array.hh is deprecated and will be removed after Dune 2.9. \
│ │ │ │ +
14 Use deduction guide of `std::array` or `std::to_array`.
│ │ │ │
15
│ │ │ │ -
16namespace Dune
│ │ │ │ -
17{
│ │ │ │ -
24
│ │ │ │ -
32 template<std::size_t n, class T>
│ │ │ │ -
33 constexpr std::array<T, n> filledArray(const T& t)
│ │ │ │ -
34 {
│ │ │ │ -
35 std::array<T, n> arr{};
│ │ │ │ -
36 // this is constexpr in c++17, `arr.fill(t)` is not
│ │ │ │ -
37 for(auto &el : arr)
│ │ │ │ -
38 el = t;
│ │ │ │ -
39 return arr;
│ │ │ │ -
40 }
│ │ │ │ -
41
│ │ │ │ -
44} // end namespace Dune
│ │ │ │ -
45
│ │ │ │ -
46#endif // DUNE_COMMON_FILLED_ARRAY_HH
│ │ │ │ -
constexpr std::array< T, n > filledArray(const T &t)
Return an array filled with the provided value.
Definition: filledarray.hh:33
│ │ │ │ +
16namespace Dune {
│ │ │ │ +
17namespace Std {
│ │ │ │ +
18
│ │ │ │ +
19#if DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY
│ │ │ │ +
20
│ │ │ │ + │ │ │ │ +
23
│ │ │ │ +
24#else // DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY
│ │ │ │ +
25
│ │ │ │ +
27
│ │ │ │ +
41 template <typename... Args>
│ │ │ │ +
42 std::array<typename std::common_type<Args...>::type, sizeof...(Args)>
│ │ │ │ +
43 make_array(const Args&... args) {
│ │ │ │ +
44 std::array<typename std::common_type<Args...>::type, sizeof...(Args)>
│ │ │ │ +
45 result = {{args...}};
│ │ │ │ +
46 return result;
│ │ │ │ +
47 }
│ │ │ │ +
48
│ │ │ │ +
49#endif // DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY
│ │ │ │ +
50
│ │ │ │ +
51}
│ │ │ │ +
52}
│ │ │ │ +
53
│ │ │ │ +
54#endif
│ │ │ │ +
std::array< typename std::common_type< Args... >::type, sizeof...(Args)> make_array(const Args &... args)
Create and initialize an array.
Definition: make_array.hh:43
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,47 +4,61 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -filledarray.hh │ │ │ │ │ + * std │ │ │ │ │ +make_array.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 (C) DUNE Project contributors, see file │ │ │ │ │ + 1// SPDX-FileCopyrightInfo: Copyright (C) DUNE Project contributors, see file │ │ │ │ │ LICENSE.md in module root │ │ │ │ │ - 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ + 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ + 3#ifndef DUNE_COMMON_STD_MAKE_ARRAY_HH │ │ │ │ │ + 4#define DUNE_COMMON_STD_MAKE_ARRAY_HH │ │ │ │ │ 5 │ │ │ │ │ - 6#ifndef DUNE_COMMON_FILLED_ARRAY_HH │ │ │ │ │ - 7#define DUNE_COMMON_FILLED_ARRAY_HH │ │ │ │ │ + 6#include │ │ │ │ │ + 7#include │ │ │ │ │ 8 │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include │ │ │ │ │ + 9#if DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY │ │ │ │ │ + 10#include │ │ │ │ │ + 11#endif │ │ │ │ │ + 12 │ │ │ │ │ + 13#warning make_array.hh is deprecated and will be removed after Dune 2.9. \ │ │ │ │ │ + 14 Use deduction guide of `std::array` or `std::to_array`. │ │ │ │ │ 15 │ │ │ │ │ - 16namespace Dune │ │ │ │ │ - 17{ │ │ │ │ │ - 24 │ │ │ │ │ - 32 template │ │ │ │ │ -33 constexpr std::array filledArray(const T& t) │ │ │ │ │ - 34 { │ │ │ │ │ - 35 std::array arr{}; │ │ │ │ │ - 36 // this is constexpr in c++17, `arr.fill(t)` is not │ │ │ │ │ - 37 for(auto &el : arr) │ │ │ │ │ - 38 el = t; │ │ │ │ │ - 39 return arr; │ │ │ │ │ - 40 } │ │ │ │ │ - 41 │ │ │ │ │ - 44} // end namespace Dune │ │ │ │ │ - 45 │ │ │ │ │ - 46#endif // DUNE_COMMON_FILLED_ARRAY_HH │ │ │ │ │ -Dune::filledArray │ │ │ │ │ -constexpr std::array< T, n > filledArray(const T &t) │ │ │ │ │ -Return an array filled with the provided value. │ │ │ │ │ -Definition: filledarray.hh:33 │ │ │ │ │ + 16namespace Dune { │ │ │ │ │ + 17namespace Std { │ │ │ │ │ + 18 │ │ │ │ │ + 19#if DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY │ │ │ │ │ + 20 │ │ │ │ │ + 22 using std::experimental::make_array; │ │ │ │ │ + 23 │ │ │ │ │ + 24#else // DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY │ │ │ │ │ + 25 │ │ │ │ │ + 27 │ │ │ │ │ + 41 template │ │ │ │ │ + 42 std::array::type, sizeof...(Args)> │ │ │ │ │ +43 make_array(const Args&... args) { │ │ │ │ │ + 44 std::array::type, sizeof...(Args)> │ │ │ │ │ + 45 result = {{args...}}; │ │ │ │ │ + 46 return result; │ │ │ │ │ + 47 } │ │ │ │ │ + 48 │ │ │ │ │ + 49#endif // DUNE_HAVE_CXX_EXPERIMENTAL_MAKE_ARRAY │ │ │ │ │ + 50 │ │ │ │ │ + 51} │ │ │ │ │ + 52} │ │ │ │ │ + 53 │ │ │ │ │ + 54#endif │ │ │ │ │ +Dune::Std::make_array │ │ │ │ │ +std::array< typename std::common_type< Args... >::type, sizeof...(Args)> │ │ │ │ │ +make_array(const Args &... args) │ │ │ │ │ +Create and initialize an array. │ │ │ │ │ +Definition: make_array.hh:43 │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00152.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: unused.hh File Reference │ │ │ │ +dune-common: type_traits.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,36 +58,102 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ -Macros
│ │ │ │ -
unused.hh File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces | │ │ │ │ +Typedefs | │ │ │ │ +Variables
│ │ │ │ +
type_traits.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

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

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

Go to the source code of this file.

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

│ │ │ │ -Macros

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

│ │ │ │ +Classes

struct  Dune::Std::nonesuch
 Type representing a lookup failure by std::detected_or and friends. More...
 
struct  Dune::Std::conjunction< B >
 forms the logical conjunction of the type traits B... More...
 
struct  Dune::Std::disjunction< B >
 forms the logical disjunction of the type traits B... More...
 
struct  Dune::Std::negation< B >
 forms the logical negation of the type traits B... More...
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Namespaces

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

│ │ │ │ +Typedefs

template<typename Default , template< typename... > class Op, typename... Args>
using Dune::Std::detected_or = Impl::detector< Default, void, Op, Args... >
 Detects whether Op<Args...> is valid and makes the result available. More...
 
template<template< typename... > class Op, typename... Args>
using Dune::Std::is_detected = typename detected_or< nonesuch, Op, Args... >::value_t
 Detects whether Op<Args...> is valid. More...
 
template<template< typename... > class Op, typename... Args>
using Dune::Std::detected_t = typename detected_or< nonesuch, Op, Args... >::type
 Returns Op<Args...> if that is valid; otherwise returns nonesuch. More...
 
template<typename Default , template< typename... > class Op, typename... Args>
using Dune::Std::detected_or_t = typename detected_or< Default, Op, Args... >::type
 Returns Op<Args...> if that is valid; otherwise returns the fallback type Default. More...
 
template<typename Expected , template< typename... > class Op, typename... Args>
using Dune::Std::is_detected_exact = std::is_same< Expected, detected_t< Op, Args... > >
 Checks whether Op<Args...> is Expected without causing an error if Op<Args...> is invalid. More...
 
template<typename Target , template< typename... > class Op, typename... Args>
using Dune::Std::is_detected_convertible = std::is_convertible< Target, detected_t< Op, Args... > >
 Checks whether Op<Args...> is convertible to Target without causing an error if Op<Args...> is invalid. More...
 
template<template< typename... > class Fallback, template< typename... > class TargetType, typename... Args>
using Dune::detected_or_fallback_t = Std::detected_or_t< decltype(detail::warningIfNotDefined< Std::detected_t< Fallback, Args... > >(std::declval< const Std::detected_t< TargetType, Args... > * >())), TargetType, Args... >
 This type will be either TargetType<Args...> if it exists, or the Fallback<Args...> type. More...
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Variables

template<template< typename... > class Op, typename... Args>
constexpr bool Dune::Std::is_detected_v = is_detected<Op,Args...>::value
 Detects whether Op<Args...> is valid and makes the result available as a value. More...
 
template<typename Expected , template< typename... > class Op, typename... Args>
constexpr bool Dune::Std::is_detected_exact_v = is_detected_exact<Expected,Op,Args...>::value
 Convenient access to the result value of is_detected_exact. More...
 
template<typename Target , template< typename... > class Op, typename... Args>
constexpr bool Dune::Std::is_detected_convertible_v = is_detected_convertible<Target,Op,Args...>::value
 Convenient access to the result value of is_detected_convertible. More...
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Definition of the DUNE_UNUSED_PARAMETER macro.

│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,19 +4,102 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Macros │ │ │ │ │ -unused.hh File Reference │ │ │ │ │ -Definition of the DUNE_UNUSED_PARAMETER macro. More... │ │ │ │ │ + * std │ │ │ │ │ +Classes | Namespaces | Typedefs | Variables │ │ │ │ │ +type_traits.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ - Macros │ │ │ │ │ -#define DUNE_UNUSED_PARAMETER(param)   static_cast(param) │ │ │ │ │ + Classes │ │ │ │ │ +struct  Dune::Std::nonesuch │ │ │ │ │ +  Type representing a lookup failure by std::detected_or and friends. │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Std::conjunction<_B_> │ │ │ │ │ +  forms the logical conjunction of the type traits B... More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Std::disjunction<_B_> │ │ │ │ │ +  forms the logical disjunction of the type traits B... More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Std::negation<_B_> │ │ │ │ │ +  forms the logical negation of the type traits B... More... │ │ │ │ │ +  │ │ │ │ │ + Namespaces │ │ │ │ │ +namespace  Dune │ │ │ │ │ +  Dune namespace. │ │ │ │ │ +  │ │ │ │ │ +namespace  Dune::Std │ │ │ │ │ +  Namespace for features backported from new C++ standards. │ │ │ │ │ +  │ │ │ │ │ + Typedefs │ │ │ │ │ +template class Op, typename... Args> │ │ │ │ │ +using Dune::Std::detected_or = Impl::detector< Default, void, Op, Args... > │ │ │ │ │ +  Detects whether Op is valid and makes the result available. │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ +template class Op, typename... Args> │ │ │ │ │ +using Dune::Std::is_detected = typename detected_or< nonesuch, Op, Args... >:: │ │ │ │ │ + value_t │ │ │ │ │ +  Detects whether Op is valid. More... │ │ │ │ │ +  │ │ │ │ │ +template class Op, typename... Args> │ │ │ │ │ +using Dune::Std::detected_t = typename detected_or< nonesuch, Op, Args... >:: │ │ │ │ │ + type │ │ │ │ │ +  Returns Op if that is valid; otherwise returns nonesuch. │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ +template class Op, typename... Args> │ │ │ │ │ +using Dune::Std::detected_or_t = typename detected_or< Default, Op, Args... │ │ │ │ │ + >::type │ │ │ │ │ +  Returns Op if that is valid; otherwise returns the fallback │ │ │ │ │ + type Default. More... │ │ │ │ │ +  │ │ │ │ │ +template class Op, typename... │ │ │ │ │ +Args> │ │ │ │ │ +using Dune::Std::is_detected_exact = std::is_same< Expected, detected_t< Op, │ │ │ │ │ + Args... > > │ │ │ │ │ +  Checks whether Op is Expected without causing an error if │ │ │ │ │ + Op is invalid. More... │ │ │ │ │ +  │ │ │ │ │ +template class Op, typename... Args> │ │ │ │ │ +using Dune::Std::is_detected_convertible = std::is_convertible< Target, │ │ │ │ │ + detected_t< Op, Args... > > │ │ │ │ │ +  Checks whether Op is convertible to Target without causing an │ │ │ │ │ + error if Op is invalid. More... │ │ │ │ │ +  │ │ │ │ │ +template class Fallback, template< typename... > class │ │ │ │ │ +TargetType, typename... Args> │ │ │ │ │ +using Dune::detected_or_fallback_t = Std::detected_or_t< decltype(detail:: │ │ │ │ │ + warningIfNotDefined< Std::detected_t< Fallback, Args... > >(std:: │ │ │ │ │ + declval< const Std::detected_t< TargetType, Args... > * >())), │ │ │ │ │ + TargetType, Args... > │ │ │ │ │ +  This type will be either TargetType if it exists, or the │ │ │ │ │ + Fallback type. More... │ │ │ │ │ +  │ │ │ │ │ + Variables │ │ │ │ │ +template class Op, typename... Args> │ │ │ │ │ +constexpr bool Dune::Std::is_detected_v = is_detected::value │ │ │ │ │ +  Detects whether Op is valid and makes the result │ │ │ │ │ + available as a value. More... │ │ │ │ │ +  │ │ │ │ │ +template class Op, typename... │ │ │ │ │ +Args> │ │ │ │ │ +constexpr bool Dune::Std::is_detected_exact_v = │ │ │ │ │ + is_detected_exact::value │ │ │ │ │ +  Convenient access to the result value of is_detected_exact. │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ +template class Op, typename... Args> │ │ │ │ │ +constexpr bool Dune::Std::is_detected_convertible_v = │ │ │ │ │ + is_detected_convertible::value │ │ │ │ │ +  Convenient access to the result value of │ │ │ │ │ + is_detected_convertible. More... │ │ │ │ │   │ │ │ │ │ -***** Detailed Description ***** │ │ │ │ │ -Definition of the DUNE_UNUSED_PARAMETER macro. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00152_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: unused.hh Source File │ │ │ │ +dune-common: type_traits.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,30 +58,215 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
unused.hh
│ │ │ │ +
type_traits.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 (C) 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_TYPE_TRAITS_HH
│ │ │ │ +
6#define DUNE_COMMON_STD_TYPE_TRAITS_HH
│ │ │ │
7
│ │ │ │ -
21#define DUNE_UNUSED_PARAMETER(param) static_cast<void>(param)
│ │ │ │ -
22#endif
│ │ │ │ +
8#include <type_traits>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
11
│ │ │ │ +
12#if __has_include(<experimental/type_traits>)
│ │ │ │ +
13#include <experimental/type_traits>
│ │ │ │ +
14#endif
│ │ │ │ +
15
│ │ │ │ +
16namespace Dune
│ │ │ │ +
17{
│ │ │ │ +
18
│ │ │ │ +
20
│ │ │ │ +
29namespace Std
│ │ │ │ +
30{
│ │ │ │ +
31
│ │ │ │ +
34 using std::bool_constant;
│ │ │ │ +
35
│ │ │ │ +
36#if DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED
│ │ │ │ +
37
│ │ │ │ +
38 using std::experimental::nonesuch;
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
48
│ │ │ │ +
49#else // DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED
│ │ │ │ +
50
│ │ │ │ +
51 // fallback version of std::experimental::is_detected et al., heavily scribbled
│ │ │ │ +
52 // from cppreference.com (but there is actually not much implementation to the thing)
│ │ │ │ +
53
│ │ │ │ +
54#ifndef DOXYGEN
│ │ │ │ +
55
│ │ │ │ +
56 namespace Impl {
│ │ │ │ +
57
│ │ │ │ +
58 // default version of detector, this gets matched on failure
│ │ │ │ +
59 template<typename Default, typename Void, template<typename...> class Op, typename... Args>
│ │ │ │ +
60 struct detector
│ │ │ │ +
61 {
│ │ │ │ +
62 using value_t = std::false_type;
│ │ │ │ +
63 using type = Default;
│ │ │ │ +
64 };
│ │ │ │ +
65
│ │ │ │ +
66 // specialization of detector that matches if Op<Args...> can be instantiated
│ │ │ │ +
67 template<typename Default, template<typename...> class Op, typename... Args>
│ │ │ │ +
68 struct detector<Default, std::void_t<Op<Args...>>, Op, Args...>
│ │ │ │ +
69 {
│ │ │ │ +
70 using value_t = std::true_type;
│ │ │ │ +
71 using type = Op<Args...>;
│ │ │ │ +
72 };
│ │ │ │ +
73
│ │ │ │ +
74 }
│ │ │ │ +
75
│ │ │ │ +
76#endif // DOXYGEN
│ │ │ │ +
77
│ │ │ │ +
79
│ │ │ │ +
87 struct nonesuch
│ │ │ │ +
88 {
│ │ │ │ +
89 nonesuch() = delete;
│ │ │ │ +
90 ~nonesuch() = delete;
│ │ │ │ +
91 nonesuch(const nonesuch&) = delete;
│ │ │ │ +
92 void operator=(const nonesuch&) = delete;
│ │ │ │ +
93 };
│ │ │ │ +
94
│ │ │ │ +
96
│ │ │ │ +
127 template<typename Default, template<typename...> class Op, typename... Args>
│ │ │ │ +
128 using detected_or = Impl::detector<Default,void,Op,Args...>;
│ │ │ │ +
129
│ │ │ │ +
131
│ │ │ │ +
140 template<template<typename...> class Op, typename... Args>
│ │ │ │ +
141 using is_detected = typename detected_or<nonesuch,Op,Args...>::value_t;
│ │ │ │ +
142
│ │ │ │ +
143#ifdef __cpp_variable_templates
│ │ │ │ +
145
│ │ │ │ +
154 template<template<typename...> class Op, typename... Args>
│ │ │ │ +
155 constexpr bool is_detected_v = is_detected<Op,Args...>::value;
│ │ │ │ +
156#endif // __cpp_variable_templates
│ │ │ │ +
157
│ │ │ │ +
159
│ │ │ │ +
169 template<template<typename...> class Op, typename... Args>
│ │ │ │ +
170 using detected_t = typename detected_or<nonesuch,Op,Args...>::type;
│ │ │ │ +
171
│ │ │ │ +
172
│ │ │ │ +
174
│ │ │ │ +
184 template<typename Default, template<typename...> class Op, typename... Args>
│ │ │ │ +
185 using detected_or_t = typename detected_or<Default,Op,Args...>::type;
│ │ │ │ +
186
│ │ │ │ +
188
│ │ │ │ +
194 template<typename Expected, template<typename...> class Op, typename... Args>
│ │ │ │ +
195 using is_detected_exact = std::is_same<Expected,detected_t<Op,Args...>>;
│ │ │ │ +
196
│ │ │ │ +
197#ifdef __cpp_variable_templates
│ │ │ │ +
199
│ │ │ │ +
205 template<typename Expected, template<typename...> class Op, typename... Args>
│ │ │ │ +
206 constexpr bool is_detected_exact_v = is_detected_exact<Expected,Op,Args...>::value;
│ │ │ │ +
207#endif // __cpp_variable_templates
│ │ │ │ +
208
│ │ │ │ +
210
│ │ │ │ +
216 template<typename Target, template<typename...> class Op, typename... Args>
│ │ │ │ +
217 using is_detected_convertible = std::is_convertible<Target,detected_t<Op,Args...>>;
│ │ │ │ +
218
│ │ │ │ +
219#ifdef __cpp_variable_templates
│ │ │ │ +
221
│ │ │ │ +
227 template<typename Target, template<typename...> class Op, typename... Args>
│ │ │ │ +
228 constexpr bool is_detected_convertible_v = is_detected_convertible<Target,Op,Args...>::value;
│ │ │ │ +
229#endif // __cpp_variable_templates
│ │ │ │ +
230
│ │ │ │ +
231#endif // DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED
│ │ │ │ +
232
│ │ │ │ +
233
│ │ │ │ +
234
│ │ │ │ +
235 // conjunction
│ │ │ │ +
236 // -----------
│ │ │ │ +
237
│ │ │ │ +
245 template< class... B >
│ │ │ │ +
246 struct [[deprecated("Will be removed after release 2.8. Use std::conjunction instead.")]] conjunction
│ │ │ │ +
247 : std::conjunction<B...>
│ │ │ │ +
248 {};
│ │ │ │ +
249
│ │ │ │ +
250
│ │ │ │ +
251 // disjunction
│ │ │ │ +
252 // -----------
│ │ │ │ +
253
│ │ │ │ +
261 template< class... B >
│ │ │ │ +
262 struct [[deprecated("Will be removed after release 2.8. Use std::disjunction instead.")]] disjunction
│ │ │ │ +
263 : std::disjunction<B...>
│ │ │ │ +
264 {};
│ │ │ │ +
265
│ │ │ │ +
266
│ │ │ │ +
267 // negation
│ │ │ │ +
268 // --------
│ │ │ │ +
269
│ │ │ │ +
277 template<class B>
│ │ │ │ +
278 struct [[deprecated("Will be removed after release 2.8. Use std::negation instead.")]] negation
│ │ │ │ +
279 : std::negation<B>
│ │ │ │ +
280 {};
│ │ │ │ +
281
│ │ │ │ +
282} // namespace Std
│ │ │ │ +
283
│ │ │ │ +
284
│ │ │ │ +
285namespace detail
│ │ │ │ +
286{
│ │ │ │ +
287 template <class Type>
│ │ │ │ +
288 [[deprecated("Type extraction of `TargetType` has failed. Inspect the code calling `detected_or_fallback_t` for getting the source of this warning!")]]
│ │ │ │ +
289 Type warningIfNotDefined(const Std::nonesuch*);
│ │ │ │ +
290
│ │ │ │ +
291 template <class Type, class T>
│ │ │ │ +
292 Type warningIfNotDefined(const T*);
│ │ │ │ +
293}
│ │ │ │ +
294
│ │ │ │ +
296template <template<typename...> class Fallback,
│ │ │ │ +
297 template<typename...> class TargetType, typename... Args>
│ │ │ │ + │ │ │ │ +
299 detail::warningIfNotDefined<Std::detected_t<Fallback, Args...> >(std::declval<const Std::detected_t<TargetType, Args...>*>())),
│ │ │ │ +
300 TargetType, Args...>;
│ │ │ │ +
301
│ │ │ │ +
302
│ │ │ │ +
303} // namespace Dune
│ │ │ │ +
304
│ │ │ │ +
305#endif // #ifndef DUNE_COMMON_STD_TYPE_TRAITS_HH
│ │ │ │ +
Traits for type conversions and type information.
│ │ │ │ +
Utilities for type computations, constraining overloads, ...
│ │ │ │ +
constexpr bool is_detected_exact_v
Convenient access to the result value of is_detected_exact.
Definition: type_traits.hh:206
│ │ │ │ +
constexpr bool is_detected_convertible_v
Convenient access to the result value of is_detected_convertible.
Definition: type_traits.hh:228
│ │ │ │ +
typename detected_or< Default, Op, Args... >::type detected_or_t
Returns Op<Args...> if that is valid; otherwise returns the fallback type Default.
Definition: type_traits.hh:185
│ │ │ │ +
std::is_same< Expected, detected_t< Op, Args... > > is_detected_exact
Checks whether Op<Args...> is Expected without causing an error if Op<Args...> is invalid.
Definition: type_traits.hh:195
│ │ │ │ +
typename detected_or< nonesuch, Op, Args... >::type detected_t
Returns Op<Args...> if that is valid; otherwise returns nonesuch.
Definition: type_traits.hh:170
│ │ │ │ +
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
│ │ │ │ +
constexpr bool is_detected_v
Detects whether Op<Args...> is valid and makes the result available as a value.
Definition: type_traits.hh:155
│ │ │ │ +
typename detected_or< nonesuch, Op, Args... >::value_t is_detected
Detects whether Op<Args...> is valid.
Definition: type_traits.hh:141
│ │ │ │ +
Impl::detector< Default, void, Op, Args... > detected_or
Detects whether Op<Args...> is valid and makes the result available.
Definition: type_traits.hh:128
│ │ │ │ +
std::is_convertible< Target, detected_t< Op, Args... > > is_detected_convertible
Checks whether Op<Args...> is convertible to Target without causing an error if Op<Args....
Definition: type_traits.hh:217
│ │ │ │ +
STL namespace.
│ │ │ │ +
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ +
Std::detected_or_t< decltype(detail::warningIfNotDefined< Std::detected_t< Fallback, Args... > >(std::declval< const Std::detected_t< TargetType, Args... > * >())), TargetType, Args... > detected_or_fallback_t
This type will be either TargetType<Args...> if it exists, or the Fallback<Args......
Definition: type_traits.hh:300
│ │ │ │ +
Type representing a lookup failure by std::detected_or and friends.
Definition: type_traits.hh:88
│ │ │ │ + │ │ │ │ +
nonesuch(const nonesuch &)=delete
│ │ │ │ +
void operator=(const nonesuch &)=delete
│ │ │ │ + │ │ │ │ +
forms the logical conjunction of the type traits B...
Definition: type_traits.hh:248
│ │ │ │ +
forms the logical disjunction of the type traits B...
Definition: type_traits.hh:264
│ │ │ │ +
forms the logical negation of the type traits B...
Definition: type_traits.hh:280
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,22 +4,284 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -unused.hh │ │ │ │ │ + * std │ │ │ │ │ +type_traits.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 (C) 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_TYPE_TRAITS_HH │ │ │ │ │ + 6#define DUNE_COMMON_STD_TYPE_TRAITS_HH │ │ │ │ │ 7 │ │ │ │ │ -21#define DUNE_UNUSED_PARAMETER(param) static_cast(param) │ │ │ │ │ - 22#endif │ │ │ │ │ + 8#include │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11 │ │ │ │ │ + 12#if __has_include() │ │ │ │ │ + 13#include │ │ │ │ │ + 14#endif │ │ │ │ │ + 15 │ │ │ │ │ + 16namespace Dune │ │ │ │ │ + 17{ │ │ │ │ │ + 18 │ │ │ │ │ + 20 │ │ │ │ │ + 29namespace Std │ │ │ │ │ + 30{ │ │ │ │ │ + 31 │ │ │ │ │ + 34 using std::bool_constant; │ │ │ │ │ + 35 │ │ │ │ │ + 36#if DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED │ │ │ │ │ + 37 │ │ │ │ │ + 38 using std::experimental::nonesuch; │ │ │ │ │ + 39 using std::experimental::detected_or; │ │ │ │ │ + 40 using std::experimental::is_detected; │ │ │ │ │ + 41 using std::experimental::detected_t; │ │ │ │ │ + 42 using std::experimental::is_detected_v; │ │ │ │ │ + 43 using std::experimental::detected_or_t; │ │ │ │ │ + 44 using std::experimental::is_detected_exact; │ │ │ │ │ + 45 using std::experimental::is_detected_exact_v; │ │ │ │ │ + 46 using std::experimental::is_detected_convertible; │ │ │ │ │ + 47 using std::experimental::is_detected_convertible_v; │ │ │ │ │ + 48 │ │ │ │ │ + 49#else // DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED │ │ │ │ │ + 50 │ │ │ │ │ + 51 // fallback version of std::experimental::is_detected et al., heavily │ │ │ │ │ +scribbled │ │ │ │ │ + 52 // from cppreference.com (but there is actually not much implementation to │ │ │ │ │ +the thing) │ │ │ │ │ + 53 │ │ │ │ │ + 54#ifndef DOXYGEN │ │ │ │ │ + 55 │ │ │ │ │ + 56 namespace Impl { │ │ │ │ │ + 57 │ │ │ │ │ + 58 // default version of detector, this gets matched on failure │ │ │ │ │ + 59 template class Op, │ │ │ │ │ +typename... Args> │ │ │ │ │ + 60 struct detector │ │ │ │ │ + 61 { │ │ │ │ │ + 62 using value_t = std::false_type; │ │ │ │ │ + 63 using type = Default; │ │ │ │ │ + 64 }; │ │ │ │ │ + 65 │ │ │ │ │ + 66 // specialization of detector that matches if Op can be │ │ │ │ │ +instantiated │ │ │ │ │ + 67 template class Op, typename... │ │ │ │ │ +Args> │ │ │ │ │ + 68 struct detector>, Op, Args...> │ │ │ │ │ + 69 { │ │ │ │ │ + 70 using value_t = std::true_type; │ │ │ │ │ + 71 using type = Op; │ │ │ │ │ + 72 }; │ │ │ │ │ + 73 │ │ │ │ │ + 74 } │ │ │ │ │ + 75 │ │ │ │ │ + 76#endif // DOXYGEN │ │ │ │ │ + 77 │ │ │ │ │ + 79 │ │ │ │ │ +87 struct nonesuch │ │ │ │ │ + 88 { │ │ │ │ │ +89 nonesuch() = delete; │ │ │ │ │ +90 ~nonesuch() = delete; │ │ │ │ │ +91 nonesuch(const nonesuch&) = delete; │ │ │ │ │ +92 void operator=(const nonesuch&) = delete; │ │ │ │ │ + 93 }; │ │ │ │ │ + 94 │ │ │ │ │ + 96 │ │ │ │ │ + 127 template class Op, typename... │ │ │ │ │ +Args> │ │ │ │ │ +128 using detected_or = Impl::detector; │ │ │ │ │ + 129 │ │ │ │ │ + 131 │ │ │ │ │ + 140 template class Op, typename... Args> │ │ │ │ │ +141 using is_detected = typename detected_or::value_t; │ │ │ │ │ + 142 │ │ │ │ │ + 143#ifdef __cpp_variable_templates │ │ │ │ │ + 145 │ │ │ │ │ + 154 template class Op, typename... Args> │ │ │ │ │ +155 constexpr bool is_detected_v = is_detected::value; │ │ │ │ │ + 156#endif // __cpp_variable_templates │ │ │ │ │ + 157 │ │ │ │ │ + 159 │ │ │ │ │ + 169 template class Op, typename... Args> │ │ │ │ │ +170 using detected_t = typename detected_or::type; │ │ │ │ │ + 171 │ │ │ │ │ + 172 │ │ │ │ │ + 174 │ │ │ │ │ + 184 template class Op, typename... │ │ │ │ │ +Args> │ │ │ │ │ +185 using detected_or_t = typename detected_or::type; │ │ │ │ │ + 186 │ │ │ │ │ + 188 │ │ │ │ │ + 194 template class Op, typename... │ │ │ │ │ +Args> │ │ │ │ │ +195 using is_detected_exact = std::is_same>; │ │ │ │ │ + 196 │ │ │ │ │ + 197#ifdef __cpp_variable_templates │ │ │ │ │ + 199 │ │ │ │ │ + 205 template class Op, typename... │ │ │ │ │ +Args> │ │ │ │ │ +206 constexpr bool is_detected_exact_v = │ │ │ │ │ +is_detected_exact::value; │ │ │ │ │ + 207#endif // __cpp_variable_templates │ │ │ │ │ + 208 │ │ │ │ │ + 210 │ │ │ │ │ + 216 template class Op, typename... │ │ │ │ │ +Args> │ │ │ │ │ +217 using is_detected_convertible = std:: │ │ │ │ │ +is_convertible>; │ │ │ │ │ + 218 │ │ │ │ │ + 219#ifdef __cpp_variable_templates │ │ │ │ │ + 221 │ │ │ │ │ + 227 template class Op, typename... │ │ │ │ │ +Args> │ │ │ │ │ +228 constexpr bool is_detected_convertible_v = │ │ │ │ │ +is_detected_convertible::value; │ │ │ │ │ + 229#endif // __cpp_variable_templates │ │ │ │ │ + 230 │ │ │ │ │ + 231#endif // DUNE_HAVE_CXX_EXPERIMENTAL_IS_DETECTED │ │ │ │ │ + 232 │ │ │ │ │ + 233 │ │ │ │ │ + 234 │ │ │ │ │ + 235 // conjunction │ │ │ │ │ + 236 // ----------- │ │ │ │ │ + 237 │ │ │ │ │ + 245 template< class... B > │ │ │ │ │ +246 struct [[deprecated("Will be removed after release 2.8. Use std:: │ │ │ │ │ +conjunction instead.")]] conjunction │ │ │ │ │ + 247 : std::conjunction │ │ │ │ │ + 248 {}; │ │ │ │ │ + 249 │ │ │ │ │ + 250 │ │ │ │ │ + 251 // disjunction │ │ │ │ │ + 252 // ----------- │ │ │ │ │ + 253 │ │ │ │ │ + 261 template< class... B > │ │ │ │ │ +262 struct [[deprecated("Will be removed after release 2.8. Use std:: │ │ │ │ │ +disjunction instead.")]] disjunction │ │ │ │ │ + 263 : std::disjunction │ │ │ │ │ + 264 {}; │ │ │ │ │ + 265 │ │ │ │ │ + 266 │ │ │ │ │ + 267 // negation │ │ │ │ │ + 268 // -------- │ │ │ │ │ + 269 │ │ │ │ │ + 277 template │ │ │ │ │ +278 struct [[deprecated("Will be removed after release 2.8. Use std::negation │ │ │ │ │ +instead.")]] negation │ │ │ │ │ + 279 : std::negation │ │ │ │ │ + 280 {}; │ │ │ │ │ + 281 │ │ │ │ │ + 282} // namespace Std │ │ │ │ │ + 283 │ │ │ │ │ + 284 │ │ │ │ │ + 285namespace detail │ │ │ │ │ + 286{ │ │ │ │ │ + 287 template │ │ │ │ │ + 288 [[deprecated("Type extraction of `TargetType` has failed. Inspect the code │ │ │ │ │ +calling `detected_or_fallback_t` for getting the source of this warning!")]] │ │ │ │ │ + 289 Type warningIfNotDefined(const Std::nonesuch*); │ │ │ │ │ + 290 │ │ │ │ │ + 291 template │ │ │ │ │ + 292 Type warningIfNotDefined(const T*); │ │ │ │ │ + 293} │ │ │ │ │ + 294 │ │ │ │ │ + 296template class Fallback, │ │ │ │ │ + 297 template class TargetType, typename... Args> │ │ │ │ │ +298using detected_or_fallback_t = Std::detected_or_t >(std:: │ │ │ │ │ +declval*>())), │ │ │ │ │ + 300 TargetType, Args...>; │ │ │ │ │ + 301 │ │ │ │ │ + 302 │ │ │ │ │ + 303} // namespace Dune │ │ │ │ │ + 304 │ │ │ │ │ + 305#endif // #ifndef DUNE_COMMON_STD_TYPE_TRAITS_HH │ │ │ │ │ +typetraits.hh │ │ │ │ │ +Traits for type conversions and type information. │ │ │ │ │ +typeutilities.hh │ │ │ │ │ +Utilities for type computations, constraining overloads, ... │ │ │ │ │ +Dune::Std::is_detected_exact_v │ │ │ │ │ +constexpr bool is_detected_exact_v │ │ │ │ │ +Convenient access to the result value of is_detected_exact. │ │ │ │ │ +Definition: type_traits.hh:206 │ │ │ │ │ +Dune::Std::is_detected_convertible_v │ │ │ │ │ +constexpr bool is_detected_convertible_v │ │ │ │ │ +Convenient access to the result value of is_detected_convertible. │ │ │ │ │ +Definition: type_traits.hh:228 │ │ │ │ │ +Dune::Std::detected_or_t │ │ │ │ │ +typename detected_or< Default, Op, Args... >::type detected_or_t │ │ │ │ │ +Returns Op if that is valid; otherwise returns the fallback type │ │ │ │ │ +Default. │ │ │ │ │ +Definition: type_traits.hh:185 │ │ │ │ │ +Dune::Std::is_detected_exact │ │ │ │ │ +std::is_same< Expected, detected_t< Op, Args... > > is_detected_exact │ │ │ │ │ +Checks whether Op is Expected without causing an error if Op │ │ │ │ │ +is invalid. │ │ │ │ │ +Definition: type_traits.hh:195 │ │ │ │ │ +Dune::Std::detected_t │ │ │ │ │ +typename detected_or< nonesuch, Op, Args... >::type detected_t │ │ │ │ │ +Returns Op if that is valid; otherwise returns nonesuch. │ │ │ │ │ +Definition: type_traits.hh:170 │ │ │ │ │ +Dune::void_t │ │ │ │ │ +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 │ │ │ │ │ +Dune::Std::is_detected_v │ │ │ │ │ +constexpr bool is_detected_v │ │ │ │ │ +Detects whether Op is valid and makes the result available as a value. │ │ │ │ │ +Definition: type_traits.hh:155 │ │ │ │ │ +Dune::Std::is_detected │ │ │ │ │ +typename detected_or< nonesuch, Op, Args... >::value_t is_detected │ │ │ │ │ +Detects whether Op is valid. │ │ │ │ │ +Definition: type_traits.hh:141 │ │ │ │ │ +Dune::Std::detected_or │ │ │ │ │ +Impl::detector< Default, void, Op, Args... > detected_or │ │ │ │ │ +Detects whether Op is valid and makes the result available. │ │ │ │ │ +Definition: type_traits.hh:128 │ │ │ │ │ +Dune::Std::is_detected_convertible │ │ │ │ │ +std::is_convertible< Target, detected_t< Op, Args... > > │ │ │ │ │ +is_detected_convertible │ │ │ │ │ +Checks whether Op is convertible to Target without causing an error if │ │ │ │ │ +Op >(std::declval< const Std::detected_t< TargetType, Args... │ │ │ │ │ +> * >())), TargetType, Args... > detected_or_fallback_t │ │ │ │ │ +This type will be either TargetType if it exists, or the │ │ │ │ │ +Fallback │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: concept.hh File Reference │ │ │ │ +dune-common: utility.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,95 +58,36 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
concept.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
utility.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

Infrastructure for concepts. │ │ │ │ -More...

│ │ │ │ -
#include <type_traits>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <tuple>
│ │ │ │ -#include <dune/common/typeutilities.hh>
│ │ │ │ -#include <dune/common/typelist.hh>
│ │ │ │ -#include <dune/common/tupleutility.hh>
│ │ │ │ -#include <dune/common/std/type_traits.hh>
│ │ │ │ +
#include <utility>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

struct  Dune::Concept::Refines< BaseConcepts >
 Base class for refined concepts. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

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

│ │ │ │ -Functions

template<class C , class... T>
constexpr auto Dune::models ()
 Check if concept is modeled by given types. More...
 
template<class C , class Tuple >
constexpr auto Dune::Concept::tupleEntriesModel () -> typename Impl::TupleEntriesModelHelper< C, Tuple >::Result
 
template<bool b, typename std::enable_if< b, int >::type = 0>
constexpr bool Dune::Concept::requireTrue ()
 
template<class C , class... T, typename std::enable_if< models< C, T... >(), int >::type = 0>
constexpr bool Dune::Concept::requireConcept ()
 
template<class C , class... T, typename std::enable_if< models< C, T... >(), int >::type = 0>
constexpr bool Dune::Concept::requireConcept (T &&...)
 
template<class C , class Tuple , typename std::enable_if< tupleEntriesModel< C, Tuple >(), int >::type = 0>
constexpr bool Dune::Concept::requireConceptForTupleEntries ()
 
template<class From , class To , typename std::enable_if< std::is_convertible< From, To >::value, int >::type = 0>
constexpr bool Dune::Concept::requireConvertible ()
 
template<class To , class From , typename std::enable_if< std::is_convertible< From, To >::value, int >::type = 0>
constexpr bool Dune::Concept::requireConvertible (const From &)
 
template<typename T >
constexpr bool Dune::Concept::requireType ()
 
template<class Base , class Derived , typename std::enable_if< std::is_base_of< Base, Derived >::value, int >::type = 0>
constexpr bool Dune::Concept::requireBaseOf ()
 
template<class Base , class Derived , typename std::enable_if< std::is_base_of< Base, Derived >::value, int >::type = 0>
constexpr bool Dune::Concept::requireBaseOf (const Derived &)
 
template<class A , class B , typename std::enable_if< std::is_same< A, B >::value, int >::type = 0>
constexpr bool Dune::Concept::requireSameType ()
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Infrastructure for concepts.

│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,81 +4,22 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Classes | Namespaces | Functions │ │ │ │ │ -concept.hh File Reference │ │ │ │ │ -Infrastructure for concepts. More... │ │ │ │ │ -#include │ │ │ │ │ + * std │ │ │ │ │ +Namespaces │ │ │ │ │ +utility.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ - Classes │ │ │ │ │ -struct  Dune::Concept::Refines<_BaseConcepts_> │ │ │ │ │ -  Base class for refined concepts. More... │ │ │ │ │ -  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ -namespace  Dune::Concept │ │ │ │ │ -  Namespace for concepts. │ │ │ │ │ -  │ │ │ │ │ - Functions │ │ │ │ │ -template │ │ │ │ │ -constexpr auto Dune::models () │ │ │ │ │ -  Check if concept is modeled by given types. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -constexpr auto Dune::Concept::tupleEntriesModel () -> typename Impl:: │ │ │ │ │ - TupleEntriesModelHelper< C, Tuple >::Result │ │ │ │ │ -  │ │ │ │ │ -template::type = 0> │ │ │ │ │ -constexpr bool Dune::Concept::requireTrue () │ │ │ │ │ -  │ │ │ │ │ -template(), │ │ │ │ │ -int >::type = 0> │ │ │ │ │ -constexpr bool Dune::Concept::requireConcept () │ │ │ │ │ -  │ │ │ │ │ -template(), │ │ │ │ │ -int >::type = 0> │ │ │ │ │ -constexpr bool Dune::Concept::requireConcept (T &&...) │ │ │ │ │ -  │ │ │ │ │ -template(), int >::type = 0> │ │ │ │ │ -constexpr bool Dune::Concept::requireConceptForTupleEntries () │ │ │ │ │ -  │ │ │ │ │ -template::value, int >::type = 0> │ │ │ │ │ -constexpr bool Dune::Concept::requireConvertible () │ │ │ │ │ -  │ │ │ │ │ -template::value, int >::type = 0> │ │ │ │ │ -constexpr bool Dune::Concept::requireConvertible (const From &) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -constexpr bool Dune::Concept::requireType () │ │ │ │ │ -  │ │ │ │ │ -template::value, int >::type = 0> │ │ │ │ │ -constexpr bool Dune::Concept::requireBaseOf () │ │ │ │ │ -  │ │ │ │ │ -template::value, int >::type = 0> │ │ │ │ │ -constexpr bool Dune::Concept::requireBaseOf (const Derived &) │ │ │ │ │ -  │ │ │ │ │ -template:: │ │ │ │ │ -value, int >::type = 0> │ │ │ │ │ -constexpr bool Dune::Concept::requireSameType () │ │ │ │ │ +namespace  Dune::Std │ │ │ │ │ +  Namespace for features backported from new C++ standards. │ │ │ │ │   │ │ │ │ │ -***** Detailed Description ***** │ │ │ │ │ -Infrastructure for concepts. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00155_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: concept.hh Source File │ │ │ │ +dune-common: utility.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,314 +58,49 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
concept.hh
│ │ │ │ +
utility.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 (C) 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_CONCEPT_HH
│ │ │ │ -
6#define DUNE_COMMON_CONCEPT_HH
│ │ │ │ +Go to the documentation of this file.
1// SPDX-FileCopyrightInfo: Copyright (C) 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_STD_UTILITY_HH
│ │ │ │ +
4#define DUNE_COMMON_STD_UTILITY_HH
│ │ │ │ +
5
│ │ │ │ +
6#include <utility>
│ │ │ │
7
│ │ │ │ -
8#include <type_traits>
│ │ │ │ -
9#include <utility>
│ │ │ │ -
10#include <tuple>
│ │ │ │ -
11
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ +
8#warning dune/common/std/utility.hh is deprecated and will be removed after Dune 2.8.\
│ │ │ │ +
9 Include <utility> instead
│ │ │ │ +
10
│ │ │ │ +
11namespace Dune
│ │ │ │ +
12{
│ │ │ │ +
13
│ │ │ │ +
14 namespace Std
│ │ │ │ +
15 {
│ │ │ │
16
│ │ │ │ -
23namespace Dune {
│ │ │ │ +
17 using std::integer_sequence;
│ │ │ │ +
18 using std::index_sequence;
│ │ │ │ +
19 using std::make_integer_sequence;
│ │ │ │ +
20 using std::make_index_sequence;
│ │ │ │ +
21 using std::index_sequence_for;
│ │ │ │ +
22
│ │ │ │ +
23 } // namespace Std
│ │ │ │
24
│ │ │ │ -
34namespace Concept {
│ │ │ │ -
35
│ │ │ │ -
36
│ │ │ │ -
37
│ │ │ │ -
52template<class... BaseConcepts>
│ │ │ │ -
53struct Refines
│ │ │ │ -
54{
│ │ │ │ -
55 typedef TypeList<BaseConcepts...> BaseConceptList;
│ │ │ │ -
56};
│ │ │ │ -
57
│ │ │ │ -
58
│ │ │ │ -
59#ifndef DOXYGEN
│ │ │ │ -
60
│ │ │ │ -
61namespace Impl {
│ │ │ │ -
62
│ │ │ │ -
63 // #############################################################################
│ │ │ │ -
64 // # All functions following here are implementation details
│ │ │ │ -
65 // # for the models() function below.
│ │ │ │ -
66 // #############################################################################
│ │ │ │ -
67
│ │ │ │ -
68 // Forward declaration
│ │ │ │ -
69 template<class C, class... T>
│ │ │ │ -
70 constexpr bool models();
│ │ │ │ -
71
│ │ │ │ -
72
│ │ │ │ -
73
│ │ │ │ -
74 // Here is the implementation of the concept checking.
│ │ │ │ -
75 // The first two overloads do the magic for checking
│ │ │ │ -
76 // if the requirements of a concept are satisfied.
│ │ │ │ -
77 // The rest is just for checking base concepts in case
│ │ │ │ -
78 // of refinement.
│ │ │ │ -
79
│ │ │ │ -
80 // This overload is present if type substitution for
│ │ │ │ -
81 // C::require(T...) is successful, i.e., if the T...
│ │ │ │ -
82 // matches the requirement of C. In this case this
│ │ │ │ -
83 // overload is selected because PriorityTag<1>
│ │ │ │ -
84 // is a better match for PrioriryTag<42> than
│ │ │ │ -
85 // PriorityTag<0> in the default overload.
│ │ │ │ -
86 template<class C, class... T,
│ │ │ │ -
87 decltype(std::declval<C>().require(std::declval<T>()...), 0) =0>
│ │ │ │ -
88 constexpr std::true_type matchesRequirement(PriorityTag<1>)
│ │ │ │ -
89 { return {}; }
│ │ │ │ -
90
│ │ │ │ -
91 // If the above overload is ruled out by SFINAE because
│ │ │ │ -
92 // the T... does not match the requirements of C, then
│ │ │ │ -
93 // this default overload drops in.
│ │ │ │ -
94 template<class C, class... T>
│ │ │ │ -
95 constexpr std::false_type matchesRequirement(PriorityTag<0>)
│ │ │ │ -
96 { return {}; }
│ │ │ │ -
97
│ │ │ │ -
98
│ │ │ │ -
99
│ │ │ │ -
100 // An empty list C of concepts is always matched by T...
│ │ │ │ -
101 template<class...T>
│ │ │ │ -
102 constexpr bool modelsConceptList(TypeList<>)
│ │ │ │ -
103 { return true; }
│ │ │ │ -
104
│ │ │ │ -
105 // A nonempty list C0,..,CN of concepts is modeled
│ │ │ │ -
106 // by T... if it models the concept C0
│ │ │ │ -
107 // and all concepts in the list C1,..,CN.
│ │ │ │ -
108 template<class...T, class C0, class... CC>
│ │ │ │ -
109 constexpr bool modelsConceptList(TypeList<C0, CC...>)
│ │ │ │ -
110 { return models<C0, T...>() and modelsConceptList<T...>(TypeList<CC...>()); }
│ │ │ │ -
111
│ │ │ │ -
112
│ │ │ │ -
113
│ │ │ │ -
114 // If C is an unrefined concept, then T... models C
│ │ │ │ -
115 // if it matches the requirement of C.
│ │ │ │ -
116 template<class C, class... T>
│ │ │ │ -
117 constexpr bool modelsConcept(PriorityTag<0>)
│ │ │ │ -
118 { return matchesRequirement<C, T...>(PriorityTag<42>()); }
│ │ │ │ -
119
│ │ │ │ -
120 // If C is a refined concept, then T... models C
│ │ │ │ -
121 // if it matches the requirement of C and of
│ │ │ │ -
122 // all base concepts.
│ │ │ │ -
123 //
│ │ │ │ -
124 // This overload is used if C::BaseConceptList exists
│ │ │ │ -
125 // due to its higher priority.
│ │ │ │ -
126 template<class C, class... T,
│ │ │ │ -
127 decltype(typename C::BaseConceptList(), 0) = 0>
│ │ │ │ -
128 constexpr bool modelsConcept(PriorityTag<1>)
│ │ │ │ -
129 { return matchesRequirement<C, T...>(PriorityTag<42>()) and modelsConceptList<T...>(typename C::BaseConceptList()); }
│ │ │ │ -
130
│ │ │ │ -
131 // This is the full concept check. It's defined here in the
│ │ │ │ -
132 // implementation namespace with 'constexpr bool' return type
│ │ │ │ -
133 // because we need a forward declaration in order to use it
│ │ │ │ -
134 // internally above.
│ │ │ │ -
135 //
│ │ │ │ -
136 // The actual interface function can then call this one and
│ │ │ │ -
137 // return the result as std::integral_constant<bool,*> which
│ │ │ │ -
138 // does not allow for a forward declaration because the return
│ │ │ │ -
139 // type is deduced.
│ │ │ │ -
140 template<class C, class... T>
│ │ │ │ -
141 constexpr bool models()
│ │ │ │ -
142 {
│ │ │ │ -
143 return modelsConcept<C, T...>(PriorityTag<42>());
│ │ │ │ -
144 }
│ │ │ │ -
145
│ │ │ │ -
146} // namespace Dune::Concept::Impl
│ │ │ │ -
147
│ │ │ │ -
148#endif // DOXYGEN
│ │ │ │ -
149
│ │ │ │ -
150} // namespace Dune::Concept
│ │ │ │ -
151
│ │ │ │ -
152
│ │ │ │ -
153
│ │ │ │ -
183template<class C, class... T>
│ │ │ │ -
184constexpr auto models()
│ │ │ │ -
185{
│ │ │ │ -
186 return Std::bool_constant<Concept::Impl::models<C, T...>()>();
│ │ │ │ -
187}
│ │ │ │ -
188
│ │ │ │ -
189
│ │ │ │ -
190
│ │ │ │ -
191namespace Concept {
│ │ │ │ -
192
│ │ │ │ -
193#ifndef DOXYGEN
│ │ │ │ -
194
│ │ │ │ -
195namespace Impl {
│ │ │ │ -
196
│ │ │ │ -
197 // #############################################################################
│ │ │ │ -
198 // # All functions following here are implementation details for the
│ │ │ │ -
199 // # for the tupleEntriesModel() function below.
│ │ │ │ -
200 // #############################################################################
│ │ │ │ -
201
│ │ │ │ -
202 template<class C, class Tuple>
│ │ │ │ -
203 struct TupleEntriesModelHelper
│ │ │ │ -
204 {
│ │ │ │ -
205 template<class Accumulated, class T>
│ │ │ │ -
206 struct AccumulateFunctor
│ │ │ │ -
207 {
│ │ │ │ -
208 using type = typename std::integral_constant<bool, Accumulated::value and models<C, T>()>;
│ │ │ │ -
209 };
│ │ │ │ - │ │ │ │ -
211 };
│ │ │ │ -
212
│ │ │ │ -
213} // namespace Dune::Concept::Impl
│ │ │ │ -
214
│ │ │ │ -
215#endif // DOXYGEN
│ │ │ │ -
216
│ │ │ │ -
217
│ │ │ │ -
218// #############################################################################
│ │ │ │ -
219// # The method tupleEntriesModel() does the actual check if the types in a tuple
│ │ │ │ -
220// # model a concept using the implementation details above.
│ │ │ │ -
221// #############################################################################
│ │ │ │ -
222
│ │ │ │ -
223template<class C, class Tuple>
│ │ │ │ -
224constexpr auto tupleEntriesModel()
│ │ │ │ -
225 -> typename Impl::TupleEntriesModelHelper<C, Tuple>::Result
│ │ │ │ -
226{
│ │ │ │ -
227 return {};
│ │ │ │ -
228}
│ │ │ │ -
229
│ │ │ │ -
230// #############################################################################
│ │ │ │ -
231// # The following require*() functions are just helpers that allow to
│ │ │ │ -
232// # propagate a failed check as substitution failure. This is useful
│ │ │ │ -
233// # inside of a concept definition.
│ │ │ │ -
234// #############################################################################
│ │ │ │ -
235
│ │ │ │ -
236// Helper function for use in concept definitions.
│ │ │ │ -
237// If the passed value b is not true, the concept will to be satisfied.
│ │ │ │ -
238template<bool b, typename std::enable_if<b, int>::type = 0>
│ │ │ │ -
239constexpr bool requireTrue()
│ │ │ │ -
240{
│ │ │ │ -
241 return true;
│ │ │ │ -
242}
│ │ │ │ -
243
│ │ │ │ -
244// Helper function for use in concept definitions.
│ │ │ │ -
245template<class C, class... T, typename std::enable_if<models<C, T...>(), int>::type = 0>
│ │ │ │ -
246constexpr bool requireConcept()
│ │ │ │ -
247{
│ │ │ │ -
248 return true;
│ │ │ │ -
249}
│ │ │ │ -
250
│ │ │ │ -
251// Helper function for use in concept definitions.
│ │ │ │ -
252// This allows to avoid using decltype
│ │ │ │ -
253template<class C, class... T, typename std::enable_if<models<C, T...>(), int>::type = 0>
│ │ │ │ -
254constexpr bool requireConcept(T&&... /*t*/)
│ │ │ │ -
255{
│ │ │ │ -
256 return true;
│ │ │ │ -
257}
│ │ │ │ -
258
│ │ │ │ -
259// Helper function for use in concept definitions.
│ │ │ │ -
260// This checks if the concept given as first type is modelled by all types in the tuple passed as argument
│ │ │ │ -
261template<class C, class Tuple, typename std::enable_if<tupleEntriesModel<C, Tuple>(), int>::type = 0>
│ │ │ │ - │ │ │ │ -
263{
│ │ │ │ -
264 return true;
│ │ │ │ -
265}
│ │ │ │ -
266
│ │ │ │ -
267// Helper function for use in concept definitions.
│ │ │ │ -
268// If the first passed type is not convertible to the second, the concept will not be satisfied.
│ │ │ │ -
269template<class From, class To,
│ │ │ │ -
270 typename std::enable_if< std::is_convertible<From, To>::value, int>::type = 0>
│ │ │ │ -
271constexpr bool requireConvertible()
│ │ │ │ -
272{
│ │ │ │ -
273 return true;
│ │ │ │ -
274}
│ │ │ │ -
275
│ │ │ │ -
276// Helper function for use in concept definitions.
│ │ │ │ -
277// If passed argument is not convertible to the first passed type, the concept will not be satisfied.
│ │ │ │ -
278template<class To, class From,
│ │ │ │ -
279 typename std::enable_if< std::is_convertible<From, To>::value, int>::type = 0>
│ │ │ │ -
280constexpr bool requireConvertible(const From&)
│ │ │ │ -
281{
│ │ │ │ -
282 return true;
│ │ │ │ -
283}
│ │ │ │ -
284
│ │ │ │ -
285// Helper function for use in concept definitions.
│ │ │ │ -
286// This will always evaluate to true. If just allow
│ │ │ │ -
287// to turn a type into an expression. The failure happens
│ │ │ │ -
288// already during substitution for the type argument.
│ │ │ │ -
289template<typename T>
│ │ │ │ -
290constexpr bool requireType()
│ │ │ │ -
291{
│ │ │ │ -
292 return true;
│ │ │ │ -
293}
│ │ │ │ -
294
│ │ │ │ -
295// Helper function for use in concept definitions.
│ │ │ │ -
296// If first passed type is not a base class of second type, the concept will not be satisfied.
│ │ │ │ -
297template<class Base, class Derived,
│ │ │ │ -
298 typename std::enable_if< std::is_base_of<Base, Derived>::value, int>::type = 0>
│ │ │ │ -
299constexpr bool requireBaseOf()
│ │ │ │ -
300{
│ │ │ │ -
301 return true;
│ │ │ │ -
302}
│ │ │ │ -
303
│ │ │ │ -
304// Helper function for use in concept definitions.
│ │ │ │ -
305// If first passed type is not a base class of first arguments type, the concept will not be satisfied.
│ │ │ │ -
306template<class Base, class Derived,
│ │ │ │ -
307 typename std::enable_if< std::is_base_of<Base, Derived>::value, int>::type = 0>
│ │ │ │ -
308constexpr bool requireBaseOf(const Derived&)
│ │ │ │ -
309{
│ │ │ │ -
310 return true;
│ │ │ │ -
311}
│ │ │ │ -
312
│ │ │ │ -
313// Helper function for use in concept definitions.
│ │ │ │ -
314// If the passed types are not the same, the concept will not be satisfied.
│ │ │ │ -
315template<class A, class B,
│ │ │ │ -
316 typename std::enable_if< std::is_same<A, B>::value, int>::type = 0>
│ │ │ │ -
317constexpr bool requireSameType()
│ │ │ │ -
318{
│ │ │ │ -
319 return true;
│ │ │ │ -
320}
│ │ │ │ -
321
│ │ │ │ -
322
│ │ │ │ -
323
│ │ │ │ -
324} // namespace Dune::Concept
│ │ │ │ -
325
│ │ │ │ -
328} // namespace Dune
│ │ │ │ -
329
│ │ │ │ -
330
│ │ │ │ -
331
│ │ │ │ -
332
│ │ │ │ -
333#endif // DUNE_COMMON_CONCEPT_HH
│ │ │ │ -
Utilities for type computations, constraining overloads, ...
│ │ │ │ -
Contains utility classes which can be used with std::tuple.
│ │ │ │ - │ │ │ │ - │ │ │ │ -
F< Accumulated, Value >::type type
Result of the reduce operation.
Definition: tupleutility.hh:522
│ │ │ │ -
std::tuple< MetaType< T >... > TypeList
A simple type list.
Definition: typelist.hh:87
│ │ │ │ -
constexpr auto models()
Check if concept is modeled by given types.
Definition: concept.hh:184
│ │ │ │ +
25} // namespace Dune
│ │ │ │ +
26
│ │ │ │ +
27#endif // #ifndef DUNE_COMMON_STD_UTILITY_HH
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
constexpr bool requireConcept()
Definition: concept.hh:246
│ │ │ │ -
constexpr bool requireTrue()
Definition: concept.hh:239
│ │ │ │ -
constexpr bool requireSameType()
Definition: concept.hh:317
│ │ │ │ -
constexpr auto tupleEntriesModel() -> typename Impl::TupleEntriesModelHelper< C, Tuple >::Result
Definition: concept.hh:224
│ │ │ │ -
constexpr bool requireConceptForTupleEntries()
Definition: concept.hh:262
│ │ │ │ -
constexpr bool requireBaseOf()
Definition: concept.hh:299
│ │ │ │ -
constexpr bool requireConvertible()
Definition: concept.hh:271
│ │ │ │ -
constexpr bool requireType()
Definition: concept.hh:290
│ │ │ │ -
Base class for refined concepts.
Definition: concept.hh:54
│ │ │ │ -
TypeList< BaseConcepts... > BaseConceptList
Definition: concept.hh:55
│ │ │ │ -
Helper class for tagging priorities.
Definition: typeutilities.hh:73
│ │ │ │ -
Helper class for tagging priorities.
Definition: typeutilities.hh:87
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,369 +4,45 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -concept.hh │ │ │ │ │ + * std │ │ │ │ │ +utility.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 (C) DUNE Project contributors, see file │ │ │ │ │ + 1// SPDX-FileCopyrightInfo: Copyright (C) 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_CONCEPT_HH │ │ │ │ │ - 6#define DUNE_COMMON_CONCEPT_HH │ │ │ │ │ + 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ + 3#ifndef DUNE_COMMON_STD_UTILITY_HH │ │ │ │ │ + 4#define DUNE_COMMON_STD_UTILITY_HH │ │ │ │ │ + 5 │ │ │ │ │ + 6#include │ │ │ │ │ 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11 │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ + 8#warning dune/common/std/utility.hh is deprecated and will be removed after │ │ │ │ │ +Dune 2.8.\ │ │ │ │ │ + 9 Include instead │ │ │ │ │ + 10 │ │ │ │ │ + 11namespace Dune │ │ │ │ │ + 12{ │ │ │ │ │ + 13 │ │ │ │ │ + 14 namespace Std │ │ │ │ │ + 15 { │ │ │ │ │ 16 │ │ │ │ │ - 23namespace Dune { │ │ │ │ │ + 17 using std::integer_sequence; │ │ │ │ │ + 18 using std::index_sequence; │ │ │ │ │ + 19 using std::make_integer_sequence; │ │ │ │ │ + 20 using std::make_index_sequence; │ │ │ │ │ + 21 using std::index_sequence_for; │ │ │ │ │ + 22 │ │ │ │ │ + 23 } // namespace Std │ │ │ │ │ 24 │ │ │ │ │ -34namespace Concept { │ │ │ │ │ - 35 │ │ │ │ │ - 36 │ │ │ │ │ - 37 │ │ │ │ │ - 52template │ │ │ │ │ -53struct Refines │ │ │ │ │ - 54{ │ │ │ │ │ -55 typedef TypeList BaseConceptList; │ │ │ │ │ - 56}; │ │ │ │ │ - 57 │ │ │ │ │ - 58 │ │ │ │ │ - 59#ifndef DOXYGEN │ │ │ │ │ - 60 │ │ │ │ │ - 61namespace Impl { │ │ │ │ │ - 62 │ │ │ │ │ - 63 / │ │ │ │ │ -/ ############################################################################# │ │ │ │ │ - 64 // # All functions following here are implementation details │ │ │ │ │ - 65 // # for the models() function below. │ │ │ │ │ - 66 / │ │ │ │ │ -/ ############################################################################# │ │ │ │ │ - 67 │ │ │ │ │ - 68 // Forward declaration │ │ │ │ │ - 69 template │ │ │ │ │ - 70 constexpr bool models(); │ │ │ │ │ - 71 │ │ │ │ │ - 72 │ │ │ │ │ - 73 │ │ │ │ │ - 74 // Here is the implementation of the concept checking. │ │ │ │ │ - 75 // The first two overloads do the magic for checking │ │ │ │ │ - 76 // if the requirements of a concept are satisfied. │ │ │ │ │ - 77 // The rest is just for checking base concepts in case │ │ │ │ │ - 78 // of refinement. │ │ │ │ │ - 79 │ │ │ │ │ - 80 // This overload is present if type substitution for │ │ │ │ │ - 81 // C::require(T...) is successful, i.e., if the T... │ │ │ │ │ - 82 // matches the requirement of C. In this case this │ │ │ │ │ - 83 // overload is selected because PriorityTag<1> │ │ │ │ │ - 84 // is a better match for PrioriryTag<42> than │ │ │ │ │ - 85 // PriorityTag<0> in the default overload. │ │ │ │ │ - 86 template().require(std::declval()...), 0) =0> │ │ │ │ │ - 88 constexpr std::true_type matchesRequirement(PriorityTag<1>) │ │ │ │ │ - 89 { return {}; } │ │ │ │ │ - 90 │ │ │ │ │ - 91 // If the above overload is ruled out by SFINAE because │ │ │ │ │ - 92 // the T... does not match the requirements of C, then │ │ │ │ │ - 93 // this default overload drops in. │ │ │ │ │ - 94 template │ │ │ │ │ - 95 constexpr std::false_type matchesRequirement(PriorityTag<0>) │ │ │ │ │ - 96 { return {}; } │ │ │ │ │ - 97 │ │ │ │ │ - 98 │ │ │ │ │ - 99 │ │ │ │ │ - 100 // An empty list C of concepts is always matched by T... │ │ │ │ │ - 101 template │ │ │ │ │ - 102 constexpr bool modelsConceptList(TypeList<>) │ │ │ │ │ - 103 { return true; } │ │ │ │ │ - 104 │ │ │ │ │ - 105 // A nonempty list C0,..,CN of concepts is modeled │ │ │ │ │ - 106 // by T... if it models the concept C0 │ │ │ │ │ - 107 // and all concepts in the list C1,..,CN. │ │ │ │ │ - 108 template │ │ │ │ │ - 109 constexpr bool modelsConceptList(TypeList) │ │ │ │ │ - 110 { return models() and modelsConceptList(TypeList │ │ │ │ │ -()); } │ │ │ │ │ - 111 │ │ │ │ │ - 112 │ │ │ │ │ - 113 │ │ │ │ │ - 114 // If C is an unrefined concept, then T... models C │ │ │ │ │ - 115 // if it matches the requirement of C. │ │ │ │ │ - 116 template │ │ │ │ │ - 117 constexpr bool modelsConcept(PriorityTag<0>) │ │ │ │ │ - 118 { return matchesRequirement(PriorityTag<42>()); } │ │ │ │ │ - 119 │ │ │ │ │ - 120 // If C is a refined concept, then T... models C │ │ │ │ │ - 121 // if it matches the requirement of C and of │ │ │ │ │ - 122 // all base concepts. │ │ │ │ │ - 123 // │ │ │ │ │ - 124 // This overload is used if C::BaseConceptList exists │ │ │ │ │ - 125 // due to its higher priority. │ │ │ │ │ - 126 template │ │ │ │ │ - 128 constexpr bool modelsConcept(PriorityTag<1>) │ │ │ │ │ - 129 { return matchesRequirement(PriorityTag<42>()) and │ │ │ │ │ -modelsConceptList(typename C::BaseConceptList()); } │ │ │ │ │ - 130 │ │ │ │ │ - 131 // This is the full concept check. It's defined here in the │ │ │ │ │ - 132 // implementation namespace with 'constexpr bool' return type │ │ │ │ │ - 133 // because we need a forward declaration in order to use it │ │ │ │ │ - 134 // internally above. │ │ │ │ │ - 135 // │ │ │ │ │ - 136 // The actual interface function can then call this one and │ │ │ │ │ - 137 // return the result as std::integral_constant which │ │ │ │ │ - 138 // does not allow for a forward declaration because the return │ │ │ │ │ - 139 // type is deduced. │ │ │ │ │ - 140 template │ │ │ │ │ - 141 constexpr bool models() │ │ │ │ │ - 142 { │ │ │ │ │ - 143 return modelsConcept(PriorityTag<42>()); │ │ │ │ │ - 144 } │ │ │ │ │ - 145 │ │ │ │ │ - 146} // namespace Dune::Concept::Impl │ │ │ │ │ - 147 │ │ │ │ │ - 148#endif // DOXYGEN │ │ │ │ │ - 149 │ │ │ │ │ - 150} // namespace Dune::Concept │ │ │ │ │ - 151 │ │ │ │ │ - 152 │ │ │ │ │ - 153 │ │ │ │ │ - 183template │ │ │ │ │ -184constexpr auto models() │ │ │ │ │ - 185{ │ │ │ │ │ - 186 return Std::bool_constant()>(); │ │ │ │ │ - 187} │ │ │ │ │ - 188 │ │ │ │ │ - 189 │ │ │ │ │ - 190 │ │ │ │ │ - 191namespace Concept { │ │ │ │ │ - 192 │ │ │ │ │ - 193#ifndef DOXYGEN │ │ │ │ │ - 194 │ │ │ │ │ - 195namespace Impl { │ │ │ │ │ - 196 │ │ │ │ │ - 197 / │ │ │ │ │ -/ ############################################################################# │ │ │ │ │ - 198 // # All functions following here are implementation details for the │ │ │ │ │ - 199 // # for the tupleEntriesModel() function below. │ │ │ │ │ - 200 / │ │ │ │ │ -/ ############################################################################# │ │ │ │ │ - 201 │ │ │ │ │ - 202 template │ │ │ │ │ - 203 struct TupleEntriesModelHelper │ │ │ │ │ - 204 { │ │ │ │ │ - 205 template │ │ │ │ │ - 206 struct AccumulateFunctor │ │ │ │ │ - 207 { │ │ │ │ │ - 208 using type = typename std::integral_constant()>; │ │ │ │ │ - 209 }; │ │ │ │ │ - 210 using Result = typename ReduceTuple::type; │ │ │ │ │ - 211 }; │ │ │ │ │ - 212 │ │ │ │ │ - 213} // namespace Dune::Concept::Impl │ │ │ │ │ - 214 │ │ │ │ │ - 215#endif // DOXYGEN │ │ │ │ │ - 216 │ │ │ │ │ - 217 │ │ │ │ │ - 218/ │ │ │ │ │ -/ ############################################################################# │ │ │ │ │ - 219// # The method tupleEntriesModel() does the actual check if the types in a │ │ │ │ │ -tuple │ │ │ │ │ - 220// # model a concept using the implementation details above. │ │ │ │ │ - 221/ │ │ │ │ │ -/ ############################################################################# │ │ │ │ │ - 222 │ │ │ │ │ - 223template │ │ │ │ │ -224constexpr auto tupleEntriesModel() │ │ │ │ │ - 225 -> typename Impl::TupleEntriesModelHelper::Result │ │ │ │ │ - 226{ │ │ │ │ │ - 227 return {}; │ │ │ │ │ - 228} │ │ │ │ │ - 229 │ │ │ │ │ - 230/ │ │ │ │ │ -/ ############################################################################# │ │ │ │ │ - 231// # The following require*() functions are just helpers that allow to │ │ │ │ │ - 232// # propagate a failed check as substitution failure. This is useful │ │ │ │ │ - 233// # inside of a concept definition. │ │ │ │ │ - 234/ │ │ │ │ │ -/ ############################################################################# │ │ │ │ │ - 235 │ │ │ │ │ - 236// Helper function for use in concept definitions. │ │ │ │ │ - 237// If the passed value b is not true, the concept will to be satisfied. │ │ │ │ │ - 238template::type = 0> │ │ │ │ │ -239constexpr bool requireTrue() │ │ │ │ │ - 240{ │ │ │ │ │ - 241 return true; │ │ │ │ │ - 242} │ │ │ │ │ - 243 │ │ │ │ │ - 244// Helper function for use in concept definitions. │ │ │ │ │ - 245template(), │ │ │ │ │ -int>::type = 0> │ │ │ │ │ -246constexpr bool requireConcept() │ │ │ │ │ - 247{ │ │ │ │ │ - 248 return true; │ │ │ │ │ - 249} │ │ │ │ │ - 250 │ │ │ │ │ - 251// Helper function for use in concept definitions. │ │ │ │ │ - 252// This allows to avoid using decltype │ │ │ │ │ - 253template(), │ │ │ │ │ -int>::type = 0> │ │ │ │ │ -254constexpr bool requireConcept(T&&... /*t*/) │ │ │ │ │ - 255{ │ │ │ │ │ - 256 return true; │ │ │ │ │ - 257} │ │ │ │ │ - 258 │ │ │ │ │ - 259// Helper function for use in concept definitions. │ │ │ │ │ - 260// This checks if the concept given as first type is modelled by all types │ │ │ │ │ -in the tuple passed as argument │ │ │ │ │ - 261template(), int>::type = 0> │ │ │ │ │ -262constexpr bool requireConceptForTupleEntries() │ │ │ │ │ - 263{ │ │ │ │ │ - 264 return true; │ │ │ │ │ - 265} │ │ │ │ │ - 266 │ │ │ │ │ - 267// Helper function for use in concept definitions. │ │ │ │ │ - 268// If the first passed type is not convertible to the second, the concept │ │ │ │ │ -will not be satisfied. │ │ │ │ │ - 269template::value, int>::type │ │ │ │ │ -= 0> │ │ │ │ │ -271constexpr bool requireConvertible() │ │ │ │ │ - 272{ │ │ │ │ │ - 273 return true; │ │ │ │ │ - 274} │ │ │ │ │ - 275 │ │ │ │ │ - 276// Helper function for use in concept definitions. │ │ │ │ │ - 277// If passed argument is not convertible to the first passed type, the │ │ │ │ │ -concept will not be satisfied. │ │ │ │ │ - 278template::value, int>::type │ │ │ │ │ -= 0> │ │ │ │ │ -280constexpr bool requireConvertible(const From&) │ │ │ │ │ - 281{ │ │ │ │ │ - 282 return true; │ │ │ │ │ - 283} │ │ │ │ │ - 284 │ │ │ │ │ - 285// Helper function for use in concept definitions. │ │ │ │ │ - 286// This will always evaluate to true. If just allow │ │ │ │ │ - 287// to turn a type into an expression. The failure happens │ │ │ │ │ - 288// already during substitution for the type argument. │ │ │ │ │ - 289template │ │ │ │ │ -290constexpr bool requireType() │ │ │ │ │ - 291{ │ │ │ │ │ - 292 return true; │ │ │ │ │ - 293} │ │ │ │ │ - 294 │ │ │ │ │ - 295// Helper function for use in concept definitions. │ │ │ │ │ - 296// If first passed type is not a base class of second type, the concept │ │ │ │ │ -will not be satisfied. │ │ │ │ │ - 297template::value, int>::type │ │ │ │ │ -= 0> │ │ │ │ │ -299constexpr bool requireBaseOf() │ │ │ │ │ - 300{ │ │ │ │ │ - 301 return true; │ │ │ │ │ - 302} │ │ │ │ │ - 303 │ │ │ │ │ - 304// Helper function for use in concept definitions. │ │ │ │ │ - 305// If first passed type is not a base class of first arguments type, the │ │ │ │ │ -concept will not be satisfied. │ │ │ │ │ - 306template::value, int>::type │ │ │ │ │ -= 0> │ │ │ │ │ -308constexpr bool requireBaseOf(const Derived&) │ │ │ │ │ - 309{ │ │ │ │ │ - 310 return true; │ │ │ │ │ - 311} │ │ │ │ │ - 312 │ │ │ │ │ - 313// Helper function for use in concept definitions. │ │ │ │ │ - 314// If the passed types are not the same, the concept will not be satisfied. │ │ │ │ │ - 315template::value, int>::type = 0> │ │ │ │ │ -317constexpr bool requireSameType() │ │ │ │ │ - 318{ │ │ │ │ │ - 319 return true; │ │ │ │ │ - 320} │ │ │ │ │ - 321 │ │ │ │ │ - 322 │ │ │ │ │ - 323 │ │ │ │ │ - 324} // namespace Dune::Concept │ │ │ │ │ - 325 │ │ │ │ │ - 328} // namespace Dune │ │ │ │ │ - 329 │ │ │ │ │ - 330 │ │ │ │ │ - 331 │ │ │ │ │ - 332 │ │ │ │ │ - 333#endif // DUNE_COMMON_CONCEPT_HH │ │ │ │ │ -typeutilities.hh │ │ │ │ │ -Utilities for type computations, constraining overloads, ... │ │ │ │ │ -tupleutility.hh │ │ │ │ │ -Contains utility classes which can be used with std::tuple. │ │ │ │ │ -type_traits.hh │ │ │ │ │ -typelist.hh │ │ │ │ │ -Dune::ReduceTuple::type │ │ │ │ │ -F< Accumulated, Value >::type type │ │ │ │ │ -Result of the reduce operation. │ │ │ │ │ -Definition: tupleutility.hh:522 │ │ │ │ │ -Dune::TypeList │ │ │ │ │ -std::tuple< MetaType< T >... > TypeList │ │ │ │ │ -A simple type list. │ │ │ │ │ -Definition: typelist.hh:87 │ │ │ │ │ -Dune::models │ │ │ │ │ -constexpr auto models() │ │ │ │ │ -Check if concept is modeled by given types. │ │ │ │ │ -Definition: concept.hh:184 │ │ │ │ │ + 25} // namespace Dune │ │ │ │ │ + 26 │ │ │ │ │ + 27#endif // #ifndef DUNE_COMMON_STD_UTILITY_HH │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::Concept::requireConcept │ │ │ │ │ -constexpr bool requireConcept() │ │ │ │ │ -Definition: concept.hh:246 │ │ │ │ │ -Dune::Concept::requireTrue │ │ │ │ │ -constexpr bool requireTrue() │ │ │ │ │ -Definition: concept.hh:239 │ │ │ │ │ -Dune::Concept::requireSameType │ │ │ │ │ -constexpr bool requireSameType() │ │ │ │ │ -Definition: concept.hh:317 │ │ │ │ │ -Dune::Concept::tupleEntriesModel │ │ │ │ │ -constexpr auto tupleEntriesModel() -> typename Impl::TupleEntriesModelHelper< │ │ │ │ │ -C, Tuple >::Result │ │ │ │ │ -Definition: concept.hh:224 │ │ │ │ │ -Dune::Concept::requireConceptForTupleEntries │ │ │ │ │ -constexpr bool requireConceptForTupleEntries() │ │ │ │ │ -Definition: concept.hh:262 │ │ │ │ │ -Dune::Concept::requireBaseOf │ │ │ │ │ -constexpr bool requireBaseOf() │ │ │ │ │ -Definition: concept.hh:299 │ │ │ │ │ -Dune::Concept::requireConvertible │ │ │ │ │ -constexpr bool requireConvertible() │ │ │ │ │ -Definition: concept.hh:271 │ │ │ │ │ -Dune::Concept::requireType │ │ │ │ │ -constexpr bool requireType() │ │ │ │ │ -Definition: concept.hh:290 │ │ │ │ │ -Dune::Concept::Refines │ │ │ │ │ -Base class for refined concepts. │ │ │ │ │ -Definition: concept.hh:54 │ │ │ │ │ -Dune::Concept::Refines::BaseConceptList │ │ │ │ │ -TypeList< BaseConcepts... > BaseConceptList │ │ │ │ │ -Definition: concept.hh:55 │ │ │ │ │ -Dune::PriorityTag │ │ │ │ │ -Helper class for tagging priorities. │ │ │ │ │ -Definition: typeutilities.hh:73 │ │ │ │ │ -Dune::PriorityTag<_0_> │ │ │ │ │ -Helper class for tagging priorities. │ │ │ │ │ -Definition: typeutilities.hh:87 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00158.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: vc.hh File Reference │ │ │ │ +dune-common: apply.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,29 +58,36 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
vc.hh File Reference
│ │ │ │ +
│ │ │ │ +Namespaces
│ │ │ │ +
apply.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

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

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

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.
 
│ │ │ │ + │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,17 +4,22 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -vc.hh File Reference │ │ │ │ │ -Compatibility header for including More... │ │ │ │ │ + * std │ │ │ │ │ +Namespaces │ │ │ │ │ +apply.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ -***** Detailed Description ***** │ │ │ │ │ -Compatibility header for including │ │ │ │ │ -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. │ │ │ │ │ +  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00158_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: vc.hh Source File │ │ │ │ +dune-common: apply.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,42 +58,42 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
vc.hh
│ │ │ │ +
apply.hh
│ │ │ │
│ │ │ │
│ │ │ │ -Go to the documentation of this file.
1// SPDX-FileCopyrightInfo: Copyright (C) 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
│ │ │ │ -
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
│ │ │ │ -
29
│ │ │ │ -
30#endif // DUNE_COMMON_VC_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 (C) 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_APPLY_HH
│ │ │ │ +
6#define DUNE_COMMON_STD_APPLY_HH
│ │ │ │ +
7
│ │ │ │ +
8#include <tuple>
│ │ │ │ +
9
│ │ │ │ +
10namespace Dune
│ │ │ │ +
11{
│ │ │ │ +
12 namespace Std
│ │ │ │ +
13 {
│ │ │ │ +
14
│ │ │ │ +
17 using std::apply;
│ │ │ │ +
18
│ │ │ │ +
19 } // namespace Std
│ │ │ │ +
20} // namespace Dune
│ │ │ │ +
21
│ │ │ │ +
22#endif // #ifndef DUNE_COMMON_STD_APPLY_HH
│ │ │ │ +
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,34 +4,37 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -vc.hh │ │ │ │ │ + * std │ │ │ │ │ +apply.hh │ │ │ │ │ Go_to_the_documentation_of_this_file. │ │ │ │ │ - 1// SPDX-FileCopyrightInfo: Copyright (C) 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 (C) 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 │ │ │ │ │ - 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 │ │ │ │ │ - 29 │ │ │ │ │ - 30#endif // DUNE_COMMON_VC_HH │ │ │ │ │ + 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ + 5#ifndef DUNE_COMMON_STD_APPLY_HH │ │ │ │ │ + 6#define DUNE_COMMON_STD_APPLY_HH │ │ │ │ │ + 7 │ │ │ │ │ + 8#include │ │ │ │ │ + 9 │ │ │ │ │ + 10namespace Dune │ │ │ │ │ + 11{ │ │ │ │ │ +12 namespace Std │ │ │ │ │ + 13 { │ │ │ │ │ + 14 │ │ │ │ │ + 17 using std::apply; │ │ │ │ │ + 18 │ │ │ │ │ + 19 } // namespace Std │ │ │ │ │ + 20} // namespace Dune │ │ │ │ │ + 21 │ │ │ │ │ + 22#endif // #ifndef DUNE_COMMON_STD_APPLY_HH │ │ │ │ │ +Dune │ │ │ │ │ +Dune namespace. │ │ │ │ │ +Definition: alignedallocator.hh:13 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00161.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: referencehelper.hh File Reference │ │ │ │ +dune-common: functional.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,64 +58,42 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Namespaces | │ │ │ │ -Typedefs | │ │ │ │ -Functions | │ │ │ │ -Variables
│ │ │ │ -
referencehelper.hh File Reference
│ │ │ │ +Classes | │ │ │ │ +Namespaces
│ │ │ │ +
functional.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <type_traits>
│ │ │ │ -#include <functional>
│ │ │ │ +
#include <functional>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Classes

struct  Dune::Std::identity
 A function object type whose operator() returns its argument unchanged. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

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

│ │ │ │ -Typedefs

template<class T >
using Dune::ResolveRef_t = std::remove_reference_t< decltype(Dune::resolveRef(std::declval< T & >()))>
 Type trait to resolve std::reference_wrapper. More...
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ -Functions

template<class T >
constexpr T & Dune::resolveRef (T &gf) noexcept
 Helper function to resolve std::reference_wrapper. More...
 
template<class T >
const auto & Dune::resolveRef (T &&gf)=delete
 
template<class T >
constexpr T & Dune::resolveRef (std::reference_wrapper< T > gf) noexcept
 Helper function to resolve std::reference_wrapper. More...
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Variables

template<class T >
constexpr bool Dune::IsReferenceWrapper_v = Impl::IsReferenceWrapper<T>::value
 Helper to detect if given type is a std::reference_wrapper. More...
 
namespace  Dune::Std
 Namespace for features backported from new C++ standards.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,43 +4,27 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Namespaces | Typedefs | Functions | Variables │ │ │ │ │ -referencehelper.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ + * std │ │ │ │ │ +Classes | Namespaces │ │ │ │ │ +functional.hh File Reference │ │ │ │ │ #include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ + Classes │ │ │ │ │ +struct  Dune::Std::identity │ │ │ │ │ +  A function object type whose operator() returns its argument │ │ │ │ │ + unchanged. More... │ │ │ │ │ +  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ - Typedefs │ │ │ │ │ -template │ │ │ │ │ -using Dune::ResolveRef_t = std::remove_reference_t< decltype(Dune::resolveRef │ │ │ │ │ - (std::declval< T & >()))> │ │ │ │ │ -  Type trait to resolve std::reference_wrapper. More... │ │ │ │ │ -  │ │ │ │ │ - Functions │ │ │ │ │ -template │ │ │ │ │ -constexpr T & Dune::resolveRef (T &gf) noexcept │ │ │ │ │ -  Helper function to resolve std::reference_wrapper. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - const auto & Dune::resolveRef (T &&gf)=delete │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -constexpr T & Dune::resolveRef (std::reference_wrapper< T > gf) noexcept │ │ │ │ │ -  Helper function to resolve std::reference_wrapper. More... │ │ │ │ │ -  │ │ │ │ │ - Variables │ │ │ │ │ -template │ │ │ │ │ -constexpr bool Dune::IsReferenceWrapper_v = Impl::IsReferenceWrapper::value │ │ │ │ │ -  Helper to detect if given type is a std::reference_wrapper. │ │ │ │ │ - More... │ │ │ │ │ +namespace  Dune::Std │ │ │ │ │ +  Namespace for features backported from new C++ standards. │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00161_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: referencehelper.hh Source File │ │ │ │ +dune-common: functional.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,92 +58,52 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
referencehelper.hh
│ │ │ │ +
functional.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:
│ │ │ │ +Go to the documentation of this file.
1// -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*-
│ │ │ │ +
2// vi: set ts=8 sw=2 et sts=2:
│ │ │ │
3// SPDX-FileCopyrightInfo: Copyright (C) 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_REFERENCE_HELPER_HH
│ │ │ │ -
6#define DUNE_COMMON_REFERENCE_HELPER_HH
│ │ │ │ +
5#ifndef DUNE_COMMON_STD_FUNCTIONAL_HH
│ │ │ │ +
6#define DUNE_COMMON_STD_FUNCTIONAL_HH
│ │ │ │
7
│ │ │ │ -
8#include <type_traits>
│ │ │ │ -
9#include <functional>
│ │ │ │ -
10
│ │ │ │ -
11
│ │ │ │ +
8#include <functional>
│ │ │ │ +
9
│ │ │ │ +
10namespace Dune
│ │ │ │ +
11{
│ │ │ │
12
│ │ │ │ -
13namespace Dune {
│ │ │ │ -
14
│ │ │ │ -
15namespace Impl {
│ │ │ │ -
16
│ │ │ │ -
17 template<class T>
│ │ │ │ -
18 class IsReferenceWrapper : public std::false_type {};
│ │ │ │ -
19
│ │ │ │ -
20 template<class T>
│ │ │ │ -
21 class IsReferenceWrapper<std::reference_wrapper<T>> : public std::true_type {};
│ │ │ │ -
22
│ │ │ │ -
23 template<class T>
│ │ │ │ -
24 class IsReferenceWrapper<const std::reference_wrapper<T>> : public std::true_type {};
│ │ │ │ -
25
│ │ │ │ -
26} // namespace Dune::Impl
│ │ │ │ -
27
│ │ │ │ -
28
│ │ │ │ -
34template<class T>
│ │ │ │ -
35constexpr bool IsReferenceWrapper_v = Impl::IsReferenceWrapper<T>::value;
│ │ │ │ -
36
│ │ │ │ -
37
│ │ │ │ -
46template<class T>
│ │ │ │ -
47constexpr T& resolveRef(T& gf) noexcept
│ │ │ │ -
48{
│ │ │ │ -
49 return gf;
│ │ │ │ -
50}
│ │ │ │ -
51
│ │ │ │ -
52
│ │ │ │ -
53// There's no overload for non std::reference_wrapper r-values,
│ │ │ │ -
54// because this may lead to undefined behavior whenever the
│ │ │ │ -
55// return value is stored.
│ │ │ │ -
56// Notice that deleting the overload is not necessary, but
│ │ │ │ -
57// helps to document that it is missing on purpose. It also
│ │ │ │ -
58// leads to nicer error messages.
│ │ │ │ -
59template<class T>
│ │ │ │ -
60const auto& resolveRef(T&& gf) = delete;
│ │ │ │ -
61
│ │ │ │ -
62
│ │ │ │ -
81template<class T>
│ │ │ │ -
82constexpr T& resolveRef(std::reference_wrapper<T> gf) noexcept
│ │ │ │ -
83{
│ │ │ │ -
84 return gf.get();
│ │ │ │ -
85}
│ │ │ │ -
86
│ │ │ │ -
87
│ │ │ │ -
88
│ │ │ │ -
99template<class T>
│ │ │ │ -
100using ResolveRef_t = std::remove_reference_t<decltype(Dune::resolveRef(std::declval<T&>()))>;
│ │ │ │ -
101
│ │ │ │ -
102
│ │ │ │ -
103} // namespace Dune
│ │ │ │ -
104
│ │ │ │ -
105
│ │ │ │ -
106
│ │ │ │ -
107#endif // DUNE_COMMON_REFERENCE_HELPER_HH
│ │ │ │ -
constexpr bool IsReferenceWrapper_v
Helper to detect if given type is a std::reference_wrapper.
Definition: referencehelper.hh:35
│ │ │ │ -
constexpr T & resolveRef(T &gf) noexcept
Helper function to resolve std::reference_wrapper.
Definition: referencehelper.hh:47
│ │ │ │ -
STL namespace.
│ │ │ │ +
13 namespace Std
│ │ │ │ +
14 {
│ │ │ │ +
15
│ │ │ │ +
22#if DUNE_HAVE_CXX_STD_IDENTITY
│ │ │ │ +
23 using std::identity;
│ │ │ │ +
24#else //DUNE_HAVE_CXX_STD_IDENTITY
│ │ │ │ +
25 struct identity {
│ │ │ │ +
26 template<class T>
│ │ │ │ +
27 constexpr T&& operator()(T&& t ) const noexcept {return std::forward<T>(t);}
│ │ │ │ +
28 };
│ │ │ │ +
29#endif
│ │ │ │ +
30 } // namespace Std
│ │ │ │ +
31
│ │ │ │ +
32} // namespace Dune
│ │ │ │ +
33
│ │ │ │ +
34#endif // #ifndef DUNE_COMMON_STD_FUNCTIONAL_HH
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
std::remove_reference_t< decltype(Dune::resolveRef(std::declval< T & >()))> ResolveRef_t
Type trait to resolve std::reference_wrapper.
Definition: referencehelper.hh:100
│ │ │ │ +
A function object type whose operator() returns its argument unchanged.
Definition: functional.hh:25
│ │ │ │ +
constexpr T && operator()(T &&t) const noexcept
Definition: functional.hh:27
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,100 +4,51 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -referencehelper.hh │ │ │ │ │ + * std │ │ │ │ │ +functional.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: │ │ │ │ │ + 1// -*- tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- │ │ │ │ │ + 2// vi: set ts=8 sw=2 et sts=2: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (C) 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_REFERENCE_HELPER_HH │ │ │ │ │ - 6#define DUNE_COMMON_REFERENCE_HELPER_HH │ │ │ │ │ + 5#ifndef DUNE_COMMON_STD_FUNCTIONAL_HH │ │ │ │ │ + 6#define DUNE_COMMON_STD_FUNCTIONAL_HH │ │ │ │ │ 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9#include │ │ │ │ │ - 10 │ │ │ │ │ - 11 │ │ │ │ │ + 8#include │ │ │ │ │ + 9 │ │ │ │ │ + 10namespace Dune │ │ │ │ │ + 11{ │ │ │ │ │ 12 │ │ │ │ │ - 13namespace Dune { │ │ │ │ │ - 14 │ │ │ │ │ - 15namespace Impl { │ │ │ │ │ - 16 │ │ │ │ │ - 17 template │ │ │ │ │ - 18 class IsReferenceWrapper : public std::false_type {}; │ │ │ │ │ - 19 │ │ │ │ │ - 20 template │ │ │ │ │ - 21 class IsReferenceWrapper> : public std::true_type │ │ │ │ │ -{}; │ │ │ │ │ - 22 │ │ │ │ │ - 23 template │ │ │ │ │ - 24 class IsReferenceWrapper> : public std:: │ │ │ │ │ -true_type {}; │ │ │ │ │ - 25 │ │ │ │ │ - 26} // namespace Dune::Impl │ │ │ │ │ - 27 │ │ │ │ │ - 28 │ │ │ │ │ - 34template │ │ │ │ │ -35constexpr bool IsReferenceWrapper_v = Impl::IsReferenceWrapper::value; │ │ │ │ │ - 36 │ │ │ │ │ - 37 │ │ │ │ │ - 46template │ │ │ │ │ -47constexpr T& resolveRef(T& gf) noexcept │ │ │ │ │ - 48{ │ │ │ │ │ - 49 return gf; │ │ │ │ │ - 50} │ │ │ │ │ - 51 │ │ │ │ │ - 52 │ │ │ │ │ - 53// There's no overload for non std::reference_wrapper r-values, │ │ │ │ │ - 54// because this may lead to undefined behavior whenever the │ │ │ │ │ - 55// return value is stored. │ │ │ │ │ - 56// Notice that deleting the overload is not necessary, but │ │ │ │ │ - 57// helps to document that it is missing on purpose. It also │ │ │ │ │ - 58// leads to nicer error messages. │ │ │ │ │ - 59template │ │ │ │ │ -60const auto& resolveRef(T&& gf) = delete; │ │ │ │ │ - 61 │ │ │ │ │ - 62 │ │ │ │ │ - 81template │ │ │ │ │ -82constexpr T& resolveRef(std::reference_wrapper gf) noexcept │ │ │ │ │ - 83{ │ │ │ │ │ - 84 return gf.get(); │ │ │ │ │ - 85} │ │ │ │ │ - 86 │ │ │ │ │ - 87 │ │ │ │ │ - 88 │ │ │ │ │ - 99template │ │ │ │ │ -100using ResolveRef_t = std::remove_reference_t()))>; │ │ │ │ │ - 101 │ │ │ │ │ - 102 │ │ │ │ │ - 103} // namespace Dune │ │ │ │ │ - 104 │ │ │ │ │ - 105 │ │ │ │ │ - 106 │ │ │ │ │ - 107#endif // DUNE_COMMON_REFERENCE_HELPER_HH │ │ │ │ │ -Dune::IsReferenceWrapper_v │ │ │ │ │ -constexpr bool IsReferenceWrapper_v │ │ │ │ │ -Helper to detect if given type is a std::reference_wrapper. │ │ │ │ │ -Definition: referencehelper.hh:35 │ │ │ │ │ -Dune::resolveRef │ │ │ │ │ -constexpr T & resolveRef(T &gf) noexcept │ │ │ │ │ -Helper function to resolve std::reference_wrapper. │ │ │ │ │ -Definition: referencehelper.hh:47 │ │ │ │ │ -std │ │ │ │ │ -STL namespace. │ │ │ │ │ + 13 namespace Std │ │ │ │ │ + 14 { │ │ │ │ │ + 15 │ │ │ │ │ + 22#if DUNE_HAVE_CXX_STD_IDENTITY │ │ │ │ │ + 23 using std::identity; │ │ │ │ │ + 24#else //DUNE_HAVE_CXX_STD_IDENTITY │ │ │ │ │ +25 struct identity { │ │ │ │ │ + 26 template │ │ │ │ │ +27 constexpr T&& operator()(T&& t ) const noexcept {return std::forward(t);} │ │ │ │ │ + 28 }; │ │ │ │ │ + 29#endif │ │ │ │ │ + 30 } // namespace Std │ │ │ │ │ + 31 │ │ │ │ │ + 32} // namespace Dune │ │ │ │ │ + 33 │ │ │ │ │ + 34#endif // #ifndef DUNE_COMMON_STD_FUNCTIONAL_HH │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::ResolveRef_t │ │ │ │ │ -std::remove_reference_t< decltype(Dune::resolveRef(std::declval< T & >()))> │ │ │ │ │ -ResolveRef_t │ │ │ │ │ -Type trait to resolve std::reference_wrapper. │ │ │ │ │ -Definition: referencehelper.hh:100 │ │ │ │ │ +Dune::Std::identity │ │ │ │ │ +A function object type whose operator() returns its argument unchanged. │ │ │ │ │ +Definition: functional.hh:25 │ │ │ │ │ +Dune::Std::identity::operator() │ │ │ │ │ +constexpr T && operator()(T &&t) const noexcept │ │ │ │ │ +Definition: functional.hh:27 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00164.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: ios_state.cc File Reference │ │ │ │ +dune-common: variant.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -58,30 +58,35 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Namespaces
│ │ │ │ -
ios_state.cc File Reference
│ │ │ │ +
variant.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <dune/common/ios_state.hh>
│ │ │ │ -
│ │ │ │ +
#include <variant>
│ │ │ │ +
│ │ │ │ +

Go to the source code of this file.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::Std
 Namespace for features backported from new C++ standards.
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,17 +4,22 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ + * std │ │ │ │ │ Namespaces │ │ │ │ │ -ios_state.cc File Reference │ │ │ │ │ -#include │ │ │ │ │ +variant.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +Go_to_the_source_code_of_this_file. │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ +namespace  Dune::Std │ │ │ │ │ +  Namespace for features backported from new C++ standards. │ │ │ │ │ +  │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00167.html │ │ │ │ @@ -73,20 +73,20 @@ │ │ │ │
│ │ │ │ │ │ │ │

Implements a scalar matrix view wrapper around an existing scalar. │ │ │ │ More...

│ │ │ │
#include <cstddef>
│ │ │ │ #include <type_traits>
│ │ │ │ #include <ostream>
│ │ │ │ -#include <dune/common/boundschecking.hh>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/common/matvectraits.hh>
│ │ │ │ -#include <dune/common/densematrix.hh>
│ │ │ │ -#include <dune/common/fmatrix.hh>
│ │ │ │ -#include <dune/common/scalarvectorview.hh>
│ │ │ │ +#include <dune/common/boundschecking.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/common/matvectraits.hh>
│ │ │ │ +#include <dune/common/densematrix.hh>
│ │ │ │ +#include <dune/common/fmatrix.hh>
│ │ │ │ +#include <dune/common/scalarvectorview.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00167_source.html │ │ │ │ @@ -76,20 +76,20 @@ │ │ │ │
5#ifndef DUNE_COMMON_SCALARMATRIXVIEW_HH
│ │ │ │
6#define DUNE_COMMON_SCALARMATRIXVIEW_HH
│ │ │ │
7
│ │ │ │
8#include <cstddef>
│ │ │ │
9#include <type_traits>
│ │ │ │
10#include <ostream>
│ │ │ │
11
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
18
│ │ │ │
19
│ │ │ │
20namespace Dune {
│ │ │ │
21
│ │ │ │
22namespace Impl {
│ │ │ │
23
│ │ │ │
39 template<class K>
│ │ │ │ @@ -230,20 +230,20 @@ │ │ │ │
194 using type = FieldMatrix<std::remove_const_t<K>,1,1>;
│ │ │ │
195 };
│ │ │ │
196
│ │ │ │
197
│ │ │ │
198} // end namespace Dune
│ │ │ │
199
│ │ │ │
200#endif // DUNE_COMMON_SCALARMATRIXVIEW_HH
│ │ │ │ -
Macro for wrapping boundary checks.
│ │ │ │ -
Implements a scalar vector view wrapper around an existing scalar.
│ │ │ │ -
Traits for type conversions and type information.
│ │ │ │ -
Implements a matrix constructed from a given type representing a field and compile-time given number ...
│ │ │ │ -
Documentation of the traits classes you need to write for each implementation of DenseVector or Dense...
│ │ │ │ -
Implements a matrix constructed from a given type representing a field and a compile-time given numbe...
│ │ │ │ +
Traits for type conversions and type information.
│ │ │ │ +
Implements a matrix constructed from a given type representing a field and compile-time given number ...
│ │ │ │ +
Macro for wrapping boundary checks.
│ │ │ │ +
Implements a scalar vector view wrapper around an existing scalar.
│ │ │ │ +
Implements a matrix constructed from a given type representing a field and a compile-time given numbe...
│ │ │ │ +
Documentation of the traits classes you need to write for each implementation of DenseVector or Dense...
│ │ │ │
#define DUNE_ASSERT_BOUNDS(cond)
If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do nothing.
Definition: boundschecking.hh:30
│ │ │ │
std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
Definition: bigunsignedint.hh:278
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │
constexpr size_type cols() const
number of columns
Definition: densematrix.hh:715
│ │ │ │
constexpr size_type rows() const
number of rows
Definition: densematrix.hh:709
│ │ │ │
static constexpr int blocklevel
The number of block levels we contain. This is the leaf, that is, 1.
Definition: densematrix.hh:178
│ │ │ │
Traits::row_type row_type
The type used to represent a row (must fulfill the Dune::DenseVector interface)
Definition: densematrix.hh:169
│ │ │ │ ├── html2text {} │ │ │ │ │ @@ -173,29 +173,29 @@ │ │ │ │ │ 194 using type = FieldMatrix,1,1>; │ │ │ │ │ 195 }; │ │ │ │ │ 196 │ │ │ │ │ 197 │ │ │ │ │ 198} // end namespace Dune │ │ │ │ │ 199 │ │ │ │ │ 200#endif // DUNE_COMMON_SCALARMATRIXVIEW_HH │ │ │ │ │ -boundschecking.hh │ │ │ │ │ -Macro for wrapping boundary checks. │ │ │ │ │ -scalarvectorview.hh │ │ │ │ │ -Implements a scalar vector view wrapper around an existing scalar. │ │ │ │ │ typetraits.hh │ │ │ │ │ Traits for type conversions and type information. │ │ │ │ │ fmatrix.hh │ │ │ │ │ Implements a matrix constructed from a given type representing a field and │ │ │ │ │ compile-time given number ... │ │ │ │ │ -matvectraits.hh │ │ │ │ │ -Documentation of the traits classes you need to write for each implementation │ │ │ │ │ -of DenseVector or Dense... │ │ │ │ │ +boundschecking.hh │ │ │ │ │ +Macro for wrapping boundary checks. │ │ │ │ │ +scalarvectorview.hh │ │ │ │ │ +Implements a scalar vector view wrapper around an existing scalar. │ │ │ │ │ densematrix.hh │ │ │ │ │ Implements a matrix constructed from a given type representing a field and a │ │ │ │ │ compile-time given numbe... │ │ │ │ │ +matvectraits.hh │ │ │ │ │ +Documentation of the traits classes you need to write for each implementation │ │ │ │ │ +of DenseVector or Dense... │ │ │ │ │ DUNE_ASSERT_BOUNDS │ │ │ │ │ #define DUNE_ASSERT_BOUNDS(cond) │ │ │ │ │ If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do │ │ │ │ │ nothing. │ │ │ │ │ Definition: boundschecking.hh:30 │ │ │ │ │ Dune::operator<< │ │ │ │ │ std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x) │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00170.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: iteratorfacades.hh File Reference │ │ │ │ +dune-common: binaryfunctions.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -64,100 +64,40 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces | │ │ │ │ -Functions
│ │ │ │ -
iteratorfacades.hh File Reference
│ │ │ │ +Namespaces
│ │ │ │ +
binaryfunctions.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

This file implements iterator facade classes for writing stl conformant iterators. │ │ │ │ +

helper classes to provide unique types for standard functions │ │ │ │ More...

│ │ │ │ -
#include <iterator>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include "typetraits.hh"
│ │ │ │ +
#include <algorithm>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ Classes

class  Dune::ForwardIteratorFacade< T, V, R, D >
 Base class for stl conformant forward iterators. More...
struct  Dune::Min< Type >
 
class  Dune::BidirectionalIteratorFacade< T, V, R, D >
 Facade class for stl conformant bidirectional iterators. More...
 
class  Dune::RandomAccessIteratorFacade< T, V, R, D >
 Base class for stl conformant forward iterators. More...
struct  Dune::Max< Type >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -

│ │ │ │ Namespaces

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

│ │ │ │ -Functions

template<class T1 , class V1 , class R1 , class D , class T2 , class V2 , class R2 >
EnableIfInterOperable< T1, T2, bool >::type Dune::operator== (const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
 Checks for equality. More...
 
template<class T1 , class V1 , class R1 , class D , class T2 , class V2 , class R2 >
EnableIfInterOperable< T1, T2, bool >::type Dune::operator!= (const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
 Checks for inequality. More...
 
template<class T1 , class V1 , class R1 , class D , class T2 , class V2 , class R2 >
std::enable_if< std::is_convertible< T2, T1 >::value, bool >::type Dune::operator== (const BidirectionalIteratorFacade< T1, V1, R1, D > &lhs, const BidirectionalIteratorFacade< T2, V2, R2, D > &rhs)
 Checks for equality. More...
 
template<class T1 , class V1 , class R1 , class D , class T2 , class V2 , class R2 >
std::enable_if< std::is_convertible< T1, T2 >::value &&!std::is_convertible< T2, T1 >::value, bool >::type Dune::operator== (const BidirectionalIteratorFacade< T1, V1, R1, D > &lhs, const BidirectionalIteratorFacade< T2, V2, R2, D > &rhs)
 Checks for equality. More...
 
template<class T1 , class V1 , class R1 , class D , class T2 , class V2 , class R2 >
EnableIfInterOperable< T1, T2, bool >::type Dune::operator!= (const BidirectionalIteratorFacade< T1, V1, R1, D > &lhs, const BidirectionalIteratorFacade< T2, V2, R2, D > &rhs)
 Checks for inequality. More...
 
template<class T1 , class V1 , class R1 , class D , class T2 , class V2 , class R2 >
EnableIfInterOperable< T1, T2, bool >::type Dune::operator== (const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
 Checks for equality. More...
 
template<class T1 , class V1 , class R1 , class D , class T2 , class V2 , class R2 >
EnableIfInterOperable< T1, T2, bool >::type Dune::operator!= (const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
 Checks for inequality. More...
 
template<class T1 , class V1 , class R1 , class D , class T2 , class V2 , class R2 >
EnableIfInterOperable< T1, T2, bool >::type Dune::operator< (const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
 Comparison operator. More...
 
template<class T1 , class V1 , class R1 , class D , class T2 , class V2 , class R2 >
EnableIfInterOperable< T1, T2, bool >::type Dune::operator<= (const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
 Comparison operator. More...
 
template<class T1 , class V1 , class R1 , class D , class T2 , class V2 , class R2 >
EnableIfInterOperable< T1, T2, bool >::type Dune::operator> (const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
 Comparison operator. More...
 
template<class T1 , class V1 , class R1 , class D , class T2 , class V2 , class R2 >
EnableIfInterOperable< T1, T2, bool >::type Dune::operator>= (const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
 Comparison operator. More...
 
template<class T1 , class V1 , class R1 , class D , class T2 , class V2 , class R2 >
EnableIfInterOperable< T1, T2, D >::type Dune::operator- (const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
 Calculates the difference between two pointers. More...
 
│ │ │ │

Detailed Description

│ │ │ │ -

This file implements iterator facade classes for writing stl conformant iterators.

│ │ │ │ -

With using these facades writing iterators for arbitrary containers becomes much less cumbersome as only few functions have to be implemented. All other functions needed by the stl are provided by the facades using the Barton-Nackman trick (also known as curiously recurring template pattern.

│ │ │ │ +

helper classes to provide unique types for standard functions

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,141 +4,26 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Classes | Namespaces | Functions │ │ │ │ │ -iteratorfacades.hh File Reference │ │ │ │ │ -This file implements iterator facade classes for writing stl conformant │ │ │ │ │ -iterators. More... │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "typetraits.hh" │ │ │ │ │ +Classes | Namespaces │ │ │ │ │ +binaryfunctions.hh File Reference │ │ │ │ │ +helper classes to provide unique types for standard functions More... │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -class  Dune::ForwardIteratorFacade<_T,_V,_R,_D_> │ │ │ │ │ -  Base class for stl conformant forward iterators. More... │ │ │ │ │ +struct  Dune::Min<_Type_> │ │ │ │ │   │ │ │ │ │ -class  Dune::BidirectionalIteratorFacade<_T,_V,_R,_D_> │ │ │ │ │ -  Facade class for stl conformant bidirectional iterators. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::RandomAccessIteratorFacade<_T,_V,_R,_D_> │ │ │ │ │ -  Base class for stl conformant forward iterators. More... │ │ │ │ │ +struct  Dune::Max<_Type_> │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ - Functions │ │ │ │ │ -template │ │ │ │ │ - EnableIfInterOperable< T1, T2, bool >::type Dune::operator== (const │ │ │ │ │ - ForwardIteratorFacade< T1, │ │ │ │ │ - V1, R1, D > &lhs, const │ │ │ │ │ - ForwardIteratorFacade< T2, │ │ │ │ │ - V2, R2, D > &rhs) │ │ │ │ │ -  Checks for equality. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - EnableIfInterOperable< T1, T2, bool >::type Dune::operator!= (const │ │ │ │ │ - ForwardIteratorFacade< T1, │ │ │ │ │ - V1, R1, D > &lhs, const │ │ │ │ │ - ForwardIteratorFacade< T2, │ │ │ │ │ - V2, R2, D > &rhs) │ │ │ │ │ -  Checks for inequality. │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - std::enable_if< std::is_convertible< T2, T1 >::value, Dune::operator== (const │ │ │ │ │ - bool >::type BidirectionalIteratorFacade< │ │ │ │ │ - T1, V1, R1, D > &lhs, const │ │ │ │ │ - BidirectionalIteratorFacade< │ │ │ │ │ - T2, V2, R2, D > &rhs) │ │ │ │ │ -  Checks for equality. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - std::enable_if< std::is_convertible< T1, T2 >::value Dune::operator== (const │ │ │ │ │ - &&!std::is_convertible< T2, T1 >::value, bool >::type BidirectionalIteratorFacade< │ │ │ │ │ - T1, V1, R1, D > &lhs, const │ │ │ │ │ - BidirectionalIteratorFacade< │ │ │ │ │ - T2, V2, R2, D > &rhs) │ │ │ │ │ -  Checks for equality. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - EnableIfInterOperable< T1, T2, bool >::type Dune::operator!= (const │ │ │ │ │ - BidirectionalIteratorFacade< │ │ │ │ │ - T1, V1, R1, D > &lhs, const │ │ │ │ │ - BidirectionalIteratorFacade< │ │ │ │ │ - T2, V2, R2, D > &rhs) │ │ │ │ │ -  Checks for inequality. │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - EnableIfInterOperable< T1, T2, bool >::type Dune::operator== (const │ │ │ │ │ - RandomAccessIteratorFacade< │ │ │ │ │ - T1, V1, R1, D > &lhs, const │ │ │ │ │ - RandomAccessIteratorFacade< │ │ │ │ │ - T2, V2, R2, D > &rhs) │ │ │ │ │ -  Checks for equality. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - EnableIfInterOperable< T1, T2, bool >::type Dune::operator!= (const │ │ │ │ │ - RandomAccessIteratorFacade< │ │ │ │ │ - T1, V1, R1, D > &lhs, const │ │ │ │ │ - RandomAccessIteratorFacade< │ │ │ │ │ - T2, V2, R2, D > &rhs) │ │ │ │ │ -  Checks for inequality. │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - EnableIfInterOperable< T1, T2, bool >::type Dune::operator< (const │ │ │ │ │ - RandomAccessIteratorFacade< │ │ │ │ │ - T1, V1, R1, D > &lhs, const │ │ │ │ │ - RandomAccessIteratorFacade< │ │ │ │ │ - T2, V2, R2, D > &rhs) │ │ │ │ │ -  Comparison operator. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - EnableIfInterOperable< T1, T2, bool >::type Dune::operator<= (const │ │ │ │ │ - RandomAccessIteratorFacade< │ │ │ │ │ - T1, V1, R1, D > &lhs, const │ │ │ │ │ - RandomAccessIteratorFacade< │ │ │ │ │ - T2, V2, R2, D > &rhs) │ │ │ │ │ -  Comparison operator. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - EnableIfInterOperable< T1, T2, bool >::type Dune::operator> (const │ │ │ │ │ - RandomAccessIteratorFacade< │ │ │ │ │ - T1, V1, R1, D > &lhs, const │ │ │ │ │ - RandomAccessIteratorFacade< │ │ │ │ │ - T2, V2, R2, D > &rhs) │ │ │ │ │ -  Comparison operator. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - EnableIfInterOperable< T1, T2, bool >::type Dune::operator>= (const │ │ │ │ │ - RandomAccessIteratorFacade< │ │ │ │ │ - T1, V1, R1, D > &lhs, const │ │ │ │ │ - RandomAccessIteratorFacade< │ │ │ │ │ - T2, V2, R2, D > &rhs) │ │ │ │ │ -  Comparison operator. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - EnableIfInterOperable< T1, T2, D >::type Dune::operator- (const │ │ │ │ │ - RandomAccessIteratorFacade< │ │ │ │ │ - T1, V1, R1, D > &lhs, const │ │ │ │ │ - RandomAccessIteratorFacade< │ │ │ │ │ - T2, V2, R2, D > &rhs) │ │ │ │ │ - Calculates the difference │ │ │ │ │ -  between two pointers. │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -This file implements iterator facade classes for writing stl conformant │ │ │ │ │ -iterators. │ │ │ │ │ -With using these facades writing iterators for arbitrary containers becomes │ │ │ │ │ -much less cumbersome as only few functions have to be implemented. All other │ │ │ │ │ -functions needed by the stl are provided by the facades using the Barton- │ │ │ │ │ -Nackman trick (also known as curiously recurring template pattern. │ │ │ │ │ +helper classes to provide unique types for standard functions │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00170_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: iteratorfacades.hh Source File │ │ │ │ +dune-common: binaryfunctions.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,435 +62,75 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
iteratorfacades.hh
│ │ │ │ +
binaryfunctions.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 (C) 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_ITERATORFACADES_HH
│ │ │ │ -
6#define DUNE_ITERATORFACADES_HH
│ │ │ │ +
5#ifndef DUNE_BINARYFUNCTIONS_HH
│ │ │ │ +
6#define DUNE_BINARYFUNCTIONS_HH
│ │ │ │
7
│ │ │ │ -
8#include <iterator>
│ │ │ │ -
9#include <type_traits>
│ │ │ │ -
10
│ │ │ │ -
11#include "typetraits.hh"
│ │ │ │ -
12
│ │ │ │ -
13namespace Dune
│ │ │ │ -
14{
│ │ │ │ -
139 template<class T, class V, class R = V&, class D = std::ptrdiff_t>
│ │ │ │ - │ │ │ │ -
141 {
│ │ │ │ -
142
│ │ │ │ -
143 public:
│ │ │ │ -
144 /* type aliases required by C++ for iterators */
│ │ │ │ -
145 using iterator_category = std::forward_iterator_tag;
│ │ │ │ -
146 using value_type = typename std::remove_const<V>::type;
│ │ │ │ - │ │ │ │ -
148 using pointer = V*;
│ │ │ │ -
149 using reference = R;
│ │ │ │ -
150
│ │ │ │ -
175 typedef T DerivedType;
│ │ │ │ -
176
│ │ │ │ -
180 typedef V Value;
│ │ │ │ -
181
│ │ │ │ -
185 typedef V* Pointer;
│ │ │ │ -
186
│ │ │ │ -
190 typedef D DifferenceType;
│ │ │ │ -
191
│ │ │ │ -
195 typedef R Reference;
│ │ │ │ -
196
│ │ │ │ - │ │ │ │ -
199 {
│ │ │ │ -
200 return static_cast<DerivedType const*>(this)->dereference();
│ │ │ │ -
201 }
│ │ │ │ -
202
│ │ │ │ - │ │ │ │ -
204 {
│ │ │ │ -
205 return &(static_cast<const DerivedType *>(this)->dereference());
│ │ │ │ -
206 }
│ │ │ │ -
207
│ │ │ │ - │ │ │ │ -
210 {
│ │ │ │ -
211 static_cast<DerivedType *>(this)->increment();
│ │ │ │ -
212 return *static_cast<DerivedType *>(this);
│ │ │ │ -
213 }
│ │ │ │ -
214
│ │ │ │ - │ │ │ │ -
217 {
│ │ │ │ -
218 DerivedType tmp(static_cast<DerivedType const&>(*this));
│ │ │ │ -
219 this->operator++();
│ │ │ │ -
220 return tmp;
│ │ │ │ -
221 }
│ │ │ │ -
222 };
│ │ │ │ -
223
│ │ │ │ -
234 template<class T1, class V1, class R1, class D,
│ │ │ │ -
235 class T2, class V2, class R2>
│ │ │ │ -
236 inline typename EnableIfInterOperable<T1,T2,bool>::type
│ │ │ │ - │ │ │ │ - │ │ │ │ -
239 {
│ │ │ │ -
240 if(std::is_convertible<T2,T1>::value)
│ │ │ │ -
241 return static_cast<const T1&>(lhs).equals(static_cast<const T2&>(rhs));
│ │ │ │ -
242 else
│ │ │ │ -
243 return static_cast<const T2&>(rhs).equals(static_cast<const T1&>(lhs));
│ │ │ │ -
244 }
│ │ │ │ -
245
│ │ │ │ -
256 template<class T1, class V1, class R1, class D,
│ │ │ │ -
257 class T2, class V2, class R2>
│ │ │ │ -
258 inline typename EnableIfInterOperable<T1,T2,bool>::type
│ │ │ │ - │ │ │ │ - │ │ │ │ -
261 {
│ │ │ │ -
262 if(std::is_convertible<T2,T1>::value)
│ │ │ │ -
263 return !static_cast<const T1&>(lhs).equals(static_cast<const T2&>(rhs));
│ │ │ │ -
264 else
│ │ │ │ -
265 return !static_cast<const T2&>(rhs).equals(static_cast<const T1&>(lhs));
│ │ │ │ -
266 }
│ │ │ │ -
267
│ │ │ │ -
272 template<class T, class V, class R = V&, class D = std::ptrdiff_t>
│ │ │ │ - │ │ │ │ -
274 {
│ │ │ │ -
275
│ │ │ │ -
276 public:
│ │ │ │ -
277 /* type aliases required by C++ for iterators */
│ │ │ │ -
278 using iterator_category = std::bidirectional_iterator_tag;
│ │ │ │ -
279 using value_type = typename std::remove_const<V>::type;
│ │ │ │ - │ │ │ │ -
281 using pointer = V*;
│ │ │ │ -
282 using reference = R;
│ │ │ │ -
283
│ │ │ │ -
309 typedef T DerivedType;
│ │ │ │ -
310
│ │ │ │ -
314 typedef V Value;
│ │ │ │ -
315
│ │ │ │ -
319 typedef V* Pointer;
│ │ │ │ -
320
│ │ │ │ -
324 typedef D DifferenceType;
│ │ │ │ -
325
│ │ │ │ -
329 typedef R Reference;
│ │ │ │ -
330
│ │ │ │ - │ │ │ │ -
333 {
│ │ │ │ -
334 return static_cast<DerivedType const*>(this)->dereference();
│ │ │ │ -
335 }
│ │ │ │ -
336
│ │ │ │ - │ │ │ │ -
338 {
│ │ │ │ -
339 return &(static_cast<const DerivedType *>(this)->dereference());
│ │ │ │ -
340 }
│ │ │ │ -
341
│ │ │ │ - │ │ │ │ -
344 {
│ │ │ │ -
345 static_cast<DerivedType *>(this)->increment();
│ │ │ │ -
346 return *static_cast<DerivedType *>(this);
│ │ │ │ -
347 }
│ │ │ │ -
348
│ │ │ │ - │ │ │ │ -
351 {
│ │ │ │ -
352 DerivedType tmp(static_cast<DerivedType const&>(*this));
│ │ │ │ -
353 this->operator++();
│ │ │ │ -
354 return tmp;
│ │ │ │ -
355 }
│ │ │ │ -
356
│ │ │ │ -
357
│ │ │ │ - │ │ │ │ -
360 {
│ │ │ │ -
361 static_cast<DerivedType *>(this)->decrement();
│ │ │ │ -
362 return *static_cast<DerivedType *>(this);
│ │ │ │ -
363 }
│ │ │ │ -
364
│ │ │ │ - │ │ │ │ -
367 {
│ │ │ │ -
368 DerivedType tmp(static_cast<DerivedType const&>(*this));
│ │ │ │ -
369 this->operator--();
│ │ │ │ -
370 return tmp;
│ │ │ │ -
371 }
│ │ │ │ -
372 };
│ │ │ │ -
373
│ │ │ │ -
381 template<class T1, class V1, class R1, class D,
│ │ │ │ -
382 class T2, class V2, class R2>
│ │ │ │ -
383 inline typename std::enable_if<std::is_convertible<T2,T1>::value,bool>::type
│ │ │ │ - │ │ │ │ - │ │ │ │ -
386 {
│ │ │ │ -
387 return static_cast<const T1&>(lhs).equals(static_cast<const T2&>(rhs));
│ │ │ │ -
388 }
│ │ │ │ -
389
│ │ │ │ -
398 template<class T1, class V1, class R1, class D,
│ │ │ │ -
399 class T2, class V2, class R2>
│ │ │ │ -
400 inline
│ │ │ │ -
401 typename std::enable_if<std::is_convertible<T1,T2>::value && !std::is_convertible<T2,T1>::value,
│ │ │ │ -
402 bool>::type
│ │ │ │ - │ │ │ │ - │ │ │ │ -
405 {
│ │ │ │ -
406 return static_cast<const T2&>(rhs).equals(static_cast<const T1&>(lhs));
│ │ │ │ -
407 }
│ │ │ │ -
408
│ │ │ │ -
419 template<class T1, class V1, class R1, class D,
│ │ │ │ -
420 class T2, class V2, class R2>
│ │ │ │ -
421 inline typename EnableIfInterOperable<T1,T2,bool>::type
│ │ │ │ - │ │ │ │ - │ │ │ │ -
424 {
│ │ │ │ -
425 return !(lhs == rhs);
│ │ │ │ -
426 }
│ │ │ │ -
427
│ │ │ │ -
432 template<class T, class V, class R = V&, class D = std::ptrdiff_t>
│ │ │ │ - │ │ │ │ -
434 {
│ │ │ │ -
435
│ │ │ │ -
436 public:
│ │ │ │ -
437 /* type aliases required by C++ for iterators */
│ │ │ │ -
438 using iterator_category = std::random_access_iterator_tag;
│ │ │ │ -
439 using value_type = typename std::remove_const<V>::type;
│ │ │ │ - │ │ │ │ -
441 using pointer = V*;
│ │ │ │ -
442 using reference = R;
│ │ │ │ -
443
│ │ │ │ -
477 typedef T DerivedType;
│ │ │ │ -
478
│ │ │ │ -
482 typedef V Value;
│ │ │ │ -
483
│ │ │ │ -
487 typedef V* Pointer;
│ │ │ │ -
488
│ │ │ │ -
492 typedef D DifferenceType;
│ │ │ │ -
493
│ │ │ │ -
497 typedef R Reference;
│ │ │ │ -
498
│ │ │ │ - │ │ │ │ -
501 {
│ │ │ │ -
502 return static_cast<DerivedType const*>(this)->dereference();
│ │ │ │ -
503 }
│ │ │ │ -
504
│ │ │ │ - │ │ │ │ -
506 {
│ │ │ │ -
507 return &(static_cast<const DerivedType *>(this)->dereference());
│ │ │ │ -
508 }
│ │ │ │ -
509
│ │ │ │ - │ │ │ │ -
516 {
│ │ │ │ -
517 return static_cast<const DerivedType *>(this)->elementAt(n);
│ │ │ │ -
518 }
│ │ │ │ -
519
│ │ │ │ - │ │ │ │ -
522 {
│ │ │ │ -
523 static_cast<DerivedType *>(this)->increment();
│ │ │ │ -
524 return *static_cast<DerivedType *>(this);
│ │ │ │ -
525 }
│ │ │ │ -
526
│ │ │ │ - │ │ │ │ -
529 {
│ │ │ │ -
530 DerivedType tmp(static_cast<DerivedType const&>(*this));
│ │ │ │ -
531 this->operator++();
│ │ │ │ -
532 return tmp;
│ │ │ │ -
533 }
│ │ │ │ -
534
│ │ │ │ - │ │ │ │ -
536 {
│ │ │ │ -
537 static_cast<DerivedType *>(this)->advance(n);
│ │ │ │ -
538 return *static_cast<DerivedType *>(this);
│ │ │ │ -
539 }
│ │ │ │ -
540
│ │ │ │ - │ │ │ │ -
542 {
│ │ │ │ -
543 DerivedType tmp(static_cast<DerivedType const&>(*this));
│ │ │ │ -
544 tmp.advance(n);
│ │ │ │ -
545 return tmp;
│ │ │ │ -
546 }
│ │ │ │ -
547
│ │ │ │ -
548
│ │ │ │ - │ │ │ │ -
551 {
│ │ │ │ -
552 static_cast<DerivedType *>(this)->decrement();
│ │ │ │ -
553 return *static_cast<DerivedType *>(this);
│ │ │ │ -
554 }
│ │ │ │ -
555
│ │ │ │ - │ │ │ │ -
558 {
│ │ │ │ -
559 DerivedType tmp(static_cast<DerivedType const&>(*this));
│ │ │ │ -
560 this->operator--();
│ │ │ │ -
561 return tmp;
│ │ │ │ -
562 }
│ │ │ │ -
563
│ │ │ │ - │ │ │ │ -
565 {
│ │ │ │ -
566 static_cast<DerivedType *>(this)->advance(-n);
│ │ │ │ -
567 return *static_cast<DerivedType *>(this);
│ │ │ │ -
568 }
│ │ │ │ -
569
│ │ │ │ - │ │ │ │ -
571 {
│ │ │ │ -
572 DerivedType tmp(static_cast<DerivedType const&>(*this));
│ │ │ │ -
573 tmp.advance(-n);
│ │ │ │ -
574 return tmp;
│ │ │ │ -
575 }
│ │ │ │ -
576
│ │ │ │ -
577
│ │ │ │ -
578 };
│ │ │ │ -
579
│ │ │ │ -
590 template<class T1, class V1, class R1, class D,
│ │ │ │ -
591 class T2, class V2, class R2>
│ │ │ │ -
592 inline typename EnableIfInterOperable<T1,T2,bool>::type
│ │ │ │ - │ │ │ │ - │ │ │ │ -
595 {
│ │ │ │ -
596 if(std::is_convertible<T2,T1>::value)
│ │ │ │ -
597 return static_cast<const T1&>(lhs).equals(static_cast<const T2&>(rhs));
│ │ │ │ -
598 else
│ │ │ │ -
599 return static_cast<const T2&>(rhs).equals(static_cast<const T1&>(lhs));
│ │ │ │ -
600 }
│ │ │ │ -
601
│ │ │ │ -
612 template<class T1, class V1, class R1, class D,
│ │ │ │ -
613 class T2, class V2, class R2>
│ │ │ │ -
614 inline typename EnableIfInterOperable<T1,T2,bool>::type
│ │ │ │ - │ │ │ │ - │ │ │ │ -
617 {
│ │ │ │ -
618 if(std::is_convertible<T2,T1>::value)
│ │ │ │ -
619 return !static_cast<const T1&>(lhs).equals(static_cast<const T2&>(rhs));
│ │ │ │ -
620 else
│ │ │ │ -
621 return !static_cast<const T2&>(rhs).equals(static_cast<const T1&>(lhs));
│ │ │ │ -
622 }
│ │ │ │ -
623
│ │ │ │ -
634 template<class T1, class V1, class R1, class D,
│ │ │ │ -
635 class T2, class V2, class R2>
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
639 {
│ │ │ │ -
640 if(std::is_convertible<T2,T1>::value)
│ │ │ │ -
641 return static_cast<const T1&>(lhs).distanceTo(static_cast<const T2&>(rhs))>0;
│ │ │ │ -
642 else
│ │ │ │ -
643 return static_cast<const T2&>(rhs).distanceTo(static_cast<const T1&>(lhs))<0;
│ │ │ │ -
644 }
│ │ │ │ -
645
│ │ │ │ -
646
│ │ │ │ -
657 template<class T1, class V1, class R1, class D,
│ │ │ │ -
658 class T2, class V2, class R2>
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
662 {
│ │ │ │ -
663 if(std::is_convertible<T2,T1>::value)
│ │ │ │ -
664 return static_cast<const T1&>(lhs).distanceTo(static_cast<const T2&>(rhs))>=0;
│ │ │ │ -
665 else
│ │ │ │ -
666 return static_cast<const T2&>(rhs).distanceTo(static_cast<const T1&>(lhs))<=0;
│ │ │ │ -
667 }
│ │ │ │ -
668
│ │ │ │ -
669
│ │ │ │ -
680 template<class T1, class V1, class R1, class D,
│ │ │ │ -
681 class T2, class V2, class R2>
│ │ │ │ -
682 inline typename EnableIfInterOperable<T1,T2,bool>::type
│ │ │ │ - │ │ │ │ - │ │ │ │ -
685 {
│ │ │ │ -
686 if(std::is_convertible<T2,T1>::value)
│ │ │ │ -
687 return static_cast<const T1&>(lhs).distanceTo(static_cast<const T2&>(rhs))<0;
│ │ │ │ -
688 else
│ │ │ │ -
689 return static_cast<const T2&>(rhs).distanceTo(static_cast<const T1&>(lhs))>0;
│ │ │ │ -
690 }
│ │ │ │ -
691
│ │ │ │ -
702 template<class T1, class V1, class R1, class D,
│ │ │ │ -
703 class T2, class V2, class R2>
│ │ │ │ -
704 inline typename EnableIfInterOperable<T1,T2,bool>::type
│ │ │ │ - │ │ │ │ - │ │ │ │ -
707 {
│ │ │ │ -
708 if(std::is_convertible<T2,T1>::value)
│ │ │ │ -
709 return static_cast<const T1&>(lhs).distanceTo(static_cast<const T2&>(rhs))<=0;
│ │ │ │ -
710 else
│ │ │ │ -
711 return static_cast<const T2&>(rhs).distanceTo(static_cast<const T1&>(lhs))>=0;
│ │ │ │ -
712 }
│ │ │ │ -
713
│ │ │ │ -
724 template<class T1, class V1, class R1, class D,
│ │ │ │ -
725 class T2, class V2, class R2>
│ │ │ │ -
726 inline typename EnableIfInterOperable<T1,T2,D>::type
│ │ │ │ - │ │ │ │ - │ │ │ │ -
729 {
│ │ │ │ -
730 if(std::is_convertible<T2,T1>::value)
│ │ │ │ -
731 return -static_cast<const T1&>(lhs).distanceTo(static_cast<const T2&>(rhs));
│ │ │ │ -
732 else
│ │ │ │ -
733 return static_cast<const T2&>(rhs).distanceTo(static_cast<const T1&>(lhs));
│ │ │ │ -
734 }
│ │ │ │ -
735
│ │ │ │ -
737}
│ │ │ │ -
738#endif
│ │ │ │ -
Traits for type conversions and type information.
│ │ │ │ -
bigunsignedint< k > operator-(const bigunsignedint< k > &x, std::uintmax_t y)
Definition: bigunsignedint.hh:542
│ │ │ │ -
EnableIfInterOperable< T1, T2, bool >::type operator<(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition: iteratorfacades.hh:637
│ │ │ │ -
EnableIfInterOperable< T1, T2, bool >::type operator>(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition: iteratorfacades.hh:683
│ │ │ │ -
EnableIfInterOperable< T1, T2, bool >::type operator<=(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition: iteratorfacades.hh:660
│ │ │ │ -
EnableIfInterOperable< T1, T2, bool >::type operator==(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for equality.
Definition: iteratorfacades.hh:237
│ │ │ │ -
EnableIfInterOperable< T1, T2, bool >::type operator>=(const RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const RandomAccessIteratorFacade< T2, V2, R2, D > &rhs)
Comparison operator.
Definition: iteratorfacades.hh:705
│ │ │ │ -
EnableIfInterOperable< T1, T2, bool >::type operator!=(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for inequality.
Definition: iteratorfacades.hh:259
│ │ │ │ +
12#include <algorithm>
│ │ │ │ +
13
│ │ │ │ +
14namespace Dune
│ │ │ │ +
15{
│ │ │ │ +
16 template<typename Type>
│ │ │ │ +
17 struct Min
│ │ │ │ +
18 {
│ │ │ │ +
19 using first_argument_type [[deprecated("This type alias is deprecated following similar deprecations in C++17")]] = Type;
│ │ │ │ +
20
│ │ │ │ +
21 using second_argument_type [[deprecated("This type alias is deprecated following similar deprecations in C++17")]] = Type;
│ │ │ │ +
22
│ │ │ │ +
23 using result_type [[deprecated("This type alias is deprecated following similar deprecations in C++17")]] = Type;
│ │ │ │ +
24
│ │ │ │ +
25 Type operator()(const Type& t1, const Type& t2) const
│ │ │ │ +
26 {
│ │ │ │ +
27 using std::min;
│ │ │ │ +
28 return min(t1,t2);
│ │ │ │ +
29 }
│ │ │ │ +
30 };
│ │ │ │ +
31
│ │ │ │ +
32 template<typename Type>
│ │ │ │ +
33 struct Max
│ │ │ │ +
34 {
│ │ │ │ +
35 using first_argument_type [[deprecated("This type alias is deprecated following similar deprecations in C++17")]] = Type;
│ │ │ │ +
36
│ │ │ │ +
37 using second_argument_type [[deprecated("This type alias is deprecated following similar deprecations in C++17")]] = Type;
│ │ │ │ +
38
│ │ │ │ +
39 using result_type [[deprecated("This type alias is deprecated following similar deprecations in C++17")]] = Type;
│ │ │ │ +
40
│ │ │ │ +
41 Type operator()(const Type& t1, const Type& t2) const
│ │ │ │ +
42 {
│ │ │ │ +
43 using std::max;
│ │ │ │ +
44 return max(t1,t2);
│ │ │ │ +
45 }
│ │ │ │ +
46 };
│ │ │ │ +
47}
│ │ │ │ +
48
│ │ │ │ +
49#endif
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
Base class for stl conformant forward iterators.
Definition: iteratorfacades.hh:141
│ │ │ │ -
std::forward_iterator_tag iterator_category
Definition: iteratorfacades.hh:145
│ │ │ │ -
V * pointer
Definition: iteratorfacades.hh:148
│ │ │ │ -
DerivedType & operator++()
Preincrement operator.
Definition: iteratorfacades.hh:209
│ │ │ │ -
D DifferenceType
The type of the difference between two positions.
Definition: iteratorfacades.hh:190
│ │ │ │ -
R Reference
The type of the reference to the values accessed.
Definition: iteratorfacades.hh:195
│ │ │ │ -
Pointer operator->() const
Definition: iteratorfacades.hh:203
│ │ │ │ -
T DerivedType
The type of derived iterator.
Definition: iteratorfacades.hh:175
│ │ │ │ -
V Value
The type of value accessed through the iterator.
Definition: iteratorfacades.hh:180
│ │ │ │ -
typename std::remove_const< V >::type value_type
Definition: iteratorfacades.hh:146
│ │ │ │ -
DerivedType operator++(int)
Postincrement operator.
Definition: iteratorfacades.hh:216
│ │ │ │ -
V * Pointer
The pointer to the Value.
Definition: iteratorfacades.hh:185
│ │ │ │ -
D difference_type
Definition: iteratorfacades.hh:147
│ │ │ │ -
Reference operator*() const
Dereferencing operator.
Definition: iteratorfacades.hh:198
│ │ │ │ -
R reference
Definition: iteratorfacades.hh:149
│ │ │ │ -
Facade class for stl conformant bidirectional iterators.
Definition: iteratorfacades.hh:274
│ │ │ │ -
V * pointer
Definition: iteratorfacades.hh:281
│ │ │ │ -
typename std::remove_const< V >::type value_type
Definition: iteratorfacades.hh:279
│ │ │ │ -
Reference operator*() const
Dereferencing operator.
Definition: iteratorfacades.hh:332
│ │ │ │ -
D difference_type
Definition: iteratorfacades.hh:280
│ │ │ │ -
T DerivedType
The type of derived iterator.
Definition: iteratorfacades.hh:309
│ │ │ │ -
DerivedType & operator--()
Preincrement operator.
Definition: iteratorfacades.hh:359
│ │ │ │ -
Pointer operator->() const
Definition: iteratorfacades.hh:337
│ │ │ │ -
DerivedType & operator++()
Preincrement operator.
Definition: iteratorfacades.hh:343
│ │ │ │ -
V * Pointer
The pointer to the Value.
Definition: iteratorfacades.hh:319
│ │ │ │ -
R Reference
The type of the reference to the values accessed.
Definition: iteratorfacades.hh:329
│ │ │ │ -
DerivedType operator++(int)
Postincrement operator.
Definition: iteratorfacades.hh:350
│ │ │ │ -
std::bidirectional_iterator_tag iterator_category
Definition: iteratorfacades.hh:278
│ │ │ │ -
D DifferenceType
The type of the difference between two positions.
Definition: iteratorfacades.hh:324
│ │ │ │ -
DerivedType operator--(int)
Postincrement operator.
Definition: iteratorfacades.hh:366
│ │ │ │ -
R reference
Definition: iteratorfacades.hh:282
│ │ │ │ -
V Value
The type of value accessed through the iterator.
Definition: iteratorfacades.hh:314
│ │ │ │ -
Base class for stl conformant forward iterators.
Definition: iteratorfacades.hh:434
│ │ │ │ -
typename std::remove_const< V >::type value_type
Definition: iteratorfacades.hh:439
│ │ │ │ -
D difference_type
Definition: iteratorfacades.hh:440
│ │ │ │ -
DerivedType operator--(int)
Postdecrement operator.
Definition: iteratorfacades.hh:557
│ │ │ │ -
V * pointer
Definition: iteratorfacades.hh:441
│ │ │ │ -
std::random_access_iterator_tag iterator_category
Definition: iteratorfacades.hh:438
│ │ │ │ -
Reference operator*() const
Dereferencing operator.
Definition: iteratorfacades.hh:500
│ │ │ │ -
DerivedType & operator++()
Preincrement operator.
Definition: iteratorfacades.hh:521
│ │ │ │ -
R reference
Definition: iteratorfacades.hh:442
│ │ │ │ -
Pointer operator->() const
Definition: iteratorfacades.hh:505
│ │ │ │ -
D DifferenceType
The type of the difference between two positions.
Definition: iteratorfacades.hh:492
│ │ │ │ -
DerivedType & operator--()
Predecrement operator.
Definition: iteratorfacades.hh:550
│ │ │ │ -
DerivedType & operator-=(DifferenceType n)
Definition: iteratorfacades.hh:564
│ │ │ │ -
DerivedType operator+(DifferenceType n) const
Definition: iteratorfacades.hh:541
│ │ │ │ -
Reference operator[](DifferenceType n) const
Get the element n positions from the current one.
Definition: iteratorfacades.hh:515
│ │ │ │ -
T DerivedType
The type of derived iterator.
Definition: iteratorfacades.hh:477
│ │ │ │ -
V * Pointer
The pointer to the Value.
Definition: iteratorfacades.hh:487
│ │ │ │ -
DerivedType operator-(DifferenceType n) const
Definition: iteratorfacades.hh:570
│ │ │ │ -
DerivedType operator++(int)
Postincrement operator.
Definition: iteratorfacades.hh:528
│ │ │ │ -
V Value
The type of value accessed through the iterator.
Definition: iteratorfacades.hh:482
│ │ │ │ -
DerivedType & operator+=(DifferenceType n)
Definition: iteratorfacades.hh:535
│ │ │ │ -
R Reference
The type of the reference to the values accessed.
Definition: iteratorfacades.hh:497
│ │ │ │ -
Enable typedef if two types are interoperable.
Definition: typetraits.hh:81
│ │ │ │ +
auto min(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
Definition: debugalign.hh:447
│ │ │ │ +
auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
Definition: debugalign.hh:425
│ │ │ │ +
Definition: binaryfunctions.hh:18
│ │ │ │ +
Type result_type
Definition: binaryfunctions.hh:23
│ │ │ │ +
Type operator()(const Type &t1, const Type &t2) const
Definition: binaryfunctions.hh:25
│ │ │ │ +
Type first_argument_type
Definition: binaryfunctions.hh:19
│ │ │ │ +
Type second_argument_type
Definition: binaryfunctions.hh:21
│ │ │ │ +
Definition: binaryfunctions.hh:34
│ │ │ │ +
Type operator()(const Type &t1, const Type &t2) const
Definition: binaryfunctions.hh:41
│ │ │ │ +
Type result_type
Definition: binaryfunctions.hh:39
│ │ │ │ +
Type first_argument_type
Definition: binaryfunctions.hh:35
│ │ │ │ +
Type second_argument_type
Definition: binaryfunctions.hh:37
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,617 +4,103 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -iteratorfacades.hh │ │ │ │ │ +binaryfunctions.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 (C) 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_ITERATORFACADES_HH │ │ │ │ │ - 6#define DUNE_ITERATORFACADES_HH │ │ │ │ │ + 5#ifndef DUNE_BINARYFUNCTIONS_HH │ │ │ │ │ + 6#define DUNE_BINARYFUNCTIONS_HH │ │ │ │ │ 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9#include │ │ │ │ │ - 10 │ │ │ │ │ - 11#include "typetraits.hh" │ │ │ │ │ - 12 │ │ │ │ │ - 13namespace Dune │ │ │ │ │ - 14{ │ │ │ │ │ - 139 template │ │ │ │ │ -140 class ForwardIteratorFacade │ │ │ │ │ - 141 { │ │ │ │ │ - 142 │ │ │ │ │ - 143 public: │ │ │ │ │ - 144 /* type aliases required by C++ for iterators */ │ │ │ │ │ -145 using iterator_category = std::forward_iterator_tag; │ │ │ │ │ -146 using value_type = typename std::remove_const::type; │ │ │ │ │ -147 using difference_type = D; │ │ │ │ │ -148 using pointer = V*; │ │ │ │ │ -149 using reference = R; │ │ │ │ │ - 150 │ │ │ │ │ -175 typedef T DerivedType; │ │ │ │ │ - 176 │ │ │ │ │ -180 typedef V Value; │ │ │ │ │ - 181 │ │ │ │ │ -185 typedef V* Pointer; │ │ │ │ │ - 186 │ │ │ │ │ -190 typedef D DifferenceType; │ │ │ │ │ - 191 │ │ │ │ │ -195 typedef R Reference; │ │ │ │ │ - 196 │ │ │ │ │ -198 Reference operator*() const │ │ │ │ │ - 199 { │ │ │ │ │ - 200 return static_cast(this)->dereference(); │ │ │ │ │ - 201 } │ │ │ │ │ - 202 │ │ │ │ │ -203 Pointer operator->() const │ │ │ │ │ - 204 { │ │ │ │ │ - 205 return &(static_cast(this)->dereference()); │ │ │ │ │ - 206 } │ │ │ │ │ - 207 │ │ │ │ │ -209 DerivedType& operator++() │ │ │ │ │ - 210 { │ │ │ │ │ - 211 static_cast(this)->increment(); │ │ │ │ │ - 212 return *static_cast(this); │ │ │ │ │ - 213 } │ │ │ │ │ - 214 │ │ │ │ │ -216 DerivedType operator++(int) │ │ │ │ │ - 217 { │ │ │ │ │ - 218 DerivedType tmp(static_cast(*this)); │ │ │ │ │ - 219 this->operator++(); │ │ │ │ │ - 220 return tmp; │ │ │ │ │ - 221 } │ │ │ │ │ - 222 }; │ │ │ │ │ - 223 │ │ │ │ │ - 234 template │ │ │ │ │ - 236 inline typename EnableIfInterOperable::type │ │ │ │ │ -237 operator==(const ForwardIteratorFacade& lhs, │ │ │ │ │ - 238 const ForwardIteratorFacade& rhs) │ │ │ │ │ - 239 { │ │ │ │ │ - 240 if(std::is_convertible::value) │ │ │ │ │ - 241 return static_cast(lhs).equals(static_cast(rhs)); │ │ │ │ │ - 242 else │ │ │ │ │ - 243 return static_cast(rhs).equals(static_cast(lhs)); │ │ │ │ │ - 244 } │ │ │ │ │ - 245 │ │ │ │ │ - 256 template │ │ │ │ │ - 258 inline typename EnableIfInterOperable::type │ │ │ │ │ -259 operator!=(const ForwardIteratorFacade& lhs, │ │ │ │ │ - 260 const ForwardIteratorFacade& rhs) │ │ │ │ │ - 261 { │ │ │ │ │ - 262 if(std::is_convertible::value) │ │ │ │ │ - 263 return !static_cast(lhs).equals(static_cast(rhs)); │ │ │ │ │ - 264 else │ │ │ │ │ - 265 return !static_cast(rhs).equals(static_cast(lhs)); │ │ │ │ │ - 266 } │ │ │ │ │ - 267 │ │ │ │ │ - 272 template │ │ │ │ │ -273 class BidirectionalIteratorFacade │ │ │ │ │ - 274 { │ │ │ │ │ - 275 │ │ │ │ │ - 276 public: │ │ │ │ │ - 277 /* type aliases required by C++ for iterators */ │ │ │ │ │ -278 using iterator_category = std::bidirectional_iterator_tag; │ │ │ │ │ -279 using value_type = typename std::remove_const::type; │ │ │ │ │ -280 using difference_type = D; │ │ │ │ │ -281 using pointer = V*; │ │ │ │ │ -282 using reference = R; │ │ │ │ │ - 283 │ │ │ │ │ -309 typedef T DerivedType; │ │ │ │ │ - 310 │ │ │ │ │ -314 typedef V Value; │ │ │ │ │ - 315 │ │ │ │ │ -319 typedef V* Pointer; │ │ │ │ │ - 320 │ │ │ │ │ -324 typedef D DifferenceType; │ │ │ │ │ - 325 │ │ │ │ │ -329 typedef R Reference; │ │ │ │ │ - 330 │ │ │ │ │ -332 Reference operator*() const │ │ │ │ │ - 333 { │ │ │ │ │ - 334 return static_cast(this)->dereference(); │ │ │ │ │ - 335 } │ │ │ │ │ - 336 │ │ │ │ │ -337 Pointer operator->() const │ │ │ │ │ - 338 { │ │ │ │ │ - 339 return &(static_cast(this)->dereference()); │ │ │ │ │ - 340 } │ │ │ │ │ - 341 │ │ │ │ │ -343 DerivedType& operator++() │ │ │ │ │ - 344 { │ │ │ │ │ - 345 static_cast(this)->increment(); │ │ │ │ │ - 346 return *static_cast(this); │ │ │ │ │ - 347 } │ │ │ │ │ - 348 │ │ │ │ │ -350 DerivedType operator++(int) │ │ │ │ │ - 351 { │ │ │ │ │ - 352 DerivedType tmp(static_cast(*this)); │ │ │ │ │ - 353 this->operator++(); │ │ │ │ │ - 354 return tmp; │ │ │ │ │ - 355 } │ │ │ │ │ - 356 │ │ │ │ │ - 357 │ │ │ │ │ -359 DerivedType& operator--() │ │ │ │ │ - 360 { │ │ │ │ │ - 361 static_cast(this)->decrement(); │ │ │ │ │ - 362 return *static_cast(this); │ │ │ │ │ - 363 } │ │ │ │ │ - 364 │ │ │ │ │ -366 DerivedType operator--(int) │ │ │ │ │ - 367 { │ │ │ │ │ - 368 DerivedType tmp(static_cast(*this)); │ │ │ │ │ - 369 this->operator--(); │ │ │ │ │ - 370 return tmp; │ │ │ │ │ - 371 } │ │ │ │ │ - 372 }; │ │ │ │ │ - 373 │ │ │ │ │ - 381 template │ │ │ │ │ - 383 inline typename std::enable_if::value,bool>:: │ │ │ │ │ -type │ │ │ │ │ -384 operator==(const BidirectionalIteratorFacade& lhs, │ │ │ │ │ - 385 const BidirectionalIteratorFacade& rhs) │ │ │ │ │ - 386 { │ │ │ │ │ - 387 return static_cast(lhs).equals(static_cast(rhs)); │ │ │ │ │ - 388 } │ │ │ │ │ - 389 │ │ │ │ │ - 398 template │ │ │ │ │ - 400 inline │ │ │ │ │ - 401 typename std::enable_if::value && !std:: │ │ │ │ │ -is_convertible::value, │ │ │ │ │ - 402 bool>::type │ │ │ │ │ -403 operator==(const BidirectionalIteratorFacade& lhs, │ │ │ │ │ - 404 const BidirectionalIteratorFacade& rhs) │ │ │ │ │ - 405 { │ │ │ │ │ - 406 return static_cast(rhs).equals(static_cast(lhs)); │ │ │ │ │ - 407 } │ │ │ │ │ - 408 │ │ │ │ │ - 419 template │ │ │ │ │ - 421 inline typename EnableIfInterOperable::type │ │ │ │ │ -422 operator!=(const BidirectionalIteratorFacade& lhs, │ │ │ │ │ - 423 const BidirectionalIteratorFacade& rhs) │ │ │ │ │ - 424 { │ │ │ │ │ - 425 return !(lhs == rhs); │ │ │ │ │ - 426 } │ │ │ │ │ - 427 │ │ │ │ │ - 432 template │ │ │ │ │ -433 class RandomAccessIteratorFacade │ │ │ │ │ - 434 { │ │ │ │ │ - 435 │ │ │ │ │ - 436 public: │ │ │ │ │ - 437 /* type aliases required by C++ for iterators */ │ │ │ │ │ -438 using iterator_category = std::random_access_iterator_tag; │ │ │ │ │ -439 using value_type = typename std::remove_const::type; │ │ │ │ │ -440 using difference_type = D; │ │ │ │ │ -441 using pointer = V*; │ │ │ │ │ -442 using reference = R; │ │ │ │ │ - 443 │ │ │ │ │ -477 typedef T DerivedType; │ │ │ │ │ - 478 │ │ │ │ │ -482 typedef V Value; │ │ │ │ │ - 483 │ │ │ │ │ -487 typedef V* Pointer; │ │ │ │ │ - 488 │ │ │ │ │ -492 typedef D DifferenceType; │ │ │ │ │ - 493 │ │ │ │ │ -497 typedef R Reference; │ │ │ │ │ - 498 │ │ │ │ │ -500 Reference operator*() const │ │ │ │ │ - 501 { │ │ │ │ │ - 502 return static_cast(this)->dereference(); │ │ │ │ │ - 503 } │ │ │ │ │ - 504 │ │ │ │ │ -505 Pointer operator->() const │ │ │ │ │ - 506 { │ │ │ │ │ - 507 return &(static_cast(this)->dereference()); │ │ │ │ │ - 508 } │ │ │ │ │ - 509 │ │ │ │ │ -515 Reference operator[](DifferenceType n) const │ │ │ │ │ - 516 { │ │ │ │ │ - 517 return static_cast(this)->elementAt(n); │ │ │ │ │ - 518 } │ │ │ │ │ - 519 │ │ │ │ │ -521 DerivedType& operator++() │ │ │ │ │ - 522 { │ │ │ │ │ - 523 static_cast(this)->increment(); │ │ │ │ │ - 524 return *static_cast(this); │ │ │ │ │ - 525 } │ │ │ │ │ - 526 │ │ │ │ │ -528 DerivedType operator++(int) │ │ │ │ │ - 529 { │ │ │ │ │ - 530 DerivedType tmp(static_cast(*this)); │ │ │ │ │ - 531 this->operator++(); │ │ │ │ │ - 532 return tmp; │ │ │ │ │ - 533 } │ │ │ │ │ - 534 │ │ │ │ │ -535 DerivedType& operator+=(DifferenceType n) │ │ │ │ │ - 536 { │ │ │ │ │ - 537 static_cast(this)->advance(n); │ │ │ │ │ - 538 return *static_cast(this); │ │ │ │ │ - 539 } │ │ │ │ │ - 540 │ │ │ │ │ -541 DerivedType operator+(DifferenceType n) const │ │ │ │ │ - 542 { │ │ │ │ │ - 543 DerivedType tmp(static_cast(*this)); │ │ │ │ │ - 544 tmp.advance(n); │ │ │ │ │ - 545 return tmp; │ │ │ │ │ - 546 } │ │ │ │ │ - 547 │ │ │ │ │ - 548 │ │ │ │ │ -550 DerivedType& operator--() │ │ │ │ │ - 551 { │ │ │ │ │ - 552 static_cast(this)->decrement(); │ │ │ │ │ - 553 return *static_cast(this); │ │ │ │ │ - 554 } │ │ │ │ │ - 555 │ │ │ │ │ -557 DerivedType operator--(int) │ │ │ │ │ - 558 { │ │ │ │ │ - 559 DerivedType tmp(static_cast(*this)); │ │ │ │ │ - 560 this->operator--(); │ │ │ │ │ - 561 return tmp; │ │ │ │ │ - 562 } │ │ │ │ │ - 563 │ │ │ │ │ -564 DerivedType& operator-=(DifferenceType n) │ │ │ │ │ - 565 { │ │ │ │ │ - 566 static_cast(this)->advance(-n); │ │ │ │ │ - 567 return *static_cast(this); │ │ │ │ │ - 568 } │ │ │ │ │ - 569 │ │ │ │ │ -570 DerivedType operator-(DifferenceType n) const │ │ │ │ │ - 571 { │ │ │ │ │ - 572 DerivedType tmp(static_cast(*this)); │ │ │ │ │ - 573 tmp.advance(-n); │ │ │ │ │ - 574 return tmp; │ │ │ │ │ - 575 } │ │ │ │ │ - 576 │ │ │ │ │ - 577 │ │ │ │ │ - 578 }; │ │ │ │ │ - 579 │ │ │ │ │ - 590 template │ │ │ │ │ - 592 inline typename EnableIfInterOperable::type │ │ │ │ │ -593 operator==(const RandomAccessIteratorFacade& lhs, │ │ │ │ │ - 594 const RandomAccessIteratorFacade& rhs) │ │ │ │ │ - 595 { │ │ │ │ │ - 596 if(std::is_convertible::value) │ │ │ │ │ - 597 return static_cast(lhs).equals(static_cast(rhs)); │ │ │ │ │ - 598 else │ │ │ │ │ - 599 return static_cast(rhs).equals(static_cast(lhs)); │ │ │ │ │ - 600 } │ │ │ │ │ - 601 │ │ │ │ │ - 612 template │ │ │ │ │ - 614 inline typename EnableIfInterOperable::type │ │ │ │ │ -615 operator!=(const RandomAccessIteratorFacade& lhs, │ │ │ │ │ - 616 const RandomAccessIteratorFacade& rhs) │ │ │ │ │ - 617 { │ │ │ │ │ - 618 if(std::is_convertible::value) │ │ │ │ │ - 619 return !static_cast(lhs).equals(static_cast(rhs)); │ │ │ │ │ - 620 else │ │ │ │ │ - 621 return !static_cast(rhs).equals(static_cast(lhs)); │ │ │ │ │ - 622 } │ │ │ │ │ - 623 │ │ │ │ │ - 634 template │ │ │ │ │ -636 inline typename EnableIfInterOperable::type │ │ │ │ │ - 637 operator<(const RandomAccessIteratorFacade& lhs, │ │ │ │ │ - 638 const RandomAccessIteratorFacade& rhs) │ │ │ │ │ - 639 { │ │ │ │ │ - 640 if(std::is_convertible::value) │ │ │ │ │ - 641 return static_cast(lhs).distanceTo(static_cast │ │ │ │ │ -(rhs))>0; │ │ │ │ │ - 642 else │ │ │ │ │ - 643 return static_cast(rhs).distanceTo(static_cast │ │ │ │ │ -(lhs))<0; │ │ │ │ │ - 644 } │ │ │ │ │ - 645 │ │ │ │ │ - 646 │ │ │ │ │ - 657 template │ │ │ │ │ -659 inline typename EnableIfInterOperable::type │ │ │ │ │ - 660 operator<=(const RandomAccessIteratorFacade& lhs, │ │ │ │ │ - 661 const RandomAccessIteratorFacade& rhs) │ │ │ │ │ - 662 { │ │ │ │ │ - 663 if(std::is_convertible::value) │ │ │ │ │ - 664 return static_cast(lhs).distanceTo(static_cast │ │ │ │ │ -(rhs))>=0; │ │ │ │ │ - 665 else │ │ │ │ │ - 666 return static_cast(rhs).distanceTo(static_cast │ │ │ │ │ -(lhs))<=0; │ │ │ │ │ - 667 } │ │ │ │ │ - 668 │ │ │ │ │ - 669 │ │ │ │ │ - 680 template │ │ │ │ │ - 682 inline typename EnableIfInterOperable::type │ │ │ │ │ -683 operator>(const RandomAccessIteratorFacade& lhs, │ │ │ │ │ - 684 const RandomAccessIteratorFacade& rhs) │ │ │ │ │ - 685 { │ │ │ │ │ - 686 if(std::is_convertible::value) │ │ │ │ │ - 687 return static_cast(lhs).distanceTo(static_cast │ │ │ │ │ -(rhs))<0; │ │ │ │ │ - 688 else │ │ │ │ │ - 689 return static_cast(rhs).distanceTo(static_cast │ │ │ │ │ -(lhs))>0; │ │ │ │ │ - 690 } │ │ │ │ │ - 691 │ │ │ │ │ - 702 template │ │ │ │ │ - 704 inline typename EnableIfInterOperable::type │ │ │ │ │ -705 operator>=(const RandomAccessIteratorFacade& lhs, │ │ │ │ │ - 706 const RandomAccessIteratorFacade& rhs) │ │ │ │ │ - 707 { │ │ │ │ │ - 708 if(std::is_convertible::value) │ │ │ │ │ - 709 return static_cast(lhs).distanceTo(static_cast │ │ │ │ │ -(rhs))<=0; │ │ │ │ │ - 710 else │ │ │ │ │ - 711 return static_cast(rhs).distanceTo(static_cast │ │ │ │ │ -(lhs))>=0; │ │ │ │ │ - 712 } │ │ │ │ │ - 713 │ │ │ │ │ - 724 template │ │ │ │ │ - 726 inline typename EnableIfInterOperable::type │ │ │ │ │ -727 operator-(const RandomAccessIteratorFacade& lhs, │ │ │ │ │ - 728 const RandomAccessIteratorFacade& rhs) │ │ │ │ │ - 729 { │ │ │ │ │ - 730 if(std::is_convertible::value) │ │ │ │ │ - 731 return -static_cast(lhs).distanceTo(static_cast │ │ │ │ │ -(rhs)); │ │ │ │ │ - 732 else │ │ │ │ │ - 733 return static_cast(rhs).distanceTo(static_cast │ │ │ │ │ -(lhs)); │ │ │ │ │ - 734 } │ │ │ │ │ - 735 │ │ │ │ │ - 737} │ │ │ │ │ - 738#endif │ │ │ │ │ -typetraits.hh │ │ │ │ │ -Traits for type conversions and type information. │ │ │ │ │ -Dune::operator- │ │ │ │ │ -bigunsignedint< k > operator-(const bigunsignedint< k > &x, std::uintmax_t y) │ │ │ │ │ -Definition: bigunsignedint.hh:542 │ │ │ │ │ -Dune::operator< │ │ │ │ │ -EnableIfInterOperable< T1, T2, bool >::type operator<(const │ │ │ │ │ -RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const │ │ │ │ │ -RandomAccessIteratorFacade< T2, V2, R2, D > &rhs) │ │ │ │ │ -Comparison operator. │ │ │ │ │ -Definition: iteratorfacades.hh:637 │ │ │ │ │ -Dune::operator> │ │ │ │ │ -EnableIfInterOperable< T1, T2, bool >::type operator>(const │ │ │ │ │ -RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const │ │ │ │ │ -RandomAccessIteratorFacade< T2, V2, R2, D > &rhs) │ │ │ │ │ -Comparison operator. │ │ │ │ │ -Definition: iteratorfacades.hh:683 │ │ │ │ │ -Dune::operator<= │ │ │ │ │ -EnableIfInterOperable< T1, T2, bool >::type operator<=(const │ │ │ │ │ -RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const │ │ │ │ │ -RandomAccessIteratorFacade< T2, V2, R2, D > &rhs) │ │ │ │ │ -Comparison operator. │ │ │ │ │ -Definition: iteratorfacades.hh:660 │ │ │ │ │ -Dune::operator== │ │ │ │ │ -EnableIfInterOperable< T1, T2, bool >::type operator==(const │ │ │ │ │ -ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, │ │ │ │ │ -V2, R2, D > &rhs) │ │ │ │ │ -Checks for equality. │ │ │ │ │ -Definition: iteratorfacades.hh:237 │ │ │ │ │ -Dune::operator>= │ │ │ │ │ -EnableIfInterOperable< T1, T2, bool >::type operator>=(const │ │ │ │ │ -RandomAccessIteratorFacade< T1, V1, R1, D > &lhs, const │ │ │ │ │ -RandomAccessIteratorFacade< T2, V2, R2, D > &rhs) │ │ │ │ │ -Comparison operator. │ │ │ │ │ -Definition: iteratorfacades.hh:705 │ │ │ │ │ -Dune::operator!= │ │ │ │ │ -EnableIfInterOperable< T1, T2, bool >::type operator!=(const │ │ │ │ │ -ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, │ │ │ │ │ -V2, R2, D > &rhs) │ │ │ │ │ -Checks for inequality. │ │ │ │ │ -Definition: iteratorfacades.hh:259 │ │ │ │ │ + 12#include │ │ │ │ │ + 13 │ │ │ │ │ + 14namespace Dune │ │ │ │ │ + 15{ │ │ │ │ │ + 16 template │ │ │ │ │ +17 struct Min │ │ │ │ │ + 18 { │ │ │ │ │ +19 using first_argument_type [[deprecated("This type alias is deprecated │ │ │ │ │ +following similar deprecations in C++17")]] = Type; │ │ │ │ │ + 20 │ │ │ │ │ +21 using second_argument_type [[deprecated("This type alias is deprecated │ │ │ │ │ +following similar deprecations in C++17")]] = Type; │ │ │ │ │ + 22 │ │ │ │ │ +23 using result_type [[deprecated("This type alias is deprecated following │ │ │ │ │ +similar deprecations in C++17")]] = Type; │ │ │ │ │ + 24 │ │ │ │ │ +25 Type operator()(const Type& t1, const Type& t2) const │ │ │ │ │ + 26 { │ │ │ │ │ + 27 using std::min; │ │ │ │ │ + 28 return min(t1,t2); │ │ │ │ │ + 29 } │ │ │ │ │ + 30 }; │ │ │ │ │ + 31 │ │ │ │ │ + 32 template │ │ │ │ │ +33 struct Max │ │ │ │ │ + 34 { │ │ │ │ │ +35 using first_argument_type [[deprecated("This type alias is deprecated │ │ │ │ │ +following similar deprecations in C++17")]] = Type; │ │ │ │ │ + 36 │ │ │ │ │ +37 using second_argument_type [[deprecated("This type alias is deprecated │ │ │ │ │ +following similar deprecations in C++17")]] = Type; │ │ │ │ │ + 38 │ │ │ │ │ +39 using result_type [[deprecated("This type alias is deprecated following │ │ │ │ │ +similar deprecations in C++17")]] = Type; │ │ │ │ │ + 40 │ │ │ │ │ +41 Type operator()(const Type& t1, const Type& t2) const │ │ │ │ │ + 42 { │ │ │ │ │ + 43 using std::max; │ │ │ │ │ + 44 return max(t1,t2); │ │ │ │ │ + 45 } │ │ │ │ │ + 46 }; │ │ │ │ │ + 47} │ │ │ │ │ + 48 │ │ │ │ │ + 49#endif │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::ForwardIteratorFacade │ │ │ │ │ -Base class for stl conformant forward iterators. │ │ │ │ │ -Definition: iteratorfacades.hh:141 │ │ │ │ │ -Dune::ForwardIteratorFacade::iterator_category │ │ │ │ │ -std::forward_iterator_tag iterator_category │ │ │ │ │ -Definition: iteratorfacades.hh:145 │ │ │ │ │ -Dune::ForwardIteratorFacade::pointer │ │ │ │ │ -V * pointer │ │ │ │ │ -Definition: iteratorfacades.hh:148 │ │ │ │ │ -Dune::ForwardIteratorFacade::operator++ │ │ │ │ │ -DerivedType & operator++() │ │ │ │ │ -Preincrement operator. │ │ │ │ │ -Definition: iteratorfacades.hh:209 │ │ │ │ │ -Dune::ForwardIteratorFacade::DifferenceType │ │ │ │ │ -D DifferenceType │ │ │ │ │ -The type of the difference between two positions. │ │ │ │ │ -Definition: iteratorfacades.hh:190 │ │ │ │ │ -Dune::ForwardIteratorFacade::Reference │ │ │ │ │ -R Reference │ │ │ │ │ -The type of the reference to the values accessed. │ │ │ │ │ -Definition: iteratorfacades.hh:195 │ │ │ │ │ -Dune::ForwardIteratorFacade::operator-> │ │ │ │ │ -Pointer operator->() const │ │ │ │ │ -Definition: iteratorfacades.hh:203 │ │ │ │ │ -Dune::ForwardIteratorFacade::DerivedType │ │ │ │ │ -T DerivedType │ │ │ │ │ -The type of derived iterator. │ │ │ │ │ -Definition: iteratorfacades.hh:175 │ │ │ │ │ -Dune::ForwardIteratorFacade::Value │ │ │ │ │ -V Value │ │ │ │ │ -The type of value accessed through the iterator. │ │ │ │ │ -Definition: iteratorfacades.hh:180 │ │ │ │ │ -Dune::ForwardIteratorFacade::value_type │ │ │ │ │ -typename std::remove_const< V >::type value_type │ │ │ │ │ -Definition: iteratorfacades.hh:146 │ │ │ │ │ -Dune::ForwardIteratorFacade::operator++ │ │ │ │ │ -DerivedType operator++(int) │ │ │ │ │ -Postincrement operator. │ │ │ │ │ -Definition: iteratorfacades.hh:216 │ │ │ │ │ -Dune::ForwardIteratorFacade::Pointer │ │ │ │ │ -V * Pointer │ │ │ │ │ -The pointer to the Value. │ │ │ │ │ -Definition: iteratorfacades.hh:185 │ │ │ │ │ -Dune::ForwardIteratorFacade::difference_type │ │ │ │ │ -D difference_type │ │ │ │ │ -Definition: iteratorfacades.hh:147 │ │ │ │ │ -Dune::ForwardIteratorFacade::operator* │ │ │ │ │ -Reference operator*() const │ │ │ │ │ -Dereferencing operator. │ │ │ │ │ -Definition: iteratorfacades.hh:198 │ │ │ │ │ -Dune::ForwardIteratorFacade::reference │ │ │ │ │ -R reference │ │ │ │ │ -Definition: iteratorfacades.hh:149 │ │ │ │ │ -Dune::BidirectionalIteratorFacade │ │ │ │ │ -Facade class for stl conformant bidirectional iterators. │ │ │ │ │ -Definition: iteratorfacades.hh:274 │ │ │ │ │ -Dune::BidirectionalIteratorFacade::pointer │ │ │ │ │ -V * pointer │ │ │ │ │ -Definition: iteratorfacades.hh:281 │ │ │ │ │ -Dune::BidirectionalIteratorFacade::value_type │ │ │ │ │ -typename std::remove_const< V >::type value_type │ │ │ │ │ -Definition: iteratorfacades.hh:279 │ │ │ │ │ -Dune::BidirectionalIteratorFacade::operator* │ │ │ │ │ -Reference operator*() const │ │ │ │ │ -Dereferencing operator. │ │ │ │ │ -Definition: iteratorfacades.hh:332 │ │ │ │ │ -Dune::BidirectionalIteratorFacade::difference_type │ │ │ │ │ -D difference_type │ │ │ │ │ -Definition: iteratorfacades.hh:280 │ │ │ │ │ -Dune::BidirectionalIteratorFacade::DerivedType │ │ │ │ │ -T DerivedType │ │ │ │ │ -The type of derived iterator. │ │ │ │ │ -Definition: iteratorfacades.hh:309 │ │ │ │ │ -Dune::BidirectionalIteratorFacade::operator-- │ │ │ │ │ -DerivedType & operator--() │ │ │ │ │ -Preincrement operator. │ │ │ │ │ -Definition: iteratorfacades.hh:359 │ │ │ │ │ -Dune::BidirectionalIteratorFacade::operator-> │ │ │ │ │ -Pointer operator->() const │ │ │ │ │ -Definition: iteratorfacades.hh:337 │ │ │ │ │ -Dune::BidirectionalIteratorFacade::operator++ │ │ │ │ │ -DerivedType & operator++() │ │ │ │ │ -Preincrement operator. │ │ │ │ │ -Definition: iteratorfacades.hh:343 │ │ │ │ │ -Dune::BidirectionalIteratorFacade::Pointer │ │ │ │ │ -V * Pointer │ │ │ │ │ -The pointer to the Value. │ │ │ │ │ -Definition: iteratorfacades.hh:319 │ │ │ │ │ -Dune::BidirectionalIteratorFacade::Reference │ │ │ │ │ -R Reference │ │ │ │ │ -The type of the reference to the values accessed. │ │ │ │ │ -Definition: iteratorfacades.hh:329 │ │ │ │ │ -Dune::BidirectionalIteratorFacade::operator++ │ │ │ │ │ -DerivedType operator++(int) │ │ │ │ │ -Postincrement operator. │ │ │ │ │ -Definition: iteratorfacades.hh:350 │ │ │ │ │ -Dune::BidirectionalIteratorFacade::iterator_category │ │ │ │ │ -std::bidirectional_iterator_tag iterator_category │ │ │ │ │ -Definition: iteratorfacades.hh:278 │ │ │ │ │ -Dune::BidirectionalIteratorFacade::DifferenceType │ │ │ │ │ -D DifferenceType │ │ │ │ │ -The type of the difference between two positions. │ │ │ │ │ -Definition: iteratorfacades.hh:324 │ │ │ │ │ -Dune::BidirectionalIteratorFacade::operator-- │ │ │ │ │ -DerivedType operator--(int) │ │ │ │ │ -Postincrement operator. │ │ │ │ │ -Definition: iteratorfacades.hh:366 │ │ │ │ │ -Dune::BidirectionalIteratorFacade::reference │ │ │ │ │ -R reference │ │ │ │ │ -Definition: iteratorfacades.hh:282 │ │ │ │ │ -Dune::BidirectionalIteratorFacade::Value │ │ │ │ │ -V Value │ │ │ │ │ -The type of value accessed through the iterator. │ │ │ │ │ -Definition: iteratorfacades.hh:314 │ │ │ │ │ -Dune::RandomAccessIteratorFacade │ │ │ │ │ -Base class for stl conformant forward iterators. │ │ │ │ │ -Definition: iteratorfacades.hh:434 │ │ │ │ │ -Dune::RandomAccessIteratorFacade::value_type │ │ │ │ │ -typename std::remove_const< V >::type value_type │ │ │ │ │ -Definition: iteratorfacades.hh:439 │ │ │ │ │ -Dune::RandomAccessIteratorFacade::difference_type │ │ │ │ │ -D difference_type │ │ │ │ │ -Definition: iteratorfacades.hh:440 │ │ │ │ │ -Dune::RandomAccessIteratorFacade::operator-- │ │ │ │ │ -DerivedType operator--(int) │ │ │ │ │ -Postdecrement operator. │ │ │ │ │ -Definition: iteratorfacades.hh:557 │ │ │ │ │ -Dune::RandomAccessIteratorFacade::pointer │ │ │ │ │ -V * pointer │ │ │ │ │ -Definition: iteratorfacades.hh:441 │ │ │ │ │ -Dune::RandomAccessIteratorFacade::iterator_category │ │ │ │ │ -std::random_access_iterator_tag iterator_category │ │ │ │ │ -Definition: iteratorfacades.hh:438 │ │ │ │ │ -Dune::RandomAccessIteratorFacade::operator* │ │ │ │ │ -Reference operator*() const │ │ │ │ │ -Dereferencing operator. │ │ │ │ │ -Definition: iteratorfacades.hh:500 │ │ │ │ │ -Dune::RandomAccessIteratorFacade::operator++ │ │ │ │ │ -DerivedType & operator++() │ │ │ │ │ -Preincrement operator. │ │ │ │ │ -Definition: iteratorfacades.hh:521 │ │ │ │ │ -Dune::RandomAccessIteratorFacade::reference │ │ │ │ │ -R reference │ │ │ │ │ -Definition: iteratorfacades.hh:442 │ │ │ │ │ -Dune::RandomAccessIteratorFacade::operator-> │ │ │ │ │ -Pointer operator->() const │ │ │ │ │ -Definition: iteratorfacades.hh:505 │ │ │ │ │ -Dune::RandomAccessIteratorFacade::DifferenceType │ │ │ │ │ -D DifferenceType │ │ │ │ │ -The type of the difference between two positions. │ │ │ │ │ -Definition: iteratorfacades.hh:492 │ │ │ │ │ -Dune::RandomAccessIteratorFacade::operator-- │ │ │ │ │ -DerivedType & operator--() │ │ │ │ │ -Predecrement operator. │ │ │ │ │ -Definition: iteratorfacades.hh:550 │ │ │ │ │ -Dune::RandomAccessIteratorFacade::operator-= │ │ │ │ │ -DerivedType & operator-=(DifferenceType n) │ │ │ │ │ -Definition: iteratorfacades.hh:564 │ │ │ │ │ -Dune::RandomAccessIteratorFacade::operator+ │ │ │ │ │ -DerivedType operator+(DifferenceType n) const │ │ │ │ │ -Definition: iteratorfacades.hh:541 │ │ │ │ │ -Dune::RandomAccessIteratorFacade::operator[] │ │ │ │ │ -Reference operator[](DifferenceType n) const │ │ │ │ │ -Get the element n positions from the current one. │ │ │ │ │ -Definition: iteratorfacades.hh:515 │ │ │ │ │ -Dune::RandomAccessIteratorFacade::DerivedType │ │ │ │ │ -T DerivedType │ │ │ │ │ -The type of derived iterator. │ │ │ │ │ -Definition: iteratorfacades.hh:477 │ │ │ │ │ -Dune::RandomAccessIteratorFacade::Pointer │ │ │ │ │ -V * Pointer │ │ │ │ │ -The pointer to the Value. │ │ │ │ │ -Definition: iteratorfacades.hh:487 │ │ │ │ │ -Dune::RandomAccessIteratorFacade::operator- │ │ │ │ │ -DerivedType operator-(DifferenceType n) const │ │ │ │ │ -Definition: iteratorfacades.hh:570 │ │ │ │ │ -Dune::RandomAccessIteratorFacade::operator++ │ │ │ │ │ -DerivedType operator++(int) │ │ │ │ │ -Postincrement operator. │ │ │ │ │ -Definition: iteratorfacades.hh:528 │ │ │ │ │ -Dune::RandomAccessIteratorFacade::Value │ │ │ │ │ -V Value │ │ │ │ │ -The type of value accessed through the iterator. │ │ │ │ │ -Definition: iteratorfacades.hh:482 │ │ │ │ │ -Dune::RandomAccessIteratorFacade::operator+= │ │ │ │ │ -DerivedType & operator+=(DifferenceType n) │ │ │ │ │ -Definition: iteratorfacades.hh:535 │ │ │ │ │ -Dune::RandomAccessIteratorFacade::Reference │ │ │ │ │ -R Reference │ │ │ │ │ -The type of the reference to the values accessed. │ │ │ │ │ -Definition: iteratorfacades.hh:497 │ │ │ │ │ -Dune::EnableIfInterOperable │ │ │ │ │ -Enable typedef if two types are interoperable. │ │ │ │ │ -Definition: typetraits.hh:81 │ │ │ │ │ +Dune::AlignedNumberImpl::min │ │ │ │ │ +auto min(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > │ │ │ │ │ +&b) │ │ │ │ │ +Definition: debugalign.hh:447 │ │ │ │ │ +Dune::AlignedNumberImpl::max │ │ │ │ │ +auto max(const AlignedNumber< T, align > &a, const AlignedNumber< T, align > │ │ │ │ │ +&b) │ │ │ │ │ +Definition: debugalign.hh:425 │ │ │ │ │ +Dune::Min │ │ │ │ │ +Definition: binaryfunctions.hh:18 │ │ │ │ │ +Dune::Min::result_type │ │ │ │ │ +Type result_type │ │ │ │ │ +Definition: binaryfunctions.hh:23 │ │ │ │ │ +Dune::Min::operator() │ │ │ │ │ +Type operator()(const Type &t1, const Type &t2) const │ │ │ │ │ +Definition: binaryfunctions.hh:25 │ │ │ │ │ +Dune::Min::first_argument_type │ │ │ │ │ +Type first_argument_type │ │ │ │ │ +Definition: binaryfunctions.hh:19 │ │ │ │ │ +Dune::Min::second_argument_type │ │ │ │ │ +Type second_argument_type │ │ │ │ │ +Definition: binaryfunctions.hh:21 │ │ │ │ │ +Dune::Max │ │ │ │ │ +Definition: binaryfunctions.hh:34 │ │ │ │ │ +Dune::Max::operator() │ │ │ │ │ +Type operator()(const Type &t1, const Type &t2) const │ │ │ │ │ +Definition: binaryfunctions.hh:41 │ │ │ │ │ +Dune::Max::result_type │ │ │ │ │ +Type result_type │ │ │ │ │ +Definition: binaryfunctions.hh:39 │ │ │ │ │ +Dune::Max::first_argument_type │ │ │ │ │ +Type first_argument_type │ │ │ │ │ +Definition: binaryfunctions.hh:35 │ │ │ │ │ +Dune::Max::second_argument_type │ │ │ │ │ +Type second_argument_type │ │ │ │ │ +Definition: binaryfunctions.hh:37 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00173.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: indices.hh File Reference │ │ │ │ +dune-common: float_cmp.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,114 +63,101 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ +Classes | │ │ │ │ Namespaces | │ │ │ │ -Typedefs | │ │ │ │ -Functions | │ │ │ │ -Variables
│ │ │ │ -
indices.hh File Reference
│ │ │ │ +Enumerations | │ │ │ │ +Functions
│ │ │ │ +
float_cmp.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <cstddef>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <dune/common/keywords.hh>
│ │ │ │ + │ │ │ │ +

Various ways to compare floating-point numbers. │ │ │ │ +More...

│ │ │ │ +
#include "float_cmp.cc"
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Classes

struct  Dune::FloatCmp::DefaultEpsilon< T, style >
 mapping from a value type and a compare style to a default epsilon More...
 
class  Dune::FloatCmpOps< T, cstyle_, rstyle_ >
 Class encapsulating a default epsilon. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::Indices
 Namespace with predefined compile time indices for the range [0,19].
namespace  Dune::FloatCmp
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Typedefs

template<std::size_t i>
using Dune::index_constant = std::integral_constant< std::size_t, i >
 An index constant with value i. More...
 

│ │ │ │ +Enumerations

enum  Dune::FloatCmp::CmpStyle { Dune::FloatCmp::relativeWeak │ │ │ │ +, Dune::FloatCmp::relativeStrong │ │ │ │ +, Dune::FloatCmp::absolute │ │ │ │ +, Dune::FloatCmp::defaultCmpStyle = relativeWeak │ │ │ │ + }
 
enum  Dune::FloatCmp::RoundingStyle {
│ │ │ │ +  Dune::FloatCmp::towardZero │ │ │ │ +, Dune::FloatCmp::towardInf │ │ │ │ +, Dune::FloatCmp::downward │ │ │ │ +, Dune::FloatCmp::upward │ │ │ │ +,
│ │ │ │ +  Dune::FloatCmp::defaultRoundingStyle = towardZero │ │ │ │ +
│ │ │ │ + }
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Functions

template<class F , class I , I... i>
decltype(auto) constexpr Dune::unpackIntegerSequence (F &&f, std::integer_sequence< I, i... > sequence)
 Unpack an std::integer_sequence<I,i...> to std::integral_constant<I,i>... More...
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Variables

constexpr index_constant< 0 > Dune::Indices::_0 = {}
 Compile time index with value 0. More...
 
constexpr index_constant< 1 > Dune::Indices::_1 = {}
 Compile time index with value 1. More...
 
constexpr index_constant< 2 > Dune::Indices::_2 = {}
 Compile time index with value 2. More...
 
constexpr index_constant< 3 > Dune::Indices::_3 = {}
 Compile time index with value 3. More...
 
constexpr index_constant< 4 > Dune::Indices::_4 = {}
 Compile time index with value 4. More...
 
constexpr index_constant< 5 > Dune::Indices::_5 = {}
 Compile time index with value 5. More...
 
constexpr index_constant< 6 > Dune::Indices::_6 = {}
 Compile time index with value 6. More...
 
constexpr index_constant< 7 > Dune::Indices::_7 = {}
 Compile time index with value 7. More...
 
constexpr index_constant< 8 > Dune::Indices::_8 = {}
 Compile time index with value 8. More...
 
constexpr index_constant< 9 > Dune::Indices::_9 = {}
 Compile time index with value 9. More...
 
constexpr index_constant< 10 > Dune::Indices::_10 = {}
 Compile time index with value 10. More...
 
constexpr index_constant< 11 > Dune::Indices::_11 = {}
 Compile time index with value 11. More...
 
constexpr index_constant< 12 > Dune::Indices::_12 = {}
 Compile time index with value 12. More...
 
constexpr index_constant< 13 > Dune::Indices::_13 = {}
 Compile time index with value 13. More...
 
constexpr index_constant< 14 > Dune::Indices::_14 = {}
 Compile time index with value 14. More...
 
constexpr index_constant< 15 > Dune::Indices::_15 = {}
 Compile time index with value 15. More...
 
constexpr index_constant< 16 > Dune::Indices::_16 = {}
 Compile time index with value 16. More...
 
constexpr index_constant< 17 > Dune::Indices::_17 = {}
 Compile time index with value 17. More...
 
constexpr index_constant< 18 > Dune::Indices::_18 = {}
 Compile time index with value 18. More...
 
constexpr index_constant< 19 > Dune::Indices::_19 = {}
 Compile time index with value 19. More...
 
template<class T , CmpStyle style>
bool Dune::FloatCmp::eq (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, style >::value())
 test for equality using epsilon More...
 
template<class T , CmpStyle style>
bool Dune::FloatCmp::ne (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, style >::value())
 test for inequality using epsilon More...
 
template<class T , CmpStyle style>
bool Dune::FloatCmp::gt (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, style >::value())
 test if first greater than second More...
 
template<class T , CmpStyle style>
bool Dune::FloatCmp::lt (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, style >::value())
 test if first lesser than second More...
 
template<class T , CmpStyle style>
bool Dune::FloatCmp::ge (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, style >::value())
 test if first greater or equal second More...
 
template<class T , CmpStyle style>
bool Dune::FloatCmp::le (const T &first, const T &second, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, style >::value())
 test if first lesser or equal second More...
 
template<class I , class T , CmpStyle cstyle, RoundingStyle rstyle>
Dune::FloatCmp::round (const T &val, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, cstyle >::value())
 round using epsilon More...
 
template<class I , class T , CmpStyle cstyle, RoundingStyle rstyle>
Dune::FloatCmp::trunc (const T &val, typename EpsilonType< T >::Type epsilon=DefaultEpsilon< T, cstyle >::value())
 truncate using epsilon More...
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

Various ways to compare floating-point numbers.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,98 +4,83 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Namespaces | Typedefs | Functions | Variables │ │ │ │ │ -indices.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Enumerations | Functions │ │ │ │ │ +float_cmp.hh File Reference │ │ │ │ │ +Various ways to compare floating-point numbers. More... │ │ │ │ │ +#include "float_cmp.cc" │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ + Classes │ │ │ │ │ +struct  Dune::FloatCmp::DefaultEpsilon<_T,_style_> │ │ │ │ │ +  mapping from a value type and a compare style to a default epsilon │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ + class  Dune::FloatCmpOps<_T,_cstyle_,_rstyle__> │ │ │ │ │ +  Class encapsulating a default epsilon. More... │ │ │ │ │ +  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ -namespace  Dune::Indices │ │ │ │ │ -  Namespace with predefined compile time indices for the range │ │ │ │ │ - [0,19]. │ │ │ │ │ -  │ │ │ │ │ - Typedefs │ │ │ │ │ -template │ │ │ │ │ -using Dune::index_constant = std::integral_constant< std::size_t, i > │ │ │ │ │ -  An index constant with value i. More... │ │ │ │ │ -  │ │ │ │ │ - Functions │ │ │ │ │ -template │ │ │ │ │ -decltype(auto) constexpr Dune::unpackIntegerSequence (F &&f, std:: │ │ │ │ │ - integer_sequence< I, i... > sequence) │ │ │ │ │ -  Unpack an std::integer_sequence to std:: │ │ │ │ │ - integral_constant... More... │ │ │ │ │ -  │ │ │ │ │ - Variables │ │ │ │ │ - constexpr index_constant< 0 > Dune::Indices::_0 = {} │ │ │ │ │ -  Compile time index with value 0. More... │ │ │ │ │ -  │ │ │ │ │ - constexpr index_constant< 1 > Dune::Indices::_1 = {} │ │ │ │ │ -  Compile time index with value 1. More... │ │ │ │ │ -  │ │ │ │ │ - constexpr index_constant< 2 > Dune::Indices::_2 = {} │ │ │ │ │ -  Compile time index with value 2. More... │ │ │ │ │ -  │ │ │ │ │ - constexpr index_constant< 3 > Dune::Indices::_3 = {} │ │ │ │ │ -  Compile time index with value 3. More... │ │ │ │ │ -  │ │ │ │ │ - constexpr index_constant< 4 > Dune::Indices::_4 = {} │ │ │ │ │ -  Compile time index with value 4. More... │ │ │ │ │ -  │ │ │ │ │ - constexpr index_constant< 5 > Dune::Indices::_5 = {} │ │ │ │ │ -  Compile time index with value 5. More... │ │ │ │ │ -  │ │ │ │ │ - constexpr index_constant< 6 > Dune::Indices::_6 = {} │ │ │ │ │ -  Compile time index with value 6. More... │ │ │ │ │ -  │ │ │ │ │ - constexpr index_constant< 7 > Dune::Indices::_7 = {} │ │ │ │ │ -  Compile time index with value 7. More... │ │ │ │ │ +namespace  Dune::FloatCmp │ │ │ │ │   │ │ │ │ │ - constexpr index_constant< 8 > Dune::Indices::_8 = {} │ │ │ │ │ -  Compile time index with value 8. More... │ │ │ │ │ + Enumerations │ │ │ │ │ +enum Dune::FloatCmp::CmpStyle { Dune::FloatCmp::relativeWeak , Dune::FloatCmp:: │ │ │ │ │ +  relativeStrong , Dune::FloatCmp::absolute , Dune::FloatCmp::defaultCmpStyle = │ │ │ │ │ + relativeWeak } │ │ │ │ │ +  │ │ │ │ │ +enum Dune::FloatCmp::RoundingStyle { │ │ │ │ │ +    Dune::FloatCmp::towardZero , Dune::FloatCmp::towardInf , Dune::FloatCmp:: │ │ │ │ │ + downward , Dune::FloatCmp::upward , │ │ │ │ │ +   Dune::FloatCmp::defaultRoundingStyle = towardZero │ │ │ │ │ + } │ │ │ │ │   │ │ │ │ │ - constexpr index_constant< 9 > Dune::Indices::_9 = {} │ │ │ │ │ -  Compile time index with value 9. More... │ │ │ │ │ -  │ │ │ │ │ -constexpr index_constant< 10 > Dune::Indices::_10 = {} │ │ │ │ │ -  Compile time index with value 10. More... │ │ │ │ │ -  │ │ │ │ │ -constexpr index_constant< 11 > Dune::Indices::_11 = {} │ │ │ │ │ -  Compile time index with value 11. More... │ │ │ │ │ -  │ │ │ │ │ -constexpr index_constant< 12 > Dune::Indices::_12 = {} │ │ │ │ │ -  Compile time index with value 12. More... │ │ │ │ │ -  │ │ │ │ │ -constexpr index_constant< 13 > Dune::Indices::_13 = {} │ │ │ │ │ -  Compile time index with value 13. More... │ │ │ │ │ -  │ │ │ │ │ -constexpr index_constant< 14 > Dune::Indices::_14 = {} │ │ │ │ │ -  Compile time index with value 14. More... │ │ │ │ │ -  │ │ │ │ │ -constexpr index_constant< 15 > Dune::Indices::_15 = {} │ │ │ │ │ -  Compile time index with value 15. More... │ │ │ │ │ -  │ │ │ │ │ -constexpr index_constant< 16 > Dune::Indices::_16 = {} │ │ │ │ │ -  Compile time index with value 16. More... │ │ │ │ │ -  │ │ │ │ │ -constexpr index_constant< 17 > Dune::Indices::_17 = {} │ │ │ │ │ -  Compile time index with value 17. More... │ │ │ │ │ -  │ │ │ │ │ -constexpr index_constant< 18 > Dune::Indices::_18 = {} │ │ │ │ │ -  Compile time index with value 18. More... │ │ │ │ │ -  │ │ │ │ │ -constexpr index_constant< 19 > Dune::Indices::_19 = {} │ │ │ │ │ -  Compile time index with value 19. More... │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +bool Dune::FloatCmp::eq (const T &first, const T &second, typename │ │ │ │ │ + EpsilonType< T >::Type epsilon=DefaultEpsilon< T, style >::value()) │ │ │ │ │ +  test for equality using epsilon More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +bool Dune::FloatCmp::ne (const T &first, const T &second, typename │ │ │ │ │ + EpsilonType< T >::Type epsilon=DefaultEpsilon< T, style >::value()) │ │ │ │ │ +  test for inequality using epsilon More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +bool Dune::FloatCmp::gt (const T &first, const T &second, typename │ │ │ │ │ + EpsilonType< T >::Type epsilon=DefaultEpsilon< T, style >::value()) │ │ │ │ │ +  test if first greater than second More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +bool Dune::FloatCmp::lt (const T &first, const T &second, typename │ │ │ │ │ + EpsilonType< T >::Type epsilon=DefaultEpsilon< T, style >::value()) │ │ │ │ │ +  test if first lesser than second More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +bool Dune::FloatCmp::ge (const T &first, const T &second, typename │ │ │ │ │ + EpsilonType< T >::Type epsilon=DefaultEpsilon< T, style >::value()) │ │ │ │ │ +  test if first greater or equal second More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +bool Dune::FloatCmp::le (const T &first, const T &second, typename │ │ │ │ │ + EpsilonType< T >::Type epsilon=DefaultEpsilon< T, style >::value()) │ │ │ │ │ +  test if first lesser or equal second More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + I Dune::FloatCmp::round (const T &val, typename EpsilonType< T >::Type │ │ │ │ │ + epsilon=DefaultEpsilon< T, cstyle >::value()) │ │ │ │ │ +  round using epsilon More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + I Dune::FloatCmp::trunc (const T &val, typename EpsilonType< T >::Type │ │ │ │ │ + epsilon=DefaultEpsilon< T, cstyle >::value()) │ │ │ │ │ +  truncate using epsilon More... │ │ │ │ │   │ │ │ │ │ +***** Detailed Description ***** │ │ │ │ │ +Various ways to compare floating-point numbers. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00173_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: indices.hh Source File │ │ │ │ +dune-common: float_cmp.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,116 +62,190 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
indices.hh
│ │ │ │ +
float_cmp.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 (C) 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_COMMON_INDICES_HH
│ │ │ │ -
7#define DUNE_COMMON_INDICES_HH
│ │ │ │ -
8
│ │ │ │ -
9#include <cstddef>
│ │ │ │ -
10#include <type_traits>
│ │ │ │ -
11#include <utility>
│ │ │ │ -
12
│ │ │ │ - │ │ │ │ -
14
│ │ │ │ -
15namespace Dune
│ │ │ │ -
16{
│ │ │ │ -
29 template<std::size_t i>
│ │ │ │ -
30 using index_constant = std::integral_constant<std::size_t, i>;
│ │ │ │ -
31
│ │ │ │ -
32
│ │ │ │ -
33
│ │ │ │ -
50 namespace Indices
│ │ │ │ -
51 {
│ │ │ │ - │ │ │ │ -
54
│ │ │ │ - │ │ │ │ -
57
│ │ │ │ - │ │ │ │ -
60
│ │ │ │ - │ │ │ │ -
63
│ │ │ │ - │ │ │ │ -
66
│ │ │ │ - │ │ │ │ -
69
│ │ │ │ - │ │ │ │ -
72
│ │ │ │ - │ │ │ │ -
75
│ │ │ │ - │ │ │ │ -
78
│ │ │ │ - │ │ │ │ -
81
│ │ │ │ - │ │ │ │ -
84
│ │ │ │ - │ │ │ │ -
87
│ │ │ │ - │ │ │ │ -
90
│ │ │ │ - │ │ │ │ -
93
│ │ │ │ - │ │ │ │ -
96
│ │ │ │ - │ │ │ │ -
99
│ │ │ │ - │ │ │ │ -
102
│ │ │ │ - │ │ │ │ -
105
│ │ │ │ - │ │ │ │ -
108
│ │ │ │ - │ │ │ │ -
111
│ │ │ │ -
112 } // namespace Indices
│ │ │ │ -
113
│ │ │ │ -
124 template<class F, class I, I... i>
│ │ │ │ -
125 decltype(auto) constexpr unpackIntegerSequence(F&& f, std::integer_sequence<I, i...> sequence)
│ │ │ │ -
126 {
│ │ │ │ -
127 return f(std::integral_constant<I, i>()...);
│ │ │ │ -
128 }
│ │ │ │ -
129
│ │ │ │ -
130} //namespace Dune
│ │ │ │ -
131
│ │ │ │ -
132#endif // DUNE_COMMON_INDICES_HH
│ │ │ │ -
Definitions of several macros that conditionally make C++ syntax available.
│ │ │ │ -
#define DUNE_INLINE_VARIABLE
Definition: keywords.hh:19
│ │ │ │ -
constexpr index_constant< 16 > _16
Compile time index with value 16.
Definition: indices.hh:101
│ │ │ │ -
constexpr index_constant< 15 > _15
Compile time index with value 15.
Definition: indices.hh:98
│ │ │ │ -
constexpr index_constant< 8 > _8
Compile time index with value 8.
Definition: indices.hh:77
│ │ │ │ -
constexpr index_constant< 7 > _7
Compile time index with value 7.
Definition: indices.hh:74
│ │ │ │ -
constexpr index_constant< 0 > _0
Compile time index with value 0.
Definition: indices.hh:53
│ │ │ │ -
constexpr index_constant< 9 > _9
Compile time index with value 9.
Definition: indices.hh:80
│ │ │ │ -
constexpr index_constant< 14 > _14
Compile time index with value 14.
Definition: indices.hh:95
│ │ │ │ -
constexpr index_constant< 1 > _1
Compile time index with value 1.
Definition: indices.hh:56
│ │ │ │ -
constexpr index_constant< 3 > _3
Compile time index with value 3.
Definition: indices.hh:62
│ │ │ │ -
constexpr index_constant< 12 > _12
Compile time index with value 12.
Definition: indices.hh:89
│ │ │ │ -
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:125
│ │ │ │ -
constexpr index_constant< 11 > _11
Compile time index with value 11.
Definition: indices.hh:86
│ │ │ │ -
constexpr index_constant< 18 > _18
Compile time index with value 18.
Definition: indices.hh:107
│ │ │ │ -
constexpr index_constant< 13 > _13
Compile time index with value 13.
Definition: indices.hh:92
│ │ │ │ -
constexpr index_constant< 5 > _5
Compile time index with value 5.
Definition: indices.hh:68
│ │ │ │ -
constexpr index_constant< 17 > _17
Compile time index with value 17.
Definition: indices.hh:104
│ │ │ │ -
constexpr index_constant< 10 > _10
Compile time index with value 10.
Definition: indices.hh:83
│ │ │ │ -
constexpr index_constant< 2 > _2
Compile time index with value 2.
Definition: indices.hh:59
│ │ │ │ -
std::integral_constant< std::size_t, i > index_constant
An index constant with value i.
Definition: indices.hh:30
│ │ │ │ -
constexpr index_constant< 19 > _19
Compile time index with value 19.
Definition: indices.hh:110
│ │ │ │ -
constexpr index_constant< 6 > _6
Compile time index with value 6.
Definition: indices.hh:71
│ │ │ │ -
constexpr index_constant< 4 > _4
Compile time index with value 4.
Definition: indices.hh:65
│ │ │ │ +
5#ifndef DUNE_COMMON_FLOAT_CMP_HH
│ │ │ │ +
6#define DUNE_COMMON_FLOAT_CMP_HH
│ │ │ │ +
7
│ │ │ │ +
97namespace Dune {
│ │ │ │ +
100 namespace FloatCmp {
│ │ │ │ +
101 // basic constants
│ │ │ │ +
104 enum CmpStyle {
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
113 };
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
127 };
│ │ │ │ +
128
│ │ │ │ +
129 template<class T> struct EpsilonType;
│ │ │ │ +
130
│ │ │ │ +
132
│ │ │ │ +
137 template<class T, CmpStyle style = defaultCmpStyle>
│ │ │ │ + │ │ │ │ +
140 static typename EpsilonType<T>::Type value();
│ │ │ │ +
141 };
│ │ │ │ +
142
│ │ │ │ +
143 // operations in functional style
│ │ │ │ +
144
│ │ │ │ +
147
│ │ │ │ +
149
│ │ │ │ +
156 template <class T, CmpStyle style /*= defaultCmpStyle*/>
│ │ │ │ +
157 bool eq(const T &first,
│ │ │ │ +
158 const T &second,
│ │ │ │ + │ │ │ │ +
161
│ │ │ │ +
169 template <class T, CmpStyle style /*= defaultCmpStyle*/>
│ │ │ │ +
170 bool ne(const T &first,
│ │ │ │ +
171 const T &second,
│ │ │ │ + │ │ │ │ +
174
│ │ │ │ +
185 template <class T, CmpStyle style /*= defaultCmpStyle*/>
│ │ │ │ +
186 bool gt(const T &first,
│ │ │ │ +
187 const T &second,
│ │ │ │ + │ │ │ │ +
190
│ │ │ │ +
201 template <class T, CmpStyle style /*= defaultCmpStyle*/>
│ │ │ │ +
202 bool lt(const T &first,
│ │ │ │ +
203 const T &second,
│ │ │ │ + │ │ │ │ +
206
│ │ │ │ +
217 template <class T, CmpStyle style /*= defaultCmpStyle*/>
│ │ │ │ +
218 bool ge(const T &first,
│ │ │ │ +
219 const T &second,
│ │ │ │ + │ │ │ │ +
222
│ │ │ │ +
233 template <class T, CmpStyle style /*= defaultCmpStyle*/>
│ │ │ │ +
234 bool le(const T &first,
│ │ │ │ +
235 const T &second,
│ │ │ │ + │ │ │ │ +
237
│ │ │ │ +
238 // rounding operations
│ │ │ │ +
240
│ │ │ │ +
253 template<class I, class T, CmpStyle cstyle /*= defaultCmpStyle*/, RoundingStyle rstyle /*= defaultRoundingStyle*/>
│ │ │ │ +
254 I round(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, cstyle>::value());
│ │ │ │ +
255 // truncation
│ │ │ │ +
257
│ │ │ │ +
270 template<class I, class T, CmpStyle cstyle /*= defaultCmpStyle*/, RoundingStyle rstyle /*= defaultRoundingStyle*/>
│ │ │ │ +
271 I trunc(const T &val, typename EpsilonType<T>::Type epsilon = DefaultEpsilon<T, cstyle>::value());
│ │ │ │ +
272
│ │ │ │ +
274 // group FloatCmp
│ │ │ │ +
275 } //namespace FloatCmp
│ │ │ │ +
276
│ │ │ │ +
277
│ │ │ │ +
278 // oo interface
│ │ │ │ +
280
│ │ │ │ +
286 template<class T, FloatCmp::CmpStyle cstyle_ = FloatCmp::defaultCmpStyle,
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
291
│ │ │ │ +
292 public:
│ │ │ │ +
293 // record template parameters
│ │ │ │ +
295 static const CmpStyle cstyle = cstyle_;
│ │ │ │ +
297 static const RoundingStyle rstyle = rstyle_;
│ │ │ │ +
299 typedef T ValueType;
│ │ │ │ +
301
│ │ │ │ + │ │ │ │ +
305
│ │ │ │ +
306 private:
│ │ │ │ +
307 EpsilonType epsilon_;
│ │ │ │ +
308
│ │ │ │ + │ │ │ │ +
310
│ │ │ │ +
311 public:
│ │ │ │ +
313
│ │ │ │ + │ │ │ │ +
317
│ │ │ │ +
319 EpsilonType epsilon() const;
│ │ │ │ +
321 void epsilon(EpsilonType epsilon__);
│ │ │ │ +
322
│ │ │ │ +
324 bool eq(const ValueType &first, const ValueType &second) const;
│ │ │ │ +
326
│ │ │ │ +
329 bool ne(const ValueType &first, const ValueType &second) const;
│ │ │ │ +
331
│ │ │ │ +
335 bool gt(const ValueType &first, const ValueType &second) const;
│ │ │ │ +
337
│ │ │ │ +
341 bool lt(const ValueType &first, const ValueType &second) const;
│ │ │ │ +
343
│ │ │ │ +
347 bool ge(const ValueType &first, const ValueType &second) const;
│ │ │ │ +
349
│ │ │ │ +
353 bool le(const ValueType &first, const ValueType &second) const;
│ │ │ │ +
354
│ │ │ │ +
356
│ │ │ │ +
365 template<class I>
│ │ │ │ +
366 I round(const ValueType &val) const;
│ │ │ │ +
367
│ │ │ │ +
369
│ │ │ │ +
378 template<class I>
│ │ │ │ +
379 I trunc(const ValueType &val) const;
│ │ │ │ +
380
│ │ │ │ +
381 };
│ │ │ │ +
382
│ │ │ │ +
383} //namespace Dune
│ │ │ │ +
384
│ │ │ │ +
385#include "float_cmp.cc"
│ │ │ │ +
386
│ │ │ │ +
387#endif //DUNE_COMMON_FLOAT_CMP_HH
│ │ │ │ + │ │ │ │ +
bool ne(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
test for inequality using epsilon
Definition: float_cmp.cc:151
│ │ │ │ +
CmpStyle
Definition: float_cmp.hh:104
│ │ │ │ +
bool eq(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
test for equality using epsilon
Definition: float_cmp.cc:144
│ │ │ │ +
I round(const T &val, typename EpsilonType< T >::Type epsilon)
round using epsilon
Definition: float_cmp.cc:311
│ │ │ │ +
I trunc(const T &val, typename EpsilonType< T >::Type epsilon)
truncate using epsilon
Definition: float_cmp.cc:407
│ │ │ │ +
RoundingStyle
Definition: float_cmp.hh:116
│ │ │ │ +
bool lt(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
test if first lesser than second
Definition: float_cmp.cc:165
│ │ │ │ +
bool gt(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
test if first greater than second
Definition: float_cmp.cc:158
│ │ │ │ +
bool ge(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
test if first greater or equal second
Definition: float_cmp.cc:172
│ │ │ │ +
bool le(const T &first, const T &second, typename EpsilonType< T >::Type epsilon)
test if first lesser or equal second
Definition: float_cmp.cc:179
│ │ │ │ +
@ defaultCmpStyle
the global default compare style (relative_weak)
Definition: float_cmp.hh:112
│ │ │ │ +
@ relativeStrong
|a-b|/|a| <= epsilon && |a-b|/|b| <= epsilon
Definition: float_cmp.hh:108
│ │ │ │ +
@ relativeWeak
|a-b|/|a| <= epsilon || |a-b|/|b| <= epsilon
Definition: float_cmp.hh:106
│ │ │ │ +
@ absolute
|a-b| <= epsilon
Definition: float_cmp.hh:110
│ │ │ │ +
@ towardZero
always round toward 0
Definition: float_cmp.hh:118
│ │ │ │ +
@ towardInf
always round away from 0
Definition: float_cmp.hh:120
│ │ │ │ +
@ upward
round toward
Definition: float_cmp.hh:124
│ │ │ │ +
@ downward
round toward
Definition: float_cmp.hh:122
│ │ │ │ +
@ defaultRoundingStyle
the global default rounding style (toward_zero)
Definition: float_cmp.hh:126
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ +
T Type
The epsilon type corresponding to value type T.
Definition: float_cmp.cc:25
│ │ │ │ +
mapping from a value type and a compare style to a default epsilon
Definition: float_cmp.hh:138
│ │ │ │ +
static EpsilonType< T >::Type value()
Returns the default epsilon for the given value type and compare style.
│ │ │ │ +
Class encapsulating a default epsilon.
Definition: float_cmp.hh:288
│ │ │ │ +
bool le(const ValueType &first, const ValueType &second) const
test if first lesser or equal second
Definition: float_cmp.cc:486
│ │ │ │ +
FloatCmpOps(EpsilonType epsilon=DefaultEpsilon::value())
construct an operations object
Definition: float_cmp.cc:431
│ │ │ │ +
bool eq(const ValueType &first, const ValueType &second) const
test for equality using epsilon
Definition: float_cmp.cc:451
│ │ │ │ +
static const CmpStyle cstyle
How comparisons are done.
Definition: float_cmp.hh:295
│ │ │ │ +
bool lt(const ValueType &first, const ValueType &second) const
test if first lesser than second
Definition: float_cmp.cc:472
│ │ │ │ +
bool ge(const ValueType &first, const ValueType &second) const
test if first greater or equal second
Definition: float_cmp.cc:479
│ │ │ │ +
static const RoundingStyle rstyle
How rounding is done.
Definition: float_cmp.hh:297
│ │ │ │ +
FloatCmp::EpsilonType< T >::Type EpsilonType
Type of the epsilon.
Definition: float_cmp.hh:304
│ │ │ │ +
bool ne(const ValueType &first, const ValueType &second) const
test for inequality using epsilon
Definition: float_cmp.cc:458
│ │ │ │ +
T ValueType
Type of the values to compare.
Definition: float_cmp.hh:299
│ │ │ │ +
EpsilonType epsilon() const
return the current epsilon
Definition: float_cmp.cc:436
│ │ │ │ +
I round(const ValueType &val) const
round using epsilon
Definition: float_cmp.cc:495
│ │ │ │ +
I trunc(const ValueType &val) const
truncate using epsilon
Definition: float_cmp.cc:503
│ │ │ │ +
bool gt(const ValueType &first, const ValueType &second) const
test if first greater than second
Definition: float_cmp.cc:465
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,185 +4,310 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -indices.hh │ │ │ │ │ +float_cmp.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 (C) 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_COMMON_INDICES_HH │ │ │ │ │ - 7#define DUNE_COMMON_INDICES_HH │ │ │ │ │ - 8 │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12 │ │ │ │ │ - 13#include │ │ │ │ │ - 14 │ │ │ │ │ - 15namespace Dune │ │ │ │ │ - 16{ │ │ │ │ │ - 29 template │ │ │ │ │ -30 using index_constant = std::integral_constant; │ │ │ │ │ - 31 │ │ │ │ │ - 32 │ │ │ │ │ - 33 │ │ │ │ │ -50 namespace Indices │ │ │ │ │ - 51 { │ │ │ │ │ -53 DUNE_INLINE_VARIABLE constexpr index_constant<_0> _0 = {}; │ │ │ │ │ - 54 │ │ │ │ │ -56 DUNE_INLINE_VARIABLE constexpr index_constant<_1> _1 = {}; │ │ │ │ │ - 57 │ │ │ │ │ -59 DUNE_INLINE_VARIABLE constexpr index_constant<_2> _2 = {}; │ │ │ │ │ - 60 │ │ │ │ │ -62 DUNE_INLINE_VARIABLE constexpr index_constant<_3> _3 = {}; │ │ │ │ │ - 63 │ │ │ │ │ -65 DUNE_INLINE_VARIABLE constexpr index_constant<_4> _4 = {}; │ │ │ │ │ - 66 │ │ │ │ │ -68 DUNE_INLINE_VARIABLE constexpr index_constant<_5> _5 = {}; │ │ │ │ │ - 69 │ │ │ │ │ -71 DUNE_INLINE_VARIABLE constexpr index_constant<_6> _6 = {}; │ │ │ │ │ - 72 │ │ │ │ │ -74 DUNE_INLINE_VARIABLE constexpr index_constant<_7> _7 = {}; │ │ │ │ │ - 75 │ │ │ │ │ -77 DUNE_INLINE_VARIABLE constexpr index_constant<_8> _8 = {}; │ │ │ │ │ - 78 │ │ │ │ │ -80 DUNE_INLINE_VARIABLE constexpr index_constant<_9> _9 = {}; │ │ │ │ │ - 81 │ │ │ │ │ -83 DUNE_INLINE_VARIABLE constexpr index_constant<10> _10 = {}; │ │ │ │ │ - 84 │ │ │ │ │ -86 DUNE_INLINE_VARIABLE constexpr index_constant<11> _11 = {}; │ │ │ │ │ - 87 │ │ │ │ │ -89 DUNE_INLINE_VARIABLE constexpr index_constant<12> _12 = {}; │ │ │ │ │ - 90 │ │ │ │ │ -92 DUNE_INLINE_VARIABLE constexpr index_constant<13> _13 = {}; │ │ │ │ │ - 93 │ │ │ │ │ -95 DUNE_INLINE_VARIABLE constexpr index_constant<14> _14 = {}; │ │ │ │ │ - 96 │ │ │ │ │ -98 DUNE_INLINE_VARIABLE constexpr index_constant<15> _15 = {}; │ │ │ │ │ - 99 │ │ │ │ │ -101 DUNE_INLINE_VARIABLE constexpr index_constant<16> _16 = {}; │ │ │ │ │ - 102 │ │ │ │ │ -104 DUNE_INLINE_VARIABLE constexpr index_constant<17> _17 = {}; │ │ │ │ │ - 105 │ │ │ │ │ -107 DUNE_INLINE_VARIABLE constexpr index_constant<18> _18 = {}; │ │ │ │ │ - 108 │ │ │ │ │ -110 DUNE_INLINE_VARIABLE constexpr index_constant<19> _19 = {}; │ │ │ │ │ - 111 │ │ │ │ │ - 112 } // namespace Indices │ │ │ │ │ - 113 │ │ │ │ │ - 124 template │ │ │ │ │ -125 decltype(auto) constexpr unpackIntegerSequence(F&& f, std:: │ │ │ │ │ -integer_sequence sequence) │ │ │ │ │ - 126 { │ │ │ │ │ - 127 return f(std::integral_constant()...); │ │ │ │ │ - 128 } │ │ │ │ │ - 129 │ │ │ │ │ - 130} //namespace Dune │ │ │ │ │ - 131 │ │ │ │ │ - 132#endif // DUNE_COMMON_INDICES_HH │ │ │ │ │ -keywords.hh │ │ │ │ │ -Definitions of several macros that conditionally make C++ syntax available. │ │ │ │ │ -DUNE_INLINE_VARIABLE │ │ │ │ │ -#define DUNE_INLINE_VARIABLE │ │ │ │ │ -Definition: keywords.hh:19 │ │ │ │ │ -Dune::Indices::_16 │ │ │ │ │ -constexpr index_constant< 16 > _16 │ │ │ │ │ -Compile time index with value 16. │ │ │ │ │ -Definition: indices.hh:101 │ │ │ │ │ -Dune::Indices::_15 │ │ │ │ │ -constexpr index_constant< 15 > _15 │ │ │ │ │ -Compile time index with value 15. │ │ │ │ │ -Definition: indices.hh:98 │ │ │ │ │ -Dune::Indices::_8 │ │ │ │ │ -constexpr index_constant< 8 > _8 │ │ │ │ │ -Compile time index with value 8. │ │ │ │ │ -Definition: indices.hh:77 │ │ │ │ │ -Dune::Indices::_7 │ │ │ │ │ -constexpr index_constant< 7 > _7 │ │ │ │ │ -Compile time index with value 7. │ │ │ │ │ -Definition: indices.hh:74 │ │ │ │ │ -Dune::Indices::_0 │ │ │ │ │ -constexpr index_constant< 0 > _0 │ │ │ │ │ -Compile time index with value 0. │ │ │ │ │ -Definition: indices.hh:53 │ │ │ │ │ -Dune::Indices::_9 │ │ │ │ │ -constexpr index_constant< 9 > _9 │ │ │ │ │ -Compile time index with value 9. │ │ │ │ │ -Definition: indices.hh:80 │ │ │ │ │ -Dune::Indices::_14 │ │ │ │ │ -constexpr index_constant< 14 > _14 │ │ │ │ │ -Compile time index with value 14. │ │ │ │ │ -Definition: indices.hh:95 │ │ │ │ │ -Dune::Indices::_1 │ │ │ │ │ -constexpr index_constant< 1 > _1 │ │ │ │ │ -Compile time index with value 1. │ │ │ │ │ -Definition: indices.hh:56 │ │ │ │ │ -Dune::Indices::_3 │ │ │ │ │ -constexpr index_constant< 3 > _3 │ │ │ │ │ -Compile time index with value 3. │ │ │ │ │ -Definition: indices.hh:62 │ │ │ │ │ -Dune::Indices::_12 │ │ │ │ │ -constexpr index_constant< 12 > _12 │ │ │ │ │ -Compile time index with value 12. │ │ │ │ │ -Definition: indices.hh:89 │ │ │ │ │ -Dune::unpackIntegerSequence │ │ │ │ │ -decltype(auto) constexpr unpackIntegerSequence(F &&f, std::integer_sequence< I, │ │ │ │ │ -i... > sequence) │ │ │ │ │ -Unpack an std::integer_sequence to std::integral_constant... │ │ │ │ │ -Definition: indices.hh:125 │ │ │ │ │ -Dune::Indices::_11 │ │ │ │ │ -constexpr index_constant< 11 > _11 │ │ │ │ │ -Compile time index with value 11. │ │ │ │ │ -Definition: indices.hh:86 │ │ │ │ │ -Dune::Indices::_18 │ │ │ │ │ -constexpr index_constant< 18 > _18 │ │ │ │ │ -Compile time index with value 18. │ │ │ │ │ -Definition: indices.hh:107 │ │ │ │ │ -Dune::Indices::_13 │ │ │ │ │ -constexpr index_constant< 13 > _13 │ │ │ │ │ -Compile time index with value 13. │ │ │ │ │ -Definition: indices.hh:92 │ │ │ │ │ -Dune::Indices::_5 │ │ │ │ │ -constexpr index_constant< 5 > _5 │ │ │ │ │ -Compile time index with value 5. │ │ │ │ │ -Definition: indices.hh:68 │ │ │ │ │ -Dune::Indices::_17 │ │ │ │ │ -constexpr index_constant< 17 > _17 │ │ │ │ │ -Compile time index with value 17. │ │ │ │ │ -Definition: indices.hh:104 │ │ │ │ │ -Dune::Indices::_10 │ │ │ │ │ -constexpr index_constant< 10 > _10 │ │ │ │ │ -Compile time index with value 10. │ │ │ │ │ -Definition: indices.hh:83 │ │ │ │ │ -Dune::Indices::_2 │ │ │ │ │ -constexpr index_constant< 2 > _2 │ │ │ │ │ -Compile time index with value 2. │ │ │ │ │ -Definition: indices.hh:59 │ │ │ │ │ -Dune::index_constant │ │ │ │ │ -std::integral_constant< std::size_t, i > index_constant │ │ │ │ │ -An index constant with value i. │ │ │ │ │ -Definition: indices.hh:30 │ │ │ │ │ -Dune::Indices::_19 │ │ │ │ │ -constexpr index_constant< 19 > _19 │ │ │ │ │ -Compile time index with value 19. │ │ │ │ │ -Definition: indices.hh:110 │ │ │ │ │ -Dune::Indices::_6 │ │ │ │ │ -constexpr index_constant< 6 > _6 │ │ │ │ │ -Compile time index with value 6. │ │ │ │ │ -Definition: indices.hh:71 │ │ │ │ │ -Dune::Indices::_4 │ │ │ │ │ -constexpr index_constant< 4 > _4 │ │ │ │ │ -Compile time index with value 4. │ │ │ │ │ -Definition: indices.hh:65 │ │ │ │ │ + 5#ifndef DUNE_COMMON_FLOAT_CMP_HH │ │ │ │ │ + 6#define DUNE_COMMON_FLOAT_CMP_HH │ │ │ │ │ + 7 │ │ │ │ │ + 97namespace Dune { │ │ │ │ │ + 100 namespace FloatCmp { │ │ │ │ │ + 101 // basic constants │ │ │ │ │ +104 enum CmpStyle { │ │ │ │ │ +106 relativeWeak, │ │ │ │ │ +108 relativeStrong, │ │ │ │ │ +110 absolute, │ │ │ │ │ + 112 defaultCmpStyle = relativeWeak │ │ │ │ │ +113 }; │ │ │ │ │ +116 enum RoundingStyle { │ │ │ │ │ +118 towardZero, │ │ │ │ │ +120 towardInf, │ │ │ │ │ +122 downward, │ │ │ │ │ +124 upward, │ │ │ │ │ + 126 defaultRoundingStyle = towardZero │ │ │ │ │ +127 }; │ │ │ │ │ + 128 │ │ │ │ │ + 129 template struct EpsilonType; │ │ │ │ │ + 130 │ │ │ │ │ + 132 │ │ │ │ │ + 137 template │ │ │ │ │ +138 struct DefaultEpsilon { │ │ │ │ │ +140 static typename EpsilonType::Type value(); │ │ │ │ │ + 141 }; │ │ │ │ │ + 142 │ │ │ │ │ + 143 // operations in functional style │ │ │ │ │ + 144 │ │ │ │ │ + 147 │ │ │ │ │ + 149 │ │ │ │ │ + 156 template │ │ │ │ │ + 157 bool eq(const T &first, │ │ │ │ │ + 158 const T &second, │ │ │ │ │ + 159 typename EpsilonType::Type epsilon = DefaultEpsilon::value │ │ │ │ │ +()); │ │ │ │ │ + 161 │ │ │ │ │ + 169 template │ │ │ │ │ + 170 bool ne(const T &first, │ │ │ │ │ + 171 const T &second, │ │ │ │ │ + 172 typename EpsilonType::Type epsilon = DefaultEpsilon::value │ │ │ │ │ +()); │ │ │ │ │ + 174 │ │ │ │ │ + 185 template │ │ │ │ │ + 186 bool gt(const T &first, │ │ │ │ │ + 187 const T &second, │ │ │ │ │ + 188 typename EpsilonType::Type epsilon = DefaultEpsilon::value │ │ │ │ │ +()); │ │ │ │ │ + 190 │ │ │ │ │ + 201 template │ │ │ │ │ + 202 bool lt(const T &first, │ │ │ │ │ + 203 const T &second, │ │ │ │ │ + 204 typename EpsilonType::Type epsilon = DefaultEpsilon::value │ │ │ │ │ +()); │ │ │ │ │ + 206 │ │ │ │ │ + 217 template │ │ │ │ │ + 218 bool ge(const T &first, │ │ │ │ │ + 219 const T &second, │ │ │ │ │ + 220 typename EpsilonType::Type epsilon = DefaultEpsilon::value │ │ │ │ │ +()); │ │ │ │ │ + 222 │ │ │ │ │ + 233 template │ │ │ │ │ + 234 bool le(const T &first, │ │ │ │ │ + 235 const T &second, │ │ │ │ │ + 236 typename EpsilonType::Type epsilon = DefaultEpsilon::value │ │ │ │ │ +()); │ │ │ │ │ + 237 │ │ │ │ │ + 238 // rounding operations │ │ │ │ │ + 240 │ │ │ │ │ + 253 template │ │ │ │ │ + 254 I round(const T &val, typename EpsilonType::Type epsilon = │ │ │ │ │ +DefaultEpsilon::value()); │ │ │ │ │ + 255 // truncation │ │ │ │ │ + 257 │ │ │ │ │ + 270 template │ │ │ │ │ + 271 I trunc(const T &val, typename EpsilonType::Type epsilon = │ │ │ │ │ +DefaultEpsilon::value()); │ │ │ │ │ + 272 │ │ │ │ │ + 274 // group FloatCmp │ │ │ │ │ + 275 } //namespace FloatCmp │ │ │ │ │ + 276 │ │ │ │ │ + 277 │ │ │ │ │ + 278 // oo interface │ │ │ │ │ + 280 │ │ │ │ │ + 286 template │ │ │ │ │ +288 class FloatCmpOps { │ │ │ │ │ + 289 typedef FloatCmp::CmpStyle CmpStyle; │ │ │ │ │ + 290 typedef FloatCmp::RoundingStyle RoundingStyle; │ │ │ │ │ + 291 │ │ │ │ │ + 292 public: │ │ │ │ │ + 293 // record template parameters │ │ │ │ │ +295 static const CmpStyle cstyle = cstyle_; │ │ │ │ │ +297 static const RoundingStyle rstyle = rstyle_; │ │ │ │ │ +299 typedef T ValueType; │ │ │ │ │ + 301 │ │ │ │ │ +304 typedef typename FloatCmp::EpsilonType::Type EpsilonType; │ │ │ │ │ + 305 │ │ │ │ │ + 306 private: │ │ │ │ │ + 307 EpsilonType epsilon_; │ │ │ │ │ + 308 │ │ │ │ │ + 309 typedef FloatCmp::DefaultEpsilon DefaultEpsilon; │ │ │ │ │ + 310 │ │ │ │ │ + 311 public: │ │ │ │ │ + 313 │ │ │ │ │ + 316 FloatCmpOps(EpsilonType epsilon = DefaultEpsilon::value()); │ │ │ │ │ + 317 │ │ │ │ │ + 319 EpsilonType epsilon() const; │ │ │ │ │ + 321 void epsilon(EpsilonType epsilon__); │ │ │ │ │ + 322 │ │ │ │ │ + 324 bool eq(const ValueType &first, const ValueType &second) const; │ │ │ │ │ + 326 │ │ │ │ │ + 329 bool ne(const ValueType &first, const ValueType &second) const; │ │ │ │ │ + 331 │ │ │ │ │ + 335 bool gt(const ValueType &first, const ValueType &second) const; │ │ │ │ │ + 337 │ │ │ │ │ + 341 bool lt(const ValueType &first, const ValueType &second) const; │ │ │ │ │ + 343 │ │ │ │ │ + 347 bool ge(const ValueType &first, const ValueType &second) const; │ │ │ │ │ + 349 │ │ │ │ │ + 353 bool le(const ValueType &first, const ValueType &second) const; │ │ │ │ │ + 354 │ │ │ │ │ + 356 │ │ │ │ │ + 365 template │ │ │ │ │ + 366 I round(const ValueType &val) const; │ │ │ │ │ + 367 │ │ │ │ │ + 369 │ │ │ │ │ + 378 template │ │ │ │ │ + 379 I trunc(const ValueType &val) const; │ │ │ │ │ + 380 │ │ │ │ │ + 381 }; │ │ │ │ │ + 382 │ │ │ │ │ + 383} //namespace Dune │ │ │ │ │ + 384 │ │ │ │ │ + 385#include "float_cmp.cc" │ │ │ │ │ + 386 │ │ │ │ │ + 387#endif //DUNE_COMMON_FLOAT_CMP_HH │ │ │ │ │ +float_cmp.cc │ │ │ │ │ +Dune::FloatCmp::ne │ │ │ │ │ +bool ne(const T &first, const T &second, typename EpsilonType< T >::Type │ │ │ │ │ +epsilon) │ │ │ │ │ +test for inequality using epsilon │ │ │ │ │ +Definition: float_cmp.cc:151 │ │ │ │ │ +Dune::FloatCmp::CmpStyle │ │ │ │ │ +CmpStyle │ │ │ │ │ +Definition: float_cmp.hh:104 │ │ │ │ │ +Dune::FloatCmp::eq │ │ │ │ │ +bool eq(const T &first, const T &second, typename EpsilonType< T >::Type │ │ │ │ │ +epsilon) │ │ │ │ │ +test for equality using epsilon │ │ │ │ │ +Definition: float_cmp.cc:144 │ │ │ │ │ +Dune::FloatCmp::round │ │ │ │ │ +I round(const T &val, typename EpsilonType< T >::Type epsilon) │ │ │ │ │ +round using epsilon │ │ │ │ │ +Definition: float_cmp.cc:311 │ │ │ │ │ +Dune::FloatCmp::trunc │ │ │ │ │ +I trunc(const T &val, typename EpsilonType< T >::Type epsilon) │ │ │ │ │ +truncate using epsilon │ │ │ │ │ +Definition: float_cmp.cc:407 │ │ │ │ │ +Dune::FloatCmp::RoundingStyle │ │ │ │ │ +RoundingStyle │ │ │ │ │ +Definition: float_cmp.hh:116 │ │ │ │ │ +Dune::FloatCmp::lt │ │ │ │ │ +bool lt(const T &first, const T &second, typename EpsilonType< T >::Type │ │ │ │ │ +epsilon) │ │ │ │ │ +test if first lesser than second │ │ │ │ │ +Definition: float_cmp.cc:165 │ │ │ │ │ +Dune::FloatCmp::gt │ │ │ │ │ +bool gt(const T &first, const T &second, typename EpsilonType< T >::Type │ │ │ │ │ +epsilon) │ │ │ │ │ +test if first greater than second │ │ │ │ │ +Definition: float_cmp.cc:158 │ │ │ │ │ +Dune::FloatCmp::ge │ │ │ │ │ +bool ge(const T &first, const T &second, typename EpsilonType< T >::Type │ │ │ │ │ +epsilon) │ │ │ │ │ +test if first greater or equal second │ │ │ │ │ +Definition: float_cmp.cc:172 │ │ │ │ │ +Dune::FloatCmp::le │ │ │ │ │ +bool le(const T &first, const T &second, typename EpsilonType< T >::Type │ │ │ │ │ +epsilon) │ │ │ │ │ +test if first lesser or equal second │ │ │ │ │ +Definition: float_cmp.cc:179 │ │ │ │ │ +Dune::FloatCmp::defaultCmpStyle │ │ │ │ │ +@ defaultCmpStyle │ │ │ │ │ +the global default compare style (relative_weak) │ │ │ │ │ +Definition: float_cmp.hh:112 │ │ │ │ │ +Dune::FloatCmp::relativeStrong │ │ │ │ │ +@ relativeStrong │ │ │ │ │ +|a-b|/|a| <= epsilon && |a-b|/|b| <= epsilon │ │ │ │ │ +Definition: float_cmp.hh:108 │ │ │ │ │ +Dune::FloatCmp::relativeWeak │ │ │ │ │ +@ relativeWeak │ │ │ │ │ +|a-b|/|a| <= epsilon || |a-b|/|b| <= epsilon │ │ │ │ │ +Definition: float_cmp.hh:106 │ │ │ │ │ +Dune::FloatCmp::absolute │ │ │ │ │ +@ absolute │ │ │ │ │ +|a-b| <= epsilon │ │ │ │ │ +Definition: float_cmp.hh:110 │ │ │ │ │ +Dune::FloatCmp::towardZero │ │ │ │ │ +@ towardZero │ │ │ │ │ +always round toward 0 │ │ │ │ │ +Definition: float_cmp.hh:118 │ │ │ │ │ +Dune::FloatCmp::towardInf │ │ │ │ │ +@ towardInf │ │ │ │ │ +always round away from 0 │ │ │ │ │ +Definition: float_cmp.hh:120 │ │ │ │ │ +Dune::FloatCmp::upward │ │ │ │ │ +@ upward │ │ │ │ │ +round toward │ │ │ │ │ +Definition: float_cmp.hh:124 │ │ │ │ │ +Dune::FloatCmp::downward │ │ │ │ │ +@ downward │ │ │ │ │ +round toward │ │ │ │ │ +Definition: float_cmp.hh:122 │ │ │ │ │ +Dune::FloatCmp::defaultRoundingStyle │ │ │ │ │ +@ defaultRoundingStyle │ │ │ │ │ +the global default rounding style (toward_zero) │ │ │ │ │ +Definition: float_cmp.hh:126 │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ +Dune::FloatCmp::EpsilonType::Type │ │ │ │ │ +T Type │ │ │ │ │ +The epsilon type corresponding to value type T. │ │ │ │ │ +Definition: float_cmp.cc:25 │ │ │ │ │ +Dune::FloatCmp::DefaultEpsilon │ │ │ │ │ +mapping from a value type and a compare style to a default epsilon │ │ │ │ │ +Definition: float_cmp.hh:138 │ │ │ │ │ +Dune::FloatCmp::DefaultEpsilon::value │ │ │ │ │ +static EpsilonType< T >::Type value() │ │ │ │ │ +Returns the default epsilon for the given value type and compare style. │ │ │ │ │ +Dune::FloatCmpOps │ │ │ │ │ +Class encapsulating a default epsilon. │ │ │ │ │ +Definition: float_cmp.hh:288 │ │ │ │ │ +Dune::FloatCmpOps::le │ │ │ │ │ +bool le(const ValueType &first, const ValueType &second) const │ │ │ │ │ +test if first lesser or equal second │ │ │ │ │ +Definition: float_cmp.cc:486 │ │ │ │ │ +Dune::FloatCmpOps::FloatCmpOps │ │ │ │ │ +FloatCmpOps(EpsilonType epsilon=DefaultEpsilon::value()) │ │ │ │ │ +construct an operations object │ │ │ │ │ +Definition: float_cmp.cc:431 │ │ │ │ │ +Dune::FloatCmpOps::eq │ │ │ │ │ +bool eq(const ValueType &first, const ValueType &second) const │ │ │ │ │ +test for equality using epsilon │ │ │ │ │ +Definition: float_cmp.cc:451 │ │ │ │ │ +Dune::FloatCmpOps::cstyle │ │ │ │ │ +static const CmpStyle cstyle │ │ │ │ │ +How comparisons are done. │ │ │ │ │ +Definition: float_cmp.hh:295 │ │ │ │ │ +Dune::FloatCmpOps::lt │ │ │ │ │ +bool lt(const ValueType &first, const ValueType &second) const │ │ │ │ │ +test if first lesser than second │ │ │ │ │ +Definition: float_cmp.cc:472 │ │ │ │ │ +Dune::FloatCmpOps::ge │ │ │ │ │ +bool ge(const ValueType &first, const ValueType &second) const │ │ │ │ │ +test if first greater or equal second │ │ │ │ │ +Definition: float_cmp.cc:479 │ │ │ │ │ +Dune::FloatCmpOps::rstyle │ │ │ │ │ +static const RoundingStyle rstyle │ │ │ │ │ +How rounding is done. │ │ │ │ │ +Definition: float_cmp.hh:297 │ │ │ │ │ +Dune::FloatCmpOps::EpsilonType │ │ │ │ │ +FloatCmp::EpsilonType< T >::Type EpsilonType │ │ │ │ │ +Type of the epsilon. │ │ │ │ │ +Definition: float_cmp.hh:304 │ │ │ │ │ +Dune::FloatCmpOps::ne │ │ │ │ │ +bool ne(const ValueType &first, const ValueType &second) const │ │ │ │ │ +test for inequality using epsilon │ │ │ │ │ +Definition: float_cmp.cc:458 │ │ │ │ │ +Dune::FloatCmpOps::ValueType │ │ │ │ │ +T ValueType │ │ │ │ │ +Type of the values to compare. │ │ │ │ │ +Definition: float_cmp.hh:299 │ │ │ │ │ +Dune::FloatCmpOps::epsilon │ │ │ │ │ +EpsilonType epsilon() const │ │ │ │ │ +return the current epsilon │ │ │ │ │ +Definition: float_cmp.cc:436 │ │ │ │ │ +Dune::FloatCmpOps::round │ │ │ │ │ +I round(const ValueType &val) const │ │ │ │ │ +round using epsilon │ │ │ │ │ +Definition: float_cmp.cc:495 │ │ │ │ │ +Dune::FloatCmpOps::trunc │ │ │ │ │ +I trunc(const ValueType &val) const │ │ │ │ │ +truncate using epsilon │ │ │ │ │ +Definition: float_cmp.cc:503 │ │ │ │ │ +Dune::FloatCmpOps::gt │ │ │ │ │ +bool gt(const ValueType &first, const ValueType &second) const │ │ │ │ │ +test if first greater than second │ │ │ │ │ +Definition: float_cmp.cc:465 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00176.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: sllist.hh File Reference │ │ │ │ +dune-common: path.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,60 +63,56 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
sllist.hh File Reference
│ │ │ │ +
path.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ -

Implements a singly linked list together with the necessary iterators. │ │ │ │ +

Utilities for handling filesystem paths. │ │ │ │ More...

│ │ │ │ -
#include <memory>
│ │ │ │ -#include <cassert>
│ │ │ │ -#include "iteratorfacades.hh"
│ │ │ │ -#include <ostream>
│ │ │ │ +
#include <string>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

class  Dune::SLList< T, A >
 A single linked list. More...
 
class  Dune::SLListIterator< T, A >
 A mutable iterator for the SLList. More...
 
class  Dune::SLListConstIterator< T, A >
 A constant iterator for the SLList. More...
 
class  Dune::SLListModifyIterator< T, A >
 A mutable iterator for the SLList. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ Functions

template<typename T , typename A >
std::ostream & Dune::operator<< (std::ostream &os, const SLList< T, A > &sllist)
 
std::string Dune::concatPaths (const std::string &base, const std::string &p)
 concatenate two paths More...
 
std::string Dune::processPath (const std::string &p)
 sanitize a path for further processing More...
 
bool Dune::pathIndicatesDirectory (const std::string &p)
 check whether the given path indicates that it is a directory More...
 
std::string Dune::prettyPath (const std::string &p, bool isDirectory)
 pretty print path More...
 
std::string Dune::prettyPath (const std::string &p)
 pretty print path More...
 
std::string Dune::relativePath (const std::string &newbase, const std::string &p)
 compute a relative path between two paths More...
 
│ │ │ │

Detailed Description

│ │ │ │ -

Implements a singly linked list together with the necessary iterators.

│ │ │ │ -
Author
Markus Blatt
│ │ │ │ +

Utilities for handling filesystem paths.

│ │ │ │ +
Author
Jö Fahlke jorri.nosp@m.t@jo.nosp@m.rrit..nosp@m.de
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -us-ascii │ │ │ │ │ +utf-8 │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,45 +4,45 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Classes | Namespaces | Functions │ │ │ │ │ -sllist.hh File Reference │ │ │ │ │ -Common │ │ │ │ │ -Implements a singly linked list together with the necessary iterators. More... │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include "iteratorfacades.hh" │ │ │ │ │ -#include │ │ │ │ │ +Namespaces | Functions │ │ │ │ │ +path.hh File Reference │ │ │ │ │ +Common » Utilities » Filesystem_Paths │ │ │ │ │ +Utilities for handling filesystem paths. More... │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ - Classes │ │ │ │ │ -class  Dune::SLList<_T,_A_> │ │ │ │ │ -  A single linked list. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::SLListIterator<_T,_A_> │ │ │ │ │ -  A mutable iterator for the SLList. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::SLListConstIterator<_T,_A_> │ │ │ │ │ -  A constant iterator for the SLList. More... │ │ │ │ │ -  │ │ │ │ │ -class  Dune::SLListModifyIterator<_T,_A_> │ │ │ │ │ -  A mutable iterator for the SLList. More... │ │ │ │ │ -  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ -std::ostream & Dune::operator<< (std::ostream &os, const SLList< T, A > │ │ │ │ │ - &sllist) │ │ │ │ │ +std::string Dune::concatPaths (const std::string &base, const std::string &p) │ │ │ │ │ +  concatenate two paths More... │ │ │ │ │ +  │ │ │ │ │ +std::string Dune::processPath (const std::string &p) │ │ │ │ │ +  sanitize a path for further processing More... │ │ │ │ │ +  │ │ │ │ │ + bool Dune::pathIndicatesDirectory (const std::string &p) │ │ │ │ │ +  check whether the given path indicates that it is a directory │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ +std::string Dune::prettyPath (const std::string &p, bool isDirectory) │ │ │ │ │ +  pretty print path More... │ │ │ │ │ +  │ │ │ │ │ +std::string Dune::prettyPath (const std::string &p) │ │ │ │ │ +  pretty print path More... │ │ │ │ │ +  │ │ │ │ │ +std::string Dune::relativePath (const std::string &newbase, const std::string │ │ │ │ │ + &p) │ │ │ │ │ +  compute a relative path between two paths More... │ │ │ │ │   │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -Implements a singly linked list together with the necessary iterators. │ │ │ │ │ +Utilities for handling filesystem paths. │ │ │ │ │ Author │ │ │ │ │ - Markus Blatt │ │ │ │ │ + Jö Fahlke jorri.nosp@m.t@jo.nosp@m.rrit..nosp@m.de │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00176_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: sllist.hh Source File │ │ │ │ +dune-common: path.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,630 +62,54 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
sllist.hh
│ │ │ │ +
path.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 (C) 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_SLLIST_HH
│ │ │ │ -
6#define DUNE_SLLIST_HH
│ │ │ │ +
5#ifndef DUNE_COMMON_PATH_HH
│ │ │ │ +
6#define DUNE_COMMON_PATH_HH
│ │ │ │
7
│ │ │ │ -
8#include <memory>
│ │ │ │ -
9#include <cassert>
│ │ │ │ -
10#include "iteratorfacades.hh"
│ │ │ │ -
11#include <ostream>
│ │ │ │ -
12
│ │ │ │ -
13namespace Dune
│ │ │ │ -
14{
│ │ │ │ -
26 template<typename T, class A>
│ │ │ │ -
27 class SLListIterator;
│ │ │ │ -
28
│ │ │ │ -
29 template<typename T, class A>
│ │ │ │ -
30 class SLListConstIterator;
│ │ │ │ -
31
│ │ │ │ -
32 template<typename T, class A>
│ │ │ │ -
33 class SLListModifyIterator;
│ │ │ │ -
34
│ │ │ │ -
42 template<typename T, class A=std::allocator<T> >
│ │ │ │ -
43 class SLList
│ │ │ │ -
44 {
│ │ │ │ -
45 struct Element;
│ │ │ │ -
46 friend class SLListIterator<T,A>;
│ │ │ │ -
47 friend class SLListConstIterator<T,A>;
│ │ │ │ -
48
│ │ │ │ -
49 public:
│ │ │ │ -
50
│ │ │ │ -
54 typedef typename A::size_type size_type;
│ │ │ │ -
55
│ │ │ │ -
59 typedef T MemberType;
│ │ │ │ -
60
│ │ │ │ -
64 using Allocator = typename std::allocator_traits<A>::template rebind_alloc<Element>;
│ │ │ │ -
65
│ │ │ │ - │ │ │ │ -
70
│ │ │ │ - │ │ │ │ -
75
│ │ │ │ - │ │ │ │ -
80
│ │ │ │ -
84 template<typename T1, typename A1>
│ │ │ │ -
85 SLList(const SLList<T1,A1>& other);
│ │ │ │ -
86
│ │ │ │ -
90 SLList(const SLList<T,A>& other);
│ │ │ │ -
91
│ │ │ │ - │ │ │ │ -
98
│ │ │ │ - │ │ │ │ -
104
│ │ │ │ - │ │ │ │ -
109
│ │ │ │ +
8#include <string>
│ │ │ │ +
9
│ │ │ │ +
10namespace Dune {
│ │ │ │ +
23
│ │ │ │ +
51 std::string concatPaths(const std::string& base, const std::string& p);
│ │ │ │ +
52
│ │ │ │ +
54
│ │ │ │ +
98 std::string processPath(const std::string& p);
│ │ │ │ +
99
│ │ │ │ +
101
│ │ │ │ +
109 bool pathIndicatesDirectory(const std::string& p);
│ │ │ │
110
│ │ │ │ -
115 inline void push_back(const MemberType& item);
│ │ │ │ -
116
│ │ │ │ -
121 inline void push_front(const MemberType& item);
│ │ │ │ -
122
│ │ │ │ -
126 inline void pop_front();
│ │ │ │ -
127
│ │ │ │ -
129 inline void clear();
│ │ │ │ -
130
│ │ │ │ -
138 inline iterator begin();
│ │ │ │ -
139
│ │ │ │ -
147 inline const_iterator begin() const;
│ │ │ │ -
148
│ │ │ │ - │ │ │ │ -
157
│ │ │ │ - │ │ │ │ -
166
│ │ │ │ -
173 inline iterator end();
│ │ │ │ -
174
│ │ │ │ -
181 inline const_iterator end() const;
│ │ │ │ -
182
│ │ │ │ -
188 inline bool empty() const;
│ │ │ │ -
189
│ │ │ │ -
194 inline int size() const;
│ │ │ │ -
195
│ │ │ │ -
196 bool operator==(const SLList& sl) const;
│ │ │ │ -
197
│ │ │ │ -
198
│ │ │ │ -
199 bool operator!=(const SLList& sl) const;
│ │ │ │ -
200
│ │ │ │ -
201 private:
│ │ │ │ -
203 struct Element
│ │ │ │ -
204 {
│ │ │ │ -
208 Element* next_;
│ │ │ │ - │ │ │ │ -
213
│ │ │ │ -
214 Element(const MemberType& item, Element* next_=0);
│ │ │ │ -
215
│ │ │ │ -
216 Element();
│ │ │ │ -
217
│ │ │ │ -
218 ~Element();
│ │ │ │ -
219 };
│ │ │ │ -
220
│ │ │ │ -
225 void deleteNext(Element* current);
│ │ │ │ -
226
│ │ │ │ -
231 void copyElements(const SLList<T,A>& other);
│ │ │ │ -
232
│ │ │ │ -
240 template<bool watchForTail>
│ │ │ │ -
241 void deleteNext(Element* current);
│ │ │ │ -
247 void insertAfter(Element* current, const T& item);
│ │ │ │ -
248
│ │ │ │ -
250 Element beforeHead_;
│ │ │ │ -
251
│ │ │ │ -
257 Element* tail_;
│ │ │ │ -
258
│ │ │ │ -
260 Allocator allocator_;
│ │ │ │ -
261
│ │ │ │ -
263 int size_;
│ │ │ │ -
264 };
│ │ │ │ -
265
│ │ │ │ -
269 template<typename T, class A>
│ │ │ │ -
270 class SLListIterator : public Dune::ForwardIteratorFacade<SLListIterator<T,A>, T, T&, std::size_t>
│ │ │ │ -
271 {
│ │ │ │ -
272 friend class SLListConstIterator<T,A>;
│ │ │ │ -
273 friend class SLListModifyIterator<T,A>;
│ │ │ │ -
274 friend class SLList<T,A>;
│ │ │ │ -
275
│ │ │ │ -
276 public:
│ │ │ │ - │ │ │ │ -
278 SLList<T,A>* sllist)
│ │ │ │ -
279 : current_(item), list_(sllist)
│ │ │ │ -
280 {}
│ │ │ │ -
281
│ │ │ │ - │ │ │ │ -
283 : current_(0), list_(0)
│ │ │ │ -
284 {}
│ │ │ │ -
285
│ │ │ │ - │ │ │ │ -
287 : current_(other.iterator_.current_), list_(other.iterator_.list_)
│ │ │ │ -
288 {}
│ │ │ │ -
289
│ │ │ │ -
294 inline T& dereference() const
│ │ │ │ -
295 {
│ │ │ │ -
296 return current_->item_;
│ │ │ │ -
297 }
│ │ │ │ -
298
│ │ │ │ -
304 inline bool equals(const SLListConstIterator<T,A>& other) const
│ │ │ │ -
305 {
│ │ │ │ -
306 return current_==other.current_;
│ │ │ │ -
307 }
│ │ │ │ -
308
│ │ │ │ -
314 inline bool equals(const SLListIterator<T,A>& other) const
│ │ │ │ -
315 {
│ │ │ │ -
316 return current_==other.current_;
│ │ │ │ -
317 }
│ │ │ │ -
318
│ │ │ │ -
324 inline bool equals(const SLListModifyIterator<T,A>& other) const
│ │ │ │ -
325 {
│ │ │ │ -
326 return current_==other.iterator_.current_;
│ │ │ │ -
327 }
│ │ │ │ -
328
│ │ │ │ -
332 inline void increment()
│ │ │ │ -
333 {
│ │ │ │ -
334 current_ = current_->next_;
│ │ │ │ -
335 }
│ │ │ │ -
336
│ │ │ │ -
342 inline void insertAfter(const T& v) const
│ │ │ │ -
343 {
│ │ │ │ -
344 assert(list_ );
│ │ │ │ -
345 list_->insertAfter(current_, v);
│ │ │ │ -
346 }
│ │ │ │ -
347
│ │ │ │ -
353 inline void deleteNext() const
│ │ │ │ -
354 {
│ │ │ │ -
355 assert(list_);
│ │ │ │ -
356 list_->deleteNext(current_);
│ │ │ │ -
357 }
│ │ │ │ -
358
│ │ │ │ -
359 private:
│ │ │ │ -
361 typename SLList<T,A>::Element* current_;
│ │ │ │ - │ │ │ │ -
364 };
│ │ │ │ -
365
│ │ │ │ -
369 template<class T, class A>
│ │ │ │ -
370 class SLListConstIterator : public Dune::ForwardIteratorFacade<SLListConstIterator<T,A>, const T, const T&, std::size_t>
│ │ │ │ -
371 {
│ │ │ │ -
372 friend class SLListIterator<T,A>;
│ │ │ │ -
373 friend class SLList<T,A>;
│ │ │ │ -
374
│ │ │ │ -
375 public:
│ │ │ │ - │ │ │ │ -
377 : current_(0)
│ │ │ │ -
378 {}
│ │ │ │ -
379
│ │ │ │ - │ │ │ │ -
381 : current_(item)
│ │ │ │ -
382 {}
│ │ │ │ -
383
│ │ │ │ - │ │ │ │ -
385 : current_(other.current_)
│ │ │ │ -
386 {}
│ │ │ │ -
387
│ │ │ │ - │ │ │ │ -
389 : current_(other.iterator_.current_)
│ │ │ │ -
390 {}
│ │ │ │ -
391
│ │ │ │ -
396 inline const T& dereference() const
│ │ │ │ -
397 {
│ │ │ │ -
398 return current_->item_;
│ │ │ │ -
399 }
│ │ │ │ -
400
│ │ │ │ -
406 inline bool equals(const SLListConstIterator<T,A>& other) const
│ │ │ │ -
407 {
│ │ │ │ -
408 return current_==other.current_;
│ │ │ │ -
409 }
│ │ │ │ -
410
│ │ │ │ -
414 inline void increment()
│ │ │ │ -
415 {
│ │ │ │ -
416 current_ = current_->next_;
│ │ │ │ -
417 }
│ │ │ │ -
418
│ │ │ │ -
419 private:
│ │ │ │ -
421 typename SLList<T,A>::Element* current_;
│ │ │ │ -
422 };
│ │ │ │ -
423
│ │ │ │ -
427 template<typename T, class A>
│ │ │ │ -
428 class SLListModifyIterator : public Dune::ForwardIteratorFacade<SLListModifyIterator<T,A>, T, T&, std::size_t>
│ │ │ │ -
429 {
│ │ │ │ -
430 friend class SLListConstIterator<T,A>;
│ │ │ │ -
431 friend class SLListIterator<T,A>;
│ │ │ │ -
432 public:
│ │ │ │ - │ │ │ │ -
434 SLListIterator<T,A> _iterator)
│ │ │ │ -
435 : beforeIterator_(beforeIterator), iterator_(_iterator)
│ │ │ │ -
436 {}
│ │ │ │ -
437
│ │ │ │ - │ │ │ │ -
439 : beforeIterator_(), iterator_()
│ │ │ │ -
440 {}
│ │ │ │ -
441
│ │ │ │ -
446 inline T& dereference() const
│ │ │ │ -
447 {
│ │ │ │ -
448 return *iterator_;
│ │ │ │ -
449 }
│ │ │ │ -
450
│ │ │ │ -
456 inline bool equals(const SLListConstIterator<T,A>& other) const
│ │ │ │ -
457 {
│ │ │ │ -
458 return iterator_== other;
│ │ │ │ -
459 }
│ │ │ │ -
460
│ │ │ │ -
461
│ │ │ │ -
467 inline bool equals(const SLListIterator<T,A>& other) const
│ │ │ │ -
468 {
│ │ │ │ -
469 return iterator_== other;
│ │ │ │ -
470 }
│ │ │ │ -
471
│ │ │ │ -
472
│ │ │ │ -
478 inline bool equals(const SLListModifyIterator<T,A>& other) const
│ │ │ │ -
479 {
│ │ │ │ -
480 return iterator_== other.iterator_;
│ │ │ │ -
481 }
│ │ │ │ -
482
│ │ │ │ -
486 inline void increment()
│ │ │ │ -
487 {
│ │ │ │ -
488 ++iterator_;
│ │ │ │ -
489 ++beforeIterator_;
│ │ │ │ -
490 }
│ │ │ │ -
491
│ │ │ │ -
505 inline void insert(const T& v)
│ │ │ │ -
506 {
│ │ │ │ -
507 beforeIterator_.insertAfter(v);
│ │ │ │ -
508 ++beforeIterator_;
│ │ │ │ -
509 }
│ │ │ │ -
510
│ │ │ │ -
518 inline void remove()
│ │ │ │ -
519 {
│ │ │ │ -
520 ++iterator_;
│ │ │ │ -
521 beforeIterator_.deleteNext();
│ │ │ │ -
522 }
│ │ │ │ -
523
│ │ │ │ -
524 private:
│ │ │ │ -
526 SLListIterator<T,A> beforeIterator_;
│ │ │ │ -
528 SLListIterator<T,A> iterator_;
│ │ │ │ -
529 };
│ │ │ │ -
530
│ │ │ │ -
531 template<typename T, typename A>
│ │ │ │ -
532 std::ostream& operator<<(std::ostream& os, const SLList<T,A>& sllist)
│ │ │ │ -
533 {
│ │ │ │ -
534 typedef typename SLList<T,A>::const_iterator Iterator;
│ │ │ │ -
535 Iterator end = sllist.end();
│ │ │ │ -
536 Iterator current= sllist.begin();
│ │ │ │ -
537
│ │ │ │ -
538 os << "{ ";
│ │ │ │ -
539
│ │ │ │ -
540 if(current!=end) {
│ │ │ │ -
541 os<<*current<<" ("<<static_cast<const void*>(&(*current))<<")";
│ │ │ │ -
542 ++current;
│ │ │ │ -
543
│ │ │ │ -
544 for(; current != end; ++current)
│ │ │ │ -
545 os<<", "<<*current<<" ("<<static_cast<const void*>(&(*current))<<")";
│ │ │ │ -
546 }
│ │ │ │ -
547 os<<"} ";
│ │ │ │ -
548 return os;
│ │ │ │ -
549 }
│ │ │ │ -
550
│ │ │ │ -
551 template<typename T, class A>
│ │ │ │ -
552 SLList<T,A>::Element::Element(const MemberType& item, Element* next)
│ │ │ │ -
553 : next_(next), item_(item)
│ │ │ │ -
554 {}
│ │ │ │ -
555
│ │ │ │ -
556 template<typename T, class A>
│ │ │ │ - │ │ │ │ -
558 : next_(0), item_()
│ │ │ │ -
559 {}
│ │ │ │ -
560
│ │ │ │ -
561 template<typename T, class A>
│ │ │ │ - │ │ │ │ -
563 {
│ │ │ │ -
564 next_=0;
│ │ │ │ -
565 }
│ │ │ │ -
566
│ │ │ │ -
567 template<typename T, class A>
│ │ │ │ - │ │ │ │ -
569 : beforeHead_(), tail_(&beforeHead_), allocator_(), size_(0)
│ │ │ │ -
570 {
│ │ │ │ -
571 beforeHead_.next_=0;
│ │ │ │ -
572 assert(&beforeHead_==tail_);
│ │ │ │ -
573 assert(tail_->next_==0);
│ │ │ │ -
574 }
│ │ │ │ -
575
│ │ │ │ -
576 template<typename T, class A>
│ │ │ │ - │ │ │ │ -
578 : beforeHead_(), tail_(&beforeHead_), allocator_(), size_(0)
│ │ │ │ -
579 {
│ │ │ │ -
580 copyElements(other);
│ │ │ │ -
581 }
│ │ │ │ -
582
│ │ │ │ -
583 template<typename T, class A>
│ │ │ │ -
584 template<typename T1, class A1>
│ │ │ │ - │ │ │ │ -
586 : beforeHead_(), tail_(&beforeHead_), allocator_(), size_(0)
│ │ │ │ -
587 {
│ │ │ │ -
588 copyElements(other);
│ │ │ │ -
589 }
│ │ │ │ -
590
│ │ │ │ -
591 template<typename T, typename A>
│ │ │ │ -
592 void SLList<T,A>::copyElements(const SLList<T,A>& other)
│ │ │ │ -
593 {
│ │ │ │ -
594 assert(tail_==&beforeHead_);
│ │ │ │ -
595 assert(size_==0);
│ │ │ │ -
596 typedef typename SLList<T,A>::const_iterator Iterator;
│ │ │ │ -
597 Iterator iend = other.end();
│ │ │ │ -
598 for(Iterator element=other.begin(); element != iend; ++element)
│ │ │ │ -
599 push_back(*element);
│ │ │ │ -
600
│ │ │ │ -
601 assert(other.size()==size());
│ │ │ │ -
602 }
│ │ │ │ -
603
│ │ │ │ -
604 template<typename T, class A>
│ │ │ │ - │ │ │ │ -
606 {
│ │ │ │ -
607 clear();
│ │ │ │ -
608 }
│ │ │ │ -
609
│ │ │ │ -
610 template<typename T, class A>
│ │ │ │ -
611 bool SLList<T,A>::operator==(const SLList& other) const
│ │ │ │ -
612 {
│ │ │ │ -
613 if(size()!=other.size())
│ │ │ │ -
614 return false;
│ │ │ │ -
615 for(const_iterator iter=begin(), oiter=other.begin();
│ │ │ │ -
616 iter != end(); ++iter, ++oiter)
│ │ │ │ -
617 if(*iter!=*oiter)
│ │ │ │ -
618 return false;
│ │ │ │ -
619 return true;
│ │ │ │ -
620 }
│ │ │ │ -
621
│ │ │ │ -
622 template<typename T, class A>
│ │ │ │ -
623 bool SLList<T,A>::operator!=(const SLList& other) const
│ │ │ │ -
624 {
│ │ │ │ -
625 if(size()==other.size()) {
│ │ │ │ -
626 for(const_iterator iter=begin(), oiter=other.begin();
│ │ │ │ -
627 iter != end(); ++iter, ++oiter)
│ │ │ │ -
628 if(*iter!=*oiter)
│ │ │ │ -
629 return true;
│ │ │ │ -
630 return false;
│ │ │ │ -
631 }else
│ │ │ │ -
632 return true;
│ │ │ │ -
633 }
│ │ │ │ -
634 template<typename T, class A>
│ │ │ │ - │ │ │ │ -
636 {
│ │ │ │ -
637 clear();
│ │ │ │ -
638 copyElements(other);
│ │ │ │ -
639 return *this;
│ │ │ │ -
640 }
│ │ │ │ -
641
│ │ │ │ -
642 template<typename T, class A>
│ │ │ │ -
643 inline void SLList<T,A>::push_back(const MemberType& item)
│ │ │ │ -
644 {
│ │ │ │ -
645 assert(size_>0 || tail_==&beforeHead_);
│ │ │ │ -
646 tail_->next_ = allocator_.allocate(1);
│ │ │ │ -
647 assert(size_>0 || tail_==&beforeHead_);
│ │ │ │ -
648 tail_ = tail_->next_;
│ │ │ │ -
649 ::new (static_cast<void*>(&(tail_->item_)))T(item);
│ │ │ │ -
650 tail_->next_=0;
│ │ │ │ -
651 assert(tail_->next_==0);
│ │ │ │ -
652 ++size_;
│ │ │ │ -
653 }
│ │ │ │ -
654
│ │ │ │ -
655 template<typename T, class A>
│ │ │ │ -
656 inline void SLList<T,A>::insertAfter(Element* current, const T& item)
│ │ │ │ -
657 {
│ │ │ │ -
658 assert(current);
│ │ │ │ -
659
│ │ │ │ -
660#ifndef NDEBUG
│ │ │ │ -
661 bool changeTail = (current == tail_);
│ │ │ │ -
662#endif
│ │ │ │ -
663
│ │ │ │ -
664 // Save old next element
│ │ │ │ -
665 Element* tmp = current->next_;
│ │ │ │ -
666
│ │ │ │ -
667 assert(!changeTail || !tmp);
│ │ │ │ -
668
│ │ │ │ -
669 // Allocate space
│ │ │ │ -
670 current->next_ = allocator_.allocate(1);
│ │ │ │ -
671
│ │ │ │ -
672 // Use copy constructor to initialize memory
│ │ │ │ -
673 std::allocator_traits<Allocator>::construct(allocator_, current->next_, Element(item,tmp));
│ │ │ │ -
674
│ │ │ │ -
675 //::new(static_cast<void*>(&(current->next_->item_))) T(item);
│ │ │ │ -
676
│ │ │ │ -
677 if(!current->next_->next_) {
│ │ │ │ -
678 // Update tail
│ │ │ │ -
679 assert(changeTail);
│ │ │ │ -
680 tail_ = current->next_;
│ │ │ │ -
681 }
│ │ │ │ -
682 ++size_;
│ │ │ │ -
683 assert(!tail_->next_);
│ │ │ │ -
684 }
│ │ │ │ -
685
│ │ │ │ -
686 template<typename T, class A>
│ │ │ │ -
687 inline void SLList<T,A>::push_front(const MemberType& item)
│ │ │ │ -
688 {
│ │ │ │ -
689 if(tail_ == &beforeHead_) {
│ │ │ │ -
690 // list was empty
│ │ │ │ -
691 beforeHead_.next_ = tail_ = allocator_.allocate(1, 0);
│ │ │ │ -
692 ::new(static_cast<void*>(&beforeHead_.next_->item_))T(item);
│ │ │ │ -
693 beforeHead_.next_->next_=0;
│ │ │ │ -
694 }else{
│ │ │ │ -
695 Element* added = allocator_.allocate(1, 0);
│ │ │ │ -
696 ::new(static_cast<void*>(&added->item_))T(item);
│ │ │ │ -
697 added->next_=beforeHead_.next_;
│ │ │ │ -
698 beforeHead_.next_=added;
│ │ │ │ -
699 }
│ │ │ │ -
700 assert(tail_->next_==0);
│ │ │ │ -
701 ++size_;
│ │ │ │ -
702 }
│ │ │ │ -
703
│ │ │ │ -
704
│ │ │ │ -
705 template<typename T, class A>
│ │ │ │ -
706 inline void SLList<T,A>::deleteNext(Element* current)
│ │ │ │ -
707 {
│ │ │ │ -
708 this->template deleteNext<true>(current);
│ │ │ │ -
709 }
│ │ │ │ -
710
│ │ │ │ -
711 template<typename T, class A>
│ │ │ │ -
712 template<bool watchForTail>
│ │ │ │ -
713 inline void SLList<T,A>::deleteNext(Element* current)
│ │ │ │ -
714 {
│ │ │ │ -
715 assert(current->next_);
│ │ │ │ -
716 Element* next = current->next_;
│ │ │ │ -
717
│ │ │ │ -
718 if(watchForTail)
│ │ │ │ -
719 if(next == tail_) {
│ │ │ │ -
720 // deleting last element changes tail!
│ │ │ │ -
721 tail_ = current;
│ │ │ │ -
722 }
│ │ │ │ -
723
│ │ │ │ -
724 current->next_ = next->next_;
│ │ │ │ -
725 std::allocator_traits<Allocator>::destroy(allocator_, next);
│ │ │ │ -
726 allocator_.deallocate(next, 1);
│ │ │ │ -
727 --size_;
│ │ │ │ -
728 assert(!watchForTail || &beforeHead_ != tail_ || size_==0);
│ │ │ │ -
729 }
│ │ │ │ -
730
│ │ │ │ -
731 template<typename T, class A>
│ │ │ │ - │ │ │ │ -
733 {
│ │ │ │ -
734 deleteNext(&beforeHead_);
│ │ │ │ -
735 }
│ │ │ │ -
736
│ │ │ │ -
737 template<typename T, class A>
│ │ │ │ -
738 inline void SLList<T,A>::clear()
│ │ │ │ -
739 {
│ │ │ │ -
740 while(beforeHead_.next_ ) {
│ │ │ │ -
741 this->template deleteNext<false>(&beforeHead_);
│ │ │ │ -
742 }
│ │ │ │ -
743
│ │ │ │ -
744 assert(size_==0);
│ │ │ │ -
745 // update the tail!
│ │ │ │ -
746 tail_ = &beforeHead_;
│ │ │ │ -
747 }
│ │ │ │ -
748
│ │ │ │ -
749 template<typename T, class A>
│ │ │ │ -
750 inline bool SLList<T,A>::empty() const
│ │ │ │ -
751 {
│ │ │ │ -
752 return (&beforeHead_ == tail_);
│ │ │ │ -
753 }
│ │ │ │ -
754
│ │ │ │ -
755 template<typename T, class A>
│ │ │ │ -
756 inline int SLList<T,A>::size() const
│ │ │ │ -
757 {
│ │ │ │ -
758 return size_;
│ │ │ │ -
759 }
│ │ │ │ -
760
│ │ │ │ -
761 template<typename T, class A>
│ │ │ │ - │ │ │ │ -
763 {
│ │ │ │ -
764 return iterator(beforeHead_.next_, this);
│ │ │ │ -
765 }
│ │ │ │ -
766
│ │ │ │ -
767 template<typename T, class A>
│ │ │ │ - │ │ │ │ -
769 {
│ │ │ │ -
770 return const_iterator(beforeHead_.next_);
│ │ │ │ -
771 }
│ │ │ │ -
772
│ │ │ │ -
773 template<typename T, class A>
│ │ │ │ - │ │ │ │ -
775 {
│ │ │ │ -
776 return iterator();
│ │ │ │ -
777 }
│ │ │ │ -
778
│ │ │ │ -
779 template<typename T, class A>
│ │ │ │ - │ │ │ │ -
781 {
│ │ │ │ -
782 return SLListModifyIterator<T,A>(iterator(tail_, this),iterator());
│ │ │ │ -
783 }
│ │ │ │ -
784
│ │ │ │ -
785
│ │ │ │ -
786 template<typename T, class A>
│ │ │ │ - │ │ │ │ -
788 {
│ │ │ │ -
789 return SLListModifyIterator<T,A>(iterator(&beforeHead_, this),
│ │ │ │ -
790 iterator(beforeHead_.next_, this));
│ │ │ │ -
791 }
│ │ │ │ -
792
│ │ │ │ -
793 template<typename T, class A>
│ │ │ │ - │ │ │ │ -
795 {
│ │ │ │ -
796 return const_iterator();
│ │ │ │ -
797 }
│ │ │ │ -
798
│ │ │ │ -
800}
│ │ │ │ -
801#endif
│ │ │ │ -
This file implements iterator facade classes for writing stl conformant iterators.
│ │ │ │ -
void push_front(const MemberType &item)
Add a new entry to the beginning of the list.
Definition: sllist.hh:687
│ │ │ │ -
bool equals(const SLListConstIterator< T, A > &other) const
Equality test for the iterator facade.
Definition: sllist.hh:406
│ │ │ │ -
void push_back(const MemberType &item)
Add a new entry to the end of the list.
Definition: sllist.hh:643
│ │ │ │ -
ModifyIterator endModify()
Get an iterator capable of deleting and inserting elements.
Definition: sllist.hh:780
│ │ │ │ -
SLListModifyIterator()
Definition: sllist.hh:438
│ │ │ │ -
T & dereference() const
Dereferencing function for the iterator facade.
Definition: sllist.hh:294
│ │ │ │ -
bool operator!=(const SLList &sl) const
Definition: sllist.hh:623
│ │ │ │ -
MemberType item_
The element we hold.
Definition: sllist.hh:212
│ │ │ │ -
SLListConstIterator(typename SLList< T, A >::Element *item)
Definition: sllist.hh:380
│ │ │ │ -
typename std::allocator_traits< A >::template rebind_alloc< Element > Allocator
The allocator to use.
Definition: sllist.hh:64
│ │ │ │ -
void insertAfter(const T &v) const
Insert an element in the underlying list after the current position.
Definition: sllist.hh:342
│ │ │ │ -
SLListIterator< T, A > iterator
The mutable iterator of the list.
Definition: sllist.hh:69
│ │ │ │ -
SLListConstIterator(const SLListModifyIterator< T, A > &other)
Definition: sllist.hh:388
│ │ │ │ -
SLListIterator()
Definition: sllist.hh:282
│ │ │ │ -
bool operator==(const SLList &sl) const
Definition: sllist.hh:611
│ │ │ │ -
void deleteNext() const
Delete the entry after the current position.
Definition: sllist.hh:353
│ │ │ │ -
SLList(const SLList< T, A > &other)
Copy constructor.
Definition: sllist.hh:577
│ │ │ │ -
bool equals(const SLListModifyIterator< T, A > &other) const
Equality test for the iterator facade.
Definition: sllist.hh:324
│ │ │ │ -
T & dereference() const
Dereferencing function for the iterator facade.
Definition: sllist.hh:446
│ │ │ │ -
int size() const
Get the number of elements the list contains.
Definition: sllist.hh:756
│ │ │ │ -
const_iterator begin() const
Get an iterator pointing to the first element in the list.
Definition: sllist.hh:768
│ │ │ │ -
iterator end()
Get an iterator pointing to the end of the list.
Definition: sllist.hh:774
│ │ │ │ -
void clear()
Remove all elements from the list.
Definition: sllist.hh:738
│ │ │ │ -
SLList(const SLList< T1, A1 > &other)
Copy constructor with type conversion.
Definition: sllist.hh:585
│ │ │ │ -
T MemberType
The type we store.
Definition: sllist.hh:59
│ │ │ │ -
bool equals(const SLListModifyIterator< T, A > &other) const
Test whether another iterator is equal.
Definition: sllist.hh:478
│ │ │ │ -
ModifyIterator beginModify()
Get an iterator capable of deleting and inserting elements.
Definition: sllist.hh:787
│ │ │ │ -
SLList< T, A > & operator=(const SLList< T, A > &other)
Assignment operator.
Definition: sllist.hh:635
│ │ │ │ -
SLListConstIterator(const SLListIterator< T, A > &other)
Definition: sllist.hh:384
│ │ │ │ -
SLListConstIterator< T, A > const_iterator
The constant iterator of the list.
Definition: sllist.hh:74
│ │ │ │ -
bool empty() const
Check whether the list is empty.
Definition: sllist.hh:750
│ │ │ │ -
SLListConstIterator()
Definition: sllist.hh:376
│ │ │ │ -
bool equals(const SLListConstIterator< T, A > &other) const
Equality test for the iterator facade.
Definition: sllist.hh:304
│ │ │ │ -
bool equals(const SLListConstIterator< T, A > &other) const
Test whether another iterator is equal.
Definition: sllist.hh:456
│ │ │ │ -
SLListModifyIterator< T, A > ModifyIterator
The type of the iterator capable of deletion and insertion.
Definition: sllist.hh:103
│ │ │ │ -
const_iterator end() const
Get an iterator pointing to the end of the list.
Definition: sllist.hh:794
│ │ │ │ -
SLList()
Constructor.
Definition: sllist.hh:568
│ │ │ │ -
void insert(const T &v)
Insert an element at the current position.
Definition: sllist.hh:505
│ │ │ │ -
SLListIterator(typename SLList< T, A >::Element *item, SLList< T, A > *sllist)
Definition: sllist.hh:277
│ │ │ │ -
SLListModifyIterator(SLListIterator< T, A > beforeIterator, SLListIterator< T, A > _iterator)
Definition: sllist.hh:433
│ │ │ │ -
void pop_front()
Remove the first item in the list.
Definition: sllist.hh:732
│ │ │ │ -
void increment()
Increment function for the iterator facade.
Definition: sllist.hh:332
│ │ │ │ -
SLListIterator(const SLListModifyIterator< T, A > &other)
Definition: sllist.hh:286
│ │ │ │ -
A::size_type size_type
The size type.
Definition: sllist.hh:54
│ │ │ │ -
void remove()
Delete the entry at the current position.
Definition: sllist.hh:518
│ │ │ │ -
const T & dereference() const
Dereferencing function for the facade.
Definition: sllist.hh:396
│ │ │ │ -
Element * next_
The next element in the list.
Definition: sllist.hh:208
│ │ │ │ -
void increment()
Increment function for the iterator facade.
Definition: sllist.hh:486
│ │ │ │ -
void increment()
Increment function for the iterator facade.
Definition: sllist.hh:414
│ │ │ │ -
~SLList()
Destructor.
Definition: sllist.hh:605
│ │ │ │ -
bool equals(const SLListIterator< T, A > &other) const
Test whether another iterator is equal.
Definition: sllist.hh:467
│ │ │ │ -
iterator begin()
Get an iterator pointing to the first element in the list.
Definition: sllist.hh:762
│ │ │ │ -
bool equals(const SLListIterator< T, A > &other) const
Equality test for the iterator facade.
Definition: sllist.hh:314
│ │ │ │ -
std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
Definition: bigunsignedint.hh:278
│ │ │ │ -
EnableIfInterOperable< T1, T2, bool >::type operator==(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for equality.
Definition: iteratorfacades.hh:237
│ │ │ │ -
EnableIfInterOperable< T1, T2, bool >::type operator!=(const ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, V2, R2, D > &rhs)
Checks for inequality.
Definition: iteratorfacades.hh:259
│ │ │ │ +
112
│ │ │ │ +
151 std::string prettyPath(const std::string& p, bool isDirectory);
│ │ │ │ +
152
│ │ │ │ +
154
│ │ │ │ +
160 std::string prettyPath(const std::string& p);
│ │ │ │ +
161
│ │ │ │ +
163
│ │ │ │ +
179 std::string relativePath(const std::string& newbase, const std::string& p);
│ │ │ │ +
180
│ │ │ │ +
182}
│ │ │ │ +
183
│ │ │ │ +
184#endif // DUNE_COMMON_PATH_HH
│ │ │ │ +
std::string processPath(const std::string &p)
sanitize a path for further processing
Definition: path.cc:41
│ │ │ │ +
bool pathIndicatesDirectory(const std::string &p)
check whether the given path indicates that it is a directory
Definition: path.cc:115
│ │ │ │ +
std::string prettyPath(const std::string &p, bool isDirectory)
pretty print path
Definition: path.cc:126
│ │ │ │ +
std::string relativePath(const std::string &newbase, const std::string &p)
compute a relative path between two paths
Definition: path.cc:153
│ │ │ │ +
std::string concatPaths(const std::string &base, const std::string &p)
concatenate two paths
Definition: path.cc:32
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
Base class for stl conformant forward iterators.
Definition: iteratorfacades.hh:141
│ │ │ │ -
A mutable iterator for the SLList.
Definition: sllist.hh:271
│ │ │ │ -
A constant iterator for the SLList.
Definition: sllist.hh:371
│ │ │ │ -
A mutable iterator for the SLList.
Definition: sllist.hh:429
│ │ │ │ -
A single linked list.
Definition: sllist.hh:44
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,806 +4,68 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -sllist.hh │ │ │ │ │ +path.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 (C) 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_SLLIST_HH │ │ │ │ │ - 6#define DUNE_SLLIST_HH │ │ │ │ │ + 5#ifndef DUNE_COMMON_PATH_HH │ │ │ │ │ + 6#define DUNE_COMMON_PATH_HH │ │ │ │ │ 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include "iteratorfacades.hh" │ │ │ │ │ - 11#include │ │ │ │ │ - 12 │ │ │ │ │ - 13namespace Dune │ │ │ │ │ - 14{ │ │ │ │ │ - 26 template │ │ │ │ │ - 27 class SLListIterator; │ │ │ │ │ - 28 │ │ │ │ │ - 29 template │ │ │ │ │ - 30 class SLListConstIterator; │ │ │ │ │ - 31 │ │ │ │ │ - 32 template │ │ │ │ │ - 33 class SLListModifyIterator; │ │ │ │ │ - 34 │ │ │ │ │ - 42 template > │ │ │ │ │ -43 class SLList │ │ │ │ │ - 44 { │ │ │ │ │ - 45 struct Element; │ │ │ │ │ - 46 friend class SLListIterator; │ │ │ │ │ - 47 friend class SLListConstIterator; │ │ │ │ │ - 48 │ │ │ │ │ - 49 public: │ │ │ │ │ - 50 │ │ │ │ │ -54 typedef typename A::size_type size_type; │ │ │ │ │ - 55 │ │ │ │ │ -59 typedef T MemberType; │ │ │ │ │ - 60 │ │ │ │ │ -64 using Allocator = typename std::allocator_traits::template │ │ │ │ │ -rebind_alloc; │ │ │ │ │ - 65 │ │ │ │ │ -69 typedef SLListIterator iterator; │ │ │ │ │ - 70 │ │ │ │ │ -74 typedef SLListConstIterator const_iterator; │ │ │ │ │ - 75 │ │ │ │ │ -79 SLList(); │ │ │ │ │ - 80 │ │ │ │ │ - 84 template │ │ │ │ │ -85 SLList(const SLList& other); │ │ │ │ │ - 86 │ │ │ │ │ -90 SLList(const SLList& other); │ │ │ │ │ - 91 │ │ │ │ │ -97 ~SLList(); │ │ │ │ │ - 98 │ │ │ │ │ -103 typedef SLListModifyIterator ModifyIterator; │ │ │ │ │ - 104 │ │ │ │ │ -108 SLList& operator=(const SLList& other); │ │ │ │ │ - 109 │ │ │ │ │ + 8#include │ │ │ │ │ + 9 │ │ │ │ │ + 10namespace Dune { │ │ │ │ │ + 23 │ │ │ │ │ + 51 std::string concatPaths(const std::string& base, const std::string& p); │ │ │ │ │ + 52 │ │ │ │ │ + 54 │ │ │ │ │ + 98 std::string processPath(const std::string& p); │ │ │ │ │ + 99 │ │ │ │ │ + 101 │ │ │ │ │ + 109 bool pathIndicatesDirectory(const std::string& p); │ │ │ │ │ 110 │ │ │ │ │ -115 inline void push_back(const MemberType& item); │ │ │ │ │ - 116 │ │ │ │ │ -121 inline void push_front(const MemberType& item); │ │ │ │ │ - 122 │ │ │ │ │ -126 inline void pop_front(); │ │ │ │ │ - 127 │ │ │ │ │ -129 inline void clear(); │ │ │ │ │ - 130 │ │ │ │ │ -138 inline iterator begin(); │ │ │ │ │ - 139 │ │ │ │ │ -147 inline const_iterator begin() const; │ │ │ │ │ - 148 │ │ │ │ │ -156 inline ModifyIterator beginModify(); │ │ │ │ │ - 157 │ │ │ │ │ -165 inline ModifyIterator endModify(); │ │ │ │ │ - 166 │ │ │ │ │ -173 inline iterator end(); │ │ │ │ │ - 174 │ │ │ │ │ -181 inline const_iterator end() const; │ │ │ │ │ - 182 │ │ │ │ │ -188 inline bool empty() const; │ │ │ │ │ - 189 │ │ │ │ │ -194 inline int size() const; │ │ │ │ │ - 195 │ │ │ │ │ -196 bool operator==(const SLList& sl) const; │ │ │ │ │ - 197 │ │ │ │ │ - 198 │ │ │ │ │ -199 bool operator!=(const SLList& sl) const; │ │ │ │ │ - 200 │ │ │ │ │ - 201 private: │ │ │ │ │ - 203 struct Element │ │ │ │ │ - 204 { │ │ │ │ │ -208 Element* next_; │ │ │ │ │ -212 MemberType item_; │ │ │ │ │ - 213 │ │ │ │ │ -214 Element(const MemberType& item, Element* next_=0); │ │ │ │ │ - 215 │ │ │ │ │ -216 Element(); │ │ │ │ │ - 217 │ │ │ │ │ -218 ~Element(); │ │ │ │ │ - 219 }; │ │ │ │ │ - 220 │ │ │ │ │ - 225 void deleteNext(Element* current); │ │ │ │ │ - 226 │ │ │ │ │ - 231 void copyElements(const SLList& other); │ │ │ │ │ - 232 │ │ │ │ │ - 240 template │ │ │ │ │ - 241 void deleteNext(Element* current); │ │ │ │ │ - 247 void insertAfter(Element* current, const T& item); │ │ │ │ │ - 248 │ │ │ │ │ - 250 Element beforeHead_; │ │ │ │ │ - 251 │ │ │ │ │ - 257 Element* tail_; │ │ │ │ │ - 258 │ │ │ │ │ - 260 Allocator allocator_; │ │ │ │ │ - 261 │ │ │ │ │ - 263 int size_; │ │ │ │ │ - 264 }; │ │ │ │ │ - 265 │ │ │ │ │ - 269 template │ │ │ │ │ -270 class SLListIterator : public Dune:: │ │ │ │ │ -ForwardIteratorFacade, T, T&, std::size_t> │ │ │ │ │ - 271 { │ │ │ │ │ - 272 friend class SLListConstIterator; │ │ │ │ │ - 273 friend class SLListModifyIterator; │ │ │ │ │ - 274 friend class SLList; │ │ │ │ │ - 275 │ │ │ │ │ - 276 public: │ │ │ │ │ -277 inline SLListIterator(typename SLList::Element* item, │ │ │ │ │ - 278 SLList* sllist) │ │ │ │ │ - 279 : current_(item), list_(sllist) │ │ │ │ │ - 280 {} │ │ │ │ │ - 281 │ │ │ │ │ -282 inline SLListIterator() │ │ │ │ │ - 283 : current_(0), list_(0) │ │ │ │ │ - 284 {} │ │ │ │ │ - 285 │ │ │ │ │ -286 inline SLListIterator(const SLListModifyIterator& other) │ │ │ │ │ - 287 : current_(other.iterator_.current_), list_(other.iterator_.list_) │ │ │ │ │ - 288 {} │ │ │ │ │ - 289 │ │ │ │ │ -294 inline T& dereference() const │ │ │ │ │ - 295 { │ │ │ │ │ - 296 return current_->item_; │ │ │ │ │ - 297 } │ │ │ │ │ - 298 │ │ │ │ │ -304 inline bool equals(const SLListConstIterator& other) const │ │ │ │ │ - 305 { │ │ │ │ │ - 306 return current_==other.current_; │ │ │ │ │ - 307 } │ │ │ │ │ - 308 │ │ │ │ │ -314 inline bool equals(const SLListIterator& other) const │ │ │ │ │ - 315 { │ │ │ │ │ - 316 return current_==other.current_; │ │ │ │ │ - 317 } │ │ │ │ │ - 318 │ │ │ │ │ -324 inline bool equals(const SLListModifyIterator& other) const │ │ │ │ │ - 325 { │ │ │ │ │ - 326 return current_==other.iterator_.current_; │ │ │ │ │ - 327 } │ │ │ │ │ - 328 │ │ │ │ │ -332 inline void increment() │ │ │ │ │ - 333 { │ │ │ │ │ - 334 current_ = current_->next_; │ │ │ │ │ - 335 } │ │ │ │ │ - 336 │ │ │ │ │ -342 inline void insertAfter(const T& v) const │ │ │ │ │ - 343 { │ │ │ │ │ - 344 assert(list_ ); │ │ │ │ │ - 345 list_->insertAfter(current_, v); │ │ │ │ │ - 346 } │ │ │ │ │ - 347 │ │ │ │ │ -353 inline void deleteNext() const │ │ │ │ │ - 354 { │ │ │ │ │ - 355 assert(list_); │ │ │ │ │ - 356 list_->deleteNext(current_); │ │ │ │ │ - 357 } │ │ │ │ │ - 358 │ │ │ │ │ - 359 private: │ │ │ │ │ - 361 typename SLList::Element* current_; │ │ │ │ │ -363 SLList* list_; │ │ │ │ │ - 364 }; │ │ │ │ │ - 365 │ │ │ │ │ - 369 template │ │ │ │ │ -370 class SLListConstIterator : public Dune:: │ │ │ │ │ -ForwardIteratorFacade, const T, const T&, std::size_t> │ │ │ │ │ - 371 { │ │ │ │ │ - 372 friend class SLListIterator; │ │ │ │ │ - 373 friend class SLList; │ │ │ │ │ - 374 │ │ │ │ │ - 375 public: │ │ │ │ │ -376 inline SLListConstIterator() │ │ │ │ │ - 377 : current_(0) │ │ │ │ │ - 378 {} │ │ │ │ │ - 379 │ │ │ │ │ -380 inline SLListConstIterator(typename SLList::Element* item) │ │ │ │ │ - 381 : current_(item) │ │ │ │ │ - 382 {} │ │ │ │ │ - 383 │ │ │ │ │ -384 inline SLListConstIterator(const SLListIterator& other) │ │ │ │ │ - 385 : current_(other.current_) │ │ │ │ │ - 386 {} │ │ │ │ │ - 387 │ │ │ │ │ -388 inline SLListConstIterator(const SLListModifyIterator& other) │ │ │ │ │ - 389 : current_(other.iterator_.current_) │ │ │ │ │ - 390 {} │ │ │ │ │ - 391 │ │ │ │ │ -396 inline const T& dereference() const │ │ │ │ │ - 397 { │ │ │ │ │ - 398 return current_->item_; │ │ │ │ │ - 399 } │ │ │ │ │ - 400 │ │ │ │ │ -406 inline bool equals(const SLListConstIterator& other) const │ │ │ │ │ - 407 { │ │ │ │ │ - 408 return current_==other.current_; │ │ │ │ │ - 409 } │ │ │ │ │ - 410 │ │ │ │ │ -414 inline void increment() │ │ │ │ │ - 415 { │ │ │ │ │ - 416 current_ = current_->next_; │ │ │ │ │ - 417 } │ │ │ │ │ - 418 │ │ │ │ │ - 419 private: │ │ │ │ │ -421 typename SLList::Element* current_; │ │ │ │ │ - 422 }; │ │ │ │ │ - 423 │ │ │ │ │ - 427 template │ │ │ │ │ -428 class SLListModifyIterator : public Dune:: │ │ │ │ │ -ForwardIteratorFacade, T, T&, std::size_t> │ │ │ │ │ - 429 { │ │ │ │ │ - 430 friend class SLListConstIterator; │ │ │ │ │ - 431 friend class SLListIterator; │ │ │ │ │ - 432 public: │ │ │ │ │ -433 inline SLListModifyIterator(SLListIterator beforeIterator, │ │ │ │ │ - 434 SLListIterator _iterator) │ │ │ │ │ - 435 : beforeIterator_(beforeIterator), iterator_(_iterator) │ │ │ │ │ - 436 {} │ │ │ │ │ - 437 │ │ │ │ │ -438 inline SLListModifyIterator() │ │ │ │ │ - 439 : beforeIterator_(), iterator_() │ │ │ │ │ - 440 {} │ │ │ │ │ - 441 │ │ │ │ │ -446 inline T& dereference() const │ │ │ │ │ - 447 { │ │ │ │ │ - 448 return *iterator_; │ │ │ │ │ - 449 } │ │ │ │ │ - 450 │ │ │ │ │ -456 inline bool equals(const SLListConstIterator& other) const │ │ │ │ │ - 457 { │ │ │ │ │ - 458 return iterator_== other; │ │ │ │ │ - 459 } │ │ │ │ │ - 460 │ │ │ │ │ - 461 │ │ │ │ │ -467 inline bool equals(const SLListIterator& other) const │ │ │ │ │ - 468 { │ │ │ │ │ - 469 return iterator_== other; │ │ │ │ │ - 470 } │ │ │ │ │ - 471 │ │ │ │ │ - 472 │ │ │ │ │ -478 inline bool equals(const SLListModifyIterator& other) const │ │ │ │ │ - 479 { │ │ │ │ │ - 480 return iterator_== other.iterator_; │ │ │ │ │ - 481 } │ │ │ │ │ - 482 │ │ │ │ │ -486 inline void increment() │ │ │ │ │ - 487 { │ │ │ │ │ - 488 ++iterator_; │ │ │ │ │ - 489 ++beforeIterator_; │ │ │ │ │ - 490 } │ │ │ │ │ - 491 │ │ │ │ │ -505 inline void insert(const T& v) │ │ │ │ │ - 506 { │ │ │ │ │ - 507 beforeIterator_.insertAfter(v); │ │ │ │ │ - 508 ++beforeIterator_; │ │ │ │ │ - 509 } │ │ │ │ │ - 510 │ │ │ │ │ -518 inline void remove() │ │ │ │ │ - 519 { │ │ │ │ │ - 520 ++iterator_; │ │ │ │ │ - 521 beforeIterator_.deleteNext(); │ │ │ │ │ - 522 } │ │ │ │ │ - 523 │ │ │ │ │ - 524 private: │ │ │ │ │ - 526 SLListIterator beforeIterator_; │ │ │ │ │ - 528 SLListIterator iterator_; │ │ │ │ │ - 529 }; │ │ │ │ │ - 530 │ │ │ │ │ - 531 template │ │ │ │ │ -532 std::ostream& operator<<(std::ostream& os, const SLList& sllist) │ │ │ │ │ - 533 { │ │ │ │ │ - 534 typedef typename SLList::const_iterator Iterator; │ │ │ │ │ - 535 Iterator end = sllist.end(); │ │ │ │ │ - 536 Iterator current= sllist.begin(); │ │ │ │ │ - 537 │ │ │ │ │ - 538 os << "{ "; │ │ │ │ │ - 539 │ │ │ │ │ - 540 if(current!=end) { │ │ │ │ │ - 541 os<<*current<<" ("<(&(*current))<<")"; │ │ │ │ │ - 542 ++current; │ │ │ │ │ - 543 │ │ │ │ │ - 544 for(; current != end; ++current) │ │ │ │ │ - 545 os<<", "<<*current<<" ("<(&(*current))<<")"; │ │ │ │ │ - 546 } │ │ │ │ │ - 547 os<<"} "; │ │ │ │ │ - 548 return os; │ │ │ │ │ - 549 } │ │ │ │ │ - 550 │ │ │ │ │ - 551 template │ │ │ │ │ -552 SLList::Element::Element(const MemberType& item, Element* next) │ │ │ │ │ - 553 : next_(next), item_(item) │ │ │ │ │ - 554 {} │ │ │ │ │ - 555 │ │ │ │ │ - 556 template │ │ │ │ │ -557 SLList::Element::Element() │ │ │ │ │ - 558 : next_(0), item_() │ │ │ │ │ - 559 {} │ │ │ │ │ - 560 │ │ │ │ │ - 561 template │ │ │ │ │ -562 SLList::Element::~Element() │ │ │ │ │ - 563 { │ │ │ │ │ - 564 next_=0; │ │ │ │ │ - 565 } │ │ │ │ │ - 566 │ │ │ │ │ - 567 template │ │ │ │ │ -568 SLList::SLList() │ │ │ │ │ - 569 : beforeHead_(), tail_(&beforeHead_), allocator_(), size_(0) │ │ │ │ │ - 570 { │ │ │ │ │ - 571 beforeHead_.next_=0; │ │ │ │ │ - 572 assert(&beforeHead_==tail_); │ │ │ │ │ - 573 assert(tail_->next_==0); │ │ │ │ │ - 574 } │ │ │ │ │ - 575 │ │ │ │ │ - 576 template │ │ │ │ │ -577 SLList::SLList(const SLList& other) │ │ │ │ │ - 578 : beforeHead_(), tail_(&beforeHead_), allocator_(), size_(0) │ │ │ │ │ - 579 { │ │ │ │ │ - 580 copyElements(other); │ │ │ │ │ - 581 } │ │ │ │ │ - 582 │ │ │ │ │ - 583 template │ │ │ │ │ - 584 template │ │ │ │ │ -585 SLList::SLList(const SLList& other) │ │ │ │ │ - 586 : beforeHead_(), tail_(&beforeHead_), allocator_(), size_(0) │ │ │ │ │ - 587 { │ │ │ │ │ - 588 copyElements(other); │ │ │ │ │ - 589 } │ │ │ │ │ - 590 │ │ │ │ │ - 591 template │ │ │ │ │ - 592 void SLList::copyElements(const SLList& other) │ │ │ │ │ - 593 { │ │ │ │ │ - 594 assert(tail_==&beforeHead_); │ │ │ │ │ - 595 assert(size_==0); │ │ │ │ │ - 596 typedef typename SLList::const_iterator Iterator; │ │ │ │ │ - 597 Iterator iend = other.end(); │ │ │ │ │ - 598 for(Iterator element=other.begin(); element != iend; ++element) │ │ │ │ │ - 599 push_back(*element); │ │ │ │ │ - 600 │ │ │ │ │ - 601 assert(other.size()==size()); │ │ │ │ │ - 602 } │ │ │ │ │ - 603 │ │ │ │ │ - 604 template │ │ │ │ │ -605 SLList::~SLList() │ │ │ │ │ - 606 { │ │ │ │ │ - 607 clear(); │ │ │ │ │ - 608 } │ │ │ │ │ - 609 │ │ │ │ │ - 610 template │ │ │ │ │ -611 bool SLList::operator==(const SLList& other) const │ │ │ │ │ - 612 { │ │ │ │ │ - 613 if(size()!=other.size()) │ │ │ │ │ - 614 return false; │ │ │ │ │ - 615 for(const_iterator iter=begin(), oiter=other.begin(); │ │ │ │ │ - 616 iter != end(); ++iter, ++oiter) │ │ │ │ │ - 617 if(*iter!=*oiter) │ │ │ │ │ - 618 return false; │ │ │ │ │ - 619 return true; │ │ │ │ │ - 620 } │ │ │ │ │ - 621 │ │ │ │ │ - 622 template │ │ │ │ │ -623 bool SLList::operator!=(const SLList& other) const │ │ │ │ │ - 624 { │ │ │ │ │ - 625 if(size()==other.size()) { │ │ │ │ │ - 626 for(const_iterator iter=begin(), oiter=other.begin(); │ │ │ │ │ - 627 iter != end(); ++iter, ++oiter) │ │ │ │ │ - 628 if(*iter!=*oiter) │ │ │ │ │ - 629 return true; │ │ │ │ │ - 630 return false; │ │ │ │ │ - 631 }else │ │ │ │ │ - 632 return true; │ │ │ │ │ - 633 } │ │ │ │ │ - 634 template │ │ │ │ │ -635 SLList& SLList::operator=(const SLList& other) │ │ │ │ │ - 636 { │ │ │ │ │ - 637 clear(); │ │ │ │ │ - 638 copyElements(other); │ │ │ │ │ - 639 return *this; │ │ │ │ │ - 640 } │ │ │ │ │ - 641 │ │ │ │ │ - 642 template │ │ │ │ │ -643 inline void SLList::push_back(const MemberType& item) │ │ │ │ │ - 644 { │ │ │ │ │ - 645 assert(size_>0 || tail_==&beforeHead_); │ │ │ │ │ - 646 tail_->next_ = allocator_.allocate(1); │ │ │ │ │ - 647 assert(size_>0 || tail_==&beforeHead_); │ │ │ │ │ - 648 tail_ = tail_->next_; │ │ │ │ │ - 649 ::new (static_cast(&(tail_->item_)))T(item); │ │ │ │ │ - 650 tail_->next_=0; │ │ │ │ │ - 651 assert(tail_->next_==0); │ │ │ │ │ - 652 ++size_; │ │ │ │ │ - 653 } │ │ │ │ │ - 654 │ │ │ │ │ - 655 template │ │ │ │ │ - 656 inline void SLList::insertAfter(Element* current, const T& item) │ │ │ │ │ - 657 { │ │ │ │ │ - 658 assert(current); │ │ │ │ │ - 659 │ │ │ │ │ - 660#ifndef NDEBUG │ │ │ │ │ - 661 bool changeTail = (current == tail_); │ │ │ │ │ - 662#endif │ │ │ │ │ - 663 │ │ │ │ │ - 664 // Save old next element │ │ │ │ │ - 665 Element* tmp = current->next_; │ │ │ │ │ - 666 │ │ │ │ │ - 667 assert(!changeTail || !tmp); │ │ │ │ │ - 668 │ │ │ │ │ - 669 // Allocate space │ │ │ │ │ - 670 current->next_ = allocator_.allocate(1); │ │ │ │ │ - 671 │ │ │ │ │ - 672 // Use copy constructor to initialize memory │ │ │ │ │ - 673 std::allocator_traits::construct(allocator_, current->next_, │ │ │ │ │ -Element(item,tmp)); │ │ │ │ │ - 674 │ │ │ │ │ - 675 //::new(static_cast(&(current->next_->item_))) T(item); │ │ │ │ │ - 676 │ │ │ │ │ - 677 if(!current->next_->next_) { │ │ │ │ │ - 678 // Update tail │ │ │ │ │ - 679 assert(changeTail); │ │ │ │ │ - 680 tail_ = current->next_; │ │ │ │ │ - 681 } │ │ │ │ │ - 682 ++size_; │ │ │ │ │ - 683 assert(!tail_->next_); │ │ │ │ │ - 684 } │ │ │ │ │ - 685 │ │ │ │ │ - 686 template │ │ │ │ │ -687 inline void SLList::push_front(const MemberType& item) │ │ │ │ │ - 688 { │ │ │ │ │ - 689 if(tail_ == &beforeHead_) { │ │ │ │ │ - 690 // list was empty │ │ │ │ │ - 691 beforeHead_.next_ = tail_ = allocator_.allocate(1, 0); │ │ │ │ │ - 692 ::new(static_cast(&beforeHead_.next_->item_))T(item); │ │ │ │ │ - 693 beforeHead_.next_->next_=0; │ │ │ │ │ - 694 }else{ │ │ │ │ │ - 695 Element* added = allocator_.allocate(1, 0); │ │ │ │ │ - 696 ::new(static_cast(&added->item_))T(item); │ │ │ │ │ - 697 added->next_=beforeHead_.next_; │ │ │ │ │ - 698 beforeHead_.next_=added; │ │ │ │ │ - 699 } │ │ │ │ │ - 700 assert(tail_->next_==0); │ │ │ │ │ - 701 ++size_; │ │ │ │ │ - 702 } │ │ │ │ │ - 703 │ │ │ │ │ - 704 │ │ │ │ │ - 705 template │ │ │ │ │ - 706 inline void SLList::deleteNext(Element* current) │ │ │ │ │ - 707 { │ │ │ │ │ - 708 this->template deleteNext(current); │ │ │ │ │ - 709 } │ │ │ │ │ - 710 │ │ │ │ │ - 711 template │ │ │ │ │ - 712 template │ │ │ │ │ - 713 inline void SLList::deleteNext(Element* current) │ │ │ │ │ - 714 { │ │ │ │ │ - 715 assert(current->next_); │ │ │ │ │ - 716 Element* next = current->next_; │ │ │ │ │ - 717 │ │ │ │ │ - 718 if(watchForTail) │ │ │ │ │ - 719 if(next == tail_) { │ │ │ │ │ - 720 // deleting last element changes tail! │ │ │ │ │ - 721 tail_ = current; │ │ │ │ │ - 722 } │ │ │ │ │ - 723 │ │ │ │ │ - 724 current->next_ = next->next_; │ │ │ │ │ - 725 std::allocator_traits::destroy(allocator_, next); │ │ │ │ │ - 726 allocator_.deallocate(next, 1); │ │ │ │ │ - 727 --size_; │ │ │ │ │ - 728 assert(!watchForTail || &beforeHead_ != tail_ || size_==0); │ │ │ │ │ - 729 } │ │ │ │ │ - 730 │ │ │ │ │ - 731 template │ │ │ │ │ -732 inline void SLList::pop_front() │ │ │ │ │ - 733 { │ │ │ │ │ - 734 deleteNext(&beforeHead_); │ │ │ │ │ - 735 } │ │ │ │ │ - 736 │ │ │ │ │ - 737 template │ │ │ │ │ -738 inline void SLList::clear() │ │ │ │ │ - 739 { │ │ │ │ │ - 740 while(beforeHead_.next_ ) { │ │ │ │ │ - 741 this->template deleteNext(&beforeHead_); │ │ │ │ │ - 742 } │ │ │ │ │ - 743 │ │ │ │ │ - 744 assert(size_==0); │ │ │ │ │ - 745 // update the tail! │ │ │ │ │ - 746 tail_ = &beforeHead_; │ │ │ │ │ - 747 } │ │ │ │ │ - 748 │ │ │ │ │ - 749 template │ │ │ │ │ -750 inline bool SLList::empty() const │ │ │ │ │ - 751 { │ │ │ │ │ - 752 return (&beforeHead_ == tail_); │ │ │ │ │ - 753 } │ │ │ │ │ - 754 │ │ │ │ │ - 755 template │ │ │ │ │ -756 inline int SLList::size() const │ │ │ │ │ - 757 { │ │ │ │ │ - 758 return size_; │ │ │ │ │ - 759 } │ │ │ │ │ - 760 │ │ │ │ │ - 761 template │ │ │ │ │ -762 inline SLListIterator SLList::begin() │ │ │ │ │ - 763 { │ │ │ │ │ - 764 return iterator(beforeHead_.next_, this); │ │ │ │ │ - 765 } │ │ │ │ │ - 766 │ │ │ │ │ - 767 template │ │ │ │ │ -768 inline SLListConstIterator SLList::begin() const │ │ │ │ │ - 769 { │ │ │ │ │ - 770 return const_iterator(beforeHead_.next_); │ │ │ │ │ - 771 } │ │ │ │ │ - 772 │ │ │ │ │ - 773 template │ │ │ │ │ -774 inline SLListIterator SLList::end() │ │ │ │ │ - 775 { │ │ │ │ │ - 776 return iterator(); │ │ │ │ │ - 777 } │ │ │ │ │ - 778 │ │ │ │ │ - 779 template │ │ │ │ │ -780 inline SLListModifyIterator SLList::endModify() │ │ │ │ │ - 781 { │ │ │ │ │ - 782 return SLListModifyIterator(iterator(tail_, this),iterator()); │ │ │ │ │ - 783 } │ │ │ │ │ - 784 │ │ │ │ │ - 785 │ │ │ │ │ - 786 template │ │ │ │ │ -787 inline SLListModifyIterator SLList::beginModify() │ │ │ │ │ - 788 { │ │ │ │ │ - 789 return SLListModifyIterator(iterator(&beforeHead_, this), │ │ │ │ │ - 790 iterator(beforeHead_.next_, this)); │ │ │ │ │ - 791 } │ │ │ │ │ - 792 │ │ │ │ │ - 793 template │ │ │ │ │ -794 inline SLListConstIterator SLList::end() const │ │ │ │ │ - 795 { │ │ │ │ │ - 796 return const_iterator(); │ │ │ │ │ - 797 } │ │ │ │ │ - 798 │ │ │ │ │ - 800} │ │ │ │ │ - 801#endif │ │ │ │ │ -iteratorfacades.hh │ │ │ │ │ -This file implements iterator facade classes for writing stl conformant │ │ │ │ │ -iterators. │ │ │ │ │ -Dune::SLList::push_front │ │ │ │ │ -void push_front(const MemberType &item) │ │ │ │ │ -Add a new entry to the beginning of the list. │ │ │ │ │ -Definition: sllist.hh:687 │ │ │ │ │ -Dune::SLListConstIterator::equals │ │ │ │ │ -bool equals(const SLListConstIterator< T, A > &other) const │ │ │ │ │ -Equality test for the iterator facade. │ │ │ │ │ -Definition: sllist.hh:406 │ │ │ │ │ -Dune::SLList::push_back │ │ │ │ │ -void push_back(const MemberType &item) │ │ │ │ │ -Add a new entry to the end of the list. │ │ │ │ │ -Definition: sllist.hh:643 │ │ │ │ │ -Dune::SLList::endModify │ │ │ │ │ -ModifyIterator endModify() │ │ │ │ │ -Get an iterator capable of deleting and inserting elements. │ │ │ │ │ -Definition: sllist.hh:780 │ │ │ │ │ -Dune::SLListModifyIterator::SLListModifyIterator │ │ │ │ │ -SLListModifyIterator() │ │ │ │ │ -Definition: sllist.hh:438 │ │ │ │ │ -Dune::SLListIterator::dereference │ │ │ │ │ -T & dereference() const │ │ │ │ │ -Dereferencing function for the iterator facade. │ │ │ │ │ -Definition: sllist.hh:294 │ │ │ │ │ -Dune::SLList::operator!= │ │ │ │ │ -bool operator!=(const SLList &sl) const │ │ │ │ │ -Definition: sllist.hh:623 │ │ │ │ │ -Dune::SLList::Element::item_ │ │ │ │ │ -MemberType item_ │ │ │ │ │ -The element we hold. │ │ │ │ │ -Definition: sllist.hh:212 │ │ │ │ │ -Dune::SLListConstIterator::SLListConstIterator │ │ │ │ │ -SLListConstIterator(typename SLList< T, A >::Element *item) │ │ │ │ │ -Definition: sllist.hh:380 │ │ │ │ │ -Dune::SLList::Allocator │ │ │ │ │ -typename std::allocator_traits< A >::template rebind_alloc< Element > Allocator │ │ │ │ │ -The allocator to use. │ │ │ │ │ -Definition: sllist.hh:64 │ │ │ │ │ -Dune::SLListIterator::insertAfter │ │ │ │ │ -void insertAfter(const T &v) const │ │ │ │ │ -Insert an element in the underlying list after the current position. │ │ │ │ │ -Definition: sllist.hh:342 │ │ │ │ │ -Dune::SLList::iterator │ │ │ │ │ -SLListIterator< T, A > iterator │ │ │ │ │ -The mutable iterator of the list. │ │ │ │ │ -Definition: sllist.hh:69 │ │ │ │ │ -Dune::SLListConstIterator::SLListConstIterator │ │ │ │ │ -SLListConstIterator(const SLListModifyIterator< T, A > &other) │ │ │ │ │ -Definition: sllist.hh:388 │ │ │ │ │ -Dune::SLListIterator::SLListIterator │ │ │ │ │ -SLListIterator() │ │ │ │ │ -Definition: sllist.hh:282 │ │ │ │ │ -Dune::SLList::operator== │ │ │ │ │ -bool operator==(const SLList &sl) const │ │ │ │ │ -Definition: sllist.hh:611 │ │ │ │ │ -Dune::SLListIterator::deleteNext │ │ │ │ │ -void deleteNext() const │ │ │ │ │ -Delete the entry after the current position. │ │ │ │ │ -Definition: sllist.hh:353 │ │ │ │ │ -Dune::SLList::SLList │ │ │ │ │ -SLList(const SLList< T, A > &other) │ │ │ │ │ -Copy constructor. │ │ │ │ │ -Definition: sllist.hh:577 │ │ │ │ │ -Dune::SLListIterator::equals │ │ │ │ │ -bool equals(const SLListModifyIterator< T, A > &other) const │ │ │ │ │ -Equality test for the iterator facade. │ │ │ │ │ -Definition: sllist.hh:324 │ │ │ │ │ -Dune::SLListModifyIterator::dereference │ │ │ │ │ -T & dereference() const │ │ │ │ │ -Dereferencing function for the iterator facade. │ │ │ │ │ -Definition: sllist.hh:446 │ │ │ │ │ -Dune::SLList::size │ │ │ │ │ -int size() const │ │ │ │ │ -Get the number of elements the list contains. │ │ │ │ │ -Definition: sllist.hh:756 │ │ │ │ │ -Dune::SLList::begin │ │ │ │ │ -const_iterator begin() const │ │ │ │ │ -Get an iterator pointing to the first element in the list. │ │ │ │ │ -Definition: sllist.hh:768 │ │ │ │ │ -Dune::SLList::end │ │ │ │ │ -iterator end() │ │ │ │ │ -Get an iterator pointing to the end of the list. │ │ │ │ │ -Definition: sllist.hh:774 │ │ │ │ │ -Dune::SLList::clear │ │ │ │ │ -void clear() │ │ │ │ │ -Remove all elements from the list. │ │ │ │ │ -Definition: sllist.hh:738 │ │ │ │ │ -Dune::SLList::SLList │ │ │ │ │ -SLList(const SLList< T1, A1 > &other) │ │ │ │ │ -Copy constructor with type conversion. │ │ │ │ │ -Definition: sllist.hh:585 │ │ │ │ │ -Dune::SLList::MemberType │ │ │ │ │ -T MemberType │ │ │ │ │ -The type we store. │ │ │ │ │ -Definition: sllist.hh:59 │ │ │ │ │ -Dune::SLListModifyIterator::equals │ │ │ │ │ -bool equals(const SLListModifyIterator< T, A > &other) const │ │ │ │ │ -Test whether another iterator is equal. │ │ │ │ │ -Definition: sllist.hh:478 │ │ │ │ │ -Dune::SLList::beginModify │ │ │ │ │ -ModifyIterator beginModify() │ │ │ │ │ -Get an iterator capable of deleting and inserting elements. │ │ │ │ │ -Definition: sllist.hh:787 │ │ │ │ │ -Dune::SLList::operator= │ │ │ │ │ -SLList< T, A > & operator=(const SLList< T, A > &other) │ │ │ │ │ -Assignment operator. │ │ │ │ │ -Definition: sllist.hh:635 │ │ │ │ │ -Dune::SLListConstIterator::SLListConstIterator │ │ │ │ │ -SLListConstIterator(const SLListIterator< T, A > &other) │ │ │ │ │ -Definition: sllist.hh:384 │ │ │ │ │ -Dune::SLList::const_iterator │ │ │ │ │ -SLListConstIterator< T, A > const_iterator │ │ │ │ │ -The constant iterator of the list. │ │ │ │ │ -Definition: sllist.hh:74 │ │ │ │ │ -Dune::SLList::empty │ │ │ │ │ -bool empty() const │ │ │ │ │ -Check whether the list is empty. │ │ │ │ │ -Definition: sllist.hh:750 │ │ │ │ │ -Dune::SLListConstIterator::SLListConstIterator │ │ │ │ │ -SLListConstIterator() │ │ │ │ │ -Definition: sllist.hh:376 │ │ │ │ │ -Dune::SLListIterator::equals │ │ │ │ │ -bool equals(const SLListConstIterator< T, A > &other) const │ │ │ │ │ -Equality test for the iterator facade. │ │ │ │ │ -Definition: sllist.hh:304 │ │ │ │ │ -Dune::SLListModifyIterator::equals │ │ │ │ │ -bool equals(const SLListConstIterator< T, A > &other) const │ │ │ │ │ -Test whether another iterator is equal. │ │ │ │ │ -Definition: sllist.hh:456 │ │ │ │ │ -Dune::SLList::ModifyIterator │ │ │ │ │ -SLListModifyIterator< T, A > ModifyIterator │ │ │ │ │ -The type of the iterator capable of deletion and insertion. │ │ │ │ │ -Definition: sllist.hh:103 │ │ │ │ │ -Dune::SLList::end │ │ │ │ │ -const_iterator end() const │ │ │ │ │ -Get an iterator pointing to the end of the list. │ │ │ │ │ -Definition: sllist.hh:794 │ │ │ │ │ -Dune::SLList::SLList │ │ │ │ │ -SLList() │ │ │ │ │ -Constructor. │ │ │ │ │ -Definition: sllist.hh:568 │ │ │ │ │ -Dune::SLListModifyIterator::insert │ │ │ │ │ -void insert(const T &v) │ │ │ │ │ -Insert an element at the current position. │ │ │ │ │ -Definition: sllist.hh:505 │ │ │ │ │ -Dune::SLListIterator::SLListIterator │ │ │ │ │ -SLListIterator(typename SLList< T, A >::Element *item, SLList< T, A > *sllist) │ │ │ │ │ -Definition: sllist.hh:277 │ │ │ │ │ -Dune::SLListModifyIterator::SLListModifyIterator │ │ │ │ │ -SLListModifyIterator(SLListIterator< T, A > beforeIterator, SLListIterator< T, │ │ │ │ │ -A > _iterator) │ │ │ │ │ -Definition: sllist.hh:433 │ │ │ │ │ -Dune::SLList::pop_front │ │ │ │ │ -void pop_front() │ │ │ │ │ -Remove the first item in the list. │ │ │ │ │ -Definition: sllist.hh:732 │ │ │ │ │ -Dune::SLListIterator::increment │ │ │ │ │ -void increment() │ │ │ │ │ -Increment function for the iterator facade. │ │ │ │ │ -Definition: sllist.hh:332 │ │ │ │ │ -Dune::SLListIterator::SLListIterator │ │ │ │ │ -SLListIterator(const SLListModifyIterator< T, A > &other) │ │ │ │ │ -Definition: sllist.hh:286 │ │ │ │ │ -Dune::SLList::size_type │ │ │ │ │ -A::size_type size_type │ │ │ │ │ -The size type. │ │ │ │ │ -Definition: sllist.hh:54 │ │ │ │ │ -Dune::SLListModifyIterator::remove │ │ │ │ │ -void remove() │ │ │ │ │ -Delete the entry at the current position. │ │ │ │ │ -Definition: sllist.hh:518 │ │ │ │ │ -Dune::SLListConstIterator::dereference │ │ │ │ │ -const T & dereference() const │ │ │ │ │ -Dereferencing function for the facade. │ │ │ │ │ -Definition: sllist.hh:396 │ │ │ │ │ -Dune::SLList::Element::next_ │ │ │ │ │ -Element * next_ │ │ │ │ │ -The next element in the list. │ │ │ │ │ -Definition: sllist.hh:208 │ │ │ │ │ -Dune::SLListModifyIterator::increment │ │ │ │ │ -void increment() │ │ │ │ │ -Increment function for the iterator facade. │ │ │ │ │ -Definition: sllist.hh:486 │ │ │ │ │ -Dune::SLListConstIterator::increment │ │ │ │ │ -void increment() │ │ │ │ │ -Increment function for the iterator facade. │ │ │ │ │ -Definition: sllist.hh:414 │ │ │ │ │ -Dune::SLList::~SLList │ │ │ │ │ -~SLList() │ │ │ │ │ -Destructor. │ │ │ │ │ -Definition: sllist.hh:605 │ │ │ │ │ -Dune::SLListModifyIterator::equals │ │ │ │ │ -bool equals(const SLListIterator< T, A > &other) const │ │ │ │ │ -Test whether another iterator is equal. │ │ │ │ │ -Definition: sllist.hh:467 │ │ │ │ │ -Dune::SLList::begin │ │ │ │ │ -iterator begin() │ │ │ │ │ -Get an iterator pointing to the first element in the list. │ │ │ │ │ -Definition: sllist.hh:762 │ │ │ │ │ -Dune::SLListIterator::equals │ │ │ │ │ -bool equals(const SLListIterator< T, A > &other) const │ │ │ │ │ -Equality test for the iterator facade. │ │ │ │ │ -Definition: sllist.hh:314 │ │ │ │ │ -Dune::operator<< │ │ │ │ │ -std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x) │ │ │ │ │ -Definition: bigunsignedint.hh:278 │ │ │ │ │ -Dune::operator== │ │ │ │ │ -EnableIfInterOperable< T1, T2, bool >::type operator==(const │ │ │ │ │ -ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, │ │ │ │ │ -V2, R2, D > &rhs) │ │ │ │ │ -Checks for equality. │ │ │ │ │ -Definition: iteratorfacades.hh:237 │ │ │ │ │ -Dune::operator!= │ │ │ │ │ -EnableIfInterOperable< T1, T2, bool >::type operator!=(const │ │ │ │ │ -ForwardIteratorFacade< T1, V1, R1, D > &lhs, const ForwardIteratorFacade< T2, │ │ │ │ │ -V2, R2, D > &rhs) │ │ │ │ │ -Checks for inequality. │ │ │ │ │ -Definition: iteratorfacades.hh:259 │ │ │ │ │ + 112 │ │ │ │ │ + 151 std::string prettyPath(const std::string& p, bool isDirectory); │ │ │ │ │ + 152 │ │ │ │ │ + 154 │ │ │ │ │ + 160 std::string prettyPath(const std::string& p); │ │ │ │ │ + 161 │ │ │ │ │ + 163 │ │ │ │ │ + 179 std::string relativePath(const std::string& newbase, const std::string& │ │ │ │ │ +p); │ │ │ │ │ + 180 │ │ │ │ │ + 182} │ │ │ │ │ + 183 │ │ │ │ │ + 184#endif // DUNE_COMMON_PATH_HH │ │ │ │ │ +Dune::processPath │ │ │ │ │ +std::string processPath(const std::string &p) │ │ │ │ │ +sanitize a path for further processing │ │ │ │ │ +Definition: path.cc:41 │ │ │ │ │ +Dune::pathIndicatesDirectory │ │ │ │ │ +bool pathIndicatesDirectory(const std::string &p) │ │ │ │ │ +check whether the given path indicates that it is a directory │ │ │ │ │ +Definition: path.cc:115 │ │ │ │ │ +Dune::prettyPath │ │ │ │ │ +std::string prettyPath(const std::string &p, bool isDirectory) │ │ │ │ │ +pretty print path │ │ │ │ │ +Definition: path.cc:126 │ │ │ │ │ +Dune::relativePath │ │ │ │ │ +std::string relativePath(const std::string &newbase, const std::string &p) │ │ │ │ │ +compute a relative path between two paths │ │ │ │ │ +Definition: path.cc:153 │ │ │ │ │ +Dune::concatPaths │ │ │ │ │ +std::string concatPaths(const std::string &base, const std::string &p) │ │ │ │ │ +concatenate two paths │ │ │ │ │ +Definition: path.cc:32 │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::ForwardIteratorFacade │ │ │ │ │ -Base class for stl conformant forward iterators. │ │ │ │ │ -Definition: iteratorfacades.hh:141 │ │ │ │ │ -Dune::SLListIterator │ │ │ │ │ -A mutable iterator for the SLList. │ │ │ │ │ -Definition: sllist.hh:271 │ │ │ │ │ -Dune::SLListConstIterator │ │ │ │ │ -A constant iterator for the SLList. │ │ │ │ │ -Definition: sllist.hh:371 │ │ │ │ │ -Dune::SLListModifyIterator │ │ │ │ │ -A mutable iterator for the SLList. │ │ │ │ │ -Definition: sllist.hh:429 │ │ │ │ │ -Dune::SLList │ │ │ │ │ -A single linked list. │ │ │ │ │ -Definition: sllist.hh:44 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00179.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: dynvector.hh File Reference │ │ │ │ +dune-common: tuplevector.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -64,55 +64,51 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ -Namespaces
│ │ │ │ -
dynvector.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
tuplevector.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

This file implements a dense vector with a dynamic size. │ │ │ │ +

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

│ │ │ │ -
#include <cmath>
│ │ │ │ -#include <cstddef>
│ │ │ │ -#include <cstdlib>
│ │ │ │ -#include <complex>
│ │ │ │ -#include <cstring>
│ │ │ │ -#include <initializer_list>
│ │ │ │ -#include <limits>
│ │ │ │ +
#include <tuple>
│ │ │ │ #include <utility>
│ │ │ │ -#include "boundschecking.hh"
│ │ │ │ -#include "exceptions.hh"
│ │ │ │ -#include "genericiterator.hh"
│ │ │ │ -#include <vector>
│ │ │ │ -#include "densevector.hh"
│ │ │ │ +#include <dune/common/indices.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/common/std/type_traits.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::DenseMatVecTraits< DynamicVector< K, Allocator > >
 
struct  Dune::FieldTraits< DynamicVector< K, Allocator > >
 
class  Dune::DynamicVector< K, Allocator >
 Construct a vector with a dynamic size. More...
class  Dune::TupleVector< T >
 A class augmenting std::tuple by element access via operator[]. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ +

│ │ │ │ Namespaces

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

│ │ │ │ +Functions

template<class... T>
constexpr auto Dune::makeTupleVector (T &&... t)
 
│ │ │ │

Detailed Description

│ │ │ │ -

This file implements a dense vector with a dynamic size.

│ │ │ │ +

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

│ │ │ │ +
Author
Carsten Gräser
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -us-ascii │ │ │ │ │ +utf-8 │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,42 +4,35 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Classes | Namespaces │ │ │ │ │ -dynvector.hh File Reference │ │ │ │ │ -Common » Dense_Matrix_and_Vector_Template_Library │ │ │ │ │ -This file implements a dense vector with a dynamic size. More... │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Functions │ │ │ │ │ +tuplevector.hh File Reference │ │ │ │ │ +Provides the TupleVector class that augments std::tuple by operator[]. More... │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include "boundschecking.hh" │ │ │ │ │ -#include "exceptions.hh" │ │ │ │ │ -#include "genericiterator.hh" │ │ │ │ │ -#include │ │ │ │ │ -#include "densevector.hh" │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -struct  Dune::DenseMatVecTraits<_DynamicVector<_K,_Allocator_>_> │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::FieldTraits<_DynamicVector<_K,_Allocator_>_> │ │ │ │ │ -  │ │ │ │ │ - class  Dune::DynamicVector<_K,_Allocator_> │ │ │ │ │ -  Construct a vector with a dynamic size. More... │ │ │ │ │ +class  Dune::TupleVector<_T_> │ │ │ │ │ +  A class augmenting std::tuple by element access via operator[]. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +constexpr auto Dune::makeTupleVector (T &&... t) │ │ │ │ │ +  │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -This file implements a dense vector with a dynamic size. │ │ │ │ │ +Provides the TupleVector class that augments std::tuple by operator[]. │ │ │ │ │ + Author │ │ │ │ │ + Carsten Gräser │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00179_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: dynvector.hh Source File │ │ │ │ +dune-common: tuplevector.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,229 +62,106 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
dynvector.hh
│ │ │ │ +
tuplevector.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 (C) 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_DYNVECTOR_HH
│ │ │ │ -
6#define DUNE_DYNVECTOR_HH
│ │ │ │ +
5#ifndef DUNE_COMMON_TUPLEVECTOR_HH
│ │ │ │ +
6#define DUNE_COMMON_TUPLEVECTOR_HH
│ │ │ │
7
│ │ │ │ -
8#include <cmath>
│ │ │ │ -
9#include <cstddef>
│ │ │ │ -
10#include <cstdlib>
│ │ │ │ -
11#include <complex>
│ │ │ │ -
12#include <cstring>
│ │ │ │ -
13#include <initializer_list>
│ │ │ │ -
14#include <limits>
│ │ │ │ -
15#include <utility>
│ │ │ │ +
8#include <tuple>
│ │ │ │ +
9#include <utility>
│ │ │ │ +
10
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
14
│ │ │ │ +
15
│ │ │ │
16
│ │ │ │ -
17#include "boundschecking.hh"
│ │ │ │ -
18#include "exceptions.hh"
│ │ │ │ -
19#include "genericiterator.hh"
│ │ │ │ -
20
│ │ │ │ -
21#include <vector>
│ │ │ │ -
22#include "densevector.hh"
│ │ │ │ -
23
│ │ │ │ -
24namespace Dune {
│ │ │ │ +
23namespace Dune
│ │ │ │ +
24{
│ │ │ │
25
│ │ │ │ -
34 template< class K, class Allocator > class DynamicVector;
│ │ │ │ -
35 template< class K, class Allocator >
│ │ │ │ -
36 struct DenseMatVecTraits< DynamicVector< K, Allocator > >
│ │ │ │ -
37 {
│ │ │ │ - │ │ │ │ -
39 typedef std::vector< K, Allocator > container_type;
│ │ │ │ -
40 typedef K value_type;
│ │ │ │ -
41 typedef typename container_type::size_type size_type;
│ │ │ │ -
42 };
│ │ │ │ +
26
│ │ │ │ +
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...>;
│ │ │ │
43
│ │ │ │ -
44 template< class K, class Allocator >
│ │ │ │ -
45 struct FieldTraits< DynamicVector< K, Allocator > >
│ │ │ │ -
46 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
49 };
│ │ │ │ -
50
│ │ │ │ -
57 template< class K, class Allocator = std::allocator< K > >
│ │ │ │ -
58 class DynamicVector : public DenseVector< DynamicVector< K, Allocator > >
│ │ │ │ -
59 {
│ │ │ │ -
60 std::vector< K, Allocator > _data;
│ │ │ │ -
61
│ │ │ │ - │ │ │ │ -
63 public:
│ │ │ │ -
64 typedef typename Base::size_type size_type;
│ │ │ │ -
65 typedef typename Base::value_type value_type;
│ │ │ │ -
66
│ │ │ │ -
67 typedef std::vector< K, Allocator > container_type;
│ │ │ │ -
68
│ │ │ │ -
69 typedef Allocator allocator_type;
│ │ │ │ -
70
│ │ │ │ - │ │ │ │ -
73 _data( a )
│ │ │ │ -
74 {}
│ │ │ │ -
75
│ │ │ │ - │ │ │ │ -
77 _data( n, value_type(), a )
│ │ │ │ -
78 {}
│ │ │ │ +
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 {}
│ │ │ │ +
58
│ │ │ │ +
61 constexpr TupleVector()
│ │ │ │ +
62 {}
│ │ │ │ +
63
│ │ │ │ +
66 template<std::size_t i>
│ │ │ │ +
67 constexpr decltype(auto) operator[](const Dune::index_constant<i>&) const
│ │ │ │ +
68 {
│ │ │ │ +
69 return std::get<i>(*this);
│ │ │ │ +
70 }
│ │ │ │ +
71
│ │ │ │ +
74 template<std::size_t i>
│ │ │ │ +
75 decltype(auto) operator[](const Dune::index_constant<i>&)
│ │ │ │ +
76 {
│ │ │ │ +
77 return std::get<i>(*this);
│ │ │ │ +
78 }
│ │ │ │
79
│ │ │ │ - │ │ │ │ -
82 _data( n, c, a )
│ │ │ │ -
83 {}
│ │ │ │ -
84
│ │ │ │ -
86 DynamicVector (std::initializer_list<K> const &l) :
│ │ │ │ -
87 _data(l)
│ │ │ │ -
88 {}
│ │ │ │ -
89
│ │ │ │ - │ │ │ │ -
92 Base(), _data(x._data)
│ │ │ │ -
93 {}
│ │ │ │ -
94
│ │ │ │ - │ │ │ │ -
97 _data(std::move(x._data))
│ │ │ │ -
98 {}
│ │ │ │ -
99
│ │ │ │ -
100 template< class T >
│ │ │ │ - │ │ │ │ -
102 _data(x.begin(), x.end(), x.get_allocator())
│ │ │ │ -
103 {}
│ │ │ │ -
104
│ │ │ │ -
106 template< class X >
│ │ │ │ - │ │ │ │ -
108 _data(a)
│ │ │ │ -
109 {
│ │ │ │ -
110 const size_type n = x.size();
│ │ │ │ -
111 _data.reserve(n);
│ │ │ │ -
112 for( size_type i =0; i<n ;++i)
│ │ │ │ -
113 _data.push_back( x[ i ] );
│ │ │ │ -
114 }
│ │ │ │ -
115
│ │ │ │ -
116 using Base::operator=;
│ │ │ │ -
117
│ │ │ │ - │ │ │ │ -
120 {
│ │ │ │ -
121 _data = other._data;
│ │ │ │ -
122 return *this;
│ │ │ │ -
123 }
│ │ │ │ -
124
│ │ │ │ - │ │ │ │ -
127 {
│ │ │ │ -
128 _data = std::move(other._data);
│ │ │ │ -
129 return *this;
│ │ │ │ -
130 }
│ │ │ │ -
131
│ │ │ │ -
132 //==== forward some methods of std::vector
│ │ │ │ - │ │ │ │ -
138 {
│ │ │ │ -
139 return _data.capacity();
│ │ │ │ -
140 }
│ │ │ │ - │ │ │ │ -
142 {
│ │ │ │ -
143 _data.resize(n,c);
│ │ │ │ -
144 }
│ │ │ │ - │ │ │ │ -
146 {
│ │ │ │ -
147 _data.reserve(n);
│ │ │ │ -
148 }
│ │ │ │ -
149
│ │ │ │ -
150 //==== make this thing a vector
│ │ │ │ -
151 size_type size() const { return _data.size(); }
│ │ │ │ - │ │ │ │ - │ │ │ │ -
154 return _data[i];
│ │ │ │ -
155 }
│ │ │ │ -
156 const K & operator[](size_type i) const {
│ │ │ │ - │ │ │ │ -
158 return _data[i];
│ │ │ │ -
159 }
│ │ │ │ -
160
│ │ │ │ -
162 K* data() noexcept
│ │ │ │ -
163 {
│ │ │ │ -
164 return _data.data();
│ │ │ │ -
165 }
│ │ │ │ -
166
│ │ │ │ -
168 const K* data() const noexcept
│ │ │ │ -
169 {
│ │ │ │ -
170 return _data.data();
│ │ │ │ -
171 }
│ │ │ │ -
172
│ │ │ │ -
173 const container_type &container () const { return _data; }
│ │ │ │ -
174 container_type &container () { return _data; }
│ │ │ │ -
175 };
│ │ │ │ -
176
│ │ │ │ -
188 template< class K, class Allocator >
│ │ │ │ -
189 inline std::istream &operator>> ( std::istream &in,
│ │ │ │ - │ │ │ │ -
191 {
│ │ │ │ - │ │ │ │ -
193 for( typename DynamicVector< K, Allocator >::size_type i = 0; i < w.size(); ++i )
│ │ │ │ -
194 in >> w[ i ];
│ │ │ │ -
195 if(in)
│ │ │ │ -
196 v = std::move(w);
│ │ │ │ -
197 return in;
│ │ │ │ -
198 }
│ │ │ │ -
199
│ │ │ │ -
202} // end namespace
│ │ │ │ -
203
│ │ │ │ -
204#endif
│ │ │ │ -
Macro for wrapping boundary checks.
│ │ │ │ -
Implements the dense vector interface, with an exchangeable storage class.
│ │ │ │ -
A few common exception classes.
│ │ │ │ -
Implements a generic iterator class for writing stl conformant iterators.
│ │ │ │ -
Stream & operator>>(Stream &stream, std::tuple< Ts... > &t)
Read a std::tuple.
Definition: streamoperators.hh:43
│ │ │ │ -
#define DUNE_ASSERT_BOUNDS(cond)
If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do nothing.
Definition: boundschecking.hh:30
│ │ │ │ +
81 static constexpr std::size_t size()
│ │ │ │ +
82 {
│ │ │ │ +
83 return std::tuple_size<Base>::value;
│ │ │ │ +
84 }
│ │ │ │ +
85};
│ │ │ │ +
86
│ │ │ │ +
87
│ │ │ │ +
88
│ │ │ │ +
89template<class... T>
│ │ │ │ +
90constexpr auto makeTupleVector(T&&... t)
│ │ │ │ +
91{
│ │ │ │ +
92 // The std::decay_t<T> is is a slight simplification,
│ │ │ │ +
93 // because std::reference_wrapper needs special care.
│ │ │ │ +
94 return TupleVector<std::decay_t<T>...>(std::forward<T>(t)...);
│ │ │ │ +
95}
│ │ │ │ +
96
│ │ │ │ +
97
│ │ │ │ +
98
│ │ │ │ +
99} // namespace Dune
│ │ │ │ +
100
│ │ │ │ +
101#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:30
│ │ │ │ +
typename detected_or< nonesuch, Op, Args... >::value_t is_detected
Detects whether Op<Args...> is valid.
Definition: type_traits.hh:141
│ │ │ │
STL namespace.
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
Interface for a class of dense vectors over a given field.
Definition: densevector.hh:229
│ │ │ │ -
Traits::value_type value_type
export the type representing the field
Definition: densevector.hh:250
│ │ │ │ -
Iterator begin()
begin iterator
Definition: densevector.hh:347
│ │ │ │ -
size_type size() const
size method
Definition: densevector.hh:336
│ │ │ │ -
Iterator end()
end iterator
Definition: densevector.hh:353
│ │ │ │ -
Traits::size_type size_type
The type used for the index access and size operation.
Definition: densevector.hh:259
│ │ │ │ -
Construct a vector with a dynamic size.
Definition: dynvector.hh:59
│ │ │ │ -
void resize(size_type n, value_type c=value_type())
Definition: dynvector.hh:141
│ │ │ │ -
DynamicVector(const DynamicVector &x)
Constructor making vector with identical coordinates.
Definition: dynvector.hh:91
│ │ │ │ -
Base::size_type size_type
Definition: dynvector.hh:64
│ │ │ │ -
std::vector< K, Allocator > container_type
Definition: dynvector.hh:67
│ │ │ │ -
size_type size() const
Definition: dynvector.hh:151
│ │ │ │ -
K & operator[](size_type i)
Definition: dynvector.hh:152
│ │ │ │ -
container_type & container()
Definition: dynvector.hh:174
│ │ │ │ -
Base::value_type value_type
Definition: dynvector.hh:65
│ │ │ │ -
const K * data() const noexcept
return pointer to underlying array
Definition: dynvector.hh:168
│ │ │ │ -
Allocator allocator_type
Definition: dynvector.hh:69
│ │ │ │ -
DynamicVector(const allocator_type &a=allocator_type())
Constructor making uninitialized vector.
Definition: dynvector.hh:72
│ │ │ │ -
DynamicVector(DynamicVector &&x)
Move constructor.
Definition: dynvector.hh:96
│ │ │ │ -
K * data() noexcept
return pointer to underlying array
Definition: dynvector.hh:162
│ │ │ │ -
DynamicVector & operator=(DynamicVector &&other)
Move assignment operator.
Definition: dynvector.hh:126
│ │ │ │ -
DynamicVector & operator=(const DynamicVector &other)
Copy assignment operator.
Definition: dynvector.hh:119
│ │ │ │ -
size_type capacity() const
Number of elements for which memory has been allocated.
Definition: dynvector.hh:137
│ │ │ │ -
const container_type & container() const
Definition: dynvector.hh:173
│ │ │ │ -
DynamicVector(size_type n, const allocator_type &a=allocator_type())
Definition: dynvector.hh:76
│ │ │ │ -
DynamicVector(std::initializer_list< K > const &l)
Construct from a std::initializer_list.
Definition: dynvector.hh:86
│ │ │ │ -
DynamicVector(const DynamicVector< T, Allocator > &x)
Definition: dynvector.hh:101
│ │ │ │ -
const K & operator[](size_type i) const
Definition: dynvector.hh:156
│ │ │ │ -
void reserve(size_type n)
Definition: dynvector.hh:145
│ │ │ │ -
DynamicVector(size_type n, value_type c, const allocator_type &a=allocator_type())
Constructor making vector with identical coordinates.
Definition: dynvector.hh:81
│ │ │ │ -
DynamicVector(const DenseVector< X > &x, const allocator_type &a=allocator_type())
Copy constructor from another DenseVector.
Definition: dynvector.hh:107
│ │ │ │ - │ │ │ │ -
DynamicVector< K, Allocator > derived_type
Definition: dynvector.hh:38
│ │ │ │ -
std::vector< K, Allocator > container_type
Definition: dynvector.hh:39
│ │ │ │ -
container_type::size_type size_type
Definition: dynvector.hh:41
│ │ │ │ -
FieldTraits< K >::real_type real_type
Definition: dynvector.hh:48
│ │ │ │ -
FieldTraits< K >::field_type field_type
Definition: dynvector.hh:47
│ │ │ │ -
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
│ │ │ │ +
constexpr auto makeTupleVector(T &&... t)
Definition: tuplevector.hh:90
│ │ │ │ +
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:81
│ │ │ │ +
constexpr TupleVector(TT &&... tt)
Construct from a set of arguments.
Definition: tuplevector.hh:55
│ │ │ │ +
constexpr TupleVector()
Default constructor.
Definition: tuplevector.hh:61
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,343 +4,126 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -dynvector.hh │ │ │ │ │ +tuplevector.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 (C) 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_DYNVECTOR_HH │ │ │ │ │ - 6#define DUNE_DYNVECTOR_HH │ │ │ │ │ + 5#ifndef DUNE_COMMON_TUPLEVECTOR_HH │ │ │ │ │ + 6#define DUNE_COMMON_TUPLEVECTOR_HH │ │ │ │ │ 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ + 8#include │ │ │ │ │ + 9#include │ │ │ │ │ + 10 │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14 │ │ │ │ │ + 15 │ │ │ │ │ 16 │ │ │ │ │ - 17#include "boundschecking.hh" │ │ │ │ │ - 18#include "exceptions.hh" │ │ │ │ │ - 19#include "genericiterator.hh" │ │ │ │ │ - 20 │ │ │ │ │ - 21#include │ │ │ │ │ - 22#include "densevector.hh" │ │ │ │ │ - 23 │ │ │ │ │ - 24namespace Dune { │ │ │ │ │ + 23namespace Dune │ │ │ │ │ + 24{ │ │ │ │ │ 25 │ │ │ │ │ - 34 template< class K, class Allocator > class DynamicVector; │ │ │ │ │ - 35 template< class K, class Allocator > │ │ │ │ │ -36 struct DenseMatVecTraits< DynamicVector< K, Allocator > > │ │ │ │ │ - 37 { │ │ │ │ │ -38 typedef DynamicVector<_K,_Allocator_> derived_type; │ │ │ │ │ -39 typedef std::vector< K, Allocator > container_type; │ │ │ │ │ -40 typedef K value_type; │ │ │ │ │ -41 typedef typename container_type::size_type size_type; │ │ │ │ │ - 42 }; │ │ │ │ │ + 26 │ │ │ │ │ + 27 │ │ │ │ │ + 33template │ │ │ │ │ +34class TupleVector : 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 = Dune::Std:: │ │ │ │ │ +is_detected; │ │ │ │ │ 43 │ │ │ │ │ - 44 template< class K, class Allocator > │ │ │ │ │ -45 struct FieldTraits< DynamicVector< K, Allocator > > │ │ │ │ │ - 46 { │ │ │ │ │ -47 typedef typename FieldTraits<_K_>::field_type field_type; │ │ │ │ │ -48 typedef typename FieldTraits<_K_>::real_type real_type; │ │ │ │ │ - 49 }; │ │ │ │ │ - 50 │ │ │ │ │ - 57 template< class K, class Allocator = std::allocator< K > > │ │ │ │ │ -58 class DynamicVector : public DenseVector< DynamicVector< K, Allocator > > │ │ │ │ │ - 59 { │ │ │ │ │ - 60 std::vector< K, Allocator > _data; │ │ │ │ │ - 61 │ │ │ │ │ - 62 typedef DenseVector<_DynamicVector<_K,_Allocator_> > Base; │ │ │ │ │ - 63 public: │ │ │ │ │ -64 typedef typename Base::size_type size_type; │ │ │ │ │ -65 typedef typename Base::value_type value_type; │ │ │ │ │ - 66 │ │ │ │ │ -67 typedef std::vector< K, Allocator > container_type; │ │ │ │ │ - 68 │ │ │ │ │ -69 typedef Allocator allocator_type; │ │ │ │ │ - 70 │ │ │ │ │ -72 explicit DynamicVector(const allocator_type &a = allocator_type() ) : │ │ │ │ │ - 73 _data( a ) │ │ │ │ │ - 74 {} │ │ │ │ │ - 75 │ │ │ │ │ -76 explicit DynamicVector(size_type n, const allocator_type &a = allocator_type │ │ │ │ │ -() ) : │ │ │ │ │ - 77 _data( n, value_type(), a ) │ │ │ │ │ - 78 {} │ │ │ │ │ + 44 │ │ │ │ │ + 45public: │ │ │ │ │ + 46 │ │ │ │ │ + 53 template::value, int> = 0> │ │ │ │ │ +55 constexpr TupleVector(TT&&... tt) : │ │ │ │ │ + 56 Base(std::forward(tt)...) │ │ │ │ │ + 57 {} │ │ │ │ │ + 58 │ │ │ │ │ +61 constexpr TupleVector() │ │ │ │ │ + 62 {} │ │ │ │ │ + 63 │ │ │ │ │ + 66 template │ │ │ │ │ +67 constexpr decltype(auto) operator[](const Dune::index_constant&) const │ │ │ │ │ + 68 { │ │ │ │ │ + 69 return std::get(*this); │ │ │ │ │ + 70 } │ │ │ │ │ + 71 │ │ │ │ │ + 74 template │ │ │ │ │ +75 decltype(auto) operator[](const Dune::index_constant&) │ │ │ │ │ + 76 { │ │ │ │ │ + 77 return std::get(*this); │ │ │ │ │ + 78 } │ │ │ │ │ 79 │ │ │ │ │ -81 DynamicVector( size_type n, value_type c, const allocator_type &a = │ │ │ │ │ -allocator_type() ) : │ │ │ │ │ - 82 _data( n, c, a ) │ │ │ │ │ - 83 {} │ │ │ │ │ - 84 │ │ │ │ │ -86 DynamicVector (std::initializer_list const &l) : │ │ │ │ │ - 87 _data(l) │ │ │ │ │ - 88 {} │ │ │ │ │ - 89 │ │ │ │ │ -91 DynamicVector(const DynamicVector & x) : │ │ │ │ │ - 92 Base(), _data(x._data) │ │ │ │ │ - 93 {} │ │ │ │ │ - 94 │ │ │ │ │ -96 DynamicVector(DynamicVector && x) : │ │ │ │ │ - 97 _data(std::move(x._data)) │ │ │ │ │ - 98 {} │ │ │ │ │ - 99 │ │ │ │ │ - 100 template< class T > │ │ │ │ │ -101 DynamicVector(const DynamicVector<_T,_Allocator_> & x) : │ │ │ │ │ - 102 _data(x.begin(), x.end(), x.get_allocator()) │ │ │ │ │ - 103 {} │ │ │ │ │ - 104 │ │ │ │ │ - 106 template< class X > │ │ │ │ │ -107 DynamicVector(const DenseVector<_X_> & x, const allocator_type &a = │ │ │ │ │ -allocator_type() ) : │ │ │ │ │ - 108 _data(a) │ │ │ │ │ - 109 { │ │ │ │ │ - 110 const size_type n = x.size(); │ │ │ │ │ - 111 _data.reserve(n); │ │ │ │ │ - 112 for( size_type i =0; i │ │ │ │ │ -189 inline std::istream &operator>>( std::istream &in, │ │ │ │ │ - 190 DynamicVector<_K,_Allocator_> &v ) │ │ │ │ │ - 191 { │ │ │ │ │ - 192 DynamicVector<_K,_Allocator_> w(v); │ │ │ │ │ - 193 for( typename DynamicVector<_K,_Allocator_>::size_type i = 0; i < w.size │ │ │ │ │ -(); ++i ) │ │ │ │ │ - 194 in >> w[ i ]; │ │ │ │ │ - 195 if(in) │ │ │ │ │ - 196 v = std::move(w); │ │ │ │ │ - 197 return in; │ │ │ │ │ - 198 } │ │ │ │ │ - 199 │ │ │ │ │ - 202} // end namespace │ │ │ │ │ - 203 │ │ │ │ │ - 204#endif │ │ │ │ │ -boundschecking.hh │ │ │ │ │ -Macro for wrapping boundary checks. │ │ │ │ │ -densevector.hh │ │ │ │ │ -Implements the dense vector interface, with an exchangeable storage class. │ │ │ │ │ -exceptions.hh │ │ │ │ │ -A few common exception classes. │ │ │ │ │ -genericiterator.hh │ │ │ │ │ -Implements a generic iterator class for writing stl conformant iterators. │ │ │ │ │ -Dune::operator>> │ │ │ │ │ -Stream & operator>>(Stream &stream, std::tuple< Ts... > &t) │ │ │ │ │ -Read a std::tuple. │ │ │ │ │ -Definition: streamoperators.hh:43 │ │ │ │ │ -DUNE_ASSERT_BOUNDS │ │ │ │ │ -#define DUNE_ASSERT_BOUNDS(cond) │ │ │ │ │ -If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do │ │ │ │ │ -nothing. │ │ │ │ │ -Definition: boundschecking.hh:30 │ │ │ │ │ +81 static constexpr std::size_t size() │ │ │ │ │ + 82 { │ │ │ │ │ + 83 return std::tuple_size::value; │ │ │ │ │ + 84 } │ │ │ │ │ + 85}; │ │ │ │ │ + 86 │ │ │ │ │ + 87 │ │ │ │ │ + 88 │ │ │ │ │ + 89template │ │ │ │ │ +90constexpr auto makeTupleVector(T&&... t) │ │ │ │ │ + 91{ │ │ │ │ │ + 92 // The std::decay_t is is a slight simplification, │ │ │ │ │ + 93 // because std::reference_wrapper needs special care. │ │ │ │ │ + 94 return TupleVector...>(std::forward(t)...); │ │ │ │ │ + 95} │ │ │ │ │ + 96 │ │ │ │ │ + 97 │ │ │ │ │ + 98 │ │ │ │ │ + 99} // namespace Dune │ │ │ │ │ + 100 │ │ │ │ │ + 101#endif // DUNE_COMMON_TUPLEVECTOR_HH │ │ │ │ │ +typetraits.hh │ │ │ │ │ +Traits for type conversions and type information. │ │ │ │ │ +type_traits.hh │ │ │ │ │ +indices.hh │ │ │ │ │ +Dune::index_constant │ │ │ │ │ +std::integral_constant< std::size_t, i > index_constant │ │ │ │ │ +An index constant with value i. │ │ │ │ │ +Definition: indices.hh:30 │ │ │ │ │ +Dune::Std::is_detected │ │ │ │ │ +typename detected_or< nonesuch, Op, Args... >::value_t is_detected │ │ │ │ │ +Detects whether Op is valid. │ │ │ │ │ +Definition: type_traits.hh:141 │ │ │ │ │ std │ │ │ │ │ STL namespace. │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::DenseVector │ │ │ │ │ -Interface for a class of dense vectors over a given field. │ │ │ │ │ -Definition: densevector.hh:229 │ │ │ │ │ -Dune::DenseVector::value_type │ │ │ │ │ -Traits::value_type value_type │ │ │ │ │ -export the type representing the field │ │ │ │ │ -Definition: densevector.hh:250 │ │ │ │ │ -Dune::DenseVector<_DynamicVector<_K,_std::allocator<_K_>_>_>::begin │ │ │ │ │ -Iterator begin() │ │ │ │ │ -begin iterator │ │ │ │ │ -Definition: densevector.hh:347 │ │ │ │ │ -Dune::DenseVector::size │ │ │ │ │ -size_type size() const │ │ │ │ │ -size method │ │ │ │ │ -Definition: densevector.hh:336 │ │ │ │ │ -Dune::DenseVector<_DynamicVector<_K,_std::allocator<_K_>_>_>::end │ │ │ │ │ -Iterator end() │ │ │ │ │ -end iterator │ │ │ │ │ -Definition: densevector.hh:353 │ │ │ │ │ -Dune::DenseVector::size_type │ │ │ │ │ -Traits::size_type size_type │ │ │ │ │ -The type used for the index access and size operation. │ │ │ │ │ -Definition: densevector.hh:259 │ │ │ │ │ -Dune::DynamicVector │ │ │ │ │ -Construct a vector with a dynamic size. │ │ │ │ │ -Definition: dynvector.hh:59 │ │ │ │ │ -Dune::DynamicVector::resize │ │ │ │ │ -void resize(size_type n, value_type c=value_type()) │ │ │ │ │ -Definition: dynvector.hh:141 │ │ │ │ │ -Dune::DynamicVector::DynamicVector │ │ │ │ │ -DynamicVector(const DynamicVector &x) │ │ │ │ │ -Constructor making vector with identical coordinates. │ │ │ │ │ -Definition: dynvector.hh:91 │ │ │ │ │ -Dune::DynamicVector::size_type │ │ │ │ │ -Base::size_type size_type │ │ │ │ │ -Definition: dynvector.hh:64 │ │ │ │ │ -Dune::DynamicVector::container_type │ │ │ │ │ -std::vector< K, Allocator > container_type │ │ │ │ │ -Definition: dynvector.hh:67 │ │ │ │ │ -Dune::DynamicVector::size │ │ │ │ │ -size_type size() const │ │ │ │ │ -Definition: dynvector.hh:151 │ │ │ │ │ -Dune::DynamicVector::operator[] │ │ │ │ │ -K & operator[](size_type i) │ │ │ │ │ -Definition: dynvector.hh:152 │ │ │ │ │ -Dune::DynamicVector::container │ │ │ │ │ -container_type & container() │ │ │ │ │ -Definition: dynvector.hh:174 │ │ │ │ │ -Dune::DynamicVector::value_type │ │ │ │ │ -Base::value_type value_type │ │ │ │ │ -Definition: dynvector.hh:65 │ │ │ │ │ -Dune::DynamicVector::data │ │ │ │ │ -const K * data() const noexcept │ │ │ │ │ -return pointer to underlying array │ │ │ │ │ -Definition: dynvector.hh:168 │ │ │ │ │ -Dune::DynamicVector::allocator_type │ │ │ │ │ -Allocator allocator_type │ │ │ │ │ -Definition: dynvector.hh:69 │ │ │ │ │ -Dune::DynamicVector::DynamicVector │ │ │ │ │ -DynamicVector(const allocator_type &a=allocator_type()) │ │ │ │ │ -Constructor making uninitialized vector. │ │ │ │ │ -Definition: dynvector.hh:72 │ │ │ │ │ -Dune::DynamicVector::DynamicVector │ │ │ │ │ -DynamicVector(DynamicVector &&x) │ │ │ │ │ -Move constructor. │ │ │ │ │ -Definition: dynvector.hh:96 │ │ │ │ │ -Dune::DynamicVector::data │ │ │ │ │ -K * data() noexcept │ │ │ │ │ -return pointer to underlying array │ │ │ │ │ -Definition: dynvector.hh:162 │ │ │ │ │ -Dune::DynamicVector::operator= │ │ │ │ │ -DynamicVector & operator=(DynamicVector &&other) │ │ │ │ │ -Move assignment operator. │ │ │ │ │ -Definition: dynvector.hh:126 │ │ │ │ │ -Dune::DynamicVector::operator= │ │ │ │ │ -DynamicVector & operator=(const DynamicVector &other) │ │ │ │ │ -Copy assignment operator. │ │ │ │ │ -Definition: dynvector.hh:119 │ │ │ │ │ -Dune::DynamicVector::capacity │ │ │ │ │ -size_type capacity() const │ │ │ │ │ -Number of elements for which memory has been allocated. │ │ │ │ │ -Definition: dynvector.hh:137 │ │ │ │ │ -Dune::DynamicVector::container │ │ │ │ │ -const container_type & container() const │ │ │ │ │ -Definition: dynvector.hh:173 │ │ │ │ │ -Dune::DynamicVector::DynamicVector │ │ │ │ │ -DynamicVector(size_type n, const allocator_type &a=allocator_type()) │ │ │ │ │ -Definition: dynvector.hh:76 │ │ │ │ │ -Dune::DynamicVector::DynamicVector │ │ │ │ │ -DynamicVector(std::initializer_list< K > const &l) │ │ │ │ │ -Construct from a std::initializer_list. │ │ │ │ │ -Definition: dynvector.hh:86 │ │ │ │ │ -Dune::DynamicVector::DynamicVector │ │ │ │ │ -DynamicVector(const DynamicVector< T, Allocator > &x) │ │ │ │ │ -Definition: dynvector.hh:101 │ │ │ │ │ -Dune::DynamicVector::operator[] │ │ │ │ │ -const K & operator[](size_type i) const │ │ │ │ │ -Definition: dynvector.hh:156 │ │ │ │ │ -Dune::DynamicVector::reserve │ │ │ │ │ -void reserve(size_type n) │ │ │ │ │ -Definition: dynvector.hh:145 │ │ │ │ │ -Dune::DynamicVector::DynamicVector │ │ │ │ │ -DynamicVector(size_type n, value_type c, const allocator_type &a=allocator_type │ │ │ │ │ -()) │ │ │ │ │ -Constructor making vector with identical coordinates. │ │ │ │ │ -Definition: dynvector.hh:81 │ │ │ │ │ -Dune::DynamicVector::DynamicVector │ │ │ │ │ -DynamicVector(const DenseVector< X > &x, const allocator_type &a=allocator_type │ │ │ │ │ -()) │ │ │ │ │ -Copy constructor from another DenseVector. │ │ │ │ │ -Definition: dynvector.hh:107 │ │ │ │ │ -Dune::DenseMatVecTraits<_DynamicVector<_K,_Allocator_>_>::value_type │ │ │ │ │ -K value_type │ │ │ │ │ -Definition: dynvector.hh:40 │ │ │ │ │ -Dune::DenseMatVecTraits<_DynamicVector<_K,_Allocator_>_>::derived_type │ │ │ │ │ -DynamicVector< K, Allocator > derived_type │ │ │ │ │ -Definition: dynvector.hh:38 │ │ │ │ │ -Dune::DenseMatVecTraits<_DynamicVector<_K,_Allocator_>_>::container_type │ │ │ │ │ -std::vector< K, Allocator > container_type │ │ │ │ │ -Definition: dynvector.hh:39 │ │ │ │ │ -Dune::DenseMatVecTraits<_DynamicVector<_K,_Allocator_>_>::size_type │ │ │ │ │ -container_type::size_type size_type │ │ │ │ │ -Definition: dynvector.hh:41 │ │ │ │ │ -Dune::FieldTraits<_DynamicVector<_K,_Allocator_>_>::real_type │ │ │ │ │ -FieldTraits< K >::real_type real_type │ │ │ │ │ -Definition: dynvector.hh:48 │ │ │ │ │ -Dune::FieldTraits<_DynamicVector<_K,_Allocator_>_>::field_type │ │ │ │ │ -FieldTraits< K >::field_type field_type │ │ │ │ │ -Definition: dynvector.hh:47 │ │ │ │ │ -Dune::FieldTraits │ │ │ │ │ -Definition: ftraits.hh:26 │ │ │ │ │ -Dune::FieldTraits::field_type │ │ │ │ │ -T field_type │ │ │ │ │ -export the type representing the field │ │ │ │ │ -Definition: ftraits.hh:28 │ │ │ │ │ -Dune::FieldTraits::real_type │ │ │ │ │ -T real_type │ │ │ │ │ -export the type representing the real type of the field │ │ │ │ │ -Definition: ftraits.hh:30 │ │ │ │ │ -Dune::DenseMatVecTraits │ │ │ │ │ -Definition: matvectraits.hh:31 │ │ │ │ │ +Dune::makeTupleVector │ │ │ │ │ +constexpr auto makeTupleVector(T &&... t) │ │ │ │ │ +Definition: tuplevector.hh:90 │ │ │ │ │ +Dune::TupleVector │ │ │ │ │ +A class augmenting std::tuple by element access via operator[]. │ │ │ │ │ +Definition: tuplevector.hh:35 │ │ │ │ │ +Dune::TupleVector::size │ │ │ │ │ +static constexpr std::size_t size() │ │ │ │ │ +Number of elements of the tuple. │ │ │ │ │ +Definition: tuplevector.hh:81 │ │ │ │ │ +Dune::TupleVector::TupleVector │ │ │ │ │ +constexpr TupleVector(TT &&... tt) │ │ │ │ │ +Construct from a set of arguments. │ │ │ │ │ +Definition: tuplevector.hh:55 │ │ │ │ │ +Dune::TupleVector::TupleVector │ │ │ │ │ +constexpr TupleVector() │ │ │ │ │ +Default constructor. │ │ │ │ │ +Definition: tuplevector.hh:61 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00182.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: keywords.hh File Reference │ │ │ │ +dune-common: dynmatrixev.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,63 +63,46 @@ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ -Macros
│ │ │ │ -
keywords.hh File Reference
│ │ │ │ +Namespaces | │ │ │ │ +Functions
│ │ │ │ +
dynmatrixev.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

Definitions of several macros that conditionally make C++ syntax available. │ │ │ │ +

utility functions to compute eigenvalues for dense matrices. │ │ │ │ More...

│ │ │ │ - │ │ │ │ +
#include <algorithm>
│ │ │ │ +#include <memory>
│ │ │ │ +#include "dynmatrix.hh"
│ │ │ │ +#include "fmatrixev.hh"
│ │ │ │ +
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Macros

#define DUNE_INLINE_VARIABLE   inline
 
#define DUNE_GENERALIZED_CONSTEXPR   constexpr
 

│ │ │ │ +Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::DynamicMatrixHelp
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Functions

template<typename K , class C >
static void Dune::DynamicMatrixHelp::eigenValuesNonSym (const DynamicMatrix< K > &matrix, DynamicVector< C > &eigenValues, std::vector< DynamicVector< K > > *eigenVectors=nullptr)
 calculates the eigenvalues of a symmetric field matrix More...
 
│ │ │ │

Detailed Description

│ │ │ │ -

Definitions of several macros that conditionally make C++ syntax available.

│ │ │ │ -

This header contains several macros that enable C++ features depending on your compiler. Most of these features are optional and provide additional functionality like making code constexpr.

│ │ │ │ -

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ DUNE_GENERALIZED_CONSTEXPR

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
#define DUNE_GENERALIZED_CONSTEXPR   constexpr
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ -

◆ DUNE_INLINE_VARIABLE

│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
#define DUNE_INLINE_VARIABLE   inline
│ │ │ │ -
│ │ │ │ - │ │ │ │ -
│ │ │ │ -
│ │ │ │ -
│ │ │ │ +

utility functions to compute eigenvalues for dense matrices.

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,31 +4,33 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Macros │ │ │ │ │ -keywords.hh File Reference │ │ │ │ │ -Common » Utilities » C++_utilities_and_backports │ │ │ │ │ -Definitions of several macros that conditionally make C++ syntax available. │ │ │ │ │ -More... │ │ │ │ │ +Namespaces | Functions │ │ │ │ │ +dynmatrixev.hh File Reference │ │ │ │ │ +utility functions to compute eigenvalues for dense matrices. More... │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "dynmatrix.hh" │ │ │ │ │ +#include "fmatrixev.hh" │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ - Macros │ │ │ │ │ -#define DUNE_INLINE_VARIABLE   inline │ │ │ │ │ + Namespaces │ │ │ │ │ +namespace  Dune │ │ │ │ │ +  Dune namespace. │ │ │ │ │   │ │ │ │ │ -#define DUNE_GENERALIZED_CONSTEXPR   constexpr │ │ │ │ │ +namespace  Dune::DynamicMatrixHelp │ │ │ │ │ +  │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +static void Dune::DynamicMatrixHelp::eigenValuesNonSym (const DynamicMatrix< K │ │ │ │ │ + > &matrix, DynamicVector< C > &eigenValues, std::vector< │ │ │ │ │ + DynamicVector< K > > *eigenVectors=nullptr) │ │ │ │ │ +  calculates the eigenvalues of a symmetric field matrix More... │ │ │ │ │   │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -Definitions of several macros that conditionally make C++ syntax available. │ │ │ │ │ -This header contains several macros that enable C++ features depending on your │ │ │ │ │ -compiler. Most of these features are optional and provide additional │ │ │ │ │ -functionality like making code constexpr. │ │ │ │ │ -***** Macro Definition Documentation ***** │ │ │ │ │ -***** ◆ DUNE_GENERALIZED_CONSTEXPR ***** │ │ │ │ │ -#define DUNE_GENERALIZED_CONSTEXPR   constexpr │ │ │ │ │ -***** ◆ DUNE_INLINE_VARIABLE ***** │ │ │ │ │ -#define DUNE_INLINE_VARIABLE   inline │ │ │ │ │ +utility functions to compute eigenvalues for dense matrices. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00182_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: keywords.hh Source File │ │ │ │ +dune-common: dynmatrixev.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,39 +62,119 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
keywords.hh
│ │ │ │ +
dynmatrixev.hh
│ │ │ │
│ │ │ │
│ │ │ │ -Go to the documentation of this file.
1// SPDX-FileCopyrightInfo: Copyright (C) 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_KEYWORDS_HH
│ │ │ │ -
4#define DUNE_COMMON_KEYWORDS_HH
│ │ │ │ -
5
│ │ │ │ -
18#if __cpp_inline_variables >= 201606
│ │ │ │ -
19#define DUNE_INLINE_VARIABLE inline
│ │ │ │ -
20#else
│ │ │ │ -
22
│ │ │ │ -
25#define DUNE_INLINE_VARIABLE
│ │ │ │ -
26#endif
│ │ │ │ -
27
│ │ │ │ -
28
│ │ │ │ -
29#if __cpp_constexpr >= 201304
│ │ │ │ -
30#define DUNE_GENERALIZED_CONSTEXPR constexpr
│ │ │ │ -
31#else
│ │ │ │ -
33
│ │ │ │ -
36#define DUNE_GENERALIZED_CONSTEXPR
│ │ │ │ -
37#endif
│ │ │ │ -
38
│ │ │ │ -
39
│ │ │ │ -
40#endif // DUNE_COMMON_KEYWORDS_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 (C) 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_DYNMATRIXEIGENVALUES_HH
│ │ │ │ +
6#define DUNE_DYNMATRIXEIGENVALUES_HH
│ │ │ │ +
7
│ │ │ │ +
8#include <algorithm>
│ │ │ │ +
9#include <memory>
│ │ │ │ +
10
│ │ │ │ +
11#include "dynmatrix.hh"
│ │ │ │ +
12#include "fmatrixev.hh"
│ │ │ │ +
13
│ │ │ │ +
22namespace Dune {
│ │ │ │ +
23
│ │ │ │ +
24 namespace DynamicMatrixHelp {
│ │ │ │ +
25
│ │ │ │ +
26#if HAVE_LAPACK
│ │ │ │ +
27 using Dune::FMatrixHelp::eigenValuesNonsymLapackCall;
│ │ │ │ +
28#endif
│ │ │ │ +
29
│ │ │ │ +
38 template <typename K, class C>
│ │ │ │ +
39 static void eigenValuesNonSym(const DynamicMatrix<K>& matrix,
│ │ │ │ + │ │ │ │ +
41 std::vector<DynamicVector<K>>* eigenVectors = nullptr
│ │ │ │ +
42 )
│ │ │ │ +
43 {
│ │ │ │ +
44
│ │ │ │ +
45#if HAVE_LAPACK
│ │ │ │ +
46 {
│ │ │ │ +
47 const long int N = matrix.rows();
│ │ │ │ +
48 const char jobvl = 'n';
│ │ │ │ +
49 const char jobvr = eigenVectors ? 'v' : 'n';
│ │ │ │ +
50
│ │ │ │ +
51
│ │ │ │ +
52 // matrix to put into dgeev
│ │ │ │ +
53 auto matrixVector = std::make_unique<double[]>(N*N);
│ │ │ │ +
54
│ │ │ │ +
55 // copy matrix
│ │ │ │ +
56 int row = 0;
│ │ │ │ +
57 for(int i=0; i<N; ++i)
│ │ │ │ +
58 {
│ │ │ │ +
59 for(int j=0; j<N; ++j, ++row)
│ │ │ │ +
60 {
│ │ │ │ +
61 matrixVector[ row ] = matrix[ i ][ j ];
│ │ │ │ +
62 }
│ │ │ │ +
63 }
│ │ │ │ +
64
│ │ │ │ +
65 // working memory
│ │ │ │ +
66 auto eigenR = std::make_unique<double[]>(N);
│ │ │ │ +
67 auto eigenI = std::make_unique<double[]>(N);
│ │ │ │ +
68
│ │ │ │ +
69 const long int lwork = eigenVectors ? 4*N : 3*N;
│ │ │ │ +
70 auto work = std::make_unique<double[]>(lwork);
│ │ │ │ +
71 auto vr = eigenVectors ? std::make_unique<double[]>(N*N) : std::unique_ptr<double[]>{};
│ │ │ │ +
72
│ │ │ │ +
73 // return value information
│ │ │ │ +
74 long int info = 0;
│ │ │ │ +
75
│ │ │ │ +
76 // call LAPACK routine (see fmatrixev_ext.cc)
│ │ │ │ +
77 eigenValuesNonsymLapackCall(&jobvl, &jobvr, &N, matrixVector.get(), &N,
│ │ │ │ +
78 eigenR.get(), eigenI.get(), nullptr, &N, vr.get(), &N, work.get(),
│ │ │ │ +
79 &lwork, &info);
│ │ │ │ +
80
│ │ │ │ +
81 if( info != 0 )
│ │ │ │ +
82 {
│ │ │ │ +
83 std::cerr << "For matrix " << matrix << " eigenvalue calculation failed! " << std::endl;
│ │ │ │ +
84 DUNE_THROW(InvalidStateException,"eigenValues: Eigenvalue calculation failed!");
│ │ │ │ +
85 }
│ │ │ │ +
86
│ │ │ │ +
87 eigenValues.resize(N);
│ │ │ │ +
88 for (int i=0; i<N; ++i)
│ │ │ │ +
89 eigenValues[i] = std::complex<double>(eigenR[i], eigenI[i]);
│ │ │ │ +
90
│ │ │ │ +
91 if (eigenVectors) {
│ │ │ │ +
92 eigenVectors->resize(N);
│ │ │ │ +
93 for (int i = 0; i < N; ++i) {
│ │ │ │ +
94 auto& v = (*eigenVectors)[i];
│ │ │ │ +
95 v.resize(N);
│ │ │ │ +
96 std::copy(vr.get() + N*i, vr.get() + N*(i+1), &v[0]);
│ │ │ │ +
97 }
│ │ │ │ +
98 }
│ │ │ │ +
99 }
│ │ │ │ +
100#else // #if HAVE_LAPACK
│ │ │ │ +
101 DUNE_THROW(NotImplemented,"LAPACK not found!");
│ │ │ │ +
102#endif
│ │ │ │ +
103 }
│ │ │ │ +
104 }
│ │ │ │ +
105
│ │ │ │ +
106}
│ │ │ │ +
108#endif
│ │ │ │ +
Eigenvalue computations for the FieldMatrix class.
│ │ │ │ +
This file implements a dense matrix with dynamic numbers of rows and columns.
│ │ │ │ +
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
│ │ │ │ +
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ +
static void eigenValuesNonSym(const DynamicMatrix< K > &matrix, DynamicVector< C > &eigenValues, std::vector< DynamicVector< K > > *eigenVectors=nullptr)
calculates the eigenvalues of a symmetric field matrix
Definition: dynmatrixev.hh:39
│ │ │ │ +
static void eigenValues(const FieldMatrix< K, dim, dim > &matrix, FieldVector< K, dim > &eigenValues)
calculates the eigenvalues of a symmetric field matrix
Definition: fmatrixev.hh:523
│ │ │ │ +
constexpr size_type rows() const
number of rows
Definition: densematrix.hh:709
│ │ │ │ +
Construct a matrix with a dynamic size.
Definition: dynmatrix.hh:61
│ │ │ │ +
Construct a vector with a dynamic size.
Definition: dynvector.hh:59
│ │ │ │ +
Default exception for dummy implementations.
Definition: exceptions.hh:263
│ │ │ │ +
Default exception if a function was called while the object is not in a valid state for that function...
Definition: exceptions.hh:281
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,35 +4,144 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -keywords.hh │ │ │ │ │ +dynmatrixev.hh │ │ │ │ │ Go_to_the_documentation_of_this_file. │ │ │ │ │ - 1// SPDX-FileCopyrightInfo: Copyright (C) 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 (C) 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_KEYWORDS_HH │ │ │ │ │ - 4#define DUNE_COMMON_KEYWORDS_HH │ │ │ │ │ - 5 │ │ │ │ │ - 18#if __cpp_inline_variables >= 201606 │ │ │ │ │ -19#define DUNE_INLINE_VARIABLE inline │ │ │ │ │ - 20#else │ │ │ │ │ - 22 │ │ │ │ │ - 25#define DUNE_INLINE_VARIABLE │ │ │ │ │ - 26#endif │ │ │ │ │ - 27 │ │ │ │ │ - 28 │ │ │ │ │ - 29#if __cpp_constexpr >= 201304 │ │ │ │ │ -30#define DUNE_GENERALIZED_CONSTEXPR constexpr │ │ │ │ │ - 31#else │ │ │ │ │ - 33 │ │ │ │ │ - 36#define DUNE_GENERALIZED_CONSTEXPR │ │ │ │ │ - 37#endif │ │ │ │ │ - 38 │ │ │ │ │ - 39 │ │ │ │ │ - 40#endif // DUNE_COMMON_KEYWORDS_HH │ │ │ │ │ + 4// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ + 5#ifndef DUNE_DYNMATRIXEIGENVALUES_HH │ │ │ │ │ + 6#define DUNE_DYNMATRIXEIGENVALUES_HH │ │ │ │ │ + 7 │ │ │ │ │ + 8#include │ │ │ │ │ + 9#include │ │ │ │ │ + 10 │ │ │ │ │ + 11#include "dynmatrix.hh" │ │ │ │ │ + 12#include "fmatrixev.hh" │ │ │ │ │ + 13 │ │ │ │ │ + 22namespace Dune { │ │ │ │ │ + 23 │ │ │ │ │ +24 namespace DynamicMatrixHelp { │ │ │ │ │ + 25 │ │ │ │ │ + 26#if HAVE_LAPACK │ │ │ │ │ + 27 using Dune::FMatrixHelp::eigenValuesNonsymLapackCall; │ │ │ │ │ + 28#endif │ │ │ │ │ + 29 │ │ │ │ │ + 38 template │ │ │ │ │ +39 static void eigenValuesNonSym(const DynamicMatrix& matrix, │ │ │ │ │ + 40 DynamicVector& eigenValues, │ │ │ │ │ + 41 std::vector>* eigenVectors = nullptr │ │ │ │ │ + 42 ) │ │ │ │ │ + 43 { │ │ │ │ │ + 44 │ │ │ │ │ + 45#if HAVE_LAPACK │ │ │ │ │ + 46 { │ │ │ │ │ + 47 const long int N = matrix.rows(); │ │ │ │ │ + 48 const char jobvl = 'n'; │ │ │ │ │ + 49 const char jobvr = eigenVectors ? 'v' : 'n'; │ │ │ │ │ + 50 │ │ │ │ │ + 51 │ │ │ │ │ + 52 // matrix to put into dgeev │ │ │ │ │ + 53 auto matrixVector = std::make_unique(N*N); │ │ │ │ │ + 54 │ │ │ │ │ + 55 // copy matrix │ │ │ │ │ + 56 int row = 0; │ │ │ │ │ + 57 for(int i=0; i(N); │ │ │ │ │ + 67 auto eigenI = std::make_unique(N); │ │ │ │ │ + 68 │ │ │ │ │ + 69 const long int lwork = eigenVectors ? 4*N : 3*N; │ │ │ │ │ + 70 auto work = std::make_unique(lwork); │ │ │ │ │ + 71 auto vr = eigenVectors ? std::make_unique(N*N) : std:: │ │ │ │ │ +unique_ptr{}; │ │ │ │ │ + 72 │ │ │ │ │ + 73 // return value information │ │ │ │ │ + 74 long int info = 0; │ │ │ │ │ + 75 │ │ │ │ │ + 76 // call LAPACK routine (see fmatrixev_ext.cc) │ │ │ │ │ + 77 eigenValuesNonsymLapackCall(&jobvl, &jobvr, &N, matrixVector.get(), &N, │ │ │ │ │ + 78 eigenR.get(), eigenI.get(), nullptr, &N, vr.get(), &N, work.get(), │ │ │ │ │ + 79 &lwork, &info); │ │ │ │ │ + 80 │ │ │ │ │ + 81 if( info != 0 ) │ │ │ │ │ + 82 { │ │ │ │ │ + 83 std::cerr << "For matrix " << matrix << " eigenvalue calculation failed! " │ │ │ │ │ +<< std::endl; │ │ │ │ │ + 84 DUNE_THROW(InvalidStateException,"eigenValues: Eigenvalue calculation │ │ │ │ │ +failed!"); │ │ │ │ │ + 85 } │ │ │ │ │ + 86 │ │ │ │ │ + 87 eigenValues.resize(N); │ │ │ │ │ + 88 for (int i=0; i(eigenR[i], eigenI[i]); │ │ │ │ │ + 90 │ │ │ │ │ + 91 if (eigenVectors) { │ │ │ │ │ + 92 eigenVectors->resize(N); │ │ │ │ │ + 93 for (int i = 0; i < N; ++i) { │ │ │ │ │ + 94 auto& v = (*eigenVectors)[i]; │ │ │ │ │ + 95 v.resize(N); │ │ │ │ │ + 96 std::copy(vr.get() + N*i, vr.get() + N*(i+1), &v[0]); │ │ │ │ │ + 97 } │ │ │ │ │ + 98 } │ │ │ │ │ + 99 } │ │ │ │ │ + 100#else // #if HAVE_LAPACK │ │ │ │ │ + 101 DUNE_THROW(NotImplemented,"LAPACK not found!"); │ │ │ │ │ + 102#endif │ │ │ │ │ + 103 } │ │ │ │ │ + 104 } │ │ │ │ │ + 105 │ │ │ │ │ + 106} │ │ │ │ │ + 108#endif │ │ │ │ │ +fmatrixev.hh │ │ │ │ │ +Eigenvalue computations for the FieldMatrix class. │ │ │ │ │ +dynmatrix.hh │ │ │ │ │ +This file implements a dense matrix with dynamic numbers of rows and columns. │ │ │ │ │ +DUNE_THROW │ │ │ │ │ +#define DUNE_THROW(E, m) │ │ │ │ │ +Definition: exceptions.hh:218 │ │ │ │ │ +Dune │ │ │ │ │ +Dune namespace. │ │ │ │ │ +Definition: alignedallocator.hh:13 │ │ │ │ │ +Dune::DynamicMatrixHelp::eigenValuesNonSym │ │ │ │ │ +static void eigenValuesNonSym(const DynamicMatrix< K > &matrix, DynamicVector< │ │ │ │ │ +C > &eigenValues, std::vector< DynamicVector< K > > *eigenVectors=nullptr) │ │ │ │ │ +calculates the eigenvalues of a symmetric field matrix │ │ │ │ │ +Definition: dynmatrixev.hh:39 │ │ │ │ │ +Dune::FMatrixHelp::eigenValues │ │ │ │ │ +static void eigenValues(const FieldMatrix< K, dim, dim > &matrix, FieldVector< │ │ │ │ │ +K, dim > &eigenValues) │ │ │ │ │ +calculates the eigenvalues of a symmetric field matrix │ │ │ │ │ +Definition: fmatrixev.hh:523 │ │ │ │ │ +Dune::DenseMatrix::rows │ │ │ │ │ +constexpr size_type rows() const │ │ │ │ │ +number of rows │ │ │ │ │ +Definition: densematrix.hh:709 │ │ │ │ │ +Dune::DynamicMatrix │ │ │ │ │ +Construct a matrix with a dynamic size. │ │ │ │ │ +Definition: dynmatrix.hh:61 │ │ │ │ │ +Dune::DynamicVector │ │ │ │ │ +Construct a vector with a dynamic size. │ │ │ │ │ +Definition: dynvector.hh:59 │ │ │ │ │ +Dune::NotImplemented │ │ │ │ │ +Default exception for dummy implementations. │ │ │ │ │ +Definition: exceptions.hh:263 │ │ │ │ │ +Dune::InvalidStateException │ │ │ │ │ +Default exception if a function was called while the object is not in a valid │ │ │ │ │ +state for that function... │ │ │ │ │ +Definition: exceptions.hh:281 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00185.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: exceptions.hh File Reference │ │ │ │ +dune-common: debugstream.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,80 +65,62 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Macros | │ │ │ │ -Functions
│ │ │ │ -
exceptions.hh File Reference
│ │ │ │ +Typedefs
│ │ │ │ +
debugstream.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │ -

A few common exception classes. │ │ │ │ +

Defines several output streams for messages of different importance. │ │ │ │ More...

│ │ │ │ -
#include <exception>
│ │ │ │ -#include <string>
│ │ │ │ -#include <sstream>
│ │ │ │ +
#include <iostream>
│ │ │ │ +#include <stack>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::Exception
 Base class for Dune-Exceptions. More...
struct  Dune::greater_or_equal< current, threshold >
 Greater or equal template test. More...
 
struct  Dune::ExceptionHook
 Base class to add a hook to the Dune::Exception. More...
struct  Dune::common_bits< current, mask >
 activate if current and mask have common bits switched on. More...
 
class  Dune::IOError
 Default exception class for I/O errors. More...
class  Dune::DebugStreamError
 standard exception for the debugstream More...
 
class  Dune::MathError
 Default exception class for mathematical errors. More...
class  Dune::StreamWrap
 
class  Dune::RangeError
 Default exception class for range errors. More...
class  Dune::DebugStreamState
 Intermediate class to implement tie-operation of DebugStream. More...
 
class  Dune::NotImplemented
 Default exception for dummy implementations. More...
 
class  Dune::SystemError
 Default exception class for OS errors. More...
 
class  Dune::OutOfMemoryError
 Default exception if memory allocation fails. More...
 
class  Dune::InvalidStateException
 Default exception if a function was called while the object is not in a valid state for that function. More...
 
class  Dune::ParallelError
 Default exception if an error in the parallel communication of the program occurred. More...
class  Dune::DebugStream< thislevel, dlevel, alevel, activator >
 Generic class to implement debug output streams. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ -Macros

#define DUNE_THROW(E, m)
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Functions

std::ostream & Dune::operator<< (std::ostream &stream, const Exception &e)
 

│ │ │ │ +Typedefs

typedef unsigned int Dune::DebugLevel
 Type for debug levels. More...
 
│ │ │ │

Detailed Description

│ │ │ │ -

A few common exception classes.

│ │ │ │ -

This file defines a common framework for generating exception subclasses and to throw them in a simple manner

│ │ │ │ +

Defines several output streams for messages of different importance.

│ │ │ │ +

This file implements the class DebugStream to support output in a variety of debug levels. Additionally, template parameters control if the output operation is really performed so that unused debug levels can be deactivated

│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,65 +4,49 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Classes | Namespaces | Macros | Functions │ │ │ │ │ -exceptions.hh File Reference │ │ │ │ │ -Common » Exception_handling │ │ │ │ │ -A few common exception classes. More... │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Typedefs │ │ │ │ │ +debugstream.hh File Reference │ │ │ │ │ +Common » Debug_output │ │ │ │ │ +Defines several output streams for messages of different importance. More... │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ - class  Dune::Exception │ │ │ │ │ -  Base class for Dune-Exceptions. More... │ │ │ │ │ +struct  Dune::greater_or_equal<_current,_threshold_> │ │ │ │ │ +  Greater or equal template test. More... │ │ │ │ │   │ │ │ │ │ -struct  Dune::ExceptionHook │ │ │ │ │ -  Base class to add a hook to the Dune::Exception. More... │ │ │ │ │ +struct  Dune::common_bits<_current,_mask_> │ │ │ │ │ +  activate if current and mask have common bits switched on. More... │ │ │ │ │   │ │ │ │ │ - class  Dune::IOError │ │ │ │ │ -  Default exception class for I/O errors. More... │ │ │ │ │ + class  Dune::DebugStreamError │ │ │ │ │ +  standard exception for the debugstream More... │ │ │ │ │   │ │ │ │ │ - class  Dune::MathError │ │ │ │ │ -  Default exception class for mathematical errors. More... │ │ │ │ │ + class  Dune::StreamWrap │ │ │ │ │   │ │ │ │ │ - class  Dune::RangeError │ │ │ │ │ -  Default exception class for range errors. More... │ │ │ │ │ + class  Dune::DebugStreamState │ │ │ │ │ +  Intermediate class to implement tie-operation of DebugStream. More... │ │ │ │ │   │ │ │ │ │ - class  Dune::NotImplemented │ │ │ │ │ -  Default exception for dummy implementations. More... │ │ │ │ │ -  │ │ │ │ │ - class  Dune::SystemError │ │ │ │ │ -  Default exception class for OS errors. More... │ │ │ │ │ -  │ │ │ │ │ - class  Dune::OutOfMemoryError │ │ │ │ │ -  Default exception if memory allocation fails. More... │ │ │ │ │ -  │ │ │ │ │ - class  Dune::InvalidStateException │ │ │ │ │ -  Default exception if a function was called while the object is not in │ │ │ │ │ - a valid state for that function. More... │ │ │ │ │ -  │ │ │ │ │ - class  Dune::ParallelError │ │ │ │ │ -  Default exception if an error in the parallel communication of the │ │ │ │ │ - program occurred. More... │ │ │ │ │ + class  Dune::DebugStream<_thislevel,_dlevel,_alevel,_activator_> │ │ │ │ │ +  Generic class to implement debug output streams. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ - Macros │ │ │ │ │ -#define DUNE_THROW(E, m) │ │ │ │ │ -  │ │ │ │ │ - Functions │ │ │ │ │ -std::ostream & Dune::operator<< (std::ostream &stream, const Exception &e) │ │ │ │ │ + Typedefs │ │ │ │ │ +typedef unsigned int Dune::DebugLevel │ │ │ │ │ +  Type for debug levels. More... │ │ │ │ │   │ │ │ │ │ ***** Detailed Description ***** │ │ │ │ │ -A few common exception classes. │ │ │ │ │ -This file defines a common framework for generating exception subclasses and to │ │ │ │ │ -throw them in a simple manner │ │ │ │ │ +Defines several output streams for messages of different importance. │ │ │ │ │ +This file implements the class DebugStream to support output in a variety of │ │ │ │ │ +debug levels. Additionally, template parameters control if the output operation │ │ │ │ │ +is really performed so that unused debug levels can be deactivated │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00185_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: exceptions.hh Source File │ │ │ │ +dune-common: debugstream.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,111 +62,296 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
exceptions.hh
│ │ │ │ +
debugstream.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 (C) 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_EXCEPTIONS_HH
│ │ │ │ -
7#define DUNE_EXCEPTIONS_HH
│ │ │ │ +
6#ifndef DUNE_DEBUGSTREAM_HH
│ │ │ │ +
7#define DUNE_DEBUGSTREAM_HH
│ │ │ │
8
│ │ │ │ -
9#include <exception>
│ │ │ │ -
10#include <string>
│ │ │ │ -
11#include <sstream>
│ │ │ │ -
12
│ │ │ │ -
13namespace Dune {
│ │ │ │ -
14
│ │ │ │ -
73 /* forward declarations */
│ │ │ │ -
74 class Exception;
│ │ │ │ -
75 struct ExceptionHook;
│ │ │ │ -
76
│ │ │ │ - │ │ │ │ -
95 : public std::exception
│ │ │ │ -
96 {
│ │ │ │ -
97 public:
│ │ │ │ -
98 Exception ();
│ │ │ │ -
99 void message(const std::string &msg);
│ │ │ │ -
100 const char* what() const noexcept override;
│ │ │ │ -
101 static void registerHook (ExceptionHook * hook);
│ │ │ │ -
102 static void clearHook ();
│ │ │ │ -
103 private:
│ │ │ │ -
104 std::string _message;
│ │ │ │ -
105 static ExceptionHook * _hook;
│ │ │ │ -
106 };
│ │ │ │ -
107
│ │ │ │ - │ │ │ │ -
174 {
│ │ │ │ -
175 virtual ~ExceptionHook() {}
│ │ │ │ -
176 virtual void operator () () = 0;
│ │ │ │ -
177 };
│ │ │ │ -
178
│ │ │ │ -
179 inline std::ostream& operator<<(std::ostream &stream, const Exception &e)
│ │ │ │ -
180 {
│ │ │ │ -
181 return stream << e.what();
│ │ │ │ -
182 }
│ │ │ │ -
183
│ │ │ │ -
184#ifndef DOXYGEN
│ │ │ │ -
185 // the "format" the exception-type gets printed. __FILE__ and
│ │ │ │ -
186 // __LINE__ are standard C-defines, the GNU cpp-infofile claims that
│ │ │ │ -
187 // C99 defines __func__ as well. __FUNCTION__ is a GNU-extension
│ │ │ │ -
188#define THROWSPEC(E) # E << " [" << __func__ << ":" << __FILE__ << ":" << __LINE__ << "]: "
│ │ │ │ -
189#endif // DOXYGEN
│ │ │ │ -
190
│ │ │ │ -
216 // this is the magic: use the usual do { ... } while (0) trick, create
│ │ │ │ -
217 // the full message via a string stream and throw the created object
│ │ │ │ -
218#define DUNE_THROW(E, m) do { E th__ex; std::ostringstream th__out; \
│ │ │ │ -
219 th__out << THROWSPEC(E) << m; th__ex.message(th__out.str()); throw th__ex; \
│ │ │ │ -
220} while (0)
│ │ │ │ -
221
│ │ │ │ -
231 class IOError : public Exception {};
│ │ │ │ -
232
│ │ │ │ -
241 class MathError : public Exception {};
│ │ │ │ -
242
│ │ │ │ -
254 class RangeError : public Exception {};
│ │ │ │ -
255
│ │ │ │ -
263 class NotImplemented : public Exception {};
│ │ │ │ +
13#include <iostream>
│ │ │ │ +
14#include <stack>
│ │ │ │ +
15
│ │ │ │ + │ │ │ │ +
17
│ │ │ │ +
18namespace Dune {
│ │ │ │ +
19
│ │ │ │ +
118 typedef unsigned int DebugLevel;
│ │ │ │ +
119
│ │ │ │ +
129 template <DebugLevel current, DebugLevel threshold>
│ │ │ │ + │ │ │ │ +
131 constexpr static bool value = (current >= threshold);
│ │ │ │ +
132 };
│ │ │ │ +
133
│ │ │ │ +
134
│ │ │ │ +
141 template <DebugLevel current, DebugLevel mask>
│ │ │ │ +
142 struct common_bits {
│ │ │ │ +
143 constexpr static bool value = ((current & mask) != 0);
│ │ │ │ +
144 };
│ │ │ │ +
145
│ │ │ │ +
146
│ │ │ │ +
148 class DebugStreamError : public IOError {};
│ │ │ │ +
149
│ │ │ │ + │ │ │ │ +
151 public:
│ │ │ │ +
152 StreamWrap(std::ostream& _out) : out(_out) { }
│ │ │ │ +
153 std::ostream& out;
│ │ │ │ + │ │ │ │ +
155 };
│ │ │ │ +
156
│ │ │ │ + │ │ │ │ +
159 // !!! should be protected somehow but that won't be easy
│ │ │ │ +
160 public:
│ │ │ │ + │ │ │ │ +
163
│ │ │ │ + │ │ │ │ +
166
│ │ │ │ +
168 bool _tied;
│ │ │ │ +
169
│ │ │ │ +
171 unsigned int _tied_streams;
│ │ │ │ +
172 };
│ │ │ │ +
173
│ │ │ │ +
188 template <DebugLevel thislevel = 1,
│ │ │ │ +
189 DebugLevel dlevel = 1,
│ │ │ │ +
190 DebugLevel alevel = 1,
│ │ │ │ +
191 template<DebugLevel, DebugLevel> class activator = greater_or_equal>
│ │ │ │ + │ │ │ │ +
193 public:
│ │ │ │ +
199 DebugStream(std::ostream& out = std::cerr) {
│ │ │ │ +
200 // start a new list of streams
│ │ │ │ +
201 current = new StreamWrap(out);
│ │ │ │ +
202 current->next = 0;
│ │ │ │ +
203
│ │ │ │ +
204 // check if we are above the default activation level
│ │ │ │ +
205 _active = activator<thislevel,alevel>::value;
│ │ │ │ +
206
│ │ │ │ +
207 // we're not tied to another DebugStream
│ │ │ │ +
208 _tied = false;
│ │ │ │ +
209
│ │ │ │ +
210 // no child streams yet
│ │ │ │ +
211 _tied_streams = 0;
│ │ │ │ +
212 }
│ │ │ │ +
213
│ │ │ │ + │ │ │ │ +
220 std::ostream& fallback = std::cerr)
│ │ │ │ +
221 {
│ │ │ │ +
222 // start a new list of streams
│ │ │ │ +
223 current = new StreamWrap(fallback);
│ │ │ │ +
224 current->next = 0;
│ │ │ │ +
225
│ │ │ │ +
226 // check if we are above the default activation level
│ │ │ │ +
227 _active = activator<thislevel,alevel>::value;
│ │ │ │ +
228 _tied_streams = 0;
│ │ │ │ +
229
│ │ │ │ +
230 // tie to the provided stream
│ │ │ │ +
231 _tied = true;
│ │ │ │ +
232 tiedstate = &master;
│ │ │ │ +
233 tiedstate->_tied_streams++;
│ │ │ │ +
234 }
│ │ │ │ +
235
│ │ │ │ + │ │ │ │ +
244 {
│ │ │ │ +
245 // untie
│ │ │ │ +
246 if (_tied)
│ │ │ │ +
247 tiedstate->_tied_streams--;
│ │ │ │ +
248 else {
│ │ │ │ +
249 // check if somebody still ties to us...
│ │ │ │ +
250 if (_tied_streams != 0)
│ │ │ │ +
251 {
│ │ │ │ +
252 std::cerr << "DebugStream destructor is called while other streams are still tied to it. Terminating!" << std::endl;
│ │ │ │ +
253 std::terminate();
│ │ │ │ +
254 }
│ │ │ │ +
255 }
│ │ │ │ +
256
│ │ │ │ +
257 // remove ostream-stack
│ │ │ │ +
258 while (current != 0) {
│ │ │ │ +
259 StreamWrap *s = current;
│ │ │ │ + │ │ │ │ +
261 delete s;
│ │ │ │ +
262 }
│ │ │ │ +
263 }
│ │ │ │
264
│ │ │ │ -
271 class SystemError : public Exception {};
│ │ │ │ -
272
│ │ │ │ -
276 class OutOfMemoryError : public SystemError {};
│ │ │ │ -
277
│ │ │ │ - │ │ │ │ -
282
│ │ │ │ -
287 class ParallelError : public Exception {};
│ │ │ │ -
288
│ │ │ │ -
289} // end namespace
│ │ │ │ -
290
│ │ │ │ -
291#endif
│ │ │ │ -
std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
Definition: bigunsignedint.hh:278
│ │ │ │ -
Exception()
Definition: exceptions.cc:16
│ │ │ │ -
static void registerHook(ExceptionHook *hook)
add a functor which is called before a Dune::Exception is emitted (see Dune::ExceptionHook)
Definition: exceptions.cc:22
│ │ │ │ -
static void clearHook()
remove all hooks
Definition: exceptions.cc:27
│ │ │ │ -
void message(const std::string &msg)
store string in internal message buffer
Definition: exceptions.cc:32
│ │ │ │ -
virtual void operator()()=0
│ │ │ │ -
virtual ~ExceptionHook()
Definition: exceptions.hh:175
│ │ │ │ -
const char * what() const noexcept override
output internal message buffer
Definition: exceptions.cc:37
│ │ │ │ +
266 template <class T>
│ │ │ │ +
267 DebugStream& operator<<(const T data) {
│ │ │ │ +
268 // remove the following code if stream wasn't compiled active
│ │ │ │ +
269 if (activator<thislevel, dlevel>::value) {
│ │ │ │ +
270 if (! _tied) {
│ │ │ │ +
271 if (_active)
│ │ │ │ +
272 current->out << data;
│ │ │ │ +
273 } else {
│ │ │ │ +
274 if (_active && tiedstate->_active)
│ │ │ │ +
275 tiedstate->current->out << data;
│ │ │ │ +
276 }
│ │ │ │ +
277 }
│ │ │ │ +
278
│ │ │ │ +
279 return *this;
│ │ │ │ +
280 }
│ │ │ │ +
281
│ │ │ │ +
289 DebugStream& operator<<(const int data) {
│ │ │ │ +
290 // remove the following code if stream wasn't compiled active
│ │ │ │ +
291 if (activator<thislevel, dlevel>::value) {
│ │ │ │ +
292 if (! _tied) {
│ │ │ │ +
293 if (_active)
│ │ │ │ +
294 current->out << data;
│ │ │ │ +
295 } else {
│ │ │ │ +
296 if (_active && tiedstate->_active)
│ │ │ │ +
297 tiedstate->current->out << data;
│ │ │ │ +
298 }
│ │ │ │ +
299 }
│ │ │ │ +
300
│ │ │ │ +
301 return *this;
│ │ │ │ +
302 }
│ │ │ │ +
303
│ │ │ │ +
305 DebugStream& operator<<(std::ostream& (*f)(std::ostream&)) {
│ │ │ │ +
306 if (activator<thislevel, dlevel>::value) {
│ │ │ │ +
307 if (! _tied) {
│ │ │ │ +
308 if (_active)
│ │ │ │ +
309 f(current->out);
│ │ │ │ +
310 } else {
│ │ │ │ +
311 if (_active && tiedstate->_active)
│ │ │ │ +
312 f(tiedstate->current->out);
│ │ │ │ +
313 }
│ │ │ │ +
314 }
│ │ │ │ +
315
│ │ │ │ +
316 return *this;
│ │ │ │ +
317 }
│ │ │ │ +
318
│ │ │ │ + │ │ │ │ +
321 if (activator<thislevel, dlevel>::value) {
│ │ │ │ +
322 if (! _tied) {
│ │ │ │ +
323 if (_active)
│ │ │ │ +
324 current->out.flush();
│ │ │ │ +
325 } else {
│ │ │ │ +
326 if (_active && tiedstate->_active)
│ │ │ │ +
327 tiedstate->current->out.flush();
│ │ │ │ +
328 }
│ │ │ │ +
329 }
│ │ │ │ +
330
│ │ │ │ +
331 return *this;
│ │ │ │ +
332 }
│ │ │ │ +
333
│ │ │ │ +
335 void push(bool b) {
│ │ │ │ +
336 // are we at all active?
│ │ │ │ +
337 if (activator<thislevel,alevel>::value) {
│ │ │ │ +
338 _actstack.push(_active);
│ │ │ │ +
339 _active = b;
│ │ │ │ +
340 } else {
│ │ │ │ +
341 // stay off
│ │ │ │ +
342 _actstack.push(false);
│ │ │ │ +
343 }
│ │ │ │ +
344 }
│ │ │ │ +
345
│ │ │ │ +
349 void pop() {
│ │ │ │ +
350 if (_actstack.empty())
│ │ │ │ +
351 DUNE_THROW(DebugStreamError, "No previous activation setting!");
│ │ │ │ +
352
│ │ │ │ +
353 _active = _actstack.top();
│ │ │ │ +
354 _actstack.pop();
│ │ │ │ +
355 }
│ │ │ │ +
356
│ │ │ │ +
363 bool active() const {
│ │ │ │ +
364 return activator<thislevel, dlevel>::value && _active;
│ │ │ │ +
365 }
│ │ │ │ +
366
│ │ │ │ +
371 void attach(std::ostream& stream) {
│ │ │ │ +
372 if (_tied)
│ │ │ │ +
373 DUNE_THROW(DebugStreamError, "Cannot attach to a tied stream!");
│ │ │ │ +
374
│ │ │ │ +
375 StreamWrap* newcurr = new StreamWrap(stream);
│ │ │ │ +
376 newcurr->next = current;
│ │ │ │ +
377 current = newcurr;
│ │ │ │ +
378 }
│ │ │ │ +
379
│ │ │ │ +
383 void detach() {
│ │ │ │ +
384 if (current->next == 0)
│ │ │ │ +
385 DUNE_THROW(DebugStreamError, "Cannot detach initial stream!");
│ │ │ │ +
386 if (_tied)
│ │ │ │ +
387 DUNE_THROW(DebugStreamError, "Cannot detach a tied stream!");
│ │ │ │ +
388
│ │ │ │ +
389 StreamWrap* old = current;
│ │ │ │ + │ │ │ │ +
391 delete old;
│ │ │ │ +
392 }
│ │ │ │ +
393
│ │ │ │ + │ │ │ │ +
398 if (to._tied)
│ │ │ │ +
399 DUNE_THROW(DebugStreamError, "Cannot tie to an already tied stream!");
│ │ │ │ +
400 if (_tied)
│ │ │ │ +
401 DUNE_THROW(DebugStreamError, "Stream already tied: untie first!");
│ │ │ │ +
402
│ │ │ │ +
403 _tied = true;
│ │ │ │ +
404 tiedstate = &to;
│ │ │ │ +
405
│ │ │ │ +
406 // tell master class
│ │ │ │ +
407 tiedstate->_tied_streams++;
│ │ │ │ +
408 }
│ │ │ │ +
409
│ │ │ │ +
413 void untie() {
│ │ │ │ +
414 if(! _tied)
│ │ │ │ +
415 DUNE_THROW(DebugStreamError, "Cannot untie, stream is not tied!");
│ │ │ │ +
416
│ │ │ │ +
417 tiedstate->_tied_streams--;
│ │ │ │ +
418 _tied = false;
│ │ │ │ +
419 tiedstate = 0;
│ │ │ │ +
420 }
│ │ │ │ +
421
│ │ │ │ +
422 private:
│ │ │ │ +
424 DebugStreamState* tiedstate;
│ │ │ │ +
425
│ │ │ │ +
430 std::stack<bool> _actstack;
│ │ │ │ +
431 };
│ │ │ │ +
432
│ │ │ │ +
434}
│ │ │ │ +
435
│ │ │ │ +
436
│ │ │ │ +
437#endif
│ │ │ │ +
A few common exception classes.
│ │ │ │ +
StreamWrap(std::ostream &_out)
Definition: debugstream.hh:152
│ │ │ │ +
DebugStream(std::ostream &out=std::cerr)
Create a DebugStream and set initial output stream.
Definition: debugstream.hh:199
│ │ │ │ +
void untie()
Untie stream.
Definition: debugstream.hh:413
│ │ │ │ +
DebugStream & flush()
pass on flush to underlying output stream
Definition: debugstream.hh:320
│ │ │ │ +
void attach(std::ostream &stream)
set output to a different stream.
Definition: debugstream.hh:371
│ │ │ │ +
void detach()
detach current output stream and restore to previous stream
Definition: debugstream.hh:383
│ │ │ │ +
static constexpr bool value
Definition: debugstream.hh:143
│ │ │ │ +
std::ostream & out
Definition: debugstream.hh:153
│ │ │ │ +
void pop()
restore previously set activation flag
Definition: debugstream.hh:349
│ │ │ │ +
bool active() const
reports if this stream will produce output
Definition: debugstream.hh:363
│ │ │ │ +
bool _active
flag to switch output during runtime
Definition: debugstream.hh:165
│ │ │ │ +
unsigned int _tied_streams
how many streams are tied to this state
Definition: debugstream.hh:171
│ │ │ │ +
void tie(DebugStreamState &to)
Tie a stream to this one.
Definition: debugstream.hh:397
│ │ │ │ +
void push(bool b)
set activation flag and store old value
Definition: debugstream.hh:335
│ │ │ │ +
unsigned int DebugLevel
Type for debug levels.
Definition: debugstream.hh:118
│ │ │ │ +
bool _tied
are we tied to another DebugStream?
Definition: debugstream.hh:168
│ │ │ │ +
StreamWrap * current
current output stream and link to possibly pushed old output streams
Definition: debugstream.hh:162
│ │ │ │ +
DebugStream & operator<<(const T data)
Generic types are passed on to current output stream.
Definition: debugstream.hh:267
│ │ │ │ +
static constexpr bool value
Definition: debugstream.hh:131
│ │ │ │ +
~DebugStream()
Destroy stream.
Definition: debugstream.hh:243
│ │ │ │ +
DebugStream(DebugStreamState &master, std::ostream &fallback=std::cerr)
Create a DebugStream and directly tie to another DebugStream.
Definition: debugstream.hh:219
│ │ │ │ +
DebugStream & operator<<(const int data)
explicit specialization so that enums can be printed
Definition: debugstream.hh:289
│ │ │ │ +
DebugStream & operator<<(std::ostream &(*f)(std::ostream &))
pass on manipulators to underlying output stream
Definition: debugstream.hh:305
│ │ │ │ +
StreamWrap * next
Definition: debugstream.hh:154
│ │ │ │ +
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
│ │ │ │ +
Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v)
implements Simd::mask()
Definition: defaults.hh:153
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
Base class for Dune-Exceptions.
Definition: exceptions.hh:96
│ │ │ │ -
Base class to add a hook to the Dune::Exception.
Definition: exceptions.hh:174
│ │ │ │ +
Greater or equal template test.
Definition: debugstream.hh:130
│ │ │ │ +
activate if current and mask have common bits switched on.
Definition: debugstream.hh:142
│ │ │ │ +
standard exception for the debugstream
Definition: debugstream.hh:148
│ │ │ │ +
Definition: debugstream.hh:150
│ │ │ │ +
Intermediate class to implement tie-operation of DebugStream.
Definition: debugstream.hh:158
│ │ │ │ +
Generic class to implement debug output streams.
Definition: debugstream.hh:192
│ │ │ │
Default exception class for I/O errors.
Definition: exceptions.hh:231
│ │ │ │ -
Default exception class for mathematical errors.
Definition: exceptions.hh:241
│ │ │ │ -
Default exception class for range errors.
Definition: exceptions.hh:254
│ │ │ │ -
Default exception for dummy implementations.
Definition: exceptions.hh:263
│ │ │ │ -
Default exception class for OS errors.
Definition: exceptions.hh:271
│ │ │ │ -
Default exception if memory allocation fails.
Definition: exceptions.hh:276
│ │ │ │ -
Default exception if a function was called while the object is not in a valid state for that function...
Definition: exceptions.hh:281
│ │ │ │ -
Default exception if an error in the parallel communication of the program occurred.
Definition: exceptions.hh:287
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,153 +4,381 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -exceptions.hh │ │ │ │ │ +debugstream.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 (C) 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_EXCEPTIONS_HH │ │ │ │ │ - 7#define DUNE_EXCEPTIONS_HH │ │ │ │ │ + 6#ifndef DUNE_DEBUGSTREAM_HH │ │ │ │ │ + 7#define DUNE_DEBUGSTREAM_HH │ │ │ │ │ 8 │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12 │ │ │ │ │ - 13namespace Dune { │ │ │ │ │ - 14 │ │ │ │ │ - 73 /* forward declarations */ │ │ │ │ │ - 74 class Exception; │ │ │ │ │ - 75 struct ExceptionHook; │ │ │ │ │ - 76 │ │ │ │ │ -94 class Exception │ │ │ │ │ - 95 : public std::exception │ │ │ │ │ - 96 { │ │ │ │ │ - 97 public: │ │ │ │ │ - 98 Exception (); │ │ │ │ │ - 99 void message(const std::string &msg); │ │ │ │ │ - 100 const char* what() const noexcept override; │ │ │ │ │ - 101 static void registerHook (ExceptionHook * hook); │ │ │ │ │ - 102 static void clearHook (); │ │ │ │ │ - 103 private: │ │ │ │ │ - 104 std::string _message; │ │ │ │ │ - 105 static ExceptionHook * _hook; │ │ │ │ │ - 106 }; │ │ │ │ │ - 107 │ │ │ │ │ -173 struct ExceptionHook │ │ │ │ │ - 174 { │ │ │ │ │ -175 virtual ~ExceptionHook() {} │ │ │ │ │ -176 virtual void operator_()() = 0; │ │ │ │ │ - 177 }; │ │ │ │ │ - 178 │ │ │ │ │ -179 inline std::ostream& operator<<(std::ostream &stream, const Exception &e) │ │ │ │ │ - 180 { │ │ │ │ │ - 181 return stream << e.what(); │ │ │ │ │ - 182 } │ │ │ │ │ - 183 │ │ │ │ │ - 184#ifndef DOXYGEN │ │ │ │ │ - 185 // the "format" the exception-type gets printed. __FILE__ and │ │ │ │ │ - 186 // __LINE__ are standard C-defines, the GNU cpp-infofile claims that │ │ │ │ │ - 187 // C99 defines __func__ as well. __FUNCTION__ is a GNU-extension │ │ │ │ │ - 188#define THROWSPEC(E) # E << " [" << __func__ << ":" << __FILE__ << ":" << │ │ │ │ │ -__LINE__ << "]: " │ │ │ │ │ - 189#endif // DOXYGEN │ │ │ │ │ - 190 │ │ │ │ │ - 216 // this is the magic: use the usual do { ... } while (0) trick, create │ │ │ │ │ - 217 // the full message via a string stream and throw the created object │ │ │ │ │ -218#define DUNE_THROW(E, m) do { E th__ex; std::ostringstream th__out; \ │ │ │ │ │ - 219 th__out << THROWSPEC(E) << m; th__ex.message(th__out.str()); throw th__ex; │ │ │ │ │ -\ │ │ │ │ │ - 220} while (0) │ │ │ │ │ - 221 │ │ │ │ │ -231 class IOError : public Exception {}; │ │ │ │ │ - 232 │ │ │ │ │ -241 class MathError : public Exception {}; │ │ │ │ │ - 242 │ │ │ │ │ -254 class RangeError : public Exception {}; │ │ │ │ │ - 255 │ │ │ │ │ -263 class NotImplemented : public Exception {}; │ │ │ │ │ + 13#include │ │ │ │ │ + 14#include │ │ │ │ │ + 15 │ │ │ │ │ + 16#include │ │ │ │ │ + 17 │ │ │ │ │ + 18namespace Dune { │ │ │ │ │ + 19 │ │ │ │ │ +118 typedef unsigned int DebugLevel; │ │ │ │ │ + 119 │ │ │ │ │ + 129 template │ │ │ │ │ +130 struct greater_or_equal { │ │ │ │ │ +131 constexpr static bool value = (current >= threshold); │ │ │ │ │ + 132 }; │ │ │ │ │ + 133 │ │ │ │ │ + 134 │ │ │ │ │ + 141 template │ │ │ │ │ +142 struct common_bits { │ │ │ │ │ +143 constexpr static bool value = ((current & mask) != 0); │ │ │ │ │ + 144 }; │ │ │ │ │ + 145 │ │ │ │ │ + 146 │ │ │ │ │ +148 class DebugStreamError : public IOError {}; │ │ │ │ │ + 149 │ │ │ │ │ +150 class StreamWrap { │ │ │ │ │ + 151 public: │ │ │ │ │ +152 StreamWrap(std::ostream& _out) : out(_out) { } │ │ │ │ │ +153 std::ostream& out; │ │ │ │ │ +154 StreamWrap *next; │ │ │ │ │ + 155 }; │ │ │ │ │ + 156 │ │ │ │ │ +158 class DebugStreamState { │ │ │ │ │ + 159 // !!! should be protected somehow but that won't be easy │ │ │ │ │ + 160 public: │ │ │ │ │ +162 StreamWrap* current; │ │ │ │ │ + 163 │ │ │ │ │ +165 bool _active; │ │ │ │ │ + 166 │ │ │ │ │ +168 bool _tied; │ │ │ │ │ + 169 │ │ │ │ │ +171 unsigned int _tied_streams; │ │ │ │ │ + 172 }; │ │ │ │ │ + 173 │ │ │ │ │ + 188 template class activator = greater_or_equal> │ │ │ │ │ +192 class DebugStream : public DebugStreamState { │ │ │ │ │ + 193 public: │ │ │ │ │ +199 DebugStream(std::ostream& out = std::cerr) { │ │ │ │ │ + 200 // start a new list of streams │ │ │ │ │ + 201 current = new StreamWrap(out); │ │ │ │ │ + 202 current->next = 0; │ │ │ │ │ + 203 │ │ │ │ │ + 204 // check if we are above the default activation level │ │ │ │ │ + 205 _active = activator::value; │ │ │ │ │ + 206 │ │ │ │ │ + 207 // we're not tied to another DebugStream │ │ │ │ │ + 208 _tied = false; │ │ │ │ │ + 209 │ │ │ │ │ + 210 // no child streams yet │ │ │ │ │ + 211 _tied_streams = 0; │ │ │ │ │ + 212 } │ │ │ │ │ + 213 │ │ │ │ │ +219 DebugStream (DebugStreamState& master, │ │ │ │ │ + 220 std::ostream& fallback = std::cerr) │ │ │ │ │ + 221 { │ │ │ │ │ + 222 // start a new list of streams │ │ │ │ │ + 223 current = new StreamWrap(fallback); │ │ │ │ │ + 224 current->next = 0; │ │ │ │ │ + 225 │ │ │ │ │ + 226 // check if we are above the default activation level │ │ │ │ │ + 227 _active = activator::value; │ │ │ │ │ + 228 _tied_streams = 0; │ │ │ │ │ + 229 │ │ │ │ │ + 230 // tie to the provided stream │ │ │ │ │ + 231 _tied = true; │ │ │ │ │ + 232 tiedstate = &master; │ │ │ │ │ + 233 tiedstate->_tied_streams++; │ │ │ │ │ + 234 } │ │ │ │ │ + 235 │ │ │ │ │ +243 ~DebugStream() │ │ │ │ │ + 244 { │ │ │ │ │ + 245 // untie │ │ │ │ │ + 246 if (_tied) │ │ │ │ │ + 247 tiedstate->_tied_streams--; │ │ │ │ │ + 248 else { │ │ │ │ │ + 249 // check if somebody still ties to us... │ │ │ │ │ + 250 if (_tied_streams != 0) │ │ │ │ │ + 251 { │ │ │ │ │ + 252 std::cerr << "DebugStream destructor is called while other streams are │ │ │ │ │ +still tied to it. Terminating!" << std::endl; │ │ │ │ │ + 253 std::terminate(); │ │ │ │ │ + 254 } │ │ │ │ │ + 255 } │ │ │ │ │ + 256 │ │ │ │ │ + 257 // remove ostream-stack │ │ │ │ │ + 258 while (current != 0) { │ │ │ │ │ + 259 StreamWrap *s = current; │ │ │ │ │ + 260 current = current->next; │ │ │ │ │ + 261 delete s; │ │ │ │ │ + 262 } │ │ │ │ │ + 263 } │ │ │ │ │ 264 │ │ │ │ │ -271 class SystemError : public Exception {}; │ │ │ │ │ - 272 │ │ │ │ │ -276 class OutOfMemoryError : public SystemError {}; │ │ │ │ │ - 277 │ │ │ │ │ -281 class InvalidStateException : public Exception {}; │ │ │ │ │ - 282 │ │ │ │ │ -287 class ParallelError : public Exception {}; │ │ │ │ │ - 288 │ │ │ │ │ - 289} // end namespace │ │ │ │ │ - 290 │ │ │ │ │ - 291#endif │ │ │ │ │ -Dune::operator<< │ │ │ │ │ -std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x) │ │ │ │ │ -Definition: bigunsignedint.hh:278 │ │ │ │ │ -Dune::Exception::Exception │ │ │ │ │ -Exception() │ │ │ │ │ -Definition: exceptions.cc:16 │ │ │ │ │ -Dune::Exception::registerHook │ │ │ │ │ -static void registerHook(ExceptionHook *hook) │ │ │ │ │ -add a functor which is called before a Dune::Exception is emitted (see Dune:: │ │ │ │ │ -ExceptionHook) │ │ │ │ │ -Definition: exceptions.cc:22 │ │ │ │ │ -Dune::Exception::clearHook │ │ │ │ │ -static void clearHook() │ │ │ │ │ -remove all hooks │ │ │ │ │ -Definition: exceptions.cc:27 │ │ │ │ │ -Dune::Exception::message │ │ │ │ │ -void message(const std::string &msg) │ │ │ │ │ -store string in internal message buffer │ │ │ │ │ -Definition: exceptions.cc:32 │ │ │ │ │ -Dune::ExceptionHook::operator() │ │ │ │ │ -virtual void operator()()=0 │ │ │ │ │ -Dune::ExceptionHook::~ExceptionHook │ │ │ │ │ -virtual ~ExceptionHook() │ │ │ │ │ -Definition: exceptions.hh:175 │ │ │ │ │ -Dune::Exception::what │ │ │ │ │ -const char * what() const noexcept override │ │ │ │ │ -output internal message buffer │ │ │ │ │ -Definition: exceptions.cc:37 │ │ │ │ │ + 266 template │ │ │ │ │ +267 DebugStream& operator<<(const T data) { │ │ │ │ │ + 268 // remove the following code if stream wasn't compiled active │ │ │ │ │ + 269 if (activator::value) { │ │ │ │ │ + 270 if (! _tied) { │ │ │ │ │ + 271 if (_active) │ │ │ │ │ + 272 current->out << data; │ │ │ │ │ + 273 } else { │ │ │ │ │ + 274 if (_active && tiedstate->_active) │ │ │ │ │ + 275 tiedstate->current->out << data; │ │ │ │ │ + 276 } │ │ │ │ │ + 277 } │ │ │ │ │ + 278 │ │ │ │ │ + 279 return *this; │ │ │ │ │ + 280 } │ │ │ │ │ + 281 │ │ │ │ │ +289 DebugStream& operator<<(const int data) { │ │ │ │ │ + 290 // remove the following code if stream wasn't compiled active │ │ │ │ │ + 291 if (activator::value) { │ │ │ │ │ + 292 if (! _tied) { │ │ │ │ │ + 293 if (_active) │ │ │ │ │ + 294 current->out << data; │ │ │ │ │ + 295 } else { │ │ │ │ │ + 296 if (_active && tiedstate->_active) │ │ │ │ │ + 297 tiedstate->current->out << data; │ │ │ │ │ + 298 } │ │ │ │ │ + 299 } │ │ │ │ │ + 300 │ │ │ │ │ + 301 return *this; │ │ │ │ │ + 302 } │ │ │ │ │ + 303 │ │ │ │ │ +305 DebugStream& operator<<(std::ostream& (*f)(std::ostream&)) { │ │ │ │ │ + 306 if (activator::value) { │ │ │ │ │ + 307 if (! _tied) { │ │ │ │ │ + 308 if (_active) │ │ │ │ │ + 309 f(current->out); │ │ │ │ │ + 310 } else { │ │ │ │ │ + 311 if (_active && tiedstate->_active) │ │ │ │ │ + 312 f(tiedstate->current->out); │ │ │ │ │ + 313 } │ │ │ │ │ + 314 } │ │ │ │ │ + 315 │ │ │ │ │ + 316 return *this; │ │ │ │ │ + 317 } │ │ │ │ │ + 318 │ │ │ │ │ +320 DebugStream& flush() { │ │ │ │ │ + 321 if (activator::value) { │ │ │ │ │ + 322 if (! _tied) { │ │ │ │ │ + 323 if (_active) │ │ │ │ │ + 324 current->out.flush(); │ │ │ │ │ + 325 } else { │ │ │ │ │ + 326 if (_active && tiedstate->_active) │ │ │ │ │ + 327 tiedstate->current->out.flush(); │ │ │ │ │ + 328 } │ │ │ │ │ + 329 } │ │ │ │ │ + 330 │ │ │ │ │ + 331 return *this; │ │ │ │ │ + 332 } │ │ │ │ │ + 333 │ │ │ │ │ +335 void push(bool b) { │ │ │ │ │ + 336 // are we at all active? │ │ │ │ │ + 337 if (activator::value) { │ │ │ │ │ + 338 _actstack.push(_active); │ │ │ │ │ + 339 _active = b; │ │ │ │ │ + 340 } else { │ │ │ │ │ + 341 // stay off │ │ │ │ │ + 342 _actstack.push(false); │ │ │ │ │ + 343 } │ │ │ │ │ + 344 } │ │ │ │ │ + 345 │ │ │ │ │ +349 void pop() { │ │ │ │ │ + 350 if (_actstack.empty()) │ │ │ │ │ + 351 DUNE_THROW(DebugStreamError, "No previous activation setting!"); │ │ │ │ │ + 352 │ │ │ │ │ + 353 _active = _actstack.top(); │ │ │ │ │ + 354 _actstack.pop(); │ │ │ │ │ + 355 } │ │ │ │ │ + 356 │ │ │ │ │ +363 bool active() const { │ │ │ │ │ + 364 return activator::value && _active; │ │ │ │ │ + 365 } │ │ │ │ │ + 366 │ │ │ │ │ +371 void attach(std::ostream& stream) { │ │ │ │ │ + 372 if (_tied) │ │ │ │ │ + 373 DUNE_THROW(DebugStreamError, "Cannot attach to a tied stream!"); │ │ │ │ │ + 374 │ │ │ │ │ + 375 StreamWrap* newcurr = new StreamWrap(stream); │ │ │ │ │ + 376 newcurr->next = current; │ │ │ │ │ + 377 current = newcurr; │ │ │ │ │ + 378 } │ │ │ │ │ + 379 │ │ │ │ │ +383 void detach() { │ │ │ │ │ + 384 if (current->next == 0) │ │ │ │ │ + 385 DUNE_THROW(DebugStreamError, "Cannot detach initial stream!"); │ │ │ │ │ + 386 if (_tied) │ │ │ │ │ + 387 DUNE_THROW(DebugStreamError, "Cannot detach a tied stream!"); │ │ │ │ │ + 388 │ │ │ │ │ + 389 StreamWrap* old = current; │ │ │ │ │ + 390 current = current->next; │ │ │ │ │ + 391 delete old; │ │ │ │ │ + 392 } │ │ │ │ │ + 393 │ │ │ │ │ +397 void tie(DebugStreamState& to) { │ │ │ │ │ + 398 if (to._tied) │ │ │ │ │ + 399 DUNE_THROW(DebugStreamError, "Cannot tie to an already tied stream!"); │ │ │ │ │ + 400 if (_tied) │ │ │ │ │ + 401 DUNE_THROW(DebugStreamError, "Stream already tied: untie first!"); │ │ │ │ │ + 402 │ │ │ │ │ + 403 _tied = true; │ │ │ │ │ + 404 tiedstate = &to; │ │ │ │ │ + 405 │ │ │ │ │ + 406 // tell master class │ │ │ │ │ + 407 tiedstate->_tied_streams++; │ │ │ │ │ + 408 } │ │ │ │ │ + 409 │ │ │ │ │ +413 void untie() { │ │ │ │ │ + 414 if(! _tied) │ │ │ │ │ + 415 DUNE_THROW(DebugStreamError, "Cannot untie, stream is not tied!"); │ │ │ │ │ + 416 │ │ │ │ │ + 417 tiedstate->_tied_streams--; │ │ │ │ │ + 418 _tied = false; │ │ │ │ │ + 419 tiedstate = 0; │ │ │ │ │ + 420 } │ │ │ │ │ + 421 │ │ │ │ │ + 422 private: │ │ │ │ │ + 424 DebugStreamState* tiedstate; │ │ │ │ │ + 425 │ │ │ │ │ + 430 std::stack _actstack; │ │ │ │ │ + 431 }; │ │ │ │ │ + 432 │ │ │ │ │ + 434} │ │ │ │ │ + 435 │ │ │ │ │ + 436 │ │ │ │ │ + 437#endif │ │ │ │ │ +exceptions.hh │ │ │ │ │ +A few common exception classes. │ │ │ │ │ +Dune::StreamWrap::StreamWrap │ │ │ │ │ +StreamWrap(std::ostream &_out) │ │ │ │ │ +Definition: debugstream.hh:152 │ │ │ │ │ +Dune::DebugStream::DebugStream │ │ │ │ │ +DebugStream(std::ostream &out=std::cerr) │ │ │ │ │ +Create a DebugStream and set initial output stream. │ │ │ │ │ +Definition: debugstream.hh:199 │ │ │ │ │ +Dune::DebugStream::untie │ │ │ │ │ +void untie() │ │ │ │ │ +Untie stream. │ │ │ │ │ +Definition: debugstream.hh:413 │ │ │ │ │ +Dune::DebugStream::flush │ │ │ │ │ +DebugStream & flush() │ │ │ │ │ +pass on flush to underlying output stream │ │ │ │ │ +Definition: debugstream.hh:320 │ │ │ │ │ +Dune::DebugStream::attach │ │ │ │ │ +void attach(std::ostream &stream) │ │ │ │ │ +set output to a different stream. │ │ │ │ │ +Definition: debugstream.hh:371 │ │ │ │ │ +Dune::DebugStream::detach │ │ │ │ │ +void detach() │ │ │ │ │ +detach current output stream and restore to previous stream │ │ │ │ │ +Definition: debugstream.hh:383 │ │ │ │ │ +Dune::common_bits::value │ │ │ │ │ +static constexpr bool value │ │ │ │ │ +Definition: debugstream.hh:143 │ │ │ │ │ +Dune::StreamWrap::out │ │ │ │ │ +std::ostream & out │ │ │ │ │ +Definition: debugstream.hh:153 │ │ │ │ │ +Dune::DebugStream::pop │ │ │ │ │ +void pop() │ │ │ │ │ +restore previously set activation flag │ │ │ │ │ +Definition: debugstream.hh:349 │ │ │ │ │ +Dune::DebugStream::active │ │ │ │ │ +bool active() const │ │ │ │ │ +reports if this stream will produce output │ │ │ │ │ +Definition: debugstream.hh:363 │ │ │ │ │ +Dune::DebugStreamState::_active │ │ │ │ │ +bool _active │ │ │ │ │ +flag to switch output during runtime │ │ │ │ │ +Definition: debugstream.hh:165 │ │ │ │ │ +Dune::DebugStreamState::_tied_streams │ │ │ │ │ +unsigned int _tied_streams │ │ │ │ │ +how many streams are tied to this state │ │ │ │ │ +Definition: debugstream.hh:171 │ │ │ │ │ +Dune::DebugStream::tie │ │ │ │ │ +void tie(DebugStreamState &to) │ │ │ │ │ +Tie a stream to this one. │ │ │ │ │ +Definition: debugstream.hh:397 │ │ │ │ │ +Dune::DebugStream::push │ │ │ │ │ +void push(bool b) │ │ │ │ │ +set activation flag and store old value │ │ │ │ │ +Definition: debugstream.hh:335 │ │ │ │ │ +Dune::DebugLevel │ │ │ │ │ +unsigned int DebugLevel │ │ │ │ │ +Type for debug levels. │ │ │ │ │ +Definition: debugstream.hh:118 │ │ │ │ │ +Dune::DebugStreamState::_tied │ │ │ │ │ +bool _tied │ │ │ │ │ +are we tied to another DebugStream? │ │ │ │ │ +Definition: debugstream.hh:168 │ │ │ │ │ +Dune::DebugStreamState::current │ │ │ │ │ +StreamWrap * current │ │ │ │ │ +current output stream and link to possibly pushed old output streams │ │ │ │ │ +Definition: debugstream.hh:162 │ │ │ │ │ +Dune::DebugStream::operator<< │ │ │ │ │ +DebugStream & operator<<(const T data) │ │ │ │ │ +Generic types are passed on to current output stream. │ │ │ │ │ +Definition: debugstream.hh:267 │ │ │ │ │ +Dune::greater_or_equal::value │ │ │ │ │ +static constexpr bool value │ │ │ │ │ +Definition: debugstream.hh:131 │ │ │ │ │ +Dune::DebugStream::~DebugStream │ │ │ │ │ +~DebugStream() │ │ │ │ │ +Destroy stream. │ │ │ │ │ +Definition: debugstream.hh:243 │ │ │ │ │ +Dune::DebugStream::DebugStream │ │ │ │ │ +DebugStream(DebugStreamState &master, std::ostream &fallback=std::cerr) │ │ │ │ │ +Create a DebugStream and directly tie to another DebugStream. │ │ │ │ │ +Definition: debugstream.hh:219 │ │ │ │ │ +Dune::DebugStream::operator<< │ │ │ │ │ +DebugStream & operator<<(const int data) │ │ │ │ │ +explicit specialization so that enums can be printed │ │ │ │ │ +Definition: debugstream.hh:289 │ │ │ │ │ +Dune::DebugStream::operator<< │ │ │ │ │ +DebugStream & operator<<(std::ostream &(*f)(std::ostream &)) │ │ │ │ │ +pass on manipulators to underlying output stream │ │ │ │ │ +Definition: debugstream.hh:305 │ │ │ │ │ +Dune::StreamWrap::next │ │ │ │ │ +StreamWrap * next │ │ │ │ │ +Definition: debugstream.hh:154 │ │ │ │ │ +DUNE_THROW │ │ │ │ │ +#define DUNE_THROW(E, m) │ │ │ │ │ +Definition: exceptions.hh:218 │ │ │ │ │ +Dune::Simd::Overloads::mask │ │ │ │ │ +Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v) │ │ │ │ │ +implements Simd::mask() │ │ │ │ │ +Definition: defaults.hh:153 │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::Exception │ │ │ │ │ -Base class for Dune-Exceptions. │ │ │ │ │ -Definition: exceptions.hh:96 │ │ │ │ │ -Dune::ExceptionHook │ │ │ │ │ -Base class to add a hook to the Dune::Exception. │ │ │ │ │ -Definition: exceptions.hh:174 │ │ │ │ │ +Dune::greater_or_equal │ │ │ │ │ +Greater or equal template test. │ │ │ │ │ +Definition: debugstream.hh:130 │ │ │ │ │ +Dune::common_bits │ │ │ │ │ +activate if current and mask have common bits switched on. │ │ │ │ │ +Definition: debugstream.hh:142 │ │ │ │ │ +Dune::DebugStreamError │ │ │ │ │ +standard exception for the debugstream │ │ │ │ │ +Definition: debugstream.hh:148 │ │ │ │ │ +Dune::StreamWrap │ │ │ │ │ +Definition: debugstream.hh:150 │ │ │ │ │ +Dune::DebugStreamState │ │ │ │ │ +Intermediate class to implement tie-operation of DebugStream. │ │ │ │ │ +Definition: debugstream.hh:158 │ │ │ │ │ +Dune::DebugStream │ │ │ │ │ +Generic class to implement debug output streams. │ │ │ │ │ +Definition: debugstream.hh:192 │ │ │ │ │ Dune::IOError │ │ │ │ │ Default exception class for I/O errors. │ │ │ │ │ Definition: exceptions.hh:231 │ │ │ │ │ -Dune::MathError │ │ │ │ │ -Default exception class for mathematical errors. │ │ │ │ │ -Definition: exceptions.hh:241 │ │ │ │ │ -Dune::RangeError │ │ │ │ │ -Default exception class for range errors. │ │ │ │ │ -Definition: exceptions.hh:254 │ │ │ │ │ -Dune::NotImplemented │ │ │ │ │ -Default exception for dummy implementations. │ │ │ │ │ -Definition: exceptions.hh:263 │ │ │ │ │ -Dune::SystemError │ │ │ │ │ -Default exception class for OS errors. │ │ │ │ │ -Definition: exceptions.hh:271 │ │ │ │ │ -Dune::OutOfMemoryError │ │ │ │ │ -Default exception if memory allocation fails. │ │ │ │ │ -Definition: exceptions.hh:276 │ │ │ │ │ -Dune::InvalidStateException │ │ │ │ │ -Default exception if a function was called while the object is not in a valid │ │ │ │ │ -state for that function... │ │ │ │ │ -Definition: exceptions.hh:281 │ │ │ │ │ -Dune::ParallelError │ │ │ │ │ -Default exception if an error in the parallel communication of the program │ │ │ │ │ -occurred. │ │ │ │ │ -Definition: exceptions.hh:287 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00188.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: debugalign.hh File Reference │ │ │ │ +dune-common: hash.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -66,376 +66,175 @@ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ Macros | │ │ │ │ -Typedefs | │ │ │ │ -Functions | │ │ │ │ -Variables
│ │ │ │ -
debugalign.hh File Reference
│ │ │ │ +Functions
│ │ │ │ +
hash.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ -
#include <algorithm>
│ │ │ │ -#include <cassert>
│ │ │ │ -#include <cmath>
│ │ │ │ -#include <complex>
│ │ │ │ -#include <cstddef>
│ │ │ │ -#include <cstdint>
│ │ │ │ -#include <cstdlib>
│ │ │ │ -#include <functional>
│ │ │ │ -#include <istream>
│ │ │ │ -#include <ostream>
│ │ │ │ -#include <type_traits>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <dune/common/classname.hh>
│ │ │ │ -#include <dune/common/indices.hh>
│ │ │ │ -#include <dune/common/simd/base.hh>
│ │ │ │ -#include <dune/common/simd/defaults.hh>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ + │ │ │ │ +

Support for calculating hash values of objects. │ │ │ │ +More...

│ │ │ │ +
#include <functional>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

class  Dune::AlignedBase< align, Impl >
 CRTP base mixin class to check alignment. More...
 
struct  Dune::IsNumber< AlignedNumberImpl::AlignedNumber< T, align > >
 
class  Dune::AlignedNumberImpl::AlignedNumber< T, align >
 aligned wrappers for arithmetic types More...
 
struct  Dune::Simd::Overloads::ScalarType< AlignedNumber< T, align > >
 
struct  Dune::Simd::Overloads::RebindType< U, AlignedNumber< T, align > >
 
struct  Dune::Simd::Overloads::LaneCount< AlignedNumber< T, align > >
struct  Dune::hash< T >
 Functor for hashing objects of type T. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::AlignedNumberImpl
 
namespace  Dune::Simd
 Namespace for vectorization interface functions used by library developers.
 
namespace  Dune::Simd::Overloads
 Namespace for the overloads and specializations that make up a SIMD implementation.
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Macros

#define DUNE_ASSIGN_OP(OP)
 
#define DUNE_BINARY_OP(OP)
 
#define DUNE_UNARY_FUNC(name)
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Typedefs

using Dune::ViolatedAlignmentHandler = std::function< void(const char *, std::size_t, const void *)>
 type of the handler called by violatedAlignment() More...
 
#define DUNE_DEFINE_HASH(template_args, type)
 Defines the required struct specialization to make type hashable via Dune::hash. More...
 
#define DUNE_HASH_TEMPLATE_ARGS(...)
 Wrapper macro for the template arguments in DUNE_DEFINE_HASH. More...
 
#define DUNE_HASH_TYPE(...)
 Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH. More...
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -

│ │ │ │ Functions

ViolatedAlignmentHandler & Dune::violatedAlignmentHandler ()
 access the handler called by violatedAlignment() More...
 
void Dune::violatedAlignment (const char *className, std::size_t expectedAlignment, const void *address)
 called when an alignment violation is detected More...
 
bool Dune::isAligned (const void *p, std::size_t align)
 check whether an address conforms to the given alignment More...
 
template<std::size_t align = debugAlignment, class T >
AlignedNumber< T, align > Dune::aligned (T value)
 align a value to a certain alignment More...
 
 Dune::AlignedNumberImpl::DUNE_BINARY_OP (+)
 
 Dune::AlignedNumberImpl::DUNE_BINARY_OP (-)
 
DUNE_BINARY_OP * Dune::AlignedNumberImpl::DUNE_BINARY_OP (/);DUNE_BINARY_OP(%
 
DUNE_BINARY_OP^ Dune::AlignedNumberImpl::DUNE_BINARY_OP (&);DUNE_BINARY_OP(|
 
 Dune::AlignedNumberImpl::DUNE_BINARY_OP (<<)
 
 Dune::AlignedNumberImpl::DUNE_BINARY_OP (> >)
 
 Dune::AlignedNumberImpl::DUNE_BINARY_OP (==)
 
 Dune::AlignedNumberImpl::DUNE_BINARY_OP (!=)
 
 Dune::AlignedNumberImpl::DUNE_BINARY_OP (<=)
 
 Dune::AlignedNumberImpl::DUNE_BINARY_OP (>=)
 
DUNE_BINARY_OP && Dune::AlignedNumberImpl::DUNE_BINARY_OP (||);#define DUNE_UNARY_FUNC(name) DUNE_UNARY_FUNC(abs
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (acos)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (acosh)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (asin)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (asinh)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (atan)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (atanh)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (cbrt)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (ceil)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (cos)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (cosh)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (erf)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (erfc)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (exp)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (exp2)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (expm1)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (fabs)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (floor)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (ilogb)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (lgamma)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (llrint)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (llround)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (log)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (log10)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (log1p)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (log2)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (logb)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (lrint)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (lround)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (nearbyint)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (rint)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (round)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (sin)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (sinh)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (sqrt)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (tan)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (tanh)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (tgamma)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (trunc)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (isfinite)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (isinf)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (isnan)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (isnormal)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (signbit)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (real)
 
template<class T , std::size_t align>
auto Dune::AlignedNumberImpl::max (const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
 
template<class T , std::size_t align>
auto Dune::AlignedNumberImpl::max (const T &a, const AlignedNumber< T, align > &b)
 
template<class T , std::size_t align>
auto Dune::AlignedNumberImpl::max (const AlignedNumber< T, align > &a, const T &b)
 
template<class T , std::size_t align>
auto Dune::AlignedNumberImpl::min (const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
 
template<class T , std::size_t align>
auto Dune::AlignedNumberImpl::min (const T &a, const AlignedNumber< T, align > &b)
 
template<class T , std::size_t align>
auto Dune::AlignedNumberImpl::min (const AlignedNumber< T, align > &a, const T &b)
 
template<class T , std::size_t align>
AlignedNumber< T, align > Dune::cond (const AlignedNumber< bool, align > &b, const AlignedNumber< T, align > &v1, const AlignedNumber< T, align > &v2)
 
template<class T , std::size_t align>
Dune::max_value (const AlignedNumber< T, align > &val)
 
template<class T , std::size_t align>
Dune::min_value (const AlignedNumber< T, align > &val)
 
template<std::size_t align>
bool Dune::any_true (const AlignedNumber< bool, align > &val)
 
template<std::size_t align>
bool Dune::all_true (const AlignedNumber< bool, align > &val)
 
template<class T , std::size_t align>
T & Dune::Simd::Overloads::lane (ADLTag< 5 >, std::size_t l, AlignedNumber< T, align > &v)
 
template<class T , std::size_t align>
Dune::Simd::Overloads::lane (ADLTag< 5 >, std::size_t l, const AlignedNumber< T, align > &v)
 
template<class T , std::size_t align>
const AlignedNumber< T, align > & Dune::Simd::Overloads::cond (ADLTag< 5 >, AlignedNumber< bool, align > mask, const AlignedNumber< T, align > &ifTrue, const AlignedNumber< T, align > &ifFalse)
 
template<std::size_t align>
bool Dune::Simd::Overloads::anyTrue (ADLTag< 5 >, const AlignedNumber< bool, align > &mask)
 
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ -Variables

static constexpr auto Dune::debugAlignment = 2*alignof(std::max_align_t)
 an alignment large enough to trigger alignment errors More...
 
template<typename T >
void Dune::hash_combine (std::size_t &seed, const T &arg)
 Calculates the hash value of arg and combines it in-place with seed. More...
 
template<typename It >
std::size_t Dune::hash_range (It first, It last)
 Hashes all elements in the range [first,last) and returns the combined hash. More...
 
template<typename It >
void Dune::hash_range (std::size_t &seed, It first, It last)
 Hashes all elements in the range [first,last) and combines the hashes in-place with seed. More...
 
│ │ │ │ -

Macro Definition Documentation

│ │ │ │ - │ │ │ │ -

◆ DUNE_ASSIGN_OP

│ │ │ │ +

Detailed Description

│ │ │ │ +

Support for calculating hash values of objects.

│ │ │ │ +

This file provides the functor Dune::hash to calculate hash values and some infrastructure to simplify extending Dune::hash for user-defined types, independent of the actual underlying implementation.

│ │ │ │ +

Macro Definition Documentation

│ │ │ │ + │ │ │ │ +

◆ DUNE_DEFINE_HASH

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ │ │ │ │
#define DUNE_ASSIGN_OP#define DUNE_DEFINE_HASH( OP)template_args,
 type 
)
│ │ │ │
│ │ │ │ -Value:
template<class U, std::size_t uAlign, \
│ │ │ │ -
class = std::enable_if_t< \
│ │ │ │ -
( uAlign <= align && \
│ │ │ │ -
sizeof(std::declval<T&>() OP std::declval<U>()) ) \
│ │ │ │ -
> > \
│ │ │ │ -
AlignedNumber &operator OP(const AlignedNumber<U, uAlign> &u) \
│ │ │ │ -
{ \
│ │ │ │ -
value_ OP U(u); \
│ │ │ │ -
return *this; \
│ │ │ │ -
} \
│ │ │ │ -
\
│ │ │ │ -
template<class U, \
│ │ │ │ -
class = std::void_t<decltype(std::declval<T&>() OP \
│ │ │ │ -
std::declval<U>())> > \
│ │ │ │ -
AlignedNumber &operator OP(const U &u) \
│ │ │ │ -
{ \
│ │ │ │ -
value_ OP u; \
│ │ │ │ -
return *this; \
│ │ │ │ -
} \
│ │ │ │ -
\
│ │ │ │ -
static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ -
STL namespace.
│ │ │ │ -
│ │ │ │ + │ │ │ │ +

Defines the required struct specialization to make type hashable via Dune::hash.

│ │ │ │ +

In order to calculate the hash, operator() of the generated specialization will return the result of an unqualified call to the global function hash_value(const type&). As the call is not qualified, the function will be found using argument-dependent lookup, allowing implementors to conveniently place it inside the class body.

│ │ │ │ +

Consider the following type:

│ │ │ │ +
namespace ns {
│ │ │ │ +
template<typename A, int i>
│ │ │ │ +
class Foo
│ │ │ │ +
{
│ │ │ │ +
...
│ │ │ │ +
};
│ │ │ │ +
}
│ │ │ │ +

In order to add support for Dune::hash, you need to extend the definition like this:

│ │ │ │ +
namespace ns {
│ │ │ │ +
template<typename A, int i>
│ │ │ │ +
class Foo
│ │ │ │ +
{
│ │ │ │ +
...
│ │ │ │ +
// The keyword "friend" turns this into a global function that is a friend of Foo.
│ │ │ │ +
inline friend std::size_t hash_value(const Foo& arg)
│ │ │ │ +
{
│ │ │ │ +
return ...;
│ │ │ │ +
}
│ │ │ │ +
};
│ │ │ │ +
}
│ │ │ │ +
│ │ │ │ +
// Define hash struct specialization
│ │ │ │ + │ │ │ │ +
#define DUNE_DEFINE_HASH(template_args, type)
Defines the required struct specialization to make type hashable via Dune::hash.
Definition: hash.hh:100
│ │ │ │ +
#define DUNE_HASH_TYPE(...)
Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH.
Definition: hash.hh:117
│ │ │ │ +
#define DUNE_HASH_TEMPLATE_ARGS(...)
Wrapper macro for the template arguments in DUNE_DEFINE_HASH.
Definition: hash.hh:109
│ │ │ │ +
Warning
As the specialization has to be placed in the original namespace of the hash struct (e.g. std), this macro must be called from the global namespace!
│ │ │ │ +
Parameters
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
template_argsThe template arguments required by the hash struct specialization, wrapped in a call to DUNE_HASH_TEMPLATE_ARGS. If this is a complete specialization, call DUNE_HASH_TEMPLATE_ARGS without arguments.
typeThe exact type of the specialization, wrapped in a call to DUNE_HASH_TYPE.
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

◆ DUNE_BINARY_OP

│ │ │ │ + │ │ │ │ +

◆ DUNE_HASH_TEMPLATE_ARGS

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ │ │ │ │
#define DUNE_BINARY_OP#define DUNE_HASH_TEMPLATE_ARGS( OP)...)
│ │ │ │
│ │ │ │ -Value:
template<class T, std::size_t tAlign, class U, std::size_t uAlign, \
│ │ │ │ -
class = std::void_t<decltype(std::declval<T>() \
│ │ │ │ -
OP std::declval<U>())> > \
│ │ │ │ -
decltype(auto) \
│ │ │ │ -
operator OP(const AlignedNumber<T, tAlign> &t, \
│ │ │ │ -
const AlignedNumber<U, uAlign> &u) \
│ │ │ │ -
{ \
│ │ │ │ -
/* can't use std::max(); not constexpr */ \
│ │ │ │ -
return aligned<(tAlign > uAlign ? tAlign : uAlign)>(T(t) OP U(u)); \
│ │ │ │ -
} \
│ │ │ │ -
\
│ │ │ │ -
template<class T, class U, std::size_t uAlign, \
│ │ │ │ -
class = std::void_t<decltype(std::declval<T>() \
│ │ │ │ -
OP std::declval<U>())> > \
│ │ │ │ -
decltype(auto) \
│ │ │ │ -
operator OP(const T &t, const AlignedNumber<U, uAlign> &u) \
│ │ │ │ -
{ \
│ │ │ │ -
return aligned<uAlign>(t OP U(u)); \
│ │ │ │ -
} \
│ │ │ │ -
\
│ │ │ │ -
template<class T, std::size_t tAlign, class U, \
│ │ │ │ -
class = std::void_t<decltype(std::declval<T>() \
│ │ │ │ -
OP std::declval<U>())> > \
│ │ │ │ -
decltype(auto) \
│ │ │ │ -
operator OP(const AlignedNumber<T, tAlign> &t, const U &u) \
│ │ │ │ -
{ \
│ │ │ │ -
return aligned<tAlign>(T(t) OP u); \
│ │ │ │ -
} \
│ │ │ │ -
\
│ │ │ │ -
static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ -
AlignedNumber< T, align > aligned(T value)
align a value to a certain alignment
Definition: debugalign.hh:101
│ │ │ │ -
│ │ │ │ + │ │ │ │ +

Wrapper macro for the template arguments in DUNE_DEFINE_HASH.

│ │ │ │ +

This macro should always be used as a wrapper for the template arguments when calling DUNE_DEFINE_HASH. It works around some preprocessor limitations when the template arguments contain commas or the list is completely empty.

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

◆ DUNE_UNARY_FUNC

│ │ │ │ + │ │ │ │ +

◆ DUNE_HASH_TYPE

│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ │ │ │ │ - │ │ │ │ + │ │ │ │ │ │ │ │ │ │ │ │
#define DUNE_UNARY_FUNC#define DUNE_HASH_TYPE( name)...)
│ │ │ │
│ │ │ │ -Value:
template<class T, std::size_t align> \
│ │ │ │ -
decltype(auto) name(const AlignedNumber<T, align> &u) \
│ │ │ │ -
{ \
│ │ │ │ -
using std::name; \
│ │ │ │ -
return aligned<align>(name(T(u))); \
│ │ │ │ -
} \
│ │ │ │ -
static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ -
│ │ │ │ + │ │ │ │ +

Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH.

│ │ │ │ +

This macro should always be used as a wrapper for the type of the specialization when calling DUNE_DEFINE_HASH. It works around some preprocessor limitations when the type contains commas.

│ │ │ │ + │ │ │ │
│ │ │ │
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,395 +4,131 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Classes | Namespaces | Macros | Typedefs | Functions | Variables │ │ │ │ │ -debugalign.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces | Macros | Functions │ │ │ │ │ +hash.hh File Reference │ │ │ │ │ +Support for calculating hash values of objects. More... │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ #include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ - class  Dune::AlignedBase<_align,_Impl_> │ │ │ │ │ -  CRTP base mixin class to check alignment. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::IsNumber<_AlignedNumberImpl::AlignedNumber<_T,_align_>_> │ │ │ │ │ -  │ │ │ │ │ - class  Dune::AlignedNumberImpl::AlignedNumber<_T,_align_> │ │ │ │ │ -  aligned wrappers for arithmetic types More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Simd::Overloads::ScalarType<_AlignedNumber<_T,_align_>_> │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Simd::Overloads::RebindType<_U,_AlignedNumber<_T,_align_>_> │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::Simd::Overloads::LaneCount<_AlignedNumber<_T,_align_>_> │ │ │ │ │ +struct  Dune::hash<_T_> │ │ │ │ │ +  Functor for hashing objects of type T. More... │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ -namespace  Dune::AlignedNumberImpl │ │ │ │ │ -  │ │ │ │ │ -namespace  Dune::Simd │ │ │ │ │ -  Namespace for vectorization interface functions used by library │ │ │ │ │ - developers. │ │ │ │ │ -  │ │ │ │ │ -namespace  Dune::Simd::Overloads │ │ │ │ │ -  Namespace for the overloads and specializations that make up a SIMD │ │ │ │ │ - implementation. │ │ │ │ │ -  │ │ │ │ │ Macros │ │ │ │ │ -#define DUNE_ASSIGN_OP(OP) │ │ │ │ │ -  │ │ │ │ │ -#define DUNE_BINARY_OP(OP) │ │ │ │ │ +#define DUNE_DEFINE_HASH(template_args, type) │ │ │ │ │ +  Defines the required struct specialization to make type hashable via │ │ │ │ │ + Dune::hash. More... │ │ │ │ │   │ │ │ │ │ -#define DUNE_UNARY_FUNC(name) │ │ │ │ │ +#define DUNE_HASH_TEMPLATE_ARGS(...) │ │ │ │ │ +  Wrapper macro for the template arguments in DUNE_DEFINE_HASH. More... │ │ │ │ │   │ │ │ │ │ - Typedefs │ │ │ │ │ -using Dune::ViolatedAlignmentHandler = std::function< void(const char *, std:: │ │ │ │ │ - size_t, const void *)> │ │ │ │ │ -  type of the handler called by violatedAlignment() More... │ │ │ │ │ +#define DUNE_HASH_TYPE(...) │ │ │ │ │ +  Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH. More... │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ - ViolatedAlignmentHandler & Dune::violatedAlignmentHandler () │ │ │ │ │ -  access the handler called by │ │ │ │ │ - violatedAlignment() More... │ │ │ │ │ -  │ │ │ │ │ - void Dune::violatedAlignment (const char │ │ │ │ │ - *className, std::size_t expectedAlignment, │ │ │ │ │ - const void *address) │ │ │ │ │ -  called when an alignment violation is │ │ │ │ │ - detected More... │ │ │ │ │ -  │ │ │ │ │ - bool Dune::isAligned (const void *p, std::size_t │ │ │ │ │ - align) │ │ │ │ │ -  check whether an address conforms to the │ │ │ │ │ - given alignment More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - AlignedNumber< T, align > Dune::aligned (T value) │ │ │ │ │ -  align a value to a certain alignment More... │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_BINARY_OP (+) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_BINARY_OP (-) │ │ │ │ │ -  │ │ │ │ │ - DUNE_BINARY_OP * Dune::AlignedNumberImpl::DUNE_BINARY_OP (/ │ │ │ │ │ - );DUNE_BINARY_OP(% │ │ │ │ │ -  │ │ │ │ │ - DUNE_BINARY_OP^ Dune::AlignedNumberImpl::DUNE_BINARY_OP │ │ │ │ │ - (&);DUNE_BINARY_OP(| │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_BINARY_OP (<<) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_BINARY_OP (> │ │ │ │ │ - >) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_BINARY_OP (==) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_BINARY_OP (!=) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_BINARY_OP (<=) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_BINARY_OP (>=) │ │ │ │ │ -  │ │ │ │ │ - DUNE_BINARY_OP && Dune::AlignedNumberImpl::DUNE_BINARY_OP │ │ │ │ │ - (||);#define DUNE_UNARY_FUNC(name) │ │ │ │ │ - DUNE_UNARY_FUNC(abs │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (acos) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (acosh) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (asin) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (asinh) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (atan) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (atanh) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (cbrt) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (ceil) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (cos) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (cosh) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (erf) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (erfc) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (exp) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (exp2) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (expm1) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (fabs) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (floor) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (ilogb) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (lgamma) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (llrint) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (llround) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (log) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (log10) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (log1p) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (log2) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (logb) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (lrint) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (lround) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (nearbyint) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (rint) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (round) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (sin) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (sinh) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (sqrt) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (tan) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (tanh) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (tgamma) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (trunc) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (isfinite) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (isinf) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (isnan) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (isnormal) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (signbit) │ │ │ │ │ -  │ │ │ │ │ -  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ - (real) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - auto Dune::AlignedNumberImpl::max (const │ │ │ │ │ - AlignedNumber< T, align > &a, const │ │ │ │ │ - AlignedNumber< T, align > &b) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - auto Dune::AlignedNumberImpl::max (const T &a, │ │ │ │ │ - const AlignedNumber< T, align > &b) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - auto Dune::AlignedNumberImpl::max (const │ │ │ │ │ - AlignedNumber< T, align > &a, const T &b) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - auto Dune::AlignedNumberImpl::min (const │ │ │ │ │ - AlignedNumber< T, align > &a, const │ │ │ │ │ - AlignedNumber< T, align > &b) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - auto Dune::AlignedNumberImpl::min (const T &a, │ │ │ │ │ - const AlignedNumber< T, align > &b) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - auto Dune::AlignedNumberImpl::min (const │ │ │ │ │ - AlignedNumber< T, align > &a, const T &b) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - AlignedNumber< T, align > Dune::cond (const AlignedNumber< bool, align │ │ │ │ │ - > &b, const AlignedNumber< T, align > &v1, │ │ │ │ │ - const AlignedNumber< T, align > &v2) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - T Dune::max_value (const AlignedNumber< T, │ │ │ │ │ - align > &val) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - T Dune::min_value (const AlignedNumber< T, │ │ │ │ │ - align > &val) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - bool Dune::any_true (const AlignedNumber< bool, │ │ │ │ │ - align > &val) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - bool Dune::all_true (const AlignedNumber< bool, │ │ │ │ │ - align > &val) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - T & Dune::Simd::Overloads::lane (ADLTag< 5 >, │ │ │ │ │ - std::size_t l, AlignedNumber< T, align > &v) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - T Dune::Simd::Overloads::lane (ADLTag< 5 >, │ │ │ │ │ - std::size_t l, const AlignedNumber< T, align │ │ │ │ │ - > &v) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -const AlignedNumber< T, align > & Dune::Simd::Overloads::cond (ADLTag< 5 >, │ │ │ │ │ - AlignedNumber< bool, align > mask, const │ │ │ │ │ - AlignedNumber< T, align > &ifTrue, const │ │ │ │ │ - AlignedNumber< T, align > &ifFalse) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - bool Dune::Simd::Overloads::anyTrue (ADLTag< 5 >, │ │ │ │ │ - const AlignedNumber< bool, align > &mask) │ │ │ │ │ -  │ │ │ │ │ - Variables │ │ │ │ │ -static constexpr auto Dune::debugAlignment = 2*alignof(std::max_align_t) │ │ │ │ │ -  an alignment large enough to trigger alignment errors │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ +template │ │ │ │ │ + void Dune::hash_combine (std::size_t &seed, const T &arg) │ │ │ │ │ +  Calculates the hash value of arg and combines it in-place with │ │ │ │ │ + seed. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +std::size_t Dune::hash_range (It first, It last) │ │ │ │ │ +  Hashes all elements in the range [first,last) and returns the │ │ │ │ │ + combined hash. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + void Dune::hash_range (std::size_t &seed, It first, It last) │ │ │ │ │ +  Hashes all elements in the range [first,last) and combines the │ │ │ │ │ + hashes in-place with seed. More... │ │ │ │ │ +  │ │ │ │ │ +***** Detailed Description ***** │ │ │ │ │ +Support for calculating hash values of objects. │ │ │ │ │ +This file provides the functor Dune::hash to calculate hash values and some │ │ │ │ │ +infrastructure to simplify extending Dune::hash for user-defined types, │ │ │ │ │ +independent of the actual underlying implementation. │ │ │ │ │ ***** Macro Definition Documentation ***** │ │ │ │ │ -***** ◆ DUNE_ASSIGN_OP ***** │ │ │ │ │ -#define DUNE_ASSIGN_OP (  OP ) │ │ │ │ │ -Value: │ │ │ │ │ -template() OP std::declval()) ) \ │ │ │ │ │ -> > \ │ │ │ │ │ -AlignedNumber &operator OP(const AlignedNumber &u) \ │ │ │ │ │ -{ \ │ │ │ │ │ -value_ OP U(u); \ │ │ │ │ │ -return *this; \ │ │ │ │ │ -} \ │ │ │ │ │ -\ │ │ │ │ │ -template() OP \ │ │ │ │ │ -std::declval())> > \ │ │ │ │ │ -AlignedNumber &operator OP(const U &u) \ │ │ │ │ │ -{ \ │ │ │ │ │ -value_ OP u; \ │ │ │ │ │ -return *this; \ │ │ │ │ │ -} \ │ │ │ │ │ -\ │ │ │ │ │ -static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ -std │ │ │ │ │ -STL namespace. │ │ │ │ │ -***** ◆ DUNE_BINARY_OP ***** │ │ │ │ │ -#define DUNE_BINARY_OP (  OP ) │ │ │ │ │ -Value: │ │ │ │ │ -template() \ │ │ │ │ │ -OP std::declval())> > \ │ │ │ │ │ -decltype(auto) \ │ │ │ │ │ -operator OP(const AlignedNumber &t, \ │ │ │ │ │ -const AlignedNumber &u) \ │ │ │ │ │ -{ \ │ │ │ │ │ -/* can't use std::max(); not constexpr */ \ │ │ │ │ │ -return aligned<(tAlign > uAlign ? tAlign : uAlign)>(T(t) OP U(u)); \ │ │ │ │ │ -} \ │ │ │ │ │ -\ │ │ │ │ │ -template() \ │ │ │ │ │ -OP std::declval())> > \ │ │ │ │ │ -decltype(auto) \ │ │ │ │ │ -operator OP(const T &t, const AlignedNumber &u) \ │ │ │ │ │ -{ \ │ │ │ │ │ -return aligned(t OP U(u)); \ │ │ │ │ │ -} \ │ │ │ │ │ -\ │ │ │ │ │ -template() \ │ │ │ │ │ -OP std::declval())> > \ │ │ │ │ │ -decltype(auto) \ │ │ │ │ │ -operator OP(const AlignedNumber &t, const U &u) \ │ │ │ │ │ -{ \ │ │ │ │ │ -return aligned(T(t) OP u); \ │ │ │ │ │ -} \ │ │ │ │ │ -\ │ │ │ │ │ -static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ -Dune::aligned │ │ │ │ │ -AlignedNumber< T, align > aligned(T value) │ │ │ │ │ -align a value to a certain alignment │ │ │ │ │ -Definition: debugalign.hh:101 │ │ │ │ │ -***** ◆ DUNE_UNARY_FUNC ***** │ │ │ │ │ -#define DUNE_UNARY_FUNC (  name ) │ │ │ │ │ -Value: │ │ │ │ │ -template \ │ │ │ │ │ -decltype(auto) name(const AlignedNumber &u) \ │ │ │ │ │ -{ \ │ │ │ │ │ -using std::name; \ │ │ │ │ │ -return aligned(name(T(u))); \ │ │ │ │ │ -} \ │ │ │ │ │ -static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ +***** ◆ DUNE_DEFINE_HASH ***** │ │ │ │ │ +#define DUNE_DEFINE_HASH (  template_args, │ │ │ │ │ +  type  │ │ │ │ │ + ) │ │ │ │ │ +Defines the required struct specialization to make type hashable via Dune:: │ │ │ │ │ +hash. │ │ │ │ │ +In order to calculate the hash, operator() of the generated specialization will │ │ │ │ │ +return the result of an unqualified call to the global function hash_value │ │ │ │ │ +(const type&). As the call is not qualified, the function will be found using │ │ │ │ │ +argument-dependent lookup, allowing implementors to conveniently place it │ │ │ │ │ +inside the class body. │ │ │ │ │ +Consider the following type: │ │ │ │ │ +namespace ns { │ │ │ │ │ +template │ │ │ │ │ +class Foo │ │ │ │ │ +{ │ │ │ │ │ +... │ │ │ │ │ +}; │ │ │ │ │ +} │ │ │ │ │ +In order to add support for Dune::hash, you need to extend the definition like │ │ │ │ │ +this: │ │ │ │ │ +namespace ns { │ │ │ │ │ +template │ │ │ │ │ +class Foo │ │ │ │ │ +{ │ │ │ │ │ +... │ │ │ │ │ +// The keyword "friend" turns this into a global function that is a friend of │ │ │ │ │ +Foo. │ │ │ │ │ +inline friend std::size_t hash_value(const Foo& arg) │ │ │ │ │ +{ │ │ │ │ │ +return ...; │ │ │ │ │ +} │ │ │ │ │ +}; │ │ │ │ │ +} │ │ │ │ │ +// Define hash struct specialization │ │ │ │ │ +DUNE_DEFINE_HASH(DUNE_HASH_TEMPLATE_ARGS(typename A, int i),DUNE_HASH_TYPE │ │ │ │ │ +(Foo)) │ │ │ │ │ +DUNE_DEFINE_HASH │ │ │ │ │ +#define DUNE_DEFINE_HASH(template_args, type) │ │ │ │ │ +Defines the required struct specialization to make type hashable via Dune:: │ │ │ │ │ +hash. │ │ │ │ │ +Definition: hash.hh:100 │ │ │ │ │ +DUNE_HASH_TYPE │ │ │ │ │ +#define DUNE_HASH_TYPE(...) │ │ │ │ │ +Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH. │ │ │ │ │ +Definition: hash.hh:117 │ │ │ │ │ +DUNE_HASH_TEMPLATE_ARGS │ │ │ │ │ +#define DUNE_HASH_TEMPLATE_ARGS(...) │ │ │ │ │ +Wrapper macro for the template arguments in DUNE_DEFINE_HASH. │ │ │ │ │ +Definition: hash.hh:109 │ │ │ │ │ + Warning │ │ │ │ │ + As the specialization has to be placed in the original namespace of the │ │ │ │ │ + hash struct (e.g. std), this macro must be called from the global │ │ │ │ │ + namespace! │ │ │ │ │ + Parameters │ │ │ │ │ + The template arguments required by the hash struct │ │ │ │ │ + specialization, wrapped in a call to │ │ │ │ │ + template_args DUNE_HASH_TEMPLATE_ARGS. If this is a complete │ │ │ │ │ + specialization, call DUNE_HASH_TEMPLATE_ARGS without │ │ │ │ │ + arguments. │ │ │ │ │ + type The exact type of the specialization, wrapped in a call to │ │ │ │ │ + DUNE_HASH_TYPE. │ │ │ │ │ +***** ◆ DUNE_HASH_TEMPLATE_ARGS ***** │ │ │ │ │ +#define DUNE_HASH_TEMPLATE_ARGS (  ... ) │ │ │ │ │ +Wrapper macro for the template arguments in DUNE_DEFINE_HASH. │ │ │ │ │ +This macro should always be used as a wrapper for the template arguments when │ │ │ │ │ +calling DUNE_DEFINE_HASH. It works around some preprocessor limitations when │ │ │ │ │ +the template arguments contain commas or the list is completely empty. │ │ │ │ │ +***** ◆ DUNE_HASH_TYPE ***** │ │ │ │ │ +#define DUNE_HASH_TYPE (  ... ) │ │ │ │ │ +Wrapper macro for the type to be hashed in DUNE_DEFINE_HASH. │ │ │ │ │ +This macro should always be used as a wrapper for the type of the │ │ │ │ │ +specialization when calling DUNE_DEFINE_HASH. It works around some preprocessor │ │ │ │ │ +limitations when the type contains commas. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00188_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: debugalign.hh Source File │ │ │ │ +dune-common: hash.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,613 +62,279 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
debugalign.hh
│ │ │ │ +
hash.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 (C) 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_DEBUGALIGN_HH
│ │ │ │ -
6#define DUNE_DEBUGALIGN_HH
│ │ │ │ +
5#ifndef DUNE_COMMON_HASH_HH
│ │ │ │ +
6#define DUNE_COMMON_HASH_HH
│ │ │ │
7
│ │ │ │ -
8#include <algorithm>
│ │ │ │ -
9#include <cassert>
│ │ │ │ -
10#include <cmath>
│ │ │ │ -
11#include <complex>
│ │ │ │ -
12#include <cstddef>
│ │ │ │ -
13#include <cstdint>
│ │ │ │ -
14#include <cstdlib> // abs
│ │ │ │ -
15#include <functional>
│ │ │ │ -
16#include <istream>
│ │ │ │ -
17#include <ostream>
│ │ │ │ -
18#include <type_traits>
│ │ │ │ -
19#include <utility>
│ │ │ │ -
20
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
26
│ │ │ │ -
27namespace Dune {
│ │ │ │ -
28
│ │ │ │ - │ │ │ │ -
31 std::function<void(const char*, std::size_t, const void*)>;
│ │ │ │ -
32
│ │ │ │ -
34
│ │ │ │ - │ │ │ │ +
8#include <functional>
│ │ │ │ +
9
│ │ │ │ + │ │ │ │ +
11
│ │ │ │ +
24// ********************************************************************************
│ │ │ │ +
25// Doxygen documentation
│ │ │ │ +
26// ********************************************************************************
│ │ │ │ +
27
│ │ │ │ +
28#ifdef DOXYGEN
│ │ │ │ +
29
│ │ │ │ +
30namespace Dune {
│ │ │ │ +
31
│ │ │ │ +
33
│ │ │ │ +
38 template<typename T>
│ │ │ │ +
39 struct hash
│ │ │ │ +
40 {
│ │ │ │
41
│ │ │ │ -
43
│ │ │ │ -
52 void violatedAlignment(const char *className, std::size_t expectedAlignment,
│ │ │ │ -
53 const void *address);
│ │ │ │ -
54
│ │ │ │ -
56 inline bool isAligned(const void *p, std::size_t align)
│ │ │ │ -
57 {
│ │ │ │ -
58 // a more portable way to do this would be to abuse std::align(), but that
│ │ │ │ -
59 // isn't supported by g++-4.9 yet
│ │ │ │ -
60 return std::uintptr_t(p) % align == 0;
│ │ │ │ -
61 }
│ │ │ │ -
62
│ │ │ │ -
64 template<std::size_t align, class Impl>
│ │ │ │ -
65 class alignas(align) AlignedBase
│ │ │ │ -
66 {
│ │ │ │ -
67 void checkAlignment() const
│ │ │ │ -
68 {
│ │ │ │ -
69 auto pimpl = static_cast<const Impl*>(this);
│ │ │ │ -
70 if(!isAligned(pimpl, align))
│ │ │ │ -
71 violatedAlignment(className<Impl>().c_str(), align, pimpl);
│ │ │ │ -
72 }
│ │ │ │ -
73 public:
│ │ │ │ -
74 AlignedBase() { checkAlignment(); }
│ │ │ │ -
75 AlignedBase(const AlignedBase &) { checkAlignment(); }
│ │ │ │ -
76 AlignedBase(AlignedBase &&) { checkAlignment(); }
│ │ │ │ -
77 ~AlignedBase() { checkAlignment(); }
│ │ │ │ -
78
│ │ │ │ -
79 AlignedBase& operator=(const AlignedBase &) = default;
│ │ │ │ - │ │ │ │ -
81 };
│ │ │ │ -
82
│ │ │ │ -
84 static constexpr auto debugAlignment = 2*alignof(std::max_align_t);
│ │ │ │ -
85
│ │ │ │ -
86 namespace AlignedNumberImpl {
│ │ │ │ -
87
│ │ │ │ -
88 template<class T, std::size_t align = debugAlignment>
│ │ │ │ -
89 class AlignedNumber;
│ │ │ │ -
90
│ │ │ │ -
91 } // namespace AlignedNumberImpl
│ │ │ │ -
92
│ │ │ │ - │ │ │ │ -
94
│ │ │ │ -
95 template<class T, std::size_t align>
│ │ │ │ -
96 struct IsNumber<AlignedNumberImpl::AlignedNumber<T,align>>
│ │ │ │ -
97 : public std::true_type {};
│ │ │ │ -
98
│ │ │ │ -
100 template<std::size_t align = debugAlignment, class T>
│ │ │ │ -
101 AlignedNumber<T, align> aligned(T value) { return { std::move(value) }; }
│ │ │ │ +
43 std::size_t operator()(const T& t) const
│ │ │ │ +
44 {
│ │ │ │ +
45 return hash(t);
│ │ │ │ +
46 }
│ │ │ │ +
47
│ │ │ │ +
48 };
│ │ │ │ +
49
│ │ │ │ +
50}
│ │ │ │ +
51
│ │ │ │ +
53
│ │ │ │ +
100#define DUNE_DEFINE_HASH(template_args,type)
│ │ │ │ +
101
│ │ │ │
102
│ │ │ │ -
103 // The purpose of this namespace is to move the `<cmath>` function overloads
│ │ │ │ -
104 // out of namespace `Dune`. This avoids problems where people called
│ │ │ │ -
105 // e.g. `sqrt(1.0)` inside the `Dune` namespace, without first doing `using
│ │ │ │ -
106 // std::sqrt;`. Without any `Dune::sqrt()`, such a use will find
│ │ │ │ -
107 // `::sqrt()`, but with `Dune::sqrt()` it will find only `Dune::sqrt()`,
│ │ │ │ -
108 // which does not have an overload for `double`.
│ │ │ │ -
109 namespace AlignedNumberImpl {
│ │ │ │ +
104
│ │ │ │ +
109#define DUNE_HASH_TEMPLATE_ARGS(...)
│ │ │ │
110
│ │ │ │ -
112 template<class T, std::size_t align>
│ │ │ │ - │ │ │ │ -
114 : public AlignedBase<align, AlignedNumber<T, align> >
│ │ │ │ -
115 {
│ │ │ │ -
116 T value_;
│ │ │ │ -
117
│ │ │ │ -
118 public:
│ │ │ │ -
119 AlignedNumber() = default;
│ │ │ │ -
120 AlignedNumber(T value) : value_(std::move(value)) {}
│ │ │ │ -
121 template<class U, std::size_t uAlign,
│ │ │ │ -
122 class = std::enable_if_t<(align >= uAlign) &&
│ │ │ │ -
123 std::is_convertible<U, T>::value> >
│ │ │ │ -
124 AlignedNumber(const AlignedNumber<U, uAlign> &o) : value_(U(o)) {}
│ │ │ │ -
125
│ │ │ │ -
126 // accessors
│ │ │ │ -
127 template<class U,
│ │ │ │ -
128 class = std::enable_if_t<std::is_convertible<T, U>::value> >
│ │ │ │ -
129 explicit operator U() const { return value_; }
│ │ │ │ -
130
│ │ │ │ -
131 const T &value() const { return value_; }
│ │ │ │ -
132 T &value() { return value_; }
│ │ │ │ +
112
│ │ │ │ +
117#define DUNE_HASH_TYPE(...)
│ │ │ │ +
118
│ │ │ │ +
119#else // DOXYGEN - hide all the ugly implementation
│ │ │ │ +
120
│ │ │ │ +
121
│ │ │ │ +
122
│ │ │ │ +
123// ********************************************************************************
│ │ │ │ +
124// C++11 support
│ │ │ │ +
125// ********************************************************************************
│ │ │ │ +
126
│ │ │ │ +
127// import std::hash into Dune namespace
│ │ │ │ +
128namespace Dune {
│ │ │ │ +
129
│ │ │ │ +
130 using std::hash;
│ │ │ │ +
131
│ │ │ │ +
132}
│ │ │ │
133
│ │ │ │ -
134 // I/O
│ │ │ │ -
135 template<class charT, class Traits>
│ │ │ │ -
136 friend std::basic_istream<charT, Traits>&
│ │ │ │ -
137 operator>>(std::basic_istream<charT, Traits>& str, AlignedNumber &u)
│ │ │ │ -
138 {
│ │ │ │ -
139 return str >> u.value_;
│ │ │ │ -
140 }
│ │ │ │ -
141
│ │ │ │ -
142 template<class charT, class Traits>
│ │ │ │ -
143 friend std::basic_ostream<charT, Traits>&
│ │ │ │ -
144 operator<<(std::basic_ostream<charT, Traits>& str,
│ │ │ │ -
145 const AlignedNumber &u)
│ │ │ │ -
146 {
│ │ │ │ -
147 return str << u.value_;
│ │ │ │ -
148 }
│ │ │ │ -
149
│ │ │ │ -
150 // The trick with `template<class U = T, class = std::void_t<expr(U)> >` is
│ │ │ │ -
151 // needed because at least g++-4.9 seems to evaluates a default argument
│ │ │ │ -
152 // in `template<class = std::void_t<expr(T))> >` as soon as possible and will
│ │ │ │ -
153 // error out if `expr(T)` is invalid. E.g. for `expr(T)` =
│ │ │ │ -
154 // `decltype(--std::declval<T&>())`, instantiating `AlignedNumber<bool>`
│ │ │ │ -
155 // will result in an unrecoverable error (`--` cannot be applied to a
│ │ │ │ -
156 // `bool`).
│ │ │ │ -
157
│ │ │ │ -
158 // Increment, decrement
│ │ │ │ -
159 template<class U = T, class = std::void_t<decltype(++std::declval<U&>())> >
│ │ │ │ -
160 AlignedNumber &operator++() { ++value_; return *this; }
│ │ │ │ -
161
│ │ │ │ -
162 template<class U = T, class = std::void_t<decltype(--std::declval<U&>())> >
│ │ │ │ -
163 AlignedNumber &operator--() { --value_; return *this; }
│ │ │ │ -
164
│ │ │ │ -
165 template<class U = T, class = std::void_t<decltype(std::declval<U&>()++)> >
│ │ │ │ -
166 decltype(auto) operator++(int) { return aligned<align>(value_++); }
│ │ │ │ -
167
│ │ │ │ -
168 template<class U = T, class = std::void_t<decltype(std::declval<U&>()--)> >
│ │ │ │ -
169 decltype(auto) operator--(int) { return aligned<align>(value_--); }
│ │ │ │ -
170
│ │ │ │ -
171 // unary operators
│ │ │ │ -
172 template<class U = T,
│ │ │ │ -
173 class = std::void_t<decltype(+std::declval<const U&>())> >
│ │ │ │ -
174 decltype(auto) operator+() const { return aligned<align>(+value_); }
│ │ │ │ -
175
│ │ │ │ -
176 template<class U = T,
│ │ │ │ -
177 class = std::void_t<decltype(-std::declval<const U&>())> >
│ │ │ │ -
178 decltype(auto) operator-() const { return aligned<align>(-value_); }
│ │ │ │ +
134// Macro for defining a std::hash specialization for type.
│ │ │ │ +
135// This should not be called directly. Call DUNE_DEFINE_HASH
│ │ │ │ +
136// instead.
│ │ │ │ +
137#define DUNE_DEFINE_STD_HASH(template_args,type) \
│ │ │ │ +
138 namespace std { \
│ │ │ │ +
139 \
│ │ │ │ +
140 template<template_args> \
│ │ │ │ +
141 struct hash<type> \
│ │ │ │ +
142 { \
│ │ │ │ +
143 \
│ │ │ │ +
144 typedef type argument_type; \
│ │ │ │ +
145 typedef std::size_t result_type; \
│ │ │ │ +
146 \
│ │ │ │ +
147 std::size_t operator()(const type& arg) const \
│ │ │ │ +
148 { \
│ │ │ │ +
149 return hash_value(arg); \
│ │ │ │ +
150 } \
│ │ │ │ +
151 }; \
│ │ │ │ +
152 \
│ │ │ │ +
153 template<template_args> \
│ │ │ │ +
154 struct hash<const type> \
│ │ │ │ +
155 { \
│ │ │ │ +
156 \
│ │ │ │ +
157 typedef type argument_type; \
│ │ │ │ +
158 typedef std::size_t result_type; \
│ │ │ │ +
159 \
│ │ │ │ +
160 std::size_t operator()(const type& arg) const \
│ │ │ │ +
161 { \
│ │ │ │ +
162 return hash_value(arg); \
│ │ │ │ +
163 } \
│ │ │ │ +
164 }; \
│ │ │ │ +
165 \
│ │ │ │ +
166 } \
│ │ │ │ +
167
│ │ │ │ +
168// Wrapper macro for template arguments.
│ │ │ │ +
169// This is required because the template arguments can contain commas,
│ │ │ │ +
170// which will create a macro argument list of unknown length. That in itself
│ │ │ │ +
171// would not be a problem, but DUNE_DEFINE_HASH has to be called with two argument
│ │ │ │ +
172// lists of unknown length. So this macro wraps its arguments with parentheses,
│ │ │ │ +
173// turning it into a single argument. The result is used as the parameter list of
│ │ │ │ +
174// an expansion macro in the calls to the implementation-specific macros
│ │ │ │ +
175// for C++11 and TR1. Noto that technically, this trick is only legal for C++11,
│ │ │ │ +
176// but pretty much every compiler supports variadic macros in C++03 mode, as they
│ │ │ │ +
177// are part of C99.
│ │ │ │ +
178#define DUNE_HASH_TEMPLATE_ARGS(...) (__VA_ARGS__)
│ │ │ │
179
│ │ │ │ -
180 /*
│ │ │ │ -
181 * silence warnings from GCC about using `~` on a bool
│ │ │ │ -
182 * (when instantiated for T=bool)
│ │ │ │ -
183 */
│ │ │ │ -
184#if __GNUC__ >= 7
│ │ │ │ -
185# pragma GCC diagnostic push
│ │ │ │ -
186# pragma GCC diagnostic ignored "-Wbool-operation"
│ │ │ │ -
187#endif
│ │ │ │ -
188#ifdef __clang__
│ │ │ │ -
189# pragma clang diagnostic push
│ │ │ │ -
190# pragma clang diagnostic ignored "-Wbool-operation"
│ │ │ │ -
191#endif
│ │ │ │ -
192 template<class U = T,
│ │ │ │ -
193 class = std::void_t<decltype(~std::declval<const U&>())> >
│ │ │ │ -
194 decltype(auto) operator~() const { return aligned<align>(~value_); }
│ │ │ │ -
195#if __GNUC__ >= 7
│ │ │ │ -
196# pragma GCC diagnostic pop
│ │ │ │ -
197#endif
│ │ │ │ -
198#ifdef __clang__
│ │ │ │ -
199# pragma clang diagnostic pop
│ │ │ │ -
200#endif
│ │ │ │ -
201
│ │ │ │ -
202 template<class U = T,
│ │ │ │ -
203 class = std::void_t<decltype(!std::declval<const U&>())> >
│ │ │ │ -
204 decltype(auto) operator!() const { return aligned<align>(!value_); }
│ │ │ │ -
205
│ │ │ │ -
206 // assignment operators
│ │ │ │ -
207#define DUNE_ASSIGN_OP(OP) \
│ │ │ │ -
208 template<class U, std::size_t uAlign, \
│ │ │ │ -
209 class = std::enable_if_t< \
│ │ │ │ -
210 ( uAlign <= align && \
│ │ │ │ -
211 sizeof(std::declval<T&>() OP std::declval<U>()) ) \
│ │ │ │ -
212 > > \
│ │ │ │ -
213 AlignedNumber &operator OP(const AlignedNumber<U, uAlign> &u) \
│ │ │ │ -
214 { \
│ │ │ │ -
215 value_ OP U(u); \
│ │ │ │ -
216 return *this; \
│ │ │ │ -
217 } \
│ │ │ │ -
218 \
│ │ │ │ -
219 template<class U, \
│ │ │ │ -
220 class = std::void_t<decltype(std::declval<T&>() OP \
│ │ │ │ -
221 std::declval<U>())> > \
│ │ │ │ -
222 AlignedNumber &operator OP(const U &u) \
│ │ │ │ -
223 { \
│ │ │ │ -
224 value_ OP u; \
│ │ │ │ -
225 return *this; \
│ │ │ │ -
226 } \
│ │ │ │ -
227 \
│ │ │ │ -
228 static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ -
229
│ │ │ │ - │ │ │ │ - │ │ │ │ -
232
│ │ │ │ - │ │ │ │ -
234 DUNE_ASSIGN_OP(/=);
│ │ │ │ -
235 DUNE_ASSIGN_OP(%=);
│ │ │ │ -
236
│ │ │ │ - │ │ │ │ -
238 DUNE_ASSIGN_OP(&=);
│ │ │ │ -
239 DUNE_ASSIGN_OP(|=);
│ │ │ │ -
240
│ │ │ │ - │ │ │ │ - │ │ │ │ -
243
│ │ │ │ -
244#undef DUNE_ASSIGN_OP
│ │ │ │ -
245 };
│ │ │ │ -
246
│ │ │ │ -
247 // binary operators
│ │ │ │ -
248#define DUNE_BINARY_OP(OP) \
│ │ │ │ -
249 template<class T, std::size_t tAlign, class U, std::size_t uAlign, \
│ │ │ │ -
250 class = std::void_t<decltype(std::declval<T>() \
│ │ │ │ -
251 OP std::declval<U>())> > \
│ │ │ │ -
252 decltype(auto) \
│ │ │ │ -
253 operator OP(const AlignedNumber<T, tAlign> &t, \
│ │ │ │ -
254 const AlignedNumber<U, uAlign> &u) \
│ │ │ │ -
255 { \
│ │ │ │ -
256 /* can't use std::max(); not constexpr */ \
│ │ │ │ -
257 return aligned<(tAlign > uAlign ? tAlign : uAlign)>(T(t) OP U(u)); \
│ │ │ │ -
258 } \
│ │ │ │ -
259 \
│ │ │ │ -
260 template<class T, class U, std::size_t uAlign, \
│ │ │ │ -
261 class = std::void_t<decltype(std::declval<T>() \
│ │ │ │ -
262 OP std::declval<U>())> > \
│ │ │ │ -
263 decltype(auto) \
│ │ │ │ -
264 operator OP(const T &t, const AlignedNumber<U, uAlign> &u) \
│ │ │ │ -
265 { \
│ │ │ │ -
266 return aligned<uAlign>(t OP U(u)); \
│ │ │ │ -
267 } \
│ │ │ │ -
268 \
│ │ │ │ -
269 template<class T, std::size_t tAlign, class U, \
│ │ │ │ -
270 class = std::void_t<decltype(std::declval<T>() \
│ │ │ │ -
271 OP std::declval<U>())> > \
│ │ │ │ -
272 decltype(auto) \
│ │ │ │ -
273 operator OP(const AlignedNumber<T, tAlign> &t, const U &u) \
│ │ │ │ -
274 { \
│ │ │ │ -
275 return aligned<tAlign>(T(t) OP u); \
│ │ │ │ -
276 } \
│ │ │ │ -
277 \
│ │ │ │ -
278 static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ -
279
│ │ │ │ - │ │ │ │ - │ │ │ │ +
180// Wrapper macro for type to be hashed.
│ │ │ │ +
181// See above for rationale.
│ │ │ │ +
182#define DUNE_HASH_TYPE(...) (__VA_ARGS__)
│ │ │ │ +
183
│ │ │ │ +
184// Expansion macro for the parenthesized argument lists created by
│ │ │ │ +
185// DUNE_HASH_TEMPLATE_ARGS and DUNE_HASH_TYPE.
│ │ │ │ +
186#define DUNE_HASH_EXPAND_VA_ARGS(...) __VA_ARGS__
│ │ │ │ +
187
│ │ │ │ +
188// Define specializations for all discovered hash implementations.
│ │ │ │ +
189#define DUNE_DEFINE_HASH(template_args,type) \
│ │ │ │ +
190 DUNE_DEFINE_STD_HASH(DUNE_HASH_EXPAND_VA_ARGS template_args, DUNE_HASH_EXPAND_VA_ARGS type) \
│ │ │ │ +
191
│ │ │ │ +
192
│ │ │ │ +
193#endif // DOXYGEN
│ │ │ │ +
194
│ │ │ │ +
195
│ │ │ │ +
196
│ │ │ │ +
197// ********************************************************************************
│ │ │ │ +
198// Some utility functions for combining hashes of member variables.
│ │ │ │ +
199// ********************************************************************************
│ │ │ │ +
200
│ │ │ │ +
201namespace Dune {
│ │ │ │ +
202
│ │ │ │ +
203 // The following functions are an implementation of the proposed hash extensions for
│ │ │ │ +
204 // the C++ standard by Peter Dimov
│ │ │ │ +
205 // (cf. http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf, issue 6.18).
│ │ │ │ +
206 // They are also contained in the boost::functional::hash library by Daniel James, but
│ │ │ │ +
207 // that implementation uses boost::hash internally, while we want to use Dune::hash. They
│ │ │ │ +
208 // are also considered for inclusion in TR2 (then based on std::hash, of course).
│ │ │ │ +
209
│ │ │ │ +
210#ifndef DOXYGEN
│ │ │ │ +
211
│ │ │ │ +
212 // helper struct for providing different hash combining algorithms dependent on
│ │ │ │ +
213 // the size of size_t.
│ │ │ │ +
214 // hash_combiner has to be specialized for the size (in bytes) of std::size_t.
│ │ │ │ +
215 // Specialized versions should provide a method
│ │ │ │ +
216 //
│ │ │ │ +
217 // template <typename typeof_size_t, typename T>
│ │ │ │ +
218 // void operator()(typeof_size_t& seed, const T& arg) const;
│ │ │ │ +
219 //
│ │ │ │ +
220 // that will be called by the interface function hash_combine() described further below.
│ │ │ │ +
221 // The redundant template parameter typeof_size_t is needed to avoid warnings for the
│ │ │ │ +
222 // unused 64-bit specialization on 32-bit systems.
│ │ │ │ +
223 //
│ │ │ │ +
224 // There is no default implementation!
│ │ │ │ +
225 template<int sizeof_size_t>
│ │ │ │ +
226 struct hash_combiner;
│ │ │ │ +
227
│ │ │ │ +
228
│ │ │ │ +
229 // hash combining for 64-bit platforms.
│ │ │ │ +
230 template<>
│ │ │ │ +
231 struct hash_combiner<8>
│ │ │ │ +
232 {
│ │ │ │ +
233
│ │ │ │ +
234 template<typename typeof_size_t, typename T>
│ │ │ │ +
235 void operator()(typeof_size_t& seed, const T& arg) const
│ │ │ │ +
236 {
│ │ │ │ +
237 static_assert(sizeof(typeof_size_t)==8, "hash_combiner::operator() instantiated with nonmatching type and size");
│ │ │ │ +
238
│ │ │ │ +
239 // The following algorithm for combining two 64-bit hash values is inspired by a similar
│ │ │ │ +
240 // function in CityHash (http://cityhash.googlecode.com/svn-history/r2/trunk/src/city.h),
│ │ │ │ +
241 // which is in turn based on ideas from the MurmurHash library. The basic idea is easy to
│ │ │ │ +
242 // grasp, though: New information is XORed into the existing hash multiple times at different
│ │ │ │ +
243 // places (using shift operations), and the resulting pattern is spread over the complete
│ │ │ │ +
244 // range of available bits via multiplication with a "magic" constant. The constants used
│ │ │ │ +
245 // below (47 and 0x9ddfea08eb382d69ULL) are taken from the CityHash implementation.
│ │ │ │ +
246 //
│ │ │ │ +
247 // We opted not to use the mixing algorithm proposed in the C++ working group defect list at
│ │ │ │ +
248 // http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf, p. 57f. because it
│ │ │ │ +
249 // has very bad hash distribution properties if you apply it to lists of very small numbers,
│ │ │ │ +
250 // an application that is frequent in PDELab's ordering framework.
│ │ │ │ +
251
│ │ │ │ +
252 Dune::hash<T> hasher;
│ │ │ │ +
253 const typeof_size_t kMul = 0x9ddfea08eb382d69ULL;
│ │ │ │ +
254 typeof_size_t h = hasher(arg);
│ │ │ │ +
255 typeof_size_t a = (seed ^ h) * kMul;
│ │ │ │ +
256 a ^= (a >> 47);
│ │ │ │ +
257 typeof_size_t b = (h ^ a) * kMul;
│ │ │ │ +
258 b ^= (b >> 47);
│ │ │ │ +
259 b *= kMul;
│ │ │ │ +
260 seed = b;
│ │ │ │ +
261 }
│ │ │ │ +
262
│ │ │ │ +
263 };
│ │ │ │ +
264
│ │ │ │ +
265
│ │ │ │ +
266 // hash combining for 32-bit platforms.
│ │ │ │ +
267 template<>
│ │ │ │ +
268 struct hash_combiner<4>
│ │ │ │ +
269 {
│ │ │ │ +
270
│ │ │ │ +
271 template<typename typeof_size_t, typename T>
│ │ │ │ +
272 void operator()(typeof_size_t& seed, const T& arg) const
│ │ │ │ +
273 {
│ │ │ │ +
274 static_assert(sizeof(typeof_size_t)==4, "hash_combiner::operator() instantiated with nonmatching type and size");
│ │ │ │ +
275
│ │ │ │ +
276 // The default algorithm above requires a 64-bit std::size_t. The following algorithm is a
│ │ │ │ +
277 // 32-bit compatible fallback, again inspired by CityHash and MurmurHash
│ │ │ │ +
278 // (http://cityhash.googlecode.com/svn-history/r2/trunk/src/city.cc).
│ │ │ │ +
279 // It uses 32-bit constants and relies on rotation instead of multiplication to spread the
│ │ │ │ +
280 // mixed bits as that is apparently more efficient on IA-32. The constants used below are again
│ │ │ │ +
281 // taken from CityHash, in particular from the file referenced above.
│ │ │ │
282
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
286
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
290
│ │ │ │ - │ │ │ │ - │ │ │ │ -
293
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
300
│ │ │ │ - │ │ │ │ -
302 DUNE_BINARY_OP(||);
│ │ │ │ -
303
│ │ │ │ -
304#undef DUNE_BINARY_OP
│ │ │ │ -
305
│ │ │ │ -
307 //
│ │ │ │ -
308 // Overloads for the functions provided by the standard library
│ │ │ │ -
309 //
│ │ │ │ -
310#define DUNE_UNARY_FUNC(name) \
│ │ │ │ -
311 template<class T, std::size_t align> \
│ │ │ │ -
312 decltype(auto) name(const AlignedNumber<T, align> &u) \
│ │ │ │ -
313 { \
│ │ │ │ -
314 using std::name; \
│ │ │ │ -
315 return aligned<align>(name(T(u))); \
│ │ │ │ -
316 } \
│ │ │ │ -
317 static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ -
318
│ │ │ │ -
319 //
│ │ │ │ -
320 // <cmath> functions
│ │ │ │ -
321 //
│ │ │ │ -
322
│ │ │ │ -
323 // note: only unary functions are provided at the moment. Getting all the
│ │ │ │ -
324 // overloads right for functions with more than one argument is tricky.
│ │ │ │ -
325 // All <cmath> functions appear in the list below in the order they are
│ │ │ │ -
326 // listed in in the standard, but the unimplemented ones are commented
│ │ │ │ -
327 // out.
│ │ │ │ -
328
│ │ │ │ -
329 // note: abs is provided by both <cstdlib> (for integer) and <cmath> (for
│ │ │ │ -
330 // floating point). This overload works for both.
│ │ │ │ -
331 DUNE_UNARY_FUNC(abs);
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
337 // atan2
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
341 // copysign
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
350 // fdim
│ │ │ │ - │ │ │ │ -
352 // fma
│ │ │ │ -
353 // fmax
│ │ │ │ -
354 // fmin
│ │ │ │ -
355 // fmod
│ │ │ │ -
356 // frexp
│ │ │ │ -
357 // hypos
│ │ │ │ - │ │ │ │ -
359 // ldexp
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
370 // modf
│ │ │ │ -
371 DUNE_UNARY_FUNC(nearbyint);
│ │ │ │ -
372 // nextafter
│ │ │ │ -
373 // nexttoward
│ │ │ │ -
374 // pow
│ │ │ │ -
375 // remainder
│ │ │ │ -
376 // remquo
│ │ │ │ - │ │ │ │ - │ │ │ │ -
379 // scalbln
│ │ │ │ -
380 // scalbn
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
388
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
394
│ │ │ │ -
395 // isgreater
│ │ │ │ -
396 // isgreaterequal
│ │ │ │ -
397 // isless
│ │ │ │ -
398 // islessequal
│ │ │ │ -
399 // islessgreater
│ │ │ │ -
400 // isunordered
│ │ │ │ -
401
│ │ │ │ -
402 //
│ │ │ │ -
403 // <complex> functions
│ │ │ │ -
404 //
│ │ │ │ -
405
│ │ │ │ -
406 // not all functions are implemented, and unlike for <cmath>, no
│ │ │ │ -
407 // comprehensive list is provided
│ │ │ │ - │ │ │ │ -
409
│ │ │ │ -
410#undef DUNE_UNARY_FUNC
│ │ │ │ -
411
│ │ │ │ -
412 // We need to overload min() and max() since they require types to be
│ │ │ │ -
413 // LessThanComparable, which requires `a<b` to be "convertible to bool".
│ │ │ │ -
414 // That wording seems to be a leftover from C++03, and today is probably
│ │ │ │ -
415 // equivalent to "implicitly convertible". There is also issue 2114
│ │ │ │ -
416 // <https://cplusplus.github.io/LWG/issue2114> in the standard (still open
│ │ │ │ -
417 // as of 2018-07-06), which strives to require both "implicitly" and
│ │ │ │ -
418 // "contextually" convertible -- plus a few other things.
│ │ │ │ -
419 //
│ │ │ │ -
420 // We do not want our debug type to automatically decay to the underlying
│ │ │ │ -
421 // type, so we do not want to make the conversion non-explicit. So the
│ │ │ │ -
422 // only option left is to overload min() and max().
│ │ │ │ -
423
│ │ │ │ -
424 template<class T, std::size_t align>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
427 {
│ │ │ │ -
428 using std::max;
│ │ │ │ -
429 return aligned<align>(max(T(a), T(b)));
│ │ │ │ -
430 }
│ │ │ │ -
431
│ │ │ │ -
432 template<class T, std::size_t align>
│ │ │ │ -
433 auto max(const T &a, const AlignedNumber<T, align> &b)
│ │ │ │ -
434 {
│ │ │ │ -
435 using std::max;
│ │ │ │ -
436 return aligned<align>(max(a, T(b)));
│ │ │ │ -
437 }
│ │ │ │ -
438
│ │ │ │ -
439 template<class T, std::size_t align>
│ │ │ │ -
440 auto max(const AlignedNumber<T, align> &a, const T &b)
│ │ │ │ -
441 {
│ │ │ │ -
442 using std::max;
│ │ │ │ -
443 return aligned<align>(max(T(a), b));
│ │ │ │ -
444 }
│ │ │ │ -
445
│ │ │ │ -
446 template<class T, std::size_t align>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
449 {
│ │ │ │ -
450 using std::min;
│ │ │ │ -
451 return aligned<align>(min(T(a), T(b)));
│ │ │ │ -
452 }
│ │ │ │ -
453
│ │ │ │ -
454 template<class T, std::size_t align>
│ │ │ │ -
455 auto min(const T &a, const AlignedNumber<T, align> &b)
│ │ │ │ -
456 {
│ │ │ │ -
457 using std::min;
│ │ │ │ -
458 return aligned<align>(min(a, T(b)));
│ │ │ │ -
459 }
│ │ │ │ -
460
│ │ │ │ -
461 template<class T, std::size_t align>
│ │ │ │ -
462 auto min(const AlignedNumber<T, align> &a, const T &b)
│ │ │ │ -
463 {
│ │ │ │ -
464 using std::min;
│ │ │ │ -
465 return aligned<align>(min(T(a), b));
│ │ │ │ -
466 }
│ │ │ │ -
467
│ │ │ │ -
468 } // namespace AlignedNumberImpl
│ │ │ │ -
469
│ │ │ │ -
470 // SIMD-like functions from "conditional.hh"
│ │ │ │ -
471 template<class T, std::size_t align>
│ │ │ │ -
472 AlignedNumber<T, align>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
475 {
│ │ │ │ -
476 return b ? v1 : v2;
│ │ │ │ -
477 }
│ │ │ │ -
478
│ │ │ │ -
479 // SIMD-like functions from "rangeutilities.hh"
│ │ │ │ -
480 template<class T, std::size_t align>
│ │ │ │ - │ │ │ │ -
482 {
│ │ │ │ -
483 return T(val);
│ │ │ │ -
484 }
│ │ │ │ -
485
│ │ │ │ -
486 template<class T, std::size_t align>
│ │ │ │ - │ │ │ │ -
488 {
│ │ │ │ -
489 return T(val);
│ │ │ │ -
490 }
│ │ │ │ -
491
│ │ │ │ -
492 template<std::size_t align>
│ │ │ │ - │ │ │ │ -
494 {
│ │ │ │ -
495 return bool(val);
│ │ │ │ -
496 }
│ │ │ │ -
497
│ │ │ │ -
498 template<std::size_t align>
│ │ │ │ - │ │ │ │ -
500 {
│ │ │ │ -
501 return bool(val);
│ │ │ │ -
502 }
│ │ │ │ -
503
│ │ │ │ -
504 // SIMD-like functionality from "simd/interface.hh"
│ │ │ │ -
505 namespace Simd {
│ │ │ │ -
506 namespace Overloads {
│ │ │ │ -
507
│ │ │ │ -
508 template<class T, std::size_t align>
│ │ │ │ - │ │ │ │ -
510
│ │ │ │ -
511 template<class U, class T, std::size_t align>
│ │ │ │ -
512 struct RebindType<U, AlignedNumber<T, align> > {
│ │ │ │ - │ │ │ │ -
514 };
│ │ │ │ -
515
│ │ │ │ -
516 template<class T, std::size_t align>
│ │ │ │ -
517 struct LaneCount<AlignedNumber<T, align> > : index_constant<1> {};
│ │ │ │ -
518
│ │ │ │ -
519 template<class T, std::size_t align>
│ │ │ │ - │ │ │ │ -
521 {
│ │ │ │ -
522 assert(l == 0);
│ │ │ │ -
523 return v.value();
│ │ │ │ -
524 }
│ │ │ │ -
525
│ │ │ │ -
526 template<class T, std::size_t align>
│ │ │ │ -
527 T lane(ADLTag<5>, std::size_t l, const AlignedNumber<T, align> &v)
│ │ │ │ -
528 {
│ │ │ │ -
529 assert(l == 0);
│ │ │ │ -
530 return v.value();
│ │ │ │ -
531 }
│ │ │ │ -
532
│ │ │ │ -
533 template<class T, std::size_t align>
│ │ │ │ - │ │ │ │ - │ │ │ │ -
536 const AlignedNumber<T, align> &ifTrue,
│ │ │ │ -
537 const AlignedNumber<T, align> &ifFalse)
│ │ │ │ -
538 {
│ │ │ │ -
539 return mask ? ifTrue : ifFalse;
│ │ │ │ -
540 }
│ │ │ │ -
541
│ │ │ │ -
542 template<std::size_t align>
│ │ │ │ - │ │ │ │ -
544 {
│ │ │ │ -
545 return bool(mask);
│ │ │ │ -
546 }
│ │ │ │ -
547
│ │ │ │ -
548 } // namespace Overloads
│ │ │ │ -
549
│ │ │ │ -
550 } // namespace Simd
│ │ │ │ -
551
│ │ │ │ -
552} // namespace Dune
│ │ │ │ -
553
│ │ │ │ -
554#endif // DUNE_DEBUGALIGN_HH
│ │ │ │ - │ │ │ │ -
#define DUNE_BINARY_OP(OP)
Definition: debugalign.hh:248
│ │ │ │ -
#define DUNE_UNARY_FUNC(name)
│ │ │ │ -
#define DUNE_ASSIGN_OP(OP)
Definition: debugalign.hh:207
│ │ │ │ -
Traits for type conversions and type information.
│ │ │ │ -
Basic definitions for SIMD Implementations.
│ │ │ │ -
Default implementations for SIMD Implementations.
│ │ │ │ -
A free function to provide the demangled class name of a given object or type as a string.
│ │ │ │ -
std::integral_constant< std::size_t, i > index_constant
An index constant with value i.
Definition: indices.hh:30
│ │ │ │ -
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
│ │ │ │ -
std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
Definition: bigunsignedint.hh:278
│ │ │ │ -
I round(const T &val, typename EpsilonType< T >::Type epsilon)
round using epsilon
Definition: float_cmp.cc:311
│ │ │ │ -
I trunc(const T &val, typename EpsilonType< T >::Type epsilon)
truncate using epsilon
Definition: float_cmp.cc:407
│ │ │ │ -
Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v)
implements Simd::mask()
Definition: defaults.hh:153
│ │ │ │ -
STL namespace.
│ │ │ │ +
283 Dune::hash<T> hasher;
│ │ │ │ +
284 const typeof_size_t c1 = 0xcc9e2d51;
│ │ │ │ +
285 const typeof_size_t c2 = 0x1b873593;
│ │ │ │ +
286 const typeof_size_t c3 = 0xe6546b64;
│ │ │ │ +
287 typeof_size_t h = hasher(arg);
│ │ │ │ +
288 typeof_size_t a = seed * c1;
│ │ │ │ +
289 a = (a >> 17) | (a << (32 - 17));
│ │ │ │ +
290 a *= c2;
│ │ │ │ +
291 h ^= a;
│ │ │ │ +
292 h = (h >> 19) | (h << (32 - 19));
│ │ │ │ +
293 seed = h * 5 + c3;
│ │ │ │ +
294 }
│ │ │ │ +
295
│ │ │ │ +
296 };
│ │ │ │ +
297
│ │ │ │ +
298#endif // DOXYGEN
│ │ │ │ +
299
│ │ │ │ +
301
│ │ │ │ +
306 template<typename T>
│ │ │ │ +
307 inline void hash_combine(std::size_t& seed, const T& arg)
│ │ │ │ +
308 {
│ │ │ │ +
309 hash_combiner<sizeof(std::size_t)>()(seed,arg);
│ │ │ │ +
310 }
│ │ │ │ +
311
│ │ │ │ +
313
│ │ │ │ +
321 template<typename It>
│ │ │ │ +
322 inline std::size_t hash_range(It first, It last)
│ │ │ │ +
323 {
│ │ │ │ +
324 std::size_t seed = 0;
│ │ │ │ +
325 for (; first != last; ++first)
│ │ │ │ +
326 {
│ │ │ │ +
327 hash_combine(seed,*first);
│ │ │ │ +
328 }
│ │ │ │ +
329 return seed;
│ │ │ │ +
330 }
│ │ │ │ +
331
│ │ │ │ +
333
│ │ │ │ +
340 template<typename It>
│ │ │ │ +
341 inline void hash_range(std::size_t& seed, It first, It last)
│ │ │ │ +
342 {
│ │ │ │ +
343 for (; first != last; ++first)
│ │ │ │ +
344 {
│ │ │ │ +
345 hash_combine(seed,*first);
│ │ │ │ +
346 }
│ │ │ │ +
347 }
│ │ │ │ +
348
│ │ │ │ +
349} // end namespace Dune
│ │ │ │ +
350
│ │ │ │ +
351#endif // DUNE_COMMON_HASH_HH
│ │ │ │ +
Traits for type conversions and type information.
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
void violatedAlignment(const char *className, std::size_t expectedAlignment, const void *address)
called when an alignment violation is detected
Definition: debugalign.cc:39
│ │ │ │ -
bool any_true(const AlignedNumber< bool, align > &val)
Definition: debugalign.hh:493
│ │ │ │ -
bool all_true(const AlignedNumber< bool, align > &val)
Definition: debugalign.hh:499
│ │ │ │ -
std::string className()
Provide the demangled class name of a type T as a string.
Definition: classname.hh:47
│ │ │ │ -
static constexpr auto debugAlignment
an alignment large enough to trigger alignment errors
Definition: debugalign.hh:84
│ │ │ │ -
T lane(std::size_t l, const T &v)
access a lane of a simd vector (scalar version)
Definition: simd.hh:366
│ │ │ │ -
const T1 cond(bool b, const T1 &v1, const T2 &v2)
conditional evaluate
Definition: conditional.hh:28
│ │ │ │ -
AlignedNumber< T, align > aligned(T value)
align a value to a certain alignment
Definition: debugalign.hh:101
│ │ │ │ -
ViolatedAlignmentHandler & violatedAlignmentHandler()
access the handler called by violatedAlignment()
Definition: debugalign.cc:33
│ │ │ │ -
bool isAligned(const void *p, std::size_t align)
check whether an address conforms to the given alignment
Definition: debugalign.hh:56
│ │ │ │ -
T max_value(const AlignedNumber< T, align > &val)
Definition: debugalign.hh:481
│ │ │ │ -
std::function< void(const char *, std::size_t, const void *)> ViolatedAlignmentHandler
type of the handler called by violatedAlignment()
Definition: debugalign.hh:31
│ │ │ │ -
T min_value(const AlignedNumber< T, align > &val)
Definition: debugalign.hh:487
│ │ │ │ -
auto max(const AlignedNumber< T, align > &a, const T &b)
Definition: debugalign.hh:440
│ │ │ │ -
auto min(const AlignedNumber< T, align > &a, const T &b)
Definition: debugalign.hh:462
│ │ │ │ -
bool anyTrue(ADLTag< 5 >, const AlignedNumber< bool, align > &mask)
Definition: debugalign.hh:543
│ │ │ │ -
Whether this type acts as a scalar in the context of (hierarchically blocked) containers.
Definition: typetraits.hh:194
│ │ │ │ -
CRTP base mixin class to check alignment.
Definition: debugalign.hh:66
│ │ │ │ -
~AlignedBase()
Definition: debugalign.hh:77
│ │ │ │ -
AlignedBase & operator=(AlignedBase &&)=default
│ │ │ │ -
AlignedBase(AlignedBase &&)
Definition: debugalign.hh:76
│ │ │ │ -
AlignedBase & operator=(const AlignedBase &)=default
│ │ │ │ -
AlignedBase(const AlignedBase &)
Definition: debugalign.hh:75
│ │ │ │ -
AlignedBase()
Definition: debugalign.hh:74
│ │ │ │ -
aligned wrappers for arithmetic types
Definition: debugalign.hh:115
│ │ │ │ - │ │ │ │ - │ │ │ │ -
decltype(auto) operator+() const
Definition: debugalign.hh:174
│ │ │ │ - │ │ │ │ -
decltype(auto) operator--(int)
Definition: debugalign.hh:169
│ │ │ │ -
DUNE_ASSIGN_OP * DUNE_ASSIGN_OP(/=);DUNE_ASSIGN_OP(%=
│ │ │ │ -
decltype(auto) operator++(int)
Definition: debugalign.hh:166
│ │ │ │ -
decltype(auto) operator!() const
Definition: debugalign.hh:204
│ │ │ │ -
T & value()
Definition: debugalign.hh:132
│ │ │ │ -
const T & value() const
Definition: debugalign.hh:131
│ │ │ │ -
DUNE_ASSIGN_OP^ DUNE_ASSIGN_OP(&=);DUNE_ASSIGN_OP(|=
│ │ │ │ -
friend std::basic_istream< charT, Traits > & operator>>(std::basic_istream< charT, Traits > &str, AlignedNumber &u)
Definition: debugalign.hh:137
│ │ │ │ - │ │ │ │ - │ │ │ │ -
decltype(auto) operator~() const
Definition: debugalign.hh:194
│ │ │ │ -
AlignedNumber(T value)
Definition: debugalign.hh:120
│ │ │ │ -
AlignedNumber(const AlignedNumber< U, uAlign > &o)
Definition: debugalign.hh:124
│ │ │ │ -
decltype(auto) operator-() const
Definition: debugalign.hh:178
│ │ │ │ - │ │ │ │ -
Tag used to force late-binding lookup in Dune::Simd::Overloads.
Definition: base.hh:182
│ │ │ │ -
should have a member type type
Definition: standard.hh:60
│ │ │ │ -
should have a member type type
Definition: standard.hh:67
│ │ │ │ -
should be derived from a Dune::index_constant
Definition: standard.hh:74
│ │ │ │ +
std::size_t hash_range(It first, It last)
Hashes all elements in the range [first,last) and returns the combined hash.
Definition: hash.hh:322
│ │ │ │ +
void hash_combine(std::size_t &seed, const T &arg)
Calculates the hash value of arg and combines it in-place with seed.
Definition: hash.hh:307
│ │ │ │ +
Functor for hashing objects of type T.
Definition: hash.hh:40
│ │ │ │ +
std::size_t operator()(const T &t) const
Calculates the hash of t.
Definition: hash.hh:43
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,748 +4,332 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -debugalign.hh │ │ │ │ │ +hash.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 (C) 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_DEBUGALIGN_HH │ │ │ │ │ - 6#define DUNE_DEBUGALIGN_HH │ │ │ │ │ + 5#ifndef DUNE_COMMON_HASH_HH │ │ │ │ │ + 6#define DUNE_COMMON_HASH_HH │ │ │ │ │ 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include // abs │ │ │ │ │ - 15#include │ │ │ │ │ - 16#include │ │ │ │ │ - 17#include │ │ │ │ │ - 18#include │ │ │ │ │ - 19#include │ │ │ │ │ - 20 │ │ │ │ │ - 21#include │ │ │ │ │ - 22#include │ │ │ │ │ - 23#include │ │ │ │ │ - 24#include │ │ │ │ │ - 25#include │ │ │ │ │ - 26 │ │ │ │ │ - 27namespace Dune { │ │ │ │ │ - 28 │ │ │ │ │ -30 using ViolatedAlignmentHandler = │ │ │ │ │ - 31 std::function; │ │ │ │ │ - 32 │ │ │ │ │ - 34 │ │ │ │ │ - 40 ViolatedAlignmentHandler &violatedAlignmentHandler(); │ │ │ │ │ + 8#include │ │ │ │ │ + 9 │ │ │ │ │ + 10#include │ │ │ │ │ + 11 │ │ │ │ │ + 24/ │ │ │ │ │ +/ │ │ │ │ │ +******************************************************************************** │ │ │ │ │ + 25// Doxygen documentation │ │ │ │ │ + 26/ │ │ │ │ │ +/ │ │ │ │ │ +******************************************************************************** │ │ │ │ │ + 27 │ │ │ │ │ + 28#ifdef DOXYGEN │ │ │ │ │ + 29 │ │ │ │ │ + 30namespace Dune { │ │ │ │ │ + 31 │ │ │ │ │ + 33 │ │ │ │ │ + 38 template │ │ │ │ │ +39 struct hash │ │ │ │ │ + 40 { │ │ │ │ │ 41 │ │ │ │ │ - 43 │ │ │ │ │ - 52 void violatedAlignment(const char *className, std::size_t │ │ │ │ │ -expectedAlignment, │ │ │ │ │ - 53 const void *address); │ │ │ │ │ - 54 │ │ │ │ │ -56 inline bool isAligned(const void *p, std::size_t align) │ │ │ │ │ - 57 { │ │ │ │ │ - 58 // a more portable way to do this would be to abuse std::align(), but that │ │ │ │ │ - 59 // isn't supported by g++-4.9 yet │ │ │ │ │ - 60 return std::uintptr_t(p) % align == 0; │ │ │ │ │ - 61 } │ │ │ │ │ - 62 │ │ │ │ │ - 64 template │ │ │ │ │ -65 class alignas(align) AlignedBase │ │ │ │ │ - 66 { │ │ │ │ │ - 67 void checkAlignment() const │ │ │ │ │ - 68 { │ │ │ │ │ - 69 auto pimpl = static_cast(this); │ │ │ │ │ - 70 if(!isAligned(pimpl, align)) │ │ │ │ │ - 71 violatedAlignment(className().c_str(), align, pimpl); │ │ │ │ │ - 72 } │ │ │ │ │ - 73 public: │ │ │ │ │ -74 AlignedBase() { checkAlignment(); } │ │ │ │ │ -75 AlignedBase(const AlignedBase &) { checkAlignment(); } │ │ │ │ │ -76 AlignedBase(AlignedBase &&) { checkAlignment(); } │ │ │ │ │ -77 ~AlignedBase() { checkAlignment(); } │ │ │ │ │ - 78 │ │ │ │ │ -79 AlignedBase& operator=(const AlignedBase &) = default; │ │ │ │ │ -80 AlignedBase& operator=(AlignedBase &&) = default; │ │ │ │ │ - 81 }; │ │ │ │ │ - 82 │ │ │ │ │ -84 static constexpr auto debugAlignment = 2*alignof(std::max_align_t); │ │ │ │ │ - 85 │ │ │ │ │ -86 namespace AlignedNumberImpl { │ │ │ │ │ - 87 │ │ │ │ │ - 88 template │ │ │ │ │ - 89 class AlignedNumber; │ │ │ │ │ - 90 │ │ │ │ │ - 91 } // namespace AlignedNumberImpl │ │ │ │ │ - 92 │ │ │ │ │ - 93 using AlignedNumberImpl::AlignedNumber; │ │ │ │ │ - 94 │ │ │ │ │ - 95 template │ │ │ │ │ -96 struct IsNumber> │ │ │ │ │ - 97 : public std::true_type {}; │ │ │ │ │ - 98 │ │ │ │ │ - 100 template │ │ │ │ │ -101 AlignedNumber aligned(T value) { return { std::move(value) }; } │ │ │ │ │ +43 std::size_t operator()(const T& t) const │ │ │ │ │ + 44 { │ │ │ │ │ + 45 return hash(t); │ │ │ │ │ + 46 } │ │ │ │ │ + 47 │ │ │ │ │ + 48 }; │ │ │ │ │ + 49 │ │ │ │ │ + 50} │ │ │ │ │ + 51 │ │ │ │ │ + 53 │ │ │ │ │ +100#define DUNE_DEFINE_HASH(template_args,type) │ │ │ │ │ + 101 │ │ │ │ │ 102 │ │ │ │ │ - 103 // The purpose of this namespace is to move the `` function │ │ │ │ │ -overloads │ │ │ │ │ - 104 // out of namespace `Dune`. This avoids problems where people called │ │ │ │ │ - 105 // e.g. `sqrt(1.0)` inside the `Dune` namespace, without first doing │ │ │ │ │ -`using │ │ │ │ │ - 106 // std::sqrt;`. Without any `Dune::sqrt()`, such a use will find │ │ │ │ │ - 107 // `::sqrt()`, but with `Dune::sqrt()` it will find only `Dune::sqrt()`, │ │ │ │ │ - 108 // which does not have an overload for `double`. │ │ │ │ │ - 109 namespace AlignedNumberImpl { │ │ │ │ │ + 104 │ │ │ │ │ +109#define DUNE_HASH_TEMPLATE_ARGS(...) │ │ │ │ │ 110 │ │ │ │ │ - 112 template │ │ │ │ │ -113 class AlignedNumber │ │ │ │ │ - 114 : public AlignedBase > │ │ │ │ │ - 115 { │ │ │ │ │ - 116 T value_; │ │ │ │ │ - 117 │ │ │ │ │ - 118 public: │ │ │ │ │ -119 AlignedNumber() = default; │ │ │ │ │ -120 AlignedNumber(T value) : value_(std::move(value)) {} │ │ │ │ │ - 121 template= uAlign) && │ │ │ │ │ - 123 std::is_convertible::value> > │ │ │ │ │ -124 AlignedNumber(const AlignedNumber &o) : value_(U(o)) {} │ │ │ │ │ - 125 │ │ │ │ │ - 126 // accessors │ │ │ │ │ - 127 template::value> > │ │ │ │ │ -129 explicit operator U() const { return value_; } │ │ │ │ │ - 130 │ │ │ │ │ -131 const T &value() const { return value_; } │ │ │ │ │ -132 T &value() { return value_; } │ │ │ │ │ + 112 │ │ │ │ │ +117#define DUNE_HASH_TYPE(...) │ │ │ │ │ + 118 │ │ │ │ │ + 119#else // DOXYGEN - hide all the ugly implementation │ │ │ │ │ + 120 │ │ │ │ │ + 121 │ │ │ │ │ + 122 │ │ │ │ │ + 123/ │ │ │ │ │ +/ │ │ │ │ │ +******************************************************************************** │ │ │ │ │ + 124// C++11 support │ │ │ │ │ + 125/ │ │ │ │ │ +/ │ │ │ │ │ +******************************************************************************** │ │ │ │ │ + 126 │ │ │ │ │ + 127// import std::hash into Dune namespace │ │ │ │ │ + 128namespace Dune { │ │ │ │ │ + 129 │ │ │ │ │ + 130 using std::hash; │ │ │ │ │ + 131 │ │ │ │ │ + 132} │ │ │ │ │ 133 │ │ │ │ │ - 134 // I/O │ │ │ │ │ - 135 template │ │ │ │ │ - 136 friend std::basic_istream& │ │ │ │ │ -137 operator>>(std::basic_istream& str, AlignedNumber &u) │ │ │ │ │ - 138 { │ │ │ │ │ - 139 return str >> u.value_; │ │ │ │ │ - 140 } │ │ │ │ │ - 141 │ │ │ │ │ - 142 template │ │ │ │ │ -143 friend std::basic_ostream& │ │ │ │ │ - 144 operator<<(std::basic_ostream& str, │ │ │ │ │ - 145 const AlignedNumber &u) │ │ │ │ │ - 146 { │ │ │ │ │ - 147 return str << u.value_; │ │ │ │ │ - 148 } │ │ │ │ │ - 149 │ │ │ │ │ - 150 // The trick with `template >` │ │ │ │ │ -is │ │ │ │ │ - 151 // needed because at least g++-4.9 seems to evaluates a default argument │ │ │ │ │ - 152 // in `template >` as soon as possible and │ │ │ │ │ -will │ │ │ │ │ - 153 // error out if `expr(T)` is invalid. E.g. for `expr(T)` = │ │ │ │ │ - 154 // `decltype(--std::declval())`, instantiating `AlignedNumber` │ │ │ │ │ - 155 // will result in an unrecoverable error (`--` cannot be applied to a │ │ │ │ │ - 156 // `bool`). │ │ │ │ │ - 157 │ │ │ │ │ - 158 // Increment, decrement │ │ │ │ │ - 159 template())> │ │ │ │ │ -> │ │ │ │ │ -160 AlignedNumber &operator++() { ++value_; return *this; } │ │ │ │ │ - 161 │ │ │ │ │ - 162 template())> │ │ │ │ │ -> │ │ │ │ │ -163 AlignedNumber &operator--() { --value_; return *this; } │ │ │ │ │ - 164 │ │ │ │ │ - 165 template()++)> │ │ │ │ │ -> │ │ │ │ │ -166 decltype(auto) operator++(int) { return aligned(value_++); } │ │ │ │ │ + 134// Macro for defining a std::hash specialization for type. │ │ │ │ │ + 135// This should not be called directly. Call DUNE_DEFINE_HASH │ │ │ │ │ + 136// instead. │ │ │ │ │ + 137#define DUNE_DEFINE_STD_HASH(template_args,type) \ │ │ │ │ │ + 138 namespace std { \ │ │ │ │ │ + 139 \ │ │ │ │ │ + 140 template \ │ │ │ │ │ + 141 struct hash \ │ │ │ │ │ + 142 { \ │ │ │ │ │ + 143 \ │ │ │ │ │ + 144 typedef type argument_type; \ │ │ │ │ │ + 145 typedef std::size_t result_type; \ │ │ │ │ │ + 146 \ │ │ │ │ │ + 147 std::size_t operator()(const type& arg) const \ │ │ │ │ │ + 148 { \ │ │ │ │ │ + 149 return hash_value(arg); \ │ │ │ │ │ + 150 } \ │ │ │ │ │ + 151 }; \ │ │ │ │ │ + 152 \ │ │ │ │ │ + 153 template \ │ │ │ │ │ + 154 struct hash \ │ │ │ │ │ + 155 { \ │ │ │ │ │ + 156 \ │ │ │ │ │ + 157 typedef type argument_type; \ │ │ │ │ │ + 158 typedef std::size_t result_type; \ │ │ │ │ │ + 159 \ │ │ │ │ │ + 160 std::size_t operator()(const type& arg) const \ │ │ │ │ │ + 161 { \ │ │ │ │ │ + 162 return hash_value(arg); \ │ │ │ │ │ + 163 } \ │ │ │ │ │ + 164 }; \ │ │ │ │ │ + 165 \ │ │ │ │ │ + 166 } \ │ │ │ │ │ 167 │ │ │ │ │ - 168 template()--)> │ │ │ │ │ -> │ │ │ │ │ -169 decltype(auto) operator--(int) { return aligned(value_--); } │ │ │ │ │ - 170 │ │ │ │ │ - 171 // unary operators │ │ │ │ │ - 172 template())> > │ │ │ │ │ -174 decltype(auto) operator+() const { return aligned(+value_); } │ │ │ │ │ - 175 │ │ │ │ │ - 176 template())> > │ │ │ │ │ -178 decltype(auto) operator-() const { return aligned(-value_); } │ │ │ │ │ + 168// Wrapper macro for template arguments. │ │ │ │ │ + 169// This is required because the template arguments can contain commas, │ │ │ │ │ + 170// which will create a macro argument list of unknown length. That in │ │ │ │ │ +itself │ │ │ │ │ + 171// would not be a problem, but DUNE_DEFINE_HASH has to be called with two │ │ │ │ │ +argument │ │ │ │ │ + 172// lists of unknown length. So this macro wraps its arguments with │ │ │ │ │ +parentheses, │ │ │ │ │ + 173// turning it into a single argument. The result is used as the parameter │ │ │ │ │ +list of │ │ │ │ │ + 174// an expansion macro in the calls to the implementation-specific macros │ │ │ │ │ + 175// for C++11 and TR1. Noto that technically, this trick is only legal for │ │ │ │ │ +C++11, │ │ │ │ │ + 176// but pretty much every compiler supports variadic macros in C++03 mode, │ │ │ │ │ +as they │ │ │ │ │ + 177// are part of C99. │ │ │ │ │ + 178#define DUNE_HASH_TEMPLATE_ARGS(...) (__VA_ARGS__) │ │ │ │ │ 179 │ │ │ │ │ - 180 /* │ │ │ │ │ - 181 * silence warnings from GCC about using `~` on a bool │ │ │ │ │ - 182 * (when instantiated for T=bool) │ │ │ │ │ - 183 */ │ │ │ │ │ - 184#if __GNUC__ >= 7 │ │ │ │ │ - 185# pragma GCC diagnostic push │ │ │ │ │ - 186# pragma GCC diagnostic ignored "-Wbool-operation" │ │ │ │ │ - 187#endif │ │ │ │ │ - 188#ifdef __clang__ │ │ │ │ │ - 189# pragma clang diagnostic push │ │ │ │ │ - 190# pragma clang diagnostic ignored "-Wbool-operation" │ │ │ │ │ - 191#endif │ │ │ │ │ - 192 template())> > │ │ │ │ │ -194 decltype(auto) operator~() const { return aligned(~value_); } │ │ │ │ │ - 195#if __GNUC__ >= 7 │ │ │ │ │ - 196# pragma GCC diagnostic pop │ │ │ │ │ - 197#endif │ │ │ │ │ - 198#ifdef __clang__ │ │ │ │ │ - 199# pragma clang diagnostic pop │ │ │ │ │ - 200#endif │ │ │ │ │ - 201 │ │ │ │ │ - 202 template())> > │ │ │ │ │ -204 decltype(auto) operator!() const { return aligned(!value_); } │ │ │ │ │ - 205 │ │ │ │ │ - 206 // assignment operators │ │ │ │ │ -207#define DUNE_ASSIGN_OP(OP) \ │ │ │ │ │ - 208 template() OP std::declval()) ) \ │ │ │ │ │ - 212 > > \ │ │ │ │ │ - 213 AlignedNumber &operator OP(const AlignedNumber &u) \ │ │ │ │ │ - 214 { \ │ │ │ │ │ - 215 value_ OP U(u); \ │ │ │ │ │ - 216 return *this; \ │ │ │ │ │ - 217 } \ │ │ │ │ │ - 218 \ │ │ │ │ │ - 219 template() OP \ │ │ │ │ │ - 221 std::declval())> > \ │ │ │ │ │ - 222 AlignedNumber &operator OP(const U &u) \ │ │ │ │ │ - 223 { \ │ │ │ │ │ - 224 value_ OP u; \ │ │ │ │ │ - 225 return *this; \ │ │ │ │ │ - 226 } \ │ │ │ │ │ - 227 \ │ │ │ │ │ - 228 static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ - 229 │ │ │ │ │ -230 DUNE_ASSIGN_OP(+=); │ │ │ │ │ -231 DUNE_ASSIGN_OP(-=); │ │ │ │ │ - 232 │ │ │ │ │ -233 DUNE_ASSIGN_OP(*=); │ │ │ │ │ - 234 DUNE_ASSIGN_OP(/=); │ │ │ │ │ - 235 DUNE_ASSIGN_OP(%=); │ │ │ │ │ - 236 │ │ │ │ │ -237 DUNE_ASSIGN_OP(^=); │ │ │ │ │ - 238 DUNE_ASSIGN_OP(&=); │ │ │ │ │ - 239 DUNE_ASSIGN_OP(|=); │ │ │ │ │ - 240 │ │ │ │ │ -241 DUNE_ASSIGN_OP(<<=); │ │ │ │ │ -242 DUNE_ASSIGN_OP(>>=); │ │ │ │ │ - 243 │ │ │ │ │ - 244#undef DUNE_ASSIGN_OP │ │ │ │ │ - 245 }; │ │ │ │ │ - 246 │ │ │ │ │ - 247 // binary operators │ │ │ │ │ -248#define DUNE_BINARY_OP(OP) \ │ │ │ │ │ - 249 template() \ │ │ │ │ │ - 251 OP std::declval())> > \ │ │ │ │ │ - 252 decltype(auto) \ │ │ │ │ │ - 253 operator OP(const AlignedNumber &t, \ │ │ │ │ │ - 254 const AlignedNumber &u) \ │ │ │ │ │ - 255 { \ │ │ │ │ │ - 256 /* can't use std::max(); not constexpr */ \ │ │ │ │ │ - 257 return aligned<(tAlign > uAlign ? tAlign : uAlign)>(T(t) OP U(u)); \ │ │ │ │ │ - 258 } \ │ │ │ │ │ - 259 \ │ │ │ │ │ - 260 template() \ │ │ │ │ │ - 262 OP std::declval())> > \ │ │ │ │ │ - 263 decltype(auto) \ │ │ │ │ │ - 264 operator OP(const T &t, const AlignedNumber &u) \ │ │ │ │ │ - 265 { \ │ │ │ │ │ - 266 return aligned(t OP U(u)); \ │ │ │ │ │ - 267 } \ │ │ │ │ │ - 268 \ │ │ │ │ │ - 269 template() \ │ │ │ │ │ - 271 OP std::declval())> > \ │ │ │ │ │ - 272 decltype(auto) \ │ │ │ │ │ - 273 operator OP(const AlignedNumber &t, const U &u) \ │ │ │ │ │ - 274 { \ │ │ │ │ │ - 275 return aligned(T(t) OP u); \ │ │ │ │ │ - 276 } \ │ │ │ │ │ - 277 \ │ │ │ │ │ - 278 static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ - 279 │ │ │ │ │ -280 DUNE_BINARY_OP(+); │ │ │ │ │ -281 DUNE_BINARY_OP(-); │ │ │ │ │ + 180// Wrapper macro for type to be hashed. │ │ │ │ │ + 181// See above for rationale. │ │ │ │ │ + 182#define DUNE_HASH_TYPE(...) (__VA_ARGS__) │ │ │ │ │ + 183 │ │ │ │ │ + 184// Expansion macro for the parenthesized argument lists created by │ │ │ │ │ + 185// DUNE_HASH_TEMPLATE_ARGS and DUNE_HASH_TYPE. │ │ │ │ │ + 186#define DUNE_HASH_EXPAND_VA_ARGS(...) __VA_ARGS__ │ │ │ │ │ + 187 │ │ │ │ │ + 188// Define specializations for all discovered hash implementations. │ │ │ │ │ + 189#define DUNE_DEFINE_HASH(template_args,type) \ │ │ │ │ │ + 190 DUNE_DEFINE_STD_HASH(DUNE_HASH_EXPAND_VA_ARGS template_args, │ │ │ │ │ +DUNE_HASH_EXPAND_VA_ARGS type) \ │ │ │ │ │ + 191 │ │ │ │ │ + 192 │ │ │ │ │ + 193#endif // DOXYGEN │ │ │ │ │ + 194 │ │ │ │ │ + 195 │ │ │ │ │ + 196 │ │ │ │ │ + 197/ │ │ │ │ │ +/ │ │ │ │ │ +******************************************************************************** │ │ │ │ │ + 198// Some utility functions for combining hashes of member variables. │ │ │ │ │ + 199/ │ │ │ │ │ +/ │ │ │ │ │ +******************************************************************************** │ │ │ │ │ + 200 │ │ │ │ │ + 201namespace Dune { │ │ │ │ │ + 202 │ │ │ │ │ + 203 // The following functions are an implementation of the proposed hash │ │ │ │ │ +extensions for │ │ │ │ │ + 204 // the C++ standard by Peter Dimov │ │ │ │ │ + 205 // (cf. http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf, │ │ │ │ │ +issue 6.18). │ │ │ │ │ + 206 // They are also contained in the boost::functional::hash library by │ │ │ │ │ +Daniel James, but │ │ │ │ │ + 207 // that implementation uses boost::hash internally, while we want to use │ │ │ │ │ +Dune::hash. They │ │ │ │ │ + 208 // are also considered for inclusion in TR2 (then based on std::hash, of │ │ │ │ │ +course). │ │ │ │ │ + 209 │ │ │ │ │ + 210#ifndef DOXYGEN │ │ │ │ │ + 211 │ │ │ │ │ + 212 // helper struct for providing different hash combining algorithms │ │ │ │ │ +dependent on │ │ │ │ │ + 213 // the size of size_t. │ │ │ │ │ + 214 // hash_combiner has to be specialized for the size (in bytes) of std:: │ │ │ │ │ +size_t. │ │ │ │ │ + 215 // Specialized versions should provide a method │ │ │ │ │ + 216 // │ │ │ │ │ + 217 // template │ │ │ │ │ + 218 // void operator()(typeof_size_t& seed, const T& arg) const; │ │ │ │ │ + 219 // │ │ │ │ │ + 220 // that will be called by the interface function hash_combine() described │ │ │ │ │ +further below. │ │ │ │ │ + 221 // The redundant template parameter typeof_size_t is needed to avoid │ │ │ │ │ +warnings for the │ │ │ │ │ + 222 // unused 64-bit specialization on 32-bit systems. │ │ │ │ │ + 223 // │ │ │ │ │ + 224 // There is no default implementation! │ │ │ │ │ + 225 template │ │ │ │ │ + 226 struct hash_combiner; │ │ │ │ │ + 227 │ │ │ │ │ + 228 │ │ │ │ │ + 229 // hash combining for 64-bit platforms. │ │ │ │ │ + 230 template<> │ │ │ │ │ + 231 struct hash_combiner<8> │ │ │ │ │ + 232 { │ │ │ │ │ + 233 │ │ │ │ │ + 234 template │ │ │ │ │ + 235 void operator()(typeof_size_t& seed, const T& arg) const │ │ │ │ │ + 236 { │ │ │ │ │ + 237 static_assert(sizeof(typeof_size_t)==8, "hash_combiner::operator() │ │ │ │ │ +instantiated with nonmatching type and size"); │ │ │ │ │ + 238 │ │ │ │ │ + 239 // The following algorithm for combining two 64-bit hash values is │ │ │ │ │ +inspired by a similar │ │ │ │ │ + 240 // function in CityHash (http://cityhash.googlecode.com/svn-history/r2/ │ │ │ │ │ +trunk/src/city.h), │ │ │ │ │ + 241 // which is in turn based on ideas from the MurmurHash library. The basic │ │ │ │ │ +idea is easy to │ │ │ │ │ + 242 // grasp, though: New information is XORed into the existing hash multiple │ │ │ │ │ +times at different │ │ │ │ │ + 243 // places (using shift operations), and the resulting pattern is spread │ │ │ │ │ +over the complete │ │ │ │ │ + 244 // range of available bits via multiplication with a "magic" constant. The │ │ │ │ │ +constants used │ │ │ │ │ + 245 // below (47 and 0x9ddfea08eb382d69ULL) are taken from the CityHash │ │ │ │ │ +implementation. │ │ │ │ │ + 246 // │ │ │ │ │ + 247 // We opted not to use the mixing algorithm proposed in the C++ working │ │ │ │ │ +group defect list at │ │ │ │ │ + 248 // http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf, p. │ │ │ │ │ +57f. because it │ │ │ │ │ + 249 // has very bad hash distribution properties if you apply it to lists of │ │ │ │ │ +very small numbers, │ │ │ │ │ + 250 // an application that is frequent in PDELab's ordering framework. │ │ │ │ │ + 251 │ │ │ │ │ + 252 Dune::hash hasher; │ │ │ │ │ + 253 const typeof_size_t kMul = 0x9ddfea08eb382d69ULL; │ │ │ │ │ + 254 typeof_size_t h = hasher(arg); │ │ │ │ │ + 255 typeof_size_t a = (seed ^ h) * kMul; │ │ │ │ │ + 256 a ^= (a >> 47); │ │ │ │ │ + 257 typeof_size_t b = (h ^ a) * kMul; │ │ │ │ │ + 258 b ^= (b >> 47); │ │ │ │ │ + 259 b *= kMul; │ │ │ │ │ + 260 seed = b; │ │ │ │ │ + 261 } │ │ │ │ │ + 262 │ │ │ │ │ + 263 }; │ │ │ │ │ + 264 │ │ │ │ │ + 265 │ │ │ │ │ + 266 // hash combining for 32-bit platforms. │ │ │ │ │ + 267 template<> │ │ │ │ │ + 268 struct hash_combiner<4> │ │ │ │ │ + 269 { │ │ │ │ │ + 270 │ │ │ │ │ + 271 template │ │ │ │ │ + 272 void operator()(typeof_size_t& seed, const T& arg) const │ │ │ │ │ + 273 { │ │ │ │ │ + 274 static_assert(sizeof(typeof_size_t)==4, "hash_combiner::operator() │ │ │ │ │ +instantiated with nonmatching type and size"); │ │ │ │ │ + 275 │ │ │ │ │ + 276 // The default algorithm above requires a 64-bit std::size_t. The │ │ │ │ │ +following algorithm is a │ │ │ │ │ + 277 // 32-bit compatible fallback, again inspired by CityHash and MurmurHash │ │ │ │ │ + 278 // (http://cityhash.googlecode.com/svn-history/r2/trunk/src/city.cc). │ │ │ │ │ + 279 // It uses 32-bit constants and relies on rotation instead of │ │ │ │ │ +multiplication to spread the │ │ │ │ │ + 280 // mixed bits as that is apparently more efficient on IA-32. The constants │ │ │ │ │ +used below are again │ │ │ │ │ + 281 // taken from CityHash, in particular from the file referenced above. │ │ │ │ │ 282 │ │ │ │ │ -283 DUNE_BINARY_OP(*); │ │ │ │ │ - 284 DUNE_BINARY_OP(/); │ │ │ │ │ - 285 DUNE_BINARY_OP(%); │ │ │ │ │ - 286 │ │ │ │ │ -287 DUNE_BINARY_OP(^); │ │ │ │ │ - 288 DUNE_BINARY_OP(&); │ │ │ │ │ - 289 DUNE_BINARY_OP(|); │ │ │ │ │ - 290 │ │ │ │ │ -291 DUNE_BINARY_OP(<<); │ │ │ │ │ -292 DUNE_BINARY_OP(>>); │ │ │ │ │ - 293 │ │ │ │ │ -294 DUNE_BINARY_OP(==); │ │ │ │ │ -295 DUNE_BINARY_OP(!=); │ │ │ │ │ - 296 DUNE_BINARY_OP(<); │ │ │ │ │ - 297 DUNE_BINARY_OP(>); │ │ │ │ │ -298 DUNE_BINARY_OP(<=); │ │ │ │ │ -299 DUNE_BINARY_OP(>=); │ │ │ │ │ - 300 │ │ │ │ │ -301 DUNE_BINARY_OP(&&); │ │ │ │ │ - 302 DUNE_BINARY_OP(||); │ │ │ │ │ - 303 │ │ │ │ │ - 304#undef DUNE_BINARY_OP │ │ │ │ │ - 305 │ │ │ │ │ - 307 // │ │ │ │ │ - 308 // Overloads for the functions provided by the standard library │ │ │ │ │ - 309 // │ │ │ │ │ - 310#define DUNE_UNARY_FUNC(name) \ │ │ │ │ │ - 311 template \ │ │ │ │ │ - 312 decltype(auto) name(const AlignedNumber &u) \ │ │ │ │ │ - 313 { \ │ │ │ │ │ - 314 using std::name; \ │ │ │ │ │ - 315 return aligned(name(T(u))); \ │ │ │ │ │ - 316 } \ │ │ │ │ │ - 317 static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ - 318 │ │ │ │ │ - 319 // │ │ │ │ │ - 320 // functions │ │ │ │ │ - 321 // │ │ │ │ │ - 322 │ │ │ │ │ - 323 // note: only unary functions are provided at the moment. Getting all the │ │ │ │ │ - 324 // overloads right for functions with more than one argument is tricky. │ │ │ │ │ - 325 // All functions appear in the list below in the order they are │ │ │ │ │ - 326 // listed in in the standard, but the unimplemented ones are commented │ │ │ │ │ - 327 // out. │ │ │ │ │ - 328 │ │ │ │ │ - 329 // note: abs is provided by both (for integer) and (for │ │ │ │ │ - 330 // floating point). This overload works for both. │ │ │ │ │ - 331 DUNE_UNARY_FUNC(abs); │ │ │ │ │ -332 DUNE_UNARY_FUNC(acos); │ │ │ │ │ -333 DUNE_UNARY_FUNC(acosh); │ │ │ │ │ -334 DUNE_UNARY_FUNC(asin); │ │ │ │ │ -335 DUNE_UNARY_FUNC(asinh); │ │ │ │ │ -336 DUNE_UNARY_FUNC(atan); │ │ │ │ │ - 337 // atan2 │ │ │ │ │ -338 DUNE_UNARY_FUNC(atanh); │ │ │ │ │ -339 DUNE_UNARY_FUNC(cbrt); │ │ │ │ │ -340 DUNE_UNARY_FUNC(ceil); │ │ │ │ │ - 341 // copysign │ │ │ │ │ -342 DUNE_UNARY_FUNC(cos); │ │ │ │ │ -343 DUNE_UNARY_FUNC(cosh); │ │ │ │ │ -344 DUNE_UNARY_FUNC(erf); │ │ │ │ │ -345 DUNE_UNARY_FUNC(erfc); │ │ │ │ │ -346 DUNE_UNARY_FUNC(exp); │ │ │ │ │ -347 DUNE_UNARY_FUNC(exp2); │ │ │ │ │ -348 DUNE_UNARY_FUNC(expm1); │ │ │ │ │ -349 DUNE_UNARY_FUNC(fabs); │ │ │ │ │ - 350 // fdim │ │ │ │ │ -351 DUNE_UNARY_FUNC(floor); │ │ │ │ │ - 352 // fma │ │ │ │ │ - 353 // fmax │ │ │ │ │ - 354 // fmin │ │ │ │ │ - 355 // fmod │ │ │ │ │ - 356 // frexp │ │ │ │ │ - 357 // hypos │ │ │ │ │ -358 DUNE_UNARY_FUNC(ilogb); │ │ │ │ │ - 359 // ldexp │ │ │ │ │ -360 DUNE_UNARY_FUNC(lgamma); │ │ │ │ │ -361 DUNE_UNARY_FUNC(llrint); │ │ │ │ │ -362 DUNE_UNARY_FUNC(llround); │ │ │ │ │ -363 DUNE_UNARY_FUNC(log); │ │ │ │ │ -364 DUNE_UNARY_FUNC(log10); │ │ │ │ │ -365 DUNE_UNARY_FUNC(log1p); │ │ │ │ │ -366 DUNE_UNARY_FUNC(log2); │ │ │ │ │ -367 DUNE_UNARY_FUNC(logb); │ │ │ │ │ -368 DUNE_UNARY_FUNC(lrint); │ │ │ │ │ -369 DUNE_UNARY_FUNC(lround); │ │ │ │ │ - 370 // modf │ │ │ │ │ -371 DUNE_UNARY_FUNC(nearbyint); │ │ │ │ │ - 372 // nextafter │ │ │ │ │ - 373 // nexttoward │ │ │ │ │ - 374 // pow │ │ │ │ │ - 375 // remainder │ │ │ │ │ - 376 // remquo │ │ │ │ │ -377 DUNE_UNARY_FUNC(rint); │ │ │ │ │ -378 DUNE_UNARY_FUNC(round); │ │ │ │ │ - 379 // scalbln │ │ │ │ │ - 380 // scalbn │ │ │ │ │ -381 DUNE_UNARY_FUNC(sin); │ │ │ │ │ -382 DUNE_UNARY_FUNC(sinh); │ │ │ │ │ -383 DUNE_UNARY_FUNC(sqrt); │ │ │ │ │ -384 DUNE_UNARY_FUNC(tan); │ │ │ │ │ -385 DUNE_UNARY_FUNC(tanh); │ │ │ │ │ -386 DUNE_UNARY_FUNC(tgamma); │ │ │ │ │ -387 DUNE_UNARY_FUNC(trunc); │ │ │ │ │ - 388 │ │ │ │ │ -389 DUNE_UNARY_FUNC(isfinite); │ │ │ │ │ -390 DUNE_UNARY_FUNC(isinf); │ │ │ │ │ -391 DUNE_UNARY_FUNC(isnan); │ │ │ │ │ -392 DUNE_UNARY_FUNC(isnormal); │ │ │ │ │ -393 DUNE_UNARY_FUNC(signbit); │ │ │ │ │ - 394 │ │ │ │ │ - 395 // isgreater │ │ │ │ │ - 396 // isgreaterequal │ │ │ │ │ - 397 // isless │ │ │ │ │ - 398 // islessequal │ │ │ │ │ - 399 // islessgreater │ │ │ │ │ - 400 // isunordered │ │ │ │ │ - 401 │ │ │ │ │ - 402 // │ │ │ │ │ - 403 // functions │ │ │ │ │ - 404 // │ │ │ │ │ - 405 │ │ │ │ │ - 406 // not all functions are implemented, and unlike for , no │ │ │ │ │ - 407 // comprehensive list is provided │ │ │ │ │ -408 DUNE_UNARY_FUNC(real); │ │ │ │ │ - 409 │ │ │ │ │ - 410#undef DUNE_UNARY_FUNC │ │ │ │ │ - 411 │ │ │ │ │ - 412 // We need to overload min() and max() since they require types to be │ │ │ │ │ - 413 // LessThanComparable, which requires `a in the standard (still open │ │ │ │ │ - 417 // as of 2018-07-06), which strives to require both "implicitly" and │ │ │ │ │ - 418 // "contextually" convertible -- plus a few other things. │ │ │ │ │ - 419 // │ │ │ │ │ - 420 // We do not want our debug type to automatically decay to the underlying │ │ │ │ │ - 421 // type, so we do not want to make the conversion non-explicit. So the │ │ │ │ │ - 422 // only option left is to overload min() and max(). │ │ │ │ │ - 423 │ │ │ │ │ - 424 template │ │ │ │ │ -425 auto max(const AlignedNumber &a, │ │ │ │ │ - 426 const AlignedNumber &b) │ │ │ │ │ - 427 { │ │ │ │ │ - 428 using std::max; │ │ │ │ │ - 429 return aligned(max(T(a), T(b))); │ │ │ │ │ - 430 } │ │ │ │ │ - 431 │ │ │ │ │ - 432 template │ │ │ │ │ -433 auto max(const T &a, const AlignedNumber &b) │ │ │ │ │ - 434 { │ │ │ │ │ - 435 using std::max; │ │ │ │ │ - 436 return aligned(max(a, T(b))); │ │ │ │ │ - 437 } │ │ │ │ │ - 438 │ │ │ │ │ - 439 template │ │ │ │ │ -440 auto max(const AlignedNumber &a, const T &b) │ │ │ │ │ - 441 { │ │ │ │ │ - 442 using std::max; │ │ │ │ │ - 443 return aligned(max(T(a), b)); │ │ │ │ │ - 444 } │ │ │ │ │ - 445 │ │ │ │ │ - 446 template │ │ │ │ │ -447 auto min(const AlignedNumber &a, │ │ │ │ │ - 448 const AlignedNumber &b) │ │ │ │ │ - 449 { │ │ │ │ │ - 450 using std::min; │ │ │ │ │ - 451 return aligned(min(T(a), T(b))); │ │ │ │ │ - 452 } │ │ │ │ │ - 453 │ │ │ │ │ - 454 template │ │ │ │ │ -455 auto min(const T &a, const AlignedNumber &b) │ │ │ │ │ - 456 { │ │ │ │ │ - 457 using std::min; │ │ │ │ │ - 458 return aligned(min(a, T(b))); │ │ │ │ │ - 459 } │ │ │ │ │ - 460 │ │ │ │ │ - 461 template │ │ │ │ │ -462 auto min(const AlignedNumber &a, const T &b) │ │ │ │ │ - 463 { │ │ │ │ │ - 464 using std::min; │ │ │ │ │ - 465 return aligned(min(T(a), b)); │ │ │ │ │ - 466 } │ │ │ │ │ - 467 │ │ │ │ │ - 468 } // namespace AlignedNumberImpl │ │ │ │ │ - 469 │ │ │ │ │ - 470 // SIMD-like functions from "conditional.hh" │ │ │ │ │ - 471 template │ │ │ │ │ - 472 AlignedNumber │ │ │ │ │ -473 cond(const AlignedNumber &b, │ │ │ │ │ - 474 const AlignedNumber &v1, const AlignedNumber &v2) │ │ │ │ │ - 475 { │ │ │ │ │ - 476 return b ? v1 : v2; │ │ │ │ │ - 477 } │ │ │ │ │ - 478 │ │ │ │ │ - 479 // SIMD-like functions from "rangeutilities.hh" │ │ │ │ │ - 480 template │ │ │ │ │ -481 T max_value(const AlignedNumber& val) │ │ │ │ │ - 482 { │ │ │ │ │ - 483 return T(val); │ │ │ │ │ - 484 } │ │ │ │ │ - 485 │ │ │ │ │ - 486 template │ │ │ │ │ -487 T min_value(const AlignedNumber& val) │ │ │ │ │ - 488 { │ │ │ │ │ - 489 return T(val); │ │ │ │ │ - 490 } │ │ │ │ │ - 491 │ │ │ │ │ - 492 template │ │ │ │ │ -493 bool any_true(const AlignedNumber& val) │ │ │ │ │ - 494 { │ │ │ │ │ - 495 return bool(val); │ │ │ │ │ - 496 } │ │ │ │ │ - 497 │ │ │ │ │ - 498 template │ │ │ │ │ -499 bool all_true(const AlignedNumber& val) │ │ │ │ │ - 500 { │ │ │ │ │ - 501 return bool(val); │ │ │ │ │ - 502 } │ │ │ │ │ - 503 │ │ │ │ │ - 504 // SIMD-like functionality from "simd/interface.hh" │ │ │ │ │ -505 namespace Simd { │ │ │ │ │ -506 namespace Overloads { │ │ │ │ │ - 507 │ │ │ │ │ - 508 template │ │ │ │ │ -509 struct ScalarType > { using type = T; }; │ │ │ │ │ - 510 │ │ │ │ │ - 511 template │ │ │ │ │ -512 struct RebindType > { │ │ │ │ │ -513 using type = AlignedNumber; │ │ │ │ │ - 514 }; │ │ │ │ │ - 515 │ │ │ │ │ - 516 template │ │ │ │ │ -517 struct LaneCount > : index_constant<1> {}; │ │ │ │ │ - 518 │ │ │ │ │ - 519 template │ │ │ │ │ -520 T& lane(ADLTag<5>, std::size_t l, AlignedNumber &v) │ │ │ │ │ - 521 { │ │ │ │ │ - 522 assert(l == 0); │ │ │ │ │ - 523 return v.value(); │ │ │ │ │ - 524 } │ │ │ │ │ - 525 │ │ │ │ │ - 526 template │ │ │ │ │ -527 T lane(ADLTag<5>, std::size_t l, const AlignedNumber &v) │ │ │ │ │ - 528 { │ │ │ │ │ - 529 assert(l == 0); │ │ │ │ │ - 530 return v.value(); │ │ │ │ │ - 531 } │ │ │ │ │ - 532 │ │ │ │ │ - 533 template │ │ │ │ │ - 534 const AlignedNumber & │ │ │ │ │ -535 cond(ADLTag<5>, AlignedNumber mask, │ │ │ │ │ - 536 const AlignedNumber &ifTrue, │ │ │ │ │ - 537 const AlignedNumber &ifFalse) │ │ │ │ │ - 538 { │ │ │ │ │ - 539 return mask ? ifTrue : ifFalse; │ │ │ │ │ - 540 } │ │ │ │ │ - 541 │ │ │ │ │ - 542 template │ │ │ │ │ -543 bool anyTrue(ADLTag<5>, const AlignedNumber &mask) │ │ │ │ │ - 544 { │ │ │ │ │ - 545 return bool(mask); │ │ │ │ │ - 546 } │ │ │ │ │ - 547 │ │ │ │ │ - 548 } // namespace Overloads │ │ │ │ │ - 549 │ │ │ │ │ - 550 } // namespace Simd │ │ │ │ │ - 551 │ │ │ │ │ - 552} // namespace Dune │ │ │ │ │ - 553 │ │ │ │ │ - 554#endif // DUNE_DEBUGALIGN_HH │ │ │ │ │ -indices.hh │ │ │ │ │ -DUNE_BINARY_OP │ │ │ │ │ -#define DUNE_BINARY_OP(OP) │ │ │ │ │ -Definition: debugalign.hh:248 │ │ │ │ │ -DUNE_UNARY_FUNC │ │ │ │ │ -#define DUNE_UNARY_FUNC(name) │ │ │ │ │ -DUNE_ASSIGN_OP │ │ │ │ │ -#define DUNE_ASSIGN_OP(OP) │ │ │ │ │ -Definition: debugalign.hh:207 │ │ │ │ │ + 283 Dune::hash hasher; │ │ │ │ │ + 284 const typeof_size_t c1 = 0xcc9e2d51; │ │ │ │ │ + 285 const typeof_size_t c2 = 0x1b873593; │ │ │ │ │ + 286 const typeof_size_t c3 = 0xe6546b64; │ │ │ │ │ + 287 typeof_size_t h = hasher(arg); │ │ │ │ │ + 288 typeof_size_t a = seed * c1; │ │ │ │ │ + 289 a = (a >> 17) | (a << (32 - 17)); │ │ │ │ │ + 290 a *= c2; │ │ │ │ │ + 291 h ^= a; │ │ │ │ │ + 292 h = (h >> 19) | (h << (32 - 19)); │ │ │ │ │ + 293 seed = h * 5 + c3; │ │ │ │ │ + 294 } │ │ │ │ │ + 295 │ │ │ │ │ + 296 }; │ │ │ │ │ + 297 │ │ │ │ │ + 298#endif // DOXYGEN │ │ │ │ │ + 299 │ │ │ │ │ + 301 │ │ │ │ │ + 306 template │ │ │ │ │ +307 inline void hash_combine(std::size_t& seed, const T& arg) │ │ │ │ │ + 308 { │ │ │ │ │ + 309 hash_combiner()(seed,arg); │ │ │ │ │ + 310 } │ │ │ │ │ + 311 │ │ │ │ │ + 313 │ │ │ │ │ + 321 template │ │ │ │ │ +322 inline std::size_t hash_range(It first, It last) │ │ │ │ │ + 323 { │ │ │ │ │ + 324 std::size_t seed = 0; │ │ │ │ │ + 325 for (; first != last; ++first) │ │ │ │ │ + 326 { │ │ │ │ │ + 327 hash_combine(seed,*first); │ │ │ │ │ + 328 } │ │ │ │ │ + 329 return seed; │ │ │ │ │ + 330 } │ │ │ │ │ + 331 │ │ │ │ │ + 333 │ │ │ │ │ + 340 template │ │ │ │ │ +341 inline void hash_range(std::size_t& seed, It first, It last) │ │ │ │ │ + 342 { │ │ │ │ │ + 343 for (; first != last; ++first) │ │ │ │ │ + 344 { │ │ │ │ │ + 345 hash_combine(seed,*first); │ │ │ │ │ + 346 } │ │ │ │ │ + 347 } │ │ │ │ │ + 348 │ │ │ │ │ + 349} // end namespace Dune │ │ │ │ │ + 350 │ │ │ │ │ + 351#endif // DUNE_COMMON_HASH_HH │ │ │ │ │ typetraits.hh │ │ │ │ │ Traits for type conversions and type information. │ │ │ │ │ -base.hh │ │ │ │ │ -Basic definitions for SIMD Implementations. │ │ │ │ │ -defaults.hh │ │ │ │ │ -Default implementations for SIMD Implementations. │ │ │ │ │ -classname.hh │ │ │ │ │ -A free function to provide the demangled class name of a given object or type │ │ │ │ │ -as a string. │ │ │ │ │ -Dune::index_constant │ │ │ │ │ -std::integral_constant< std::size_t, i > index_constant │ │ │ │ │ -An index constant with value i. │ │ │ │ │ -Definition: indices.hh:30 │ │ │ │ │ -Dune::void_t │ │ │ │ │ -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 │ │ │ │ │ -Dune::operator<< │ │ │ │ │ -std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x) │ │ │ │ │ -Definition: bigunsignedint.hh:278 │ │ │ │ │ -Dune::FloatCmp::round │ │ │ │ │ -I round(const T &val, typename EpsilonType< T >::Type epsilon) │ │ │ │ │ -round using epsilon │ │ │ │ │ -Definition: float_cmp.cc:311 │ │ │ │ │ -Dune::FloatCmp::trunc │ │ │ │ │ -I trunc(const T &val, typename EpsilonType< T >::Type epsilon) │ │ │ │ │ -truncate using epsilon │ │ │ │ │ -Definition: float_cmp.cc:407 │ │ │ │ │ -Dune::Simd::Overloads::mask │ │ │ │ │ -Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v) │ │ │ │ │ -implements Simd::mask() │ │ │ │ │ -Definition: defaults.hh:153 │ │ │ │ │ -std │ │ │ │ │ -STL namespace. │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::violatedAlignment │ │ │ │ │ -void violatedAlignment(const char *className, std::size_t expectedAlignment, │ │ │ │ │ -const void *address) │ │ │ │ │ -called when an alignment violation is detected │ │ │ │ │ -Definition: debugalign.cc:39 │ │ │ │ │ -Dune::any_true │ │ │ │ │ -bool any_true(const AlignedNumber< bool, align > &val) │ │ │ │ │ -Definition: debugalign.hh:493 │ │ │ │ │ -Dune::all_true │ │ │ │ │ -bool all_true(const AlignedNumber< bool, align > &val) │ │ │ │ │ -Definition: debugalign.hh:499 │ │ │ │ │ -Dune::className │ │ │ │ │ -std::string className() │ │ │ │ │ -Provide the demangled class name of a type T as a string. │ │ │ │ │ -Definition: classname.hh:47 │ │ │ │ │ -Dune::debugAlignment │ │ │ │ │ -static constexpr auto debugAlignment │ │ │ │ │ -an alignment large enough to trigger alignment errors │ │ │ │ │ -Definition: debugalign.hh:84 │ │ │ │ │ -Dune::lane │ │ │ │ │ -T lane(std::size_t l, const T &v) │ │ │ │ │ -access a lane of a simd vector (scalar version) │ │ │ │ │ -Definition: simd.hh:366 │ │ │ │ │ -Dune::cond │ │ │ │ │ -const T1 cond(bool b, const T1 &v1, const T2 &v2) │ │ │ │ │ -conditional evaluate │ │ │ │ │ -Definition: conditional.hh:28 │ │ │ │ │ -Dune::aligned │ │ │ │ │ -AlignedNumber< T, align > aligned(T value) │ │ │ │ │ -align a value to a certain alignment │ │ │ │ │ -Definition: debugalign.hh:101 │ │ │ │ │ -Dune::violatedAlignmentHandler │ │ │ │ │ -ViolatedAlignmentHandler & violatedAlignmentHandler() │ │ │ │ │ -access the handler called by violatedAlignment() │ │ │ │ │ -Definition: debugalign.cc:33 │ │ │ │ │ -Dune::isAligned │ │ │ │ │ -bool isAligned(const void *p, std::size_t align) │ │ │ │ │ -check whether an address conforms to the given alignment │ │ │ │ │ -Definition: debugalign.hh:56 │ │ │ │ │ -Dune::max_value │ │ │ │ │ -T max_value(const AlignedNumber< T, align > &val) │ │ │ │ │ -Definition: debugalign.hh:481 │ │ │ │ │ -Dune::ViolatedAlignmentHandler │ │ │ │ │ -std::function< void(const char *, std::size_t, const void *)> │ │ │ │ │ -ViolatedAlignmentHandler │ │ │ │ │ -type of the handler called by violatedAlignment() │ │ │ │ │ -Definition: debugalign.hh:31 │ │ │ │ │ -Dune::min_value │ │ │ │ │ -T min_value(const AlignedNumber< T, align > &val) │ │ │ │ │ -Definition: debugalign.hh:487 │ │ │ │ │ -Dune::AlignedNumberImpl::max │ │ │ │ │ -auto max(const AlignedNumber< T, align > &a, const T &b) │ │ │ │ │ -Definition: debugalign.hh:440 │ │ │ │ │ -Dune::AlignedNumberImpl::min │ │ │ │ │ -auto min(const AlignedNumber< T, align > &a, const T &b) │ │ │ │ │ -Definition: debugalign.hh:462 │ │ │ │ │ -Dune::Simd::Overloads::anyTrue │ │ │ │ │ -bool anyTrue(ADLTag< 5 >, const AlignedNumber< bool, align > &mask) │ │ │ │ │ -Definition: debugalign.hh:543 │ │ │ │ │ -Dune::IsNumber │ │ │ │ │ -Whether this type acts as a scalar in the context of (hierarchically blocked) │ │ │ │ │ -containers. │ │ │ │ │ -Definition: typetraits.hh:194 │ │ │ │ │ -Dune::AlignedBase │ │ │ │ │ -CRTP base mixin class to check alignment. │ │ │ │ │ -Definition: debugalign.hh:66 │ │ │ │ │ -Dune::AlignedBase::~AlignedBase │ │ │ │ │ -~AlignedBase() │ │ │ │ │ -Definition: debugalign.hh:77 │ │ │ │ │ -Dune::AlignedBase::operator= │ │ │ │ │ -AlignedBase & operator=(AlignedBase &&)=default │ │ │ │ │ -Dune::AlignedBase::AlignedBase │ │ │ │ │ -AlignedBase(AlignedBase &&) │ │ │ │ │ -Definition: debugalign.hh:76 │ │ │ │ │ -Dune::AlignedBase::operator= │ │ │ │ │ -AlignedBase & operator=(const AlignedBase &)=default │ │ │ │ │ -Dune::AlignedBase::AlignedBase │ │ │ │ │ -AlignedBase(const AlignedBase &) │ │ │ │ │ -Definition: debugalign.hh:75 │ │ │ │ │ -Dune::AlignedBase::AlignedBase │ │ │ │ │ -AlignedBase() │ │ │ │ │ -Definition: debugalign.hh:74 │ │ │ │ │ -Dune::AlignedNumberImpl::AlignedNumber │ │ │ │ │ -aligned wrappers for arithmetic types │ │ │ │ │ -Definition: debugalign.hh:115 │ │ │ │ │ -Dune::AlignedNumberImpl::AlignedNumber::DUNE_ASSIGN_OP │ │ │ │ │ -DUNE_ASSIGN_OP(<<=) │ │ │ │ │ -Dune::AlignedNumberImpl::AlignedNumber::DUNE_ASSIGN_OP │ │ │ │ │ -DUNE_ASSIGN_OP(-=) │ │ │ │ │ -Dune::AlignedNumberImpl::AlignedNumber::operator+ │ │ │ │ │ -decltype(auto) operator+() const │ │ │ │ │ -Definition: debugalign.hh:174 │ │ │ │ │ -Dune::AlignedNumberImpl::AlignedNumber::DUNE_ASSIGN_OP │ │ │ │ │ -DUNE_ASSIGN_OP(+=) │ │ │ │ │ -Dune::AlignedNumberImpl::AlignedNumber::operator-- │ │ │ │ │ -decltype(auto) operator--(int) │ │ │ │ │ -Definition: debugalign.hh:169 │ │ │ │ │ -Dune::AlignedNumberImpl::AlignedNumber::DUNE_ASSIGN_OP │ │ │ │ │ -DUNE_ASSIGN_OP * DUNE_ASSIGN_OP(/=);DUNE_ASSIGN_OP(%= │ │ │ │ │ -Dune::AlignedNumberImpl::AlignedNumber::operator++ │ │ │ │ │ -decltype(auto) operator++(int) │ │ │ │ │ -Definition: debugalign.hh:166 │ │ │ │ │ -Dune::AlignedNumberImpl::AlignedNumber::operator! │ │ │ │ │ -decltype(auto) operator!() const │ │ │ │ │ -Definition: debugalign.hh:204 │ │ │ │ │ -Dune::AlignedNumberImpl::AlignedNumber::value │ │ │ │ │ -T & value() │ │ │ │ │ -Definition: debugalign.hh:132 │ │ │ │ │ -Dune::AlignedNumberImpl::AlignedNumber::value │ │ │ │ │ -const T & value() const │ │ │ │ │ -Definition: debugalign.hh:131 │ │ │ │ │ -Dune::AlignedNumberImpl::AlignedNumber::DUNE_ASSIGN_OP │ │ │ │ │ -DUNE_ASSIGN_OP^ DUNE_ASSIGN_OP(&=);DUNE_ASSIGN_OP(|= │ │ │ │ │ -Dune::AlignedNumberImpl::AlignedNumber::operator>> │ │ │ │ │ -friend std::basic_istream< charT, Traits > & operator>>(std::basic_istream< │ │ │ │ │ -charT, Traits > &str, AlignedNumber &u) │ │ │ │ │ -Definition: debugalign.hh:137 │ │ │ │ │ -Dune::AlignedNumberImpl::AlignedNumber::DUNE_ASSIGN_OP │ │ │ │ │ -DUNE_ASSIGN_OP(> >=) │ │ │ │ │ -Dune::AlignedNumberImpl::AlignedNumber::AlignedNumber │ │ │ │ │ -AlignedNumber()=default │ │ │ │ │ -Dune::AlignedNumberImpl::AlignedNumber::operator~ │ │ │ │ │ -decltype(auto) operator~() const │ │ │ │ │ -Definition: debugalign.hh:194 │ │ │ │ │ -Dune::AlignedNumberImpl::AlignedNumber::AlignedNumber │ │ │ │ │ -AlignedNumber(T value) │ │ │ │ │ -Definition: debugalign.hh:120 │ │ │ │ │ -Dune::AlignedNumberImpl::AlignedNumber::AlignedNumber │ │ │ │ │ -AlignedNumber(const AlignedNumber< U, uAlign > &o) │ │ │ │ │ -Definition: debugalign.hh:124 │ │ │ │ │ -Dune::AlignedNumberImpl::AlignedNumber::operator- │ │ │ │ │ -decltype(auto) operator-() const │ │ │ │ │ -Definition: debugalign.hh:178 │ │ │ │ │ -Dune::Simd::Overloads::ScalarType<_AlignedNumber<_T,_align_>_>::type │ │ │ │ │ -T type │ │ │ │ │ -Definition: debugalign.hh:509 │ │ │ │ │ -Dune::Simd::Overloads::ADLTag │ │ │ │ │ -Tag used to force late-binding lookup in Dune::Simd::Overloads. │ │ │ │ │ -Definition: base.hh:182 │ │ │ │ │ -Dune::Simd::Overloads::ScalarType │ │ │ │ │ -should have a member type type │ │ │ │ │ -Definition: standard.hh:60 │ │ │ │ │ -Dune::Simd::Overloads::RebindType │ │ │ │ │ -should have a member type type │ │ │ │ │ -Definition: standard.hh:67 │ │ │ │ │ -Dune::Simd::Overloads::LaneCount │ │ │ │ │ -should be derived from a Dune::index_constant │ │ │ │ │ -Definition: standard.hh:74 │ │ │ │ │ +Dune::hash_range │ │ │ │ │ +std::size_t hash_range(It first, It last) │ │ │ │ │ +Hashes all elements in the range [first,last) and returns the combined hash. │ │ │ │ │ +Definition: hash.hh:322 │ │ │ │ │ +Dune::hash_combine │ │ │ │ │ +void hash_combine(std::size_t &seed, const T &arg) │ │ │ │ │ +Calculates the hash value of arg and combines it in-place with seed. │ │ │ │ │ +Definition: hash.hh:307 │ │ │ │ │ +Dune::hash │ │ │ │ │ +Functor for hashing objects of type T. │ │ │ │ │ +Definition: hash.hh:40 │ │ │ │ │ +Dune::hash::operator() │ │ │ │ │ +std::size_t operator()(const T &t) const │ │ │ │ │ +Calculates the hash of t. │ │ │ │ │ +Definition: hash.hh:43 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00191.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: hybridutilities.hh File Reference │ │ │ │ +dune-common: conditional.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,82 +65,32 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
hybridutilities.hh File Reference
│ │ │ │ +
conditional.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <tuple>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ -#include <dune/common/typeutilities.hh>
│ │ │ │ -#include <dune/common/fvector.hh>
│ │ │ │ -#include <dune/common/indices.hh>
│ │ │ │ -#include <dune/common/assertandreturn.hh>
│ │ │ │ -#include <dune/common/rangeutilities.hh>
│ │ │ │ -
│ │ │ │ + │ │ │ │

Go to the source code of this file.

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

│ │ │ │ Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::Hybrid
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ Functions

template<class T >
constexpr auto Dune::Hybrid::size (const T &t)
 Size query. More...
 
template<class Container , class Index >
constexpr decltype(auto) Dune::Hybrid::elementAt (Container &&c, Index &&i)
 Get element at given position from container. More...
 
template<class Begin , class End >
constexpr auto Dune::Hybrid::integralRange (const Begin &begin, const End &end)
 Create an integral range. More...
 
template<class End >
constexpr auto Dune::Hybrid::integralRange (const End &end)
 Create an integral range starting from 0. More...
 
template<class Range , class F >
constexpr void Dune::Hybrid::forEach (Range &&range, F &&f)
 Range based for loop. More...
 
template<class Range , class T , class F >
constexpr T Dune::Hybrid::accumulate (Range &&range, T value, F &&f)
 Accumulate values. More...
 
template<class Condition , class IfFunc , class ElseFunc >
decltype(auto) Dune::Hybrid::ifElse (const Condition &condition, IfFunc &&ifFunc, ElseFunc &&elseFunc)
 A conditional expression. More...
 
template<class Condition , class IfFunc >
void Dune::Hybrid::ifElse (const Condition &condition, IfFunc &&ifFunc)
 A conditional expression. More...
 
template<class T1 , class T2 >
constexpr auto Dune::Hybrid::equals (T1 &&t1, T2 &&t2)
 Equality comparison. More...
 
template<class Cases , class Value , class Branches , class ElseBranch >
constexpr decltype(auto) Dune::Hybrid::switchCases (const Cases &cases, const Value &value, Branches &&branches, ElseBranch &&elseBranch)
 Switch statement. More...
 
template<class Cases , class Value , class Branches >
constexpr void Dune::Hybrid::switchCases (const Cases &cases, const Value &value, Branches &&branches)
 Switch statement. More...
 
template<typename T1 , typename T2 >
const T1 Dune::cond (bool b, const T1 &v1, const T2 &v2)
 conditional evaluate More...
 
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,78 +5,21 @@ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ Namespaces | Functions │ │ │ │ │ -hybridutilities.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +conditional.hh File Reference │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ -namespace  Dune::Hybrid │ │ │ │ │ -  │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ - constexpr auto Dune::Hybrid::size (const T &t) │ │ │ │ │ -  Size query. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -constexpr decltype(auto) Dune::Hybrid::elementAt (Container &&c, Index &&i) │ │ │ │ │ -  Get element at given position from container. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - constexpr auto Dune::Hybrid::integralRange (const Begin &begin, │ │ │ │ │ - const End &end) │ │ │ │ │ -  Create an integral range. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - constexpr auto Dune::Hybrid::integralRange (const End &end) │ │ │ │ │ -  Create an integral range starting from 0. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - constexpr void Dune::Hybrid::forEach (Range &&range, F &&f) │ │ │ │ │ -  Range based for loop. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - constexpr T Dune::Hybrid::accumulate (Range &&range, T value, F │ │ │ │ │ - &&f) │ │ │ │ │ -  Accumulate values. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - decltype(auto) Dune::Hybrid::ifElse (const Condition &condition, │ │ │ │ │ - IfFunc &&ifFunc, ElseFunc &&elseFunc) │ │ │ │ │ -  A conditional expression. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void Dune::Hybrid::ifElse (const Condition &condition, │ │ │ │ │ - IfFunc &&ifFunc) │ │ │ │ │ -  A conditional expression. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - constexpr auto Dune::Hybrid::equals (T1 &&t1, T2 &&t2) │ │ │ │ │ -  Equality comparison. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ -constexpr decltype(auto) Dune::Hybrid::switchCases (const Cases &cases, const │ │ │ │ │ - Value &value, Branches &&branches, ElseBranch │ │ │ │ │ - &&elseBranch) │ │ │ │ │ -  Switch statement. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - constexpr void Dune::Hybrid::switchCases (const Cases &cases, const │ │ │ │ │ - Value &value, Branches &&branches) │ │ │ │ │ -  Switch statement. More... │ │ │ │ │ +template │ │ │ │ │ +const T1 Dune::cond (bool b, const T1 &v1, const T2 &v2) │ │ │ │ │ +  conditional evaluate More... │ │ │ │ │   │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00191_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: hybridutilities.hh Source File │ │ │ │ +dune-common: conditional.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,354 +62,36 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
hybridutilities.hh
│ │ │ │ +
conditional.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 (C) 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_HYBRIDUTILITIES_HH
│ │ │ │ -
6#define DUNE_COMMON_HYBRIDUTILITIES_HH
│ │ │ │ -
7
│ │ │ │ -
8#include <tuple>
│ │ │ │ -
9#include <utility>
│ │ │ │ -
10
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
17
│ │ │ │ -
18
│ │ │ │ -
19
│ │ │ │ -
20namespace Dune {
│ │ │ │ -
21namespace Hybrid {
│ │ │ │ -
22
│ │ │ │ -
23namespace Impl {
│ │ │ │ -
24
│ │ │ │ -
25 // Try if tuple_size is implemented for class
│ │ │ │ -
26 template<class T, int i>
│ │ │ │ -
27 constexpr auto size(const Dune::FieldVector<T, i>&, const PriorityTag<5>&)
│ │ │ │ -
28 -> decltype(std::integral_constant<std::size_t,i>())
│ │ │ │ -
29 {
│ │ │ │ -
30 return {};
│ │ │ │ -
31 }
│ │ │ │ +Go to the documentation of this file.
1// SPDX-FileCopyrightInfo: Copyright (C) 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_CONDITIONAL_HH
│ │ │ │ +
4#define DUNE_COMMON_CONDITIONAL_HH
│ │ │ │ +
5
│ │ │ │ +
6namespace Dune
│ │ │ │ +
7{
│ │ │ │ +
8
│ │ │ │ +
27 template<typename T1, typename T2>
│ │ │ │ +
28 const T1 cond(bool b, const T1 & v1, const T2 & v2)
│ │ │ │ +
29 {
│ │ │ │ +
30 return (b ? v1 : v2);
│ │ │ │ +
31 }
│ │ │ │
32
│ │ │ │ -
33 // Try if tuple_size is implemented for class
│ │ │ │ -
34 template<class T>
│ │ │ │ -
35 constexpr auto size(const T&, const PriorityTag<3>&)
│ │ │ │ -
36 -> decltype(std::integral_constant<std::size_t,std::tuple_size<T>::value>())
│ │ │ │ -
37 {
│ │ │ │ -
38 return {};
│ │ │ │ -
39 }
│ │ │ │ -
40
│ │ │ │ -
41 // Try if there's a static constexpr size()
│ │ │ │ -
42 template<class T>
│ │ │ │ -
43 constexpr auto size(const T&, const PriorityTag<1>&)
│ │ │ │ -
44 -> decltype(std::integral_constant<std::size_t,T::size()>())
│ │ │ │ -
45 {
│ │ │ │ -
46 return {};
│ │ │ │ -
47 }
│ │ │ │ -
48
│ │ │ │ -
49 // As a last resort try if there's a static constexpr size()
│ │ │ │ -
50 template<class T>
│ │ │ │ -
51 constexpr auto size(const T& t, const PriorityTag<0>&)
│ │ │ │ -
52 {
│ │ │ │ -
53 return t.size();
│ │ │ │ -
54 }
│ │ │ │ -
55
│ │ │ │ -
56} // namespace Impl
│ │ │ │ -
57
│ │ │ │ -
58
│ │ │ │ -
59
│ │ │ │ -
81template<class T>
│ │ │ │ -
82constexpr auto size(const T& t)
│ │ │ │ -
83{
│ │ │ │ -
84 return Impl::size(t, PriorityTag<42>());
│ │ │ │ -
85}
│ │ │ │ -
86
│ │ │ │ -
87
│ │ │ │ -
88
│ │ │ │ -
89namespace Impl {
│ │ │ │ -
90
│ │ │ │ -
91 template<class Container, class Index,
│ │ │ │ -
92 std::enable_if_t<IsTuple<std::decay_t<Container>>::value, int> = 0>
│ │ │ │ -
93 constexpr decltype(auto) elementAt(Container&& c, Index&&, PriorityTag<2>)
│ │ │ │ -
94 {
│ │ │ │ -
95 return std::get<std::decay_t<Index>::value>(c);
│ │ │ │ -
96 }
│ │ │ │ -
97
│ │ │ │ -
98 template<class T, T... t, class Index>
│ │ │ │ -
99 constexpr decltype(auto) elementAt(std::integer_sequence<T, t...> c, Index, PriorityTag<1>)
│ │ │ │ -
100 {
│ │ │ │ -
101 return Dune::integerSequenceEntry(c, std::integral_constant<std::size_t, Index::value>());
│ │ │ │ -
102 }
│ │ │ │ -
103
│ │ │ │ -
104 template<class Container, class Index>
│ │ │ │ -
105 constexpr decltype(auto) elementAt(Container&& c, Index&& i, PriorityTag<0>)
│ │ │ │ -
106 {
│ │ │ │ -
107 return c[i];
│ │ │ │ -
108 }
│ │ │ │ -
109
│ │ │ │ -
110} // namespace Impl
│ │ │ │ -
111
│ │ │ │ -
112
│ │ │ │ -
113
│ │ │ │ -
134template<class Container, class Index>
│ │ │ │ -
135constexpr decltype(auto) elementAt(Container&& c, Index&& i)
│ │ │ │ -
136{
│ │ │ │ -
137 return Impl::elementAt(std::forward<Container>(c), std::forward<Index>(i), PriorityTag<42>());
│ │ │ │ -
138}
│ │ │ │ -
139
│ │ │ │ -
140
│ │ │ │ -
141
│ │ │ │ -
142namespace Impl {
│ │ │ │ -
143
│ │ │ │ -
144 template<class Begin, class End,
│ │ │ │ -
145 std::enable_if_t<IsIntegralConstant<Begin>::value and IsIntegralConstant<End>::value, int> = 0>
│ │ │ │ -
146 constexpr auto integralRange(const Begin& /*begin*/, const End& /*end*/, const PriorityTag<1>&)
│ │ │ │ -
147 {
│ │ │ │ -
148 static_assert(Begin::value <= End::value, "You cannot create an integralRange where end<begin");
│ │ │ │ - │ │ │ │ -
150 }
│ │ │ │ -
151
│ │ │ │ -
152 // This should be constexpr but gcc-4.9 does not support
│ │ │ │ -
153 // the relaxed constexpr requirements. Hence for being
│ │ │ │ -
154 // constexpr the function body can only contain a return
│ │ │ │ -
155 // statement and no assertion before this.
│ │ │ │ -
156 template<class Begin, class End>
│ │ │ │ -
157 constexpr auto integralRange(const Begin& begin, const End& end, const PriorityTag<0>&)
│ │ │ │ -
158 {
│ │ │ │ -
159 return DUNE_ASSERT_AND_RETURN(begin<=end, Dune::IntegralRange<End>(begin, end));
│ │ │ │ -
160 }
│ │ │ │ -
161
│ │ │ │ -
162} // namespace Impl
│ │ │ │ -
163
│ │ │ │ -
164
│ │ │ │ -
165
│ │ │ │ -
183template<class Begin, class End>
│ │ │ │ -
184constexpr auto integralRange(const Begin& begin, const End& end)
│ │ │ │ -
185{
│ │ │ │ -
186 return Impl::integralRange(begin, end, PriorityTag<42>());
│ │ │ │ -
187}
│ │ │ │ -
188
│ │ │ │ -
202template<class End>
│ │ │ │ -
203constexpr auto integralRange(const End& end)
│ │ │ │ -
204{
│ │ │ │ - │ │ │ │ -
206}
│ │ │ │ -
207
│ │ │ │ -
208
│ │ │ │ -
209
│ │ │ │ -
210namespace Impl {
│ │ │ │ -
211
│ │ │ │ -
212 template<class T>
│ │ │ │ -
213 constexpr void evaluateFoldExpression(std::initializer_list<T>&&)
│ │ │ │ -
214 {}
│ │ │ │ -
215
│ │ │ │ -
216 template<class Range, class F, class Index, Index... i>
│ │ │ │ -
217 constexpr void forEachIndex(Range&& range, F&& f, std::integer_sequence<Index, i...>)
│ │ │ │ -
218 {
│ │ │ │ -
219 evaluateFoldExpression<int>({(f(Hybrid::elementAt(range, std::integral_constant<Index,i>())), 0)...});
│ │ │ │ -
220 }
│ │ │ │ -
221
│ │ │ │ -
222 template<class F, class Index, Index... i>
│ │ │ │ -
223 constexpr void forEach(std::integer_sequence<Index, i...> /*range*/, F&& f, PriorityTag<2>)
│ │ │ │ -
224 {
│ │ │ │ -
225 evaluateFoldExpression<int>({(f(std::integral_constant<Index,i>()), 0)...});
│ │ │ │ -
226 }
│ │ │ │ -
227
│ │ │ │ -
228
│ │ │ │ -
229 template<class Range, class F,
│ │ │ │ -
230 std::enable_if_t<IsIntegralConstant<decltype(Hybrid::size(std::declval<Range>()))>::value, int> = 0>
│ │ │ │ -
231 constexpr void forEach(Range&& range, F&& f, PriorityTag<1>)
│ │ │ │ -
232 {
│ │ │ │ -
233 auto size = Hybrid::size(range);
│ │ │ │ -
234 auto indices = std::make_index_sequence<size>();
│ │ │ │ -
235 (forEachIndex)(std::forward<Range>(range), std::forward<F>(f), indices);
│ │ │ │ -
236 }
│ │ │ │ -
237
│ │ │ │ -
238 template<class Range, class F>
│ │ │ │ -
239 constexpr void forEach(Range&& range, F&& f, PriorityTag<0>)
│ │ │ │ -
240 {
│ │ │ │ -
241 for(auto&& e : range)
│ │ │ │ -
242 f(e);
│ │ │ │ -
243 }
│ │ │ │ -
244
│ │ │ │ -
245} // namespace Impl
│ │ │ │ -
246
│ │ │ │ -
247
│ │ │ │ -
248
│ │ │ │ -
267template<class Range, class F>
│ │ │ │ -
268constexpr void forEach(Range&& range, F&& f)
│ │ │ │ -
269{
│ │ │ │ -
270 Impl::forEach(std::forward<Range>(range), std::forward<F>(f), PriorityTag<42>());
│ │ │ │ -
271}
│ │ │ │ -
272
│ │ │ │ -
273
│ │ │ │ -
274
│ │ │ │ -
290template<class Range, class T, class F>
│ │ │ │ -
291constexpr T accumulate(Range&& range, T value, F&& f)
│ │ │ │ -
292{
│ │ │ │ -
293 forEach(std::forward<Range>(range), [&](auto&& entry) {
│ │ │ │ -
294 value = f(value, entry);
│ │ │ │ -
295 });
│ │ │ │ -
296 return value;
│ │ │ │ -
297}
│ │ │ │ -
298
│ │ │ │ -
299
│ │ │ │ -
300
│ │ │ │ -
301namespace Impl {
│ │ │ │ -
302
│ │ │ │ -
303 struct Id {
│ │ │ │ -
304 template<class T>
│ │ │ │ -
305 constexpr T operator()(T&& x) const {
│ │ │ │ -
306 return std::forward<T>(x);
│ │ │ │ -
307 }
│ │ │ │ -
308 };
│ │ │ │ -
309
│ │ │ │ -
310 template<class IfFunc, class ElseFunc>
│ │ │ │ -
311 constexpr decltype(auto) ifElse(std::true_type, IfFunc&& ifFunc, ElseFunc&& /*elseFunc*/)
│ │ │ │ -
312 {
│ │ │ │ -
313 return ifFunc(Id{});
│ │ │ │ -
314 }
│ │ │ │ -
315
│ │ │ │ -
316 template<class IfFunc, class ElseFunc>
│ │ │ │ -
317 constexpr decltype(auto) ifElse(std::false_type, IfFunc&& /*ifFunc*/, ElseFunc&& elseFunc)
│ │ │ │ -
318 {
│ │ │ │ -
319 return elseFunc(Id{});
│ │ │ │ -
320 }
│ │ │ │ -
321
│ │ │ │ -
322 template<class IfFunc, class ElseFunc>
│ │ │ │ -
323 decltype(auto) ifElse(const bool& condition, IfFunc&& ifFunc, ElseFunc&& elseFunc)
│ │ │ │ -
324 {
│ │ │ │ -
325 if (condition)
│ │ │ │ -
326 return ifFunc(Id{});
│ │ │ │ -
327 else
│ │ │ │ -
328 return elseFunc(Id{});
│ │ │ │ -
329 }
│ │ │ │ -
330
│ │ │ │ -
331} // namespace Impl
│ │ │ │ -
332
│ │ │ │ -
333
│ │ │ │ -
334
│ │ │ │ -
355template<class Condition, class IfFunc, class ElseFunc>
│ │ │ │ -
356decltype(auto) ifElse(const Condition& condition, IfFunc&& ifFunc, ElseFunc&& elseFunc)
│ │ │ │ -
357{
│ │ │ │ -
358 return Impl::ifElse(condition, std::forward<IfFunc>(ifFunc), std::forward<ElseFunc>(elseFunc));
│ │ │ │ -
359}
│ │ │ │ -
360
│ │ │ │ -
368template<class Condition, class IfFunc>
│ │ │ │ -
369void ifElse(const Condition& condition, IfFunc&& ifFunc)
│ │ │ │ -
370{
│ │ │ │ -
371 ifElse(condition, std::forward<IfFunc>(ifFunc), [](auto&&) {});
│ │ │ │ -
372}
│ │ │ │ -
373
│ │ │ │ -
374
│ │ │ │ -
375
│ │ │ │ -
376namespace Impl {
│ │ │ │ -
377
│ │ │ │ -
378 template<class T1, class T2>
│ │ │ │ -
379 constexpr auto equals(const T1& /*t1*/, const T2& /*t2*/, PriorityTag<1>) -> decltype(T1::value, T2::value, std::integral_constant<bool,T1::value == T2::value>())
│ │ │ │ -
380 { return {}; }
│ │ │ │ -
381
│ │ │ │ -
382 template<class T1, class T2>
│ │ │ │ -
383 constexpr auto equals(const T1& t1, const T2& t2, PriorityTag<0>)
│ │ │ │ -
384 {
│ │ │ │ -
385 return t1==t2;
│ │ │ │ -
386 }
│ │ │ │ -
387
│ │ │ │ -
388} // namespace Impl
│ │ │ │ -
389
│ │ │ │ -
390
│ │ │ │ -
391
│ │ │ │ -
401template<class T1, class T2>
│ │ │ │ -
402constexpr auto equals(T1&& t1, T2&& t2)
│ │ │ │ -
403{
│ │ │ │ -
404 return Impl::equals(std::forward<T1>(t1), std::forward<T2>(t2), PriorityTag<1>());
│ │ │ │ -
405}
│ │ │ │ -
406
│ │ │ │ -
407
│ │ │ │ -
408
│ │ │ │ -
409namespace Impl {
│ │ │ │ -
410
│ │ │ │ -
411 template<class Result, class T, class Value, class Branches, class ElseBranch>
│ │ │ │ -
412 constexpr Result switchCases(std::integer_sequence<T>, const Value& /*value*/, Branches&& /*branches*/, ElseBranch&& elseBranch)
│ │ │ │ -
413 {
│ │ │ │ -
414 return elseBranch();
│ │ │ │ -
415 }
│ │ │ │ -
416
│ │ │ │ -
417 template<class Result, class T, T t0, T... tt, class Value, class Branches, class ElseBranch>
│ │ │ │ -
418 constexpr Result switchCases(std::integer_sequence<T, t0, tt...>, const Value& value, Branches&& branches, ElseBranch&& elseBranch)
│ │ │ │ -
419 {
│ │ │ │ -
420 return ifElse(
│ │ │ │ -
421 Hybrid::equals(std::integral_constant<T, t0>(), value),
│ │ │ │ -
422 [&](auto id) -> decltype(auto) {
│ │ │ │ -
423 return id(branches)(std::integral_constant<T, t0>());
│ │ │ │ -
424 }, [&](auto id) -> decltype(auto) {
│ │ │ │ -
425 return Impl::switchCases<Result>(id(std::integer_sequence<T, tt...>()), value, branches, elseBranch);
│ │ │ │ -
426 });
│ │ │ │ -
427 }
│ │ │ │ -
428
│ │ │ │ -
429} // namespace Impl
│ │ │ │ -
430
│ │ │ │ -
431
│ │ │ │ -
432
│ │ │ │ -
460template<class Cases, class Value, class Branches, class ElseBranch>
│ │ │ │ -
461constexpr decltype(auto) switchCases(const Cases& cases, const Value& value, Branches&& branches, ElseBranch&& elseBranch)
│ │ │ │ -
462{
│ │ │ │ -
463 return Impl::switchCases<decltype(elseBranch())>(cases, value, std::forward<Branches>(branches), std::forward<ElseBranch>(elseBranch));
│ │ │ │ -
464}
│ │ │ │ -
465
│ │ │ │ -
486template<class Cases, class Value, class Branches>
│ │ │ │ -
487constexpr void switchCases(const Cases& cases, const Value& value, Branches&& branches)
│ │ │ │ -
488{
│ │ │ │ -
489 Impl::switchCases<void>(cases, value, std::forward<Branches>(branches), []() {});
│ │ │ │ -
490}
│ │ │ │ -
491
│ │ │ │ -
492
│ │ │ │ -
493} // namespace Hybrid
│ │ │ │ -
494} // namespace Dune
│ │ │ │ -
495
│ │ │ │ -
496
│ │ │ │ -
497#endif // #ifndef DUNE_COMMON_HYBRIDUTILITIES_HH
│ │ │ │ -
Implements a vector constructed from a given type representing a field and a compile-time given size.
│ │ │ │ - │ │ │ │ -
Utilities for type computations, constraining overloads, ...
│ │ │ │ -
Traits for type conversions and type information.
│ │ │ │ -
Utilities for reduction like operations on ranges.
│ │ │ │ - │ │ │ │ -
constexpr index_constant< 0 > _0
Compile time index with value 0.
Definition: indices.hh:53
│ │ │ │ -
static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from >, std::integral_constant< T, to >) noexcept
Definition: rangeutilities.hh:300
│ │ │ │ -
void ifElse(const Condition &condition, IfFunc &&ifFunc)
A conditional expression.
Definition: hybridutilities.hh:369
│ │ │ │ -
constexpr auto size(const T &t)
Size query.
Definition: hybridutilities.hh:82
│ │ │ │ -
constexpr auto integralRange(const End &end)
Create an integral range starting from 0.
Definition: hybridutilities.hh:203
│ │ │ │ -
constexpr auto equals(T1 &&t1, T2 &&t2)
Equality comparison.
Definition: hybridutilities.hh:402
│ │ │ │ -
constexpr void forEach(Range &&range, F &&f)
Range based for loop.
Definition: hybridutilities.hh:268
│ │ │ │ -
constexpr decltype(auto) switchCases(const Cases &cases, const Value &value, Branches &&branches, ElseBranch &&elseBranch)
Switch statement.
Definition: hybridutilities.hh:461
│ │ │ │ -
decltype(auto) ifElse(const Condition &condition, IfFunc &&ifFunc, ElseFunc &&elseFunc)
A conditional expression.
Definition: hybridutilities.hh:356
│ │ │ │ -
constexpr auto integralRange(const Begin &begin, const End &end)
Create an integral range.
Definition: hybridutilities.hh:184
│ │ │ │ -
constexpr decltype(auto) elementAt(Container &&c, Index &&i)
Get element at given position from container.
Definition: hybridutilities.hh:135
│ │ │ │ -
constexpr T accumulate(Range &&range, T value, F &&f)
Accumulate values.
Definition: hybridutilities.hh:291
│ │ │ │ -
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:462
│ │ │ │ -
#define DUNE_ASSERT_AND_RETURN(C, X)
Asserts a condition and return on success in constexpr context.
Definition: assertandreturn.hh:22
│ │ │ │ +
33} // end namespace Dune
│ │ │ │ +
34
│ │ │ │ +
35#endif // DUNE_COMMON_CONDITIONAL_HH
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
vector space out of a tensor product of fields.
Definition: fvector.hh:95
│ │ │ │ -
dynamic integer range for use in range-based for loops
Definition: rangeutilities.hh:175
│ │ │ │ -
static integer range for use in range-based for loops
Definition: rangeutilities.hh:225
│ │ │ │ -
Check if T is an std::integral_constant<I, i>
Definition: typetraits.hh:384
│ │ │ │ -
Helper class for tagging priorities.
Definition: typeutilities.hh:73
│ │ │ │ -
Helper class for tagging priorities.
Definition: typeutilities.hh:87
│ │ │ │ +
const T1 cond(bool b, const T1 &v1, const T2 &v2)
conditional evaluate
Definition: conditional.hh:28
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,447 +4,37 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -hybridutilities.hh │ │ │ │ │ +conditional.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 (C) DUNE Project contributors, see file │ │ │ │ │ + 1// SPDX-FileCopyrightInfo: Copyright (C) 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_HYBRIDUTILITIES_HH │ │ │ │ │ - 6#define DUNE_COMMON_HYBRIDUTILITIES_HH │ │ │ │ │ - 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9#include │ │ │ │ │ - 10 │ │ │ │ │ - 11#include │ │ │ │ │ - 12#include │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ - 16#include │ │ │ │ │ - 17 │ │ │ │ │ - 18 │ │ │ │ │ - 19 │ │ │ │ │ - 20namespace Dune { │ │ │ │ │ -21namespace Hybrid { │ │ │ │ │ - 22 │ │ │ │ │ - 23namespace Impl { │ │ │ │ │ - 24 │ │ │ │ │ - 25 // Try if tuple_size is implemented for class │ │ │ │ │ - 26 template │ │ │ │ │ - 27 constexpr auto size(const Dune::FieldVector&, const PriorityTag<5>&) │ │ │ │ │ - 28 -> decltype(std::integral_constant()) │ │ │ │ │ + 2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception │ │ │ │ │ + 3#ifndef DUNE_COMMON_CONDITIONAL_HH │ │ │ │ │ + 4#define DUNE_COMMON_CONDITIONAL_HH │ │ │ │ │ + 5 │ │ │ │ │ + 6namespace Dune │ │ │ │ │ + 7{ │ │ │ │ │ + 8 │ │ │ │ │ + 27 template │ │ │ │ │ +28 const T1 cond(bool b, const T1 & v1, const T2 & v2) │ │ │ │ │ 29 { │ │ │ │ │ - 30 return {}; │ │ │ │ │ + 30 return (b ? v1 : v2); │ │ │ │ │ 31 } │ │ │ │ │ 32 │ │ │ │ │ - 33 // Try if tuple_size is implemented for class │ │ │ │ │ - 34 template │ │ │ │ │ - 35 constexpr auto size(const T&, const PriorityTag<3>&) │ │ │ │ │ - 36 -> decltype(std::integral_constant::value> │ │ │ │ │ -()) │ │ │ │ │ - 37 { │ │ │ │ │ - 38 return {}; │ │ │ │ │ - 39 } │ │ │ │ │ - 40 │ │ │ │ │ - 41 // Try if there's a static constexpr size() │ │ │ │ │ - 42 template │ │ │ │ │ - 43 constexpr auto size(const T&, const PriorityTag<1>&) │ │ │ │ │ - 44 -> decltype(std::integral_constant()) │ │ │ │ │ - 45 { │ │ │ │ │ - 46 return {}; │ │ │ │ │ - 47 } │ │ │ │ │ - 48 │ │ │ │ │ - 49 // As a last resort try if there's a static constexpr size() │ │ │ │ │ - 50 template │ │ │ │ │ - 51 constexpr auto size(const T& t, const PriorityTag<0>&) │ │ │ │ │ - 52 { │ │ │ │ │ - 53 return t.size(); │ │ │ │ │ - 54 } │ │ │ │ │ - 55 │ │ │ │ │ - 56} // namespace Impl │ │ │ │ │ - 57 │ │ │ │ │ - 58 │ │ │ │ │ - 59 │ │ │ │ │ - 81template │ │ │ │ │ -82constexpr auto size(const T& t) │ │ │ │ │ - 83{ │ │ │ │ │ - 84 return Impl::size(t, PriorityTag<42>()); │ │ │ │ │ - 85} │ │ │ │ │ - 86 │ │ │ │ │ - 87 │ │ │ │ │ - 88 │ │ │ │ │ - 89namespace Impl { │ │ │ │ │ - 90 │ │ │ │ │ - 91 template>::value, int> = 0> │ │ │ │ │ - 93 constexpr decltype(auto) elementAt(Container&& c, Index&&, PriorityTag<2>) │ │ │ │ │ - 94 { │ │ │ │ │ - 95 return std::get::value>(c); │ │ │ │ │ - 96 } │ │ │ │ │ - 97 │ │ │ │ │ - 98 template │ │ │ │ │ - 99 constexpr decltype(auto) elementAt(std::integer_sequence c, Index, │ │ │ │ │ -PriorityTag<1>) │ │ │ │ │ - 100 { │ │ │ │ │ - 101 return Dune::integerSequenceEntry(c, std::integral_constant()); │ │ │ │ │ - 102 } │ │ │ │ │ - 103 │ │ │ │ │ - 104 template │ │ │ │ │ - 105 constexpr decltype(auto) elementAt(Container&& c, Index&& i, │ │ │ │ │ -PriorityTag<0>) │ │ │ │ │ - 106 { │ │ │ │ │ - 107 return c[i]; │ │ │ │ │ - 108 } │ │ │ │ │ - 109 │ │ │ │ │ - 110} // namespace Impl │ │ │ │ │ - 111 │ │ │ │ │ - 112 │ │ │ │ │ - 113 │ │ │ │ │ - 134template │ │ │ │ │ -135constexpr decltype(auto) elementAt(Container&& c, Index&& i) │ │ │ │ │ - 136{ │ │ │ │ │ - 137 return Impl::elementAt(std::forward(c), std::forward(i), │ │ │ │ │ -PriorityTag<42>()); │ │ │ │ │ - 138} │ │ │ │ │ - 139 │ │ │ │ │ - 140 │ │ │ │ │ - 141 │ │ │ │ │ - 142namespace Impl { │ │ │ │ │ - 143 │ │ │ │ │ - 144 template::value and │ │ │ │ │ -IsIntegralConstant::value, int> = 0> │ │ │ │ │ - 146 constexpr auto integralRange(const Begin& /*begin*/, const End& /*end*/, │ │ │ │ │ -const PriorityTag<1>&) │ │ │ │ │ - 147 { │ │ │ │ │ - 148 static_assert(Begin::value <= End::value, "You cannot create an │ │ │ │ │ -integralRange where end(); │ │ │ │ │ - 150 } │ │ │ │ │ - 151 │ │ │ │ │ - 152 // This should be constexpr but gcc-4.9 does not support │ │ │ │ │ - 153 // the relaxed constexpr requirements. Hence for being │ │ │ │ │ - 154 // constexpr the function body can only contain a return │ │ │ │ │ - 155 // statement and no assertion before this. │ │ │ │ │ - 156 template │ │ │ │ │ - 157 constexpr auto integralRange(const Begin& begin, const End& end, const │ │ │ │ │ -PriorityTag<0>&) │ │ │ │ │ - 158 { │ │ │ │ │ - 159 return DUNE_ASSERT_AND_RETURN(begin<=end, Dune::IntegralRange(begin, │ │ │ │ │ -end)); │ │ │ │ │ - 160 } │ │ │ │ │ - 161 │ │ │ │ │ - 162} // namespace Impl │ │ │ │ │ - 163 │ │ │ │ │ - 164 │ │ │ │ │ - 165 │ │ │ │ │ - 183template │ │ │ │ │ -184constexpr auto integralRange(const Begin& begin, const End& end) │ │ │ │ │ - 185{ │ │ │ │ │ - 186 return Impl::integralRange(begin, end, PriorityTag<42>()); │ │ │ │ │ - 187} │ │ │ │ │ - 188 │ │ │ │ │ - 202template │ │ │ │ │ -203constexpr auto integralRange(const End& end) │ │ │ │ │ - 204{ │ │ │ │ │ - 205 return Impl::integralRange(Dune::Indices::_0, end, PriorityTag<42>()); │ │ │ │ │ - 206} │ │ │ │ │ - 207 │ │ │ │ │ - 208 │ │ │ │ │ - 209 │ │ │ │ │ - 210namespace Impl { │ │ │ │ │ - 211 │ │ │ │ │ - 212 template │ │ │ │ │ - 213 constexpr void evaluateFoldExpression(std::initializer_list&&) │ │ │ │ │ - 214 {} │ │ │ │ │ - 215 │ │ │ │ │ - 216 template │ │ │ │ │ - 217 constexpr void forEachIndex(Range&& range, F&& f, std:: │ │ │ │ │ -integer_sequence) │ │ │ │ │ - 218 { │ │ │ │ │ - 219 evaluateFoldExpression({(f(Hybrid::elementAt(range, std:: │ │ │ │ │ -integral_constant())), 0)...}); │ │ │ │ │ - 220 } │ │ │ │ │ - 221 │ │ │ │ │ - 222 template │ │ │ │ │ - 223 constexpr void forEach(std::integer_sequence /*range*/, F&& │ │ │ │ │ -f, PriorityTag<2>) │ │ │ │ │ - 224 { │ │ │ │ │ - 225 evaluateFoldExpression({(f(std::integral_constant()), │ │ │ │ │ -0)...}); │ │ │ │ │ - 226 } │ │ │ │ │ - 227 │ │ │ │ │ - 228 │ │ │ │ │ - 229 template()))>::value, int> = 0> │ │ │ │ │ - 231 constexpr void forEach(Range&& range, F&& f, PriorityTag<1>) │ │ │ │ │ - 232 { │ │ │ │ │ - 233 auto size = Hybrid::size(range); │ │ │ │ │ - 234 auto indices = std::make_index_sequence(); │ │ │ │ │ - 235 (forEachIndex)(std::forward(range), std::forward(f), indices); │ │ │ │ │ - 236 } │ │ │ │ │ - 237 │ │ │ │ │ - 238 template │ │ │ │ │ - 239 constexpr void forEach(Range&& range, F&& f, PriorityTag<0>) │ │ │ │ │ - 240 { │ │ │ │ │ - 241 for(auto&& e : range) │ │ │ │ │ - 242 f(e); │ │ │ │ │ - 243 } │ │ │ │ │ - 244 │ │ │ │ │ - 245} // namespace Impl │ │ │ │ │ - 246 │ │ │ │ │ - 247 │ │ │ │ │ - 248 │ │ │ │ │ - 267template │ │ │ │ │ -268constexpr void forEach(Range&& range, F&& f) │ │ │ │ │ - 269{ │ │ │ │ │ - 270 Impl::forEach(std::forward(range), std::forward(f), │ │ │ │ │ -PriorityTag<42>()); │ │ │ │ │ - 271} │ │ │ │ │ - 272 │ │ │ │ │ - 273 │ │ │ │ │ - 274 │ │ │ │ │ - 290template │ │ │ │ │ -291constexpr T accumulate(Range&& range, T value, F&& f) │ │ │ │ │ - 292{ │ │ │ │ │ - 293 forEach(std::forward(range), [&](auto&& entry) { │ │ │ │ │ - 294 value = f(value, entry); │ │ │ │ │ - 295 }); │ │ │ │ │ - 296 return value; │ │ │ │ │ - 297} │ │ │ │ │ - 298 │ │ │ │ │ - 299 │ │ │ │ │ - 300 │ │ │ │ │ - 301namespace Impl { │ │ │ │ │ - 302 │ │ │ │ │ - 303 struct Id { │ │ │ │ │ - 304 template │ │ │ │ │ - 305 constexpr T operator()(T&& x) const { │ │ │ │ │ - 306 return std::forward(x); │ │ │ │ │ - 307 } │ │ │ │ │ - 308 }; │ │ │ │ │ - 309 │ │ │ │ │ - 310 template │ │ │ │ │ - 311 constexpr decltype(auto) ifElse(std::true_type, IfFunc&& ifFunc, │ │ │ │ │ -ElseFunc&& /*elseFunc*/) │ │ │ │ │ - 312 { │ │ │ │ │ - 313 return ifFunc(Id{}); │ │ │ │ │ - 314 } │ │ │ │ │ - 315 │ │ │ │ │ - 316 template │ │ │ │ │ - 317 constexpr decltype(auto) ifElse(std::false_type, IfFunc&& /*ifFunc*/, │ │ │ │ │ -ElseFunc&& elseFunc) │ │ │ │ │ - 318 { │ │ │ │ │ - 319 return elseFunc(Id{}); │ │ │ │ │ - 320 } │ │ │ │ │ - 321 │ │ │ │ │ - 322 template │ │ │ │ │ - 323 decltype(auto) ifElse(const bool& condition, IfFunc&& ifFunc, ElseFunc&& │ │ │ │ │ -elseFunc) │ │ │ │ │ - 324 { │ │ │ │ │ - 325 if (condition) │ │ │ │ │ - 326 return ifFunc(Id{}); │ │ │ │ │ - 327 else │ │ │ │ │ - 328 return elseFunc(Id{}); │ │ │ │ │ - 329 } │ │ │ │ │ - 330 │ │ │ │ │ - 331} // namespace Impl │ │ │ │ │ - 332 │ │ │ │ │ - 333 │ │ │ │ │ - 334 │ │ │ │ │ - 355template │ │ │ │ │ -356decltype(auto) ifElse(const Condition& condition, IfFunc&& ifFunc, │ │ │ │ │ -ElseFunc&& elseFunc) │ │ │ │ │ - 357{ │ │ │ │ │ - 358 return Impl::ifElse(condition, std::forward(ifFunc), std:: │ │ │ │ │ -forward(elseFunc)); │ │ │ │ │ - 359} │ │ │ │ │ - 360 │ │ │ │ │ - 368template │ │ │ │ │ -369void ifElse(const Condition& condition, IfFunc&& ifFunc) │ │ │ │ │ - 370{ │ │ │ │ │ - 371 ifElse(condition, std::forward(ifFunc), [](auto&&) {}); │ │ │ │ │ - 372} │ │ │ │ │ - 373 │ │ │ │ │ - 374 │ │ │ │ │ - 375 │ │ │ │ │ - 376namespace Impl { │ │ │ │ │ - 377 │ │ │ │ │ - 378 template │ │ │ │ │ - 379 constexpr auto equals(const T1& /*t1*/, const T2& /*t2*/, PriorityTag<1>) │ │ │ │ │ --> decltype(T1::value, T2::value, std::integral_constant()) │ │ │ │ │ - 380 { return {}; } │ │ │ │ │ - 381 │ │ │ │ │ - 382 template │ │ │ │ │ - 383 constexpr auto equals(const T1& t1, const T2& t2, PriorityTag<0>) │ │ │ │ │ - 384 { │ │ │ │ │ - 385 return t1==t2; │ │ │ │ │ - 386 } │ │ │ │ │ - 387 │ │ │ │ │ - 388} // namespace Impl │ │ │ │ │ - 389 │ │ │ │ │ - 390 │ │ │ │ │ - 391 │ │ │ │ │ - 401template │ │ │ │ │ -402constexpr auto equals(T1&& t1, T2&& t2) │ │ │ │ │ - 403{ │ │ │ │ │ - 404 return Impl::equals(std::forward(t1), std::forward(t2), │ │ │ │ │ -PriorityTag<1>()); │ │ │ │ │ - 405} │ │ │ │ │ - 406 │ │ │ │ │ - 407 │ │ │ │ │ - 408 │ │ │ │ │ - 409namespace Impl { │ │ │ │ │ - 410 │ │ │ │ │ - 411 template │ │ │ │ │ - 412 constexpr Result switchCases(std::integer_sequence, const Value& / │ │ │ │ │ -*value*/, Branches&& /*branches*/, ElseBranch&& elseBranch) │ │ │ │ │ - 413 { │ │ │ │ │ - 414 return elseBranch(); │ │ │ │ │ - 415 } │ │ │ │ │ - 416 │ │ │ │ │ - 417 template │ │ │ │ │ - 418 constexpr Result switchCases(std::integer_sequence, const │ │ │ │ │ -Value& value, Branches&& branches, ElseBranch&& elseBranch) │ │ │ │ │ - 419 { │ │ │ │ │ - 420 return ifElse( │ │ │ │ │ - 421 Hybrid::equals(std::integral_constant(), value), │ │ │ │ │ - 422 [&](auto id) -> decltype(auto) { │ │ │ │ │ - 423 return id(branches)(std::integral_constant()); │ │ │ │ │ - 424 }, [&](auto id) -> decltype(auto) { │ │ │ │ │ - 425 return Impl::switchCases(id(std::integer_sequence()), │ │ │ │ │ -value, branches, elseBranch); │ │ │ │ │ - 426 }); │ │ │ │ │ - 427 } │ │ │ │ │ - 428 │ │ │ │ │ - 429} // namespace Impl │ │ │ │ │ - 430 │ │ │ │ │ - 431 │ │ │ │ │ - 432 │ │ │ │ │ - 460template │ │ │ │ │ -461constexpr decltype(auto) switchCases(const Cases& cases, const Value& value, │ │ │ │ │ -Branches&& branches, ElseBranch&& elseBranch) │ │ │ │ │ - 462{ │ │ │ │ │ - 463 return Impl::switchCases(cases, value, std:: │ │ │ │ │ -forward(branches), std::forward(elseBranch)); │ │ │ │ │ - 464} │ │ │ │ │ - 465 │ │ │ │ │ - 486template │ │ │ │ │ -487constexpr void switchCases(const Cases& cases, const Value& value, │ │ │ │ │ -Branches&& branches) │ │ │ │ │ - 488{ │ │ │ │ │ - 489 Impl::switchCases(cases, value, std::forward(branches), [] │ │ │ │ │ -() {}); │ │ │ │ │ - 490} │ │ │ │ │ - 491 │ │ │ │ │ - 492 │ │ │ │ │ - 493} // namespace Hybrid │ │ │ │ │ - 494} // namespace Dune │ │ │ │ │ - 495 │ │ │ │ │ - 496 │ │ │ │ │ - 497#endif // #ifndef DUNE_COMMON_HYBRIDUTILITIES_HH │ │ │ │ │ -fvector.hh │ │ │ │ │ -Implements a vector constructed from a given type representing a field and a │ │ │ │ │ -compile-time given size. │ │ │ │ │ -indices.hh │ │ │ │ │ -typeutilities.hh │ │ │ │ │ -Utilities for type computations, constraining overloads, ... │ │ │ │ │ -typetraits.hh │ │ │ │ │ -Traits for type conversions and type information. │ │ │ │ │ -rangeutilities.hh │ │ │ │ │ -Utilities for reduction like operations on ranges. │ │ │ │ │ -assertandreturn.hh │ │ │ │ │ -Dune::Indices::_0 │ │ │ │ │ -constexpr index_constant< 0 > _0 │ │ │ │ │ -Compile time index with value 0. │ │ │ │ │ -Definition: indices.hh:53 │ │ │ │ │ -Dune::range │ │ │ │ │ -static StaticIntegralRange< T, to, from > range(std::integral_constant< T, from │ │ │ │ │ ->, std::integral_constant< T, to >) noexcept │ │ │ │ │ -Definition: rangeutilities.hh:300 │ │ │ │ │ -Dune::Hybrid::ifElse │ │ │ │ │ -void ifElse(const Condition &condition, IfFunc &&ifFunc) │ │ │ │ │ -A conditional expression. │ │ │ │ │ -Definition: hybridutilities.hh:369 │ │ │ │ │ -Dune::Hybrid::size │ │ │ │ │ -constexpr auto size(const T &t) │ │ │ │ │ -Size query. │ │ │ │ │ -Definition: hybridutilities.hh:82 │ │ │ │ │ -Dune::Hybrid::integralRange │ │ │ │ │ -constexpr auto integralRange(const End &end) │ │ │ │ │ -Create an integral range starting from 0. │ │ │ │ │ -Definition: hybridutilities.hh:203 │ │ │ │ │ -Dune::Hybrid::equals │ │ │ │ │ -constexpr auto equals(T1 &&t1, T2 &&t2) │ │ │ │ │ -Equality comparison. │ │ │ │ │ -Definition: hybridutilities.hh:402 │ │ │ │ │ -Dune::Hybrid::forEach │ │ │ │ │ -constexpr void forEach(Range &&range, F &&f) │ │ │ │ │ -Range based for loop. │ │ │ │ │ -Definition: hybridutilities.hh:268 │ │ │ │ │ -Dune::Hybrid::switchCases │ │ │ │ │ -constexpr decltype(auto) switchCases(const Cases &cases, const Value &value, │ │ │ │ │ -Branches &&branches, ElseBranch &&elseBranch) │ │ │ │ │ -Switch statement. │ │ │ │ │ -Definition: hybridutilities.hh:461 │ │ │ │ │ -Dune::Hybrid::ifElse │ │ │ │ │ -decltype(auto) ifElse(const Condition &condition, IfFunc &&ifFunc, ElseFunc │ │ │ │ │ -&&elseFunc) │ │ │ │ │ -A conditional expression. │ │ │ │ │ -Definition: hybridutilities.hh:356 │ │ │ │ │ -Dune::Hybrid::integralRange │ │ │ │ │ -constexpr auto integralRange(const Begin &begin, const End &end) │ │ │ │ │ -Create an integral range. │ │ │ │ │ -Definition: hybridutilities.hh:184 │ │ │ │ │ -Dune::Hybrid::elementAt │ │ │ │ │ -constexpr decltype(auto) elementAt(Container &&c, Index &&i) │ │ │ │ │ -Get element at given position from container. │ │ │ │ │ -Definition: hybridutilities.hh:135 │ │ │ │ │ -Dune::Hybrid::accumulate │ │ │ │ │ -constexpr T accumulate(Range &&range, T value, F &&f) │ │ │ │ │ -Accumulate values. │ │ │ │ │ -Definition: hybridutilities.hh:291 │ │ │ │ │ -Dune::integerSequenceEntry │ │ │ │ │ -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:462 │ │ │ │ │ -DUNE_ASSERT_AND_RETURN │ │ │ │ │ -#define DUNE_ASSERT_AND_RETURN(C, X) │ │ │ │ │ -Asserts a condition and return on success in constexpr context. │ │ │ │ │ -Definition: assertandreturn.hh:22 │ │ │ │ │ + 33} // end namespace Dune │ │ │ │ │ + 34 │ │ │ │ │ + 35#endif // DUNE_COMMON_CONDITIONAL_HH │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::FieldVector │ │ │ │ │ -vector space out of a tensor product of fields. │ │ │ │ │ -Definition: fvector.hh:95 │ │ │ │ │ -Dune::IntegralRange │ │ │ │ │ -dynamic integer range for use in range-based for loops │ │ │ │ │ -Definition: rangeutilities.hh:175 │ │ │ │ │ -Dune::StaticIntegralRange │ │ │ │ │ -static integer range for use in range-based for loops │ │ │ │ │ -Definition: rangeutilities.hh:225 │ │ │ │ │ -Dune::IsIntegralConstant │ │ │ │ │ -Check if T is an std::integral_constant │ │ │ │ │ -Definition: typetraits.hh:384 │ │ │ │ │ -Dune::PriorityTag │ │ │ │ │ -Helper class for tagging priorities. │ │ │ │ │ -Definition: typeutilities.hh:73 │ │ │ │ │ -Dune::PriorityTag<_0_> │ │ │ │ │ -Helper class for tagging priorities. │ │ │ │ │ -Definition: typeutilities.hh:87 │ │ │ │ │ +Dune::cond │ │ │ │ │ +const T1 cond(bool b, const T1 &v1, const T2 &v2) │ │ │ │ │ +conditional evaluate │ │ │ │ │ +Definition: conditional.hh:28 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00194.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: path.hh File Reference │ │ │ │ +dune-common: referencehelper.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -64,55 +64,59 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Namespaces | │ │ │ │ -Functions
│ │ │ │ -
path.hh File Reference
│ │ │ │ +Typedefs | │ │ │ │ +Functions | │ │ │ │ +Variables
│ │ │ │ +
referencehelper.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

Utilities for handling filesystem paths. │ │ │ │ -More...

│ │ │ │ -
#include <string>
│ │ │ │ +
#include <type_traits>
│ │ │ │ +#include <functional>
│ │ │ │
│ │ │ │

Go to the source code of this file.

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ +Typedefs

template<class T >
using Dune::ResolveRef_t = std::remove_reference_t< decltype(Dune::resolveRef(std::declval< T & >()))>
 Type trait to resolve std::reference_wrapper. More...
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ Functions

std::string Dune::concatPaths (const std::string &base, const std::string &p)
 concatenate two paths More...
 
std::string Dune::processPath (const std::string &p)
 sanitize a path for further processing More...
 
bool Dune::pathIndicatesDirectory (const std::string &p)
 check whether the given path indicates that it is a directory More...
 
std::string Dune::prettyPath (const std::string &p, bool isDirectory)
 pretty print path More...
 
std::string Dune::prettyPath (const std::string &p)
 pretty print path More...
 
std::string Dune::relativePath (const std::string &newbase, const std::string &p)
 compute a relative path between two paths More...
 
template<class T >
constexpr T & Dune::resolveRef (T &gf) noexcept
 Helper function to resolve std::reference_wrapper. More...
 
template<class T >
const auto & Dune::resolveRef (T &&gf)=delete
 
template<class T >
constexpr T & Dune::resolveRef (std::reference_wrapper< T > gf) noexcept
 Helper function to resolve std::reference_wrapper. More...
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Variables

template<class T >
constexpr bool Dune::IsReferenceWrapper_v = Impl::IsReferenceWrapper<T>::value
 Helper to detect if given type is a std::reference_wrapper. More...
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Utilities for handling filesystem paths.

│ │ │ │ -
Author
Jö Fahlke jorri.nosp@m.t@jo.nosp@m.rrit..nosp@m.de
│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -utf-8 │ │ │ │ │ +us-ascii │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,45 +4,43 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Namespaces | Functions │ │ │ │ │ -path.hh File Reference │ │ │ │ │ -Common » Utilities » Filesystem_Paths │ │ │ │ │ -Utilities for handling filesystem paths. More... │ │ │ │ │ -#include │ │ │ │ │ +Namespaces | Typedefs | Functions | Variables │ │ │ │ │ +referencehelper.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ - Functions │ │ │ │ │ -std::string Dune::concatPaths (const std::string &base, const std::string &p) │ │ │ │ │ -  concatenate two paths More... │ │ │ │ │ + Typedefs │ │ │ │ │ +template │ │ │ │ │ +using Dune::ResolveRef_t = std::remove_reference_t< decltype(Dune::resolveRef │ │ │ │ │ + (std::declval< T & >()))> │ │ │ │ │ +  Type trait to resolve std::reference_wrapper. More... │ │ │ │ │   │ │ │ │ │ -std::string Dune::processPath (const std::string &p) │ │ │ │ │ -  sanitize a path for further processing More... │ │ │ │ │ + Functions │ │ │ │ │ +template │ │ │ │ │ +constexpr T & Dune::resolveRef (T &gf) noexcept │ │ │ │ │ +  Helper function to resolve std::reference_wrapper. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + const auto & Dune::resolveRef (T &&gf)=delete │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +constexpr T & Dune::resolveRef (std::reference_wrapper< T > gf) noexcept │ │ │ │ │ +  Helper function to resolve std::reference_wrapper. More... │ │ │ │ │ +  │ │ │ │ │ + Variables │ │ │ │ │ +template │ │ │ │ │ +constexpr bool Dune::IsReferenceWrapper_v = Impl::IsReferenceWrapper::value │ │ │ │ │ +  Helper to detect if given type is a std::reference_wrapper. │ │ │ │ │ + More... │ │ │ │ │   │ │ │ │ │ - bool Dune::pathIndicatesDirectory (const std::string &p) │ │ │ │ │ -  check whether the given path indicates that it is a directory │ │ │ │ │ - More... │ │ │ │ │ -  │ │ │ │ │ -std::string Dune::prettyPath (const std::string &p, bool isDirectory) │ │ │ │ │ -  pretty print path More... │ │ │ │ │ -  │ │ │ │ │ -std::string Dune::prettyPath (const std::string &p) │ │ │ │ │ -  pretty print path More... │ │ │ │ │ -  │ │ │ │ │ -std::string Dune::relativePath (const std::string &newbase, const std::string │ │ │ │ │ - &p) │ │ │ │ │ -  compute a relative path between two paths More... │ │ │ │ │ -  │ │ │ │ │ -***** Detailed Description ***** │ │ │ │ │ -Utilities for handling filesystem paths. │ │ │ │ │ - Author │ │ │ │ │ - Jö Fahlke jorri.nosp@m.t@jo.nosp@m.rrit..nosp@m.de │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00194_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: path.hh Source File │ │ │ │ +dune-common: referencehelper.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,54 +62,88 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
path.hh
│ │ │ │ +
referencehelper.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 (C) 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_PATH_HH
│ │ │ │ -
6#define DUNE_COMMON_PATH_HH
│ │ │ │ +
5#ifndef DUNE_COMMON_REFERENCE_HELPER_HH
│ │ │ │ +
6#define DUNE_COMMON_REFERENCE_HELPER_HH
│ │ │ │
7
│ │ │ │ -
8#include <string>
│ │ │ │ -
9
│ │ │ │ -
10namespace Dune {
│ │ │ │ -
23
│ │ │ │ -
51 std::string concatPaths(const std::string& base, const std::string& p);
│ │ │ │ +
8#include <type_traits>
│ │ │ │ +
9#include <functional>
│ │ │ │ +
10
│ │ │ │ +
11
│ │ │ │ +
12
│ │ │ │ +
13namespace Dune {
│ │ │ │ +
14
│ │ │ │ +
15namespace Impl {
│ │ │ │ +
16
│ │ │ │ +
17 template<class T>
│ │ │ │ +
18 class IsReferenceWrapper : public std::false_type {};
│ │ │ │ +
19
│ │ │ │ +
20 template<class T>
│ │ │ │ +
21 class IsReferenceWrapper<std::reference_wrapper<T>> : public std::true_type {};
│ │ │ │ +
22
│ │ │ │ +
23 template<class T>
│ │ │ │ +
24 class IsReferenceWrapper<const std::reference_wrapper<T>> : public std::true_type {};
│ │ │ │ +
25
│ │ │ │ +
26} // namespace Dune::Impl
│ │ │ │ +
27
│ │ │ │ +
28
│ │ │ │ +
34template<class T>
│ │ │ │ +
35constexpr bool IsReferenceWrapper_v = Impl::IsReferenceWrapper<T>::value;
│ │ │ │ +
36
│ │ │ │ +
37
│ │ │ │ +
46template<class T>
│ │ │ │ +
47constexpr T& resolveRef(T& gf) noexcept
│ │ │ │ +
48{
│ │ │ │ +
49 return gf;
│ │ │ │ +
50}
│ │ │ │ +
51
│ │ │ │
52
│ │ │ │ -
54
│ │ │ │ -
98 std::string processPath(const std::string& p);
│ │ │ │ -
99
│ │ │ │ +
53// There's no overload for non std::reference_wrapper r-values,
│ │ │ │ +
54// because this may lead to undefined behavior whenever the
│ │ │ │ +
55// return value is stored.
│ │ │ │ +
56// Notice that deleting the overload is not necessary, but
│ │ │ │ +
57// helps to document that it is missing on purpose. It also
│ │ │ │ +
58// leads to nicer error messages.
│ │ │ │ +
59template<class T>
│ │ │ │ +
60const auto& resolveRef(T&& gf) = delete;
│ │ │ │ +
61
│ │ │ │ +
62
│ │ │ │ +
81template<class T>
│ │ │ │ +
82constexpr T& resolveRef(std::reference_wrapper<T> gf) noexcept
│ │ │ │ +
83{
│ │ │ │ +
84 return gf.get();
│ │ │ │ +
85}
│ │ │ │ +
86
│ │ │ │ +
87
│ │ │ │ +
88
│ │ │ │ +
99template<class T>
│ │ │ │ +
100using ResolveRef_t = std::remove_reference_t<decltype(Dune::resolveRef(std::declval<T&>()))>;
│ │ │ │
101
│ │ │ │ -
109 bool pathIndicatesDirectory(const std::string& p);
│ │ │ │ -
110
│ │ │ │ -
112
│ │ │ │ -
151 std::string prettyPath(const std::string& p, bool isDirectory);
│ │ │ │ -
152
│ │ │ │ -
154
│ │ │ │ -
160 std::string prettyPath(const std::string& p);
│ │ │ │ -
161
│ │ │ │ -
163
│ │ │ │ -
179 std::string relativePath(const std::string& newbase, const std::string& p);
│ │ │ │ -
180
│ │ │ │ -
182}
│ │ │ │ -
183
│ │ │ │ -
184#endif // DUNE_COMMON_PATH_HH
│ │ │ │ -
std::string processPath(const std::string &p)
sanitize a path for further processing
Definition: path.cc:41
│ │ │ │ -
bool pathIndicatesDirectory(const std::string &p)
check whether the given path indicates that it is a directory
Definition: path.cc:115
│ │ │ │ -
std::string prettyPath(const std::string &p, bool isDirectory)
pretty print path
Definition: path.cc:126
│ │ │ │ -
std::string relativePath(const std::string &newbase, const std::string &p)
compute a relative path between two paths
Definition: path.cc:153
│ │ │ │ -
std::string concatPaths(const std::string &base, const std::string &p)
concatenate two paths
Definition: path.cc:32
│ │ │ │ +
102
│ │ │ │ +
103} // namespace Dune
│ │ │ │ +
104
│ │ │ │ +
105
│ │ │ │ +
106
│ │ │ │ +
107#endif // DUNE_COMMON_REFERENCE_HELPER_HH
│ │ │ │ +
constexpr bool IsReferenceWrapper_v
Helper to detect if given type is a std::reference_wrapper.
Definition: referencehelper.hh:35
│ │ │ │ +
constexpr T & resolveRef(T &gf) noexcept
Helper function to resolve std::reference_wrapper.
Definition: referencehelper.hh:47
│ │ │ │ +
STL namespace.
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ +
std::remove_reference_t< decltype(Dune::resolveRef(std::declval< T & >()))> ResolveRef_t
Type trait to resolve std::reference_wrapper.
Definition: referencehelper.hh:100
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,68 +4,100 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -path.hh │ │ │ │ │ +referencehelper.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 (C) 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_PATH_HH │ │ │ │ │ - 6#define DUNE_COMMON_PATH_HH │ │ │ │ │ + 5#ifndef DUNE_COMMON_REFERENCE_HELPER_HH │ │ │ │ │ + 6#define DUNE_COMMON_REFERENCE_HELPER_HH │ │ │ │ │ 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9 │ │ │ │ │ - 10namespace Dune { │ │ │ │ │ - 23 │ │ │ │ │ - 51 std::string concatPaths(const std::string& base, const std::string& p); │ │ │ │ │ + 8#include │ │ │ │ │ + 9#include │ │ │ │ │ + 10 │ │ │ │ │ + 11 │ │ │ │ │ + 12 │ │ │ │ │ + 13namespace Dune { │ │ │ │ │ + 14 │ │ │ │ │ + 15namespace Impl { │ │ │ │ │ + 16 │ │ │ │ │ + 17 template │ │ │ │ │ + 18 class IsReferenceWrapper : public std::false_type {}; │ │ │ │ │ + 19 │ │ │ │ │ + 20 template │ │ │ │ │ + 21 class IsReferenceWrapper> : public std::true_type │ │ │ │ │ +{}; │ │ │ │ │ + 22 │ │ │ │ │ + 23 template │ │ │ │ │ + 24 class IsReferenceWrapper> : public std:: │ │ │ │ │ +true_type {}; │ │ │ │ │ + 25 │ │ │ │ │ + 26} // namespace Dune::Impl │ │ │ │ │ + 27 │ │ │ │ │ + 28 │ │ │ │ │ + 34template │ │ │ │ │ +35constexpr bool IsReferenceWrapper_v = Impl::IsReferenceWrapper::value; │ │ │ │ │ + 36 │ │ │ │ │ + 37 │ │ │ │ │ + 46template │ │ │ │ │ +47constexpr T& resolveRef(T& gf) noexcept │ │ │ │ │ + 48{ │ │ │ │ │ + 49 return gf; │ │ │ │ │ + 50} │ │ │ │ │ + 51 │ │ │ │ │ 52 │ │ │ │ │ - 54 │ │ │ │ │ - 98 std::string processPath(const std::string& p); │ │ │ │ │ - 99 │ │ │ │ │ + 53// There's no overload for non std::reference_wrapper r-values, │ │ │ │ │ + 54// because this may lead to undefined behavior whenever the │ │ │ │ │ + 55// return value is stored. │ │ │ │ │ + 56// Notice that deleting the overload is not necessary, but │ │ │ │ │ + 57// helps to document that it is missing on purpose. It also │ │ │ │ │ + 58// leads to nicer error messages. │ │ │ │ │ + 59template │ │ │ │ │ +60const auto& resolveRef(T&& gf) = delete; │ │ │ │ │ + 61 │ │ │ │ │ + 62 │ │ │ │ │ + 81template │ │ │ │ │ +82constexpr T& resolveRef(std::reference_wrapper gf) noexcept │ │ │ │ │ + 83{ │ │ │ │ │ + 84 return gf.get(); │ │ │ │ │ + 85} │ │ │ │ │ + 86 │ │ │ │ │ + 87 │ │ │ │ │ + 88 │ │ │ │ │ + 99template │ │ │ │ │ +100using ResolveRef_t = std::remove_reference_t()))>; │ │ │ │ │ 101 │ │ │ │ │ - 109 bool pathIndicatesDirectory(const std::string& p); │ │ │ │ │ - 110 │ │ │ │ │ - 112 │ │ │ │ │ - 151 std::string prettyPath(const std::string& p, bool isDirectory); │ │ │ │ │ - 152 │ │ │ │ │ - 154 │ │ │ │ │ - 160 std::string prettyPath(const std::string& p); │ │ │ │ │ - 161 │ │ │ │ │ - 163 │ │ │ │ │ - 179 std::string relativePath(const std::string& newbase, const std::string& │ │ │ │ │ -p); │ │ │ │ │ - 180 │ │ │ │ │ - 182} │ │ │ │ │ - 183 │ │ │ │ │ - 184#endif // DUNE_COMMON_PATH_HH │ │ │ │ │ -Dune::processPath │ │ │ │ │ -std::string processPath(const std::string &p) │ │ │ │ │ -sanitize a path for further processing │ │ │ │ │ -Definition: path.cc:41 │ │ │ │ │ -Dune::pathIndicatesDirectory │ │ │ │ │ -bool pathIndicatesDirectory(const std::string &p) │ │ │ │ │ -check whether the given path indicates that it is a directory │ │ │ │ │ -Definition: path.cc:115 │ │ │ │ │ -Dune::prettyPath │ │ │ │ │ -std::string prettyPath(const std::string &p, bool isDirectory) │ │ │ │ │ -pretty print path │ │ │ │ │ -Definition: path.cc:126 │ │ │ │ │ -Dune::relativePath │ │ │ │ │ -std::string relativePath(const std::string &newbase, const std::string &p) │ │ │ │ │ -compute a relative path between two paths │ │ │ │ │ -Definition: path.cc:153 │ │ │ │ │ -Dune::concatPaths │ │ │ │ │ -std::string concatPaths(const std::string &base, const std::string &p) │ │ │ │ │ -concatenate two paths │ │ │ │ │ -Definition: path.cc:32 │ │ │ │ │ + 102 │ │ │ │ │ + 103} // namespace Dune │ │ │ │ │ + 104 │ │ │ │ │ + 105 │ │ │ │ │ + 106 │ │ │ │ │ + 107#endif // DUNE_COMMON_REFERENCE_HELPER_HH │ │ │ │ │ +Dune::IsReferenceWrapper_v │ │ │ │ │ +constexpr bool IsReferenceWrapper_v │ │ │ │ │ +Helper to detect if given type is a std::reference_wrapper. │ │ │ │ │ +Definition: referencehelper.hh:35 │ │ │ │ │ +Dune::resolveRef │ │ │ │ │ +constexpr T & resolveRef(T &gf) noexcept │ │ │ │ │ +Helper function to resolve std::reference_wrapper. │ │ │ │ │ +Definition: referencehelper.hh:47 │ │ │ │ │ +std │ │ │ │ │ +STL namespace. │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ +Dune::ResolveRef_t │ │ │ │ │ +std::remove_reference_t< decltype(Dune::resolveRef(std::declval< T & >()))> │ │ │ │ │ +ResolveRef_t │ │ │ │ │ +Type trait to resolve std::reference_wrapper. │ │ │ │ │ +Definition: referencehelper.hh:100 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00197.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: dynmatrix.hh File Reference │ │ │ │ +dune-common: parameterizedobject.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,50 +65,36 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces
│ │ │ │ -
dynmatrix.hh File Reference
│ │ │ │ +
parameterizedobject.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

This file implements a dense matrix with dynamic numbers of rows and columns. │ │ │ │ -More...

│ │ │ │ -
#include <cmath>
│ │ │ │ -#include <cstddef>
│ │ │ │ -#include <iostream>
│ │ │ │ -#include <initializer_list>
│ │ │ │ -#include <dune/common/boundschecking.hh>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ -#include <dune/common/dynvector.hh>
│ │ │ │ -#include <dune/common/densematrix.hh>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ +
#include <functional>
│ │ │ │ +#include <map>
│ │ │ │ +#include <memory>
│ │ │ │ +#include <dune/common/exceptions.hh>
│ │ │ │ +#include <dune/common/typeutilities.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::DenseMatVecTraits< DynamicMatrix< K > >
 
struct  Dune::FieldTraits< DynamicMatrix< K > >
 
class  Dune::DynamicMatrix< K >
 Construct a matrix with a dynamic size. More...
class  Dune::ParameterizedObjectFactory< TypeT(Args...), KeyT >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

namespace  Dune
 Dune namespace.
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

This file implements a dense matrix with dynamic numbers of rows and columns.

│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -5,38 +5,24 @@ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ Classes | Namespaces │ │ │ │ │ -dynmatrix.hh File Reference │ │ │ │ │ -Common » Dense_Matrix_and_Vector_Template_Library │ │ │ │ │ -This file implements a dense matrix with dynamic numbers of rows and columns. │ │ │ │ │ -More... │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +parameterizedobject.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -struct  Dune::DenseMatVecTraits<_DynamicMatrix<_K_>_> │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::FieldTraits<_DynamicMatrix<_K_>_> │ │ │ │ │ -  │ │ │ │ │ - class  Dune::DynamicMatrix<_K_> │ │ │ │ │ -  Construct a matrix with a dynamic size. More... │ │ │ │ │ +class  Dune::ParameterizedObjectFactory<_TypeT(Args...),_KeyT_> │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ -***** Detailed Description ***** │ │ │ │ │ -This file implements a dense matrix with dynamic numbers of rows and columns. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00197_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: dynmatrix.hh Source File │ │ │ │ +dune-common: parameterizedobject.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,189 +62,163 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
dynmatrix.hh
│ │ │ │ +
parameterizedobject.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:
│ │ │ │ +Go to the documentation of this file.
1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
│ │ │ │ +
2// vi: set et ts=4 sw=4 sts=4:
│ │ │ │
3// SPDX-FileCopyrightInfo: Copyright (C) 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_DYNMATRIX_HH
│ │ │ │ -
6#define DUNE_DYNMATRIX_HH
│ │ │ │ +
5#ifndef DUNE_COMMON_PARAMETERIZEDOBJECT_HH
│ │ │ │ +
6#define DUNE_COMMON_PARAMETERIZEDOBJECT_HH
│ │ │ │
7
│ │ │ │ -
8#include <cmath>
│ │ │ │ -
9#include <cstddef>
│ │ │ │ -
10#include <iostream>
│ │ │ │ -
11#include <initializer_list>
│ │ │ │ -
12
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ -
18
│ │ │ │ -
19namespace Dune
│ │ │ │ -
20{
│ │ │ │ -
21
│ │ │ │ -
31 template< class K > class DynamicMatrix;
│ │ │ │ -
32
│ │ │ │ -
33 template< class K >
│ │ │ │ - │ │ │ │ -
35 {
│ │ │ │ - │ │ │ │ +
8#include <functional>
│ │ │ │ +
9#include <map>
│ │ │ │ +
10#include <memory>
│ │ │ │ +
11
│ │ │ │ + │ │ │ │ + │ │ │ │ +
14
│ │ │ │ +
15namespace Dune {
│ │ │ │ +
16
│ │ │ │ +
34template<typename Signature,
│ │ │ │ +
35 typename KeyT = std::string>
│ │ │ │ + │ │ │ │
37
│ │ │ │ - │ │ │ │ -
39
│ │ │ │ - │ │ │ │ - │ │ │ │ -
42
│ │ │ │ -
43 typedef std::vector<K> container_type;
│ │ │ │ -
44 typedef K value_type;
│ │ │ │ -
45 typedef typename container_type::size_type size_type;
│ │ │ │ -
46 };
│ │ │ │ +
38template<typename TypeT,
│ │ │ │ +
39 typename KeyT,
│ │ │ │ +
40 typename... Args>
│ │ │ │ +
41class ParameterizedObjectFactory<TypeT(Args...), KeyT>
│ │ │ │ +
42{
│ │ │ │ +
43 public:
│ │ │ │ +
44
│ │ │ │ +
46 typedef KeyT Key;
│ │ │ │
47
│ │ │ │ -
48 template< class K >
│ │ │ │ - │ │ │ │ -
50 {
│ │ │ │ - │ │ │ │ - │ │ │ │ -
53 };
│ │ │ │ +
49 using Type = TypeT;
│ │ │ │ +
50
│ │ │ │ +
51 protected:
│ │ │ │ +
52
│ │ │ │ +
53 using Creator = std::function<Type(Args...)>;
│ │ │ │
54
│ │ │ │ -
59 template<class K>
│ │ │ │ -
60 class DynamicMatrix : public DenseMatrix< DynamicMatrix<K> >
│ │ │ │ -
61 {
│ │ │ │ -
62 std::vector< DynamicVector<K> > _data;
│ │ │ │ - │ │ │ │ -
64 public:
│ │ │ │ -
65 typedef typename Base::size_type size_type;
│ │ │ │ -
66 typedef typename Base::value_type value_type;
│ │ │ │ -
67 typedef typename Base::row_type row_type;
│ │ │ │ -
68
│ │ │ │ -
69 //===== constructors
│ │ │ │ - │ │ │ │ -
72
│ │ │ │ - │ │ │ │ -
75 _data(r, row_type(c, v) )
│ │ │ │ -
76 {}
│ │ │ │ -
77
│ │ │ │ -
80 DynamicMatrix (std::initializer_list<DynamicVector<K>> const &ll)
│ │ │ │ -
81 : _data(ll)
│ │ │ │ -
82 {}
│ │ │ │ -
83
│ │ │ │ -
84
│ │ │ │ -
85 template <class T,
│ │ │ │ -
86 typename = std::enable_if_t<!Dune::IsNumber<T>::value && HasDenseMatrixAssigner<DynamicMatrix, T>::value>>
│ │ │ │ -
87 DynamicMatrix(T const& rhs)
│ │ │ │ -
88 {
│ │ │ │ -
89 *this = rhs;
│ │ │ │ -
90 }
│ │ │ │ -
91
│ │ │ │ -
92 //==== resize related methods
│ │ │ │ - │ │ │ │ -
107 {
│ │ │ │ -
108 _data.resize(0);
│ │ │ │ -
109 _data.resize(r, row_type(c, v) );
│ │ │ │ -
110 }
│ │ │ │ -
111
│ │ │ │ -
112 //===== assignment
│ │ │ │ -
113 // General assignment with resizing
│ │ │ │ -
114 template <typename T,
│ │ │ │ -
115 typename = std::enable_if_t<!Dune::IsNumber<T>::value>>
│ │ │ │ -
116 DynamicMatrix& operator=(T const& rhs) {
│ │ │ │ -
117 _data.resize(rhs.N());
│ │ │ │ -
118 std::fill(_data.begin(), _data.end(), row_type(rhs.M(), K(0)));
│ │ │ │ -
119 Base::operator=(rhs);
│ │ │ │ -
120 return *this;
│ │ │ │ -
121 }
│ │ │ │ -
122
│ │ │ │ -
123 // Specialisation: scalar assignment (no resizing)
│ │ │ │ -
124 template <typename T,
│ │ │ │ -
125 typename = std::enable_if_t<Dune::IsNumber<T>::value>>
│ │ │ │ - │ │ │ │ -
127 std::fill(_data.begin(), _data.end(), scalar);
│ │ │ │ -
128 return *this;
│ │ │ │ -
129 }
│ │ │ │ -
130
│ │ │ │ - │ │ │ │ -
133 {
│ │ │ │ -
134 DynamicMatrix AT(this->M(), this->N());
│ │ │ │ -
135 for( size_type i = 0; i < this->N(); ++i )
│ │ │ │ -
136 for( size_type j = 0; j < this->M(); ++j )
│ │ │ │ -
137 AT[j][i] = (*this)[i][j];
│ │ │ │ -
138 return AT;
│ │ │ │ -
139 }
│ │ │ │ -
140
│ │ │ │ -
141 // make this thing a matrix
│ │ │ │ -
142 size_type mat_rows() const { return _data.size(); }
│ │ │ │ - │ │ │ │ -
144 assert(this->rows());
│ │ │ │ -
145 return _data.front().size();
│ │ │ │ -
146 }
│ │ │ │ - │ │ │ │ -
148 DUNE_ASSERT_BOUNDS(i < _data.size());
│ │ │ │ -
149 return _data[i];
│ │ │ │ -
150 }
│ │ │ │ -
151 const row_type & mat_access(size_type i) const {
│ │ │ │ -
152 DUNE_ASSERT_BOUNDS(i < _data.size());
│ │ │ │ -
153 return _data[i];
│ │ │ │ -
154 }
│ │ │ │ -
155 };
│ │ │ │ +
55 template<class F>
│ │ │ │ + │ │ │ │ +
57 -> decltype( std::declval<F>()(std::declval<Args>()...), std::true_type())
│ │ │ │ +
58 {
│ │ │ │ +
59 return {};
│ │ │ │ +
60 }
│ │ │ │ +
61
│ │ │ │ +
62 template<class F>
│ │ │ │ +
63 static constexpr std::false_type has_proper_signature(Dune::PriorityTag<0>)
│ │ │ │ +
64 {
│ │ │ │ +
65 return {};
│ │ │ │ +
66 }
│ │ │ │ +
67
│ │ │ │ +
68 public:
│ │ │ │ +
69
│ │ │ │ +
77 Type create(Key const& key, Args ... args) const {
│ │ │ │ +
78 typename Registry::const_iterator i = registry_.find(key);
│ │ │ │ +
79 if (i == registry_.end()) {
│ │ │ │ + │ │ │ │ +
81 "ParametrizedObjectFactory: key ``" <<
│ │ │ │ +
82 key << "'' not registered");
│ │ │ │ +
83 }
│ │ │ │ +
84 else return i->second(args...);
│ │ │ │ +
85 }
│ │ │ │ +
86
│ │ │ │ +
100 template<class Impl>
│ │ │ │ +
101 void define(Key const& key)
│ │ │ │ +
102 {
│ │ │ │ +
103 registry_[key] = DefaultCreator<Impl>();
│ │ │ │ +
104 }
│ │ │ │ +
105
│ │ │ │ +
119 template<class F,
│ │ │ │ +
120 typename std::enable_if<has_proper_signature<F>(PriorityTag<42>()), int>::type = 0>
│ │ │ │ +
121 void define(Key const& key, F&& f)
│ │ │ │ +
122 {
│ │ │ │ +
123 registry_[key] = f;
│ │ │ │ +
124 }
│ │ │ │ +
125
│ │ │ │ +
140 template<class Impl,
│ │ │ │ +
141 typename std::enable_if<
│ │ │ │ +
142 std::is_convertible<Impl, Type>::value
│ │ │ │ +
143 and not std::is_convertible<Impl, Creator>::value,
│ │ │ │ +
144 int>::type = 0>
│ │ │ │ +
145 void define(Key const& key, Impl&& t)
│ │ │ │ +
146 {
│ │ │ │ +
147 registry_[key] = [=](Args...) { return t;};
│ │ │ │ +
148 }
│ │ │ │ +
149
│ │ │ │ +
150 bool contains(Key const& key) const
│ │ │ │ +
151 {
│ │ │ │ +
152 return registry_.count(key);
│ │ │ │ +
153 }
│ │ │ │ +
154
│ │ │ │ +
155 private:
│ │ │ │
156
│ │ │ │ -
159} // end namespace
│ │ │ │ -
160
│ │ │ │ -
161#endif
│ │ │ │ -
Macro for wrapping boundary checks.
│ │ │ │ -
This file implements a dense vector with a dynamic size.
│ │ │ │ -
A few common exception classes.
│ │ │ │ -
Traits for type conversions and type information.
│ │ │ │ -
Implements a matrix constructed from a given type representing a field and a compile-time given numbe...
│ │ │ │ -
#define DUNE_ASSERT_BOUNDS(cond)
If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do nothing.
Definition: boundschecking.hh:30
│ │ │ │ +
157 template<class T>
│ │ │ │ +
158 struct Tag{};
│ │ │ │ +
159
│ │ │ │ +
160 template<class Impl>
│ │ │ │ +
161 struct DefaultCreator
│ │ │ │ +
162 {
│ │ │ │ +
163 template<class... T>
│ │ │ │ +
164 Type operator()(T&&... args) const
│ │ │ │ +
165 {
│ │ │ │ +
166 return DefaultCreator::create(Tag<Type>(), PriorityTag<42>(), std::forward<T>(args)...);
│ │ │ │ +
167 }
│ │ │ │ +
168
│ │ │ │ +
169 template<class Target, class... T>
│ │ │ │ +
170 static Type create(Tag<Target>, PriorityTag<1>, T&& ... args) {
│ │ │ │ +
171 return Impl(std::forward<T>(args)...);
│ │ │ │ +
172 }
│ │ │ │ +
173
│ │ │ │ +
174 template<class Target, class... T>
│ │ │ │ +
175 static Type create(Tag<std::unique_ptr<Target>>, PriorityTag<2>, T&& ... args) {
│ │ │ │ +
176 return std::make_unique<Impl>(std::forward<T>(args)...);
│ │ │ │ +
177 }
│ │ │ │ +
178
│ │ │ │ +
179 template<class Target, class... T>
│ │ │ │ +
180 static Type create(Tag<std::shared_ptr<Target>>, PriorityTag<3>, T&& ... args) {
│ │ │ │ +
181 return std::make_shared<Impl>(std::forward<T>(args)...);
│ │ │ │ +
182 }
│ │ │ │ +
183
│ │ │ │ +
184 };
│ │ │ │ +
185
│ │ │ │ +
186 typedef std::map<Key, Creator> Registry;
│ │ │ │ +
187 Registry registry_;
│ │ │ │ +
188};
│ │ │ │ +
189
│ │ │ │ +
190
│ │ │ │ +
191
│ │ │ │ +
192} // end namespace Dune
│ │ │ │ +
193
│ │ │ │ +
194#endif // DUNE_COMMON_PARAMETERIZEDOBJECT_HH
│ │ │ │ +
Utilities for type computations, constraining overloads, ...
│ │ │ │ +
A few common exception classes.
│ │ │ │ +
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
A dense n x m matrix.
Definition: densematrix.hh:140
│ │ │ │ -
derived_type & operator=(const RHS &rhs)
Definition: densematrix.hh:279
│ │ │ │ -
constexpr size_type M() const
number of columns
Definition: densematrix.hh:703
│ │ │ │ -
Traits::value_type value_type
export the type representing the field
Definition: densematrix.hh:157
│ │ │ │ -
constexpr size_type rows() const
number of rows
Definition: densematrix.hh:709
│ │ │ │ -
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
│ │ │ │ -
Construct a matrix with a dynamic size.
Definition: dynmatrix.hh:61
│ │ │ │ -
size_type mat_cols() const
Definition: dynmatrix.hh:143
│ │ │ │ -
DynamicMatrix(std::initializer_list< DynamicVector< K > > const &ll)
Constructor initializing the matrix from a list of vector.
Definition: dynmatrix.hh:80
│ │ │ │ -
Base::row_type row_type
Definition: dynmatrix.hh:67
│ │ │ │ -
DynamicMatrix transposed() const
Return transposed of the matrix as DynamicMatrix.
Definition: dynmatrix.hh:132
│ │ │ │ -
Base::value_type value_type
Definition: dynmatrix.hh:66
│ │ │ │ -
row_type & mat_access(size_type i)
Definition: dynmatrix.hh:147
│ │ │ │ -
Base::size_type size_type
Definition: dynmatrix.hh:65
│ │ │ │ -
size_type mat_rows() const
Definition: dynmatrix.hh:142
│ │ │ │ -
DynamicMatrix(T const &rhs)
Definition: dynmatrix.hh:87
│ │ │ │ -
const row_type & mat_access(size_type i) const
Definition: dynmatrix.hh:151
│ │ │ │ -
void resize(size_type r, size_type c, value_type v=value_type())
resize matrix to r × c
Definition: dynmatrix.hh:106
│ │ │ │ -
DynamicMatrix & operator=(T const &rhs)
Definition: dynmatrix.hh:116
│ │ │ │ -
DynamicMatrix()
Default constructor.
Definition: dynmatrix.hh:71
│ │ │ │ -
DynamicMatrix(size_type r, size_type c, value_type v=value_type())
Constructor initializing the whole matrix with a scalar.
Definition: dynmatrix.hh:74
│ │ │ │ -
DynamicMatrix & operator=(T scalar)
Definition: dynmatrix.hh:126
│ │ │ │ -
container_type::size_type size_type
Definition: dynmatrix.hh:45
│ │ │ │ -
DynamicVector< K > row_type
Definition: dynmatrix.hh:38
│ │ │ │ -
row_type & row_reference
Definition: dynmatrix.hh:40
│ │ │ │ -
K value_type
Definition: dynmatrix.hh:44
│ │ │ │ -
DynamicMatrix< K > derived_type
Definition: dynmatrix.hh:36
│ │ │ │ -
const row_type & const_row_reference
Definition: dynmatrix.hh:41
│ │ │ │ -
std::vector< K > container_type
Definition: dynmatrix.hh:43
│ │ │ │ -
FieldTraits< K >::real_type real_type
Definition: dynmatrix.hh:52
│ │ │ │ -
FieldTraits< K >::field_type field_type
Definition: dynmatrix.hh:51
│ │ │ │ -
Construct a vector with a dynamic size.
Definition: dynvector.hh:59
│ │ │ │ -
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
│ │ │ │ +
Default exception if a function was called while the object is not in a valid state for that function...
Definition: exceptions.hh:281
│ │ │ │ +
A factory class for parameterized objects.
Definition: parameterizedobject.hh:36
│ │ │ │ +
std::function< Type(Args...)> Creator
Definition: parameterizedobject.hh:53
│ │ │ │ +
static constexpr auto has_proper_signature(Dune::PriorityTag< 1 >) -> decltype(std::declval< F >()(std::declval< Args >()...), std::true_type())
Definition: parameterizedobject.hh:56
│ │ │ │ +
TypeT Type
The type of objects created by the factory.
Definition: parameterizedobject.hh:49
│ │ │ │ +
void define(Key const &key, Impl &&t)
Registers a new type with a key.
Definition: parameterizedobject.hh:145
│ │ │ │ +
KeyT Key
The typ of the keys.
Definition: parameterizedobject.hh:46
│ │ │ │ +
Type create(Key const &key, Args ... args) const
Creates an object identified by a key from given parameters.
Definition: parameterizedobject.hh:77
│ │ │ │ +
void define(Key const &key)
Registers a new type with a key.
Definition: parameterizedobject.hh:101
│ │ │ │ +
void define(Key const &key, F &&f)
Registers a new creator with a key.
Definition: parameterizedobject.hh:121
│ │ │ │ +
static constexpr std::false_type has_proper_signature(Dune::PriorityTag< 0 >)
Definition: parameterizedobject.hh:63
│ │ │ │ +
bool contains(Key const &key) const
Definition: parameterizedobject.hh:150
│ │ │ │ +
Helper class for tagging priorities.
Definition: typeutilities.hh:73
│ │ │ │ +
Helper class for tagging priorities.
Definition: typeutilities.hh:87
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -utf-8 │ │ │ │ │ +us-ascii │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,282 +4,205 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -dynmatrix.hh │ │ │ │ │ +parameterizedobject.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: │ │ │ │ │ + 1// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- │ │ │ │ │ + 2// vi: set et ts=4 sw=4 sts=4: │ │ │ │ │ 3// SPDX-FileCopyrightInfo: Copyright (C) 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_DYNMATRIX_HH │ │ │ │ │ - 6#define DUNE_DYNMATRIX_HH │ │ │ │ │ + 5#ifndef DUNE_COMMON_PARAMETERIZEDOBJECT_HH │ │ │ │ │ + 6#define DUNE_COMMON_PARAMETERIZEDOBJECT_HH │ │ │ │ │ 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11#include │ │ │ │ │ - 12 │ │ │ │ │ - 13#include │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ - 16#include │ │ │ │ │ - 17#include │ │ │ │ │ - 18 │ │ │ │ │ - 19namespace Dune │ │ │ │ │ - 20{ │ │ │ │ │ - 21 │ │ │ │ │ - 31 template< class K > class DynamicMatrix; │ │ │ │ │ - 32 │ │ │ │ │ - 33 template< class K > │ │ │ │ │ -34 struct DenseMatVecTraits< DynamicMatrix > │ │ │ │ │ - 35 { │ │ │ │ │ -36 typedef DynamicMatrix derived_type; │ │ │ │ │ + 8#include │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11 │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14 │ │ │ │ │ + 15namespace Dune { │ │ │ │ │ + 16 │ │ │ │ │ + 34template │ │ │ │ │ +36class ParameterizedObjectFactory; │ │ │ │ │ 37 │ │ │ │ │ -38 typedef DynamicVector row_type; │ │ │ │ │ - 39 │ │ │ │ │ -40 typedef row_type &row_reference; │ │ │ │ │ -41 typedef const row_type &const_row_reference; │ │ │ │ │ - 42 │ │ │ │ │ -43 typedef std::vector container_type; │ │ │ │ │ -44 typedef K value_type; │ │ │ │ │ -45 typedef typename container_type::size_type size_type; │ │ │ │ │ - 46 }; │ │ │ │ │ + 38template │ │ │ │ │ +41class ParameterizedObjectFactory │ │ │ │ │ + 42{ │ │ │ │ │ + 43 public: │ │ │ │ │ + 44 │ │ │ │ │ +46 typedef KeyT Key; │ │ │ │ │ 47 │ │ │ │ │ - 48 template< class K > │ │ │ │ │ -49 struct FieldTraits< DynamicMatrix > │ │ │ │ │ - 50 { │ │ │ │ │ -51 typedef typename FieldTraits::field_type field_type; │ │ │ │ │ -52 typedef typename FieldTraits::real_type real_type; │ │ │ │ │ - 53 }; │ │ │ │ │ +49 using Type = TypeT; │ │ │ │ │ + 50 │ │ │ │ │ + 51 protected: │ │ │ │ │ + 52 │ │ │ │ │ +53 using Creator = std::function; │ │ │ │ │ 54 │ │ │ │ │ - 59 template │ │ │ │ │ -60 class DynamicMatrix : public DenseMatrix< DynamicMatrix > │ │ │ │ │ - 61 { │ │ │ │ │ - 62 std::vector< DynamicVector > _data; │ │ │ │ │ - 63 typedef DenseMatrix<_DynamicMatrix > Base; │ │ │ │ │ - 64 public: │ │ │ │ │ -65 typedef typename Base::size_type size_type; │ │ │ │ │ -66 typedef typename Base::value_type value_type; │ │ │ │ │ -67 typedef typename Base::row_type row_type; │ │ │ │ │ - 68 │ │ │ │ │ - 69 //===== constructors │ │ │ │ │ -71 DynamicMatrix () {} │ │ │ │ │ - 72 │ │ │ │ │ -74 DynamicMatrix (size_type r, size_type c, value_type v = value_type() ) : │ │ │ │ │ - 75 _data(r, row_type(c, v) ) │ │ │ │ │ - 76 {} │ │ │ │ │ - 77 │ │ │ │ │ -80 DynamicMatrix (std::initializer_list> const &ll) │ │ │ │ │ - 81 : _data(ll) │ │ │ │ │ - 82 {} │ │ │ │ │ - 83 │ │ │ │ │ - 84 │ │ │ │ │ - 85 template ::value && │ │ │ │ │ -HasDenseMatrixAssigner::value>> │ │ │ │ │ -87 DynamicMatrix(T const& rhs) │ │ │ │ │ - 88 { │ │ │ │ │ - 89 *this = rhs; │ │ │ │ │ - 90 } │ │ │ │ │ - 91 │ │ │ │ │ - 92 //==== resize related methods │ │ │ │ │ -106 void resize (size_type r, size_type c, value_type v = value_type() ) │ │ │ │ │ - 107 { │ │ │ │ │ - 108 _data.resize(0); │ │ │ │ │ - 109 _data.resize(r, row_type(c, v) ); │ │ │ │ │ - 110 } │ │ │ │ │ - 111 │ │ │ │ │ - 112 //===== assignment │ │ │ │ │ - 113 // General assignment with resizing │ │ │ │ │ - 114 template ::value>> │ │ │ │ │ -116 DynamicMatrix& operator=(T const& rhs) { │ │ │ │ │ - 117 _data.resize(rhs.N()); │ │ │ │ │ - 118 std::fill(_data.begin(), _data.end(), row_type(rhs.M(), K(0))); │ │ │ │ │ - 119 Base::operator=(rhs); │ │ │ │ │ - 120 return *this; │ │ │ │ │ - 121 } │ │ │ │ │ - 122 │ │ │ │ │ - 123 // Specialisation: scalar assignment (no resizing) │ │ │ │ │ - 124 template ::value>> │ │ │ │ │ -126 DynamicMatrix& operator=(T scalar) { │ │ │ │ │ - 127 std::fill(_data.begin(), _data.end(), scalar); │ │ │ │ │ - 128 return *this; │ │ │ │ │ - 129 } │ │ │ │ │ - 130 │ │ │ │ │ -132 DynamicMatrix transposed() const │ │ │ │ │ - 133 { │ │ │ │ │ - 134 DynamicMatrix AT(this->M(), this->N()); │ │ │ │ │ - 135 for( size_type i = 0; i < this->N(); ++i ) │ │ │ │ │ - 136 for( size_type j = 0; j < this->M(); ++j ) │ │ │ │ │ - 137 AT[j][i] = (*this)[i][j]; │ │ │ │ │ - 138 return AT; │ │ │ │ │ - 139 } │ │ │ │ │ - 140 │ │ │ │ │ - 141 // make this thing a matrix │ │ │ │ │ -142 size_type mat_rows() const { return _data.size(); } │ │ │ │ │ -143 size_type mat_cols() const { │ │ │ │ │ - 144 assert(this->rows()); │ │ │ │ │ - 145 return _data.front().size(); │ │ │ │ │ - 146 } │ │ │ │ │ -147 row_type & mat_access(size_type i) { │ │ │ │ │ - 148 DUNE_ASSERT_BOUNDS(i < _data.size()); │ │ │ │ │ - 149 return _data[i]; │ │ │ │ │ - 150 } │ │ │ │ │ -151 const row_type & mat_access(size_type i) const { │ │ │ │ │ - 152 DUNE_ASSERT_BOUNDS(i < _data.size()); │ │ │ │ │ - 153 return _data[i]; │ │ │ │ │ - 154 } │ │ │ │ │ - 155 }; │ │ │ │ │ + 55 template │ │ │ │ │ +56 static constexpr auto has_proper_signature(Dune::PriorityTag<1>) │ │ │ │ │ + 57 -> decltype( std::declval()(std::declval()...), std::true_type()) │ │ │ │ │ + 58 { │ │ │ │ │ + 59 return {}; │ │ │ │ │ + 60 } │ │ │ │ │ + 61 │ │ │ │ │ + 62 template │ │ │ │ │ +63 static constexpr std::false_type has_proper_signature(Dune::PriorityTag<0>) │ │ │ │ │ + 64 { │ │ │ │ │ + 65 return {}; │ │ │ │ │ + 66 } │ │ │ │ │ + 67 │ │ │ │ │ + 68 public: │ │ │ │ │ + 69 │ │ │ │ │ +77 Type create(Key const& key, Args ... args) const { │ │ │ │ │ + 78 typename Registry::const_iterator i = registry_.find(key); │ │ │ │ │ + 79 if (i == registry_.end()) { │ │ │ │ │ + 80 DUNE_THROW(Dune::InvalidStateException, │ │ │ │ │ + 81 "ParametrizedObjectFactory: key ``" << │ │ │ │ │ + 82 key << "'' not registered"); │ │ │ │ │ + 83 } │ │ │ │ │ + 84 else return i->second(args...); │ │ │ │ │ + 85 } │ │ │ │ │ + 86 │ │ │ │ │ + 100 template │ │ │ │ │ +101 void define(Key const& key) │ │ │ │ │ + 102 { │ │ │ │ │ + 103 registry_[key] = DefaultCreator(); │ │ │ │ │ + 104 } │ │ │ │ │ + 105 │ │ │ │ │ + 119 template(PriorityTag<42>()), int>:: │ │ │ │ │ +type = 0> │ │ │ │ │ +121 void define(Key const& key, F&& f) │ │ │ │ │ + 122 { │ │ │ │ │ + 123 registry_[key] = f; │ │ │ │ │ + 124 } │ │ │ │ │ + 125 │ │ │ │ │ + 140 template::value │ │ │ │ │ + 143 and not std::is_convertible::value, │ │ │ │ │ + 144 int>::type = 0> │ │ │ │ │ +145 void define(Key const& key, Impl&& t) │ │ │ │ │ + 146 { │ │ │ │ │ + 147 registry_[key] = [=](Args...) { return t;}; │ │ │ │ │ + 148 } │ │ │ │ │ + 149 │ │ │ │ │ +150 bool contains(Key const& key) const │ │ │ │ │ + 151 { │ │ │ │ │ + 152 return registry_.count(key); │ │ │ │ │ + 153 } │ │ │ │ │ + 154 │ │ │ │ │ + 155 private: │ │ │ │ │ 156 │ │ │ │ │ - 159} // end namespace │ │ │ │ │ - 160 │ │ │ │ │ - 161#endif │ │ │ │ │ -boundschecking.hh │ │ │ │ │ -Macro for wrapping boundary checks. │ │ │ │ │ -dynvector.hh │ │ │ │ │ -This file implements a dense vector with a dynamic size. │ │ │ │ │ + 157 template │ │ │ │ │ + 158 struct Tag{}; │ │ │ │ │ + 159 │ │ │ │ │ + 160 template │ │ │ │ │ + 161 struct DefaultCreator │ │ │ │ │ + 162 { │ │ │ │ │ + 163 template │ │ │ │ │ + 164 Type operator()(T&&... args) const │ │ │ │ │ + 165 { │ │ │ │ │ + 166 return DefaultCreator::create(Tag(), PriorityTag<42>(), std:: │ │ │ │ │ +forward(args)...); │ │ │ │ │ + 167 } │ │ │ │ │ + 168 │ │ │ │ │ + 169 template │ │ │ │ │ + 170 static Type create(Tag, PriorityTag<1>, T&& ... args) { │ │ │ │ │ + 171 return Impl(std::forward(args)...); │ │ │ │ │ + 172 } │ │ │ │ │ + 173 │ │ │ │ │ + 174 template │ │ │ │ │ + 175 static Type create(Tag>, PriorityTag<2>, T&& ... │ │ │ │ │ +args) { │ │ │ │ │ + 176 return std::make_unique(std::forward(args)...); │ │ │ │ │ + 177 } │ │ │ │ │ + 178 │ │ │ │ │ + 179 template │ │ │ │ │ + 180 static Type create(Tag>, PriorityTag<3>, T&& ... │ │ │ │ │ +args) { │ │ │ │ │ + 181 return std::make_shared(std::forward(args)...); │ │ │ │ │ + 182 } │ │ │ │ │ + 183 │ │ │ │ │ + 184 }; │ │ │ │ │ + 185 │ │ │ │ │ + 186 typedef std::map Registry; │ │ │ │ │ + 187 Registry registry_; │ │ │ │ │ + 188}; │ │ │ │ │ + 189 │ │ │ │ │ + 190 │ │ │ │ │ + 191 │ │ │ │ │ + 192} // end namespace Dune │ │ │ │ │ + 193 │ │ │ │ │ + 194#endif // DUNE_COMMON_PARAMETERIZEDOBJECT_HH │ │ │ │ │ +typeutilities.hh │ │ │ │ │ +Utilities for type computations, constraining overloads, ... │ │ │ │ │ exceptions.hh │ │ │ │ │ A few common exception classes. │ │ │ │ │ -typetraits.hh │ │ │ │ │ -Traits for type conversions and type information. │ │ │ │ │ -densematrix.hh │ │ │ │ │ -Implements a matrix constructed from a given type representing a field and a │ │ │ │ │ -compile-time given numbe... │ │ │ │ │ -DUNE_ASSERT_BOUNDS │ │ │ │ │ -#define DUNE_ASSERT_BOUNDS(cond) │ │ │ │ │ -If DUNE_CHECK_BOUNDS is defined: check if condition cond holds; otherwise, do │ │ │ │ │ -nothing. │ │ │ │ │ -Definition: boundschecking.hh:30 │ │ │ │ │ +DUNE_THROW │ │ │ │ │ +#define DUNE_THROW(E, m) │ │ │ │ │ +Definition: exceptions.hh:218 │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::DenseMatrix │ │ │ │ │ -A dense n x m matrix. │ │ │ │ │ -Definition: densematrix.hh:140 │ │ │ │ │ -Dune::DenseMatrix<_DynamicMatrix<_K_>_>::operator= │ │ │ │ │ -derived_type & operator=(const RHS &rhs) │ │ │ │ │ -Definition: densematrix.hh:279 │ │ │ │ │ -Dune::DenseMatrix<_DynamicMatrix<_K_>_>::M │ │ │ │ │ -constexpr size_type M() const │ │ │ │ │ -number of columns │ │ │ │ │ -Definition: densematrix.hh:703 │ │ │ │ │ -Dune::DenseMatrix<_DynamicMatrix<_K_>_>::value_type │ │ │ │ │ -Traits::value_type value_type │ │ │ │ │ -export the type representing the field │ │ │ │ │ -Definition: densematrix.hh:157 │ │ │ │ │ -Dune::DenseMatrix<_DynamicMatrix<_K_>_>::rows │ │ │ │ │ -constexpr size_type rows() const │ │ │ │ │ -number of rows │ │ │ │ │ -Definition: densematrix.hh:709 │ │ │ │ │ -Dune::DenseMatrix<_DynamicMatrix<_K_>_>::N │ │ │ │ │ -constexpr size_type N() const │ │ │ │ │ -number of rows │ │ │ │ │ -Definition: densematrix.hh:697 │ │ │ │ │ -Dune::DenseMatrix<_DynamicMatrix<_K_>_>::size_type │ │ │ │ │ -Traits::size_type size_type │ │ │ │ │ -The type used for the index access and size operation. │ │ │ │ │ -Definition: densematrix.hh:166 │ │ │ │ │ -Dune::DynamicMatrix │ │ │ │ │ -Construct a matrix with a dynamic size. │ │ │ │ │ -Definition: dynmatrix.hh:61 │ │ │ │ │ -Dune::DynamicMatrix::mat_cols │ │ │ │ │ -size_type mat_cols() const │ │ │ │ │ -Definition: dynmatrix.hh:143 │ │ │ │ │ -Dune::DynamicMatrix::DynamicMatrix │ │ │ │ │ -DynamicMatrix(std::initializer_list< DynamicVector< K > > const &ll) │ │ │ │ │ -Constructor initializing the matrix from a list of vector. │ │ │ │ │ -Definition: dynmatrix.hh:80 │ │ │ │ │ -Dune::DynamicMatrix::row_type │ │ │ │ │ -Base::row_type row_type │ │ │ │ │ -Definition: dynmatrix.hh:67 │ │ │ │ │ -Dune::DynamicMatrix::transposed │ │ │ │ │ -DynamicMatrix transposed() const │ │ │ │ │ -Return transposed of the matrix as DynamicMatrix. │ │ │ │ │ -Definition: dynmatrix.hh:132 │ │ │ │ │ -Dune::DynamicMatrix::value_type │ │ │ │ │ -Base::value_type value_type │ │ │ │ │ -Definition: dynmatrix.hh:66 │ │ │ │ │ -Dune::DynamicMatrix::mat_access │ │ │ │ │ -row_type & mat_access(size_type i) │ │ │ │ │ -Definition: dynmatrix.hh:147 │ │ │ │ │ -Dune::DynamicMatrix::size_type │ │ │ │ │ -Base::size_type size_type │ │ │ │ │ -Definition: dynmatrix.hh:65 │ │ │ │ │ -Dune::DynamicMatrix::mat_rows │ │ │ │ │ -size_type mat_rows() const │ │ │ │ │ -Definition: dynmatrix.hh:142 │ │ │ │ │ -Dune::DynamicMatrix::DynamicMatrix │ │ │ │ │ -DynamicMatrix(T const &rhs) │ │ │ │ │ -Definition: dynmatrix.hh:87 │ │ │ │ │ -Dune::DynamicMatrix::mat_access │ │ │ │ │ -const row_type & mat_access(size_type i) const │ │ │ │ │ -Definition: dynmatrix.hh:151 │ │ │ │ │ -Dune::DynamicMatrix::resize │ │ │ │ │ -void resize(size_type r, size_type c, value_type v=value_type()) │ │ │ │ │ -resize matrix to r × c │ │ │ │ │ -Definition: dynmatrix.hh:106 │ │ │ │ │ -Dune::DynamicMatrix::operator= │ │ │ │ │ -DynamicMatrix & operator=(T const &rhs) │ │ │ │ │ -Definition: dynmatrix.hh:116 │ │ │ │ │ -Dune::DynamicMatrix::DynamicMatrix │ │ │ │ │ -DynamicMatrix() │ │ │ │ │ -Default constructor. │ │ │ │ │ -Definition: dynmatrix.hh:71 │ │ │ │ │ -Dune::DynamicMatrix::DynamicMatrix │ │ │ │ │ -DynamicMatrix(size_type r, size_type c, value_type v=value_type()) │ │ │ │ │ -Constructor initializing the whole matrix with a scalar. │ │ │ │ │ -Definition: dynmatrix.hh:74 │ │ │ │ │ -Dune::DynamicMatrix::operator= │ │ │ │ │ -DynamicMatrix & operator=(T scalar) │ │ │ │ │ -Definition: dynmatrix.hh:126 │ │ │ │ │ -Dune::DenseMatVecTraits<_DynamicMatrix<_K_>_>::size_type │ │ │ │ │ -container_type::size_type size_type │ │ │ │ │ -Definition: dynmatrix.hh:45 │ │ │ │ │ -Dune::DenseMatVecTraits<_DynamicMatrix<_K_>_>::row_type │ │ │ │ │ -DynamicVector< K > row_type │ │ │ │ │ -Definition: dynmatrix.hh:38 │ │ │ │ │ -Dune::DenseMatVecTraits<_DynamicMatrix<_K_>_>::row_reference │ │ │ │ │ -row_type & row_reference │ │ │ │ │ -Definition: dynmatrix.hh:40 │ │ │ │ │ -Dune::DenseMatVecTraits<_DynamicMatrix<_K_>_>::value_type │ │ │ │ │ -K value_type │ │ │ │ │ -Definition: dynmatrix.hh:44 │ │ │ │ │ -Dune::DenseMatVecTraits<_DynamicMatrix<_K_>_>::derived_type │ │ │ │ │ -DynamicMatrix< K > derived_type │ │ │ │ │ -Definition: dynmatrix.hh:36 │ │ │ │ │ -Dune::DenseMatVecTraits<_DynamicMatrix<_K_>_>::const_row_reference │ │ │ │ │ -const row_type & const_row_reference │ │ │ │ │ -Definition: dynmatrix.hh:41 │ │ │ │ │ -Dune::DenseMatVecTraits<_DynamicMatrix<_K_>_>::container_type │ │ │ │ │ -std::vector< K > container_type │ │ │ │ │ -Definition: dynmatrix.hh:43 │ │ │ │ │ -Dune::FieldTraits<_DynamicMatrix<_K_>_>::real_type │ │ │ │ │ -FieldTraits< K >::real_type real_type │ │ │ │ │ -Definition: dynmatrix.hh:52 │ │ │ │ │ -Dune::FieldTraits<_DynamicMatrix<_K_>_>::field_type │ │ │ │ │ -FieldTraits< K >::field_type field_type │ │ │ │ │ -Definition: dynmatrix.hh:51 │ │ │ │ │ -Dune::DynamicVector │ │ │ │ │ -Construct a vector with a dynamic size. │ │ │ │ │ -Definition: dynvector.hh:59 │ │ │ │ │ -Dune::FieldTraits │ │ │ │ │ -Definition: ftraits.hh:26 │ │ │ │ │ -Dune::FieldTraits::field_type │ │ │ │ │ -T field_type │ │ │ │ │ -export the type representing the field │ │ │ │ │ -Definition: ftraits.hh:28 │ │ │ │ │ -Dune::FieldTraits::real_type │ │ │ │ │ -T real_type │ │ │ │ │ -export the type representing the real type of the field │ │ │ │ │ -Definition: ftraits.hh:30 │ │ │ │ │ -Dune::DenseMatVecTraits │ │ │ │ │ -Definition: matvectraits.hh:31 │ │ │ │ │ +Dune::InvalidStateException │ │ │ │ │ +Default exception if a function was called while the object is not in a valid │ │ │ │ │ +state for that function... │ │ │ │ │ +Definition: exceptions.hh:281 │ │ │ │ │ +Dune::ParameterizedObjectFactory │ │ │ │ │ +A factory class for parameterized objects. │ │ │ │ │ +Definition: parameterizedobject.hh:36 │ │ │ │ │ +Dune::ParameterizedObjectFactory<_TypeT(Args...),_KeyT_>::Creator │ │ │ │ │ +std::function< Type(Args...)> Creator │ │ │ │ │ +Definition: parameterizedobject.hh:53 │ │ │ │ │ +Dune::ParameterizedObjectFactory<_TypeT(Args...),_KeyT_>::has_proper_signature │ │ │ │ │ +static constexpr auto has_proper_signature(Dune::PriorityTag< 1 >) -> decltype │ │ │ │ │ +(std::declval< F >()(std::declval< Args >()...), std::true_type()) │ │ │ │ │ +Definition: parameterizedobject.hh:56 │ │ │ │ │ +Dune::ParameterizedObjectFactory<_TypeT(Args...),_KeyT_>::Type │ │ │ │ │ +TypeT Type │ │ │ │ │ +The type of objects created by the factory. │ │ │ │ │ +Definition: parameterizedobject.hh:49 │ │ │ │ │ +Dune::ParameterizedObjectFactory<_TypeT(Args...),_KeyT_>::define │ │ │ │ │ +void define(Key const &key, Impl &&t) │ │ │ │ │ +Registers a new type with a key. │ │ │ │ │ +Definition: parameterizedobject.hh:145 │ │ │ │ │ +Dune::ParameterizedObjectFactory<_TypeT(Args...),_KeyT_>::Key │ │ │ │ │ +KeyT Key │ │ │ │ │ +The typ of the keys. │ │ │ │ │ +Definition: parameterizedobject.hh:46 │ │ │ │ │ +Dune::ParameterizedObjectFactory<_TypeT(Args...),_KeyT_>::create │ │ │ │ │ +Type create(Key const &key, Args ... args) const │ │ │ │ │ +Creates an object identified by a key from given parameters. │ │ │ │ │ +Definition: parameterizedobject.hh:77 │ │ │ │ │ +Dune::ParameterizedObjectFactory<_TypeT(Args...),_KeyT_>::define │ │ │ │ │ +void define(Key const &key) │ │ │ │ │ +Registers a new type with a key. │ │ │ │ │ +Definition: parameterizedobject.hh:101 │ │ │ │ │ +Dune::ParameterizedObjectFactory<_TypeT(Args...),_KeyT_>::define │ │ │ │ │ +void define(Key const &key, F &&f) │ │ │ │ │ +Registers a new creator with a key. │ │ │ │ │ +Definition: parameterizedobject.hh:121 │ │ │ │ │ +Dune::ParameterizedObjectFactory<_TypeT(Args...),_KeyT_>::has_proper_signature │ │ │ │ │ +static constexpr std::false_type has_proper_signature(Dune::PriorityTag< 0 >) │ │ │ │ │ +Definition: parameterizedobject.hh:63 │ │ │ │ │ +Dune::ParameterizedObjectFactory<_TypeT(Args...),_KeyT_>::contains │ │ │ │ │ +bool contains(Key const &key) const │ │ │ │ │ +Definition: parameterizedobject.hh:150 │ │ │ │ │ +Dune::PriorityTag │ │ │ │ │ +Helper class for tagging priorities. │ │ │ │ │ +Definition: typeutilities.hh:73 │ │ │ │ │ +Dune::PriorityTag<_0_> │ │ │ │ │ +Helper class for tagging priorities. │ │ │ │ │ +Definition: typeutilities.hh:87 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00200_source.html │ │ │ │ @@ -84,16 +84,16 @@ │ │ │ │
13#include <cstdint>
│ │ │ │
14#include <cstdlib> // abs
│ │ │ │
15#include <istream>
│ │ │ │
16#include <ostream>
│ │ │ │
17#include <type_traits>
│ │ │ │
18#include <utility>
│ │ │ │
19
│ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │
22
│ │ │ │
23namespace Dune
│ │ │ │
24{
│ │ │ │
25 namespace Impl
│ │ │ │
26 {
│ │ │ │
27 // forward declaration
│ │ │ │
28 class Float128;
│ │ │ │ @@ -181,19 +181,19 @@ │ │ │ │
111 constexpr Float128& operator OP(const Float128& u) noexcept \
│ │ │ │
112 { \
│ │ │ │
113 value_ OP float128_t(u); \
│ │ │ │
114 return *this; \
│ │ │ │
115 } \
│ │ │ │
116 static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │
117
│ │ │ │ -
118 DUNE_ASSIGN_OP(+=);
│ │ │ │ -
119 DUNE_ASSIGN_OP(-=);
│ │ │ │ +
118 DUNE_ASSIGN_OP(+=);
│ │ │ │ +
119 DUNE_ASSIGN_OP(-=);
│ │ │ │
120
│ │ │ │ -
121 DUNE_ASSIGN_OP(*=);
│ │ │ │ -
122 DUNE_ASSIGN_OP(/=);
│ │ │ │ +
121 DUNE_ASSIGN_OP(*=);
│ │ │ │ +
122 DUNE_ASSIGN_OP(/=);
│ │ │ │
123
│ │ │ │
124#undef DUNE_ASSIGN_OP
│ │ │ │
125
│ │ │ │
126 }; // end class Float128
│ │ │ │
127
│ │ │ │
128 // binary operators:
│ │ │ │
129 // For symmetry provide overloads with arithmetic types
│ │ │ │ @@ -226,18 +226,18 @@ │ │ │ │
156 constexpr Float128 operator OP(const Float128& t, \
│ │ │ │
157 const U& u) noexcept \
│ │ │ │
158 { \
│ │ │ │
159 return Float128{float128_t(t) OP float128_t(u)}; \
│ │ │ │
160 } \
│ │ │ │
161 static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │
162
│ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │
167
│ │ │ │
168#undef DUNE_BINARY_OP
│ │ │ │
169
│ │ │ │
170 // logical operators:
│ │ │ │
171 // For symmetry provide overloads with arithmetic types
│ │ │ │
172 // in the first or second argument.
│ │ │ │
173#define DUNE_BINARY_BOOL_OP(OP) \
│ │ │ │ @@ -294,54 +294,54 @@ │ │ │ │
224 inline Float128 name(const Float128& t, \
│ │ │ │
225 const Float128& u) noexcept \
│ │ │ │
226 { \
│ │ │ │
227 return Float128{func (float128_t(t), float128_t(u))}; \
│ │ │ │
228 } \
│ │ │ │
229 static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │
230
│ │ │ │ -
231 DUNE_UNARY_FUNC(abs, fabsq);
│ │ │ │ -
232 DUNE_UNARY_FUNC(acos, acosq);
│ │ │ │ -
233 DUNE_UNARY_FUNC(acosh, acoshq);
│ │ │ │ -
234 DUNE_UNARY_FUNC(asin, asinq);
│ │ │ │ -
235 DUNE_UNARY_FUNC(asinh, asinhq);
│ │ │ │ -
236 DUNE_UNARY_FUNC(atan, atanq);
│ │ │ │ -
237 DUNE_UNARY_FUNC(atanh, atanhq);
│ │ │ │ -
238 DUNE_UNARY_FUNC(cbrt, cbrtq);
│ │ │ │ -
239 DUNE_UNARY_FUNC(ceil, ceilq);
│ │ │ │ -
240 DUNE_UNARY_FUNC(cos, cosq);
│ │ │ │ -
241 DUNE_UNARY_FUNC(cosh, coshq);
│ │ │ │ -
242 DUNE_UNARY_FUNC(erf, erfq);
│ │ │ │ -
243 DUNE_UNARY_FUNC(erfc, erfcq);
│ │ │ │ -
244 DUNE_UNARY_FUNC(exp, expq);
│ │ │ │ -
245 DUNE_UNARY_FUNC(expm1, expm1q);
│ │ │ │ -
246 DUNE_UNARY_FUNC(fabs, fabsq);
│ │ │ │ -
247 DUNE_UNARY_FUNC(floor, floorq);
│ │ │ │ +
231 DUNE_UNARY_FUNC(abs, fabsq);
│ │ │ │ +
232 DUNE_UNARY_FUNC(acos, acosq);
│ │ │ │ +
233 DUNE_UNARY_FUNC(acosh, acoshq);
│ │ │ │ +
234 DUNE_UNARY_FUNC(asin, asinq);
│ │ │ │ +
235 DUNE_UNARY_FUNC(asinh, asinhq);
│ │ │ │ +
236 DUNE_UNARY_FUNC(atan, atanq);
│ │ │ │ +
237 DUNE_UNARY_FUNC(atanh, atanhq);
│ │ │ │ +
238 DUNE_UNARY_FUNC(cbrt, cbrtq);
│ │ │ │ +
239 DUNE_UNARY_FUNC(ceil, ceilq);
│ │ │ │ +
240 DUNE_UNARY_FUNC(cos, cosq);
│ │ │ │ +
241 DUNE_UNARY_FUNC(cosh, coshq);
│ │ │ │ +
242 DUNE_UNARY_FUNC(erf, erfq);
│ │ │ │ +
243 DUNE_UNARY_FUNC(erfc, erfcq);
│ │ │ │ +
244 DUNE_UNARY_FUNC(exp, expq);
│ │ │ │ +
245 DUNE_UNARY_FUNC(expm1, expm1q);
│ │ │ │ +
246 DUNE_UNARY_FUNC(fabs, fabsq);
│ │ │ │ +
247 DUNE_UNARY_FUNC(floor, floorq);
│ │ │ │
248 DUNE_CUSTOM_UNARY_FUNC(int, ilogb, ilogbq);
│ │ │ │ -
249 DUNE_UNARY_FUNC(lgamma, lgammaq);
│ │ │ │ +
249 DUNE_UNARY_FUNC(lgamma, lgammaq);
│ │ │ │
250 DUNE_CUSTOM_UNARY_FUNC(long long int, llrint, llrintq);
│ │ │ │
251 DUNE_CUSTOM_UNARY_FUNC(long long int, llround, llroundq);
│ │ │ │ -
252 DUNE_UNARY_FUNC(log, logq);
│ │ │ │ -
253 DUNE_UNARY_FUNC(log10, log10q);
│ │ │ │ -
254 DUNE_UNARY_FUNC(log1p, log1pq);
│ │ │ │ -
255 DUNE_UNARY_FUNC(log2, log2q);
│ │ │ │ +
252 DUNE_UNARY_FUNC(log, logq);
│ │ │ │ +
253 DUNE_UNARY_FUNC(log10, log10q);
│ │ │ │ +
254 DUNE_UNARY_FUNC(log1p, log1pq);
│ │ │ │ +
255 DUNE_UNARY_FUNC(log2, log2q);
│ │ │ │
256 // DUNE_UNARY_FUNC(logb, logbq); // not available in gcc5
│ │ │ │
257 DUNE_CUSTOM_UNARY_FUNC(long int, lrint, lrintq);
│ │ │ │
258 DUNE_CUSTOM_UNARY_FUNC(long int, lround, lroundq);
│ │ │ │ -
259 DUNE_UNARY_FUNC(nearbyint, nearbyintq);
│ │ │ │ +
259 DUNE_UNARY_FUNC(nearbyint, nearbyintq);
│ │ │ │
260 DUNE_BINARY_FUNC(nextafter, nextafterq);
│ │ │ │
261 DUNE_BINARY_FUNC(pow, powq); // overload for integer argument see below
│ │ │ │ -
262 DUNE_UNARY_FUNC(rint, rintq);
│ │ │ │ -
263 DUNE_UNARY_FUNC(round, roundq);
│ │ │ │ -
264 DUNE_UNARY_FUNC(sin, sinq);
│ │ │ │ -
265 DUNE_UNARY_FUNC(sinh, sinhq);
│ │ │ │ -
266 DUNE_UNARY_FUNC(sqrt, sqrtq);
│ │ │ │ -
267 DUNE_UNARY_FUNC(tan, tanq);
│ │ │ │ -
268 DUNE_UNARY_FUNC(tanh, tanhq);
│ │ │ │ -
269 DUNE_UNARY_FUNC(tgamma, tgammaq);
│ │ │ │ -
270 DUNE_UNARY_FUNC(trunc, truncq);
│ │ │ │ +
262 DUNE_UNARY_FUNC(rint, rintq);
│ │ │ │ +
263 DUNE_UNARY_FUNC(round, roundq);
│ │ │ │ +
264 DUNE_UNARY_FUNC(sin, sinq);
│ │ │ │ +
265 DUNE_UNARY_FUNC(sinh, sinhq);
│ │ │ │ +
266 DUNE_UNARY_FUNC(sqrt, sqrtq);
│ │ │ │ +
267 DUNE_UNARY_FUNC(tan, tanq);
│ │ │ │ +
268 DUNE_UNARY_FUNC(tanh, tanhq);
│ │ │ │ +
269 DUNE_UNARY_FUNC(tgamma, tgammaq);
│ │ │ │ +
270 DUNE_UNARY_FUNC(trunc, truncq);
│ │ │ │
271
│ │ │ │
272 DUNE_CUSTOM_UNARY_FUNC(bool, isfinite, finiteq);
│ │ │ │
273 DUNE_CUSTOM_UNARY_FUNC(bool, isinf, isinfq);
│ │ │ │
274 DUNE_CUSTOM_UNARY_FUNC(bool, isnan, isnanq);
│ │ │ │
275 DUNE_CUSTOM_UNARY_FUNC(bool, signbit, signbitq);
│ │ │ │
276
│ │ │ │
277#undef DUNE_UNARY_FUNC
│ │ │ │ @@ -521,19 +521,19 @@ │ │ │ │
452 static constexpr float_round_style round_style = round_to_nearest;
│ │ │ │
453 };
│ │ │ │
454#endif
│ │ │ │
455} // end namespace std
│ │ │ │
456
│ │ │ │
457#endif // HAVE_QUADMATH
│ │ │ │
458#endif // DUNE_QUADMATH_HH
│ │ │ │ -
A few common exception classes.
│ │ │ │ -
#define DUNE_BINARY_OP(OP)
Definition: debugalign.hh:248
│ │ │ │ -
#define DUNE_UNARY_FUNC(name)
│ │ │ │ -
#define DUNE_ASSIGN_OP(OP)
Definition: debugalign.hh:207
│ │ │ │ -
Traits for type conversions and type information.
│ │ │ │ +
Traits for type conversions and type information.
│ │ │ │ +
A few common exception classes.
│ │ │ │ +
#define DUNE_BINARY_OP(OP)
Definition: debugalign.hh:248
│ │ │ │ +
#define DUNE_UNARY_FUNC(name)
│ │ │ │ +
#define DUNE_ASSIGN_OP(OP)
Definition: debugalign.hh:207
│ │ │ │
Stream & operator>>(Stream &stream, std::tuple< Ts... > &t)
Read a std::tuple.
Definition: streamoperators.hh:43
│ │ │ │
std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
Definition: bigunsignedint.hh:278
│ │ │ │
bigunsignedint< k > operator-(const bigunsignedint< k > &x, std::uintmax_t y)
Definition: bigunsignedint.hh:542
│ │ │ │
bigunsignedint< k > operator+(const bigunsignedint< k > &x, std::uintmax_t y)
Definition: bigunsignedint.hh:535
│ │ │ │
I round(const T &val, typename EpsilonType< T >::Type epsilon)
round using epsilon
Definition: float_cmp.cc:311
│ │ │ │
I trunc(const T &val, typename EpsilonType< T >::Type epsilon)
truncate using epsilon
Definition: float_cmp.cc:407
│ │ │ │
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
│ │ │ │ ├── html2text {} │ │ │ │ │ @@ -478,26 +478,26 @@ │ │ │ │ │ 452 static constexpr float_round_style round_style = round_to_nearest; │ │ │ │ │ 453 }; │ │ │ │ │ 454#endif │ │ │ │ │ 455} // end namespace std │ │ │ │ │ 456 │ │ │ │ │ 457#endif // HAVE_QUADMATH │ │ │ │ │ 458#endif // DUNE_QUADMATH_HH │ │ │ │ │ +typetraits.hh │ │ │ │ │ +Traits for type conversions and type information. │ │ │ │ │ exceptions.hh │ │ │ │ │ A few common exception classes. │ │ │ │ │ DUNE_BINARY_OP │ │ │ │ │ #define DUNE_BINARY_OP(OP) │ │ │ │ │ Definition: debugalign.hh:248 │ │ │ │ │ DUNE_UNARY_FUNC │ │ │ │ │ #define DUNE_UNARY_FUNC(name) │ │ │ │ │ DUNE_ASSIGN_OP │ │ │ │ │ #define DUNE_ASSIGN_OP(OP) │ │ │ │ │ Definition: debugalign.hh:207 │ │ │ │ │ -typetraits.hh │ │ │ │ │ -Traits for type conversions and type information. │ │ │ │ │ Dune::operator>> │ │ │ │ │ Stream & operator>>(Stream &stream, std::tuple< Ts... > &t) │ │ │ │ │ Read a std::tuple. │ │ │ │ │ Definition: streamoperators.hh:43 │ │ │ │ │ Dune::operator<< │ │ │ │ │ std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x) │ │ │ │ │ Definition: bigunsignedint.hh:278 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00203.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: parametertreeparser.cc File Reference │ │ │ │ +dune-common: arraylist.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,28 +62,52 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -
parametertreeparser.cc File Reference
│ │ │ │ +
│ │ │ │ +Classes | │ │ │ │ +Namespaces
│ │ │ │ +
arraylist.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include "parametertreeparser.hh"
│ │ │ │ -#include <cstdlib>
│ │ │ │ -#include <iostream>
│ │ │ │ -#include <ostream>
│ │ │ │ -#include <string>
│ │ │ │ -#include <sstream>
│ │ │ │ -#include <fstream>
│ │ │ │ -#include <set>
│ │ │ │ -#include <map>
│ │ │ │ -#include <algorithm>
│ │ │ │ -#include <dune/common/exceptions.hh>
│ │ │ │ + │ │ │ │ +

Implements a random-access container that can efficiently change size (similar to std::deque) │ │ │ │ +More...

│ │ │ │ +
#include <array>
│ │ │ │ +#include <cassert>
│ │ │ │ +#include <memory>
│ │ │ │ +#include <vector>
│ │ │ │ +#include "iteratorfacades.hh"
│ │ │ │ +
│ │ │ │ +

Go to the source code of this file.

│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Classes

class  Dune::ArrayList< T, N, A >
 A dynamically growing random access list. More...
 
class  Dune::ArrayListIterator< T, N, A >
 A random access iterator for the Dune::ArrayList class. More...
 
class  Dune::ConstArrayListIterator< T, N, A >
 A constant random access iterator for the Dune::ArrayList class. More...
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Namespaces

namespace  Dune
 Dune namespace.
 
│ │ │ │ +

Detailed Description

│ │ │ │ +

Implements a random-access container that can efficiently change size (similar to std::deque)

│ │ │ │ +

This file implements the class ArrayList which behaves like dynamically growing array together with the class ArrayListIterator which is random access iterator as needed by the stl for sorting and other algorithms.

Author
Markus Blatt
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,22 +4,43 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -parametertreeparser.cc File Reference │ │ │ │ │ -#include "parametertreeparser.hh" │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Classes | Namespaces │ │ │ │ │ +arraylist.hh File Reference │ │ │ │ │ +Implements a random-access container that can efficiently change size (similar │ │ │ │ │ +to std::deque) More... │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include "iteratorfacades.hh" │ │ │ │ │ +Go_to_the_source_code_of_this_file. │ │ │ │ │ + Classes │ │ │ │ │ +class  Dune::ArrayList<_T,_N,_A_> │ │ │ │ │ +  A dynamically growing random access list. More... │ │ │ │ │ +  │ │ │ │ │ +class  Dune::ArrayListIterator<_T,_N,_A_> │ │ │ │ │ +  A random access iterator for the Dune::ArrayList class. More... │ │ │ │ │ +  │ │ │ │ │ +class  Dune::ConstArrayListIterator<_T,_N,_A_> │ │ │ │ │ +  A constant random access iterator for the Dune::ArrayList class. │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ + Namespaces │ │ │ │ │ +namespace  Dune │ │ │ │ │ +  Dune namespace. │ │ │ │ │ +  │ │ │ │ │ +***** Detailed Description ***** │ │ │ │ │ +Implements a random-access container that can efficiently change size (similar │ │ │ │ │ +to std::deque) │ │ │ │ │ +This file implements the class ArrayList which behaves like dynamically growing │ │ │ │ │ +array together with the class ArrayListIterator which is random access iterator │ │ │ │ │ +as needed by the stl for sorting and other algorithms. │ │ │ │ │ + Author │ │ │ │ │ + Markus Blatt │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00206.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: typeutilities.hh File Reference │ │ │ │ +dune-common: debugalign.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -65,52 +65,379 @@ │ │ │ │ │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ Classes | │ │ │ │ Namespaces | │ │ │ │ -Typedefs
│ │ │ │ -
typeutilities.hh File Reference
│ │ │ │ +Macros | │ │ │ │ +Typedefs | │ │ │ │ +Functions | │ │ │ │ +Variables
│ │ │ │ +
debugalign.hh File Reference
│ │ │ │ │ │ │ │
│ │ │ │ - │ │ │ │ -

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

│ │ │ │ -
#include <cstddef>
│ │ │ │ +
#include <algorithm>
│ │ │ │ +#include <cassert>
│ │ │ │ +#include <cmath>
│ │ │ │ +#include <complex>
│ │ │ │ +#include <cstddef>
│ │ │ │ +#include <cstdint>
│ │ │ │ +#include <cstdlib>
│ │ │ │ +#include <functional>
│ │ │ │ +#include <istream>
│ │ │ │ +#include <ostream>
│ │ │ │ #include <type_traits>
│ │ │ │ -#include <tuple>
│ │ │ │ +#include <utility>
│ │ │ │ +#include <dune/common/classname.hh>
│ │ │ │ +#include <dune/common/indices.hh>
│ │ │ │ +#include <dune/common/simd/base.hh>
│ │ │ │ +#include <dune/common/simd/defaults.hh>
│ │ │ │ +#include <dune/common/typetraits.hh>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ Classes

struct  Dune::PriorityTag< priority >
 Helper class for tagging priorities. More...
class  Dune::AlignedBase< align, Impl >
 CRTP base mixin class to check alignment. More...
 
struct  Dune::IsNumber< AlignedNumberImpl::AlignedNumber< T, align > >
 
class  Dune::AlignedNumberImpl::AlignedNumber< T, align >
 aligned wrappers for arithmetic types More...
 
struct  Dune::Simd::Overloads::ScalarType< AlignedNumber< T, align > >
 
struct  Dune::Simd::Overloads::RebindType< U, AlignedNumber< T, align > >
 
struct  Dune::PriorityTag< 0 >
 Helper class for tagging priorities. More...
struct  Dune::Simd::Overloads::LaneCount< AlignedNumber< T, align > >
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ Namespaces

namespace  Dune
 Dune namespace.
 
namespace  Dune::AlignedNumberImpl
 
namespace  Dune::Simd
 Namespace for vectorization interface functions used by library developers.
 
namespace  Dune::Simd::Overloads
 Namespace for the overloads and specializations that make up a SIMD implementation.
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Macros

#define DUNE_ASSIGN_OP(OP)
 
#define DUNE_BINARY_OP(OP)
 
#define DUNE_UNARY_FUNC(name)
 
│ │ │ │ │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ - │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ 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. More...
 
using Dune::ViolatedAlignmentHandler = std::function< void(const char *, std::size_t, const void *)>
 type of the handler called by violatedAlignment() More...
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +

│ │ │ │ +Functions

ViolatedAlignmentHandler & Dune::violatedAlignmentHandler ()
 access the handler called by violatedAlignment() More...
 
void Dune::violatedAlignment (const char *className, std::size_t expectedAlignment, const void *address)
 called when an alignment violation is detected More...
 
bool Dune::isAligned (const void *p, std::size_t align)
 check whether an address conforms to the given alignment More...
 
template<std::size_t align = debugAlignment, class T >
AlignedNumber< T, align > Dune::aligned (T value)
 align a value to a certain alignment More...
 
 Dune::AlignedNumberImpl::DUNE_BINARY_OP (+)
 
 Dune::AlignedNumberImpl::DUNE_BINARY_OP (-)
 
DUNE_BINARY_OP * Dune::AlignedNumberImpl::DUNE_BINARY_OP (/);DUNE_BINARY_OP(%
 
DUNE_BINARY_OP^ Dune::AlignedNumberImpl::DUNE_BINARY_OP (&);DUNE_BINARY_OP(|
 
 Dune::AlignedNumberImpl::DUNE_BINARY_OP (<<)
 
 Dune::AlignedNumberImpl::DUNE_BINARY_OP (> >)
 
 Dune::AlignedNumberImpl::DUNE_BINARY_OP (==)
 
 Dune::AlignedNumberImpl::DUNE_BINARY_OP (!=)
 
 Dune::AlignedNumberImpl::DUNE_BINARY_OP (<=)
 
 Dune::AlignedNumberImpl::DUNE_BINARY_OP (>=)
 
DUNE_BINARY_OP && Dune::AlignedNumberImpl::DUNE_BINARY_OP (||);#define DUNE_UNARY_FUNC(name) DUNE_UNARY_FUNC(abs
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (acos)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (acosh)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (asin)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (asinh)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (atan)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (atanh)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (cbrt)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (ceil)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (cos)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (cosh)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (erf)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (erfc)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (exp)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (exp2)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (expm1)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (fabs)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (floor)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (ilogb)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (lgamma)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (llrint)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (llround)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (log)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (log10)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (log1p)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (log2)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (logb)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (lrint)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (lround)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (nearbyint)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (rint)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (round)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (sin)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (sinh)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (sqrt)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (tan)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (tanh)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (tgamma)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (trunc)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (isfinite)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (isinf)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (isnan)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (isnormal)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (signbit)
 
 Dune::AlignedNumberImpl::DUNE_UNARY_FUNC (real)
 
template<class T , std::size_t align>
auto Dune::AlignedNumberImpl::max (const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
 
template<class T , std::size_t align>
auto Dune::AlignedNumberImpl::max (const T &a, const AlignedNumber< T, align > &b)
 
template<class T , std::size_t align>
auto Dune::AlignedNumberImpl::max (const AlignedNumber< T, align > &a, const T &b)
 
template<class T , std::size_t align>
auto Dune::AlignedNumberImpl::min (const AlignedNumber< T, align > &a, const AlignedNumber< T, align > &b)
 
template<class T , std::size_t align>
auto Dune::AlignedNumberImpl::min (const T &a, const AlignedNumber< T, align > &b)
 
template<class T , std::size_t align>
auto Dune::AlignedNumberImpl::min (const AlignedNumber< T, align > &a, const T &b)
 
template<class T , std::size_t align>
AlignedNumber< T, align > Dune::cond (const AlignedNumber< bool, align > &b, const AlignedNumber< T, align > &v1, const AlignedNumber< T, align > &v2)
 
template<class T , std::size_t align>
Dune::max_value (const AlignedNumber< T, align > &val)
 
template<class T , std::size_t align>
Dune::min_value (const AlignedNumber< T, align > &val)
 
template<std::size_t align>
bool Dune::any_true (const AlignedNumber< bool, align > &val)
 
template<std::size_t align>
bool Dune::all_true (const AlignedNumber< bool, align > &val)
 
template<class T , std::size_t align>
T & Dune::Simd::Overloads::lane (ADLTag< 5 >, std::size_t l, AlignedNumber< T, align > &v)
 
template<class T , std::size_t align>
Dune::Simd::Overloads::lane (ADLTag< 5 >, std::size_t l, const AlignedNumber< T, align > &v)
 
template<class T , std::size_t align>
const AlignedNumber< T, align > & Dune::Simd::Overloads::cond (ADLTag< 5 >, AlignedNumber< bool, align > mask, const AlignedNumber< T, align > &ifTrue, const AlignedNumber< T, align > &ifFalse)
 
template<std::size_t align>
bool Dune::Simd::Overloads::anyTrue (ADLTag< 5 >, const AlignedNumber< bool, align > &mask)
 
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │

│ │ │ │ +Variables

static constexpr auto Dune::debugAlignment = 2*alignof(std::max_align_t)
 an alignment large enough to trigger alignment errors More...
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

Utilities for type computations, constraining overloads, ...

│ │ │ │ -
Author
Carsten Gräser
│ │ │ │ -
│ │ │ │ +

Macro Definition Documentation

│ │ │ │ + │ │ │ │ +

◆ DUNE_ASSIGN_OP

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_ASSIGN_OP( OP)
│ │ │ │ +
│ │ │ │ +Value:
template<class U, std::size_t uAlign, \
│ │ │ │ +
class = std::enable_if_t< \
│ │ │ │ +
( uAlign <= align && \
│ │ │ │ +
sizeof(std::declval<T&>() OP std::declval<U>()) ) \
│ │ │ │ +
> > \
│ │ │ │ +
AlignedNumber &operator OP(const AlignedNumber<U, uAlign> &u) \
│ │ │ │ +
{ \
│ │ │ │ +
value_ OP U(u); \
│ │ │ │ +
return *this; \
│ │ │ │ +
} \
│ │ │ │ +
\
│ │ │ │ +
template<class U, \
│ │ │ │ +
class = std::void_t<decltype(std::declval<T&>() OP \
│ │ │ │ +
std::declval<U>())> > \
│ │ │ │ +
AlignedNumber &operator OP(const U &u) \
│ │ │ │ +
{ \
│ │ │ │ +
value_ OP u; \
│ │ │ │ +
return *this; \
│ │ │ │ +
} \
│ │ │ │ +
\
│ │ │ │ +
static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ +
STL namespace.
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_BINARY_OP

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_BINARY_OP( OP)
│ │ │ │ +
│ │ │ │ +Value:
template<class T, std::size_t tAlign, class U, std::size_t uAlign, \
│ │ │ │ +
class = std::void_t<decltype(std::declval<T>() \
│ │ │ │ +
OP std::declval<U>())> > \
│ │ │ │ +
decltype(auto) \
│ │ │ │ +
operator OP(const AlignedNumber<T, tAlign> &t, \
│ │ │ │ +
const AlignedNumber<U, uAlign> &u) \
│ │ │ │ +
{ \
│ │ │ │ +
/* can't use std::max(); not constexpr */ \
│ │ │ │ +
return aligned<(tAlign > uAlign ? tAlign : uAlign)>(T(t) OP U(u)); \
│ │ │ │ +
} \
│ │ │ │ +
\
│ │ │ │ +
template<class T, class U, std::size_t uAlign, \
│ │ │ │ +
class = std::void_t<decltype(std::declval<T>() \
│ │ │ │ +
OP std::declval<U>())> > \
│ │ │ │ +
decltype(auto) \
│ │ │ │ +
operator OP(const T &t, const AlignedNumber<U, uAlign> &u) \
│ │ │ │ +
{ \
│ │ │ │ +
return aligned<uAlign>(t OP U(u)); \
│ │ │ │ +
} \
│ │ │ │ +
\
│ │ │ │ +
template<class T, std::size_t tAlign, class U, \
│ │ │ │ +
class = std::void_t<decltype(std::declval<T>() \
│ │ │ │ +
OP std::declval<U>())> > \
│ │ │ │ +
decltype(auto) \
│ │ │ │ +
operator OP(const AlignedNumber<T, tAlign> &t, const U &u) \
│ │ │ │ +
{ \
│ │ │ │ +
return aligned<tAlign>(T(t) OP u); \
│ │ │ │ +
} \
│ │ │ │ +
\
│ │ │ │ +
static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ +
AlignedNumber< T, align > aligned(T value)
align a value to a certain alignment
Definition: debugalign.hh:101
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ +

◆ DUNE_UNARY_FUNC

│ │ │ │ + │ │ │ │ +
│ │ │ │ +
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
#define DUNE_UNARY_FUNC( name)
│ │ │ │ +
│ │ │ │ +Value:
template<class T, std::size_t align> \
│ │ │ │ +
decltype(auto) name(const AlignedNumber<T, align> &u) \
│ │ │ │ +
{ \
│ │ │ │ +
using std::name; \
│ │ │ │ +
return aligned<align>(name(T(u))); \
│ │ │ │ +
} \
│ │ │ │ +
static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── encoding │ │ │ │ │ @@ -1 +1 @@ │ │ │ │ │ -utf-8 │ │ │ │ │ +us-ascii │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,38 +4,395 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Classes | Namespaces | Typedefs │ │ │ │ │ -typeutilities.hh File Reference │ │ │ │ │ -Utilities for type computations, constraining overloads, ... More... │ │ │ │ │ +Classes | Namespaces | Macros | Typedefs | Functions | Variables │ │ │ │ │ +debugalign.hh File Reference │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ Classes │ │ │ │ │ -struct  Dune::PriorityTag<_priority_> │ │ │ │ │ -  Helper class for tagging priorities. More... │ │ │ │ │ + class  Dune::AlignedBase<_align,_Impl_> │ │ │ │ │ +  CRTP base mixin class to check alignment. More... │ │ │ │ │   │ │ │ │ │ -struct  Dune::PriorityTag<_0_> │ │ │ │ │ -  Helper class for tagging priorities. More... │ │ │ │ │ +struct  Dune::IsNumber<_AlignedNumberImpl::AlignedNumber<_T,_align_>_> │ │ │ │ │ +  │ │ │ │ │ + class  Dune::AlignedNumberImpl::AlignedNumber<_T,_align_> │ │ │ │ │ +  aligned wrappers for arithmetic types More... │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Simd::Overloads::ScalarType<_AlignedNumber<_T,_align_>_> │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Simd::Overloads::RebindType<_U,_AlignedNumber<_T,_align_>_> │ │ │ │ │ +  │ │ │ │ │ +struct  Dune::Simd::Overloads::LaneCount<_AlignedNumber<_T,_align_>_> │ │ │ │ │   │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ +namespace  Dune::AlignedNumberImpl │ │ │ │ │ +  │ │ │ │ │ +namespace  Dune::Simd │ │ │ │ │ +  Namespace for vectorization interface functions used by library │ │ │ │ │ + developers. │ │ │ │ │ +  │ │ │ │ │ +namespace  Dune::Simd::Overloads │ │ │ │ │ +  Namespace for the overloads and specializations that make up a SIMD │ │ │ │ │ + implementation. │ │ │ │ │ +  │ │ │ │ │ + Macros │ │ │ │ │ +#define DUNE_ASSIGN_OP(OP) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_BINARY_OP(OP) │ │ │ │ │ +  │ │ │ │ │ +#define DUNE_UNARY_FUNC(name) │ │ │ │ │ +  │ │ │ │ │ Typedefs │ │ │ │ │ -template │ │ │ │ │ -using Dune::disableCopyMove = std::enable_if_t< not Impl:: │ │ │ │ │ - disableCopyMoveHelper< This, T... >::value, int > │ │ │ │ │ -  Helper to disable constructor as copy and move constructor. More... │ │ │ │ │ -  │ │ │ │ │ -***** Detailed Description ***** │ │ │ │ │ -Utilities for type computations, constraining overloads, ... │ │ │ │ │ - Author │ │ │ │ │ - Carsten Gräser │ │ │ │ │ +using Dune::ViolatedAlignmentHandler = std::function< void(const char *, std:: │ │ │ │ │ + size_t, const void *)> │ │ │ │ │ +  type of the handler called by violatedAlignment() More... │ │ │ │ │ +  │ │ │ │ │ + Functions │ │ │ │ │ + ViolatedAlignmentHandler & Dune::violatedAlignmentHandler () │ │ │ │ │ +  access the handler called by │ │ │ │ │ + violatedAlignment() More... │ │ │ │ │ +  │ │ │ │ │ + void Dune::violatedAlignment (const char │ │ │ │ │ + *className, std::size_t expectedAlignment, │ │ │ │ │ + const void *address) │ │ │ │ │ +  called when an alignment violation is │ │ │ │ │ + detected More... │ │ │ │ │ +  │ │ │ │ │ + bool Dune::isAligned (const void *p, std::size_t │ │ │ │ │ + align) │ │ │ │ │ +  check whether an address conforms to the │ │ │ │ │ + given alignment More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + AlignedNumber< T, align > Dune::aligned (T value) │ │ │ │ │ +  align a value to a certain alignment More... │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_BINARY_OP (+) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_BINARY_OP (-) │ │ │ │ │ +  │ │ │ │ │ + DUNE_BINARY_OP * Dune::AlignedNumberImpl::DUNE_BINARY_OP (/ │ │ │ │ │ + );DUNE_BINARY_OP(% │ │ │ │ │ +  │ │ │ │ │ + DUNE_BINARY_OP^ Dune::AlignedNumberImpl::DUNE_BINARY_OP │ │ │ │ │ + (&);DUNE_BINARY_OP(| │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_BINARY_OP (<<) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_BINARY_OP (> │ │ │ │ │ + >) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_BINARY_OP (==) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_BINARY_OP (!=) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_BINARY_OP (<=) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_BINARY_OP (>=) │ │ │ │ │ +  │ │ │ │ │ + DUNE_BINARY_OP && Dune::AlignedNumberImpl::DUNE_BINARY_OP │ │ │ │ │ + (||);#define DUNE_UNARY_FUNC(name) │ │ │ │ │ + DUNE_UNARY_FUNC(abs │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (acos) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (acosh) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (asin) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (asinh) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (atan) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (atanh) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (cbrt) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (ceil) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (cos) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (cosh) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (erf) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (erfc) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (exp) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (exp2) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (expm1) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (fabs) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (floor) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (ilogb) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (lgamma) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (llrint) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (llround) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (log) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (log10) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (log1p) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (log2) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (logb) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (lrint) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (lround) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (nearbyint) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (rint) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (round) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (sin) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (sinh) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (sqrt) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (tan) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (tanh) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (tgamma) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (trunc) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (isfinite) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (isinf) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (isnan) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (isnormal) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (signbit) │ │ │ │ │ +  │ │ │ │ │ +  Dune::AlignedNumberImpl::DUNE_UNARY_FUNC │ │ │ │ │ + (real) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::AlignedNumberImpl::max (const │ │ │ │ │ + AlignedNumber< T, align > &a, const │ │ │ │ │ + AlignedNumber< T, align > &b) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::AlignedNumberImpl::max (const T &a, │ │ │ │ │ + const AlignedNumber< T, align > &b) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::AlignedNumberImpl::max (const │ │ │ │ │ + AlignedNumber< T, align > &a, const T &b) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::AlignedNumberImpl::min (const │ │ │ │ │ + AlignedNumber< T, align > &a, const │ │ │ │ │ + AlignedNumber< T, align > &b) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::AlignedNumberImpl::min (const T &a, │ │ │ │ │ + const AlignedNumber< T, align > &b) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + auto Dune::AlignedNumberImpl::min (const │ │ │ │ │ + AlignedNumber< T, align > &a, const T &b) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + AlignedNumber< T, align > Dune::cond (const AlignedNumber< bool, align │ │ │ │ │ + > &b, const AlignedNumber< T, align > &v1, │ │ │ │ │ + const AlignedNumber< T, align > &v2) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + T Dune::max_value (const AlignedNumber< T, │ │ │ │ │ + align > &val) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + T Dune::min_value (const AlignedNumber< T, │ │ │ │ │ + align > &val) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + bool Dune::any_true (const AlignedNumber< bool, │ │ │ │ │ + align > &val) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + bool Dune::all_true (const AlignedNumber< bool, │ │ │ │ │ + align > &val) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + T & Dune::Simd::Overloads::lane (ADLTag< 5 >, │ │ │ │ │ + std::size_t l, AlignedNumber< T, align > &v) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + T Dune::Simd::Overloads::lane (ADLTag< 5 >, │ │ │ │ │ + std::size_t l, const AlignedNumber< T, align │ │ │ │ │ + > &v) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +const AlignedNumber< T, align > & Dune::Simd::Overloads::cond (ADLTag< 5 >, │ │ │ │ │ + AlignedNumber< bool, align > mask, const │ │ │ │ │ + AlignedNumber< T, align > &ifTrue, const │ │ │ │ │ + AlignedNumber< T, align > &ifFalse) │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ + bool Dune::Simd::Overloads::anyTrue (ADLTag< 5 >, │ │ │ │ │ + const AlignedNumber< bool, align > &mask) │ │ │ │ │ +  │ │ │ │ │ + Variables │ │ │ │ │ +static constexpr auto Dune::debugAlignment = 2*alignof(std::max_align_t) │ │ │ │ │ +  an alignment large enough to trigger alignment errors │ │ │ │ │ + More... │ │ │ │ │ +  │ │ │ │ │ +***** Macro Definition Documentation ***** │ │ │ │ │ +***** ◆ DUNE_ASSIGN_OP ***** │ │ │ │ │ +#define DUNE_ASSIGN_OP (  OP ) │ │ │ │ │ +Value: │ │ │ │ │ +template() OP std::declval()) ) \ │ │ │ │ │ +> > \ │ │ │ │ │ +AlignedNumber &operator OP(const AlignedNumber &u) \ │ │ │ │ │ +{ \ │ │ │ │ │ +value_ OP U(u); \ │ │ │ │ │ +return *this; \ │ │ │ │ │ +} \ │ │ │ │ │ +\ │ │ │ │ │ +template() OP \ │ │ │ │ │ +std::declval())> > \ │ │ │ │ │ +AlignedNumber &operator OP(const U &u) \ │ │ │ │ │ +{ \ │ │ │ │ │ +value_ OP u; \ │ │ │ │ │ +return *this; \ │ │ │ │ │ +} \ │ │ │ │ │ +\ │ │ │ │ │ +static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ +std │ │ │ │ │ +STL namespace. │ │ │ │ │ +***** ◆ DUNE_BINARY_OP ***** │ │ │ │ │ +#define DUNE_BINARY_OP (  OP ) │ │ │ │ │ +Value: │ │ │ │ │ +template() \ │ │ │ │ │ +OP std::declval())> > \ │ │ │ │ │ +decltype(auto) \ │ │ │ │ │ +operator OP(const AlignedNumber &t, \ │ │ │ │ │ +const AlignedNumber &u) \ │ │ │ │ │ +{ \ │ │ │ │ │ +/* can't use std::max(); not constexpr */ \ │ │ │ │ │ +return aligned<(tAlign > uAlign ? tAlign : uAlign)>(T(t) OP U(u)); \ │ │ │ │ │ +} \ │ │ │ │ │ +\ │ │ │ │ │ +template() \ │ │ │ │ │ +OP std::declval())> > \ │ │ │ │ │ +decltype(auto) \ │ │ │ │ │ +operator OP(const T &t, const AlignedNumber &u) \ │ │ │ │ │ +{ \ │ │ │ │ │ +return aligned(t OP U(u)); \ │ │ │ │ │ +} \ │ │ │ │ │ +\ │ │ │ │ │ +template() \ │ │ │ │ │ +OP std::declval())> > \ │ │ │ │ │ +decltype(auto) \ │ │ │ │ │ +operator OP(const AlignedNumber &t, const U &u) \ │ │ │ │ │ +{ \ │ │ │ │ │ +return aligned(T(t) OP u); \ │ │ │ │ │ +} \ │ │ │ │ │ +\ │ │ │ │ │ +static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ +Dune::aligned │ │ │ │ │ +AlignedNumber< T, align > aligned(T value) │ │ │ │ │ +align a value to a certain alignment │ │ │ │ │ +Definition: debugalign.hh:101 │ │ │ │ │ +***** ◆ DUNE_UNARY_FUNC ***** │ │ │ │ │ +#define DUNE_UNARY_FUNC (  name ) │ │ │ │ │ +Value: │ │ │ │ │ +template \ │ │ │ │ │ +decltype(auto) name(const AlignedNumber &u) \ │ │ │ │ │ +{ \ │ │ │ │ │ +using std::name; \ │ │ │ │ │ +return aligned(name(T(u))); \ │ │ │ │ │ +} \ │ │ │ │ │ +static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00206_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: typeutilities.hh Source File │ │ │ │ +dune-common: debugalign.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,73 +62,613 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
typeutilities.hh
│ │ │ │ +
debugalign.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 (C) 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_DEBUGALIGN_HH
│ │ │ │ +
6#define DUNE_DEBUGALIGN_HH
│ │ │ │
7
│ │ │ │ -
8#include <cstddef>
│ │ │ │ -
9#include <type_traits>
│ │ │ │ -
10#include <tuple>
│ │ │ │ -
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 {};
│ │ │ │ +
8#include <algorithm>
│ │ │ │ +
9#include <cassert>
│ │ │ │ +
10#include <cmath>
│ │ │ │ +
11#include <complex>
│ │ │ │ +
12#include <cstddef>
│ │ │ │ +
13#include <cstdint>
│ │ │ │ +
14#include <cstdlib> // abs
│ │ │ │ +
15#include <functional>
│ │ │ │ +
16#include <istream>
│ │ │ │ +
17#include <ostream>
│ │ │ │ +
18#include <type_traits>
│ │ │ │ +
19#include <utility>
│ │ │ │ +
20
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
26
│ │ │ │ +
27namespace Dune {
│ │ │ │
28
│ │ │ │ -
29 template<class This>
│ │ │ │ -
30 struct disableCopyMoveHelper<This> : public std::false_type
│ │ │ │ -
31 {};
│ │ │ │ + │ │ │ │ +
31 std::function<void(const char*, std::size_t, const void*)>;
│ │ │ │
32
│ │ │ │ -
33 } // namespace Impl
│ │ │ │
34
│ │ │ │ -
35
│ │ │ │ -
44 template<class This, class... T>
│ │ │ │ -
45 using disableCopyMove = std::enable_if_t< not Impl::disableCopyMoveHelper<This, T...>::value, int>;
│ │ │ │ -
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 };
│ │ │ │ + │ │ │ │ +
41
│ │ │ │ +
43
│ │ │ │ +
52 void violatedAlignment(const char *className, std::size_t expectedAlignment,
│ │ │ │ +
53 const void *address);
│ │ │ │ +
54
│ │ │ │ +
56 inline bool isAligned(const void *p, std::size_t align)
│ │ │ │ +
57 {
│ │ │ │ +
58 // a more portable way to do this would be to abuse std::align(), but that
│ │ │ │ +
59 // isn't supported by g++-4.9 yet
│ │ │ │ +
60 return std::uintptr_t(p) % align == 0;
│ │ │ │ +
61 }
│ │ │ │ +
62
│ │ │ │ +
64 template<std::size_t align, class Impl>
│ │ │ │ +
65 class alignas(align) AlignedBase
│ │ │ │ +
66 {
│ │ │ │ +
67 void checkAlignment() const
│ │ │ │ +
68 {
│ │ │ │ +
69 auto pimpl = static_cast<const Impl*>(this);
│ │ │ │ +
70 if(!isAligned(pimpl, align))
│ │ │ │ +
71 violatedAlignment(className<Impl>().c_str(), align, pimpl);
│ │ │ │ +
72 }
│ │ │ │ +
73 public:
│ │ │ │ +
74 AlignedBase() { checkAlignment(); }
│ │ │ │ +
75 AlignedBase(const AlignedBase &) { checkAlignment(); }
│ │ │ │ +
76 AlignedBase(AlignedBase &&) { checkAlignment(); }
│ │ │ │ +
77 ~AlignedBase() { checkAlignment(); }
│ │ │ │ +
78
│ │ │ │ +
79 AlignedBase& operator=(const AlignedBase &) = default;
│ │ │ │ + │ │ │ │ +
81 };
│ │ │ │ +
82
│ │ │ │ +
84 static constexpr auto debugAlignment = 2*alignof(std::max_align_t);
│ │ │ │ +
85
│ │ │ │ +
86 namespace AlignedNumberImpl {
│ │ │ │ +
87
│ │ │ │ +
88 template<class T, std::size_t align = debugAlignment>
│ │ │ │ +
89 class AlignedNumber;
│ │ │ │
90
│ │ │ │ -
91
│ │ │ │ +
91 } // namespace AlignedNumberImpl
│ │ │ │
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
│ │ │ │ +
95 template<class T, std::size_t align>
│ │ │ │ +
96 struct IsNumber<AlignedNumberImpl::AlignedNumber<T,align>>
│ │ │ │ +
97 : public std::true_type {};
│ │ │ │ +
98
│ │ │ │ +
100 template<std::size_t align = debugAlignment, class T>
│ │ │ │ +
101 AlignedNumber<T, align> aligned(T value) { return { std::move(value) }; }
│ │ │ │ +
102
│ │ │ │ +
103 // The purpose of this namespace is to move the `<cmath>` function overloads
│ │ │ │ +
104 // out of namespace `Dune`. This avoids problems where people called
│ │ │ │ +
105 // e.g. `sqrt(1.0)` inside the `Dune` namespace, without first doing `using
│ │ │ │ +
106 // std::sqrt;`. Without any `Dune::sqrt()`, such a use will find
│ │ │ │ +
107 // `::sqrt()`, but with `Dune::sqrt()` it will find only `Dune::sqrt()`,
│ │ │ │ +
108 // which does not have an overload for `double`.
│ │ │ │ +
109 namespace AlignedNumberImpl {
│ │ │ │ +
110
│ │ │ │ +
112 template<class T, std::size_t align>
│ │ │ │ + │ │ │ │ +
114 : public AlignedBase<align, AlignedNumber<T, align> >
│ │ │ │ +
115 {
│ │ │ │ +
116 T value_;
│ │ │ │ +
117
│ │ │ │ +
118 public:
│ │ │ │ +
119 AlignedNumber() = default;
│ │ │ │ +
120 AlignedNumber(T value) : value_(std::move(value)) {}
│ │ │ │ +
121 template<class U, std::size_t uAlign,
│ │ │ │ +
122 class = std::enable_if_t<(align >= uAlign) &&
│ │ │ │ +
123 std::is_convertible<U, T>::value> >
│ │ │ │ +
124 AlignedNumber(const AlignedNumber<U, uAlign> &o) : value_(U(o)) {}
│ │ │ │ +
125
│ │ │ │ +
126 // accessors
│ │ │ │ +
127 template<class U,
│ │ │ │ +
128 class = std::enable_if_t<std::is_convertible<T, U>::value> >
│ │ │ │ +
129 explicit operator U() const { return value_; }
│ │ │ │ +
130
│ │ │ │ +
131 const T &value() const { return value_; }
│ │ │ │ +
132 T &value() { return value_; }
│ │ │ │ +
133
│ │ │ │ +
134 // I/O
│ │ │ │ +
135 template<class charT, class Traits>
│ │ │ │ +
136 friend std::basic_istream<charT, Traits>&
│ │ │ │ +
137 operator>>(std::basic_istream<charT, Traits>& str, AlignedNumber &u)
│ │ │ │ +
138 {
│ │ │ │ +
139 return str >> u.value_;
│ │ │ │ +
140 }
│ │ │ │ +
141
│ │ │ │ +
142 template<class charT, class Traits>
│ │ │ │ +
143 friend std::basic_ostream<charT, Traits>&
│ │ │ │ +
144 operator<<(std::basic_ostream<charT, Traits>& str,
│ │ │ │ +
145 const AlignedNumber &u)
│ │ │ │ +
146 {
│ │ │ │ +
147 return str << u.value_;
│ │ │ │ +
148 }
│ │ │ │ +
149
│ │ │ │ +
150 // The trick with `template<class U = T, class = std::void_t<expr(U)> >` is
│ │ │ │ +
151 // needed because at least g++-4.9 seems to evaluates a default argument
│ │ │ │ +
152 // in `template<class = std::void_t<expr(T))> >` as soon as possible and will
│ │ │ │ +
153 // error out if `expr(T)` is invalid. E.g. for `expr(T)` =
│ │ │ │ +
154 // `decltype(--std::declval<T&>())`, instantiating `AlignedNumber<bool>`
│ │ │ │ +
155 // will result in an unrecoverable error (`--` cannot be applied to a
│ │ │ │ +
156 // `bool`).
│ │ │ │ +
157
│ │ │ │ +
158 // Increment, decrement
│ │ │ │ +
159 template<class U = T, class = std::void_t<decltype(++std::declval<U&>())> >
│ │ │ │ +
160 AlignedNumber &operator++() { ++value_; return *this; }
│ │ │ │ +
161
│ │ │ │ +
162 template<class U = T, class = std::void_t<decltype(--std::declval<U&>())> >
│ │ │ │ +
163 AlignedNumber &operator--() { --value_; return *this; }
│ │ │ │ +
164
│ │ │ │ +
165 template<class U = T, class = std::void_t<decltype(std::declval<U&>()++)> >
│ │ │ │ +
166 decltype(auto) operator++(int) { return aligned<align>(value_++); }
│ │ │ │ +
167
│ │ │ │ +
168 template<class U = T, class = std::void_t<decltype(std::declval<U&>()--)> >
│ │ │ │ +
169 decltype(auto) operator--(int) { return aligned<align>(value_--); }
│ │ │ │ +
170
│ │ │ │ +
171 // unary operators
│ │ │ │ +
172 template<class U = T,
│ │ │ │ +
173 class = std::void_t<decltype(+std::declval<const U&>())> >
│ │ │ │ +
174 decltype(auto) operator+() const { return aligned<align>(+value_); }
│ │ │ │ +
175
│ │ │ │ +
176 template<class U = T,
│ │ │ │ +
177 class = std::void_t<decltype(-std::declval<const U&>())> >
│ │ │ │ +
178 decltype(auto) operator-() const { return aligned<align>(-value_); }
│ │ │ │ +
179
│ │ │ │ +
180 /*
│ │ │ │ +
181 * silence warnings from GCC about using `~` on a bool
│ │ │ │ +
182 * (when instantiated for T=bool)
│ │ │ │ +
183 */
│ │ │ │ +
184#if __GNUC__ >= 7
│ │ │ │ +
185# pragma GCC diagnostic push
│ │ │ │ +
186# pragma GCC diagnostic ignored "-Wbool-operation"
│ │ │ │ +
187#endif
│ │ │ │ +
188#ifdef __clang__
│ │ │ │ +
189# pragma clang diagnostic push
│ │ │ │ +
190# pragma clang diagnostic ignored "-Wbool-operation"
│ │ │ │ +
191#endif
│ │ │ │ +
192 template<class U = T,
│ │ │ │ +
193 class = std::void_t<decltype(~std::declval<const U&>())> >
│ │ │ │ +
194 decltype(auto) operator~() const { return aligned<align>(~value_); }
│ │ │ │ +
195#if __GNUC__ >= 7
│ │ │ │ +
196# pragma GCC diagnostic pop
│ │ │ │ +
197#endif
│ │ │ │ +
198#ifdef __clang__
│ │ │ │ +
199# pragma clang diagnostic pop
│ │ │ │ +
200#endif
│ │ │ │ +
201
│ │ │ │ +
202 template<class U = T,
│ │ │ │ +
203 class = std::void_t<decltype(!std::declval<const U&>())> >
│ │ │ │ +
204 decltype(auto) operator!() const { return aligned<align>(!value_); }
│ │ │ │ +
205
│ │ │ │ +
206 // assignment operators
│ │ │ │ +
207#define DUNE_ASSIGN_OP(OP) \
│ │ │ │ +
208 template<class U, std::size_t uAlign, \
│ │ │ │ +
209 class = std::enable_if_t< \
│ │ │ │ +
210 ( uAlign <= align && \
│ │ │ │ +
211 sizeof(std::declval<T&>() OP std::declval<U>()) ) \
│ │ │ │ +
212 > > \
│ │ │ │ +
213 AlignedNumber &operator OP(const AlignedNumber<U, uAlign> &u) \
│ │ │ │ +
214 { \
│ │ │ │ +
215 value_ OP U(u); \
│ │ │ │ +
216 return *this; \
│ │ │ │ +
217 } \
│ │ │ │ +
218 \
│ │ │ │ +
219 template<class U, \
│ │ │ │ +
220 class = std::void_t<decltype(std::declval<T&>() OP \
│ │ │ │ +
221 std::declval<U>())> > \
│ │ │ │ +
222 AlignedNumber &operator OP(const U &u) \
│ │ │ │ +
223 { \
│ │ │ │ +
224 value_ OP u; \
│ │ │ │ +
225 return *this; \
│ │ │ │ +
226 } \
│ │ │ │ +
227 \
│ │ │ │ +
228 static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ +
229
│ │ │ │ + │ │ │ │ + │ │ │ │ +
232
│ │ │ │ + │ │ │ │ +
234 DUNE_ASSIGN_OP(/=);
│ │ │ │ +
235 DUNE_ASSIGN_OP(%=);
│ │ │ │ +
236
│ │ │ │ + │ │ │ │ +
238 DUNE_ASSIGN_OP(&=);
│ │ │ │ +
239 DUNE_ASSIGN_OP(|=);
│ │ │ │ +
240
│ │ │ │ + │ │ │ │ + │ │ │ │ +
243
│ │ │ │ +
244#undef DUNE_ASSIGN_OP
│ │ │ │ +
245 };
│ │ │ │ +
246
│ │ │ │ +
247 // binary operators
│ │ │ │ +
248#define DUNE_BINARY_OP(OP) \
│ │ │ │ +
249 template<class T, std::size_t tAlign, class U, std::size_t uAlign, \
│ │ │ │ +
250 class = std::void_t<decltype(std::declval<T>() \
│ │ │ │ +
251 OP std::declval<U>())> > \
│ │ │ │ +
252 decltype(auto) \
│ │ │ │ +
253 operator OP(const AlignedNumber<T, tAlign> &t, \
│ │ │ │ +
254 const AlignedNumber<U, uAlign> &u) \
│ │ │ │ +
255 { \
│ │ │ │ +
256 /* can't use std::max(); not constexpr */ \
│ │ │ │ +
257 return aligned<(tAlign > uAlign ? tAlign : uAlign)>(T(t) OP U(u)); \
│ │ │ │ +
258 } \
│ │ │ │ +
259 \
│ │ │ │ +
260 template<class T, class U, std::size_t uAlign, \
│ │ │ │ +
261 class = std::void_t<decltype(std::declval<T>() \
│ │ │ │ +
262 OP std::declval<U>())> > \
│ │ │ │ +
263 decltype(auto) \
│ │ │ │ +
264 operator OP(const T &t, const AlignedNumber<U, uAlign> &u) \
│ │ │ │ +
265 { \
│ │ │ │ +
266 return aligned<uAlign>(t OP U(u)); \
│ │ │ │ +
267 } \
│ │ │ │ +
268 \
│ │ │ │ +
269 template<class T, std::size_t tAlign, class U, \
│ │ │ │ +
270 class = std::void_t<decltype(std::declval<T>() \
│ │ │ │ +
271 OP std::declval<U>())> > \
│ │ │ │ +
272 decltype(auto) \
│ │ │ │ +
273 operator OP(const AlignedNumber<T, tAlign> &t, const U &u) \
│ │ │ │ +
274 { \
│ │ │ │ +
275 return aligned<tAlign>(T(t) OP u); \
│ │ │ │ +
276 } \
│ │ │ │ +
277 \
│ │ │ │ +
278 static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ +
279
│ │ │ │ + │ │ │ │ + │ │ │ │ +
282
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
286
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
290
│ │ │ │ + │ │ │ │ + │ │ │ │ +
293
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
300
│ │ │ │ + │ │ │ │ +
302 DUNE_BINARY_OP(||);
│ │ │ │ +
303
│ │ │ │ +
304#undef DUNE_BINARY_OP
│ │ │ │ +
305
│ │ │ │ +
307 //
│ │ │ │ +
308 // Overloads for the functions provided by the standard library
│ │ │ │ +
309 //
│ │ │ │ +
310#define DUNE_UNARY_FUNC(name) \
│ │ │ │ +
311 template<class T, std::size_t align> \
│ │ │ │ +
312 decltype(auto) name(const AlignedNumber<T, align> &u) \
│ │ │ │ +
313 { \
│ │ │ │ +
314 using std::name; \
│ │ │ │ +
315 return aligned<align>(name(T(u))); \
│ │ │ │ +
316 } \
│ │ │ │ +
317 static_assert(true, "Require semicolon to unconfuse editors")
│ │ │ │ +
318
│ │ │ │ +
319 //
│ │ │ │ +
320 // <cmath> functions
│ │ │ │ +
321 //
│ │ │ │ +
322
│ │ │ │ +
323 // note: only unary functions are provided at the moment. Getting all the
│ │ │ │ +
324 // overloads right for functions with more than one argument is tricky.
│ │ │ │ +
325 // All <cmath> functions appear in the list below in the order they are
│ │ │ │ +
326 // listed in in the standard, but the unimplemented ones are commented
│ │ │ │ +
327 // out.
│ │ │ │ +
328
│ │ │ │ +
329 // note: abs is provided by both <cstdlib> (for integer) and <cmath> (for
│ │ │ │ +
330 // floating point). This overload works for both.
│ │ │ │ +
331 DUNE_UNARY_FUNC(abs);
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
337 // atan2
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
341 // copysign
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
350 // fdim
│ │ │ │ + │ │ │ │ +
352 // fma
│ │ │ │ +
353 // fmax
│ │ │ │ +
354 // fmin
│ │ │ │ +
355 // fmod
│ │ │ │ +
356 // frexp
│ │ │ │ +
357 // hypos
│ │ │ │ + │ │ │ │ +
359 // ldexp
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
370 // modf
│ │ │ │ +
371 DUNE_UNARY_FUNC(nearbyint);
│ │ │ │ +
372 // nextafter
│ │ │ │ +
373 // nexttoward
│ │ │ │ +
374 // pow
│ │ │ │ +
375 // remainder
│ │ │ │ +
376 // remquo
│ │ │ │ + │ │ │ │ + │ │ │ │ +
379 // scalbln
│ │ │ │ +
380 // scalbn
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
388
│ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ + │ │ │ │ +
394
│ │ │ │ +
395 // isgreater
│ │ │ │ +
396 // isgreaterequal
│ │ │ │ +
397 // isless
│ │ │ │ +
398 // islessequal
│ │ │ │ +
399 // islessgreater
│ │ │ │ +
400 // isunordered
│ │ │ │ +
401
│ │ │ │ +
402 //
│ │ │ │ +
403 // <complex> functions
│ │ │ │ +
404 //
│ │ │ │ +
405
│ │ │ │ +
406 // not all functions are implemented, and unlike for <cmath>, no
│ │ │ │ +
407 // comprehensive list is provided
│ │ │ │ + │ │ │ │ +
409
│ │ │ │ +
410#undef DUNE_UNARY_FUNC
│ │ │ │ +
411
│ │ │ │ +
412 // We need to overload min() and max() since they require types to be
│ │ │ │ +
413 // LessThanComparable, which requires `a<b` to be "convertible to bool".
│ │ │ │ +
414 // That wording seems to be a leftover from C++03, and today is probably
│ │ │ │ +
415 // equivalent to "implicitly convertible". There is also issue 2114
│ │ │ │ +
416 // <https://cplusplus.github.io/LWG/issue2114> in the standard (still open
│ │ │ │ +
417 // as of 2018-07-06), which strives to require both "implicitly" and
│ │ │ │ +
418 // "contextually" convertible -- plus a few other things.
│ │ │ │ +
419 //
│ │ │ │ +
420 // We do not want our debug type to automatically decay to the underlying
│ │ │ │ +
421 // type, so we do not want to make the conversion non-explicit. So the
│ │ │ │ +
422 // only option left is to overload min() and max().
│ │ │ │ +
423
│ │ │ │ +
424 template<class T, std::size_t align>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
427 {
│ │ │ │ +
428 using std::max;
│ │ │ │ +
429 return aligned<align>(max(T(a), T(b)));
│ │ │ │ +
430 }
│ │ │ │ +
431
│ │ │ │ +
432 template<class T, std::size_t align>
│ │ │ │ +
433 auto max(const T &a, const AlignedNumber<T, align> &b)
│ │ │ │ +
434 {
│ │ │ │ +
435 using std::max;
│ │ │ │ +
436 return aligned<align>(max(a, T(b)));
│ │ │ │ +
437 }
│ │ │ │ +
438
│ │ │ │ +
439 template<class T, std::size_t align>
│ │ │ │ +
440 auto max(const AlignedNumber<T, align> &a, const T &b)
│ │ │ │ +
441 {
│ │ │ │ +
442 using std::max;
│ │ │ │ +
443 return aligned<align>(max(T(a), b));
│ │ │ │ +
444 }
│ │ │ │ +
445
│ │ │ │ +
446 template<class T, std::size_t align>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
449 {
│ │ │ │ +
450 using std::min;
│ │ │ │ +
451 return aligned<align>(min(T(a), T(b)));
│ │ │ │ +
452 }
│ │ │ │ +
453
│ │ │ │ +
454 template<class T, std::size_t align>
│ │ │ │ +
455 auto min(const T &a, const AlignedNumber<T, align> &b)
│ │ │ │ +
456 {
│ │ │ │ +
457 using std::min;
│ │ │ │ +
458 return aligned<align>(min(a, T(b)));
│ │ │ │ +
459 }
│ │ │ │ +
460
│ │ │ │ +
461 template<class T, std::size_t align>
│ │ │ │ +
462 auto min(const AlignedNumber<T, align> &a, const T &b)
│ │ │ │ +
463 {
│ │ │ │ +
464 using std::min;
│ │ │ │ +
465 return aligned<align>(min(T(a), b));
│ │ │ │ +
466 }
│ │ │ │ +
467
│ │ │ │ +
468 } // namespace AlignedNumberImpl
│ │ │ │ +
469
│ │ │ │ +
470 // SIMD-like functions from "conditional.hh"
│ │ │ │ +
471 template<class T, std::size_t align>
│ │ │ │ +
472 AlignedNumber<T, align>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
475 {
│ │ │ │ +
476 return b ? v1 : v2;
│ │ │ │ +
477 }
│ │ │ │ +
478
│ │ │ │ +
479 // SIMD-like functions from "rangeutilities.hh"
│ │ │ │ +
480 template<class T, std::size_t align>
│ │ │ │ + │ │ │ │ +
482 {
│ │ │ │ +
483 return T(val);
│ │ │ │ +
484 }
│ │ │ │ +
485
│ │ │ │ +
486 template<class T, std::size_t align>
│ │ │ │ + │ │ │ │ +
488 {
│ │ │ │ +
489 return T(val);
│ │ │ │ +
490 }
│ │ │ │ +
491
│ │ │ │ +
492 template<std::size_t align>
│ │ │ │ + │ │ │ │ +
494 {
│ │ │ │ +
495 return bool(val);
│ │ │ │ +
496 }
│ │ │ │ +
497
│ │ │ │ +
498 template<std::size_t align>
│ │ │ │ + │ │ │ │ +
500 {
│ │ │ │ +
501 return bool(val);
│ │ │ │ +
502 }
│ │ │ │ +
503
│ │ │ │ +
504 // SIMD-like functionality from "simd/interface.hh"
│ │ │ │ +
505 namespace Simd {
│ │ │ │ +
506 namespace Overloads {
│ │ │ │ +
507
│ │ │ │ +
508 template<class T, std::size_t align>
│ │ │ │ + │ │ │ │ +
510
│ │ │ │ +
511 template<class U, class T, std::size_t align>
│ │ │ │ +
512 struct RebindType<U, AlignedNumber<T, align> > {
│ │ │ │ + │ │ │ │ +
514 };
│ │ │ │ +
515
│ │ │ │ +
516 template<class T, std::size_t align>
│ │ │ │ +
517 struct LaneCount<AlignedNumber<T, align> > : index_constant<1> {};
│ │ │ │ +
518
│ │ │ │ +
519 template<class T, std::size_t align>
│ │ │ │ + │ │ │ │ +
521 {
│ │ │ │ +
522 assert(l == 0);
│ │ │ │ +
523 return v.value();
│ │ │ │ +
524 }
│ │ │ │ +
525
│ │ │ │ +
526 template<class T, std::size_t align>
│ │ │ │ +
527 T lane(ADLTag<5>, std::size_t l, const AlignedNumber<T, align> &v)
│ │ │ │ +
528 {
│ │ │ │ +
529 assert(l == 0);
│ │ │ │ +
530 return v.value();
│ │ │ │ +
531 }
│ │ │ │ +
532
│ │ │ │ +
533 template<class T, std::size_t align>
│ │ │ │ + │ │ │ │ + │ │ │ │ +
536 const AlignedNumber<T, align> &ifTrue,
│ │ │ │ +
537 const AlignedNumber<T, align> &ifFalse)
│ │ │ │ +
538 {
│ │ │ │ +
539 return mask ? ifTrue : ifFalse;
│ │ │ │ +
540 }
│ │ │ │ +
541
│ │ │ │ +
542 template<std::size_t align>
│ │ │ │ + │ │ │ │ +
544 {
│ │ │ │ +
545 return bool(mask);
│ │ │ │ +
546 }
│ │ │ │ +
547
│ │ │ │ +
548 } // namespace Overloads
│ │ │ │ +
549
│ │ │ │ +
550 } // namespace Simd
│ │ │ │ +
551
│ │ │ │ +
552} // namespace Dune
│ │ │ │ +
553
│ │ │ │ +
554#endif // DUNE_DEBUGALIGN_HH
│ │ │ │ +
A free function to provide the demangled class name of a given object or type as a string.
│ │ │ │ +
Default implementations for SIMD Implementations.
│ │ │ │ +
Basic definitions for SIMD Implementations.
│ │ │ │ +
Traits for type conversions and type information.
│ │ │ │ +
#define DUNE_BINARY_OP(OP)
Definition: debugalign.hh:248
│ │ │ │ +
#define DUNE_UNARY_FUNC(name)
│ │ │ │ +
#define DUNE_ASSIGN_OP(OP)
Definition: debugalign.hh:207
│ │ │ │ + │ │ │ │ +
std::integral_constant< std::size_t, i > index_constant
An index constant with value i.
Definition: indices.hh:30
│ │ │ │ +
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
│ │ │ │ +
std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x)
Definition: bigunsignedint.hh:278
│ │ │ │ +
I round(const T &val, typename EpsilonType< T >::Type epsilon)
round using epsilon
Definition: float_cmp.cc:311
│ │ │ │ +
I trunc(const T &val, typename EpsilonType< T >::Type epsilon)
truncate using epsilon
Definition: float_cmp.cc:407
│ │ │ │ +
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
│ │ │ │ -
Helper class for tagging priorities.
Definition: typeutilities.hh:73
│ │ │ │ -
static constexpr std::size_t value
Definition: typeutilities.hh:74
│ │ │ │ +
void violatedAlignment(const char *className, std::size_t expectedAlignment, const void *address)
called when an alignment violation is detected
Definition: debugalign.cc:39
│ │ │ │ +
bool any_true(const AlignedNumber< bool, align > &val)
Definition: debugalign.hh:493
│ │ │ │ +
bool all_true(const AlignedNumber< bool, align > &val)
Definition: debugalign.hh:499
│ │ │ │ +
std::string className()
Provide the demangled class name of a type T as a string.
Definition: classname.hh:47
│ │ │ │ +
static constexpr auto debugAlignment
an alignment large enough to trigger alignment errors
Definition: debugalign.hh:84
│ │ │ │ +
T lane(std::size_t l, const T &v)
access a lane of a simd vector (scalar version)
Definition: simd.hh:366
│ │ │ │ +
const T1 cond(bool b, const T1 &v1, const T2 &v2)
conditional evaluate
Definition: conditional.hh:28
│ │ │ │ +
AlignedNumber< T, align > aligned(T value)
align a value to a certain alignment
Definition: debugalign.hh:101
│ │ │ │ +
ViolatedAlignmentHandler & violatedAlignmentHandler()
access the handler called by violatedAlignment()
Definition: debugalign.cc:33
│ │ │ │ +
bool isAligned(const void *p, std::size_t align)
check whether an address conforms to the given alignment
Definition: debugalign.hh:56
│ │ │ │ +
T max_value(const AlignedNumber< T, align > &val)
Definition: debugalign.hh:481
│ │ │ │ +
std::function< void(const char *, std::size_t, const void *)> ViolatedAlignmentHandler
type of the handler called by violatedAlignment()
Definition: debugalign.hh:31
│ │ │ │ +
T min_value(const AlignedNumber< T, align > &val)
Definition: debugalign.hh:487
│ │ │ │ +
auto max(const AlignedNumber< T, align > &a, const T &b)
Definition: debugalign.hh:440
│ │ │ │ +
auto min(const AlignedNumber< T, align > &a, const T &b)
Definition: debugalign.hh:462
│ │ │ │ +
bool anyTrue(ADLTag< 5 >, const AlignedNumber< bool, align > &mask)
Definition: debugalign.hh:543
│ │ │ │ +
Whether this type acts as a scalar in the context of (hierarchically blocked) containers.
Definition: typetraits.hh:194
│ │ │ │ +
CRTP base mixin class to check alignment.
Definition: debugalign.hh:66
│ │ │ │ +
~AlignedBase()
Definition: debugalign.hh:77
│ │ │ │ +
AlignedBase & operator=(AlignedBase &&)=default
│ │ │ │ +
AlignedBase(AlignedBase &&)
Definition: debugalign.hh:76
│ │ │ │ +
AlignedBase & operator=(const AlignedBase &)=default
│ │ │ │ +
AlignedBase(const AlignedBase &)
Definition: debugalign.hh:75
│ │ │ │ +
AlignedBase()
Definition: debugalign.hh:74
│ │ │ │ +
aligned wrappers for arithmetic types
Definition: debugalign.hh:115
│ │ │ │ + │ │ │ │ + │ │ │ │ +
decltype(auto) operator+() const
Definition: debugalign.hh:174
│ │ │ │ + │ │ │ │ +
decltype(auto) operator--(int)
Definition: debugalign.hh:169
│ │ │ │ +
DUNE_ASSIGN_OP * DUNE_ASSIGN_OP(/=);DUNE_ASSIGN_OP(%=
│ │ │ │ +
decltype(auto) operator++(int)
Definition: debugalign.hh:166
│ │ │ │ +
decltype(auto) operator!() const
Definition: debugalign.hh:204
│ │ │ │ +
T & value()
Definition: debugalign.hh:132
│ │ │ │ +
const T & value() const
Definition: debugalign.hh:131
│ │ │ │ +
DUNE_ASSIGN_OP^ DUNE_ASSIGN_OP(&=);DUNE_ASSIGN_OP(|=
│ │ │ │ +
friend std::basic_istream< charT, Traits > & operator>>(std::basic_istream< charT, Traits > &str, AlignedNumber &u)
Definition: debugalign.hh:137
│ │ │ │ + │ │ │ │ + │ │ │ │ +
decltype(auto) operator~() const
Definition: debugalign.hh:194
│ │ │ │ +
AlignedNumber(T value)
Definition: debugalign.hh:120
│ │ │ │ +
AlignedNumber(const AlignedNumber< U, uAlign > &o)
Definition: debugalign.hh:124
│ │ │ │ +
decltype(auto) operator-() const
Definition: debugalign.hh:178
│ │ │ │ + │ │ │ │ +
Tag used to force late-binding lookup in Dune::Simd::Overloads.
Definition: base.hh:182
│ │ │ │ +
should have a member type type
Definition: standard.hh:60
│ │ │ │ +
should have a member type type
Definition: standard.hh:67
│ │ │ │ +
should be derived from a Dune::index_constant
Definition: standard.hh:74
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,81 +4,748 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -typeutilities.hh │ │ │ │ │ +debugalign.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 (C) 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_DEBUGALIGN_HH │ │ │ │ │ + 6#define DUNE_DEBUGALIGN_HH │ │ │ │ │ 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11 │ │ │ │ │ - 12 │ │ │ │ │ - 13namespace Dune { │ │ │ │ │ - 14 │ │ │ │ │ - 22 namespace Impl │ │ │ │ │ - 23 { │ │ │ │ │ - 24 │ │ │ │ │ - 25 template │ │ │ │ │ - 26 struct disableCopyMoveHelper : public std::is_base_of...>>> │ │ │ │ │ - 27 {}; │ │ │ │ │ + 8#include │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11#include │ │ │ │ │ + 12#include │ │ │ │ │ + 13#include │ │ │ │ │ + 14#include // abs │ │ │ │ │ + 15#include │ │ │ │ │ + 16#include │ │ │ │ │ + 17#include │ │ │ │ │ + 18#include │ │ │ │ │ + 19#include │ │ │ │ │ + 20 │ │ │ │ │ + 21#include │ │ │ │ │ + 22#include │ │ │ │ │ + 23#include │ │ │ │ │ + 24#include │ │ │ │ │ + 25#include │ │ │ │ │ + 26 │ │ │ │ │ + 27namespace Dune { │ │ │ │ │ 28 │ │ │ │ │ - 29 template │ │ │ │ │ - 30 struct disableCopyMoveHelper : public std::false_type │ │ │ │ │ - 31 {}; │ │ │ │ │ +30 using ViolatedAlignmentHandler = │ │ │ │ │ + 31 std::function; │ │ │ │ │ 32 │ │ │ │ │ - 33 } // namespace Impl │ │ │ │ │ 34 │ │ │ │ │ - 35 │ │ │ │ │ - 44 template │ │ │ │ │ -45 using disableCopyMove = std::enable_if_t< not Impl:: │ │ │ │ │ -disableCopyMoveHelper::value, int>; │ │ │ │ │ - 46 │ │ │ │ │ - 47 │ │ │ │ │ - 48 │ │ │ │ │ - 71 template │ │ │ │ │ -72 struct PriorityTag : public PriorityTag │ │ │ │ │ - 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 }; │ │ │ │ │ + 40 ViolatedAlignmentHandler &violatedAlignmentHandler(); │ │ │ │ │ + 41 │ │ │ │ │ + 43 │ │ │ │ │ + 52 void violatedAlignment(const char *className, std::size_t │ │ │ │ │ +expectedAlignment, │ │ │ │ │ + 53 const void *address); │ │ │ │ │ + 54 │ │ │ │ │ +56 inline bool isAligned(const void *p, std::size_t align) │ │ │ │ │ + 57 { │ │ │ │ │ + 58 // a more portable way to do this would be to abuse std::align(), but that │ │ │ │ │ + 59 // isn't supported by g++-4.9 yet │ │ │ │ │ + 60 return std::uintptr_t(p) % align == 0; │ │ │ │ │ + 61 } │ │ │ │ │ + 62 │ │ │ │ │ + 64 template │ │ │ │ │ +65 class alignas(align) AlignedBase │ │ │ │ │ + 66 { │ │ │ │ │ + 67 void checkAlignment() const │ │ │ │ │ + 68 { │ │ │ │ │ + 69 auto pimpl = static_cast(this); │ │ │ │ │ + 70 if(!isAligned(pimpl, align)) │ │ │ │ │ + 71 violatedAlignment(className().c_str(), align, pimpl); │ │ │ │ │ + 72 } │ │ │ │ │ + 73 public: │ │ │ │ │ +74 AlignedBase() { checkAlignment(); } │ │ │ │ │ +75 AlignedBase(const AlignedBase &) { checkAlignment(); } │ │ │ │ │ +76 AlignedBase(AlignedBase &&) { checkAlignment(); } │ │ │ │ │ +77 ~AlignedBase() { checkAlignment(); } │ │ │ │ │ + 78 │ │ │ │ │ +79 AlignedBase& operator=(const AlignedBase &) = default; │ │ │ │ │ +80 AlignedBase& operator=(AlignedBase &&) = default; │ │ │ │ │ + 81 }; │ │ │ │ │ + 82 │ │ │ │ │ +84 static constexpr auto debugAlignment = 2*alignof(std::max_align_t); │ │ │ │ │ + 85 │ │ │ │ │ +86 namespace AlignedNumberImpl { │ │ │ │ │ + 87 │ │ │ │ │ + 88 template │ │ │ │ │ + 89 class AlignedNumber; │ │ │ │ │ 90 │ │ │ │ │ - 91 │ │ │ │ │ + 91 } // namespace AlignedNumberImpl │ │ │ │ │ 92 │ │ │ │ │ - 93} // namespace Dune │ │ │ │ │ + 93 using AlignedNumberImpl::AlignedNumber; │ │ │ │ │ 94 │ │ │ │ │ - 95 │ │ │ │ │ - 96 │ │ │ │ │ - 97#endif // DUNE_COMMON_TYPEUTILITIES_HH │ │ │ │ │ -Dune::disableCopyMove │ │ │ │ │ -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 │ │ │ │ │ + 95 template │ │ │ │ │ +96 struct IsNumber> │ │ │ │ │ + 97 : public std::true_type {}; │ │ │ │ │ + 98 │ │ │ │ │ + 100 template │ │ │ │ │ +101 AlignedNumber aligned(T value) { return { std::move(value) }; } │ │ │ │ │ + 102 │ │ │ │ │ + 103 // The purpose of this namespace is to move the `` function │ │ │ │ │ +overloads │ │ │ │ │ + 104 // out of namespace `Dune`. This avoids problems where people called │ │ │ │ │ + 105 // e.g. `sqrt(1.0)` inside the `Dune` namespace, without first doing │ │ │ │ │ +`using │ │ │ │ │ + 106 // std::sqrt;`. Without any `Dune::sqrt()`, such a use will find │ │ │ │ │ + 107 // `::sqrt()`, but with `Dune::sqrt()` it will find only `Dune::sqrt()`, │ │ │ │ │ + 108 // which does not have an overload for `double`. │ │ │ │ │ + 109 namespace AlignedNumberImpl { │ │ │ │ │ + 110 │ │ │ │ │ + 112 template │ │ │ │ │ +113 class AlignedNumber │ │ │ │ │ + 114 : public AlignedBase > │ │ │ │ │ + 115 { │ │ │ │ │ + 116 T value_; │ │ │ │ │ + 117 │ │ │ │ │ + 118 public: │ │ │ │ │ +119 AlignedNumber() = default; │ │ │ │ │ +120 AlignedNumber(T value) : value_(std::move(value)) {} │ │ │ │ │ + 121 template= uAlign) && │ │ │ │ │ + 123 std::is_convertible::value> > │ │ │ │ │ +124 AlignedNumber(const AlignedNumber &o) : value_(U(o)) {} │ │ │ │ │ + 125 │ │ │ │ │ + 126 // accessors │ │ │ │ │ + 127 template::value> > │ │ │ │ │ +129 explicit operator U() const { return value_; } │ │ │ │ │ + 130 │ │ │ │ │ +131 const T &value() const { return value_; } │ │ │ │ │ +132 T &value() { return value_; } │ │ │ │ │ + 133 │ │ │ │ │ + 134 // I/O │ │ │ │ │ + 135 template │ │ │ │ │ + 136 friend std::basic_istream& │ │ │ │ │ +137 operator>>(std::basic_istream& str, AlignedNumber &u) │ │ │ │ │ + 138 { │ │ │ │ │ + 139 return str >> u.value_; │ │ │ │ │ + 140 } │ │ │ │ │ + 141 │ │ │ │ │ + 142 template │ │ │ │ │ +143 friend std::basic_ostream& │ │ │ │ │ + 144 operator<<(std::basic_ostream& str, │ │ │ │ │ + 145 const AlignedNumber &u) │ │ │ │ │ + 146 { │ │ │ │ │ + 147 return str << u.value_; │ │ │ │ │ + 148 } │ │ │ │ │ + 149 │ │ │ │ │ + 150 // The trick with `template >` │ │ │ │ │ +is │ │ │ │ │ + 151 // needed because at least g++-4.9 seems to evaluates a default argument │ │ │ │ │ + 152 // in `template >` as soon as possible and │ │ │ │ │ +will │ │ │ │ │ + 153 // error out if `expr(T)` is invalid. E.g. for `expr(T)` = │ │ │ │ │ + 154 // `decltype(--std::declval())`, instantiating `AlignedNumber` │ │ │ │ │ + 155 // will result in an unrecoverable error (`--` cannot be applied to a │ │ │ │ │ + 156 // `bool`). │ │ │ │ │ + 157 │ │ │ │ │ + 158 // Increment, decrement │ │ │ │ │ + 159 template())> │ │ │ │ │ +> │ │ │ │ │ +160 AlignedNumber &operator++() { ++value_; return *this; } │ │ │ │ │ + 161 │ │ │ │ │ + 162 template())> │ │ │ │ │ +> │ │ │ │ │ +163 AlignedNumber &operator--() { --value_; return *this; } │ │ │ │ │ + 164 │ │ │ │ │ + 165 template()++)> │ │ │ │ │ +> │ │ │ │ │ +166 decltype(auto) operator++(int) { return aligned(value_++); } │ │ │ │ │ + 167 │ │ │ │ │ + 168 template()--)> │ │ │ │ │ +> │ │ │ │ │ +169 decltype(auto) operator--(int) { return aligned(value_--); } │ │ │ │ │ + 170 │ │ │ │ │ + 171 // unary operators │ │ │ │ │ + 172 template())> > │ │ │ │ │ +174 decltype(auto) operator+() const { return aligned(+value_); } │ │ │ │ │ + 175 │ │ │ │ │ + 176 template())> > │ │ │ │ │ +178 decltype(auto) operator-() const { return aligned(-value_); } │ │ │ │ │ + 179 │ │ │ │ │ + 180 /* │ │ │ │ │ + 181 * silence warnings from GCC about using `~` on a bool │ │ │ │ │ + 182 * (when instantiated for T=bool) │ │ │ │ │ + 183 */ │ │ │ │ │ + 184#if __GNUC__ >= 7 │ │ │ │ │ + 185# pragma GCC diagnostic push │ │ │ │ │ + 186# pragma GCC diagnostic ignored "-Wbool-operation" │ │ │ │ │ + 187#endif │ │ │ │ │ + 188#ifdef __clang__ │ │ │ │ │ + 189# pragma clang diagnostic push │ │ │ │ │ + 190# pragma clang diagnostic ignored "-Wbool-operation" │ │ │ │ │ + 191#endif │ │ │ │ │ + 192 template())> > │ │ │ │ │ +194 decltype(auto) operator~() const { return aligned(~value_); } │ │ │ │ │ + 195#if __GNUC__ >= 7 │ │ │ │ │ + 196# pragma GCC diagnostic pop │ │ │ │ │ + 197#endif │ │ │ │ │ + 198#ifdef __clang__ │ │ │ │ │ + 199# pragma clang diagnostic pop │ │ │ │ │ + 200#endif │ │ │ │ │ + 201 │ │ │ │ │ + 202 template())> > │ │ │ │ │ +204 decltype(auto) operator!() const { return aligned(!value_); } │ │ │ │ │ + 205 │ │ │ │ │ + 206 // assignment operators │ │ │ │ │ +207#define DUNE_ASSIGN_OP(OP) \ │ │ │ │ │ + 208 template() OP std::declval()) ) \ │ │ │ │ │ + 212 > > \ │ │ │ │ │ + 213 AlignedNumber &operator OP(const AlignedNumber &u) \ │ │ │ │ │ + 214 { \ │ │ │ │ │ + 215 value_ OP U(u); \ │ │ │ │ │ + 216 return *this; \ │ │ │ │ │ + 217 } \ │ │ │ │ │ + 218 \ │ │ │ │ │ + 219 template() OP \ │ │ │ │ │ + 221 std::declval())> > \ │ │ │ │ │ + 222 AlignedNumber &operator OP(const U &u) \ │ │ │ │ │ + 223 { \ │ │ │ │ │ + 224 value_ OP u; \ │ │ │ │ │ + 225 return *this; \ │ │ │ │ │ + 226 } \ │ │ │ │ │ + 227 \ │ │ │ │ │ + 228 static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ + 229 │ │ │ │ │ +230 DUNE_ASSIGN_OP(+=); │ │ │ │ │ +231 DUNE_ASSIGN_OP(-=); │ │ │ │ │ + 232 │ │ │ │ │ +233 DUNE_ASSIGN_OP(*=); │ │ │ │ │ + 234 DUNE_ASSIGN_OP(/=); │ │ │ │ │ + 235 DUNE_ASSIGN_OP(%=); │ │ │ │ │ + 236 │ │ │ │ │ +237 DUNE_ASSIGN_OP(^=); │ │ │ │ │ + 238 DUNE_ASSIGN_OP(&=); │ │ │ │ │ + 239 DUNE_ASSIGN_OP(|=); │ │ │ │ │ + 240 │ │ │ │ │ +241 DUNE_ASSIGN_OP(<<=); │ │ │ │ │ +242 DUNE_ASSIGN_OP(>>=); │ │ │ │ │ + 243 │ │ │ │ │ + 244#undef DUNE_ASSIGN_OP │ │ │ │ │ + 245 }; │ │ │ │ │ + 246 │ │ │ │ │ + 247 // binary operators │ │ │ │ │ +248#define DUNE_BINARY_OP(OP) \ │ │ │ │ │ + 249 template() \ │ │ │ │ │ + 251 OP std::declval())> > \ │ │ │ │ │ + 252 decltype(auto) \ │ │ │ │ │ + 253 operator OP(const AlignedNumber &t, \ │ │ │ │ │ + 254 const AlignedNumber &u) \ │ │ │ │ │ + 255 { \ │ │ │ │ │ + 256 /* can't use std::max(); not constexpr */ \ │ │ │ │ │ + 257 return aligned<(tAlign > uAlign ? tAlign : uAlign)>(T(t) OP U(u)); \ │ │ │ │ │ + 258 } \ │ │ │ │ │ + 259 \ │ │ │ │ │ + 260 template() \ │ │ │ │ │ + 262 OP std::declval())> > \ │ │ │ │ │ + 263 decltype(auto) \ │ │ │ │ │ + 264 operator OP(const T &t, const AlignedNumber &u) \ │ │ │ │ │ + 265 { \ │ │ │ │ │ + 266 return aligned(t OP U(u)); \ │ │ │ │ │ + 267 } \ │ │ │ │ │ + 268 \ │ │ │ │ │ + 269 template() \ │ │ │ │ │ + 271 OP std::declval())> > \ │ │ │ │ │ + 272 decltype(auto) \ │ │ │ │ │ + 273 operator OP(const AlignedNumber &t, const U &u) \ │ │ │ │ │ + 274 { \ │ │ │ │ │ + 275 return aligned(T(t) OP u); \ │ │ │ │ │ + 276 } \ │ │ │ │ │ + 277 \ │ │ │ │ │ + 278 static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ + 279 │ │ │ │ │ +280 DUNE_BINARY_OP(+); │ │ │ │ │ +281 DUNE_BINARY_OP(-); │ │ │ │ │ + 282 │ │ │ │ │ +283 DUNE_BINARY_OP(*); │ │ │ │ │ + 284 DUNE_BINARY_OP(/); │ │ │ │ │ + 285 DUNE_BINARY_OP(%); │ │ │ │ │ + 286 │ │ │ │ │ +287 DUNE_BINARY_OP(^); │ │ │ │ │ + 288 DUNE_BINARY_OP(&); │ │ │ │ │ + 289 DUNE_BINARY_OP(|); │ │ │ │ │ + 290 │ │ │ │ │ +291 DUNE_BINARY_OP(<<); │ │ │ │ │ +292 DUNE_BINARY_OP(>>); │ │ │ │ │ + 293 │ │ │ │ │ +294 DUNE_BINARY_OP(==); │ │ │ │ │ +295 DUNE_BINARY_OP(!=); │ │ │ │ │ + 296 DUNE_BINARY_OP(<); │ │ │ │ │ + 297 DUNE_BINARY_OP(>); │ │ │ │ │ +298 DUNE_BINARY_OP(<=); │ │ │ │ │ +299 DUNE_BINARY_OP(>=); │ │ │ │ │ + 300 │ │ │ │ │ +301 DUNE_BINARY_OP(&&); │ │ │ │ │ + 302 DUNE_BINARY_OP(||); │ │ │ │ │ + 303 │ │ │ │ │ + 304#undef DUNE_BINARY_OP │ │ │ │ │ + 305 │ │ │ │ │ + 307 // │ │ │ │ │ + 308 // Overloads for the functions provided by the standard library │ │ │ │ │ + 309 // │ │ │ │ │ + 310#define DUNE_UNARY_FUNC(name) \ │ │ │ │ │ + 311 template \ │ │ │ │ │ + 312 decltype(auto) name(const AlignedNumber &u) \ │ │ │ │ │ + 313 { \ │ │ │ │ │ + 314 using std::name; \ │ │ │ │ │ + 315 return aligned(name(T(u))); \ │ │ │ │ │ + 316 } \ │ │ │ │ │ + 317 static_assert(true, "Require semicolon to unconfuse editors") │ │ │ │ │ + 318 │ │ │ │ │ + 319 // │ │ │ │ │ + 320 // functions │ │ │ │ │ + 321 // │ │ │ │ │ + 322 │ │ │ │ │ + 323 // note: only unary functions are provided at the moment. Getting all the │ │ │ │ │ + 324 // overloads right for functions with more than one argument is tricky. │ │ │ │ │ + 325 // All functions appear in the list below in the order they are │ │ │ │ │ + 326 // listed in in the standard, but the unimplemented ones are commented │ │ │ │ │ + 327 // out. │ │ │ │ │ + 328 │ │ │ │ │ + 329 // note: abs is provided by both (for integer) and (for │ │ │ │ │ + 330 // floating point). This overload works for both. │ │ │ │ │ + 331 DUNE_UNARY_FUNC(abs); │ │ │ │ │ +332 DUNE_UNARY_FUNC(acos); │ │ │ │ │ +333 DUNE_UNARY_FUNC(acosh); │ │ │ │ │ +334 DUNE_UNARY_FUNC(asin); │ │ │ │ │ +335 DUNE_UNARY_FUNC(asinh); │ │ │ │ │ +336 DUNE_UNARY_FUNC(atan); │ │ │ │ │ + 337 // atan2 │ │ │ │ │ +338 DUNE_UNARY_FUNC(atanh); │ │ │ │ │ +339 DUNE_UNARY_FUNC(cbrt); │ │ │ │ │ +340 DUNE_UNARY_FUNC(ceil); │ │ │ │ │ + 341 // copysign │ │ │ │ │ +342 DUNE_UNARY_FUNC(cos); │ │ │ │ │ +343 DUNE_UNARY_FUNC(cosh); │ │ │ │ │ +344 DUNE_UNARY_FUNC(erf); │ │ │ │ │ +345 DUNE_UNARY_FUNC(erfc); │ │ │ │ │ +346 DUNE_UNARY_FUNC(exp); │ │ │ │ │ +347 DUNE_UNARY_FUNC(exp2); │ │ │ │ │ +348 DUNE_UNARY_FUNC(expm1); │ │ │ │ │ +349 DUNE_UNARY_FUNC(fabs); │ │ │ │ │ + 350 // fdim │ │ │ │ │ +351 DUNE_UNARY_FUNC(floor); │ │ │ │ │ + 352 // fma │ │ │ │ │ + 353 // fmax │ │ │ │ │ + 354 // fmin │ │ │ │ │ + 355 // fmod │ │ │ │ │ + 356 // frexp │ │ │ │ │ + 357 // hypos │ │ │ │ │ +358 DUNE_UNARY_FUNC(ilogb); │ │ │ │ │ + 359 // ldexp │ │ │ │ │ +360 DUNE_UNARY_FUNC(lgamma); │ │ │ │ │ +361 DUNE_UNARY_FUNC(llrint); │ │ │ │ │ +362 DUNE_UNARY_FUNC(llround); │ │ │ │ │ +363 DUNE_UNARY_FUNC(log); │ │ │ │ │ +364 DUNE_UNARY_FUNC(log10); │ │ │ │ │ +365 DUNE_UNARY_FUNC(log1p); │ │ │ │ │ +366 DUNE_UNARY_FUNC(log2); │ │ │ │ │ +367 DUNE_UNARY_FUNC(logb); │ │ │ │ │ +368 DUNE_UNARY_FUNC(lrint); │ │ │ │ │ +369 DUNE_UNARY_FUNC(lround); │ │ │ │ │ + 370 // modf │ │ │ │ │ +371 DUNE_UNARY_FUNC(nearbyint); │ │ │ │ │ + 372 // nextafter │ │ │ │ │ + 373 // nexttoward │ │ │ │ │ + 374 // pow │ │ │ │ │ + 375 // remainder │ │ │ │ │ + 376 // remquo │ │ │ │ │ +377 DUNE_UNARY_FUNC(rint); │ │ │ │ │ +378 DUNE_UNARY_FUNC(round); │ │ │ │ │ + 379 // scalbln │ │ │ │ │ + 380 // scalbn │ │ │ │ │ +381 DUNE_UNARY_FUNC(sin); │ │ │ │ │ +382 DUNE_UNARY_FUNC(sinh); │ │ │ │ │ +383 DUNE_UNARY_FUNC(sqrt); │ │ │ │ │ +384 DUNE_UNARY_FUNC(tan); │ │ │ │ │ +385 DUNE_UNARY_FUNC(tanh); │ │ │ │ │ +386 DUNE_UNARY_FUNC(tgamma); │ │ │ │ │ +387 DUNE_UNARY_FUNC(trunc); │ │ │ │ │ + 388 │ │ │ │ │ +389 DUNE_UNARY_FUNC(isfinite); │ │ │ │ │ +390 DUNE_UNARY_FUNC(isinf); │ │ │ │ │ +391 DUNE_UNARY_FUNC(isnan); │ │ │ │ │ +392 DUNE_UNARY_FUNC(isnormal); │ │ │ │ │ +393 DUNE_UNARY_FUNC(signbit); │ │ │ │ │ + 394 │ │ │ │ │ + 395 // isgreater │ │ │ │ │ + 396 // isgreaterequal │ │ │ │ │ + 397 // isless │ │ │ │ │ + 398 // islessequal │ │ │ │ │ + 399 // islessgreater │ │ │ │ │ + 400 // isunordered │ │ │ │ │ + 401 │ │ │ │ │ + 402 // │ │ │ │ │ + 403 // functions │ │ │ │ │ + 404 // │ │ │ │ │ + 405 │ │ │ │ │ + 406 // not all functions are implemented, and unlike for , no │ │ │ │ │ + 407 // comprehensive list is provided │ │ │ │ │ +408 DUNE_UNARY_FUNC(real); │ │ │ │ │ + 409 │ │ │ │ │ + 410#undef DUNE_UNARY_FUNC │ │ │ │ │ + 411 │ │ │ │ │ + 412 // We need to overload min() and max() since they require types to be │ │ │ │ │ + 413 // LessThanComparable, which requires `a in the standard (still open │ │ │ │ │ + 417 // as of 2018-07-06), which strives to require both "implicitly" and │ │ │ │ │ + 418 // "contextually" convertible -- plus a few other things. │ │ │ │ │ + 419 // │ │ │ │ │ + 420 // We do not want our debug type to automatically decay to the underlying │ │ │ │ │ + 421 // type, so we do not want to make the conversion non-explicit. So the │ │ │ │ │ + 422 // only option left is to overload min() and max(). │ │ │ │ │ + 423 │ │ │ │ │ + 424 template │ │ │ │ │ +425 auto max(const AlignedNumber &a, │ │ │ │ │ + 426 const AlignedNumber &b) │ │ │ │ │ + 427 { │ │ │ │ │ + 428 using std::max; │ │ │ │ │ + 429 return aligned(max(T(a), T(b))); │ │ │ │ │ + 430 } │ │ │ │ │ + 431 │ │ │ │ │ + 432 template │ │ │ │ │ +433 auto max(const T &a, const AlignedNumber &b) │ │ │ │ │ + 434 { │ │ │ │ │ + 435 using std::max; │ │ │ │ │ + 436 return aligned(max(a, T(b))); │ │ │ │ │ + 437 } │ │ │ │ │ + 438 │ │ │ │ │ + 439 template │ │ │ │ │ +440 auto max(const AlignedNumber &a, const T &b) │ │ │ │ │ + 441 { │ │ │ │ │ + 442 using std::max; │ │ │ │ │ + 443 return aligned(max(T(a), b)); │ │ │ │ │ + 444 } │ │ │ │ │ + 445 │ │ │ │ │ + 446 template │ │ │ │ │ +447 auto min(const AlignedNumber &a, │ │ │ │ │ + 448 const AlignedNumber &b) │ │ │ │ │ + 449 { │ │ │ │ │ + 450 using std::min; │ │ │ │ │ + 451 return aligned(min(T(a), T(b))); │ │ │ │ │ + 452 } │ │ │ │ │ + 453 │ │ │ │ │ + 454 template │ │ │ │ │ +455 auto min(const T &a, const AlignedNumber &b) │ │ │ │ │ + 456 { │ │ │ │ │ + 457 using std::min; │ │ │ │ │ + 458 return aligned(min(a, T(b))); │ │ │ │ │ + 459 } │ │ │ │ │ + 460 │ │ │ │ │ + 461 template │ │ │ │ │ +462 auto min(const AlignedNumber &a, const T &b) │ │ │ │ │ + 463 { │ │ │ │ │ + 464 using std::min; │ │ │ │ │ + 465 return aligned(min(T(a), b)); │ │ │ │ │ + 466 } │ │ │ │ │ + 467 │ │ │ │ │ + 468 } // namespace AlignedNumberImpl │ │ │ │ │ + 469 │ │ │ │ │ + 470 // SIMD-like functions from "conditional.hh" │ │ │ │ │ + 471 template │ │ │ │ │ + 472 AlignedNumber │ │ │ │ │ +473 cond(const AlignedNumber &b, │ │ │ │ │ + 474 const AlignedNumber &v1, const AlignedNumber &v2) │ │ │ │ │ + 475 { │ │ │ │ │ + 476 return b ? v1 : v2; │ │ │ │ │ + 477 } │ │ │ │ │ + 478 │ │ │ │ │ + 479 // SIMD-like functions from "rangeutilities.hh" │ │ │ │ │ + 480 template │ │ │ │ │ +481 T max_value(const AlignedNumber& val) │ │ │ │ │ + 482 { │ │ │ │ │ + 483 return T(val); │ │ │ │ │ + 484 } │ │ │ │ │ + 485 │ │ │ │ │ + 486 template │ │ │ │ │ +487 T min_value(const AlignedNumber& val) │ │ │ │ │ + 488 { │ │ │ │ │ + 489 return T(val); │ │ │ │ │ + 490 } │ │ │ │ │ + 491 │ │ │ │ │ + 492 template │ │ │ │ │ +493 bool any_true(const AlignedNumber& val) │ │ │ │ │ + 494 { │ │ │ │ │ + 495 return bool(val); │ │ │ │ │ + 496 } │ │ │ │ │ + 497 │ │ │ │ │ + 498 template │ │ │ │ │ +499 bool all_true(const AlignedNumber& val) │ │ │ │ │ + 500 { │ │ │ │ │ + 501 return bool(val); │ │ │ │ │ + 502 } │ │ │ │ │ + 503 │ │ │ │ │ + 504 // SIMD-like functionality from "simd/interface.hh" │ │ │ │ │ +505 namespace Simd { │ │ │ │ │ +506 namespace Overloads { │ │ │ │ │ + 507 │ │ │ │ │ + 508 template │ │ │ │ │ +509 struct ScalarType > { using type = T; }; │ │ │ │ │ + 510 │ │ │ │ │ + 511 template │ │ │ │ │ +512 struct RebindType > { │ │ │ │ │ +513 using type = AlignedNumber; │ │ │ │ │ + 514 }; │ │ │ │ │ + 515 │ │ │ │ │ + 516 template │ │ │ │ │ +517 struct LaneCount > : index_constant<1> {}; │ │ │ │ │ + 518 │ │ │ │ │ + 519 template │ │ │ │ │ +520 T& lane(ADLTag<5>, std::size_t l, AlignedNumber &v) │ │ │ │ │ + 521 { │ │ │ │ │ + 522 assert(l == 0); │ │ │ │ │ + 523 return v.value(); │ │ │ │ │ + 524 } │ │ │ │ │ + 525 │ │ │ │ │ + 526 template │ │ │ │ │ +527 T lane(ADLTag<5>, std::size_t l, const AlignedNumber &v) │ │ │ │ │ + 528 { │ │ │ │ │ + 529 assert(l == 0); │ │ │ │ │ + 530 return v.value(); │ │ │ │ │ + 531 } │ │ │ │ │ + 532 │ │ │ │ │ + 533 template │ │ │ │ │ + 534 const AlignedNumber & │ │ │ │ │ +535 cond(ADLTag<5>, AlignedNumber mask, │ │ │ │ │ + 536 const AlignedNumber &ifTrue, │ │ │ │ │ + 537 const AlignedNumber &ifFalse) │ │ │ │ │ + 538 { │ │ │ │ │ + 539 return mask ? ifTrue : ifFalse; │ │ │ │ │ + 540 } │ │ │ │ │ + 541 │ │ │ │ │ + 542 template │ │ │ │ │ +543 bool anyTrue(ADLTag<5>, const AlignedNumber &mask) │ │ │ │ │ + 544 { │ │ │ │ │ + 545 return bool(mask); │ │ │ │ │ + 546 } │ │ │ │ │ + 547 │ │ │ │ │ + 548 } // namespace Overloads │ │ │ │ │ + 549 │ │ │ │ │ + 550 } // namespace Simd │ │ │ │ │ + 551 │ │ │ │ │ + 552} // namespace Dune │ │ │ │ │ + 553 │ │ │ │ │ + 554#endif // DUNE_DEBUGALIGN_HH │ │ │ │ │ +classname.hh │ │ │ │ │ +A free function to provide the demangled class name of a given object or type │ │ │ │ │ +as a string. │ │ │ │ │ +defaults.hh │ │ │ │ │ +Default implementations for SIMD Implementations. │ │ │ │ │ +base.hh │ │ │ │ │ +Basic definitions for SIMD Implementations. │ │ │ │ │ +typetraits.hh │ │ │ │ │ +Traits for type conversions and type information. │ │ │ │ │ +DUNE_BINARY_OP │ │ │ │ │ +#define DUNE_BINARY_OP(OP) │ │ │ │ │ +Definition: debugalign.hh:248 │ │ │ │ │ +DUNE_UNARY_FUNC │ │ │ │ │ +#define DUNE_UNARY_FUNC(name) │ │ │ │ │ +DUNE_ASSIGN_OP │ │ │ │ │ +#define DUNE_ASSIGN_OP(OP) │ │ │ │ │ +Definition: debugalign.hh:207 │ │ │ │ │ +indices.hh │ │ │ │ │ +Dune::index_constant │ │ │ │ │ +std::integral_constant< std::size_t, i > index_constant │ │ │ │ │ +An index constant with value i. │ │ │ │ │ +Definition: indices.hh:30 │ │ │ │ │ +Dune::void_t │ │ │ │ │ +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 │ │ │ │ │ +Dune::operator<< │ │ │ │ │ +std::ostream & operator<<(std::ostream &s, const bigunsignedint< k > &x) │ │ │ │ │ +Definition: bigunsignedint.hh:278 │ │ │ │ │ +Dune::FloatCmp::round │ │ │ │ │ +I round(const T &val, typename EpsilonType< T >::Type epsilon) │ │ │ │ │ +round using epsilon │ │ │ │ │ +Definition: float_cmp.cc:311 │ │ │ │ │ +Dune::FloatCmp::trunc │ │ │ │ │ +I trunc(const T &val, typename EpsilonType< T >::Type epsilon) │ │ │ │ │ +truncate using epsilon │ │ │ │ │ +Definition: float_cmp.cc:407 │ │ │ │ │ +Dune::Simd::Overloads::mask │ │ │ │ │ +Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v) │ │ │ │ │ +implements Simd::mask() │ │ │ │ │ +Definition: defaults.hh:153 │ │ │ │ │ +std │ │ │ │ │ +STL namespace. │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::PriorityTag │ │ │ │ │ -Helper class for tagging priorities. │ │ │ │ │ -Definition: typeutilities.hh:73 │ │ │ │ │ -Dune::PriorityTag::value │ │ │ │ │ -static constexpr std::size_t value │ │ │ │ │ -Definition: typeutilities.hh:74 │ │ │ │ │ +Dune::violatedAlignment │ │ │ │ │ +void violatedAlignment(const char *className, std::size_t expectedAlignment, │ │ │ │ │ +const void *address) │ │ │ │ │ +called when an alignment violation is detected │ │ │ │ │ +Definition: debugalign.cc:39 │ │ │ │ │ +Dune::any_true │ │ │ │ │ +bool any_true(const AlignedNumber< bool, align > &val) │ │ │ │ │ +Definition: debugalign.hh:493 │ │ │ │ │ +Dune::all_true │ │ │ │ │ +bool all_true(const AlignedNumber< bool, align > &val) │ │ │ │ │ +Definition: debugalign.hh:499 │ │ │ │ │ +Dune::className │ │ │ │ │ +std::string className() │ │ │ │ │ +Provide the demangled class name of a type T as a string. │ │ │ │ │ +Definition: classname.hh:47 │ │ │ │ │ +Dune::debugAlignment │ │ │ │ │ +static constexpr auto debugAlignment │ │ │ │ │ +an alignment large enough to trigger alignment errors │ │ │ │ │ +Definition: debugalign.hh:84 │ │ │ │ │ +Dune::lane │ │ │ │ │ +T lane(std::size_t l, const T &v) │ │ │ │ │ +access a lane of a simd vector (scalar version) │ │ │ │ │ +Definition: simd.hh:366 │ │ │ │ │ +Dune::cond │ │ │ │ │ +const T1 cond(bool b, const T1 &v1, const T2 &v2) │ │ │ │ │ +conditional evaluate │ │ │ │ │ +Definition: conditional.hh:28 │ │ │ │ │ +Dune::aligned │ │ │ │ │ +AlignedNumber< T, align > aligned(T value) │ │ │ │ │ +align a value to a certain alignment │ │ │ │ │ +Definition: debugalign.hh:101 │ │ │ │ │ +Dune::violatedAlignmentHandler │ │ │ │ │ +ViolatedAlignmentHandler & violatedAlignmentHandler() │ │ │ │ │ +access the handler called by violatedAlignment() │ │ │ │ │ +Definition: debugalign.cc:33 │ │ │ │ │ +Dune::isAligned │ │ │ │ │ +bool isAligned(const void *p, std::size_t align) │ │ │ │ │ +check whether an address conforms to the given alignment │ │ │ │ │ +Definition: debugalign.hh:56 │ │ │ │ │ +Dune::max_value │ │ │ │ │ +T max_value(const AlignedNumber< T, align > &val) │ │ │ │ │ +Definition: debugalign.hh:481 │ │ │ │ │ +Dune::ViolatedAlignmentHandler │ │ │ │ │ +std::function< void(const char *, std::size_t, const void *)> │ │ │ │ │ +ViolatedAlignmentHandler │ │ │ │ │ +type of the handler called by violatedAlignment() │ │ │ │ │ +Definition: debugalign.hh:31 │ │ │ │ │ +Dune::min_value │ │ │ │ │ +T min_value(const AlignedNumber< T, align > &val) │ │ │ │ │ +Definition: debugalign.hh:487 │ │ │ │ │ +Dune::AlignedNumberImpl::max │ │ │ │ │ +auto max(const AlignedNumber< T, align > &a, const T &b) │ │ │ │ │ +Definition: debugalign.hh:440 │ │ │ │ │ +Dune::AlignedNumberImpl::min │ │ │ │ │ +auto min(const AlignedNumber< T, align > &a, const T &b) │ │ │ │ │ +Definition: debugalign.hh:462 │ │ │ │ │ +Dune::Simd::Overloads::anyTrue │ │ │ │ │ +bool anyTrue(ADLTag< 5 >, const AlignedNumber< bool, align > &mask) │ │ │ │ │ +Definition: debugalign.hh:543 │ │ │ │ │ +Dune::IsNumber │ │ │ │ │ +Whether this type acts as a scalar in the context of (hierarchically blocked) │ │ │ │ │ +containers. │ │ │ │ │ +Definition: typetraits.hh:194 │ │ │ │ │ +Dune::AlignedBase │ │ │ │ │ +CRTP base mixin class to check alignment. │ │ │ │ │ +Definition: debugalign.hh:66 │ │ │ │ │ +Dune::AlignedBase::~AlignedBase │ │ │ │ │ +~AlignedBase() │ │ │ │ │ +Definition: debugalign.hh:77 │ │ │ │ │ +Dune::AlignedBase::operator= │ │ │ │ │ +AlignedBase & operator=(AlignedBase &&)=default │ │ │ │ │ +Dune::AlignedBase::AlignedBase │ │ │ │ │ +AlignedBase(AlignedBase &&) │ │ │ │ │ +Definition: debugalign.hh:76 │ │ │ │ │ +Dune::AlignedBase::operator= │ │ │ │ │ +AlignedBase & operator=(const AlignedBase &)=default │ │ │ │ │ +Dune::AlignedBase::AlignedBase │ │ │ │ │ +AlignedBase(const AlignedBase &) │ │ │ │ │ +Definition: debugalign.hh:75 │ │ │ │ │ +Dune::AlignedBase::AlignedBase │ │ │ │ │ +AlignedBase() │ │ │ │ │ +Definition: debugalign.hh:74 │ │ │ │ │ +Dune::AlignedNumberImpl::AlignedNumber │ │ │ │ │ +aligned wrappers for arithmetic types │ │ │ │ │ +Definition: debugalign.hh:115 │ │ │ │ │ +Dune::AlignedNumberImpl::AlignedNumber::DUNE_ASSIGN_OP │ │ │ │ │ +DUNE_ASSIGN_OP(<<=) │ │ │ │ │ +Dune::AlignedNumberImpl::AlignedNumber::DUNE_ASSIGN_OP │ │ │ │ │ +DUNE_ASSIGN_OP(-=) │ │ │ │ │ +Dune::AlignedNumberImpl::AlignedNumber::operator+ │ │ │ │ │ +decltype(auto) operator+() const │ │ │ │ │ +Definition: debugalign.hh:174 │ │ │ │ │ +Dune::AlignedNumberImpl::AlignedNumber::DUNE_ASSIGN_OP │ │ │ │ │ +DUNE_ASSIGN_OP(+=) │ │ │ │ │ +Dune::AlignedNumberImpl::AlignedNumber::operator-- │ │ │ │ │ +decltype(auto) operator--(int) │ │ │ │ │ +Definition: debugalign.hh:169 │ │ │ │ │ +Dune::AlignedNumberImpl::AlignedNumber::DUNE_ASSIGN_OP │ │ │ │ │ +DUNE_ASSIGN_OP * DUNE_ASSIGN_OP(/=);DUNE_ASSIGN_OP(%= │ │ │ │ │ +Dune::AlignedNumberImpl::AlignedNumber::operator++ │ │ │ │ │ +decltype(auto) operator++(int) │ │ │ │ │ +Definition: debugalign.hh:166 │ │ │ │ │ +Dune::AlignedNumberImpl::AlignedNumber::operator! │ │ │ │ │ +decltype(auto) operator!() const │ │ │ │ │ +Definition: debugalign.hh:204 │ │ │ │ │ +Dune::AlignedNumberImpl::AlignedNumber::value │ │ │ │ │ +T & value() │ │ │ │ │ +Definition: debugalign.hh:132 │ │ │ │ │ +Dune::AlignedNumberImpl::AlignedNumber::value │ │ │ │ │ +const T & value() const │ │ │ │ │ +Definition: debugalign.hh:131 │ │ │ │ │ +Dune::AlignedNumberImpl::AlignedNumber::DUNE_ASSIGN_OP │ │ │ │ │ +DUNE_ASSIGN_OP^ DUNE_ASSIGN_OP(&=);DUNE_ASSIGN_OP(|= │ │ │ │ │ +Dune::AlignedNumberImpl::AlignedNumber::operator>> │ │ │ │ │ +friend std::basic_istream< charT, Traits > & operator>>(std::basic_istream< │ │ │ │ │ +charT, Traits > &str, AlignedNumber &u) │ │ │ │ │ +Definition: debugalign.hh:137 │ │ │ │ │ +Dune::AlignedNumberImpl::AlignedNumber::DUNE_ASSIGN_OP │ │ │ │ │ +DUNE_ASSIGN_OP(> >=) │ │ │ │ │ +Dune::AlignedNumberImpl::AlignedNumber::AlignedNumber │ │ │ │ │ +AlignedNumber()=default │ │ │ │ │ +Dune::AlignedNumberImpl::AlignedNumber::operator~ │ │ │ │ │ +decltype(auto) operator~() const │ │ │ │ │ +Definition: debugalign.hh:194 │ │ │ │ │ +Dune::AlignedNumberImpl::AlignedNumber::AlignedNumber │ │ │ │ │ +AlignedNumber(T value) │ │ │ │ │ +Definition: debugalign.hh:120 │ │ │ │ │ +Dune::AlignedNumberImpl::AlignedNumber::AlignedNumber │ │ │ │ │ +AlignedNumber(const AlignedNumber< U, uAlign > &o) │ │ │ │ │ +Definition: debugalign.hh:124 │ │ │ │ │ +Dune::AlignedNumberImpl::AlignedNumber::operator- │ │ │ │ │ +decltype(auto) operator-() const │ │ │ │ │ +Definition: debugalign.hh:178 │ │ │ │ │ +Dune::Simd::Overloads::ScalarType<_AlignedNumber<_T,_align_>_>::type │ │ │ │ │ +T type │ │ │ │ │ +Definition: debugalign.hh:509 │ │ │ │ │ +Dune::Simd::Overloads::ADLTag │ │ │ │ │ +Tag used to force late-binding lookup in Dune::Simd::Overloads. │ │ │ │ │ +Definition: base.hh:182 │ │ │ │ │ +Dune::Simd::Overloads::ScalarType │ │ │ │ │ +should have a member type type │ │ │ │ │ +Definition: standard.hh:60 │ │ │ │ │ +Dune::Simd::Overloads::RebindType │ │ │ │ │ +should have a member type type │ │ │ │ │ +Definition: standard.hh:67 │ │ │ │ │ +Dune::Simd::Overloads::LaneCount │ │ │ │ │ +should be derived from a Dune::index_constant │ │ │ │ │ +Definition: standard.hh:74 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00209.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: propertymap.hh File Reference │ │ │ │ +dune-common: proxymemberaccess.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,79 +63,42 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
propertymap.hh File Reference
│ │ │ │ +
proxymemberaccess.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ -
#include <cstddef>
│ │ │ │ -#include <iterator>
│ │ │ │ -#include <type_traits>
│ │ │ │ + │ │ │ │ +

infrastructure for supporting operator->() on both references and proxies │ │ │ │ +More...

│ │ │ │ +
#include <type_traits>
│ │ │ │ +#include <utility>
│ │ │ │
│ │ │ │

Go to the source code of this file.

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

│ │ │ │ -Classes

struct  Dune::PropertyMapTraits< PM >
 
struct  Dune::ReadablePropertyMapTag
 Tag for the category of readable property maps. More...
 
struct  Dune::WritablePropertyMapTag
 Tag for the category of writable property maps. More...
 
struct  Dune::ReadWritePropertyMapTag
 Tag for the category of readable and writable property maps. More...
 
struct  Dune::LvaluePropertyMapTag
 Tag for the category of lvalue property maps. More...
 
struct  Dune::PropertyMapTraits< T * >
 
struct  Dune::PropertyMapTraits< const T * >
 
struct  Dune::RAPropertyMapHelper< Reference, PropertyMap >
 
class  Dune::IteratorPropertyMap< RAI, IM, T, R >
 Adapter to turn a random access iterator into a property map. More...
 
class  Dune::AssociativePropertyMap< T >
 An adapter to turn an unique associative container into a property map. More...
 
class  Dune::ConstAssociativePropertyMap< T >
 An adaptor to turn an unique associative container into a property map. More...
 
struct  Dune::IdentityMap
 A property map that applies the identity function to integers. More...
 
struct  Dune::PropertyMapTypeSelector< T, C >
 Selector for the property map type. More...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ Namespaces

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

│ │ │ │ Functions

template<class Reference , class PropertyMap , class Key >
Reference Dune::get (const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const Key &key)
 
template<class Reference , class PropertyMap , class Key , class Value >
void Dune::put (const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const Key &key, const Value &value)
 
template<typename T >
pointer_or_proxy_holder Dune::handle_proxy_member_access (T &&t)
 Transparent support for providing member access to both lvalues and rvalues (temporary proxies). More...
 
│ │ │ │ -
│ │ │ │ +

Detailed Description

│ │ │ │ +

infrastructure for supporting operator->() on both references and proxies

│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,67 +4,30 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Classes | Namespaces | Functions │ │ │ │ │ -propertymap.hh File Reference │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Namespaces | Functions │ │ │ │ │ +proxymemberaccess.hh File Reference │ │ │ │ │ +Common » Utilities » C++_utilities_and_backports │ │ │ │ │ +infrastructure for supporting operator->() on both references and proxies │ │ │ │ │ +More... │ │ │ │ │ #include │ │ │ │ │ +#include │ │ │ │ │ Go_to_the_source_code_of_this_file. │ │ │ │ │ - Classes │ │ │ │ │ -struct  Dune::PropertyMapTraits<_PM_> │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::ReadablePropertyMapTag │ │ │ │ │ -  Tag for the category of readable property maps. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::WritablePropertyMapTag │ │ │ │ │ -  Tag for the category of writable property maps. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::ReadWritePropertyMapTag │ │ │ │ │ -  Tag for the category of readable and writable property maps. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::LvaluePropertyMapTag │ │ │ │ │ -  Tag for the category of lvalue property maps. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::PropertyMapTraits<_T_*_> │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::PropertyMapTraits<_const_T_*_> │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::RAPropertyMapHelper<_Reference,_PropertyMap_> │ │ │ │ │ -  │ │ │ │ │ - class  Dune::IteratorPropertyMap<_RAI,_IM,_T,_R_> │ │ │ │ │ -  Adapter to turn a random access iterator into a property map. More... │ │ │ │ │ -  │ │ │ │ │ - class  Dune::AssociativePropertyMap<_T_> │ │ │ │ │ -  An adapter to turn an unique associative container into a property │ │ │ │ │ - map. More... │ │ │ │ │ -  │ │ │ │ │ - class  Dune::ConstAssociativePropertyMap<_T_> │ │ │ │ │ -  An adaptor to turn an unique associative container into a property │ │ │ │ │ - map. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::IdentityMap │ │ │ │ │ -  A property map that applies the identity function to integers. More... │ │ │ │ │ -  │ │ │ │ │ -struct  Dune::PropertyMapTypeSelector<_T,_C_> │ │ │ │ │ -  Selector for the property map type. More... │ │ │ │ │ -  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ -Reference Dune::get (const RAPropertyMapHelper< Reference, PropertyMap > │ │ │ │ │ - &pmap, const Key &key) │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - void Dune::put (const RAPropertyMapHelper< Reference, PropertyMap > │ │ │ │ │ - &pmap, const Key &key, const Value &value) │ │ │ │ │ +template │ │ │ │ │ +pointer_or_proxy_holder Dune::handle_proxy_member_access (T &&t) │ │ │ │ │ +  Transparent support for providing member access to │ │ │ │ │ + both lvalues and rvalues (temporary proxies). More... │ │ │ │ │   │ │ │ │ │ +***** Detailed Description ***** │ │ │ │ │ +infrastructure for supporting operator->() on both references and proxies │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00209_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: propertymap.hh Source File │ │ │ │ +dune-common: proxymemberaccess.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,269 +62,107 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
propertymap.hh
│ │ │ │ +
proxymemberaccess.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 (C) 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_PROPERTYMAP_HH
│ │ │ │ -
6#define DUNE_PROPERTYMAP_HH
│ │ │ │ +
5#ifndef DUNE_COMMON_PROXYMEMBERACCESS_HH
│ │ │ │ +
6#define DUNE_COMMON_PROXYMEMBERACCESS_HH
│ │ │ │
7
│ │ │ │ -
8#include <cstddef>
│ │ │ │ -
9#include <iterator>
│ │ │ │ -
10#include <type_traits>
│ │ │ │ -
11
│ │ │ │ -
12namespace Dune
│ │ │ │ -
13{
│ │ │ │ -
14
│ │ │ │ -
15 template<class PM>
│ │ │ │ - │ │ │ │ -
17 {
│ │ │ │ -
21 typedef typename PM::KeyType KeyType;
│ │ │ │ -
25 typedef typename PM::ValueType ValueType;
│ │ │ │ -
29 typedef typename PM::Reference Reference;
│ │ │ │ -
33 typedef typename PM::Category Category;
│ │ │ │ -
34 };
│ │ │ │ -
35
│ │ │ │ - │ │ │ │ -
38 {};
│ │ │ │ -
39
│ │ │ │ - │ │ │ │ -
42 {};
│ │ │ │ -
43
│ │ │ │ - │ │ │ │ - │ │ │ │ -
50 {};
│ │ │ │ -
51
│ │ │ │ - │ │ │ │ - │ │ │ │ -
57 {};
│ │ │ │ -
58
│ │ │ │ -
59 template<class T>
│ │ │ │ - │ │ │ │ -
61 {
│ │ │ │ -
62 typedef T ValueType;
│ │ │ │ - │ │ │ │ -
64 typedef std::ptrdiff_t KeyType;
│ │ │ │ - │ │ │ │ -
66 };
│ │ │ │ -
67
│ │ │ │ -
68
│ │ │ │ -
69 template<class T>
│ │ │ │ -
70 struct PropertyMapTraits<const T*>
│ │ │ │ -
71 {
│ │ │ │ -
72 typedef T ValueType;
│ │ │ │ -
73 typedef const ValueType& Reference;
│ │ │ │ -
74 typedef std::ptrdiff_t KeyType;
│ │ │ │ - │ │ │ │ -
76 };
│ │ │ │ -
77
│ │ │ │ -
78 template<class Reference, class PropertyMap>
│ │ │ │ - │ │ │ │ -
80 {};
│ │ │ │ -
81
│ │ │ │ -
82 template<class Reference, class PropertyMap, class Key>
│ │ │ │ -
83 inline Reference
│ │ │ │ - │ │ │ │ -
85 const Key& key)
│ │ │ │ -
86 {
│ │ │ │ -
87 return static_cast<const PropertyMap&>(pmap)[key];
│ │ │ │ -
88 }
│ │ │ │ -
89
│ │ │ │ -
90 template<class Reference, class PropertyMap, class Key, class Value>
│ │ │ │ -
91 inline void
│ │ │ │ - │ │ │ │ -
93 const Key& key, const Value& value)
│ │ │ │ -
94 {
│ │ │ │ -
95 static_assert(std::is_convertible<typename PropertyMap::Category,WritablePropertyMapTag>::value,
│ │ │ │ -
96 "WritablePropertyMapTag required!");
│ │ │ │ -
97 static_cast<const PropertyMap&>(pmap)[key] = value;
│ │ │ │ -
98 }
│ │ │ │ -
99
│ │ │ │ -
103 template<class RAI, class IM,
│ │ │ │ -
104 class T = typename std::iterator_traits<RAI>::value_type,
│ │ │ │ -
105 class R = typename std::iterator_traits<RAI>::reference>
│ │ │ │ - │ │ │ │ -
107 : public RAPropertyMapHelper<R,IteratorPropertyMap<RAI,IM,T,R> >
│ │ │ │ -
108 {
│ │ │ │ -
109 public:
│ │ │ │ - │ │ │ │ -
114
│ │ │ │ -
120 typedef IM IndexMap;
│ │ │ │ -
121
│ │ │ │ -
125 typedef typename IndexMap::KeyType KeyType;
│ │ │ │ -
126
│ │ │ │ -
130 typedef T ValueType;
│ │ │ │ -
131
│ │ │ │ -
135 typedef R Reference;
│ │ │ │ -
136
│ │ │ │ - │ │ │ │ -
141
│ │ │ │ - │ │ │ │ -
150 const IndexMap& im=IndexMap())
│ │ │ │ -
151 : iter_(iter), indexMap_(im)
│ │ │ │ -
152 {}
│ │ │ │ -
153
│ │ │ │ - │ │ │ │ -
156 : iter_(), indexMap_()
│ │ │ │ -
157 {}
│ │ │ │ -
158
│ │ │ │ -
160 inline Reference operator[](KeyType key) const
│ │ │ │ -
161 {
│ │ │ │ -
162 return *(iter_ + get(indexMap_, key));
│ │ │ │ -
163 }
│ │ │ │ -
164
│ │ │ │ -
165 private:
│ │ │ │ - │ │ │ │ -
169 IndexMap indexMap_;
│ │ │ │ -
170 };
│ │ │ │ -
171
│ │ │ │ -
176 template<typename T>
│ │ │ │ - │ │ │ │ -
178 : RAPropertyMapHelper<typename T::value_type::second_type&,
│ │ │ │ -
179 AssociativePropertyMap<T> >
│ │ │ │ -
180 {
│ │ │ │ -
184 typedef T UniqueAssociativeContainer;
│ │ │ │ -
185
│ │ │ │ -
189 typedef typename UniqueAssociativeContainer::value_type::first_type
│ │ │ │ -
190 KeyType;
│ │ │ │ -
191
│ │ │ │ -
195 typedef typename UniqueAssociativeContainer::value_type::second_type
│ │ │ │ -
196 ValueType;
│ │ │ │ -
197
│ │ │ │ -
201 typedef ValueType& Reference;
│ │ │ │ -
202
│ │ │ │ - │ │ │ │ -
207
│ │ │ │ - │ │ │ │ -
210 : map_(0)
│ │ │ │ -
211 {}
│ │ │ │ -
212
│ │ │ │ -
214 inline AssociativePropertyMap(UniqueAssociativeContainer& map)
│ │ │ │ -
215 : map_(&map)
│ │ │ │ -
216 {}
│ │ │ │ -
217
│ │ │ │ -
222 inline Reference operator[](KeyType key) const
│ │ │ │ -
223 {
│ │ │ │ -
224 return map_->find(key)->second;
│ │ │ │ -
225 }
│ │ │ │ -
226 private:
│ │ │ │ -
227 UniqueAssociativeContainer* map_;
│ │ │ │ -
228 };
│ │ │ │ -
229
│ │ │ │ -
234 template<typename T>
│ │ │ │ - │ │ │ │ -
236 : RAPropertyMapHelper<const typename T::value_type::second_type&,
│ │ │ │ -
237 ConstAssociativePropertyMap<T> >
│ │ │ │ -
238 {
│ │ │ │ -
242 typedef T UniqueAssociativeContainer;
│ │ │ │ -
243
│ │ │ │ -
247 typedef typename UniqueAssociativeContainer::value_type::first_type
│ │ │ │ -
248 KeyType;
│ │ │ │ -
249
│ │ │ │ -
253 typedef typename UniqueAssociativeContainer::value_type::second_type
│ │ │ │ -
254 ValueType;
│ │ │ │ -
255
│ │ │ │ -
259 typedef const ValueType& Reference;
│ │ │ │ -
260
│ │ │ │ - │ │ │ │ -
265
│ │ │ │ - │ │ │ │ -
268 : map_(0)
│ │ │ │ -
269 {}
│ │ │ │ -
270
│ │ │ │ -
272 inline ConstAssociativePropertyMap(const UniqueAssociativeContainer& map)
│ │ │ │ -
273 : map_(&map)
│ │ │ │ -
274 {}
│ │ │ │ -
275
│ │ │ │ -
280 inline Reference operator[](KeyType key) const
│ │ │ │ -
281 {
│ │ │ │ -
282 return map_->find(key)->second;
│ │ │ │ -
283 }
│ │ │ │ -
284 private:
│ │ │ │ -
285 const UniqueAssociativeContainer* map_;
│ │ │ │ -
286 };
│ │ │ │ -
287
│ │ │ │ - │ │ │ │ -
292 : public RAPropertyMapHelper<std::size_t, IdentityMap>
│ │ │ │ -
293 {
│ │ │ │ -
295 typedef std::size_t KeyType;
│ │ │ │ -
296
│ │ │ │ -
298 typedef std::size_t ValueType;
│ │ │ │ -
299
│ │ │ │ -
301 typedef std::size_t Reference;
│ │ │ │ -
302
│ │ │ │ - │ │ │ │ -
305
│ │ │ │ -
306 inline ValueType operator[](const KeyType& key) const
│ │ │ │ -
307 {
│ │ │ │ -
308 return key;
│ │ │ │ -
309 }
│ │ │ │ -
310 };
│ │ │ │ -
311
│ │ │ │ -
312
│ │ │ │ -
318 template<typename T, typename C>
│ │ │ │ - │ │ │ │ -
320 {
│ │ │ │ -
324 typedef T Tag;
│ │ │ │ -
329 typedef C Container;
│ │ │ │ -
330 };
│ │ │ │ -
331
│ │ │ │ -
332}
│ │ │ │ -
333
│ │ │ │ -
334#endif
│ │ │ │ +
14#include <type_traits>
│ │ │ │ +
15#include <utility>
│ │ │ │ +
16
│ │ │ │ +
17namespace Dune {
│ │ │ │ +
18
│ │ │ │ +
19 namespace Impl {
│ │ │ │ +
20
│ │ │ │ +
21 // helper struct to store a temporary / proxy
│ │ │ │ +
22 // for the duration of the member access
│ │ │ │ +
23 template<typename T>
│ │ │ │ +
24 struct member_access_proxy_holder
│ │ │ │ +
25 {
│ │ │ │ +
26
│ │ │ │ +
27 // only support moving the temporary into the holder object
│ │ │ │ +
28 member_access_proxy_holder(T&& t)
│ │ │ │ +
29 : _t(std::move(t))
│ │ │ │ +
30 {}
│ │ │ │ +
31
│ │ │ │ +
32 // The object is fundamentally a temporary, i.e. an rvalue,
│ │ │ │ +
33 //
│ │ │ │ +
34 const T* operator->() const
│ │ │ │ +
35 {
│ │ │ │ +
36 return &_t;
│ │ │ │ +
37 }
│ │ │ │ +
38
│ │ │ │ +
39 T _t;
│ │ │ │ +
40
│ │ │ │ +
41 };
│ │ │ │ +
42
│ │ │ │ +
43 } // end Impl namespace
│ │ │ │ +
44
│ │ │ │ +
45
│ │ │ │ +
46#ifdef DOXYGEN
│ │ │ │ +
47
│ │ │ │ +
49
│ │ │ │ +
79 template<typename T>
│ │ │ │ +
80 pointer_or_proxy_holder
│ │ │ │ + │ │ │ │ +
82
│ │ │ │ +
83#else // DOXYGEN
│ │ │ │ +
84
│ │ │ │ +
85
│ │ │ │ +
86 // This version matches lvalues (the C++ type deduction rules state that
│ │ │ │ +
87 // the T&& signature deduces to a reference iff the argument is an lvalue).
│ │ │ │ +
88 // As the argument is an lvalue, we do not have to worry about its lifetime
│ │ │ │ +
89 // and can just return its address.
│ │ │ │ +
90 template<typename T>
│ │ │ │ +
91 inline typename std::enable_if<
│ │ │ │ +
92 std::is_lvalue_reference<T>::value,
│ │ │ │ +
93 typename std::add_pointer<
│ │ │ │ +
94 typename std::remove_reference<
│ │ │ │ +
95 T
│ │ │ │ +
96 >::type
│ │ │ │ +
97 >::type
│ │ │ │ +
98 >::type
│ │ │ │ + │ │ │ │ +
100 {
│ │ │ │ +
101 return &target;
│ │ │ │ +
102 }
│ │ │ │ +
103
│ │ │ │ +
104 // This version matches rvalues (the C++ type deduction rules state that
│ │ │ │ +
105 // the T&& signature deduces to a non-reference iff the argument is an rvalue).
│ │ │ │ +
106 // In this case, we have to capture the rvalue in a new object to make sure it
│ │ │ │ +
107 // is kept alive for the duration of the member access. For this purpose, we move
│ │ │ │ +
108 // it into a member_access_proxy_holder instance.
│ │ │ │ +
109 template<typename T>
│ │ │ │ +
110 inline typename std::enable_if<
│ │ │ │ +
111 !std::is_lvalue_reference<T>::value,
│ │ │ │ +
112 Impl::member_access_proxy_holder<T>
│ │ │ │ +
113 >::type
│ │ │ │ + │ │ │ │ +
115 {
│ │ │ │ +
116 return {std::forward<T>(target)};
│ │ │ │ +
117 }
│ │ │ │ +
118
│ │ │ │ +
119#endif // DOXYGEN
│ │ │ │ +
120
│ │ │ │ +
121} // namespace Dune
│ │ │ │ +
122
│ │ │ │ +
123#endif // DUNE_COMMON_PROXYMEMBERACCESS_HH
│ │ │ │ +
pointer_or_proxy_holder handle_proxy_member_access(T &&t)
Transparent support for providing member access to both lvalues and rvalues (temporary proxies).
│ │ │ │ +
STL namespace.
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
void put(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const Key &key, const Value &value)
Definition: propertymap.hh:92
│ │ │ │ -
Reference get(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const Key &key)
Definition: propertymap.hh:84
│ │ │ │ -
Definition: propertymap.hh:17
│ │ │ │ -
PM::ValueType ValueType
The type of the values of the property map.
Definition: propertymap.hh:25
│ │ │ │ -
PM::Category Category
The category the property map belongs to.
Definition: propertymap.hh:33
│ │ │ │ -
PM::Reference Reference
The type of the reference to the values.
Definition: propertymap.hh:29
│ │ │ │ -
PM::KeyType KeyType
The type of the key of the property map.
Definition: propertymap.hh:21
│ │ │ │ -
Tag for the category of readable property maps.
Definition: propertymap.hh:38
│ │ │ │ -
Tag for the category of writable property maps.
Definition: propertymap.hh:42
│ │ │ │ -
Tag for the category of readable and writable property maps.
Definition: propertymap.hh:50
│ │ │ │ -
Tag for the category of lvalue property maps.
Definition: propertymap.hh:57
│ │ │ │ -
ValueType & Reference
Definition: propertymap.hh:63
│ │ │ │ -
std::ptrdiff_t KeyType
Definition: propertymap.hh:64
│ │ │ │ -
T ValueType
Definition: propertymap.hh:62
│ │ │ │ -
LvaluePropertyMapTag Category
Definition: propertymap.hh:65
│ │ │ │ -
std::ptrdiff_t KeyType
Definition: propertymap.hh:74
│ │ │ │ -
const ValueType & Reference
Definition: propertymap.hh:73
│ │ │ │ -
T ValueType
Definition: propertymap.hh:72
│ │ │ │ -
LvaluePropertyMapTag Category
Definition: propertymap.hh:75
│ │ │ │ -
Definition: propertymap.hh:80
│ │ │ │ -
Adapter to turn a random access iterator into a property map.
Definition: propertymap.hh:108
│ │ │ │ -
IndexMap::KeyType KeyType
The key type of the property map.
Definition: propertymap.hh:125
│ │ │ │ -
R Reference
The reference type of the property map.
Definition: propertymap.hh:135
│ │ │ │ -
T ValueType
The value type of the property map.
Definition: propertymap.hh:130
│ │ │ │ -
Reference operator[](KeyType key) const
Access the a value by reference.
Definition: propertymap.hh:160
│ │ │ │ -
IteratorPropertyMap(RandomAccessIterator iter, const IndexMap &im=IndexMap())
Constructor.
Definition: propertymap.hh:149
│ │ │ │ -
IteratorPropertyMap()
Constructor.
Definition: propertymap.hh:155
│ │ │ │ -
IM IndexMap
The type of the index map.
Definition: propertymap.hh:120
│ │ │ │ -
RAI RandomAccessIterator
The type of the random access iterator.
Definition: propertymap.hh:113
│ │ │ │ -
LvaluePropertyMapTag Category
The category of this property map.
Definition: propertymap.hh:140
│ │ │ │ -
An adapter to turn an unique associative container into a property map.
Definition: propertymap.hh:180
│ │ │ │ -
An adaptor to turn an unique associative container into a property map.
Definition: propertymap.hh:238
│ │ │ │ -
A property map that applies the identity function to integers.
Definition: propertymap.hh:293
│ │ │ │ -
std::size_t ValueType
The value type of the map.
Definition: propertymap.hh:298
│ │ │ │ -
std::size_t KeyType
The key type of the map.
Definition: propertymap.hh:295
│ │ │ │ -
ValueType operator[](const KeyType &key) const
Definition: propertymap.hh:306
│ │ │ │ -
std::size_t Reference
The reference type of the map.
Definition: propertymap.hh:301
│ │ │ │ -
ReadablePropertyMapTag Category
The category of the map.
Definition: propertymap.hh:304
│ │ │ │ -
Selector for the property map type.
Definition: propertymap.hh:320
│ │ │ │ -
T Tag
the tag identifying the property.
Definition: propertymap.hh:324
│ │ │ │ -
C Container
The container type to whose entries the properties are attached.
Definition: propertymap.hh:329
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,369 +4,112 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -propertymap.hh │ │ │ │ │ +proxymemberaccess.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 (C) 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_PROPERTYMAP_HH │ │ │ │ │ - 6#define DUNE_PROPERTYMAP_HH │ │ │ │ │ + 5#ifndef DUNE_COMMON_PROXYMEMBERACCESS_HH │ │ │ │ │ + 6#define DUNE_COMMON_PROXYMEMBERACCESS_HH │ │ │ │ │ 7 │ │ │ │ │ - 8#include │ │ │ │ │ - 9#include │ │ │ │ │ - 10#include │ │ │ │ │ - 11 │ │ │ │ │ - 12namespace Dune │ │ │ │ │ - 13{ │ │ │ │ │ - 14 │ │ │ │ │ - 15 template │ │ │ │ │ -16 struct PropertyMapTraits │ │ │ │ │ - 17 { │ │ │ │ │ -21 typedef typename PM::KeyType KeyType; │ │ │ │ │ -25 typedef typename PM::ValueType ValueType; │ │ │ │ │ -29 typedef typename PM::Reference Reference; │ │ │ │ │ -33 typedef typename PM::Category Category; │ │ │ │ │ - 34 }; │ │ │ │ │ - 35 │ │ │ │ │ -37 struct ReadablePropertyMapTag │ │ │ │ │ - 38 {}; │ │ │ │ │ - 39 │ │ │ │ │ -41 struct WritablePropertyMapTag │ │ │ │ │ - 42 {}; │ │ │ │ │ - 43 │ │ │ │ │ -48 struct ReadWritePropertyMapTag │ │ │ │ │ - 49 : public ReadablePropertyMapTag, public WritablePropertyMapTag │ │ │ │ │ - 50 {}; │ │ │ │ │ - 51 │ │ │ │ │ -55 struct LvaluePropertyMapTag │ │ │ │ │ - 56 : public ReadWritePropertyMapTag │ │ │ │ │ - 57 {}; │ │ │ │ │ - 58 │ │ │ │ │ - 59 template │ │ │ │ │ -60 struct PropertyMapTraits │ │ │ │ │ - 61 { │ │ │ │ │ -62 typedef T ValueType; │ │ │ │ │ -63 typedef ValueType& Reference; │ │ │ │ │ -64 typedef std::ptrdiff_t KeyType; │ │ │ │ │ -65 typedef LvaluePropertyMapTag Category; │ │ │ │ │ - 66 }; │ │ │ │ │ - 67 │ │ │ │ │ - 68 │ │ │ │ │ - 69 template │ │ │ │ │ -70 struct PropertyMapTraits │ │ │ │ │ - 71 { │ │ │ │ │ -72 typedef T ValueType; │ │ │ │ │ -73 typedef const ValueType& Reference; │ │ │ │ │ -74 typedef std::ptrdiff_t KeyType; │ │ │ │ │ -75 typedef LvaluePropertyMapTag Category; │ │ │ │ │ - 76 }; │ │ │ │ │ - 77 │ │ │ │ │ - 78 template │ │ │ │ │ -79 struct RAPropertyMapHelper │ │ │ │ │ - 80 {}; │ │ │ │ │ - 81 │ │ │ │ │ - 82 template │ │ │ │ │ - 83 inline Reference │ │ │ │ │ -84 get(const RAPropertyMapHelper& pmap, │ │ │ │ │ - 85 const Key& key) │ │ │ │ │ - 86 { │ │ │ │ │ - 87 return static_cast(pmap)[key]; │ │ │ │ │ - 88 } │ │ │ │ │ - 89 │ │ │ │ │ - 90 template │ │ │ │ │ - 91 inline void │ │ │ │ │ -92 put(const RAPropertyMapHelper& pmap, │ │ │ │ │ - 93 const Key& key, const Value& value) │ │ │ │ │ - 94 { │ │ │ │ │ - 95 static_assert(std::is_convertible::value, │ │ │ │ │ - 96 "WritablePropertyMapTag required!"); │ │ │ │ │ - 97 static_cast(pmap)[key] = value; │ │ │ │ │ - 98 } │ │ │ │ │ - 99 │ │ │ │ │ - 103 template::value_type, │ │ │ │ │ - 105 class R = typename std::iterator_traits::reference> │ │ │ │ │ -106 class IteratorPropertyMap │ │ │ │ │ - 107 : public RAPropertyMapHelper > │ │ │ │ │ - 108 { │ │ │ │ │ - 109 public: │ │ │ │ │ -113 typedef RAI RandomAccessIterator; │ │ │ │ │ - 114 │ │ │ │ │ -120 typedef IM IndexMap; │ │ │ │ │ - 121 │ │ │ │ │ -125 typedef typename IndexMap::KeyType KeyType; │ │ │ │ │ - 126 │ │ │ │ │ -130 typedef T ValueType; │ │ │ │ │ - 131 │ │ │ │ │ -135 typedef R Reference; │ │ │ │ │ - 136 │ │ │ │ │ -140 typedef LvaluePropertyMapTag Category; │ │ │ │ │ - 141 │ │ │ │ │ -149 inline IteratorPropertyMap(RandomAccessIterator iter, │ │ │ │ │ - 150 const IndexMap& im=IndexMap()) │ │ │ │ │ - 151 : iter_(iter), indexMap_(im) │ │ │ │ │ - 152 {} │ │ │ │ │ - 153 │ │ │ │ │ -155 inline IteratorPropertyMap() │ │ │ │ │ - 156 : iter_(), indexMap_() │ │ │ │ │ - 157 {} │ │ │ │ │ - 158 │ │ │ │ │ -160 inline Reference operator[](KeyType key) const │ │ │ │ │ - 161 { │ │ │ │ │ - 162 return *(iter_ + get(indexMap_, key)); │ │ │ │ │ - 163 } │ │ │ │ │ - 164 │ │ │ │ │ - 165 private: │ │ │ │ │ - 167 RandomAccessIterator iter_; │ │ │ │ │ - 169 IndexMap indexMap_; │ │ │ │ │ - 170 }; │ │ │ │ │ - 171 │ │ │ │ │ - 176 template │ │ │ │ │ -177 class AssociativePropertyMap │ │ │ │ │ - 178 : RAPropertyMapHelper > │ │ │ │ │ - 180 { │ │ │ │ │ - 184 typedef T UniqueAssociativeContainer; │ │ │ │ │ - 185 │ │ │ │ │ - 189 typedef typename UniqueAssociativeContainer::value_type::first_type │ │ │ │ │ - 190 KeyType; │ │ │ │ │ - 191 │ │ │ │ │ - 195 typedef typename UniqueAssociativeContainer::value_type::second_type │ │ │ │ │ - 196 ValueType; │ │ │ │ │ - 197 │ │ │ │ │ - 201 typedef ValueType& Reference; │ │ │ │ │ - 202 │ │ │ │ │ - 206 typedef LvaluePropertyMapTag Category; │ │ │ │ │ - 207 │ │ │ │ │ - 209 inline AssociativePropertyMap() │ │ │ │ │ - 210 : map_(0) │ │ │ │ │ - 211 {} │ │ │ │ │ - 212 │ │ │ │ │ - 214 inline AssociativePropertyMap(UniqueAssociativeContainer& map) │ │ │ │ │ - 215 : map_(&map) │ │ │ │ │ - 216 {} │ │ │ │ │ - 217 │ │ │ │ │ - 222 inline Reference operator[](KeyType key) const │ │ │ │ │ - 223 { │ │ │ │ │ - 224 return map_->find(key)->second; │ │ │ │ │ - 225 } │ │ │ │ │ - 226 private: │ │ │ │ │ - 227 UniqueAssociativeContainer* map_; │ │ │ │ │ - 228 }; │ │ │ │ │ - 229 │ │ │ │ │ - 234 template │ │ │ │ │ -235 class ConstAssociativePropertyMap │ │ │ │ │ - 236 : RAPropertyMapHelper > │ │ │ │ │ - 238 { │ │ │ │ │ - 242 typedef T UniqueAssociativeContainer; │ │ │ │ │ - 243 │ │ │ │ │ - 247 typedef typename UniqueAssociativeContainer::value_type::first_type │ │ │ │ │ - 248 KeyType; │ │ │ │ │ - 249 │ │ │ │ │ - 253 typedef typename UniqueAssociativeContainer::value_type::second_type │ │ │ │ │ - 254 ValueType; │ │ │ │ │ - 255 │ │ │ │ │ - 259 typedef const ValueType& Reference; │ │ │ │ │ - 260 │ │ │ │ │ - 264 typedef LvaluePropertyMapTag Category; │ │ │ │ │ - 265 │ │ │ │ │ - 267 inline ConstAssociativePropertyMap() │ │ │ │ │ - 268 : map_(0) │ │ │ │ │ - 269 {} │ │ │ │ │ - 270 │ │ │ │ │ - 272 inline ConstAssociativePropertyMap(const UniqueAssociativeContainer& map) │ │ │ │ │ - 273 : map_(&map) │ │ │ │ │ - 274 {} │ │ │ │ │ - 275 │ │ │ │ │ - 280 inline Reference operator[](KeyType key) const │ │ │ │ │ - 281 { │ │ │ │ │ - 282 return map_->find(key)->second; │ │ │ │ │ - 283 } │ │ │ │ │ - 284 private: │ │ │ │ │ - 285 const UniqueAssociativeContainer* map_; │ │ │ │ │ - 286 }; │ │ │ │ │ - 287 │ │ │ │ │ -291 struct IdentityMap │ │ │ │ │ - 292 : public RAPropertyMapHelper │ │ │ │ │ - 293 { │ │ │ │ │ -295 typedef std::size_t KeyType; │ │ │ │ │ - 296 │ │ │ │ │ -298 typedef std::size_t ValueType; │ │ │ │ │ - 299 │ │ │ │ │ -301 typedef std::size_t Reference; │ │ │ │ │ - 302 │ │ │ │ │ -304 typedef ReadablePropertyMapTag Category; │ │ │ │ │ - 305 │ │ │ │ │ -306 inline ValueType operator[](const KeyType& key) const │ │ │ │ │ - 307 { │ │ │ │ │ - 308 return key; │ │ │ │ │ - 309 } │ │ │ │ │ - 310 }; │ │ │ │ │ - 311 │ │ │ │ │ - 312 │ │ │ │ │ - 318 template │ │ │ │ │ -319 struct PropertyMapTypeSelector │ │ │ │ │ - 320 { │ │ │ │ │ -324 typedef T Tag; │ │ │ │ │ -329 typedef C Container; │ │ │ │ │ - 330 }; │ │ │ │ │ - 331 │ │ │ │ │ - 332} │ │ │ │ │ - 333 │ │ │ │ │ - 334#endif │ │ │ │ │ + 14#include │ │ │ │ │ + 15#include │ │ │ │ │ + 16 │ │ │ │ │ + 17namespace Dune { │ │ │ │ │ + 18 │ │ │ │ │ + 19 namespace Impl { │ │ │ │ │ + 20 │ │ │ │ │ + 21 // helper struct to store a temporary / proxy │ │ │ │ │ + 22 // for the duration of the member access │ │ │ │ │ + 23 template │ │ │ │ │ + 24 struct member_access_proxy_holder │ │ │ │ │ + 25 { │ │ │ │ │ + 26 │ │ │ │ │ + 27 // only support moving the temporary into the holder object │ │ │ │ │ + 28 member_access_proxy_holder(T&& t) │ │ │ │ │ + 29 : _t(std::move(t)) │ │ │ │ │ + 30 {} │ │ │ │ │ + 31 │ │ │ │ │ + 32 // The object is fundamentally a temporary, i.e. an rvalue, │ │ │ │ │ + 33 // │ │ │ │ │ + 34 const T* operator->() const │ │ │ │ │ + 35 { │ │ │ │ │ + 36 return &_t; │ │ │ │ │ + 37 } │ │ │ │ │ + 38 │ │ │ │ │ + 39 T _t; │ │ │ │ │ + 40 │ │ │ │ │ + 41 }; │ │ │ │ │ + 42 │ │ │ │ │ + 43 } // end Impl namespace │ │ │ │ │ + 44 │ │ │ │ │ + 45 │ │ │ │ │ + 46#ifdef DOXYGEN │ │ │ │ │ + 47 │ │ │ │ │ + 49 │ │ │ │ │ + 79 template │ │ │ │ │ + 80 pointer_or_proxy_holder │ │ │ │ │ +81 handle_proxy_member_access(T&& t); │ │ │ │ │ + 82 │ │ │ │ │ + 83#else // DOXYGEN │ │ │ │ │ + 84 │ │ │ │ │ + 85 │ │ │ │ │ + 86 // This version matches lvalues (the C++ type deduction rules state that │ │ │ │ │ + 87 // the T&& signature deduces to a reference iff the argument is an lvalue). │ │ │ │ │ + 88 // As the argument is an lvalue, we do not have to worry about its lifetime │ │ │ │ │ + 89 // and can just return its address. │ │ │ │ │ + 90 template │ │ │ │ │ + 91 inline typename std::enable_if< │ │ │ │ │ + 92 std::is_lvalue_reference::value, │ │ │ │ │ + 93 typename std::add_pointer< │ │ │ │ │ + 94 typename std::remove_reference< │ │ │ │ │ + 95 T │ │ │ │ │ + 96 >::type │ │ │ │ │ + 97 >::type │ │ │ │ │ + 98 >::type │ │ │ │ │ + 99 handle_proxy_member_access(T&& target) │ │ │ │ │ + 100 { │ │ │ │ │ + 101 return ⌖ │ │ │ │ │ + 102 } │ │ │ │ │ + 103 │ │ │ │ │ + 104 // This version matches rvalues (the C++ type deduction rules state that │ │ │ │ │ + 105 // the T&& signature deduces to a non-reference iff the argument is an │ │ │ │ │ +rvalue). │ │ │ │ │ + 106 // In this case, we have to capture the rvalue in a new object to make │ │ │ │ │ +sure it │ │ │ │ │ + 107 // is kept alive for the duration of the member access. For this purpose, │ │ │ │ │ +we move │ │ │ │ │ + 108 // it into a member_access_proxy_holder instance. │ │ │ │ │ + 109 template │ │ │ │ │ + 110 inline typename std::enable_if< │ │ │ │ │ + 111 !std::is_lvalue_reference::value, │ │ │ │ │ + 112 Impl::member_access_proxy_holder │ │ │ │ │ + 113 >::type │ │ │ │ │ + 114 handle_proxy_member_access(T&& target) │ │ │ │ │ + 115 { │ │ │ │ │ + 116 return {std::forward(target)}; │ │ │ │ │ + 117 } │ │ │ │ │ + 118 │ │ │ │ │ + 119#endif // DOXYGEN │ │ │ │ │ + 120 │ │ │ │ │ + 121} // namespace Dune │ │ │ │ │ + 122 │ │ │ │ │ + 123#endif // DUNE_COMMON_PROXYMEMBERACCESS_HH │ │ │ │ │ +Dune::handle_proxy_member_access │ │ │ │ │ +pointer_or_proxy_holder handle_proxy_member_access(T &&t) │ │ │ │ │ +Transparent support for providing member access to both lvalues and rvalues │ │ │ │ │ +(temporary proxies). │ │ │ │ │ +std │ │ │ │ │ +STL namespace. │ │ │ │ │ Dune │ │ │ │ │ Dune namespace. │ │ │ │ │ Definition: alignedallocator.hh:13 │ │ │ │ │ -Dune::put │ │ │ │ │ -void put(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const Key │ │ │ │ │ -&key, const Value &value) │ │ │ │ │ -Definition: propertymap.hh:92 │ │ │ │ │ -Dune::get │ │ │ │ │ -Reference get(const RAPropertyMapHelper< Reference, PropertyMap > &pmap, const │ │ │ │ │ -Key &key) │ │ │ │ │ -Definition: propertymap.hh:84 │ │ │ │ │ -Dune::PropertyMapTraits │ │ │ │ │ -Definition: propertymap.hh:17 │ │ │ │ │ -Dune::PropertyMapTraits::ValueType │ │ │ │ │ -PM::ValueType ValueType │ │ │ │ │ -The type of the values of the property map. │ │ │ │ │ -Definition: propertymap.hh:25 │ │ │ │ │ -Dune::PropertyMapTraits::Category │ │ │ │ │ -PM::Category Category │ │ │ │ │ -The category the property map belongs to. │ │ │ │ │ -Definition: propertymap.hh:33 │ │ │ │ │ -Dune::PropertyMapTraits::Reference │ │ │ │ │ -PM::Reference Reference │ │ │ │ │ -The type of the reference to the values. │ │ │ │ │ -Definition: propertymap.hh:29 │ │ │ │ │ -Dune::PropertyMapTraits::KeyType │ │ │ │ │ -PM::KeyType KeyType │ │ │ │ │ -The type of the key of the property map. │ │ │ │ │ -Definition: propertymap.hh:21 │ │ │ │ │ -Dune::ReadablePropertyMapTag │ │ │ │ │ -Tag for the category of readable property maps. │ │ │ │ │ -Definition: propertymap.hh:38 │ │ │ │ │ -Dune::WritablePropertyMapTag │ │ │ │ │ -Tag for the category of writable property maps. │ │ │ │ │ -Definition: propertymap.hh:42 │ │ │ │ │ -Dune::ReadWritePropertyMapTag │ │ │ │ │ -Tag for the category of readable and writable property maps. │ │ │ │ │ -Definition: propertymap.hh:50 │ │ │ │ │ -Dune::LvaluePropertyMapTag │ │ │ │ │ -Tag for the category of lvalue property maps. │ │ │ │ │ -Definition: propertymap.hh:57 │ │ │ │ │ -Dune::PropertyMapTraits<_T_*_>::Reference │ │ │ │ │ -ValueType & Reference │ │ │ │ │ -Definition: propertymap.hh:63 │ │ │ │ │ -Dune::PropertyMapTraits<_T_*_>::KeyType │ │ │ │ │ -std::ptrdiff_t KeyType │ │ │ │ │ -Definition: propertymap.hh:64 │ │ │ │ │ -Dune::PropertyMapTraits<_T_*_>::ValueType │ │ │ │ │ -T ValueType │ │ │ │ │ -Definition: propertymap.hh:62 │ │ │ │ │ -Dune::PropertyMapTraits<_T_*_>::Category │ │ │ │ │ -LvaluePropertyMapTag Category │ │ │ │ │ -Definition: propertymap.hh:65 │ │ │ │ │ -Dune::PropertyMapTraits<_const_T_*_>::KeyType │ │ │ │ │ -std::ptrdiff_t KeyType │ │ │ │ │ -Definition: propertymap.hh:74 │ │ │ │ │ -Dune::PropertyMapTraits<_const_T_*_>::Reference │ │ │ │ │ -const ValueType & Reference │ │ │ │ │ -Definition: propertymap.hh:73 │ │ │ │ │ -Dune::PropertyMapTraits<_const_T_*_>::ValueType │ │ │ │ │ -T ValueType │ │ │ │ │ -Definition: propertymap.hh:72 │ │ │ │ │ -Dune::PropertyMapTraits<_const_T_*_>::Category │ │ │ │ │ -LvaluePropertyMapTag Category │ │ │ │ │ -Definition: propertymap.hh:75 │ │ │ │ │ -Dune::RAPropertyMapHelper │ │ │ │ │ -Definition: propertymap.hh:80 │ │ │ │ │ -Dune::IteratorPropertyMap │ │ │ │ │ -Adapter to turn a random access iterator into a property map. │ │ │ │ │ -Definition: propertymap.hh:108 │ │ │ │ │ -Dune::IteratorPropertyMap::KeyType │ │ │ │ │ -IndexMap::KeyType KeyType │ │ │ │ │ -The key type of the property map. │ │ │ │ │ -Definition: propertymap.hh:125 │ │ │ │ │ -Dune::IteratorPropertyMap::Reference │ │ │ │ │ -R Reference │ │ │ │ │ -The reference type of the property map. │ │ │ │ │ -Definition: propertymap.hh:135 │ │ │ │ │ -Dune::IteratorPropertyMap::ValueType │ │ │ │ │ -T ValueType │ │ │ │ │ -The value type of the property map. │ │ │ │ │ -Definition: propertymap.hh:130 │ │ │ │ │ -Dune::IteratorPropertyMap::operator[] │ │ │ │ │ -Reference operator[](KeyType key) const │ │ │ │ │ -Access the a value by reference. │ │ │ │ │ -Definition: propertymap.hh:160 │ │ │ │ │ -Dune::IteratorPropertyMap::IteratorPropertyMap │ │ │ │ │ -IteratorPropertyMap(RandomAccessIterator iter, const IndexMap &im=IndexMap()) │ │ │ │ │ -Constructor. │ │ │ │ │ -Definition: propertymap.hh:149 │ │ │ │ │ -Dune::IteratorPropertyMap::IteratorPropertyMap │ │ │ │ │ -IteratorPropertyMap() │ │ │ │ │ -Constructor. │ │ │ │ │ -Definition: propertymap.hh:155 │ │ │ │ │ -Dune::IteratorPropertyMap::IndexMap │ │ │ │ │ -IM IndexMap │ │ │ │ │ -The type of the index map. │ │ │ │ │ -Definition: propertymap.hh:120 │ │ │ │ │ -Dune::IteratorPropertyMap::RandomAccessIterator │ │ │ │ │ -RAI RandomAccessIterator │ │ │ │ │ -The type of the random access iterator. │ │ │ │ │ -Definition: propertymap.hh:113 │ │ │ │ │ -Dune::IteratorPropertyMap::Category │ │ │ │ │ -LvaluePropertyMapTag Category │ │ │ │ │ -The category of this property map. │ │ │ │ │ -Definition: propertymap.hh:140 │ │ │ │ │ -Dune::AssociativePropertyMap │ │ │ │ │ -An adapter to turn an unique associative container into a property map. │ │ │ │ │ -Definition: propertymap.hh:180 │ │ │ │ │ -Dune::ConstAssociativePropertyMap │ │ │ │ │ -An adaptor to turn an unique associative container into a property map. │ │ │ │ │ -Definition: propertymap.hh:238 │ │ │ │ │ -Dune::IdentityMap │ │ │ │ │ -A property map that applies the identity function to integers. │ │ │ │ │ -Definition: propertymap.hh:293 │ │ │ │ │ -Dune::IdentityMap::ValueType │ │ │ │ │ -std::size_t ValueType │ │ │ │ │ -The value type of the map. │ │ │ │ │ -Definition: propertymap.hh:298 │ │ │ │ │ -Dune::IdentityMap::KeyType │ │ │ │ │ -std::size_t KeyType │ │ │ │ │ -The key type of the map. │ │ │ │ │ -Definition: propertymap.hh:295 │ │ │ │ │ -Dune::IdentityMap::operator[] │ │ │ │ │ -ValueType operator[](const KeyType &key) const │ │ │ │ │ -Definition: propertymap.hh:306 │ │ │ │ │ -Dune::IdentityMap::Reference │ │ │ │ │ -std::size_t Reference │ │ │ │ │ -The reference type of the map. │ │ │ │ │ -Definition: propertymap.hh:301 │ │ │ │ │ -Dune::IdentityMap::Category │ │ │ │ │ -ReadablePropertyMapTag Category │ │ │ │ │ -The category of the map. │ │ │ │ │ -Definition: propertymap.hh:304 │ │ │ │ │ -Dune::PropertyMapTypeSelector │ │ │ │ │ -Selector for the property map type. │ │ │ │ │ -Definition: propertymap.hh:320 │ │ │ │ │ -Dune::PropertyMapTypeSelector::Tag │ │ │ │ │ -T Tag │ │ │ │ │ -the tag identifying the property. │ │ │ │ │ -Definition: propertymap.hh:324 │ │ │ │ │ -Dune::PropertyMapTypeSelector::Container │ │ │ │ │ -C Container │ │ │ │ │ -The container type to whose entries the properties are attached. │ │ │ │ │ -Definition: propertymap.hh:329 │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00212.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: tupleutility.hh File Reference │ │ │ │ +dune-common: overloadset.hh File Reference │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -63,118 +63,42 @@ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │
│ │ │ │ -Classes | │ │ │ │ Namespaces | │ │ │ │ Functions
│ │ │ │ -
tupleutility.hh File Reference
│ │ │ │ +
overloadset.hh File Reference
│ │ │ │
│ │ │ │
│ │ │ │ - │ │ │ │ -

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

│ │ │ │ -
#include <cstddef>
│ │ │ │ -#include <tuple>
│ │ │ │ +
#include <utility>
│ │ │ │ #include <type_traits>
│ │ │ │ -#include <utility>
│ │ │ │ -#include <dune/common/hybridutilities.hh>
│ │ │ │ -#include <dune/common/typetraits.hh>
│ │ │ │ +#include <dune/common/typetraits.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...
 
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

│ │ │ │ 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. More...
 
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...)))
 
template<class... F>
auto Dune::overload (F &&... f)
 Create an overload set. More...
 
template<class... F>
auto Dune::orderedOverload (F &&... f)
 Create an ordered overload set. More...
 
│ │ │ │ -

Detailed Description

│ │ │ │ -

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

│ │ │ │ -
│ │ │ │ +
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,110 +4,29 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -Classes | Namespaces | Functions │ │ │ │ │ -tupleutility.hh File Reference │ │ │ │ │ -Common » Utilities » Tuple_Utilities │ │ │ │ │ -Contains utility classes which can be used with std::tuple. More... │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ -#include │ │ │ │ │ +Namespaces | Functions │ │ │ │ │ +overloadset.hh File Reference │ │ │ │ │ #include │ │ │ │ │ -#include │ │ │ │ │ +#include │ │ │ │ │ #include │ │ │ │ │ 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... │ │ │ │ │ -  │ │ │ │ │ Namespaces │ │ │ │ │ namespace  Dune │ │ │ │ │   Dune namespace. │ │ │ │ │   │ │ │ │ │ Functions │ │ │ │ │ -template │ │ │ │ │ - decltype(auto) Dune::applyPartial (F &&f, ArgTuple │ │ │ │ │ - &&args, std::integer_sequence< I, i... >) │ │ │ │ │ -  Apply function with arguments from a │ │ │ │ │ - given tuple. More... │ │ │ │ │ -  │ │ │ │ │ -template │ │ │ │ │ - auto Dune::genericTransformTuple (Tuple &&t, │ │ │ │ │ - Functor &&f) -> decltype │ │ │ │ │ - (genericTransformTupleBackend(t, f)) │ │ │ │ │ -  │ │ │ │ │ -template class TE, class... Args> │ │ │ │ │ -TransformTupleFunctor< TE, Args... > Dune::makeTransformTupleFunctor (Args │ │ │ │ │ - &&... args) │ │ │ │ │ -  │ │ │ │ │ -template class TypeEvaluator, class Tuple , class... Args> │ │ │ │ │ - auto Dune::transformTuple (Tuple &&orig, Args │ │ │ │ │ - &&... args) -> decltype │ │ │ │ │ - (genericTransformTuple(orig, │ │ │ │ │ - makeTransformTupleFunctor< TypeEvaluator │ │ │ │ │ - >(args...))) │ │ │ │ │ +template │ │ │ │ │ +auto Dune::overload (F &&... f) │ │ │ │ │ +  Create an overload set. More... │ │ │ │ │ +  │ │ │ │ │ +template │ │ │ │ │ +auto Dune::orderedOverload (F &&... f) │ │ │ │ │ +  Create an ordered overload set. More... │ │ │ │ │   │ │ │ │ │ -***** Detailed Description ***** │ │ │ │ │ -Contains utility classes which can be used with std::tuple. │ │ │ │ │ │ │ │ │ │ =============================================================================== │ │ │ │ │ Generated by [doxygen] 1.9.4 │ │ │ ├── ./usr/share/doc/libdune-common-doc/doxygen/a00212_source.html │ │ │ │ @@ -1,15 +1,15 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ -dune-common: tupleutility.hh Source File │ │ │ │ +dune-common: overloadset.hh Source File │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ @@ -62,377 +62,135 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │
│ │ │ │ -
tupleutility.hh
│ │ │ │ +
overloadset.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 (C) 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_OVERLOADSET_HH
│ │ │ │ +
6#define DUNE_COMMON_OVERLOADSET_HH
│ │ │ │ +
7
│ │ │ │ +
8#include <utility>
│ │ │ │ +
9#include <type_traits>
│ │ │ │ + │ │ │ │ +
11
│ │ │ │ +
12namespace Dune {
│ │ │ │
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 };
│ │ │ │ -
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;
│ │ │ │ - │ │ │ │ +
14namespace Impl {
│ │ │ │ +
15
│ │ │ │ +
16 template<typename... F>
│ │ │ │ +
17 class OverloadSet
│ │ │ │ +
18 : public F...
│ │ │ │ +
19 {
│ │ │ │ +
20
│ │ │ │ +
21 public:
│ │ │ │ +
22
│ │ │ │ +
23 template<typename... FF>
│ │ │ │ +
24 OverloadSet(FF&&... ff)
│ │ │ │ +
25 : F(std::forward<FF>(ff))...
│ │ │ │ +
26 {}
│ │ │ │ +
27
│ │ │ │ +
28 using F::operator()...;
│ │ │ │ +
29
│ │ │ │ +
30 };
│ │ │ │ +
31
│ │ │ │ +
32} // end namespace Impl
│ │ │ │ +
33
│ │ │ │ +
34
│ │ │ │ +
35
│ │ │ │ +
60template<class... F>
│ │ │ │ +
61auto overload(F&&... f)
│ │ │ │ +
62{
│ │ │ │ +
63 return Impl::OverloadSet<std::decay_t<F>...>(std::forward<F>(f)...);
│ │ │ │ +
64}
│ │ │ │ +
65
│ │ │ │ +
66
│ │ │ │ +
67
│ │ │ │ +
68namespace Impl {
│ │ │ │ +
69
│ │ │ │ +
70 template<class F0, class... F>
│ │ │ │ +
71 class OrderedOverloadSet: public OrderedOverloadSet<F...>, F0
│ │ │ │ +
72 {
│ │ │ │ +
73 using Base = OrderedOverloadSet<F...>;
│ │ │ │ +
74 public:
│ │ │ │ +
75
│ │ │ │ +
76 template<class FF0, class... FF>
│ │ │ │ +
77 OrderedOverloadSet(FF0&& f0, FF&&... ff) :
│ │ │ │ +
78 Base(std::forward<FF>(ff)...),
│ │ │ │ +
79 F0(std::forward<FF0>(f0))
│ │ │ │ +
80 {}
│ │ │ │ +
81
│ │ │ │ +
82 // Forward to operator() of F0 if it can be called with the given arguments.
│ │ │ │ +
83 template<class... Args,
│ │ │ │ +
84 std::enable_if_t<IsCallable<F0(Args&&...)>::value, int> = 0>
│ │ │ │ +
85 decltype(auto) operator()(Args&&... args)
│ │ │ │
86 {
│ │ │ │ -
87 return ResultType(static_cast<Args>(nullptr)...);
│ │ │ │ +
87 return F0::operator()(std::forward<Args>(args)...);
│ │ │ │
88 }
│ │ │ │ -
89 };
│ │ │ │ -
90
│ │ │ │ -
115 template<template <class> class TE, class T>
│ │ │ │ - │ │ │ │ -
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)))...>
│ │ │ │ -
128 {
│ │ │ │ -
129 return std::tuple<decltype(f(std::get<I>(t)))...>(f(std::get<I>(t))...);
│ │ │ │ -
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:268
│ │ │ │ +
89
│ │ │ │ +
90 // Forward to operator() of base class if F0 cannot be called with the given
│ │ │ │ +
91 // arguments. In this case the base class will successively try operator()
│ │ │ │ +
92 // of all F... .
│ │ │ │ +
93 template<class... Args,
│ │ │ │ +
94 std::enable_if_t<not IsCallable<F0(Args&&...)>::value, int> = 0>
│ │ │ │ +
95 decltype(auto) operator()(Args&&... args)
│ │ │ │ +
96 {
│ │ │ │ +
97 return Base::operator()(std::forward<Args>(args)...);
│ │ │ │ +
98 }
│ │ │ │ +
99
│ │ │ │ +
100 };
│ │ │ │ +
101
│ │ │ │ +
102 template<class F0>
│ │ │ │ +
103 class OrderedOverloadSet<F0>: public F0
│ │ │ │ +
104 {
│ │ │ │ +
105 public:
│ │ │ │ +
106
│ │ │ │ +
107 template<class FF0>
│ │ │ │ +
108 OrderedOverloadSet(FF0&& f0) :
│ │ │ │ +
109 F0(std::forward<FF0>(f0))
│ │ │ │ +
110 {}
│ │ │ │ +
111
│ │ │ │ +
112 // Forward to operator() of F0. If it cannot be called with
│ │ │ │ +
113 // the given arguments a static assertion will fail.
│ │ │ │ +
114 template<class... Args>
│ │ │ │ +
115 decltype(auto) operator()(Args&&... args)
│ │ │ │ +
116 {
│ │ │ │ +
117 static_assert(IsCallable<F0(Args&&...)>::value,
│ │ │ │ +
118 "No matching overload found in OrderedOverloadSet");
│ │ │ │ +
119 return F0::operator()(std::forward<Args>(args)...);
│ │ │ │ +
120 }
│ │ │ │ +
121 };
│ │ │ │ +
122
│ │ │ │ +
123} // end namespace Impl
│ │ │ │ +
124
│ │ │ │ +
125
│ │ │ │ +
126
│ │ │ │ +
149template<class... F>
│ │ │ │ +
150auto orderedOverload(F&&... f)
│ │ │ │ +
151{
│ │ │ │ +
152 return Impl::OrderedOverloadSet<std::decay_t<F>...>(std::forward<F>(f)...);
│ │ │ │ +
153}
│ │ │ │ +
154
│ │ │ │ +
155
│ │ │ │ +
156
│ │ │ │ +
157} // end namespace Dune
│ │ │ │ +
158
│ │ │ │ +
159#endif // DUNE_COMMON_OVERLOADSET_HH
│ │ │ │ +
Traits for type conversions and type information.
│ │ │ │ +
auto orderedOverload(F &&... f)
Create an ordered overload set.
Definition: overloadset.hh:150
│ │ │ │ +
auto overload(F &&... f)
Create an overload set.
Definition: overloadset.hh:61
│ │ │ │
STL namespace.
│ │ │ │
Dune namespace.
Definition: alignedallocator.hh:13
│ │ │ │ -
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
│ │ │ │
│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── html2text {} │ │ │ │ │ @@ -4,517 +4,144 @@ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ dune-common 2.9.0 │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ * dune │ │ │ │ │ * common │ │ │ │ │ -tupleutility.hh │ │ │ │ │ +overloadset.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 (C) 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_OVERLOADSET_HH │ │ │ │ │ + 6#define DUNE_COMMON_OVERLOADSET_HH │ │ │ │ │ + 7 │ │ │ │ │ + 8#include │ │ │ │ │ + 9#include │ │ │ │ │ + 10#include │ │ │ │ │ + 11 │ │ │ │ │ + 12namespace Dune { │ │ │ │ │ 13 │ │ │ │ │ - 14#include │ │ │ │ │ - 15#include │ │ │ │ │ - 16 │ │ │ │ │ - 17namespace Dune { │ │ │ │ │ - 18 │ │ │ │ │ - 41 template │ │ │ │ │ -42 decltype(auto) applyPartial(F&& f, ArgTuple&& args, std::integer_sequence /*indices*/) │ │ │ │ │ - 43 { │ │ │ │ │ - 44 return f(std::get(args)...); │ │ │ │ │ - 45 } │ │ │ │ │ - 46 │ │ │ │ │ - 47 template │ │ │ │ │ -48 struct TupleAccessTraits │ │ │ │ │ - 49 { │ │ │ │ │ -50 typedef typename std::add_const::type& ConstType; │ │ │ │ │ -51 typedef T& NonConstType; │ │ │ │ │ -52 typedef const typename std::remove_const::type& ParameterType; │ │ │ │ │ - 53 }; │ │ │ │ │ - 54 │ │ │ │ │ - 55 template │ │ │ │ │ -56 struct TupleAccessTraits │ │ │ │ │ - 57 { │ │ │ │ │ -58 typedef typename std::add_const::type* ConstType; │ │ │ │ │ -59 typedef T* NonConstType; │ │ │ │ │ -60 typedef T* ParameterType; │ │ │ │ │ - 61 }; │ │ │ │ │ - 62 │ │ │ │ │ - 63 template │ │ │ │ │ -64 struct TupleAccessTraits │ │ │ │ │ - 65 { │ │ │ │ │ -66 typedef T& ConstType; │ │ │ │ │ -67 typedef T& NonConstType; │ │ │ │ │ -68 typedef T& ParameterType; │ │ │ │ │ - 69 }; │ │ │ │ │ - 70 │ │ │ │ │ - 78 template │ │ │ │ │ -79 struct NullPointerInitialiser; │ │ │ │ │ - 80 │ │ │ │ │ - 81 template │ │ │ │ │ -82 struct NullPointerInitialiser > │ │ │ │ │ - 83 { │ │ │ │ │ -84 typedef std::tuple ResultType; │ │ │ │ │ -85 static ResultType apply() │ │ │ │ │ + 14namespace Impl { │ │ │ │ │ + 15 │ │ │ │ │ + 16 template │ │ │ │ │ + 17 class OverloadSet │ │ │ │ │ + 18 : public F... │ │ │ │ │ + 19 { │ │ │ │ │ + 20 │ │ │ │ │ + 21 public: │ │ │ │ │ + 22 │ │ │ │ │ + 23 template │ │ │ │ │ + 24 OverloadSet(FF&&... ff) │ │ │ │ │ + 25 : F(std::forward(ff))... │ │ │ │ │ + 26 {} │ │ │ │ │ + 27 │ │ │ │ │ + 28 using F::operator()...; │ │ │ │ │ + 29 │ │ │ │ │ + 30 }; │ │ │ │ │ + 31 │ │ │ │ │ + 32} // end namespace Impl │ │ │ │ │ + 33 │ │ │ │ │ + 34 │ │ │ │ │ + 35 │ │ │ │ │ + 60template │ │ │ │ │ +61auto overload(F&&... f) │ │ │ │ │ + 62{ │ │ │ │ │ + 63 return Impl::OverloadSet...>(std::forward(f)...); │ │ │ │ │ + 64} │ │ │ │ │ + 65 │ │ │ │ │ + 66 │ │ │ │ │ + 67 │ │ │ │ │ + 68namespace Impl { │ │ │ │ │ + 69 │ │ │ │ │ + 70 template │ │ │ │ │ + 71 class OrderedOverloadSet: public OrderedOverloadSet, F0 │ │ │ │ │ + 72 { │ │ │ │ │ + 73 using Base = OrderedOverloadSet; │ │ │ │ │ + 74 public: │ │ │ │ │ + 75 │ │ │ │ │ + 76 template │ │ │ │ │ + 77 OrderedOverloadSet(FF0&& f0, FF&&... ff) : │ │ │ │ │ + 78 Base(std::forward(ff)...), │ │ │ │ │ + 79 F0(std::forward(f0)) │ │ │ │ │ + 80 {} │ │ │ │ │ + 81 │ │ │ │ │ + 82 // Forward to operator() of F0 if it can be called with the given │ │ │ │ │ +arguments. │ │ │ │ │ + 83 template::value, int> = 0> │ │ │ │ │ + 85 decltype(auto) operator()(Args&&... args) │ │ │ │ │ 86 { │ │ │ │ │ - 87 return ResultType(static_cast(nullptr)...); │ │ │ │ │ + 87 return F0::operator()(std::forward(args)...); │ │ │ │ │ 88 } │ │ │ │ │ - 89 }; │ │ │ │ │ - 90 │ │ │ │ │ - 115 template